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>
- Fix P1: Remove dead TOOL_MAP constant (defined but never referenced)
- Fix P1: Replace curl fallback for remote MCP servers with warn-and-skip,
matching the kiro pattern — curl is not an MCP server
- Fix P1: Remove incorrect literal cwd field ("${extensionPath}${/}") from
stdio MCP server config; the value was never interpolated
- Fix P1: Fix plugin.name → plugin.manifest.name in generateContextFile
(plugin.name does not exist on ClaudePlugin; produced "# undefined")
- Fix P1: Wire qwenHome through resolveTargetOutputRoot; previously the
--qwen-home CLI flag was parsed but silently discarded
- Fix P1: Remove hardcoded "compound-engineering" from qwen output path;
now uses plugin.manifest.name via new qwenHome + pluginName params
- Fix P1: Collapse dead-code resolveQwenPaths branches (both returned
identical structures; simplify to a single return)
- Fix P3: Remove rewriting of .opencode/ paths to .qwen/ — Claude plugins
do not reference opencode paths, and rewriting them is incorrect
- Fix P3: inferTemperature now returns undefined for unrecognized agents
instead of 0.3 (matching the explicit doc branch), letting the model
use its default temperature
- Fix P2: Add lookbehind guards to rewriteQwenPaths() matching kiro pattern
to avoid rewriting paths inside compound tokens or URLs
- Update --qwen-home default to ~/.qwen/extensions (plugin name appended)
- Add qwen-converter.test.ts with 16 tests covering all scenarios
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix P1: Replace incomplete string escaping in generateEntryPoint with
JSON.stringify() to prevent code injection via command names/descriptions
with backslashes, newlines, or other special characters
- Fix P1: Remove hardcoded 'compound-engineering' output path; resolve
from plugin.manifest.name via new openclawHome + pluginName params
- Fix P2: Add --openclaw-home CLI flag (default: ~/.openclaw/extensions)
consistent with --codex-home and --pi-home patterns
- Fix P2: Emit typed `const skills: Record<string, string> = {}` in
generated TypeScript to prevent downstream type errors
- Fix P3: Add lookbehind guards to rewritePaths() matching kiro pattern
- Fix P3: Extract duplicated disableModelInvocation filter to variable
- Fix P3: Build manifest skills list before constructing manifest object
(no post-construction mutation)
- Export ClaudeToOpenClawOptions type alias for interface clarity
- Add openclaw-converter.test.ts with 13 tests covering all scenarios
Co-Authored-By: Claude <noreply@anthropic.com>
Stop stripping namespace prefixes when converting commands to Copilot
skills. `workflows:plan` now becomes `workflows-plan` instead of just
`plan`, avoiding clashes with Copilot's own features in the chat UI.
Also updates slash command references in body text to match:
`/workflows:plan` → `/workflows-plan`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add copilot case to resolveTargetOutputRoot so `install --to copilot`
writes to .github/ in the current directory instead of falling through
to the opencode default (~/.config/opencode).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The copilot entry in the targets record was missing its closing `},`
after merging with the gemini target branch, causing a parse error.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract named GeminiMcpServer type (eliminates NonNullable indexing)
- Deep-merge mcpServers in settings.json (preserves existing entries)
- Warn when existing settings.json cannot be parsed
- Add test for uniqueName dedup (agent/skill name collision)
- Add test for TOML triple-quote escaping
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add `--to gemini` support for both `convert` and `install` commands,
converting Claude Code plugins into Gemini CLI-compatible format.
- Agents convert to `.gemini/skills/*/SKILL.md` with description frontmatter
- Commands convert to `.gemini/commands/*.toml` with TOML prompt format
- Namespaced commands create directory structure (workflows:plan -> workflows/plan.toml)
- Skills pass through unchanged (identical SKILL.md standard)
- MCP servers written to `.gemini/settings.json` with merge support
- Content transforms: .claude/ paths, Task calls, @agent references
- Hooks emit warning (different format in Gemini)
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>
normalizeModel() turned bare aliases like 'haiku' into 'anthropic/haiku',
which is not a valid OpenCode model ID. This caused
ProviderModelNotFoundError when agents using model: haiku (e.g.
learnings-researcher, lint) were invoked during workflows like /plan.
Add CLAUDE_FAMILY_ALIASES map to resolve haiku, sonnet, and opus to their
full model IDs (e.g. anthropic/claude-haiku-4-5). A console.warn alerts
during conversion so the map can be updated when new versions release.
* feat(cursor): add Cursor CLI as target provider
Add converter, writer, types, and tests for converting Claude Code
plugins to Cursor-compatible format (.mdc rules, commands, skills,
mcp.json). Agents become Agent Requested rules (alwaysApply: false),
commands are plain markdown, skills copy directly, MCP is 1:1 JSON.
* docs: add Cursor spec and update README with cursor target
* chore: bump CLI version to 0.5.0 for cursor target
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: note Cursor IDE + CLI compatibility in README
* fix: install by name always fetches from GitHub
Previously, `install compound-engineering` would resolve to any local
directory named `compound-engineering` in the current working directory
before trying GitHub. This broke installs when users had a same-named
directory that wasn't a valid plugin.
Now bare names always go to GitHub. Only explicit paths (starting with
./ or / or ~) are treated as local paths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(cursor): add Cursor CLI as target provider
Add converter, writer, types, and tests for converting Claude Code
plugins to Cursor-compatible format (.mdc rules, commands, skills,
mcp.json). Agents become Agent Requested rules (alwaysApply: false),
commands are plain markdown, skills copy directly, MCP is 1:1 JSON.
* docs: add Cursor spec and update README with cursor target
* chore: bump CLI version to 0.5.0 for cursor target
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: note Cursor IDE + CLI compatibility in README
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(commands): add /compound-engineering-setup for configurable agents
Adds a new setup command that allows users to configure which review
agents to use instead of hardcoding them in workflows. This enables:
- Multi-step onboarding with AskUserQuestion for easy setup
- Auto-detection of project type (Rails, Python, TypeScript, etc.)
- Three setup modes: Quick (smart defaults), Advanced, and Minimal
- Configuration stored in .claude/compound-engineering.json
- Support for both global (~/.claude/) and project-specific config
Updated workflows to read from config:
- /workflows:review - reads reviewAgents from config
- /plan_review - reads planReviewAgents from config
- /workflows:work - references config for reviewer agents
- /workflows:compound - references config for specialized agents
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat: auto-trigger setup when no config exists
Workflows now detect missing config and offer inline quick setup:
- "Quick Setup" - auto-detect project type, create config, continue
- "Full Setup" - run /compound-engineering-setup for customization
- "Skip" - use defaults just this once
This ensures users get onboarded automatically when running any
workflow for the first time, without needing to know about the
setup command beforehand.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(review): wire all conditionalAgents categories
Extended /workflows:review to invoke conditional agents for:
- migrations (existing)
- frontend (new): JS/TS/Stimulus changes
- architecture (new): structural changes, 10+ files
- data (new): model/ActiveRecord changes
Each category reads from conditionalAgents.* config key and
runs appropriate specialized agents when file patterns match.
Resolves: todos/001-ready-p2-conditional-agents-not-invoked.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: mark todo #001 as complete
* feat(setup): add custom agent discovery and modify flow
- Auto-detect custom agents in .claude/agents/ and ~/.claude/agents/
- Add modify existing config flow (add/remove agents, view config)
- Include guide for creating custom review agents
- Add customAgents mapping in config to track agent file paths
- Update changelog with new config schema including customAgents
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: remove completed todos directory
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* [2.29.1] Improve /workflows:brainstorm question flow
- Add "Ask more questions" option at handoff phase
- Clarify that Claude should ask the user questions (not wait for user)
- Require resolving ALL open questions before offering to proceed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Simplify plugin settings: replace 486-line wizard with .local.md pattern
- Rewrite setup.md (486 → 95 lines): detect project type, create
.claude/compound-engineering.local.md with smart defaults
- Make review.md and work.md config-aware: read agents from .local.md
frontmatter, fall back to auto-detected defaults
- Wire schema-drift-detector into review.md migrations conditional block
- Delete technical_review.md (duplicated /plan_review)
- Add disable-model-invocation to setup.md
- Bump to v2.32.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Rewrite .claude/ paths for OpenCode/Codex targets, add npm publish workflow
- Converters now rewrite .claude/ → .opencode/ (OpenCode) and .codex/ (Codex)
in command bodies and agent bodies so .local.md settings work cross-platform
- Apply transformContentForCodex to agent bodies (was only commands before)
- Add GitHub Action to auto-publish to npm on version bump merge to main
- Bump to v0.4.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(workflows-work): require post-deploy monitoring section
Add a mandatory Post-Deploy Monitoring & Validation section to the /workflows:work PR template, include no-impact fallback guidance, and enforce it in the quality checklist.
* Add learnings-researcher to review workflow, fix docs site counts
- Add learnings-researcher as parallel agent #14 in /workflows:review
so past solutions from docs/solutions/ are surfaced during code review
- Make /release-docs command invocable (remove disable-model-invocation)
- Fix stale counts across docs site (agents 28→29, commands 19→24,
skills 15→18, MCP servers 2→1)
- Bump version to 2.32.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Move /release-docs to local .claude/commands/, bump to 2.32.2
Repo maintenance command doesn't need to be distributed to plugin users.
Update command count 24 → 23 across plugin.json, marketplace.json, and docs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Move settings to project root: compound-engineering.local.md
Tool-agnostic location — works for Claude, Codex, OpenCode without
path rewriting. No global fallback, just project root.
Update commands (setup, review, work) and converter tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Make /compound-engineering-setup interactive with auto-detect fast path
Two paths: "Auto-configure" (one click, smart defaults) or "Customize"
(pick stack, focus areas, review depth). Uses AskUserQuestion throughout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Replace /compound-engineering-setup command with setup skill
Setup is now a skill invoked on-demand when compound-engineering.local.md
doesn't exist. Review and work commands just say "invoke the setup skill"
instead of inlining the full setup flow.
- Remove commands/setup.md (command)
- Add skills/setup/SKILL.md (skill with interactive AskUserQuestion flow)
- Simplify review.md and work.md to reference the skill
- Counts: 29 agents, 22 commands, 19 skills
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Prepare v2.33.0 release: setup skill, configurable review agents
- Bump version to 2.33.0
- Consolidate CHANGELOG entries for this branch
- Fix README: update counts (29/22/19), add setup + resolve-pr-parallel skills
- Remove stale /compound-engineering-setup command reference
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Adds a new 'droid' target to the converter that outputs Claude Code plugins
in Factory Droid's format:
- Commands flattened to ~/.factory/commands/ (strips namespace prefixes)
- Agents converted to droids in ~/.factory/droids/ with proper frontmatter
- Skills copied to ~/.factory/skills/
- Content transforms: Task calls, slash commands, and @agent references
adapted to Droid conventions
This resolves the manual workaround described in issue #31 by automating
the conversion from Claude Code plugin format to Factory Droid's expected
directory structure.
Includes 13 tests covering converter logic and file writer behavior.
Co-authored-by: adamprime <adamprime@hey.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
* Update create-agent-skills to match 2026 official docs, add /triage-prs command
- Rewrite SKILL.md to document that commands and skills are now merged
- Add new frontmatter fields: disable-model-invocation, user-invocable, context, agent
- Add invocation control table and dynamic context injection docs
- Fix skill-structure.md: was incorrectly recommending XML tags over markdown headings
- Update official-spec.md with complete 2026 specification
- Add local /triage-prs command for PR triage workflow
- Add PR triage plan document
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* [2.31.0] Reduce context token usage by 79%, include recent community contributions
The plugin was consuming 316% of Claude Code's description character budget
(~50,500 chars vs 16,000 limit), causing components to be silently excluded.
Now at 65% (~10,400 chars) with all components visible.
Changes:
- Trim all 29 agent descriptions (move examples to body)
- Add disable-model-invocation to 18 manual commands
- Add disable-model-invocation to 6 manual skills
- Include recent community contributions in changelog
- Fix component counts (29 agents, 24 commands, 18 skills)
Contributors: @trevin, @terryli, @robertomello, @zacwilliams,
@aarnikoskela, @samxie, @davidalley
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix: keep disable-model-invocation off commands called by /lfg, rename xcode-test
- Remove disable-model-invocation from test-browser, feature-video,
resolve_todo_parallel — these are called programmatically by /lfg and /slfg
- Rename xcode-test to test-xcode to match test-browser naming convention
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix: keep git-worktree skill auto-invocable (used by /workflows:work)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(converter): support disable-model-invocation frontmatter
Parse disable-model-invocation from command and skill frontmatter.
Commands/skills with this flag are excluded from OpenCode command maps
and Codex prompt/skill generation, matching Claude Code behavior where
these components are user-only invocable.
Bump converter version to 0.3.0.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Claude Code allows hook entries without a `matcher` field (e.g.,
SessionStart and SubagentStop hooks don't need one). The OpenCode
converter assumed `matcher.matcher` was always present, causing
"undefined is not an object (evaluating 'matcher.matcher.split')"
when converting plugins with matcher-less hooks.
Make `matcher` optional in the type and guard all accesses.
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
Adds comprehensive content transformation for Codex compatibility:
1. Task agent calls: `Task agent-name(args)` → `Use the $agent-name skill to: args`
2. Slash commands: `/command-name` → `/prompts:command-name`
3. Agent references: `@agent-name` → `$agent-name skill`
This bridges the syntax gap between Claude Code and Codex:
- Claude Code uses Task tool with subagent_types
- Codex uses skills and /prompts: namespace
Transformations are applied to both skill and prompt files during conversion.
Tested with Codex CLI 0.89.0 - all transformations working correctly.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
The OpenCode installer was writing to ~/.opencode but OpenCode expects
global configuration at ~/.config/opencode per XDG Base Directory spec.
Fixes:
- src/commands/install.ts: Change default output from ~/.opencode to
~/.config/opencode
- src/targets/opencode.ts: Recognize "opencode" basename (not just
".opencode") for direct writes without nesting
Closes#114🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>