Skip to content

fix: publish npm releases and clarify install identifiers#1446

Merged
affaan-m merged 3 commits into
mainfrom
fix/release-publish-and-migration-docs
Apr 15, 2026
Merged

fix: publish npm releases and clarify install identifiers#1446
affaan-m merged 3 commits into
mainfrom
fix/release-publish-and-migration-docs

Conversation

@affaan-m

@affaan-m affaan-m commented Apr 15, 2026

Copy link
Copy Markdown
Owner

Summary

  • publish tagged releases to npm from the existing GitHub release workflows
  • document the canonical Claude marketplace/plugin identifier and the npm package name clearly
  • add regression coverage so release automation and public install docs do not drift again

Why

The current public state is inconsistent:

  • GitHub has a v1.10.0 release
  • npm ecc-universal is still at 1.9.0
  • the old everything-claude-code npm package is unpublished
  • some public docs still referenced the stale short-form plugin identifier ecc@ecc

This PR fixes the actual release workflow gap and makes the naming/migration story explicit:

  • GitHub repo: affaan-m/everything-claude-code
  • Claude marketplace/plugin identifier: everything-claude-code@everything-claude-code
  • npm package: ecc-universal

The marketplace/plugin identifier changed to align with Anthropic's marketplace/plugin model. The npm package name remains separate, so users need both surfaces documented clearly instead of assuming they are the same thing.

Validation

  • node tests/scripts/release-publish.test.js
  • node tests/docs/install-identifiers.test.js
  • full suite already passed locally before this PR: npm test

Summary by CodeRabbit

  • Documentation

    • Updated plugin installation commands across all language-specific documentation to use the standardized identifier everything-claude-code@everything-claude-code.
    • Added naming clarification guidance for plugin identifiers.
  • Chores

    • Enhanced CI/CD workflows to support npm package publishing with authentication and provenance.
    • Updated package configuration for public npm releases.
    • Added verification tests for documentation consistency.

Summary by cubic

Publishes tagged releases to npm and standardizes the canonical plugin identifier in docs to stop GitHub↔npm version drift and avoid install confusion.

  • Bug Fixes

    • Publish to npm from release.yml and reusable-release.yml with registry config, id-token provenance, secrets.NPM_TOKEN wired to NODE_AUTH_TOKEN, and skip-if-already-published checks.
    • Add tests to verify workflow publish steps and that docs use the canonical plugin identifier.
    • Set publishConfig.access: public; release notes now list ecc-universal and everything-claude-code@everything-claude-code.
  • Migration

    • Replace ecc@ecc with everything-claude-code@everything-claude-code for plugin installs.
    • npm package remains ecc-universal; plugin and package names are intentionally different.
    • Docs updated (EN, zh-CN, pt-BR, ja-JP); add recovery steps for wiped setups: run ecc list-installed, ecc doctor, then ecc repair before reinstalling.

Written for commit b5c4d2b. Summary will update on new commits.

@ecc-tools

ecc-tools Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@coderabbitai

coderabbitai Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This pull request standardizes the plugin identifier from short form to fully-qualified (everything-claude-code@everything-claude-code) across documentation, adds npm publish automation to release workflows with version existence checking and provenance support, configures public package access, and introduces validation tests for documentation and release workflow compliance.

Changes

Cohort / File(s) Summary
CI/CD Release Workflows
.github/workflows/release.yml, .github/workflows/reusable-release.yml
Added id-token: write permission, npm registry configuration, steps to check if package version already exists on npm registry using npm view, and conditional npm publish --access public --provenance execution gated by version check. Extended release notes with package and marketplace identifiers.
Package Configuration
package.json
Added publishConfig with access: "public" to declare npm publish access level.
Documentation - Installation Commands
README.md, README.zh-CN.md, docs/pt-BR/README.md, docs/ja-JP/skills/configure-ecc/SKILL.md, docs/zh-CN/skills/configure-ecc/SKILL.md
Updated Claude Code plugin installation commands from shorthand identifier to canonical fully-qualified form everything-claude-code@everything-claude-code. Added "Naming + Migration Note" section in README.md documenting three distinct public identifiers and marking short form as deprecated.
Validation Tests
tests/docs/install-identifiers.test.js, tests/scripts/release-publish.test.js
Added test scripts to validate documentation files exclude deprecated identifier ecc@ecc and include canonical identifier everything-claude-code@everything-claude-code, and to verify release workflows contain version-checking and npm publish steps with proper authentication and provenance support.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 A rabbit hops through workflows with glee,
Version checks dance with npm registry,
Provenance shines, identifiers aligned,
Tests stand guard o'er docs redesigned!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix: publish npm releases and clarify install identifiers' directly and accurately summarizes the main changes: GitHub workflow updates to enable npm publishing and documentation updates clarifying canonical identifiers.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/release-publish-and-migration-docs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ecc-tools

