Reverts the ce-update removal from 547a41e9. ce-update is a current skill,
but Codex now installs it at the namespaced path
~/.codex/skills/compound-engineering/ce-update. The pre-namespaced flat
path ~/.codex/skills/ce-update is legitimately legacy and must remain in
EXTRA_LEGACY_ARTIFACTS_BY_PLUGIN["compound-engineering"].skills so
cleanupKnownLegacyCodexArtifacts() sweeps it on upgrade.
The invariant test in 547a41e9 had a false premise: it asserted no name in
EXTRA_LEGACY_ARTIFACTS.skills may match a current skill. That conflates
two hazards. STALE_SKILL_DIRS driving a fingerprint-based delete of a
just-installed skill IS a real invariant. EXTRA_LEGACY_ARTIFACTS.skills
driving flat-path cleanup is NOT — current skills whose install path moved
(namespacing, renaming) legitimately appear in that list. Narrow the
invariant test to STALE_SKILL_DIRS only and document the distinction.
Caught by @chatgpt-codex-connector in PR review.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
#634 retired ce-andrew-kane-gem-writer, ce-changelog, ce-deploy-docs,
ce-dspy-ruby, and ce-every-style-editor but only added them to
STALE_SKILL_DIRS. Without a LEGACY_ONLY_SKILL_DESCRIPTIONS entry,
loadLegacyFingerprints left skills.get() undefined for each name, so
cleanupStaleSkillDirs short-circuited to false on isLegacyPluginOwned and
never swept stale flat installs on upgrade. Same shape as the ce-onboarding
gap caught earlier in this PR.
Add the shipped descriptions (as of the removal commit) and extend the
legacy-only-skills test to cover all five.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adding ce-onboarding to STALE_SKILL_DIRS alone was insufficient: with the
skill deleted, loadLegacyFingerprints has no current skill description to
read and no LEGACY_ONLY_SKILL_DESCRIPTIONS fallback, so skills.get() was
returning undefined and isLegacyPluginOwned was short-circuiting to false
for every stale ce-onboarding directory on a user's machine. The upgrade
sweep was silently a no-op.
Add the shipped ce-onboarding description to LEGACY_ONLY_SKILL_DESCRIPTIONS
and extend the legacy-only-skills test to cover it.
Caught by @chatgpt-codex-connector in PR review.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add an invariant test that fails when a name in STALE_SKILL_DIRS or in
EXTRA_LEGACY_ARTIFACTS_BY_PLUGIN["compound-engineering"].skills matches a
current directory under plugins/compound-engineering/skills/. If a retired
skill is ever re-added to the plugin, the stale registry entry would make
cleanupStaleSkillDirs() fingerprint-match the freshly-installed skill and
delete it on every install.
The test caught a pre-existing collision: ce-update was erroneously seeded
into the legacy artifacts list in #609 even though it has been a live skill
since #538. Remove it from the registry and flip the assertions in
plugin-legacy-artifacts.test.ts and cli.test.ts that were locking in the
buggy behavior (the CLI test was effectively asserting that cleanup would
move a user's live ce-update install into legacy-backup).
Export STALE_SKILL_DIRS so the invariant test can import it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The ce-onboarding skill was underused and did not earn its place in the
plugin. Its `/ce-onboarding` entry is removed from the README, and it is
added to the legacy-cleanup registry alongside the other skills retired in
#634 so stale flat-install artifacts are swept on upgrade.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Remove plugin version fields from marketplace.json -- canonical
versions live in each plugin's plugin.json. Duplicating them created
drift that release-please couldn't maintain.
- Remove version sync logic from metadata.ts (description sync kept)
- Fix release-preview test to compute expected versions dynamically
from current manifests instead of hardcoding them
* docs: capture codex skill prompt model
* fix: align codex workflow conversion
* chore: remove deprecated workflows:* skill aliases
The workflows:brainstorm, workflows:plan, workflows:work, workflows:review,
and workflows:compound aliases have been deprecated long enough. Remove them
and update skill counts (46 → 41) across plugin.json, marketplace.json,
README, and CLAUDE.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Trevin Chow <trevin@trevinchow.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(kiro): parse .mcp.json wrapper key and support remote MCP servers
* refactor: extract unwrapMcpServers helper to deduplicate parser logic
Address review feedback by extracting the mcpServers unwrap logic
into a shared helper used by both loadMcpServers and loadMcpPaths.
Deduplicate colon-separated command name logic across all 4 targets
(opencode, droid, gemini, qwen) into a single resolveCommandPath()
helper in utils/files.ts.
Addresses review feedback on PR #251.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On Windows/NTFS, colons are reserved for alternate data streams, so
filenames like "ce:plan.md" are invalid. Split colon-separated command
names into nested directories (e.g. "ce:plan" -> "ce/plan.md"),
matching the approach already used by the Qwen target.
Applied to opencode, droid, and gemini targets.
Fixes#226
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bump plugin to 2.39.0 with features from Matt Van Horn (@mvanhorn):
context budget precheck, plan sequence numbers, review serial mode,
agent-browser debugging commands, test-browser port detection, lfg
phase gating, and Context7 API key auth.
Also fixes MCP server merge order so plugin servers correctly
overwrite stale entries during sync.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When Claude makes parallel tool calls and a PreToolUse hook command
fails, the thrown error can crash the entire batch, causing API 400
errors. Wrap generated tool.execute.before handlers in try-catch so
failures are logged but non-fatal.
Fixes#85
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sync path's mergeJsonConfigAtKey had incoming entries overwriting
existing user entries on conflict. Reverse the spread order so user
config wins, matching the install path's existing behavior.
Also add merge feedback logging and a test for the sync merge path.
Fixes#125
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
OpenClaw rejects generated plugin manifests that omit configSchema, even for tool plugins with no user configuration. Always emit an empty object schema so converted installs boot cleanly.\n\nAdd converter and writer regression coverage for the manifest shape.\n\nFixes #224
- codex-agents.ts: replace vague "ask the user in chat" with structured
numbered-list instructions for Codex AGENTS.md context
- CLAUDE.md: add AskUserQuestion policy to skill compliance checklist
to prevent recurrence in future skills
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- sync.ts: add gemini + all targets, keep copilot, remove cursor (native), use shared hasPotentialSecrets
- install.ts + convert.ts: import both detectInstalledTools and resolveTargetOutputRoot; update --to all block to use new object API; fix resolvedScope ordering (was referencing target before definition)
- CHANGELOG.md: add v0.12.0 entry (auto-detect + Gemini sync)
- README.md: merge all install targets, collapsible output format table, sync defaults to --target all
- package.json: bump to 0.12.0
- sync --target now defaults to "all" when omitted
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Combine windsurf scope support from this branch with openclaw/qwen targets from main
- Update resolve-output.ts utility to handle openclaw/qwen with openclawHome/qwenHome/pluginName
- Add openclawHome/qwenHome args to install.ts and convert.ts
- Register openclaw and qwen in targets/index.ts alongside windsurf
- Add openclaw/qwen coverage to resolve-output.test.ts (4 new tests → 288 total)
- Update README to document all 10 targets including windsurf and openclaw
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both openclaw (#217) and qwen (#220) modified install.ts and targets/index.ts.
Combined both targets: openclawHome + qwenHome in resolveTargetOutputRoot,
both registered in the targets registry.
Co-Authored-By: Claude <noreply@anthropic.com>