Repository navigation
feat(cleanup): detect duplicate MCP servers; /cleanup plugins as the single update path - #803
Conversation
…as the single update path - /cleanup plugins mcp (Find-DuplicateMcpServers.ps1): lists MCP servers whose short name repeats across plugins with each transport, recommends which to keep (hosted by default, -PreferLocal, -Keep), and plans the disabledMcpServers entries every known project lacks. -Execute -PlanId applies exactly the confirmed plan: backup first, atomic write, only disabledMcpServers touched, read back to verify (#757). - Update report: per-plugin cache pressure (builds + MB over thresholds, suggests clean), plugins running from a directory marketplace with the commands to move to a release, and git marketplaces with autoUpdate off (report only) (#798). - Release-notice contract: plugin-releases/<plugin>.json fix list is appended to the existing stale-plugin notice when it describes the installed build (#798). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (sha d67090c) — En general bien diseñado: plan/
Nada bloqueante salvo el punto 1 (seguridad), que recomiendo arreglar antes de mergear. |
…rShell 5.1 Replace the generic-method call GetValue[string]() (PowerShell 7.3+ syntax) with GetValueKind() + ToString(), so the ScriptEncoding 5.1 check passes without growing its exception list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review de 6147b25: el diseño es sólido (plan/ejecución con PlanId, backup previo, escritura atómica, verificación posterior, validación estricta de
|
…ease fixes - Consider only user-scope plugins not turned off in enabledPlugins, so the kept copy loads in every project where the other one is disabled. - Skip a project that already disables the copy to keep (it would lose the server). - Refuse a config that is a link; keep the config's Unix file mode on rewrite. - Release fixes accept issue references only; no 'Fixes:' line when there are none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (sha fc3d010): el diseño está sólido (plan sin escritura, plan id que fija lo escrito, backup previo, escritura atómica, verificación posterior, rechazo de enlaces, issue refs filtradas en el notice). Sin bloqueantes. Observaciones menores:
|
… update report - Skip projects whose own settings turn the kept plugin off; name undecided servers instead of calling them handled; refuse a write when a running session changed the config mid-edit; create the temp file with the config's Unix mode; -Execute with -ClaudeHome needs explicit -ConfigPath and -BackupDir. - Directory-source advice reinstalls every plugin of the marketplace; auto-update lists only an explicit false. - Release file keyed plugin@marketplace, read only from a regular non-empty file through a bound. - Tests: plan id across keep choices, backup location, real traversal, empty fixes, no -DateKind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (sha 442333b): no encontré bugs bloqueantes ni problemas de seguridad. El diseño es sólido: plan/ejecución atados por Observaciones menores, no bloqueantes:
|
…oofs - Directory-source reinstall lines carry each install's --scope. - Cache pressure shows how many builds clean could free and suggests it only when above zero. - Docs: auto-update lists only an explicit false. - Tests: mid-edit refusal through a seam, -ClaudeHome guard with its refusal text, real traversal decoys, the 10-reference cap, 64 KB / folder / link / pipe bounds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review: sin hallazgos bloqueantes. Revisé
Nit opcional, sin bloquear: el script depende de 🤖 Generated with Claude Code |
- Refuse a -Keep that names no plugin with an MCP server; accept plugin@marketplace. - settings.local.json overrides settings.json when checking a project's enabledPlugins. - Reinstall lines name each project folder (installed_plugins projectPath). - Cache pressure says 'could not tell' when the cleanup plan failed. - Tests: non-hanging pipe check, 0640 mode, cache-section advice, -BackupDir guard, directory marketplace with autoUpdate false. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Revisé Observaciones menores, no bloqueantes:
|
- Resolve -ClaudeHome/-ConfigPath/-BackupDir to absolute paths before any .NET file call. - -ClaudeHome moves the default config to <home>/.claude.json (same profile as the plugins). - After -Clean, recompute what is freeable so a build that failed to delete is still reported. - Pipe test: the writer gets one quoted argument string and needs no 'timeout' binary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (sha d6037a0): no encontré bugs bloqueantes. Revisé a fondo Lo que está bien:
Menores, no bloqueantes:
Los tests nuevos ( |
A plan-id mismatch now says to plan again instead of handing out the new id, which an agent could retry without showing the plan (review round 6). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Sin hallazgos bloqueantes en el sha b391141. Revisé Lo que comprobé al leer el código:
Sugerencias menores, no bloquean:
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review (último commit b23464d + vistazo al diff de release-notice) Sin bloqueantes. El fix del BOM es correcto ( Observaciones menores, no bloqueantes:
|
… plan Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Sin hallazgos bloqueantes. Revisé a fondo Lo que está bien en
Nits opcionales:
|
External review - claude-review (Claude API, clean context)Reviewed commit: claude-review (Claude API, claude-opus-5-5, --effort xhigh, clean context; same model family, not a second provider) reviewed the full diff in 9 rounds, split by folder after max_tokens. ~40 findings verified against the source and fixed: scope/enabledPlugins filtering (user + project, local overrides shared), skip projects that disable the kept copy, unmatched -Keep refused, plan id never leaked, link / mid-edit / Unix-mode / relative-path / unmapped-drive safety on ~/.claude.json, -ClaudeHome guards; scoped reinstall lines with project folders, freeable-only clean advice, autoUpdate only explicit false; release file keyed plugin@marketplace, bounded regular-file read, BOM, issue-reference-only fixes; tests for each. Final rounds: scripts (Find-DuplicateMcpServers, hook/state/update) and tests+docs returned no findings. |
|
On hold: waiting for the Anthropic plugin directory review. Do not merge yet. The agentic-board plugin is in its first review in the Anthropic plugin directory, and the directory tracks Batch waiting together: #799, #800, #801, #802, #803, #804.
|
|
Review (sha 3aa9e16): sin bloqueantes. Plan/ Observaciones menores (no bloquean):
|
Closes #757
Refs #798
What
#757 —
/cleanup plugins mcp(Find-DuplicateMcpServers.ps1).mcp.json,mcpServersinplugin.json) and lists the servers whose short name repeats across plugins, with each copy's transport (hosted http/sse vs local stdio).-PreferLocalwhen the work needs desktop/project files,-Keep <plugin>to decide explicitly. No clear choice → listed and left alone.plugin:<p>:<s>indisabledMcpServers.-Execute -PlanId <id>applies exactly that plan: refuses a stale id, backs~/.claude.jsonup to~/.agentic-board/backups/first, writes atomically viaSystem.Text.Jsonnodes (onlydisabledMcpServerstouched; every other value round-trips), and reads back to verify. Re-running lists projects opened later.#798 —
/cleanup pluginsas the single update path (slice)-CacheBuildLimit10 /-CacheMbLimit500, suggestsclean); plugins running from a directory marketplace with themarketplace remove/add <git>#<ref>/installcommands; git marketplaces with autoUpdate off (report only, never flipped).<claude home>/plugin-releases/<plugin>.json(version,commit,publishedAt,fixes[]); the existing stale-plugin notice appendsFixes: #a #b.when the file describes the installed build. Fix text is sanitized (short tokens, max 10). Documented inverbs-plugins.md.Left for #798 (hence
Refs, notCloses)autoUpdateon (writingknown_marketplaces.json) — only reported today./cleanup plugins sessions(only the update report does)./mcpreconnect picks up a new build.Tests
DuplicateMcp.Tests.ps1(11) andPluginUpdate.Report.Tests.ps1(11): fabricated Claude home + fixture config in$TestDrive; never the real~/.claude.json, plugin cache orclaudeCLI.Update-Docs.ps1 -Checkclean. Full suite runs in CI.🤖 Generated with Claude Code