ecc-tools Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@gitguardian

gitguardian Bot commented Apr 15, 2026

Copy link
Copy Markdown

️✅ There are no secrets present in this pull request anymore.

If these secrets were true positive and are still valid, we highly recommend you to revoke them.
While these secrets were previously flagged, we no longer have a reference to the
specific commits where they were detected. Once a secret has been leaked into a git
repository, you should consider it compromised, even if it was deleted immediately.
Find here more information about risks.


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@affaan-m affaan-m force-pushed the fix/release-publish-and-migration-docs branch from 7771589 to 3438032 Compare April 15, 2026 03:42
@ecc-tools

ecc-tools Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@ecc-tools

ecc-tools Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 11 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".github/workflows/reusable-release.yml">

<violation number="1" location=".github/workflows/reusable-release.yml:56">
P1: Validate that `inputs.tag` matches `package.json` version before checking/publishing to npm; otherwise this workflow can skip or publish the wrong npm version for the release tag.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

run: |
TAG_VERSION="${INPUT_TAG#v}"
PACKAGE_NAME=$(node -p "require('./package.json').name")
PACKAGE_VERSION=$(node -p "require('./package.json').version")

@cubic-dev-ai cubic-dev-ai Bot Apr 15, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Validate that inputs.tag matches package.json version before checking/publishing to npm; otherwise this workflow can skip or publish the wrong npm version for the release tag.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/reusable-release.yml, line 56:

<comment>Validate that `inputs.tag` matches `package.json` version before checking/publishing to npm; otherwise this workflow can skip or publish the wrong npm version for the release tag.</comment>

<file context>
@@ -47,6 +49,21 @@ jobs:
+        id: npm_publish_state
+        run: |
+          PACKAGE_NAME=$(node -p "require('./package.json').name")
+          PACKAGE_VERSION=$(node -p "require('./package.json').version")
+          if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version >/dev/null 2>&1; then
+            echo "already_published=true" >> "$GITHUB_OUTPUT"
</file context>
Suggested change
PACKAGE_VERSION=$(node -p "require('./package.json').version")
PACKAGE_VERSION=$(node -p "require('./package.json').version")
TAG_VERSION="${{ inputs.tag }}"
TAG_VERSION="${TAG_VERSION#v}"
if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then
echo "::error::Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
exit 1
fi
Fix with Cubic

@greptile-apps

greptile-apps Bot commented Apr 15, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR wires npm publishing into both release workflows (release.yml and reusable-release.yml), adds publishConfig.access: public to package.json, replaces the stale ecc@ecc plugin identifier with everything-claude-code@everything-claude-code across all docs, and adds regression tests for both changes.

  • P1 (reusable-release.yml): NPM_TOKEN is declared required: false, but there is no guard preventing the publish step from running when the token is absent. For any new (not-yet-published) version, a missing token causes npm publish to fail with 401 — and since Create GitHub Release is a later step, it never executes. Callers who opt out of npm publishing currently get neither an npm release nor a GitHub release.

Confidence Score: 4/5

Safe to merge after fixing the missing NPM_TOKEN guard in reusable-release.yml.

One P1 defect in reusable-release.yml: without a token guard, callers that don't supply NPM_TOKEN on a new version will have the entire release job fail, silently skipping GitHub Release creation. The fix is a small in-run null-check. All other findings are P2.

.github/workflows/reusable-release.yml — the Publish npm package step needs a guard for when NPM_TOKEN is not provided.

Important Files Changed

