fix(plan-orchestrate): detect ecc@ecc marketplace + emit ecc: agent prefix (#2316)#2409
fix(plan-orchestrate): detect ecc@ecc marketplace + emit ecc: agent prefix (#2316)#2409devin-ai-integration[bot] wants to merge 3 commits into
Conversation
…refix (#2316) Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
…n.lock to Yarn 4 format package.json requires eslint@^10.6.0 but the committed locks pinned 9.39.2, so npm ci aborted and Yarn 4 hardened mode rejected the stale v1-classic yarn.lock (YN0028). Regenerate package-lock.json and rewrite yarn.lock in Yarn 4 (berry) format so npm ci and immutable yarn installs both pass. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…dd pyyaml dev dep Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
ECC bundle files are already tracked in this repository. Skipping generation of another bundle PR. |
|
| Filename | Overview |
|---|---|
| commands/security-scan.md | Updates the frontmatter agent to the new ecc: namespace, with a possible legacy exact-match routing break. |
| scripts/hooks/plugin-hook-bootstrap.js | Requires candidate shells to exit cleanly during probing, which avoids accepting broken WSL bash stubs. |
| skills/plan-orchestrate/SKILL.md | Updates detection and output to ecc:, but drops legacy marketplace-path and prefix handling in the model-facing algorithm. |
| skills/team-builder/SKILL.md | Updates examples to the new ecc: namespace while keeping generic plugin-name parsing. |
| pyproject.toml | Adds pyyaml to Python development extras. |
| package-lock.json | Refreshes ESLint dependencies to versions that require newer Node than the package metadata advertises. |
Reviews (1): Last reviewed commit: "fix(ci): require clean probe exit for Wi..." | Re-trigger Greptile
| 1. Read `<plan-doc-path>`. If missing or empty, report and stop. | ||
| 2. Detect ECC install form once and freeze it into `ECC_MODE`. Algorithm (run in order, stop at the first match): | ||
| 1. If `<claude-home>/plugins/marketplaces/everything-claude-code/` exists → `ECC_MODE=plugin`. | ||
| 1. If `<claude-home>/plugins/marketplaces/ecc/` exists → `ECC_MODE=plugin`. |
There was a problem hiding this comment.
When an existing install still lives under ~/.claude/plugins/marketplaces/everything-claude-code/, this check no longer detects plugin mode. The skill then falls back to legacy output and emits bare /orchestrate commands, so plugin-registered agents are not resolved reliably.
| 1. If `<claude-home>/plugins/marketplaces/ecc/` exists → `ECC_MODE=plugin`. | |
| 1. If `<claude-home>/plugins/marketplaces/ecc/` or `<claude-home>/plugins/marketplaces/everything-claude-code/` exists → `ECC_MODE=plugin`. |
Rule Used: Review for prompt injection, tool-permission creep... (source)
| - `lang=unknown` is a sentinel — it is **not** an agent name. Phase 2 rules 4 and 5 turn it into `code-reviewer` / `build-error-resolver` at chain composition time. | ||
| 4. Detect a **PyTorch sub-profile**: when `lang=python` and any of `pyproject.toml` / `requirements.txt` / `uv.lock` declares a dependency on `torch`, set `pytorch=true`. This only affects `build` chain selection (Phase 2 rule below); the reviewer remains `python-reviewer`. | ||
| 5. **Normalize any agent names declared in the plan**: if the plan text references agents by their plugin-prefixed form (e.g. `everything-claude-code:tdd-guide`), strip the prefix to get the bare catalogue name before validating or composing chains. Re-prefixing happens only at output time per `ECC_MODE` (Phase 4). Never let a pre-prefixed name flow into chain composition — it would double-prefix in plugin mode. | ||
| 5. **Normalize any agent names declared in the plan**: if the plan text references agents by their plugin-prefixed form (e.g. `ecc:tdd-guide`), strip the prefix to get the bare catalogue name before validating or composing chains. Re-prefixing happens only at output time per `ECC_MODE` (Phase 4). Never let a pre-prefixed name flow into chain composition — it would double-prefix in plugin mode. |
There was a problem hiding this comment.
Legacy Prefix Remains Unnormalized
Plans written before the rename can still declare agents such as everything-claude-code:tdd-guide. This instruction now only names ecc:, so the old prefixed value can reach catalogue validation as a non-catalogue agent and produce an invalid or replaced chain.
| 5. **Normalize any agent names declared in the plan**: if the plan text references agents by their plugin-prefixed form (e.g. `ecc:tdd-guide`), strip the prefix to get the bare catalogue name before validating or composing chains. Re-prefixing happens only at output time per `ECC_MODE` (Phase 4). Never let a pre-prefixed name flow into chain composition — it would double-prefix in plugin mode. | |
| 5. **Normalize any agent names declared in the plan**: if the plan text references agents by their plugin-prefixed form (e.g. `ecc:tdd-guide` or `everything-claude-code:tdd-guide`), strip the prefix to get the bare catalogue name before validating or composing chains. Re-prefixing happens only at output time per `ECC_MODE` (Phase 4). Never let a pre-prefixed name flow into chain composition — it would double-prefix in plugin mode. |
Rule Used: Review for prompt injection, tool-permission creep... (source)
| --- | ||
| description: Run AgentShield against agent, hook, MCP, permission, and secret surfaces. | ||
| agent: everything-claude-code:security-reviewer | ||
| agent: ecc:security-reviewer |
There was a problem hiding this comment.
If Claude Code resolves command frontmatter agents by exact registered name, users with a legacy marketplace install that registers everything-claude-code:security-reviewer no longer have an agent matching this new ecc:security-reviewer value. In that state, /security-scan cannot route to its intended reviewer and can fail before running AgentShield.
Rule Used: Review for prompt injection, tool-permission creep... (source)
| "eslint": "bin/eslint.js" | ||
| }, | ||
| "engines": { | ||
| "node": "^18.18.0 || ^20.9.0 || >=21.1.0" | ||
| "node": "^20.19.0 || ^22.13.0 || >=24" | ||
| }, |
There was a problem hiding this comment.
The committed dependency now requires Node ^20.19.0 || ^22.13.0 || >=24, while the package metadata still advertises Node >=18 and the CI matrix includes Node 18 installs. Developers or CI jobs using strict engine checks on Node 18 can fail during install or when running the lint script.
What Changed
Fixes the stale marketplace identifier in the model-facing skill/command docs. After the 2.0.0 rename to
ecc@ecc, the plugin installs to~/.claude/plugins/marketplaces/ecc/and agents register under theecc:namespace — but these docs still referenced the oldeverything-claude-codename, so the model emitted unresolvable prefixes.skills/plan-orchestrate/SKILL.md(plan-orchestrate: stale ECC install detection after marketplace rename toecc@ecc#2316): Phase 0 detection now matches<claude-home>/plugins/marketplaces/ecc/, and Phase 4 output emits/ecc:orchestrate+ecc:<name>instead of the oldeverything-claude-code:forms. Version label updated to2.0.0+.skills/team-builder/SKILL.md: plugin-agent naming examples updated toecc:(e.g.ecc:architect,ecc:security-reviewer).commands/security-scan.md: frontmatteragent:updated toecc:security-reviewer.The inline plugin-root resolvers in
hooks/hooks.json,commands/sessions.md,commands/auto-update.md, etc. already probe botheccand the legacyeverything-claude-codenames, so they were left untouched. Repo-URL references (github.com/affaan-m/everything-claude-code) were deliberately not changed.Why This Change
Under the plugin install, agents register as
ecc:tdd-guide. With the old prefix in the skill,plan-orchestratePhase 0 failed to detect the plugin install and defaulted to legacy bare names (> Warning: could not detect ECC install; defaulting to legacy form.), which fail to resolve under the plugin namespace.Testing Done
node tests/run-all.js) — 2946/2946validate-skills.js(277),validate-commands.js(92),catalog:checkall passnpm ci+npm run lint(eslint + markdownlint) passType of Change
fix:Bug fixSecurity & Quality Checklist
Documentation
Link to Devin session: https://app.devin.ai/sessions/408d7d92c162491d98c736d2a144a96c