#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>
* 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>
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>
- 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>
Add `--to windsurf` target for the converter CLI with full spec compliance
per docs/specs/windsurf.md:
- Claude agents → Windsurf skills (skills/{name}/SKILL.md)
- Claude commands → Windsurf workflows (workflows/{name}.md, flat)
- Pass-through skills copy unchanged
- MCP servers → mcp_config.json (merged with existing, 0o600 permissions)
- Hooks skipped with warning, CLAUDE.md skipped
Global scope support via generic --scope flag (Windsurf as first adopter):
- --to windsurf defaults to global (~/.codeium/windsurf/)
- --scope workspace for project-level .windsurf/ output
- --output overrides scope-derived paths
Shared utilities extracted (resolveTargetOutputRoot, hasPotentialSecrets)
to eliminate duplication across CLI commands.
68 new tests (converter, writer, scope resolution).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Copilot as the 6th converter target, transforming Claude Code plugins
into Copilot's native format: custom agents (.agent.md), agent skills
(SKILL.md), and MCP server configuration JSON.
Component mapping:
- Agents → .github/agents/{name}.agent.md (with Copilot frontmatter)
- Commands → .github/skills/{name}/SKILL.md
- Skills → .github/skills/{name}/ (copied as-is)
- MCP servers → .github/copilot-mcp-config.json
- Hooks → skipped with warning
Also adds `compound sync copilot` support and fixes YAML quoting for
the `*` character in frontmatter serialization.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add sync --target droid (skills to ~/.factory/skills/)
- Add sync --target cursor (skills + MCP to .cursor/)
- Extract expandHome/resolveTargetHome to src/utils/resolve-home.ts
- Remove duplicated path helpers from convert.ts and install.ts
- Bump version to 0.6.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Before writing config.toml (Codex) or opencode.json (OpenCode), the CLI
attempts to create a timestamped backup of any existing config file.
This prevents accidental data loss when users have customized configs.
Backup is best-effort - if it fails (e.g., unusual permissions), the
install continues without blocking.
Backup files are named: config.toml.bak.2026-01-23T21-16-40-065Z