Filename Overview
.github/workflows/reusable-release.yml Adds NPM_TOKEN secret (required: false) and npm publish step, but missing token guard means a new-version workflow call without NPM_TOKEN fails npm publish and skips GitHub Release creation entirely.
.github/workflows/release.yml Adds id-token permission, registry-url config, skip-if-published check, and npm publish step before GitHub Release creation; publish step ordering could leave orphaned npm releases on release-step failure.
tests/docs/install-identifiers.test.js New test verifying canonical plugin identifier across docs; readFileSync outside test wrapper will crash on missing file rather than recording a clean failure.
tests/scripts/release-publish.test.js New test confirming workflow text patterns for id-token, registry-url, publish-state check, and npm publish command; covers both workflow files correctly.
package.json Adds publishConfig.access: public; redundant with --access public flag in the workflow command but harmless.
README.md Documentation updated to use canonical everything-claude-code@everything-claude-code identifier and clarify npm vs plugin naming.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Tag push / workflow_call] --> B[Checkout & Setup Node]
    B --> C[Install deps & validate tag]
    C --> D[Check npm publish state\nnpm view pkg@version]
    D -->|already_published=true| E[Skip publish]
    D -->|already_published=false| F{NPM_TOKEN set?}
    F -->|Yes| G[npm publish --access public --provenance]
    F -->|No — reusable-release only\nno guard today| H[❌ npm publish fails with 401]
    G --> I[Generate release highlights]
    E --> I
    H --> X[❌ Job fails — GitHub Release never created]
    I --> J[Create GitHub Release]
    J --> K[✅ Done]
Loading

Reviews (1): Last reviewed commit: "fix: wire npm auth into release publish" | Re-trigger Greptile

Comment on lines +81 to +85
- name: Publish npm package
if: steps.npm_publish_state.outputs.already_published != 'true'
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npm publish --access public --provenance

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Optional NPM_TOKEN can silently break GitHub Release creation

Because NPM_TOKEN is declared required: false, callers may invoke this reusable workflow without providing it. When that happens and the version hasn't been published yet, the already_published check passes (no auth needed for npm view on a public package), but the subsequent npm publish fails with a 401 — and because Create GitHub Release is a later step, it never runs. The caller ends up with neither an npm publish nor a GitHub Release.

Add an explicit skip when no token is available:

Suggested change
- name: Publish npm package
if: steps.npm_publish_state.outputs.already_published != 'true'
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npm publish --access public --provenance
- name: Publish npm package
if: steps.npm_publish_state.outputs.already_published != 'true'
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: |
if [ -z "$NODE_AUTH_TOKEN" ]; then
echo "NPM_TOKEN not provided — skipping npm publish"
exit 0
fi
npm publish --access public --provenance

Comment on lines +34 to +35
for (const relativePath of publicInstallDocs) {
const content = fs.readFileSync(path.join(repoRoot, relativePath), 'utf8');

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 readFileSync outside test wrapper crashes on missing file

fs.readFileSync is called outside the test() try/catch wrapper. If any file in publicInstallDocs is renamed or deleted, the call throws an unhandled exception that crashes the process before failed is incremented or a clean error message is printed — making failures hard to diagnose in CI.

Suggested change
for (const relativePath of publicInstallDocs) {
const content = fs.readFileSync(path.join(repoRoot, relativePath), 'utf8');
let content;
test(`${relativePath} is readable`, () => {
content = fs.readFileSync(path.join(repoRoot, relativePath), 'utf8');
});
if (content === undefined) continue;

Comment on lines +66 to +70
echo "already_published=false" >> "$GITHUB_OUTPUT"
fi

- name: Publish npm package
if: steps.npm_publish_state.outputs.already_published != 'true'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 npm publish placed before GitHub Release creation

If npm publish succeeds but the subsequent Create GitHub Release step fails (transient API error, bad body_path, etc.), the package lands on npm without a corresponding GitHub release. Swapping the two steps — creating the GitHub release first and publishing to npm after — provides a better fallback: a failed npm publish leaves an orphaned GitHub release (easily re-run) rather than an orphaned npm package (harder to unlink).

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
tests/scripts/release-publish.test.js (1)

40-41: Relax regex strictness to avoid format-only test failures.

Current regexes are sensitive to quoting/flag order, so harmless YAML formatting changes can fail the test.

♻️ More robust matching patterns
   test(`${workflow} configures the npm registry`, () => {
-    assert.match(content, /registry-url:\s*['"]https:\/\/registry\.npmjs\.org['"]/);
+    assert.match(content, /registry-url:\s*['"]?https:\/\/registry\.npmjs\.org['"]?/);
   });

   test(`${workflow} checks whether the tagged npm version already exists`, () => {
     assert.match(content, /Check npm publish state/);
-    assert.match(content, /npm view "\$\{PACKAGE_NAME\}@\$\{PACKAGE_VERSION\}" version/);
+    assert.match(content, /npm view\s+['"]?\$\{PACKAGE_NAME\}@\$\{PACKAGE_VERSION\}['"]?\s+version/);
   });

   test(`${workflow} publishes new tag versions to npm`, () => {
-    assert.match(content, /npm publish --access public --provenance/);
+    assert.match(content, /npm publish\b(?=[^\n]*--access\s+public)(?=[^\n]*--provenance)/);
     assert.match(content, /NODE_AUTH_TOKEN:\s*\$\{\{\s*secrets\.NPM_TOKEN\s*\}\}/);
   });

Also applies to: 46-51

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/scripts/release-publish.test.js` around lines 40 - 41, The test's regex
is too strict about quoting/flag order in the workflow match (the test block
using variables workflow and content); relax the pattern to accept optional
quotes and flexible spacing—e.g. replace
/registry-url:\s*['"]https:\/\/registry\.npmjs\.org['"]/ with a pattern that
allows optional single or double quotes and any whitespace (such as
/registry-url:\s*["']?https:\/\/registry\.npmjs\.org["']?/), and apply the same
relaxed approach to the other regexes referenced around lines 46-51 so they no
longer fail on harmless YAML formatting/quote-order changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/reusable-release.yml:
- Around line 15-17: The publish step runs even when NPM_TOKEN is not provided;
add a guard so it only runs when the secret is present by adding an if condition
on the publish job/step (e.g., the "publish" step) such as if: ${{
secrets.NPM_TOKEN != '' }} or if: ${{ secrets.NPM_TOKEN }}; this leaves
NPM_TOKEN optional in the secrets map but prevents the publish step from
executing and failing when the token is omitted.

In `@README.md`:
- Around line 192-197: Remove the duplicated recovery warning paragraph in the
README callout so the warning appears only once; locate the repeated block that
starts "If your local Claude setup was wiped or reset..." in the callout and
delete the second instance, leaving a single copy of the paragraph and
preserving surrounding formatting and emphasis.

In `@tests/scripts/release-publish.test.js`:
- Around line 44-52: Add an assertion in the `${workflow} publishes new tag
versions to npm` test to ensure the publish step is conditionally gated by the
lookup step result: verify the workflow content contains an if expression that
references the "Check npm publish state" step output (e.g., checks for an if
like steps.<check-step-id>.outputs.published == 'false' or
steps.<check-step-id>.outputs.published != 'true'). Update the test that
inspects `content` to assert the presence of that if-condition string so the
publish command (`npm publish --access public --provenance`) is only executed
when the lookup indicates the package is not already published.

---

Nitpick comments:
In `@tests/scripts/release-publish.test.js`:
- Around line 40-41: The test's regex is too strict about quoting/flag order in
the workflow match (the test block using variables workflow and content); relax
the pattern to accept optional quotes and flexible spacing—e.g. replace
/registry-url:\s*['"]https:\/\/registry\.npmjs\.org['"]/ with a pattern that
allows optional single or double quotes and any whitespace (such as
/registry-url:\s*["']?https:\/\/registry\.npmjs\.org["']?/), and apply the same
relaxed approach to the other regexes referenced around lines 46-51 so they no
longer fail on harmless YAML formatting/quote-order changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2855c5ff-a79d-425c-9372-4607eff9c114

📥 Commits

Reviewing files that changed from the base of the PR and between 8da668f and b5c4d2b.

📒 Files selected for processing (10)
  • .github/workflows/release.yml
  • .github/workflows/reusable-release.yml
  • README.md
  • README.zh-CN.md
  • docs/ja-JP/skills/configure-ecc/SKILL.md
  • docs/pt-BR/README.md
  • docs/zh-CN/skills/configure-ecc/SKILL.md
  • package.json
  • tests/docs/install-identifiers.test.js
  • tests/scripts/release-publish.test.js

Comment on lines +15 to +17
secrets:
NPM_TOKEN:
required: false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Inspecting reusable release workflow conditions around NPM_TOKEN..."
rg -n -C2 'NPM_TOKEN|required: false|Publish npm package|already_published|NODE_AUTH_TOKEN|if:' .github/workflows/reusable-release.yml

Repository: affaan-m/everything-claude-code

Length of output: 965


Optional NPM_TOKEN conflicts with the publish step condition.

Line 17 marks NPM_TOKEN as optional, but the publish step at Line 82 executes whenever the package is unpublished, without verifying token presence. This causes auth failures when callers intentionally omit npm credentials.

🔧 Suggested fix (guard publish on token presence)
       - name: Publish npm package
-        if: steps.npm_publish_state.outputs.already_published != 'true'
+        if: steps.npm_publish_state.outputs.already_published != 'true' && secrets.NPM_TOKEN != ''
         env:
           NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
         run: npm publish --access public --provenance
+
+      - name: Skip npm publish (NPM_TOKEN not provided)
+        if: steps.npm_publish_state.outputs.already_published != 'true' && secrets.NPM_TOKEN == ''
+        run: echo "NPM_TOKEN not provided; skipping npm publish."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/reusable-release.yml around lines 15 - 17, The publish
step runs even when NPM_TOKEN is not provided; add a guard so it only runs when
the secret is present by adding an if condition on the publish job/step (e.g.,
the "publish" step) such as if: ${{ secrets.NPM_TOKEN != '' }} or if: ${{
secrets.NPM_TOKEN }}; this leaves NPM_TOKEN optional in the secrets map but
prevents the publish step from executing and failing when the token is omitted.

Comment thread README.md
Comment on lines 192 to +197
> WARNING: **Important:** Claude Code plugins cannot distribute `rules` automatically. Install them manually:
>
> If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.

> If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Remove duplicated recovery warning paragraph.

The same warning text appears twice in the same callout, which adds noise.

✂️ Suggested cleanup
 > WARNING: **Important:** Claude Code plugins cannot distribute `rules` automatically. Install them manually:
 >
 > If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.
-
-> If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
> WARNING: **Important:** Claude Code plugins cannot distribute `rules` automatically. Install them manually:
>
> If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.
> If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.
> WARNING: **Important:** Claude Code plugins cannot distribute `rules` automatically. Install them manually:
>
> If your local Claude setup was wiped or reset, that does not mean you need to repurchase ECC. Start with `ecc list-installed`, then run `ecc doctor` and `ecc repair` before reinstalling anything. That usually restores ECC-managed files without rebuilding your setup. If the problem is account or marketplace access for ECC Tools, handle billing/account recovery separately.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 192 - 197, Remove the duplicated recovery warning
paragraph in the README callout so the warning appears only once; locate the
repeated block that starts "If your local Claude setup was wiped or reset..." in
the callout and delete the second instance, leaving a single copy of the
paragraph and preserving surrounding formatting and emphasis.

Comment on lines +44 to +52
test(`${workflow} checks whether the tagged npm version already exists`, () => {
assert.match(content, /Check npm publish state/);
assert.match(content, /npm view "\$\{PACKAGE_NAME\}@\$\{PACKAGE_VERSION\}" version/);
});

test(`${workflow} publishes new tag versions to npm`, () => {
assert.match(content, /npm publish --access public --provenance/);
assert.match(content, /NODE_AUTH_TOKEN:\s*\$\{\{\s*secrets\.NPM_TOKEN\s*\}\}/);
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add an assertion for the actual “skip publish if already published” gate.

These checks verify version lookup and publish command presence, but they don’t assert that the publish step is conditionally gated by the lookup result. That leaves a regression gap for the core skip behavior.

🔧 Proposed test hardening
   test(`${workflow} checks whether the tagged npm version already exists`, () => {
     assert.match(content, /Check npm publish state/);
     assert.match(content, /npm view "\$\{PACKAGE_NAME\}@\$\{PACKAGE_VERSION\}" version/);
   });

   test(`${workflow} publishes new tag versions to npm`, () => {
+    // Ensure publish step is conditionally gated by "already published" state
+    assert.match(content, /if:\s*\$\{\{\s*[^}]*already[_-]?published[^}]*\}\}/);
     assert.match(content, /npm publish --access public --provenance/);
     assert.match(content, /NODE_AUTH_TOKEN:\s*\$\{\{\s*secrets\.NPM_TOKEN\s*\}\}/);
   });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/scripts/release-publish.test.js` around lines 44 - 52, Add an assertion
in the `${workflow} publishes new tag versions to npm` test to ensure the
publish step is conditionally gated by the lookup step result: verify the
workflow content contains an if expression that references the "Check npm
publish state" step output (e.g., checks for an if like
steps.<check-step-id>.outputs.published == 'false' or
steps.<check-step-id>.outputs.published != 'true'). Update the test that
inspects `content` to assert the presence of that if-condition string so the
publish command (`npm publish --access public --provenance`) is only executed
when the lookup indicates the package is not already published.

@affaan-m affaan-m merged commit c1e7a27 into main Apr 15, 2026
40 checks passed
@affaan-m affaan-m deleted the fix/release-publish-and-migration-docs branch April 15, 2026 03:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant