diff --git a/docs/README.skills.md b/docs/README.skills.md
index 41ee218b8..24a009c60 100644
--- a/docs/README.skills.md
+++ b/docs/README.skills.md
@@ -37,6 +37,7 @@ See [CONTRIBUTING.md](../CONTRIBUTING.md#adding-skills) for guidelines on how to
| [agent-governance](../skills/agent-governance/SKILL.md)
`gh skills install github/awesome-copilot agent-governance` | Patterns and techniques for adding governance, safety, and trust controls to AI agent systems. Use this skill when:
- Building AI agents that call external tools (APIs, databases, file systems)
- Implementing policy-based access controls for agent tool usage
- Adding semantic intent classification to detect dangerous prompts
- Creating trust scoring systems for multi-agent workflows
- Building audit trails for agent actions and decisions
- Enforcing rate limits, content filters, or tool restrictions on agents
- Working with any agent framework (PydanticAI, CrewAI, OpenAI Agents, LangChain, AutoGen) | None |
| [agent-owasp-compliance](../skills/agent-owasp-compliance/SKILL.md)
`gh skills install github/awesome-copilot agent-owasp-compliance` | Check any AI agent codebase against the OWASP Agentic Security Initiative (ASI) Top 10 risks.
Use this skill when:
- Evaluating an agent system's security posture before production deployment
- Running a compliance check against OWASP ASI 2026 standards
- Mapping existing security controls to the 10 agentic risks
- Generating a compliance report for security review or audit
- Comparing agent framework security features against the standard
- Any request like "is my agent OWASP compliant?", "check ASI compliance", or "agentic security audit" | None |
| [agent-skill-stack](../skills/agent-skill-stack/SKILL.md)
`gh skills install github/awesome-copilot agent-skill-stack` | Find, evaluate, and assemble the smallest compatible set of AI Agent Skills for an end-to-end natural-language goal. Use when a user wants Skills for a multi-step workflow, asks which Skills fit a project, needs an installed-Skill audit or conflict check, has low Skill recall, wants indirect helpers such as humanizers or compliance checks, or wants a project-specific Skill Stack with controlled installation. Search local Skills, registries, GitHub, and OpenCLI; compare adoption, verified fit, safety, and overlap. Do not use for locating one known or common Skill; use the generic find-skills workflow. | `agents/openai.yaml`
`references/discovery-ranking.md`
`references/local-index-and-profiles.md`
`references/security-installation.md`
`references/workflow-model.md`
`scripts/inventory_skills.py`
`scripts/project_profile.py`
`scripts/render_stack_card.py`
`scripts/skill_index.py`
`scripts/stage_install.py` |
+| [agent-skills-setup](../skills/agent-skills-setup/SKILL.md)
`gh skills install github/awesome-copilot agent-skills-setup` | Use when a user wants to migrate, back up, restore, compare, or move AI-coding-agent context across Cursor, Claude Code, Codex, Cline, Copilot, Windsurf, Gemini CLI, or another supported profile, including switching computers. Handles reviewed Skills, instructions/rules, and MCP with secret redaction, plan preview, verification, and rollback. | `assets/LICENSE.clawhub`
`assets/demo.gif`
`evals/evals.json`
`evals/files/cursor-project-mcp.json`
`evals/files/instruction-cline-source.md`
`evals/files/instruction-ir-cursor.golden.mdc`
`evals/files/instruction-ir-source.mdc`
`evals/profile-contracts.json`
`evals/trigger-evals.json`
`references/doc-freshness-checks.json`
`references/ide-paths.json`
`references/ide-registry.md`
`references/ides/aider.md`
`references/ides/amazon-q.md`
`references/ides/android-studio.md`
`references/ides/antigravity.md`
`references/ides/augment-code.md`
`references/ides/baidu-comate-ide.md`
`references/ides/baidu-comate.md`
`references/ides/blackbox.md`
`references/ides/bolt-new.md`
`references/ides/claude-desktop.md`
`references/ides/claude.md`
`references/ides/cline.md`
`references/ides/codecompanion-nvim.md`
`references/ides/codeium.md`
`references/ides/codely.md`
`references/ides/codex.md`
`references/ides/cody.md`
`references/ides/continue.md`
`references/ides/copilot.md`
`references/ides/crush.md`
`references/ides/cursor.md`
`references/ides/devin.md`
`references/ides/emacs.md`
`references/ides/factory-droid.md`
`references/ides/firebase-studio.md`
`references/ides/forge.md`
`references/ides/gemini-cli.md`
`references/ides/gemini-code-assist.md`
`references/ides/gitlab-duo.md`
`references/ides/goose-cli.md`
`references/ides/gptel-mcp-el.md`
`references/ides/helix.md`
`references/ides/hermes.md`
`references/ides/ibm-bob.md`
`references/ides/jetbrains-ai.md`
`references/ides/jetbrains.md`
`references/ides/jules.md`
`references/ides/kilocode.md`
`references/ides/kimiai.md`
`references/ides/kiro.md`
`references/ides/letta-code.md`
`references/ides/letta.md`
`references/ides/lovable.md`
`references/ides/mcphub-nvim.md`
`references/ides/minimax-code.md`
`references/ides/mistral-vibe.md`
`references/ides/mmx-cli.md`
`references/ides/monkeycode.md`
`references/ides/neovim.md`
`references/ides/openclaw.md`
`references/ides/opencode.md`
`references/ides/openhands.md`
`references/ides/pearai.md`
`references/ides/pi.md`
`references/ides/pieces.md`
`references/ides/qoder-cn.md`
`references/ides/qoder.md`
`references/ides/qodo.md`
`references/ides/qwen-code.md`
`references/ides/replit.md`
`references/ides/roo-code.md`
`references/ides/rovodev.md`
`references/ides/sourcegraph-amp.md`
`references/ides/supermaven.md`
`references/ides/tabnine.md`
`references/ides/tencent-codebuddy-ide.md`
`references/ides/tencent-codebuddy.md`
`references/ides/tongyi-lingma.md`
`references/ides/trae-cn.md`
`references/ides/trae-work.md`
`references/ides/trae.md`
`references/ides/ui-only-mcp.md`
`references/ides/v0.md`
`references/ides/vecli.md`
`references/ides/visual-studio.md`
`references/ides/void-editor.md`
`references/ides/vscode.md`
`references/ides/warp-oz.md`
`references/ides/warp.md`
`references/ides/windsurf.md`
`references/ides/workbuddy.md`
`references/ides/xcode.md`
`references/ides/zcode.md`
`references/ides/zed.md`
`references/ides/zencoder.md`
`references/ides/zenflow.md`
`references/mcp-migration.md`
`references/mcp-transport.md`
`references/migration-safety.md`
`references/object-migration.md`
`references/registry-v2.json`
`references/registry-v2.schema.json`
`references/verification.md`
`scripts/README.md`
`scripts/acb/__init__.py`
`scripts/acb/bundle.py`
`scripts/check-doc-freshness.py`
`scripts/common.sh`
`scripts/context-migrator.py`
`scripts/detect/__init__.py`
`scripts/detect/probes.py`
`scripts/doc_freshness.py`
`scripts/ide-paths.tsv`
`scripts/legacy-smart-ide-migration.sh`
`scripts/migration_core.py`
`scripts/registry/__init__.py`
`scripts/registry/alias_resolver.py`
`scripts/registry/exceptions.py`
`scripts/scan-skill-secrets.py`
`scripts/skill_secret_scanner.py`
`scripts/smart-ide-migration.sh`
`scripts/sync-ide-reference-summaries.py`
`scripts/test-acb-all-installed.sh`
`scripts/test-acb-bundle-backed-plan.sh`
`scripts/test-acb-multiscope-restore.sh`
`scripts/test-acb-p0-audit-regressions.sh`
`scripts/test-acb-restore-noop.sh`
`scripts/test-acb-secret-scan-unified.sh`
`scripts/test-acb-security-boundary.sh`
`scripts/test-acb-snapshot-restore.sh`
`scripts/test-acb-true-restore.sh`
`scripts/test-alias-resolution.sh`
`scripts/test-antigravity-migration.sh`
`scripts/test-audit-e2e-matrix.sh`
`scripts/test-claude-code-mapping.sh`
`scripts/test-claude-desktop-mapping.sh`
`scripts/test-codex-migration.sh`
`scripts/test-conflict-strategies.sh`
`scripts/test-copilot-mapping.sh`
`scripts/test-cursor-mapping.sh`
`scripts/test-detection-probes.sh`
`scripts/test-doc-freshness.sh`
`scripts/test-emacs-mapping.sh`
`scripts/test-eval-coverage.sh`
`scripts/test-freshness-expanded.sh`
`scripts/test-ide-paths.sh`
`scripts/test-ide-reference-generation.sh`
`scripts/test-ir-schemas.sh`
`scripts/test-jetbrains-junie-mapping.sh`
`scripts/test-legacy-registry-gate.sh`
`scripts/test-mcp-adapters.sh`
`scripts/test-mcp-secret-redaction.sh`
`scripts/test-migrate-command.sh`
`scripts/test-migration-core.sh`
`scripts/test-migration-default-scope.sh`
`scripts/test-migration-evidence.sh`
`scripts/test-migration-handoff-branch.sh`
`scripts/test-migration.sh`
`scripts/test-modern-ide-mappings.sh`
`scripts/test-opencode-v2-mapping.sh`
`scripts/test-partial-safe-apply.sh`
`scripts/test-profile-contracts.sh`
`scripts/test-progressive-disclosure.sh`
`scripts/test-reference-composition.sh`
`scripts/test-reference-layout.sh`
`scripts/test-registry-v2.sh`
`scripts/test-remaining-ide-mappings.sh`
`scripts/test-root-mirror-links.sh`
`scripts/test-skill-metadata.sh`
`scripts/test-skill-secret-preflight.sh`
`scripts/test-smart-ide-migration.sh`
`scripts/test-stable-object-ids.sh`
`scripts/test-trae-boundary.sh`
`scripts/test-vscode-mapping.sh`
`scripts/test-windsurf-mapping.sh`
`scripts/test-zed-mapping.sh`
`scripts/validate-registry-v2.py` |
| [agent-supply-chain](../skills/agent-supply-chain/SKILL.md)
`gh skills install github/awesome-copilot agent-supply-chain` | Verify supply chain integrity for AI agent plugins, tools, and dependencies. Use this skill when:
- Generating SHA-256 integrity manifests for agent plugins or tool packages
- Verifying that installed plugins match their published manifests
- Detecting tampered, modified, or untracked files in agent tool directories
- Auditing dependency pinning and version policies for agent components
- Building provenance chains for agent plugin promotion (dev → staging → production)
- Any request like "verify plugin integrity", "generate manifest", "check supply chain", or "sign this plugin" | None |
| [agentic-eval](../skills/agentic-eval/SKILL.md)
`gh skills install github/awesome-copilot agentic-eval` | Patterns and techniques for evaluating and improving AI agent outputs. Use this skill when:
- Implementing self-critique and reflection loops
- Building evaluator-optimizer pipelines for quality-critical generation
- Creating test-driven code refinement workflows
- Designing rubric-based or LLM-as-judge evaluation systems
- Adding iterative improvement to agent outputs (code, reports, analysis)
- Measuring and improving agent response quality | None |
| [ai-prompt-engineering-safety-review](../skills/ai-prompt-engineering-safety-review/SKILL.md)
`gh skills install github/awesome-copilot ai-prompt-engineering-safety-review` | Comprehensive AI prompt engineering safety review and improvement prompt. Analyzes prompts for safety, bias, security vulnerabilities, and effectiveness while providing detailed improvement recommendations with extensive frameworks, testing methodologies, and educational content. | None |
diff --git a/skills/agent-skills-setup/agent-skills-setup/SKILL.md b/skills/agent-skills-setup/agent-skills-setup/SKILL.md
new file mode 100644
index 000000000..b179a23a8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/SKILL.md
@@ -0,0 +1,59 @@
+---
+name: agent-skills-setup
+license: MIT
+compatibility: Requires local Bash, Python 3, environment lookup, and filesystem reads. Writes only approved migration targets; no network access.
+metadata:
+ version: "0.9.2"
+ permissions.shell: "bundled offline Bash/Python scripts plus local read-only detection commands"
+ permissions.env: "read environment variables to resolve product paths"
+ permissions.file_read: "named source products, workspace tree, bundled references"
+ permissions.file_write: "reviewed plan targets after explicit --yes consent"
+ permissions.network: "denied"
+description: >-
+ Use when a user wants to migrate, back up, restore, compare, or move
+ AI-coding-agent context across Cursor, Claude Code, Codex, Cline,
+ Copilot, Windsurf, Gemini CLI, or another supported profile, including
+ switching computers. Handles reviewed Skills, instructions/rules, and
+ MCP with secret redaction, preview, verification, and rollback.
+---
+
+# AI IDE Context Migration
+
+## Permissions
+
+- `shell`: bundled offline scripts plus local read-only detection commands (git, version, mdfind). No downloads or binary installations.
+- `env`: path resolution only; credential-looking values are redacted, never copied or printed.
+- `file_read`: named source products, workspace tree, bundled `references/`; no probing of unlisted products.
+- `file_write`: reviewed plan targets after `--yes` consent; state under `/.agent-context-migration/`.
+- `network`: denied. Every subcommand is offline; no downloads, telemetry, or remote calls.
+
+## Capabilities and authorization
+
+- `detect`, `doctor`, `inventory`, `plan`, `snapshot`, and `bundle-verify` read only named products and workspace; network access is forbidden.
+- A generic migration request authorizes planning only; separate explicit user approval (`--yes`) or explicit action verbs (apply, restore, 迁到) under `--apply-safe` authorize write.
+- Save the plan, review its diff/rebuild manifest, and apply that exact file. ACB `restore` constructs a dual-side plan binding bundle sources to destination targets, supporting replayable plans (`--plan-in`) with strict TOCTOU state guards.
+
+## Route
+
+1. Resolve both product profiles through [ide-registry.md](references/ide-registry.md) / [registry-v2.json](references/registry-v2.json).
+2. Read only [references/ides/.md](references/ides/) and [references/ides/.md](references/ides/).
+3. Load reference by need:
+ - Before preview or apply: [references/migration-safety.md](references/migration-safety.md)
+ - MCP objects: [references/mcp-migration.md](references/mcp-migration.md)
+ - Other file objects: [references/object-migration.md](references/object-migration.md)
+ - Approved apply / proof: [references/verification.md](references/verification.md)
+
+## Execution & Scope
+
+- High-level: `bash scripts/smart-ide-migration.sh migrate --source --target --workspace . --objects all-portable --yes`
+- Step-by-step: `plan --output ` -> `apply --manifest --yes` -> `verify --manifest ` -> `rollback --manifest --yes`.
+- Device handoff (ACB): `snapshot` captures portable skills/instructions/MCP with atomic staging and 1:1 manifest bindings; `bundle-verify` re-checks checksums, bindings, secrets, and signatures; `restore [--plan-only | --plan-in --yes]` reviews then executes the dual-side plan. `--all-installed` bulk mode requires review and `--yes`.
+- Cross-platform: `%APPDATA%` / `%USERPROFILE%` / `$APPDATA` resolution, platform detection, per-surface path isolation (remote hosts experimental). `detect` / `doctor` inspect installation state offline.
+- The explicit `legacy` subcommand is read-only lookup compatibility (`--print-path`, `--dry-run`); legacy writes are disabled and enforced by the Python wrapper.
+- Object-type scope (exhaustive — apply writes nothing outside it):
+ - Auto-migratable (`ready`): `skills`, `instructions`, `mcp`; opaque plugin package copy where both profiles declare it.
+ - Draft-only, never auto-written: `prompts`, `commands`, `agents`, `hooks`, `workflows`. Executable surfaces have no staging writer; replayed plans marking them eligible fail closed.
+ - Opt-in session transfer: `handoff` needs `--objects handoff` AND `--include-session`; only reviewed summary, git branch, relative selected files, and an explicit patch travel. Raw conversation, tokens, session state, machine paths, logs discarded.
+ - Never migrated: trust state, generated memory, cloud knowledge, approvals, chat history.
+- Sensitive shared settings files are read only for the named migration's authorized MCP subobject; trust sections (`never-migrate`) and sibling settings never enter plans or bundles; strict secret redaction before output. See [references/mcp-migration.md](references/mcp-migration.md).
+- Claude Desktop app MCP in **Settings → Extensions** and **Settings → Connectors** is UI-managed; do not infer or rewrite it from legacy JSON.
diff --git a/skills/agent-skills-setup/agent-skills-setup/assets/LICENSE.clawhub b/skills/agent-skills-setup/agent-skills-setup/assets/LICENSE.clawhub
new file mode 100644
index 000000000..e1580aab1
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/assets/LICENSE.clawhub
@@ -0,0 +1,17 @@
+MIT No Attribution
+
+Copyright 2026 agent-skills-setup contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/skills/agent-skills-setup/agent-skills-setup/assets/demo.gif b/skills/agent-skills-setup/agent-skills-setup/assets/demo.gif
new file mode 100644
index 000000000..2e733ddb1
Binary files /dev/null and b/skills/agent-skills-setup/agent-skills-setup/assets/demo.gif differ
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/evals.json b/skills/agent-skills-setup/agent-skills-setup/evals/evals.json
new file mode 100644
index 000000000..e2a8784df
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/evals.json
@@ -0,0 +1,110 @@
+{
+ "skill_name": "agent-skills-setup",
+ "evals": [
+ {
+ "id": 1,
+ "prompt": "Preview moving Cursor skills and project rules to Claude Code for /tmp/acme-app. No writes or unrelated discovery. Give the exact first command.",
+ "expected_output": "A scoped Cursor-to-Claude dry run for the named workspace.",
+ "files": [],
+ "assertions": [
+ "Starts with a read-only dry run and does not claim migration.",
+ "Names cursor, claude, /tmp/acme-app, and --dry-run.",
+ "Inspects only the named IDEs and workspace.",
+ "Defaults to skills/rules/prompts, excluding MCP, config, agents, hooks, and memory."
+ ]
+ },
+ {
+ "id": 2,
+ "prompt": "Preview Cursor project MCP from evals/files/cursor-project-mcp.json to OpenCode for /tmp/acme-mcp. Show target shape and separate preview/apply commands. Preserve behavior; never copy literal credentials.",
+ "expected_output": "An explicit-source, zero-write Cursor-to-OpenCode MCP conversion plan.",
+ "files": ["evals/files/cursor-project-mcp.json"],
+ "assertions": [
+ "Uses OpenCode mcp, not mcpServers.",
+ "Uses local type, command array, and environment rather than env.",
+ "Preserves local command configurations and environment mappings without guessing transport.",
+ "Converts exact ${env:NAME} to {env:NAME} and blanks literal credentials.",
+ "Uses --dry-run first and --yes only in a separate apply command.",
+ "Both commands select project MCP, /tmp/acme-mcp, and the supplied --source-mcp-file.",
+ "Explains that --source cursor selects schema while the file only selects input."
+ ]
+ },
+ {
+ "id": 3,
+ "prompt": "Preview moving user Continue YAML mcpServers from ~/.continue/config.yaml into trusted Codex project config at /tmp/atlas. Do not read or write real files. Give only safe diagnostics and the next step.",
+ "expected_output": "A preview that rejects generic YAML-to-Codex-TOML conversion and recommends reviewed reconstruction.",
+ "files": [],
+ "assertions": [
+ "Identifies Continue user YAML and /tmp/atlas/.codex/config.toml mcp_servers.",
+ "States automatic conversion is unsafe and fabricates no target config.",
+ "Uses only --dry-run or --print-path diagnostics.",
+ "Uses no --yes, remote installer, or completion claim.",
+ "Recommends manual TOML reconstruction and validation."
+ ]
+ },
+ {
+ "id": 4,
+ "prompt": "In an isolated workspace, run Cursor-to-OpenCode project MCP migration using evals/files/cursor-project-mcp.json. Prove dry-run reads it without a target, then apply with --yes. Keep source bytes unchanged and save opencode.json.",
+ "expected_output": "Execution evidence for zero-write preview, valid converted target, redaction, and source immutability.",
+ "files": ["evals/files/cursor-project-mcp.json"],
+ "assertions": [
+ "Shows dry-run exit 0, supplied fixture path, and validated source summary.",
+ "Proves opencode.json is absent after dry-run and appears only after apply.",
+ "Produces mcp.local-search with local type, command array, and environment.",
+ "Converts ${env:NAME}, blanks LITERAL_TOKEN, and preserves command configuration without guessing transport.",
+ "Uses --json and reports evidence.mcp paths, hashes, validation, and status.",
+ "Proves unchanged source and recorded target digest."
+ ]
+ },
+ {
+ "id": 5,
+ "prompt": "Explain Cursor mcp.json and its root key only. Do not inspect files, migrate, or give changing commands.",
+ "expected_output": "A concise informational answer outside the migration workflow.",
+ "files": [],
+ "assertions": [
+ "Treats this as explanation, not migration authority.",
+ "Identifies mcpServers as the root key.",
+ "Claims no local read or script execution.",
+ "Provides no --yes/apply command or unrelated discovery."
+ ]
+ },
+ {
+ "id": 6,
+ "prompt": "Explain --strategy skip, backup, and overwrite for Cursor project MCP into existing OpenCode config with unrelated theme, same-name, and other servers. Do not execute.",
+ "expected_output": "Exact non-executing conflict semantics for a shared OpenCode JSON file.",
+ "files": [],
+ "assertions": [
+ "Says skip preserves the existing target without renamed entries.",
+ "Says backup snapshots the complete file, merges non-conflicts, and activates same-name source.",
+ "Says overwrite replaces only selected MCP map and retains theme.",
+ "Does not claim _migrated or whole-config deletion.",
+ "Does not execute or claim migration."
+ ]
+ },
+ {
+ "id": 7,
+ "prompt": "Preview Claude Code user MCP to VS Code with a named Profile whose directory I did not provide. Do not guess a path or write. Give the safe next step and project alternative.",
+ "expected_output": "A fail-closed VS Code profile plan with a documented workspace alternative.",
+ "files": [],
+ "assertions": [
+ "Does not guess a user VS Code MCP path.",
+ "Uses MCP: Open User Configuration or asks for resolved target path.",
+ "Identifies .vscode/mcp.json as project alternative.",
+ "Uses --dry-run for any project preview.",
+ "Does not claim completion."
+ ]
+ },
+ {
+ "id": 8,
+ "prompt": "Preview Cursor project MCP from evals/files/cursor-project-mcp.json into native OpenCode V2 for /tmp/opencode-v2. No writes or mixed V1/V2 layout. Show schema and command.",
+ "expected_output": "An explicit-source OpenCode V2 dry run using native mcp.servers only.",
+ "files": ["evals/files/cursor-project-mcp.json"],
+ "assertions": [
+ "Command includes --opencode-version v2, --dry-run, project-mcp, workspace, and source file.",
+ "Uses mcp.servers without a V1 sibling map.",
+ "Explains enabled/disabled, timeout, and OAuth field transforms when present.",
+ "Preserves server behavior and redaction policy without unsupported fields.",
+ "Uses no --yes or completion claim."
+ ]
+ }
+ ]
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/files/cursor-project-mcp.json b/skills/agent-skills-setup/agent-skills-setup/evals/files/cursor-project-mcp.json
new file mode 100644
index 000000000..c38e257e5
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/files/cursor-project-mcp.json
@@ -0,0 +1,26 @@
+{
+ "mcpServers": {
+ "local-search": {
+ "command": "npx",
+ "args": [
+ "-y",
+ "@acme/search-mcp"
+ ],
+ "env": {
+ "ACME_API_KEY": "${env:ACME_API_KEY}",
+ "LITERAL_TOKEN": "__test_placeholder_value__",
+ "LOG_LEVEL": "info"
+ }
+ },
+ "local-docs": {
+ "command": "node",
+ "args": [
+ "./scripts/docs-server.js"
+ ],
+ "env": {
+ "DOCS_AUTH_TOKEN": "${env:ACME_BEARER_TOKEN}",
+ "WORKSPACE_ID": "acme"
+ }
+ }
+ }
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-cline-source.md b/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-cline-source.md
new file mode 100644
index 000000000..406bb4c00
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-cline-source.md
@@ -0,0 +1,3 @@
+# TypeScript guardrails
+
+Validate external input before it reaches business logic.
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-ir-cursor.golden.mdc b/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-ir-cursor.golden.mdc
new file mode 100644
index 000000000..9bbe8db75
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-ir-cursor.golden.mdc
@@ -0,0 +1,8 @@
+---
+description: "TypeScript guardrails"
+globs: "src/**/*.ts,tests/**/*.ts"
+alwaysApply: false
+---
+# TypeScript guardrails
+
+Validate external input before it reaches business logic.
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-ir-source.mdc b/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-ir-source.mdc
new file mode 100644
index 000000000..9bbe8db75
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/files/instruction-ir-source.mdc
@@ -0,0 +1,8 @@
+---
+description: "TypeScript guardrails"
+globs: "src/**/*.ts,tests/**/*.ts"
+alwaysApply: false
+---
+# TypeScript guardrails
+
+Validate external input before it reaches business logic.
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/profile-contracts.json b/skills/agent-skills-setup/agent-skills-setup/evals/profile-contracts.json
new file mode 100644
index 000000000..3084b50d5
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/profile-contracts.json
@@ -0,0 +1,476 @@
+{
+ "fixture_classes": [
+ "minimal-valid",
+ "complete-valid",
+ "legacy-version",
+ "invalid",
+ "literal-secret",
+ "alias-conflict"
+ ],
+ "profiles": {
+ "amazon-q/ide": {
+ "instructions": [
+ "amazon-q-rule"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ]
+ },
+ "augment-code/cli-ide": {
+ "instructions": [
+ "augment-rule",
+ "plain-markdown"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "claude/code-cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "claude/desktop-code": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "cline/cli": {
+ "instructions": [
+ "cline-rule"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "cline/ide": {
+ "instructions": [
+ "cline-rule"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "cline/sdk": {
+ "instructions": [
+ "cline-rule"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "codex/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "continue/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "copilot/cli": {
+ "instructions": [
+ "copilot-instructions"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "copilot/visual-studio": {
+ "instructions": [
+ "copilot-instructions"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "copilot/vscode": {
+ "instructions": [
+ "copilot-instructions"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "crush/cli": {
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "cursor/ide": {
+ "instructions": [
+ "cursor-mdc"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "devin/terminal": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "factory-droid/cli": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "forge/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "gemini-cli/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "gemini-code-assist/jetbrains": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "gemini-code-assist/vscode": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "gitlab-duo/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "gitlab-duo/flows": {},
+ "gitlab-duo/jetbrains": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "gitlab-duo/vscode": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "hermes/cli": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "ibm-bob/ide": {
+ "instructions": [
+ "agents-md",
+ "plain-markdown"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "ibm-bob/shell": {
+ "instructions": [
+ "agents-md",
+ "plain-markdown"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "jetbrains/ai-assistant": {
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "jetbrains/junie": {
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "jules/cli": {
+ "instructions": [
+ "agents-md"
+ ]
+ },
+ "kiro/ide": {
+ "instructions": [
+ "kiro-steering"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "letta-code/agent-file": {},
+ "letta-code/desktop-cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "letta/cli": {
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "mistral-vibe/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "opencode/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "openhands/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "pi/cli": {
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "qoder/cli": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "qoder/cn-cli": {
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "qoder/cn-ide": {
+ "instructions": [
+ "qoder-rule"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "qoder/ide": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "qwen-code/cli": {
+ "agents": [
+ "qwen-agent"
+ ],
+ "commands": [
+ "qwen-command"
+ ],
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "mcp-plugins": [
+ "qwen-mcp-plugin"
+ ],
+ "plugins": [
+ "qwen-plugin"
+ ],
+ "review_context": [
+ "qwen-review-context"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "rovodev/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "sourcegraph-amp/cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "trae/cn-ide": {
+ "instructions": [
+ "trae-rule"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "trae/ide": {
+ "instructions": [
+ "trae-rule"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "warp/desktop": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "warp/oz-cli": {
+ "instructions": [
+ "agents-md"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "windsurf/ide": {
+ "instructions": [
+ "agents-md",
+ "plain-markdown",
+ "windsurf-rule"
+ ],
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "zed/ide": {
+ "instructions": [
+ "agents-md"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "zencoder/ide": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ },
+ "zenflow/ide": {
+ "mcp": [
+ "json:mcpServers"
+ ],
+ "skills": [
+ "agent-skill"
+ ]
+ }
+ },
+ "schema_version": 1
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/evals/trigger-evals.json b/skills/agent-skills-setup/agent-skills-setup/evals/trigger-evals.json
new file mode 100644
index 000000000..666e304de
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/evals/trigger-evals.json
@@ -0,0 +1,22 @@
+[
+ {"query": "We are moving this monorepo from Cursor to Claude Code. Preview only the project skills and coding rules under /work/acme; don't scan my home directory or touch files yet.", "should_trigger": true},
+ {"query": "i switched from windsurf to codex yesterday—can you carry over my user MCP servers but strip any literal tokens and show me the no-write command first?", "should_trigger": true},
+ {"query": "Convert ./fixtures/cursor-mcp.json into native OpenCode V2 for /tmp/atlas. I need the dry run and the separate approved apply command, with mcp.servers only.", "should_trigger": true},
+ {"query": "My Android team is standardizing on Gemini CLI. Move the reusable agent skills in this Android Studio Quail workspace into Gemini's native project location without merging duplicate aliases.", "should_trigger": true},
+ {"query": "We're opening an old VS Code solution in Visual Studio 2026. Transfer the repository's Copilot skills and .vscode/mcp.json safely, preserving unrelated target servers.", "should_trigger": true},
+ {"query": "firebase studio is shutting down and this existing workspace has .idx/airules.md; help me migrate those instructions to Antigravity, but leave .idx/dev.nix and API settings alone", "should_trigger": true},
+ {"query": "Can you move Claude Code project MCP from /srv/payments into Zed? First prove the preview writes nothing, then tell me exactly what approval is needed.", "should_trigger": true},
+ {"query": "I have the same deploy skill under .cursor/skills and .agents/skills after changing editors. Consolidate it into Codex for this repo with backups and explain which copy wins.", "should_trigger": true},
+ {"query": "Port the old Roo Code rules in ./legacy-app to Continue. Roo is archived, so call out anything that must be reconstructed instead of pretending the formats match.", "should_trigger": true},
+ {"query": "把 /tmp/demo 里 OpenCode 的 agent 配置迁到 Cursor,先 dry-run;skills、rules 和 prompts 可以迁,hooks 和 memory 不要碰。", "should_trigger": true},
+ {"query": "I'm writing a migration guide. What root key does Cursor use in mcp.json, and how does it differ from Visual Studio's file? No local changes.", "should_trigger": false},
+ {"query": "After moving from Cursor to VS Code, the same MCP server now times out after 30 seconds. Diagnose the connection and logs; don't migrate anything.", "should_trigger": false},
+ {"query": "Install the Playwright MCP server in Claude Code and authenticate it for this project.", "should_trigger": false},
+ {"query": "We're choosing between Cursor, Windsurf, and Visual Studio 2026. Compare current pricing, privacy controls, and C# support.", "should_trigger": false},
+ {"query": "Create a new Codex skill under .agents/skills that reviews SQL migrations and add three eval prompts for it.", "should_trigger": false},
+ {"query": "Where does VS Code store the active Profile's user MCP configuration on macOS? I only need the location and UI command.", "should_trigger": false},
+ {"query": "CI says opencode.json is invalid JSONC near line 18. Validate and fix that one file in place.", "should_trigger": false},
+ {"query": "Update README.md to say we completed the Cursor-to-Claude migration last quarter.", "should_trigger": false},
+ {"query": "Explain when my team should use prompts versus rules versus Agent Skills; include examples for Copilot and Claude.", "should_trigger": false},
+ {"query": "Copy my Cursor user rules from my work laptop profile to the same Cursor profile on a new laptop, byte-for-byte, as a backup.", "should_trigger": false}
+]
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/doc-freshness-checks.json b/skills/agent-skills-setup/agent-skills-setup/references/doc-freshness-checks.json
new file mode 100644
index 000000000..1480ca4d2
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/doc-freshness-checks.json
@@ -0,0 +1,146 @@
+{
+ "schema_version": 1,
+ "verified_at": "2026-08-15",
+ "checks": [
+ {
+ "id": "agent-skills-spec",
+ "url": "https://raw.githubusercontent.com/agentskills/agentskills/main/docs/specification.mdx",
+ "required_terms": [
+ "name",
+ "description",
+ "metadata"
+ ]
+ },
+ {
+ "id": "cline-config",
+ "url": "https://docs.cline.bot/getting-started/config",
+ "required_terms": [
+ "cline",
+ "configuration"
+ ]
+ },
+ {
+ "id": "forgecode-docs",
+ "url": "https://forgecode.dev/docs/",
+ "required_terms": [
+ "forge",
+ "agent"
+ ]
+ },
+ {
+ "id": "qoder-docs",
+ "url": "https://docs.qoder.com/",
+ "required_terms": [
+ "qoder"
+ ]
+ },
+ {
+ "id": "codex-docs",
+ "url": "https://learn.chatgpt.com/docs/llms.txt",
+ "required_terms": [
+ "codex"
+ ]
+ },
+ {
+ "id": "openhands-docs",
+ "url": "https://docs.openhands.dev/overview/introduction",
+ "required_terms": [
+ "openhands"
+ ]
+ },
+ {
+ "id": "amp-manual",
+ "url": "https://ampcode.com/manual",
+ "required_terms": [
+ "agent skills",
+ "mcp"
+ ]
+ },
+ {
+ "id": "monkeycode-readme",
+ "url": "https://raw.githubusercontent.com/chaitin/MonkeyCode/main/README.md",
+ "required_terms": [
+ "monkeycode",
+ "development platform"
+ ]
+ },
+ {
+ "id": "cursor-rules",
+ "url": "https://docs.cursor.com/context/rules",
+ "required_terms": [
+ "cursor",
+ "rule"
+ ]
+ },
+ {
+ "id": "claude-code-skills",
+ "url": "https://code.claude.com/docs/en/skills",
+ "required_terms": [
+ "skill"
+ ]
+ },
+ {
+ "id": "github-copilot-cli",
+ "url": "https://docs.github.com/en/copilot/how-tos/copilot-cli",
+ "required_terms": [
+ "copilot",
+ "cli"
+ ]
+ },
+ {
+ "id": "vscode-agent-skills",
+ "url": "https://code.visualstudio.com/docs/agent-customization/agent-skills",
+ "required_terms": [
+ "skill"
+ ]
+ },
+ {
+ "id": "gemini-cli-skills",
+ "url": "https://github.com/google-gemini/gemini-cli/blob/main/docs/skills.md",
+ "required_terms": [
+ "gemini",
+ "skill"
+ ]
+ },
+ {
+ "id": "kiro-steering",
+ "url": "https://kiro.dev/docs/steering",
+ "required_terms": [
+ "kiro",
+ "steering"
+ ]
+ },
+ {
+ "id": "rovodev-cli-skills",
+ "url": "https://support.atlassian.com/rovo/docs/use-agent-skills-in-rovo-dev-cli/",
+ "required_terms": [
+ "rovo",
+ "skill"
+ ]
+ },
+ {
+ "id": "ibm-bob-docs",
+ "url": "https://www.ibm.com/docs/en/bob",
+ "required_terms": [
+ "bob",
+ "agent"
+ ]
+ },
+ {
+ "id": "warp-drive-prompts",
+ "url": "https://docs.warp.dev/agents/prompts",
+ "required_terms": [
+ "warp",
+ "prompt"
+ ]
+ },
+ {
+ "id": "windsurf-rules",
+ "url": "https://docs.codeium.com/windsurf/rules",
+ "required_terms": [
+ "windsurf",
+ "rule"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ide-paths.json b/skills/agent-skills-setup/agent-skills-setup/references/ide-paths.json
new file mode 100644
index 000000000..60f110de3
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ide-paths.json
@@ -0,0 +1,370 @@
+{
+ "antigravity": {
+ "global_skills": "~/.gemini/config/skills",
+ "project_skills": ".agents/skills",
+ "rules": ".agents/rules",
+ "mcp": "~/.gemini/config/mcp_config.json",
+ "project_mcp": ".agents/mcp_config.json",
+ "config": ""
+ },
+ "claude": {
+ "global_skills": "~/.claude/skills",
+ "project_skills": ".claude/skills",
+ "rules": "CLAUDE.md",
+ "mcp": "~/.claude.json",
+ "project_mcp": ".mcp.json",
+ "project_config": ".claude/settings.json",
+ "config": "~/.claude/settings.json"
+ },
+ "codely": {
+ "global_skills": "~/.codely-cli/skills",
+ "project_skills": ".codely-cli/skills",
+ "rules": "CODELY.md",
+ "mcp": "~/.codely-cli/settings.json",
+ "project_mcp": ".codely-cli/settings.json",
+ "project_config": ".codely-cli/settings.json",
+ "config": "~/.codely-cli/settings.json"
+ },
+ "codex": {
+ "global_skills": "~/.agents/skills",
+ "project_skills": ".agents/skills",
+ "rules": "AGENTS.md",
+ "mcp": "~/.codex/config.toml",
+ "project_mcp": ".codex/config.toml",
+ "project_config": ".codex/config.toml",
+ "config": "~/.codex/config.toml"
+ },
+ "copilot": {
+ "global_skills": "~/.copilot/skills",
+ "project_skills": ".github/skills",
+ "rules": ".github/copilot-instructions.md",
+ "mcp": "~/.copilot/mcp-config.json",
+ "project_mcp": ".mcp.json",
+ "config": ""
+ },
+ "cursor": {
+ "global_skills": "~/.cursor/skills",
+ "project_skills": ".cursor/skills",
+ "rules": ".cursor/rules",
+ "mcp": "~/.cursor/mcp.json",
+ "project_mcp": ".cursor/mcp.json",
+ "config": ""
+ },
+ "windsurf": {
+ "global_skills": "~/.codeium/windsurf/skills",
+ "project_skills": ".windsurf/skills",
+ "rules": ".windsurf/rules",
+ "mcp": "~/.codeium/windsurf/mcp_config.json",
+ "config": ""
+ },
+ "jetbrains": {
+ "global_skills": "~/.junie/skills",
+ "project_skills": ".junie/skills",
+ "rules": ".junie/AGENTS.md",
+ "mcp": "~/.junie/mcp/mcp.json",
+ "project_mcp": ".junie/mcp/mcp.json",
+ "config": ""
+ },
+ "openclaw": {
+ "global_skills": "~/.openclaw/skills",
+ "project_skills": "skills",
+ "rules": "AGENTS.md",
+ "mcp": "~/.openclaw/openclaw.json",
+ "config": "~/.openclaw/openclaw.json"
+ },
+ "trae": {
+ "global_skills": "~/.trae/skills",
+ "project_skills": ".trae/skills",
+ "rules": ".trae/rules",
+ "mcp": "",
+ "project_mcp": ".trae/mcp.json",
+ "config": ""
+ },
+ "trae-cn": {
+ "global_skills": "~/.trae-cn/skills",
+ "project_skills": ".trae/skills",
+ "rules": ".trae/rules",
+ "mcp": "",
+ "project_mcp": ".trae/mcp.json",
+ "config": ""
+ },
+ "vscode": {
+ "global_skills": "~/.copilot/skills",
+ "project_skills": ".github/skills",
+ "rules": ".github/copilot-instructions.md",
+ "mcp": "",
+ "project_mcp": ".vscode/mcp.json",
+ "config": ""
+ },
+ "visual-studio": {
+ "global_skills": "~/.copilot/skills",
+ "project_skills": ".github/skills",
+ "rules": ".github/copilot-instructions.md",
+ "mcp": {
+ "darwin": "",
+ "linux": "",
+ "windows": "%USERPROFILE%\\.mcp.json"
+ },
+ "project_mcp": ".mcp.json",
+ "config": ""
+ },
+ "jetbrains-ai": {
+ "global_skills": "",
+ "project_skills": ".agents/skills",
+ "rules": "",
+ "mcp": "",
+ "project_mcp": "",
+ "config": ""
+ },
+ "firebase-studio": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": ".idx/airules.md",
+ "mcp": "",
+ "project_mcp": ".idx/mcp.json",
+ "config": ""
+ },
+ "android-studio": {
+ "global_skills": "~/.agents/skills",
+ "project_skills": ".agents/skills",
+ "rules": "AGENTS.md",
+ "mcp": "",
+ "project_mcp": "",
+ "config": ""
+ },
+ "zed": {
+ "global_skills": "~/.agents/skills",
+ "project_skills": ".agents/skills",
+ "rules": "AGENTS.md",
+ "mcp": "~/.config/zed/settings.json",
+ "project_mcp": ".zed/settings.json",
+ "config": ""
+ },
+ "neovim": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "config": "~/.config/nvim/init.lua"
+ },
+ "emacs": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "config": ""
+ },
+ "continue": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": ".continue/rules",
+ "mcp": "~/.continue/config.yaml",
+ "project_mcp": ".continue/mcpServers",
+ "config": "~/.continue/config.yaml"
+ },
+ "aider": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "CONVENTIONS.md",
+ "mcp": "",
+ "config": "~/.aider.conf.yml"
+ },
+ "roo-code": {
+ "global_skills": "~/.roo/skills",
+ "project_skills": ".roo/skills",
+ "rules": ".roorules",
+ "project_mcp": ".roo/mcp.json",
+ "mcp": "",
+ "config": ""
+ },
+ "cline": {
+ "project": "",
+ "global_skills": "~/.cline/skills",
+ "project_skills": ".cline/skills",
+ "rules": ".cline/rules",
+ "mcp": "~/.cline/data/settings/cline_mcp_settings.json",
+ "project_mcp": ".cline/mcp.json",
+ "config": ""
+ },
+ "amazon-q": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": ".amazonq/rules",
+ "mcp": "~/.aws/amazonq/default.json",
+ "project_mcp": ".amazonq/default.json",
+ "config": ""
+ },
+ "cody": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "config": ""
+ },
+ "codeium": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "config": ""
+ },
+ "tabnine": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": ".tabnine/guidelines",
+ "mcp": "~/.tabnine/mcp_servers.json",
+ "project_mcp": ".tabnine/mcp_servers.json",
+ "config": ""
+ },
+ "replit": {
+ "global_skills": "",
+ "project_skills": ".agents/skills",
+ "rules": "replit.md",
+ "mcp": "",
+ "project_config": ".replit",
+ "config": ""
+ },
+ "pearai": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "config": ""
+ },
+ "supermaven": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "config": ""
+ },
+ "pieces": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "",
+ "project_mcp": "",
+ "project_config": "",
+ "config": ""
+ },
+ "blackbox": {
+ "global_skills": "",
+ "project_skills": ".blackbox/skills",
+ "rules": "",
+ "mcp": "",
+ "config": ""
+ },
+ "gemini-cli": {
+ "global_skills": "~/.gemini/skills",
+ "project_skills": ".gemini/skills",
+ "rules": "GEMINI.md",
+ "mcp": "~/.gemini/settings.json",
+ "project_mcp": ".gemini/settings.json",
+ "project_config": ".gemini/settings.json",
+ "config": "~/.gemini/settings.json"
+ },
+ "goose-cli": {
+ "global_skills": "~/.agents/skills",
+ "project_skills": ".agents/skills",
+ "rules": ".goosehints",
+ "mcp": "~/.config/goose/config.yaml",
+ "config": "~/.config/goose/config.yaml"
+ },
+ "opencode": {
+ "global_skills": "~/.config/opencode/skills",
+ "project_skills": ".opencode/skills",
+ "rules": "AGENTS.md",
+ "mcp": "~/.config/opencode/opencode.json",
+ "project_mcp": "opencode.json",
+ "project_config": "opencode.json",
+ "config": "~/.config/opencode/opencode.json"
+ },
+ "kilocode": {
+ "project": ".kilo",
+ "global_skills": "~/.kilo/skills",
+ "project_skills": ".kilo/skills",
+ "rules": "AGENTS.md",
+ "mcp": "~/.config/kilo/kilo.jsonc",
+ "project_mcp": ".kilo/kilo.jsonc",
+ "project_config": ".kilo/kilo.jsonc",
+ "config": "~/.config/kilo/kilo.jsonc"
+ },
+ "kimiai": {
+ "global_skills": "~/.kimi-code/skills",
+ "project_skills": ".kimi-code/skills",
+ "rules": "AGENTS.md",
+ "mcp": "~/.kimi-code/mcp.json",
+ "project_mcp": ".kimi-code/mcp.json",
+ "config": "~/.kimi-code/config.toml"
+ },
+ "workbuddy": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": "~/.workbuddy/mcp.json",
+ "project_mcp": ".workbuddy/mcp.json",
+ "config": ""
+ },
+ "claude-desktop": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": "",
+ "mcp": {
+ "darwin": "~/Library/Application Support/Claude/claude_desktop_config.json",
+ "linux": "",
+ "windows": "%APPDATA%\\Claude\\claude_desktop_config.json"
+ },
+ "config": ""
+ },
+ "kiro": {
+ "global_skills": "~/.kiro/skills",
+ "project_skills": ".kiro/skills",
+ "rules": ".kiro/steering",
+ "mcp": "~/.kiro/settings/mcp.json",
+ "project_mcp": ".kiro/settings/mcp.json",
+ "config": ""
+ },
+ "augment-code": {
+ "global_skills": "~/.augment/skills",
+ "project_skills": ".augment/skills",
+ "rules": ".augment/rules",
+ "mcp": "~/.augment/settings.json",
+ "project_mcp": ".augment/settings.json",
+ "project_config": ".augment/settings.json",
+ "config": "~/.augment/settings.json"
+ },
+ "void-editor": {
+ "global_skills": "",
+ "project_skills": "",
+ "rules": ".voidrules",
+ "mcp": "~/.void-editor/mcp.json",
+ "project_mcp": ".vscode/mcp.json",
+ "config": ""
+ },
+ "baidu-comate": {
+ "global_skills": "~/.comate/skills",
+ "project_skills": ".comate/skills",
+ "rules": "",
+ "mcp": "~/.comate/mcp.json",
+ "project_mcp": ".comate/mcp.json",
+ "config": ""
+ },
+ "tencent-codebuddy": {
+ "global_skills": "~/.codebuddy/skills",
+ "project_skills": ".codebuddy/skills",
+ "rules": "CODEBUDDY.md",
+ "mcp": "~/.codebuddy/.mcp.json",
+ "project_mcp": ".mcp.json",
+ "project_config": ".codebuddy/settings.json",
+ "config": "~/.codebuddy/settings.json"
+ },
+ "zcode": {
+ "global_skills": "~/.zcode/skills",
+ "project_skills": "",
+ "rules": "AGENTS.md",
+ "mcp": "~/.zcode/cli/config.json",
+ "project_mcp": ".zcode/config.json",
+ "project_config": ".zcode/config.json",
+ "config": "~/.zcode/cli/config.json"
+ }
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ide-registry.md b/skills/agent-skills-setup/agent-skills-setup/references/ide-registry.md
new file mode 100644
index 000000000..84b83e9fb
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ide-registry.md
@@ -0,0 +1,116 @@
+# IDE Reference Index
+
+Read only the selected source and target entries. Each link records documented
+paths, supported migration surfaces, and manual boundaries; a few UI-only
+clients intentionally share one reference. `ide-paths.json` remains the
+legacy compatibility mapping. [Registry v2](registry-v2.json) is authoritative
+for product profiles, lifecycle, storage type, scope, migration policy, source,
+version range, and freshness.
+
+Registry support levels are evidence contracts, not marketing labels. No
+profile is currently `full`: reviewed automatic subsets are `partial`; disputed
+or undocumented products remain `manual`, `source-only`, `provider`, `legacy`,
+or `unverified`. Product templates cannot authorize a legacy write. Promotion
+requires current official sources, a versioned surface contract, an adapter,
+fixtures, secret/rollback coverage, and a fresh documentation check.
+
+## Lifecycle and target eligibility
+
+| Classification | Products | Default behavior |
+| --- | --- | --- |
+| Legacy/source-only | Roo Code, Void, Supermaven, Firebase Studio | Inventory and export only; never target. |
+| Brand alias | Codeium, Tongyi Lingma | Resolve to the named current profile; do not invent paths. |
+| Provider | Pieces | Configure the consuming MCP client. |
+| Editor host | Emacs, Neovim, Helix | Select a concrete plugin profile first. |
+| Cloud/UI | Devin, v0, Lovable, Bolt, TRAE Work, Cody | Use official API/UI or a rebuild checklist. |
+| Profiled local client | Cline, Amazon Q, Codex, ForgeCode, Augment, Windsurf, Qoder and the new CLI entries | Enforce per-surface policy and loss reporting. |
+
+## IDE references
+
+- [`claude-desktop`](ides/claude-desktop.md) — claude-desktop (Claude Desktop app)
+- [`codely`](ides/codely.md) — codely (Tuanjie Codely / Tuanjie Cowork; Unity 中国 AI Agent)
+- [`claude`](ides/claude.md) — claude (Claude Code)
+- [`cursor`](ides/cursor.md) — cursor
+- [`cline`](ides/cline.md) — cline
+- [`roo-code`](ides/roo-code.md) — roo-code (archived 2026-05)
+- [`vscode`](ides/vscode.md) — vscode (VS Code + GitHub Copilot IDE; not cloud agent or the `copilot` script target)
+- [`visual-studio`](ides/visual-studio.md) — visual-studio (Visual Studio 2026/2022 + GitHub Copilot; Windows only)
+- [`firebase-studio`](ides/firebase-studio.md) — firebase-studio (sunsetting 2027-03-22; existing-workspace rules source)
+- [`android-studio`](ides/android-studio.md) — android-studio (Gemini in Android Studio, Quail 1+)
+- [`copilot`](ides/copilot.md) — copilot-cli
+- [`windsurf`](ides/windsurf.md) — windsurf
+- [`codeium`](ides/codeium.md) — codeium (Codeium → Windsurf)
+- [`continue`](ides/continue.md) — continue
+- [`emacs`](ides/emacs.md) — emacs (GNU Emacs)
+- [`augment-code`](ides/augment-code.md) — augment-code
+- [`kilocode`](ides/kilocode.md) — kilocode
+- [`zed`](ides/zed.md) — zed
+- [`trae`](ides/trae.md) — trae
+- [`trae-work`](ides/trae-work.md) — trae-work (separate product; not a supported mapper target)
+- [`trae-cn`](ides/trae-cn.md) — trae-cn
+- [`jetbrains`](ides/jetbrains.md) — jetbrains (Junie in JetBrains IDEs; not JetBrains AI Assistant)
+- [`jetbrains-ai`](ides/jetbrains-ai.md) — jetbrains-ai (JetBrains AI Assistant; distinct from Junie)
+- [`kiro`](ides/kiro.md) — kiro
+- [`codex`](ides/codex.md) — codex
+- [`gemini-cli`](ides/gemini-cli.md) — gemini-cli
+- [`antigravity`](ides/antigravity.md) — antigravity (Antigravity IDE / shared 2.0 surface)
+- [`amazon-q`](ides/amazon-q.md) — amazon-q
+- [`opencode`](ides/opencode.md) — opencode
+- [`goose-cli`](ides/goose-cli.md) — goose-cli (Goose CLI)
+- [`openclaw`](ides/openclaw.md) — openclaw (OpenClaw)
+- [`aider`](ides/aider.md) — aider
+- [`openhands`](ides/openhands.md) — openhands
+- [`replit`](ides/replit.md) — replit (Replit AI)
+- [`sourcegraph-amp`](ides/sourcegraph-amp.md) — sourcegraph-amp
+- [`cody`](ides/cody.md) — sourcegraph-cody
+- [`forge`](ides/forge.md) — forge
+- [`pearai`](ides/pearai.md) — pearai
+- [`void-editor`](ides/void-editor.md) — void-editor
+- [`tabnine`](ides/tabnine.md) — tabnine
+- [`supermaven`](ides/supermaven.md) — supermaven
+- [`blackbox`](ides/blackbox.md) — blackbox (Blackbox AI)
+- [`pieces`](ides/pieces.md) — pieces (Pieces for Developers)
+- [`helix`](ides/helix.md) — helix
+- [`neovim`](ides/neovim.md) — neovim
+- [`mcphub-nvim`](ides/mcphub-nvim.md) — mcphub-nvim
+- [`codecompanion-nvim`](ides/codecompanion-nvim.md) — codecompanion-nvim
+- [`tongyi-lingma`](ides/tongyi-lingma.md) — tongyi-lingma (DEPRECATED — renamed to Qoder CN on 2026-05-20, see `qoder-cn`)
+- [`baidu-comate`](ides/baidu-comate.md) — baidu-comate
+- [`tencent-codebuddy`](ides/tencent-codebuddy.md) — tencent-codebuddy
+- [`kimiai`](ides/kimiai.md) — kimi-code (Moonshot AI)
+- [`workbuddy`](ides/workbuddy.md) — workbuddy (WorkBuddy)
+- [`zcode`](ides/zcode.md) — zcode (Zhipu AI)
+- [`minimax-code`](ides/minimax-code.md) — minimax-code (MiniMax)
+- [`mmx-cli`](ides/mmx-cli.md) — mmx-cli (MiniMax CLI)
+- [`qoder-cn`](ides/qoder-cn.md) — qoder-cn (Alibaba — formerly Tongyi Lingma, renamed 2026-05-20)
+- [`baidu-comate-ide`](ides/baidu-comate-ide.md) — baidu-comate-ide (Baidu — standalone IDE, distinct from plugin)
+- [`tencent-codebuddy-ide`](ides/tencent-codebuddy-ide.md) — tencent-codebuddy-ide (Tencent — standalone IDE, distinct from plugin)
+- [`iflycode`](ides/ui-only-mcp.md) — iflycode (iFlytek; shared UI-only reference)
+- [`raccoon-ai`](ides/ui-only-mcp.md) — raccoon-ai (SenseTime; shared UI-only reference)
+- [`monkeycode`](ides/monkeycode.md) — monkeycode (Chaitin Tech)
+- [`vecli`](ides/vecli.md) — vecli (Volcano Engine)
+- [`bolt-new`](ides/bolt-new.md) — bolt-new (StackBlitz)
+- [`qodo`](ides/qodo.md) — qodo (formerly CodiumAI)
+- [`devin`](ides/devin.md) — devin (Cognition)
+- [`v0`](ides/v0.md) — v0 (Vercel)
+- [`lovable`](ides/lovable.md) — lovable
+- [`xcode`](ides/xcode.md) — xcode (Xcode 26.3+/27 coding agents; manual configuration boundary)
+- [`gptel-mcp-el`](ides/gptel-mcp-el.md) — gptel-mcp-el (third-party Emacs packages)
+- [`qoder`](ides/qoder.md) — Qoder International CLI / IDE profiles
+- [`qwen-code`](ides/qwen-code.md) — Qwen Code
+- [`mistral-vibe`](ides/mistral-vibe.md) — Mistral Vibe Code
+- [`factory-droid`](ides/factory-droid.md) — Factory Droid
+- [`warp-oz`](ides/warp-oz.md) — Warp Oz local/cloud agent CLI
+- [`pi`](ides/pi.md) — Pi coding agent
+- [`crush`](ides/crush.md) — Crush terminal coding agent
+- [`gemini-code-assist`](ides/gemini-code-assist.md) — Gemini Code Assist
+- [`gitlab-duo`](ides/gitlab-duo.md) — GitLab Duo Agent Platform
+- [`hermes`](ides/hermes.md) — Hermes Agent
+- [`ibm-bob`](ides/ibm-bob.md) — IBM Bob
+- [`jules`](ides/jules.md) — Google Jules
+- [`letta`](ides/letta.md) — Letta
+- [`letta-code`](ides/letta-code.md) — Letta Code
+- [`rovodev`](ides/rovodev.md) — Atlassian Rovo Dev
+- [`warp`](ides/warp.md) — Warp
+- [`zencoder`](ides/zencoder.md) — Zencoder
+- [`zenflow`](ides/zenflow.md) — Zenflow
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/aider.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/aider.md
new file mode 100644
index 000000000..842db1595
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/aider.md
@@ -0,0 +1,20 @@
+# aider
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | `CONVENTIONS.md` |
+| MCP | Not mapped |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | `~/.aider.conf.yml` |
+
+
+- Aider config is YAML and layered; an explicit `--config` can select another file. It is diagnostic/manual, never a conversion target.
+- `CONVENTIONS.md` is read-only context (`--read` or YAML `read:`).
+- `.env`, `AIDER_*`, CLI flags, `/load`, prompts, Skills, and MCP lack a portable generic migration contract. Never copy credentials or rewrite another IDE's config into Aider YAML.
+
+Sources: [configuration](https://aider.chat/docs/config.html), [YAML config](https://aider.chat/docs/config/aider_conf.html), [conventions](https://aider.chat/docs/usage/conventions.html).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/amazon-q.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/amazon-q.md
new file mode 100644
index 000000000..2f6304f62
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/amazon-q.md
@@ -0,0 +1,21 @@
+# amazon-q
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | `.amazonq/rules` |
+| MCP | `~/.aws/amazonq/default.json` |
+| Project MCP | `.amazonq/default.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Resolve a profile before acting. Q in the IDE documents user `~/.aws/amazonq/default.json`, project `.amazonq/default.json`, and legacy `mcp.json` compatibility. `~/.aws/amazonq/agents/` belongs to custom-agent definitions and is not an alternative IDE MCP destination.
+- Q CLI and custom agents have their own agent/profile directories. Their prompts, tools, permissions, hooks, and MCP state are not interchangeable with the narrow IDE `mcpServers` subobject.
+- `.amazonq/` and `~/.aws/amazonq/` are mixed namespaces. Only the selected profile's explicit surface may be read or written; never flatten the whole tree.
+- The v2 profiles are `amazon-q/ide`, `amazon-q/cli`, and `amazon-q/custom-agent`.
+
+Sources: [IDE MCP](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/mcp-ide.html), [project rules](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/context-project-rules.html), [MCP scopes](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/qdev-mcp.html).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/android-studio.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/android-studio.md
new file mode 100644
index 000000000..69a6c99c8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/android-studio.md
@@ -0,0 +1,20 @@
+# android-studio (Gemini in Android Studio)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.agents/skills` |
+| Project skills | `.agents/skills` |
+| Rules | `AGENTS.md` |
+| MCP | Not mapped |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Agent Skills require Android Studio Quail 1+. Project and personal skills support `.agents/skills/` and `.android-studio/skills/`; the mapper chooses portable `.agents/skills/`. Legacy `.skills/` and `agent/skills/` are deprecated migration sources and remain manual.
+- Agent files use hierarchical `AGENTS.md`; `GEMINI.md` takes precedence in the same directory. IDE-native rules in `.idea/project.prompts.xml` are not portable and remain manual.
+- MCP is configured through **Settings → Tools → AI → MCP Servers** and stored in a product/version-managed `mcp.json` with `mcpServers`. Do not guess its path or copy UI trust state. Current support excludes stdio, MCP resources, and MCP prompt templates.
+
+Sources: [Skills](https://developer.android.com/studio/gemini/skills), [agent files](https://developer.android.com/studio/gemini/agent-files), [MCP](https://developer.android.com/studio/gemini/add-mcp-server).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/antigravity.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/antigravity.md
new file mode 100644
index 000000000..3e76bb74f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/antigravity.md
@@ -0,0 +1,26 @@
+# antigravity (Antigravity IDE / shared 2.0 surface)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.gemini/config/skills` |
+| Project skills | `.agents/skills` |
+| Rules | `.agents/rules` |
+| MCP | `~/.gemini/config/mcp_config.json` |
+| Project MCP | `.agents/mcp_config.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+
+**Registry status:** `unverified/manual-reference`. These paths are discovery
+evidence only; Antigravity is not an automatic source or target until its
+IDE/CLI and version-specific schemas have independent adapters and fixtures.
+
+- MCP uses JSON `mcpServers`; remote endpoints use `serverUrl`, not `url`. The global file is shared by Antigravity surfaces; workspace MCP remains manual.
+- Global Skills default to the generated path. `ANTIGRAVITY_SKILLS_DIR` overrides it; otherwise preserve a legacy-only tree and never merge legacy/current trees implicitly. `.agent/` remains legacy compatibility.
+- Workspace rules use `.agents/rules/`; do not invent `.agents/AGENTS.md`. No official installation-detection or stable workflow path exists.
+- Hooks use `.agents/hooks.json` and `~/.gemini/config/hooks.json`; plugins use `.agents/plugins/` and `~/.gemini/config/plugins/`. They are supported but schema/trust-sensitive, so reconstruct manually. Workflows remain UI-managed. Antigravity CLI is separate.
+
+Sources: [IDE Skills](https://antigravity.google/docs/ide/skills), [shared Skills](https://antigravity.google/docs/skills?app=antigravity-ide), [MCP](https://antigravity.google/docs/mcp), [plugins](https://antigravity.google/docs/ide/plugins), [hooks](https://antigravity.google/docs/hooks).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/augment-code.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/augment-code.md
new file mode 100644
index 000000000..d56109bb4
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/augment-code.md
@@ -0,0 +1,20 @@
+# augment-code
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.augment/skills` |
+| Project skills | `.augment/skills` |
+| Rules | `.augment/rules` |
+| MCP | `~/.augment/settings.json` |
+| Project MCP | `.augment/settings.json` |
+| Project config | `.augment/settings.json` |
+| Config | `~/.augment/settings.json` |
+
+
+- MCP JSON uses `mcpServers`; retain explicit `http`/legacy `sse`, never infer transport from URL.
+- Rules are `~/.augment/rules/` and `.augment/rules/`; user guidelines also use `~/.augment/user-guidelines.md`. Preserve activation frontmatter through the instruction IR.
+- Commands and plugins are separate state. Project `.augment/settings.json` and local `.augment/settings.local.json` are independent surfaces; `--scope project` never selects the local override, and `--scope local` never rewrites the shareable project file. Merge only the selected MCP subobject.
+
+Sources: [Skills](https://docs.augmentcode.com/jetbrains/using-augment/skills), [Rules](https://docs.augmentcode.com/cli/rules), [MCP/settings](https://docs.augmentcode.com/cli/config).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/baidu-comate-ide.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/baidu-comate-ide.md
new file mode 100644
index 000000000..88a48fd7b
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/baidu-comate-ide.md
@@ -0,0 +1,6 @@
+# baidu-comate-ide (standalone IDE)
+
+**Registry status:** `unverified/manual-reference`; it is not an automatic
+source or target. MCP is UI-managed; rules, custom agents, commands, memory,
+Spec/Mission, and user state require a versioned official profile. This
+standalone IDE is distinct from the Comate plugin; do not reuse plugin paths.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/baidu-comate.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/baidu-comate.md
new file mode 100644
index 000000000..04c369ad8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/baidu-comate.md
@@ -0,0 +1,24 @@
+# baidu-comate
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.comate/skills` |
+| Project skills | `.comate/skills` |
+| Rules | Not mapped |
+| MCP | `~/.comate/mcp.json` |
+| Project MCP | `.comate/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+**Registry status:** `unverified/manual-reference`; the generated paths are
+read-only discovery hints until plugin/IDE versions, all context surfaces, and
+adapters have profile fixtures.
+
+- MCP JSON uses `mcpServers` with explicit `stdio`, legacy `sse`, or `streamableHttp`; never infer transport from a URL.
+- Rules use Comate-specific `.mdr`; Skills may use `.comate/skills/` or `.agents/skills/`.
+- Agents and local three-tier configuration require manual review.
+
+Sources: [Skills](https://cloud.baidu.com/doc/COMATE/s/Nmma28iqe), [MCP](https://cloud.baidu.com/doc/COMATE/s/Ymir0x2ye).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/blackbox.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/blackbox.md
new file mode 100644
index 000000000..4676e051f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/blackbox.md
@@ -0,0 +1,20 @@
+# blackbox (Blackbox AI)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | `.blackbox/skills` |
+| Rules | Not mapped |
+| MCP | Not mapped |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- This mapper covers Blackbox CLI project Skills only. The documented project path is diagnostic/manual because generic Skills migration has no project-scope selector.
+- No portable global Skills, rules, prompt, MCP, or config path/schema is published. Do not infer `~/.blackbox`, `.blackbox/mcp.json`, or a whole `.blackbox` transfer.
+- `/skill` and `blackbox mcp` are commands, not portable file contracts; `configure` is interactive.
+
+Sources: [Skills](https://docs.blackbox.ai/features/blackbox-cli/skills), [commands](https://docs.blackbox.ai/features/blackbox-cli/commands-reference), [CLI](https://docs.blackbox.ai/features/blackbox-cli/getting-started).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/bolt-new.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/bolt-new.md
new file mode 100644
index 000000000..a0531d3d4
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/bolt-new.md
@@ -0,0 +1,3 @@
+# bolt-new
+
+Bolt uses JSON `servers` (not `mcpServers`) and UI/plugin-managed MCP state. Remote auth and imports need manual review; do not copy foreign server maps unchanged.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/claude-desktop.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/claude-desktop.md
new file mode 100644
index 000000000..3c5088654
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/claude-desktop.md
@@ -0,0 +1,21 @@
+# claude-desktop (Claude Desktop app)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | Not mapped |
+| MCP | darwin: `~/Library/Application Support/Claude/claude_desktop_config.json`
windows: `%APPDATA%\Claude\claude_desktop_config.json` |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- The mapper supports legacy local `claude_desktop_config.json` on macOS and native Windows with JSON `mcpServers`; it never guesses Linux or virtualized Windows paths. Legacy `sse` stays legacy, not Streamable HTTP.
+- Modern local MCP uses **Settings → Extensions → Advanced settings → Install Extension** for `.mcpb`; do not unpack it into a guessed directory. [Local MCP servers](https://support.claude.com/en/articles/10949351-getting-started-with-local-mcp-servers-on-claude-desktop) and [MCPB](https://claude.com/docs/connectors/building/mcpb) define that flow.
+- Remote MCP uses **Customize → Connectors → Add custom connector**; re-authorize and use any server-owner replacement endpoint. See [remote connectors](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp).
+- Chat/Desktop Skills and Plugins are installed through **Customize** and have no portable mapper path. The Code tab uses Claude Code's own skills, settings, and MCP paths; keep those separate from Chat MCP. Claude Code import is interactive: `claude mcp add-from-claude-desktop`.
+
+Sources: [Skills](https://support.claude.com/en/articles/12512180-use-skills-in-claude), [Customize directory](https://support.claude.com/en/articles/14328846-browse-skills-connectors-and-plugins-in-one-directory), [Code tab](https://code.claude.com/docs/en/desktop), [MCP protocol](https://modelcontextprotocol.io/docs/develop/connect-local-servers).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/claude.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/claude.md
new file mode 100644
index 000000000..8114acf46
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/claude.md
@@ -0,0 +1,21 @@
+# claude (Claude Code)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.claude/skills` |
+| Project skills | `.claude/skills` |
+| Rules | `CLAUDE.md` |
+| MCP | `~/.claude.json` |
+| Project MCP | `.mcp.json` |
+| Project config | `.claude/settings.json` |
+| Config | `~/.claude/settings.json` |
+
+
+- Settings include project `.claude/settings.json` and local `.claude/settings.local.json`; local scopes are manual.
+- User/local MCP is `~/.claude.json`; shared project MCP is `.mcp.json`, both with `mcpServers`. The mapper handles user MCP and reports project scope for review.
+- Rules include `CLAUDE.md`, `.claude/CLAUDE.md`, `.claude/rules/`, and local `CLAUDE.local.md`. Project/user Skills are standard directories.
+- `.claude/commands/*.md` is **legacy compatibility**; prefer Skills. Agents and hooks are schema-bound and manual. Do not auto-migrate auto memory from `~/.claude/projects/.../memory/`.
+
+Sources: [settings](https://code.claude.com/docs/en/settings), [MCP](https://code.claude.com/docs/en/mcp), [memory](https://code.claude.com/docs/en/memory), [Skills](https://code.claude.com/docs/en/slash-commands), [subagents](https://code.claude.com/docs/en/sub-agents).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/cline.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/cline.md
new file mode 100644
index 000000000..1d6e5cb91
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/cline.md
@@ -0,0 +1,21 @@
+# cline
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.cline/skills` |
+| Project skills | `.cline/skills` |
+| Rules | `.cline/rules` |
+| MCP | `~/.cline/data/settings/cline_mcp_settings.json` |
+| Project MCP | `.cline/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Cline now uses one application data root for IDE, CLI, and SDK profiles. User MCP is `~/.cline/data/settings/cline_mcp_settings.json`; `CLINE_DATA_DIR` replaces `~/.cline/data`, so resolve `settings/cline_mcp_settings.json` beneath it. Do not infer a VS Code `globalStorage` path.
+- User rules, hooks, Skills, agents, plugins, and cron live directly under `~/.cline/`; user workflows live under `~/.cline/data/workflows/`. Project counterparts live under `.cline/`. Treat each as a separate semantic surface.
+- Skills use `.cline/skills/` and `~/.cline/skills/`. Project instructions use `.cline/rules/`, with legacy `.clinerules` as an alternative; user rules use `~/.cline/rules/`, with `~/Documents/Cline/Rules/` as a compatibility location. If both alternatives exist, require explicit source selection instead of merging them.
+- Provider settings, teams, sessions, databases, and generated runtime state are private. Never copy the whole data root or credentials.
+
+Sources: [unified configuration and `CLINE_DATA_DIR`](https://docs.cline.bot/getting-started/config), [rules](https://docs.cline.bot/customization/cline-rules).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/codecompanion-nvim.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/codecompanion-nvim.md
new file mode 100644
index 000000000..1bdcdb53e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/codecompanion-nvim.md
@@ -0,0 +1,3 @@
+# codecompanion-nvim
+
+CodeCompanion uses Lua MCP config, configurable instruction files, prompt-library tables, and Lua hooks. Treat it as a plugin-specific manual migration surface.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/codeium.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/codeium.md
new file mode 100644
index 000000000..5fe6ef52b
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/codeium.md
@@ -0,0 +1,10 @@
+# codeium (Codeium → Windsurf)
+
+
+
+All automatic paths are unsupported.
+
+
+Codeium is a legacy token retained to fail closed. No standalone Skills, MCP, or portable config contract is documented; do not treat shared `~/.codeium/` state as a Codeium install or copy it wholesale. Use the [Windsurf](windsurf.md) reference for the current product.
+
+Sources: [Windsurf plugins](https://docs.windsurf.com/plugins/getting-started), [Skills](https://docs.windsurf.com/windsurf/cascade/skills).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/codely.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/codely.md
new file mode 100644
index 000000000..76e97f8be
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/codely.md
@@ -0,0 +1,41 @@
+# codely
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.codely-cli/skills` |
+| Project skills | `.codely-cli/skills` |
+| Rules | `CODELY.md` |
+| MCP | `~/.codely-cli/settings.json` |
+| Project MCP | `.codely-cli/settings.json` |
+| Project config | `.codely-cli/settings.json` |
+| Config | `~/.codely-cli/settings.json` |
+
+
+
+## Status
+
+Codely / Tuanjie Cowork is an active Unity China product family, but the public
+material and observed local layouts do not establish one versioned contract
+shared by the CLI, Cowork app, engine integration, and IDE extensions. In
+particular, the repository has no reviewed Codely target adapter that validates
+the complete MCP transport and settings schema.
+
+The paths above are retained only for read-only discovery of an existing
+installation. Registry v2 classifies this entry as `unverified` and
+`manual-reference`:
+
+- do not use Codely as an automatic source or target;
+- do not pass MCP objects through verbatim;
+- do not copy `settings.json`, `CODELY.md`, generated memories, Context/RAG
+ indexes, Unity Insight state, agents, extensions, hooks, or LSP state;
+- review the active product/version and reconstruct approved content manually;
+- bind credentials after reconstruction through the product's supported secret
+ or environment mechanism.
+
+Moving Codely to `partial` requires an official, versioned schema; separate
+profiles for each product surface; source and target adapters; native parser or
+CLI verification; and golden fixtures for every automated surface.
+
+Sources: [Tuanjie Codely overview](https://developer.unity.cn/projects/6a7189bcedbc2a120fe6d4af), [Tuanjie Cowork](https://codely.tuanjie.cn/download), [AI environment setup](https://codely-docs.tuanjie.cn/learn/ai-programming-environment-setup-guide).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/codex.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/codex.md
new file mode 100644
index 000000000..da27c140e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/codex.md
@@ -0,0 +1,22 @@
+# codex
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.agents/skills` |
+| Project skills | `.agents/skills` |
+| Rules | `AGENTS.md` |
+| MCP | `~/.codex/config.toml` |
+| Project MCP | `.codex/config.toml` |
+| Project config | `.codex/config.toml` |
+| Config | `~/.codex/config.toml` |
+
+
+- MCP/config is TOML `mcp_servers`; project config requires trust. JSON `mcpServers` is never converted automatically—rebuild and validate `[mcp_servers.]` manually.
+- Codex supports stdio and Streamable HTTP; do not map legacy SSE or add protocol/session headers. Recheck authorization with `codex mcp list`.
+- Instructions are a hierarchy, not one `rules` file. User scope chooses `~/.codex/AGENTS.override.md` before `~/.codex/AGENTS.md`; project discovery walks from repository root toward the working directory and chooses `AGENTS.override.md` before `AGENTS.md` at each level. Automatic targets use the ordinary `AGENTS.md` location. If both files already exist at one selected scope, planning stops because composing precedence content requires review.
+- `.codex/rules/*.rules`, `.codex/agents/*.toml`, hooks, generated memories, layered config, and trust/managed policy are different objects. Rules/agents need native templates, hooks may only be emitted disabled, generated memory must be regenerated, and trust is never migrated.
+- `AGENTS.md` and documented `.agents/skills` paths are portable after validation; admin skills may also live under `/etc/codex/skills`. `[[skills.config]]`, plugin bundles, and `agents/openai.yaml` remain separate policy/UI surfaces.
+
+Sources: [config](https://learn.chatgpt.com/docs/config-file/config-basic.md), [AGENTS hierarchy](https://learn.chatgpt.com/docs/agent-configuration/agents-md.md), [Skills](https://developers.openai.com/codex/skills).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/cody.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/cody.md
new file mode 100644
index 000000000..ba35bf1c5
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/cody.md
@@ -0,0 +1,10 @@
+# sourcegraph-cody
+
+
+
+All automatic paths are unsupported.
+
+
+Cody is currently an Enterprise extension/UI surface; all automatic paths are unsupported. MCP is editor settings/UI and Enterprise-feature-gated, prompts belong to the Prompt Library, and no portable Skills, rules, config, or project file is established. Do not infer `.cody`, `.codyrules`, `~/.config/cody/`, or `.vscode/cody.json`.
+
+Sourcegraph MCP Server is a separate server configured by its client, not Cody local state. Sources: [Cody](https://sourcegraph.com/docs/cody), [MCP](https://sourcegraph.com/docs/cody/capabilities/agentic-context-fetching), [prompts](https://sourcegraph.com/docs/cody/capabilities/prompts).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/continue.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/continue.md
new file mode 100644
index 000000000..f09468797
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/continue.md
@@ -0,0 +1,20 @@
+# continue
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | `.continue/rules` |
+| MCP | `~/.continue/config.yaml` |
+| Project MCP | `.continue/mcpServers` |
+| Project config | Not mapped |
+| Config | `~/.continue/config.yaml` |
+
+
+- Continue uses YAML: `config.yaml` and project block directories are not generic JSON config. `mcpServers` is an array, not a server object map.
+- Project rules and prompts use Markdown/YAML frontmatter; no `CONTINUE.md` or Agent Skills directory is documented.
+- Config, MCP, rules, and the mixed `.continue/` namespace are diagnostic/manual. Do not convert JSON into YAML or copy the tree.
+
+Sources: [configuration](https://docs.continue.dev/customize/deep-dives/configuration), [MCP](https://docs.continue.dev/customize/deep-dives/mcp), [rules](https://docs.continue.dev/customize/deep-dives/rules), [prompts](https://docs.continue.dev/customize/prompts).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/copilot.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/copilot.md
new file mode 100644
index 000000000..396c96481
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/copilot.md
@@ -0,0 +1,20 @@
+# copilot-cli
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.copilot/skills` |
+| Project skills | `.github/skills` |
+| Rules | `.github/copilot-instructions.md` |
+| MCP | `~/.copilot/mcp-config.json` |
+| Project MCP | `.mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- `copilot` means GitHub Copilot CLI, not VS Code. Global MCP and project `.mcp.json`/`.github/mcp.json` use `mcpServers`; project files remain manual.
+- Keep explicit local/stdio/http/legacy-SSE transport and required tools; never copy VS Code `.vscode/mcp.json` (`servers`) unchanged or guess between CLI project files.
+- Rules and Skills use documented GitHub/agent files. IDE prompt files are unsupported; agents, hooks, plugins, and managed state need manual review.
+
+Sources: [Copilot CLI](https://docs.github.com/en/copilot/how-tos/copilot-cli), [MCP](https://docs.github.com/en/copilot/customizing-copilot/extending-copilot-chat-with-mcp), [custom instructions](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/crush.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/crush.md
new file mode 100644
index 000000000..2c1fb5164
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/crush.md
@@ -0,0 +1,7 @@
+# crush
+
+Crush loads project config in precedence order from `.crush.json` and `crush.json`, then user `~/.config/crush/crush.json`, with environment overrides for global config/data. These project and user MCP subobjects are inventoried separately. It discovers Skills in canonical Crush, common Agent Skills, Claude, and Cursor locations.
+
+Use `~/.config/crush/skills` and `.crush/skills` as canonical write targets. Treat the MCP subobject as manual: Crush requires its own typed server schema and performs shell expansion, so a generic JSON emitter cannot preserve its runtime semantics safely. `$HOME/.local/share/crush` and `CRUSH_GLOBAL_DATA` identify generated application state and are never migration sources.
+
+Source: [Crush repository and configuration](https://github.com/charmbracelet/crush).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/cursor.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/cursor.md
new file mode 100644
index 000000000..73b65c835
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/cursor.md
@@ -0,0 +1,21 @@
+# cursor
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.cursor/skills` |
+| Project skills | `.cursor/skills` |
+| Rules | `.cursor/rules` |
+| MCP | `~/.cursor/mcp.json` |
+| Project MCP | `.cursor/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- MCP JSON uses `mcpServers`; retain an explicit documented stdio, legacy-SSE, or Streamable HTTP transport. A bare URL is not enough, and `${env:NAME}` is Cursor-specific.
+- `.cursor/rules/*.mdc` uses frontmatter; root `.cursorrules` is legacy and `AGENTS.md` is also recognized. `.agents/skills/` is a supported compatibility path, not the mapper's canonical target.
+- `.cursor/commands/*.md`, `.cursor/hooks.json`, user hooks, and plugins are supported product surfaces but remain manual because their schemas and trust state are not generic migration objects. Memories and `.cursorignore` are also manual.
+- No stable installation-detection path is used by this mapper.
+
+Sources: [Skills](https://cursor.com/docs/context/skills), [rules](https://cursor.com/docs/rules), [hooks](https://cursor.com/docs/hooks), [plugins](https://cursor.com/docs/reference/plugins), [MCP](https://cursor.com/docs/context/mcp).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/devin.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/devin.md
new file mode 100644
index 000000000..60b05bad8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/devin.md
@@ -0,0 +1,3 @@
+# devin (Cognition)
+
+Devin is cloud-configured. Its MCP marketplace/server and wiki are UI/service state, not a local migration target; guide manual dashboard setup.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/emacs.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/emacs.md
new file mode 100644
index 000000000..01c47c3af
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/emacs.md
@@ -0,0 +1,10 @@
+# emacs (GNU Emacs)
+
+
+
+All automatic paths are unsupported.
+
+
+Native Emacs exposes no AI Skills, rules, MCP, or project-config mapping. Init files and `.dir-locals.el` are user-selected Emacs Lisp, not automatic migration targets. Package-specific AI/MCP integrations are separate products.
+
+Sources: [init files](https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html), [directory locals](https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/factory-droid.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/factory-droid.md
new file mode 100644
index 000000000..fcf681046
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/factory-droid.md
@@ -0,0 +1,7 @@
+# factory-droid
+
+Factory Droid uses `.factory/skills/` and `~/.factory/skills/`, project `AGENTS.md` and user `~/.factory/AGENTS.md`, `.factory/mcp.json` and `~/.factory/mcp.json`, and custom droids under `.factory/droids/` or `~/.factory/droids/`. Hooks are separate user, project, and local subobjects in `~/.factory/settings.json`, `.factory/settings.json`, and `.factory/settings.local.json`.
+
+Skills and reviewed MCP server maps are portable. Custom droids require a manual agent template; hooks can only be generated disabled and must never be activated by migration.
+
+Sources: [MCP](https://docs.factory.ai/cli/configuration/mcp), [hooks](https://docs.factory.ai/reference/hooks-reference), [custom droids](https://docs.factory.ai/cli/configuration/custom-droids).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/firebase-studio.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/firebase-studio.md
new file mode 100644
index 000000000..774e0d13c
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/firebase-studio.md
@@ -0,0 +1,22 @@
+# firebase-studio
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | `.idx/airules.md` |
+| MCP | Not mapped |
+| Project MCP | `.idx/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Firebase Studio stopped accepting new users and workspaces on 2026-06-22 and is scheduled to shut down on 2027-03-22. Use this ID only to migrate rules out of an existing workspace; prefer Google AI Studio or Antigravity for new work.
+- Gemini prioritizes `.idx/airules.md`, then `GEMINI.md`, `.gemini/styleguide.md`, `AGENTS.md`, and `cursorrules`. The mapper uses only the canonical `.idx/airules.md` file and does not flatten the fallbacks.
+- Existing workspaces have project MCP at `.idx/mcp.json` under the `mcpServers` root. It supports stdio and remote HTTP transports, headers, env, and environment-variable references. It is a source-only surface because Firebase Studio is sunsetting.
+- No stable Firebase Studio Agent Skills, prompts, or commands surface is documented. Do not infer Gemini CLI or VS Code paths.
+- Workspace provisioning in `.idx/dev.nix`, Gemini API keys, models, chat state, and user settings are configuration/runtime state and remain manual.
+
+Sources: [lifecycle](https://firebase.google.com/docs/studio/get-started), [MCP](https://firebase.google.com/docs/studio/mcp-servers), [Gemini workspace configuration](https://firebase.google.com/docs/studio/set-up-gemini).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/forge.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/forge.md
new file mode 100644
index 000000000..98f539a1a
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/forge.md
@@ -0,0 +1,10 @@
+# forge (ForgeCode)
+
+This ID is ForgeCode, not an unrelated product named Forge.
+
+- Project config is `.forge.toml`; user config is `~/.forge/.forge.toml`.
+- MCP uses `.mcp.json` with `mcpServers` and a native `forge mcp import` flow.
+- Skills resolve in precedence order from `.forge/skills/`, `~/.agents/skills/`, `~/forge/skills/`, then built-ins.
+- `AGENTS.md`, commands, agents, and permissions are distinct surfaces. Skills can be copied after validation; instructions use IR; agents and permissions require manual templates.
+
+Sources: [Skills](https://forgecode.dev/docs/skills/), [MCP](https://forgecode.dev/docs/mcp-integration/), [configuration](https://forgecode.dev/docs/forgecode-config/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/gemini-cli.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/gemini-cli.md
new file mode 100644
index 000000000..942d9fe80
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/gemini-cli.md
@@ -0,0 +1,21 @@
+# gemini-cli
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.gemini/skills` |
+| Project skills | `.gemini/skills` |
+| Rules | `GEMINI.md` |
+| MCP | `~/.gemini/settings.json` |
+| Project MCP | `.gemini/settings.json` |
+| Project config | `.gemini/settings.json` |
+| Config | `~/.gemini/settings.json` |
+
+
+- User settings are the only automatic MCP/config source. Project settings and project MCP are diagnostic/manual; never copy the whole `.gemini` namespace.
+- MCP JSON uses `mcpServers`; servers need `command`, legacy SSE `url`, or Streamable HTTP `httpUrl`. Never relabel `url` and `httpUrl`; aliases containing `_` require manual renaming and policy review.
+- `GEMINI.md` supports project/ancestor context and configurable filenames. Commands use user/project `.gemini/commands/*.toml`; subagents use `.gemini/agents/*.md`. Both remain manual because their formats are not generic prompts or rules.
+- `.agents/skills/` is a supported higher-precedence alias within the same scope; the mapper uses canonical Gemini paths and never merges aliases implicitly.
+
+Sources: [configuration](https://geminicli.com/docs/reference/configuration), [MCP](https://geminicli.com/docs/tools/mcp-server/), [Skills](https://geminicli.com/docs/cli/using-agent-skills/), [commands](https://geminicli.com/docs/cli/custom-commands/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/gemini-code-assist.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/gemini-code-assist.md
new file mode 100644
index 000000000..eb94cc6fe
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/gemini-code-assist.md
@@ -0,0 +1,5 @@
+# gemini-code-assist
+
+Gemini Code Assist supports VS Code and JetBrains IDE extensions with user and project settings, custom prompts, and MCP integrations. User skills and project context use standard paths. UI-managed Prompt Library is distinct from Gemini CLI commands.
+
+Sources: [docs](https://cloud.google.com/gemini-code-assist/docs).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/gitlab-duo.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/gitlab-duo.md
new file mode 100644
index 000000000..efa2a930d
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/gitlab-duo.md
@@ -0,0 +1,5 @@
+# gitlab-duo
+
+GitLab Duo Agent Platform provides VS Code, JetBrains, CLI, Web, and Flow surfaces. User-level AGENTS are located at `~/.gitlab/duo/AGENTS.md` (Linux/macOS) or `%APPDATA%\GitLab\duo\AGENTS.md` (Windows). Project and subdirectory AGENTS hierarchy is respected.
+
+Sources: [docs](https://docs.gitlab.com/ee/user/duo_agent_platform/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/goose-cli.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/goose-cli.md
new file mode 100644
index 000000000..3740c15c4
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/goose-cli.md
@@ -0,0 +1,21 @@
+# goose-cli (Goose CLI)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.agents/skills` |
+| Project skills | `.agents/skills` |
+| Rules | `.goosehints` |
+| MCP | `~/.config/goose/config.yaml` |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | `~/.config/goose/config.yaml` |
+
+
+- `config.yaml` is YAML `extensions`, not JSON MCP; `sse` is legacy and must not be relabeled as `streamable_http`. MCP/config/project/prompt migration is manual.
+- Dedicated Skills and local `.goosehints` are low-risk. Other context names can be selected with `CONTEXT_FILE_NAMES`.
+- Recipes, prompt templates, Memory, slash commands, permissions, and `secrets.yaml` are separate state. Never copy secrets, mixed config, or runtime memory automatically.
+- Windows uses a distinct app-data path; the generated POSIX mapping is macOS/Linux only.
+
+Sources: [Skills](https://goose-docs.ai/docs/guides/context-engineering/using-skills/), [configuration](https://goose-docs.ai/docs/guides/config-files/), [extensions](https://goose-docs.ai/docs/getting-started/using-extensions/), [goosehints](https://goose-docs.ai/docs/guides/context-engineering/using-goosehints/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/gptel-mcp-el.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/gptel-mcp-el.md
new file mode 100644
index 000000000..57897bd19
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/gptel-mcp-el.md
@@ -0,0 +1,3 @@
+# gptel-mcp-el
+
+`mcp.el`/gptel is package-specific Emacs Lisp, not native Emacs MCP. Install, init snippets, server registration, and package state require manual review; do not treat `~/.emacs.d/` as a Skills directory.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/helix.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/helix.md
new file mode 100644
index 000000000..d6733377e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/helix.md
@@ -0,0 +1,3 @@
+# helix
+
+Helix AI integration is plugin-based TOML `mcp_servers` and project `HELIX.md`; it supports a limited MCP surface. Treat plugin and editor config as manual.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/hermes.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/hermes.md
new file mode 100644
index 000000000..9a7d12ce8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/hermes.md
@@ -0,0 +1,5 @@
+# hermes
+
+Hermes Agent provides skills, persistent memory, subagents, cron, ACP, and MCP capabilities. User skills reside in `~/.hermes/skills/` and project skills in `.hermes/skills/`. Supports migration from OpenClaw via built-in migration tooling.
+
+Sources: [docs](https://github.com/hermes-agent/hermes).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/ibm-bob.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/ibm-bob.md
new file mode 100644
index 000000000..ba6a0f74e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/ibm-bob.md
@@ -0,0 +1,5 @@
+# ibm-bob
+
+IBM Bob provides IDE and Bob Shell profiles. Skills are supported in `.bob/skills` and `~/.bob/skills`. Rules include `.bob/rules`, mode-specific rules, and `AGENTS.md`. IDE global MCP is `~/.bob/mcp.json`, Bob Shell MCP is `~/.bob/mcp_settings.json`, and project MCP is `.bob/mcp.json`.
+
+Sources: [docs](https://www.ibm.com/products/bob).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/jetbrains-ai.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/jetbrains-ai.md
new file mode 100644
index 000000000..c706d5bdc
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/jetbrains-ai.md
@@ -0,0 +1,21 @@
+# jetbrains-ai (JetBrains AI Assistant; not Junie)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | `.agents/skills` |
+| Rules | Not mapped |
+| MCP | Not mapped |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Agent Skills require JetBrains AI Assistant 2026.2+. Project skills use `.agents/skills/`; IDE-level agent storage is version/product-managed and remains manual.
+- Project rules use `.aiassistant/rules/*.md`; the directory contains scoped rule files and is not flattened by the single-file rules mapper. User rules are configured in the UI.
+- MCP is managed through **Settings → Tools → AI Assistant → Model Context Protocol (MCP)**. Do not infer Junie `.junie/mcp/mcp.json` or copy UI trust/approval state.
+- Claude Agent and Codex integration can discover their own native skills/configuration. Preserve the selected agent's ownership instead of merging caches or settings across agents.
+
+Sources: [Skills](https://www.jetbrains.com/help/ai-assistant/agent-skills.html), [project rules](https://www.jetbrains.com/help/ai-assistant/configure-project-rules.html), [MCP](https://www.jetbrains.com/help/ai-assistant/mcp.html).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/jetbrains.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/jetbrains.md
new file mode 100644
index 000000000..9eee1d382
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/jetbrains.md
@@ -0,0 +1,20 @@
+# jetbrains (Junie in JetBrains IDEs; not JetBrains AI Assistant)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.junie/skills` |
+| Project skills | `.junie/skills` |
+| Rules | `.junie/AGENTS.md` |
+| MCP | `~/.junie/mcp/mcp.json` |
+| Project MCP | `.junie/mcp/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Junie project Skills override same-named user Skills. `.junie/AGENTS.md` is preferred; root `AGENTS.md` is a fallback. Legacy guidelines and custom project settings are manual inputs.
+- MCP JSON uses `mcpServers`. Only local command/args/env conversion is automatic; remote, header, transport, and unknown fields are manual. Do not copy the mixed `.junie/` namespace.
+- Junie CLI `/import`, extensions, config, and trust files are separate surfaces. Extension bundles may include skills, MCP, subagents, commands, and guidelines; keep the package intact and manual. IDE-level Project Settings, MCP Settings, and Action Allowlist are UI-managed. Use the separate `jetbrains-ai` ID for AI Assistant.
+
+Sources: [Junie Skills](https://junie.jetbrains.com/docs/agent-skills.html), [IDE plugin](https://junie.jetbrains.com/docs/junie-ide-plugin.html), [MCP settings](https://junie.jetbrains.com/docs/junie-plugin-mcp-settings.html), [CLI config](https://junie.jetbrains.com/docs/junie-cli-configuration.html).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/jules.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/jules.md
new file mode 100644
index 000000000..89a53bb6d
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/jules.md
@@ -0,0 +1,5 @@
+# jules
+
+Google Jules is an asynchronous coding agent providing cloud, CLI, and API profiles. It reads root `AGENTS.md`, repository setup scripts, and environment snapshots. Automated migrations treat Jules as a cloud-rebuild profile.
+
+Sources: [docs](https://jules.google.com/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/kilocode.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/kilocode.md
new file mode 100644
index 000000000..4a92b5819
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/kilocode.md
@@ -0,0 +1,21 @@
+# kilocode
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.kilo/skills` |
+| Project skills | `.kilo/skills` |
+| Rules | `AGENTS.md` |
+| MCP | `~/.config/kilo/kilo.jsonc` |
+| Project MCP | `.kilo/kilo.jsonc` |
+| Project config | `.kilo/kilo.jsonc` |
+| Config | `~/.config/kilo/kilo.jsonc` |
+
+
+- MCP is JSONC `mcp` with distinct local/remote shapes; do not flatten it into another client schema.
+- Skills use documented locations, with compatibility directories kept separate.
+- Portable `AGENTS.md` remains the mapper default. Native custom instructions are configured as arrays that can reference `.kilo/rules/*.md`; preserve those scopes manually.
+- Workflows/commands use `.kilo/commands/` and `~/.config/kilo/commands/`. Remote skill paths, agents, and config fields remain manual.
+
+Sources: [Skills](https://kilo.ai/docs/customize/skills), [MCP](https://kilo.ai/docs/automate/mcp/using-in-kilo-code), [rules](https://kilo.ai/docs/customize/custom-rules), [instructions](https://kilo.ai/docs/customize/custom-instructions), [workflows](https://kilo.ai/docs/customize/workflows).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/kimiai.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/kimiai.md
new file mode 100644
index 000000000..7741df004
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/kimiai.md
@@ -0,0 +1,19 @@
+# kimi-code (Moonshot AI)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.kimi-code/skills` |
+| Project skills | `.kimi-code/skills` |
+| Rules | `AGENTS.md` |
+| MCP | `~/.kimi-code/mcp.json` |
+| Project MCP | `.kimi-code/mcp.json` |
+| Project config | Not mapped |
+| Config | `~/.kimi-code/config.toml` |
+
+
+- `KIMI_CODE_HOME` can override the generated home. `~/.kimi-code/` is current; legacy `~/.kimi/` is not.
+- MCP JSON uses `mcpServers` across user/project scope. Retain documented remote transport, never equate legacy SSE with Streamable HTTP, and do not copy `mcp-oauth` state.
+- `AGENTS.md` and Skills have documented aliases; commands are built-in/plugin based, not a standalone directory.
+- Agents, hooks, sessions, plans, credentials, and TOML config are manual. Never copy credentials or runtime state.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/kiro.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/kiro.md
new file mode 100644
index 000000000..c4960d2f1
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/kiro.md
@@ -0,0 +1,20 @@
+# kiro
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.kiro/skills` |
+| Project skills | `.kiro/skills` |
+| Rules | `.kiro/steering` |
+| MCP | `~/.kiro/settings/mcp.json` |
+| Project MCP | `.kiro/settings/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- MCP JSON uses `mcpServers`; migrate only reviewed endpoint metadata and re-authorize OAuth in Kiro.
+- Project steering uses `.kiro/steering/`; global steering uses `~/.kiro/steering/`, and root `AGENTS.md` is also recognized. Preserve inclusion frontmatter instead of flattening files. Skills use documented directories.
+- IDE custom agents use project/user `.kiro/agents/*.md` and may embed MCP. CLI agents use a different JSON schema; reconstruct manually and never convert between them automatically.
+
+Sources: [Skills](https://kiro.dev/docs/skills/), [MCP](https://kiro.dev/docs/mcp/configuration/), [steering](https://kiro.dev/docs/steering/), [custom agents](https://kiro.dev/docs/custom-agents/), [hooks](https://kiro.dev/docs/hooks/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/letta-code.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/letta-code.md
new file mode 100644
index 000000000..1f74bb51b
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/letta-code.md
@@ -0,0 +1,5 @@
+# letta-code
+
+Letta Code provides desktop CLI, cloud, and `.af` AgentFile profiles. Supports skills, subagents, and memory policies. Desktop CLI reads standard `AGENTS.md` and user skills.
+
+Sources: [docs](https://docs.letta.com/letta-code/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/letta.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/letta.md
new file mode 100644
index 000000000..40bf4475c
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/letta.md
@@ -0,0 +1,5 @@
+# letta
+
+Letta provides stateful agent memory, subagents, and tools. Profile `letta/cli` manages local agent state and tool configurations.
+
+Sources: [docs](https://docs.letta.com/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/lovable.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/lovable.md
new file mode 100644
index 000000000..575e7aa06
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/lovable.md
@@ -0,0 +1,3 @@
+# lovable
+
+Lovable is a web platform with UI-managed Chat Connectors and its own MCP server. OAuth, connector availability, and enterprise policy are cloud state; guide a manual UI setup.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/mcphub-nvim.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/mcphub-nvim.md
new file mode 100644
index 000000000..fdbcf8444
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/mcphub-nvim.md
@@ -0,0 +1,3 @@
+# mcphub-nvim
+
+McpHub uses JSON5 `mcpServers`/VS Code-compatible `servers` and environment interpolation. Verify with `:McpHub`; convert manually rather than assuming another client's schema.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/minimax-code.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/minimax-code.md
new file mode 100644
index 000000000..f739883cd
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/minimax-code.md
@@ -0,0 +1,3 @@
+# minimax-code (MiniMax)
+
+MiniMax Code desktop has built-in Skills, Agent Team, Memory, and scheduling, but no documented portable MCP/config path. Treat its desktop state as manual; do not infer a file contract.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/mistral-vibe.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/mistral-vibe.md
new file mode 100644
index 000000000..e2a13efe7
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/mistral-vibe.md
@@ -0,0 +1,7 @@
+# mistral-vibe
+
+Mistral Vibe loads Skills from custom paths, `.agents/skills/`, `.vibe/skills/`, `~/.vibe/skills/`, and `~/.agents/skills/` in documented precedence. Project `.vibe/config.toml` and user `~/.vibe/config.toml` are separate surfaces; MCP uses the `mcp_servers` TOML subobject.
+
+`AGENTS.md`, custom prompts, Skills, agents, and MCP are separate surfaces. TOML MCP, agents, and executable behavior require native adapters/templates; `.env`, logs, sessions, and credentials are forbidden migration inputs.
+
+Source: [Mistral Vibe](https://github.com/mistralai/mistral-vibe).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/mmx-cli.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/mmx-cli.md
new file mode 100644
index 000000000..4161ba35f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/mmx-cli.md
@@ -0,0 +1,3 @@
+# mmx-cli (MiniMax CLI)
+
+`mmx` is a tool, not an MCP client. Its config is JSON and its skills installer links into other products' paths; do not treat it as an independent migration target. Keep API region/host/key configuration manual.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/monkeycode.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/monkeycode.md
new file mode 100644
index 000000000..5f966ef4d
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/monkeycode.md
@@ -0,0 +1,12 @@
+# monkeycode
+
+MonkeyCode is treated as a cloud or self-hosted software-development platform,
+not as security middleware and not as a verified local IDE MCP client. The
+repository has no current official evidence for a portable JSON `mcpServers`
+file, Agent Skills directory, or SDD-file contract.
+
+Registry v2 therefore classifies it as a cloud/UI reconstruction target. Do not
+invent a local path or copy workspace, task, model, Git/PR, credential, or agent
+state. Inventory durable project instructions without secrets, then recreate
+them through the product's reviewed UI/API only after binding the exact product
+deployment and version to official documentation.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/neovim.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/neovim.md
new file mode 100644
index 000000000..fde30001a
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/neovim.md
@@ -0,0 +1,18 @@
+# neovim
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | Not mapped |
+| MCP | Not mapped |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | `~/.config/nvim/init.lua` |
+
+
+`init.lua` is editor configuration, not portable AI context; its effective location can vary with XDG/NVIM_APPNAME. Native Neovim has no Skills, rules, prompts, MCP, or project-config mapping. Plugins are separate products, and any migration to Lua must be manual.
+
+Sources: [startup](https://neovim.io/doc/user/starting/), [Lua](https://neovim.io/doc/user/lua-guide/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/openclaw.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/openclaw.md
new file mode 100644
index 000000000..786acfe29
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/openclaw.md
@@ -0,0 +1,25 @@
+# openclaw (OpenClaw)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.openclaw/skills` |
+| Project skills | `skills` |
+| Rules | `AGENTS.md` |
+| MCP | `~/.openclaw/openclaw.json` |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | `~/.openclaw/openclaw.json` |
+
+
+
+**Registry status:** `unverified/manual-reference`. The workspace/bootstrap and
+MCP contract is not approved for automatic conversion; the paths below are
+read-only discovery guidance, not write authorization.
+
+- MCP JSON uses `mcp.servers`; local entries use command/args, remote entries require `transport: "streamable-http"`. Do not relabel legacy SSE or add protocol/session headers.
+- `AGENTS.md` belongs to the active workspace, selected by `agents.defaults.workspace`; there is no fixed repository project-config root.
+- Copy only named Skills and preview rule merges. MCP/config are opt-in; never copy `.openclaw`, runtime/UI state, or `.env*` wholesale.
+
+Sources: [Skills](https://docs.openclaw.ai/tools/skills), [workspace](https://docs.openclaw.ai/concepts/agent-workspace), [MCP](https://docs.openclaw.ai/cli/mcp), [configuration](https://docs.openclaw.ai/gateway/configuration).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/opencode.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/opencode.md
new file mode 100644
index 000000000..ece3ca218
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/opencode.md
@@ -0,0 +1,22 @@
+# opencode
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.config/opencode/skills` |
+| Project skills | `.opencode/skills` |
+| Rules | `AGENTS.md` |
+| MCP | `~/.config/opencode/opencode.json` |
+| Project MCP | `opencode.json` |
+| Project config | `opencode.json` |
+| Config | `~/.config/opencode/opencode.json` |
+
+
+- MCP config is JSON/JSONC. V1 stores servers under `mcp`; V2 under `mcp.servers` and requires `--opencode-version v2`. Do not mix layouts.
+- Local servers require target-native command arrays and environment syntax. Preserve only documented remote connection fields, re-authorize OAuth, and never add protocol state.
+- Version changes replace only the selected MCP container; unrelated settings and requested backup strategy remain intact.
+- `AGENTS.md` is the rules surface. OpenCode also discovers `.agents/skills/` and `.claude/skills/` aliases; keep duplicate-name precedence manual. Skill access can be limited by `permission.skill`.
+- Commands use `.opencode/commands/*.md`; agents, hooks, and memory use their own formats/plugins and require manual review.
+
+Sources: [Skills](https://opencode.ai/docs/skills/), [V1 MCP](https://opencode.ai/docs/mcp/), [V2 MCP](https://opencode.ai/v2/docs/mcp-servers), [V1→V2](https://opencode.ai/v2/docs/migrate-v1).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/openhands.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/openhands.md
new file mode 100644
index 000000000..c30625485
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/openhands.md
@@ -0,0 +1,9 @@
+# openhands
+
+**Registry status:** `unverified/manual-reference`; it is not an automatic
+source or target. OpenHands CLI and app/config surfaces must be bound to a
+specific version before use. `AGENTS.md`, project Skills, MCP, agents, setup
+scripts, hooks, and condenser memory have different scopes, so inventory and
+reconstruct them individually without copying whole configuration or state.
+
+Source: [OpenHands documentation](https://docs.openhands.dev/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/pearai.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/pearai.md
new file mode 100644
index 000000000..be6c8bbb7
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/pearai.md
@@ -0,0 +1,10 @@
+# pearai
+
+
+
+All automatic paths are unsupported.
+
+
+PearAI is a VS Code/Continue fork, not a documented filesystem contract. No PearAI-owned Skills, rules, MCP, or config path/schema is published; do not infer `~/.pearai`, `.pearai`, `.pearairules`, or borrow VS Code/Continue paths. All migration is manual/UI-managed.
+
+Sources: [app](https://github.com/trypear/pearai-app), [extension](https://github.com/trypear/pearai-submodule).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/pi.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/pi.md
new file mode 100644
index 000000000..307d42054
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/pi.md
@@ -0,0 +1,9 @@
+# pi
+
+Pi reads Skills from `~/.pi/agent/skills/`, `~/.agents/skills/`, `.pi/skills/`, `.agents/skills/`, packages, settings, and explicit CLI paths. Use the canonical Pi paths as targets and report compatibility paths instead of merging them.
+
+Pi deliberately tolerates some Skill-name/directory mismatches that the common Agent Skills specification rejects. Validate against the common specification before cross-client migration and report Pi-only metadata as loss.
+
+User settings are `~/.pi/agent/settings.json`; project settings are `.pi/settings.json`. They are separate scopes rather than aliases, and only reviewed subobjects may be reconstructed.
+
+Sources: [Skills](https://pi.dev/docs/latest/skills), [settings](https://pi.dev/docs/latest/settings).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/pieces.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/pieces.md
new file mode 100644
index 000000000..7c682672d
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/pieces.md
@@ -0,0 +1,12 @@
+# pieces (Pieces for Developers)
+
+
+
+All automatic paths are unsupported.
+
+
+PiecesOS/Desktop/CLI is an MCP server/provider, not a file-backed MCP client or Skill host. Every automatic object is unsupported: do not infer `~/.pieces`, `.pieces`, Skills, rules, or config.
+
+Configure the consuming client from **Settings → MCP** or `pieces mcp setup`; endpoints and transport are server-provided and may vary. Never rewrite its date/SSE path or migrate Pieces databases, logs, or extension state.
+
+Sources: [MCP](https://docs.pieces.app/products/mcp), [Cursor setup](https://docs.pieces.app/products/mcp/cursor), [CLI](https://docs.pieces.app/products/cli/get-started).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/qoder-cn.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/qoder-cn.md
new file mode 100644
index 000000000..02e2e725e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/qoder-cn.md
@@ -0,0 +1,3 @@
+# qoder-cn (formerly Tongyi Lingma)
+
+Qoder CN is the China product profile formerly branded Tongyi Lingma. It is distinct from the international `qoder.com` product, whose CLI uses `~/.qoder/skills`, `.qoder/skills`, layered settings, hooks, agents, and file-backed MCP. Keep Qoder CN in the conservative manual profile until its own official file contracts are verified; never reuse international paths by brand similarity.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/qoder.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/qoder.md
new file mode 100644
index 000000000..a705834e9
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/qoder.md
@@ -0,0 +1,7 @@
+# qoder (International)
+
+Qoder International exposes distinct CLI and IDE profiles. The CLI uses user Skills at `~/.qoder/skills/`, project Skills at `.qoder/skills/`, user settings at `~/.qoder/settings.json`, local project settings at `.qoder/settings.local.json`, and shareable MCP at `.mcp.json`.
+
+Hooks live in separate user (`~/.qoder/settings.json`), project (`.qoder/settings.json`), and local (`.qoder/settings.local.json`) settings layers and must only be emitted as disabled drafts. MCP conversion merges only `mcpServers`; OAuth tokens and permissions are not portable. Qoder CN, Work, and Cloud remain separate profiles.
+
+Sources: [Skills](https://docs.qoder.com/en/cli/Skills), [MCP](https://docs.qoder.com/en/cli/mcp-servers), [hooks](https://docs.qoder.com/cli/hooks).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/qodo.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/qodo.md
new file mode 100644
index 000000000..6a39454a7
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/qodo.md
@@ -0,0 +1,7 @@
+# qodo (formerly CodiumAI)
+
+**Registry status:** `unverified/manual-reference`; the Qodo IDE, CLI, and Merge
+product surfaces are not interchangeable and none is an automatic source or
+target. MCP UI, TOML agents/modes, custom instructions, and enterprise
+allowlists require product- and version-specific manual review. It is not
+Codeium/Windsurf.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/qwen-code.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/qwen-code.md
new file mode 100644
index 000000000..efffb838a
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/qwen-code.md
@@ -0,0 +1,7 @@
+# qwen-code
+
+Qwen Code uses `~/.qwen/skills/` and `.qwen/skills/` for user and project Skills. MCP is the `mcpServers` subobject in `~/.qwen/settings.json` or `.qwen/settings.json`; HTTP uses `httpUrl`, while legacy SSE uses `url`.
+
+Preserve Qwen-only Skill activation metadata through the loss report. Never migrate OAuth token stores or automatically generated/archived Skills as hand-authored content.
+
+Sources: [Skills](https://github.com/QwenLM/qwen-code/blob/main/docs/users/features/skills.md), [MCP](https://github.com/QwenLM/qwen-code/blob/main/docs/users/features/mcp.md).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/replit.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/replit.md
new file mode 100644
index 000000000..edcb2b94c
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/replit.md
@@ -0,0 +1,21 @@
+# replit (Replit AI)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | `.agents/skills` |
+| Rules | `replit.md` |
+| MCP | Not mapped |
+| Project MCP | Not mapped |
+| Project config | `.replit` |
+| Config | Not mapped |
+
+
+- Agent Skills are project-scoped. `.local/secondary_skills/` is compatibility/discovery state, not a merge target.
+- `replit.md` is a living Agent-maintained project document; never overwrite it automatically.
+- `.replit` and `replit.nix` are application/runtime configuration, not portable AI context. User/enterprise config, prompts, and MCP Integrations are cloud/UI managed and manual.
+- Do not infer `~/.replit`, a global Skills directory, or a local MCP file.
+
+Sources: [replit.md](https://docs.replit.com/features/project-setup/replit-dot-md), [Skills](https://docs.replit.com/features/agent/skills), [configuration](https://docs.replit.com/features/project-setup/configuration), [MCP](https://docs.replit.com/build/connect-via-mcp).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/roo-code.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/roo-code.md
new file mode 100644
index 000000000..f0acae189
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/roo-code.md
@@ -0,0 +1,21 @@
+# roo-code (archived 2026-05)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.roo/skills` |
+| Project skills | `.roo/skills` |
+| Rules | `.roorules` |
+| MCP | Not mapped |
+| Project MCP | `.roo/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Project MCP is `.roo/mcp.json` with JSON `mcpServers`; use explicit project scope. Global MCP is extension-managed and manual—never infer a VS Code/Cline `globalStorage` path.
+- The mapper uses Roo-specific Skills paths. `.roorules` is its one-file rules target; scoped/global rule collections, commands, modes, and memory require manual review.
+- `.roo/` mixes those surfaces, so whole-project migration is unsupported.
+- Roo Code was archived on 2026-05-15. Treat Cline as the verified replacement; do not infer a ZooCode or Kilo Code migration path.
+
+Sources: [announcement](https://roocodeinc.github.io/Roo-Code/), [Skills](https://roocodeinc.github.io/Roo-Code/features/skills/), [MCP](https://roocodeinc.github.io/Roo-Code/features/mcp/using-mcp-in-roo/), [archive](https://github.com/RooCodeInc/Roo-Code).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/rovodev.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/rovodev.md
new file mode 100644
index 000000000..9aeed1ff0
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/rovodev.md
@@ -0,0 +1,5 @@
+# rovodev
+
+Atlassian Rovo Dev provides CLI, IDE, and Cloud surfaces. Supports Agent Skills in `~/.rovodev/skills`, `~/.agents/skills`, `.rovodev/skills`, and `.agents/skills`. Instructions include `~/.rovodev/AGENTS.md` and project `AGENTS.md`/`AGENTS.local.md`. MCP configuration is resolved via `config.yml:mcpConfigPath` probing both `~/.rovodev/mcp.json` and `~/.rovodev/mcp_config.json`.
+
+Sources: [docs](https://support.atlassian.com/rovo/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/sourcegraph-amp.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/sourcegraph-amp.md
new file mode 100644
index 000000000..7945f6464
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/sourcegraph-amp.md
@@ -0,0 +1,9 @@
+# sourcegraph-amp
+
+**Registry status:** `unverified/manual-reference`; it is not an automatic
+source or target. Amp has documented Skills, `AGENTS.md`, settings, plugins,
+checks, and MCP precedence, but no profile adapter or complete golden-fixture
+set exists here yet. Preserve native trust, HTTP/OAuth, plugin, and approval
+semantics and reconstruct manually.
+
+Source: [Amp Owner's Manual](https://ampcode.com/manual).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/supermaven.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/supermaven.md
new file mode 100644
index 000000000..3ef84e1b9
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/supermaven.md
@@ -0,0 +1,10 @@
+# supermaven
+
+
+
+All automatic paths are unsupported.
+
+
+Supermaven is a host-editor completion plugin. `~/.supermaven` is runtime/binary storage and `.supermavenignore` controls indexing, not skills or rules. No portable Supermaven Skills, MCP, prompt, or config contract is documented, so every automatic object is unsupported.
+
+Sources: [download](https://supermaven.com/download), [Neovim plugin](https://github.com/supermaven-inc/supermaven-nvim#readme), [maintainer issue](https://github.com/supermaven-inc/supermaven-nvim/issues/85).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/tabnine.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/tabnine.md
new file mode 100644
index 000000000..b71d0e455
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/tabnine.md
@@ -0,0 +1,19 @@
+# tabnine
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | `.tabnine/guidelines` |
+| MCP | `~/.tabnine/mcp_servers.json` |
+| Project MCP | `.tabnine/mcp_servers.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+**Registry status:** `unverified/manual-reference`; the generated paths are
+read-only discovery hints and do not authorize writes.
+
+MCP JSON uses `mcpServers`; rules are scoped guidelines. No Agent Skills or whole-config contract is documented. Enterprise governance and other Tabnine state remain manual.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/tencent-codebuddy-ide.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/tencent-codebuddy-ide.md
new file mode 100644
index 000000000..5531f2cb7
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/tencent-codebuddy-ide.md
@@ -0,0 +1,8 @@
+# tencent-codebuddy-ide (standalone IDE)
+
+**Registry status:** `unverified/manual-reference`; the paths below are
+read-only documentation and do not authorize automatic writes.
+
+MCP is Settings/UI-managed with `mcpServers`, but no portable file is documented. Project rules use `.codebuddy/rules//RULE.mdc`; project Skills use `.codebuddy/skills/`; `CODEBUDDY.md` is context with `AGENTS.md` fallback. Commands, agents, hooks, memory, and user Skills are manual. Do not reuse CodeBuddy CLI paths.
+
+Sources: [IDE Skills](https://www.codebuddy.cn/docs/ide/Features/Skills), [rules](https://www.codebuddy.cn/docs/ide/User-guide/Rules), [MCP](https://www.codebuddy.cn/docs/ide/User-guide/MCP).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/tencent-codebuddy.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/tencent-codebuddy.md
new file mode 100644
index 000000000..dbfae69e8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/tencent-codebuddy.md
@@ -0,0 +1,20 @@
+# tencent-codebuddy
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.codebuddy/skills` |
+| Project skills | `.codebuddy/skills` |
+| Rules | `CODEBUDDY.md` |
+| MCP | `~/.codebuddy/.mcp.json` |
+| Project MCP | `.mcp.json` |
+| Project config | `.codebuddy/settings.json` |
+| Config | `~/.codebuddy/settings.json` |
+
+
+- This key is CodeBuddy Code CLI, not the standalone CodeBuddy IDE. Do not reuse CLI paths for IDE UI.
+- Recommended user MCP is JSON `mcpServers`; project/legacy precedence is manual. Skills and `CODEBUDDY.md` are documented; settings, local settings, hooks, agents, and memory are separate/manual.
+- Never copy generated memory or execute hooks. The mixed `.codebuddy/` namespace is not a whole-project target.
+
+Sources: [Skills](https://www.codebuddy.cn/docs/cli/skills), [MCP](https://www.codebuddy.cn/docs/cli/mcp), [memory](https://www.codebuddy.cn/docs/cli/memory), [hooks](https://www.codebuddy.cn/docs/cli/hooks).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/tongyi-lingma.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/tongyi-lingma.md
new file mode 100644
index 000000000..ad5b7a723
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/tongyi-lingma.md
@@ -0,0 +1,3 @@
+# tongyi-lingma (deprecated)
+
+Legacy Tongyi Lingma is an alias of the Qoder CN profile, not Qoder International. Old `.lingma` state remains source-only/manual; use [qoder-cn](qoder-cn.md) for the current China profile and [qoder](qoder.md) for the international CLI/IDE profiles.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/trae-cn.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/trae-cn.md
new file mode 100644
index 000000000..96836ea04
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/trae-cn.md
@@ -0,0 +1,22 @@
+# trae-cn
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.trae-cn/skills` |
+| Project skills | `.trae/skills` |
+| Rules | `.trae/rules` |
+| MCP | Not mapped |
+| Project MCP | `.trae/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Trae CN is separate from the international build. `.agents/skills/` is optional; `.trae/skills/` wins duplicates, and `.trae/skill-config.json` remains manual.
+- Project rules use documented Markdown frontmatter. Project Commands, agents, hooks, and memory have product-specific schemas or scope and remain manual; never copy/run hooks.
+- Project MCP is `.trae/mcp.json` with `mcpServers` when enabled. Global MCP is **Settings → MCP Servers**/raw JSON, not a documented portable path.
+- **config/argv**: empty/unsupported. Do not infer `~/.trae-cn/argv.json` or settings. `bytedance/trae-agent` is a separate repo-local CLI, not a Trae CN target.
+- Do not merge TRAE CLI, Plugin, or Work/Desktop paths into this entry.
+
+Sources: [Skills](https://docs.trae.cn/ide/skills), [Rules](https://docs.trae.cn/ide/rules), [MCP](https://docs.trae.cn/ide/add-mcp-servers), [Commands](https://docs.trae.cn/ide/slash-commands), [Hooks](https://docs.trae.cn/ide_hook-configuration-reference), [Subagents](https://docs.trae.cn/ide_subagents).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/trae-work.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/trae-work.md
new file mode 100644
index 000000000..93923769a
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/trae-work.md
@@ -0,0 +1,3 @@
+# trae-work (separate product)
+
+TRAE Work has no mapper key. Do not reuse Trae IDE/CN `.trae` paths, schemas, cloud state, or whole namespace. Add a mapping only with official file-backed evidence.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/trae.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/trae.md
new file mode 100644
index 000000000..b3270748c
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/trae.md
@@ -0,0 +1,21 @@
+# trae
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.trae/skills` |
+| Project skills | `.trae/skills` |
+| Rules | `.trae/rules` |
+| MCP | Not mapped |
+| Project MCP | `.trae/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Project MCP is `.trae/mcp.json` with `mcpServers`; global MCP is managed through **Settings → MCP Servers** and its raw-JSON editor, not a portable file.
+- `.agents/skills/` is optional and `.trae/skills/` takes precedence. Project rules use documented frontmatter; Commands, Subagents, Hooks, and Memory need manual scope/schema review. Never copy or run hooks automatically.
+- No global CLI, argv, or settings file is documented. Do not infer `~/.trae/argv.json` or `~/.trae/settings.json`.
+- **`bytedance/trae-agent`** is a separate CLI with repo-local `trae_config.yaml`/`trae_config.json`; its `mcp_servers` schema is not an IDE target. Do not merge TRAE Work/Desktop/Web, Plugin, or Agent paths here.
+
+Sources: [MCP](https://docs.trae.ai/ide/model-context-protocol?_lang=en), [Skills](https://docs.trae.ai/ide/skills?_lang=en), [Rules](https://docs.trae.ai/ide/rules?_lang=en), [Hooks](https://docs.trae.ai/ide/automate-actions-with-hooks?_lang=en), [Trae Agent](https://github.com/bytedance/trae-agent).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/ui-only-mcp.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/ui-only-mcp.md
new file mode 100644
index 000000000..09b9dd828
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/ui-only-mcp.md
@@ -0,0 +1,7 @@
+# UI-managed MCP clients
+
+Use for iFlyCode (`iflycode`) and the ambiguous Raccoon AI (`raccoon-ai`) name.
+No current official, versioned file or UI MCP contract is recorded for either
+entry. They are unverified references, not supported migration targets. Bind an
+exact vendor product URL and version before adding any profile; until then, do
+not invent a path, JSON root key, or portable context surface.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/v0.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/v0.md
new file mode 100644
index 000000000..a51f5b64c
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/v0.md
@@ -0,0 +1,3 @@
+# v0 (Vercel)
+
+v0 uses web UI MCP connections and exposes an MCP server. Connector auth, availability, and client allowlists are cloud state; guide manual UI configuration.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/vecli.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/vecli.md
new file mode 100644
index 000000000..fdcbd517b
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/vecli.md
@@ -0,0 +1,6 @@
+# vecli (Volcano Engine)
+
+**Registry status:** `unverified/manual-reference`. The abbreviated identity is
+not bound to a stable official repository, product version, or local context
+contract. Vecli is distinct from Trae CLI and the cloud-resource `ve` CLI; do
+not use it as a source or target until that identity is resolved.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/visual-studio.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/visual-studio.md
new file mode 100644
index 000000000..11dcb190f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/visual-studio.md
@@ -0,0 +1,21 @@
+# visual-studio (Visual Studio + GitHub Copilot; Windows only)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.copilot/skills` |
+| Project skills | `.github/skills` |
+| Rules | `.github/copilot-instructions.md` |
+| MCP | windows: `%USERPROFILE%\.mcp.json` |
+| Project MCP | `.mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Agent Skills require Visual Studio 2026 18.5+. The documented project locations are `.github/skills/`, `.claude/skills/`, and `.agents/skills/`; the mapper uses `.github/skills/`. Personal equivalents are also discovered, with `~/.copilot/skills/` used here.
+- MCP uses `servers`. User MCP is `%USERPROFILE%\.mcp.json`; repository MCP is `.mcp.json`. Visual Studio also discovers `.vs/mcp.json`, `.vscode/mcp.json`, and `.cursor/mcp.json`, but these compatibility inputs are manual to avoid duplicate or user-local state.
+- Rules use `.github/copilot-instructions.md`; custom agents use `.github/agents/*.agent.md`. Agents, alternate skill paths, scoped instructions, tool approvals, and IDE-managed trust remain manual.
+- Visual Studio is Windows-only. Do not confuse this ID with `vscode` or the `copilot` CLI target.
+
+Sources: [Skills](https://learn.microsoft.com/en-us/visualstudio/ide/copilot-agent-skills?view=visualstudio), [MCP](https://learn.microsoft.com/en-us/visualstudio/ide/mcp-servers?view=visualstudio), [agents](https://learn.microsoft.com/en-us/visualstudio/ide/copilot-specialized-agents?view=visualstudio), [instructions](https://learn.microsoft.com/en-us/visualstudio/ide/copilot-chat-context?view=visualstudio).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/void-editor.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/void-editor.md
new file mode 100644
index 000000000..9ecec707a
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/void-editor.md
@@ -0,0 +1,21 @@
+# void-editor
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | `.voidrules` |
+| MCP | `~/.void-editor/mcp.json` |
+| Project MCP | `.vscode/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Void's repository was archived on 2026-06-02; treat its store as legacy and never copy the whole directory.
+- Void MCP JSON uses `mcpServers`; authenticated/header-bearing remote entries are manual because the archived runtime does not reliably pass headers.
+- Inherited VS Code project MCP uses `.vscode/mcp.json` with `servers` and is a separate manual surface. `.voidrules` is root plain-text context; global instructions are UI-managed.
+- No portable Skills, whole-config, command, agent, hook, or memory path is documented.
+
+Sources: [repository](https://github.com/voideditor/void), [releases](https://github.com/voideditor/void/releases), [MCP service](https://github.com/voideditor/void/blob/main/src/vs/workbench/contrib/void/common/mcpService.ts).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/vscode.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/vscode.md
new file mode 100644
index 000000000..c404fcbd8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/vscode.md
@@ -0,0 +1,22 @@
+# vscode (VS Code + GitHub Copilot IDE; not the `copilot` CLI target)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.copilot/skills` |
+| Project skills | `.github/skills` |
+| Rules | `.github/copilot-instructions.md` |
+| MCP | Not mapped |
+| Project MCP | `.vscode/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- Workspace MCP is `.vscode/mcp.json` with `servers`. User MCP is active-Profile/UI managed: use **MCP: Open User Configuration**, never guess a default, Insiders, VSCodium, or relocated path.
+- Keep explicit `http`/legacy `sse` types, re-authorize OAuth, and fail closed on foreign schemas. This differs from CLI `mcpServers`.
+- Project Skills may also live in `.agents/skills/` or `.claude/skills/`; personal aliases are `~/.agents/skills/` and `~/.claude/skills/`. The mapper uses GitHub Copilot's primary locations to avoid duplicate-name precedence surprises.
+- Rules include `.github/copilot-instructions.md`, scoped instruction files, `AGENTS.md`, and `CLAUDE.md`; project prompts are `.github/prompts/*.prompt.md`. Agents, hooks, and preview plugins are supported but schema-sensitive and remain manual.
+- The `copilot` mapper key is GitHub Copilot CLI, not this VS Code surface.
+
+Sources: [MCP](https://code.visualstudio.com/docs/agent-customization/mcp-servers), [instructions](https://code.visualstudio.com/docs/agent-customization/custom-instructions), [Skills](https://code.visualstudio.com/docs/agent-customization/agent-skills), [prompts](https://code.visualstudio.com/docs/agent-customization/prompt-files), [plugins](https://code.visualstudio.com/docs/agent-customization/agent-plugins), [profiles](https://code.visualstudio.com/docs/configure/profiles).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/warp-oz.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/warp-oz.md
new file mode 100644
index 000000000..d0e18e6fb
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/warp-oz.md
@@ -0,0 +1,7 @@
+# warp-oz
+
+Oz is Warp's current local/cloud agent CLI; `warp-cli` is deprecated. Skills, MCP, and agent profiles are run-level or cloud-managed inputs exposed by `--skill`, `--mcp`, and `--profile` rather than one portable local directory contract.
+
+Generate a reconstruction plan and exact CLI arguments. Do not copy Warp Drive rules, saved prompts, notebooks, workflows, API keys, or cloud profile state.
+
+Source: [Oz CLI](https://docs.warp.dev/reference/cli).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/warp.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/warp.md
new file mode 100644
index 000000000..33e5cf506
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/warp.md
@@ -0,0 +1,5 @@
+# warp
+
+Warp provides desktop, oz-cli, and cloud profiles. Warp Desktop supports Agent Skills in standard compatibility roots, root and subtree `AGENTS.md` (and legacy `WARP.md`), Global Rules, and MCP (`~/.warp/mcp.json` / `.warp/mcp.json`). Warp Oz CLI provides the Oz command runtime.
+
+Sources: [docs](https://docs.warp.dev/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/windsurf.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/windsurf.md
new file mode 100644
index 000000000..2dfb4a6f8
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/windsurf.md
@@ -0,0 +1,21 @@
+# windsurf
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.codeium/windsurf/skills` |
+| Project skills | `.windsurf/skills` |
+| Rules | `.windsurf/rules` |
+| MCP | `~/.codeium/windsurf/mcp_config.json` |
+| Project MCP | Not mapped |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- MCP JSON uses `mcpServers`; remote entries use exactly one documented `serverUrl` or `url`, never a guessed VS Code `type`/transport.
+- Current project Rules use `.windsurf/rules/*.md`; `AGENTS.md` is hierarchy-aware plain Markdown. `.devin/rules/` belongs to a different Devin surface and must not be used as Windsurf's canonical target.
+- Global Rules use `~/.codeium/windsurf/memories/global_rules.md`. Generated memories share the surrounding runtime namespace but are not portable; never copy them as rules without review.
+- Workflows and mixed `.windsurf/` state remain separate. No project MCP or whole-project mapping is claimed.
+
+Sources: [Skills](https://docs.windsurf.com/windsurf/cascade/skills), [MCP](https://docs.windsurf.com/windsurf/cascade/mcp), [Rules and memories](https://docs.windsurf.com/windsurf/cascade/memories), [AGENTS.md](https://docs.windsurf.com/windsurf/cascade/agents-md).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/workbuddy.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/workbuddy.md
new file mode 100644
index 000000000..c8bf4d82f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/workbuddy.md
@@ -0,0 +1,20 @@
+# workbuddy (WorkBuddy)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | Not mapped |
+| Project skills | Not mapped |
+| Rules | Not mapped |
+| MCP | `~/.workbuddy/mcp.json` |
+| Project MCP | `.workbuddy/mcp.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- MCP JSON uses `mcpServers`; documented desktop entries are local command/args/env. Remote headers/transport are unestablished and manual.
+- Skills are imported through the UI and use `skill.yml`, implementation files, and a README; no portable global/project Skills directory is published.
+- Memory and settings are UI-managed private state. Do not copy generated memory or infer a whole-settings file.
+
+Sources: [MCP](https://www.workbuddy.ai/docs/zh/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/MCP-Guide), [Skills](https://www.workbuddy.ai/docs/zh/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/Skills-Market), [memory](https://www.workbuddy.ai/docs/zh/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/Memory).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/xcode.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/xcode.md
new file mode 100644
index 000000000..8edc6e017
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/xcode.md
@@ -0,0 +1,10 @@
+# xcode (Xcode coding agents)
+
+**Registry status:** `unverified/manual-reference`; Xcode is a host and runtime
+bridge here, not an automatic context-migration target.
+
+Xcode 26.3+/27 can host external coding agents and extensions, but its agent-specific data under `~/Library/Developer/Xcode/CodingAssistant/` is isolated implementation state rather than a portable migration target. Do not copy `ClaudeAgentConfig`, `codex`, `gemini`, credentials, sessions, approvals, or caches.
+
+Use each agent's documented configuration UI or CLI and verify inside Xcode. Xcode exposes IDE capabilities to external agents through `xcrun mcpbridge`; this is a runtime bridge, not an MCP configuration file to migrate. Extension-bundled skills, subagents, and MCP declarations remain package-owned and manual.
+
+Sources: [customizing agents](https://developer.apple.com/documentation/Xcode/extending-and-customizing-agents), [external agent access](https://developer.apple.com/documentation/Xcode/giving-external-agents-access-to-xcode).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/zcode.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/zcode.md
new file mode 100644
index 000000000..feb839eb4
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/zcode.md
@@ -0,0 +1,23 @@
+# zcode (Zhipu AI)
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.zcode/skills` |
+| Project skills | Not mapped |
+| Rules | `AGENTS.md` |
+| MCP | `~/.zcode/cli/config.json` |
+| Project MCP | `.zcode/config.json` |
+| Project config | `.zcode/config.json` |
+| Config | `~/.zcode/cli/config.json` |
+
+
+**Registry status:** `unverified/manual-reference`; the generated paths are
+read-only discovery hints and ZCode is not an automatic source or target.
+
+- MCP JSON uses `mcp.servers` (also accepts `mcpServers`). Retain explicit transport; do not silently relabel legacy SSE or copy authorization state.
+- Rules use `AGENTS.md`, not `CLAUDE.md`; onboarding import does not change that contract.
+- Only global Skills are documented. Commands, agents, hooks, memory, and GUI API-key state are manual; ZCode is not CodeGeeX.
+
+Sources: [Skills](https://zcode.z.ai/en/docs/skill), [MCP](https://zcode.z.ai/cn/docs/mcp-services), [agents](https://zcode.z.ai/en/docs/agents), [plugins](https://zcode.z.ai/en/docs/plugin).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/zed.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/zed.md
new file mode 100644
index 000000000..cd2d8a8ec
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/zed.md
@@ -0,0 +1,21 @@
+# zed
+
+
+
+| Object | Documented path |
+| --- | --- |
+| Global skills | `~/.agents/skills` |
+| Project skills | `.agents/skills` |
+| Rules | `AGENTS.md` |
+| MCP | `~/.config/zed/settings.json` |
+| Project MCP | `.zed/settings.json` |
+| Project config | Not mapped |
+| Config | Not mapped |
+
+
+- MCP JSON uses `context_servers`; project settings are manual. Local and remote entries have distinct fields; no generic whole-settings conversion exists.
+- Project instructions use first-match compatibility discovery across files including `AGENTS.md`, `CLAUDE.md`, `GEMINI.md`, and tool-specific rules; personal instructions use `~/.config/zed/AGENTS.md`. The mapper chooses portable `AGENTS.md` and does not merge competing files.
+- Agent Skills use documented paths. Legacy Rules were replaced by Skills plus Instructions; prompts are server-provided, not a prompt-template directory.
+- Agent servers, config, and GUI PATH are product-specific; use absolute executable paths when necessary.
+
+Sources: [instructions](https://zed.dev/docs/ai/instructions), [Skills](https://zed.dev/docs/ai/skills), [MCP](https://zed.dev/docs/ai/mcp).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/zencoder.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/zencoder.md
new file mode 100644
index 000000000..9613a380c
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/zencoder.md
@@ -0,0 +1,5 @@
+# zencoder
+
+Zencoder IDE provides settings, custom agents, saved prompts, skills, and MCP integrations under `~/.zencoder/settings.json` and `.zencoder/settings.json`.
+
+Sources: [docs](https://docs.zencoder.ai/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/ides/zenflow.md b/skills/agent-skills-setup/agent-skills-setup/references/ides/zenflow.md
new file mode 100644
index 000000000..976b6f37b
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/ides/zenflow.md
@@ -0,0 +1,5 @@
+# zenflow
+
+Zenflow provides workflow automation and scheduled task management with settings, skills, and `.zenflow/workflows`.
+
+Sources: [docs](https://docs.zenflow.ai/).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/mcp-migration.md b/skills/agent-skills-setup/agent-skills-setup/references/mcp-migration.md
new file mode 100644
index 000000000..affbf7b3d
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/mcp-migration.md
@@ -0,0 +1,40 @@
+# MCP migration
+
+Use for the profile-aware `mcp` object. The automatic core accepts the reviewed stdio subset of JSON and JSONC server maps. Remote HTTP/SSE requires a dedicated target-profile transport adapter and currently produces reconstruction actions; read [mcp-transport.md](mcp-transport.md) for remote URLs, OAuth, or headers.
+
+| Target | Automatic shape | Boundary |
+| --- | --- | --- |
+| Common clients | `mcpServers` | Automatic for reviewed stdio `command`/`args`/`env`; permission and lifecycle fields enter the loss report. |
+| Registered JSON/JSONC profiles | Profile-specific root key | Validate command/URL and preserve unrelated keys. |
+| TOML/YAML/JSON5/XML/Lua | Dedicated manual adapter | Generate a reviewed reconstruction; never use JSON fallback. |
+| Cloud/UI profiles | Rebuild manifest | Use the official API/UI; never invent a local file. |
+
+Validate command/args/env or URL/headers, apply [migration-safety.md](migration-safety.md), convert only target-supported fields, preserve unrelated settings, parse the target, and emit a credential-free diff. Ambiguous transport, OAuth/session state, unknown schema, and non-automatic adapters remain manual.
+
+## Sensitive configuration handling
+
+User-level agent config files are treated as sensitive inputs:
+
+- **Subobject extraction only.** For `config-subobject` storage — and for
+ every MCP object at ACB collection time, including shared host settings
+ files registered with plain `file` storage — the adapter parses and
+ re-emits only the authorized MCP servers section. Sibling settings —
+ model choice, approval policy, sandbox, profile state, telemetry — are
+ never read into plans, bundles, or reports.
+- **Trust sections are hard-denied.** Surfaces registered with the
+ `never-migrate` policy (e.g. the trust block of a host config file) are
+ excluded before disk collection; no code path can inventory or copy them.
+- **Least-privilege reads.** A config file is opened only when its product is
+ an explicitly named migration source or target. There is no startup scan of
+ installed products.
+- **Secret preflight and redaction.** Every collected object passes the strict
+ secret scanner before output; credential-looking values in `env`, `args`,
+ and URLs are dropped to the loss report instead of being migrated.
+- **No network.** MCP migration never contacts servers, registries, or update
+ endpoints; remote-transport entries always produce a manual rebuild.
+
+~~~bash
+bash scripts/smart-ide-migration.sh plan \
+ --source cline/ide --target forge/cli --workspace /path/to/project \
+ --objects mcp --scope project --output /path/to/plan.json --json
+~~~
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/mcp-transport.md b/skills/agent-skills-setup/agent-skills-setup/references/mcp-transport.md
new file mode 100644
index 000000000..65e01ab66
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/mcp-transport.md
@@ -0,0 +1,11 @@
+# MCP transport and authorization boundaries
+
+Read for remote MCP, explicit transport, OAuth, headers, or a bare URL. Migrate reviewed client configuration, never runtime protocol or authorization state.
+
+- Require a target-documented transport; a URL alone is ambiguous.
+- Preserve `sse` only as a supported legacy label; never relabel it as HTTP or Streamable HTTP.
+- Preserve explicit Streamable HTTP only when the target supports its field.
+- Drop protocol headers, session/resumption IDs, handshakes, subscriptions, OAuth tokens, registration, and `autoApprove`/`enabledTools`/`disabledTools`.
+- Re-authorize and approve tools in the target client.
+
+Use [migration-safety.md](migration-safety.md) when conversion or redaction is unclear. Sources: [MCP changes](https://modelcontextprotocol.io/specification/2026-07-28/changelog), [Streamable HTTP](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http), and [authorization](https://modelcontextprotocol.io/specification/2026-07-28/basic/authorization).
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/migration-safety.md b/skills/agent-skills-setup/agent-skills-setup/references/migration-safety.md
new file mode 100644
index 000000000..9aeeed400
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/migration-safety.md
@@ -0,0 +1,36 @@
+# Migration safety and conflicts
+
+Use before a migration can write. A generic request to migrate or transfer authorizes planning only. Inspect only the explicitly named source, target, objects, scope, and workspace; if any is missing, stop before filesystem inspection. Save the profile-aware plan and show its exact file list/diff or cloud rebuild actions and target paths. Obtain separate explicit user approval before `apply` or `rollback`; `--yes` records that approval but does not replace it. Apply only the reviewed plan: its checksum binds the Registry digest, adapter versions, resolved surfaces, source/target hashes, and Git provenance. Any drift requires a new review. Inventory canonical and compatibility paths; if more than one alternative exists, stop for explicit selection, and if multiple precedence files exist, do not pretend they are one document. Before copying a Skill directory or converting instructions, scan the source and reject likely literal credentials. Reject links outside a Skill root, exclude `.env` and `.env.*`, and preserve the source.
+
+Apply stages and validates every output before the first target mutation, snapshots every destination, then commits the saved plan as one operation. A failure in any later write or in manifest creation restores every earlier target in reverse order; no partial success is reported. Plan and manifest artifact paths must not overlap the Registry or any selected source/target surface. The manifest is written only after all target hashes are recorded.
+
+## Device handoff and Agent Context Bundle (ACB) safety
+
+- **Strict Allowlist Snapshotting (P0-2)**: `snapshot` captures only requested scopes and valid portable objects (skills, instructions, mcp). Policies like `forbidden-regenerate`, `never-migrate`, `source-only`, and objects like `generated_memory`, `session`, `chat`, `runtime`, `database`, `trust`, `approval`, `oauth_state` are strictly blocked before disk read.
+- **Sub-Object Field-Level Whitelist**: For `config-subobject` surfaces (e.g. `settings.json` storing `mcpServers` in Augment, Gemini, VS Code, Qoder), snapshot extracts, validates, and serializes ONLY the targeted sub-object slice. Host configuration sibling keys (API keys, provider tokens, telemetry, UI preferences, proxy configs, organizational policies) are never copied into the bundle.
+- **Dual-Side Plan Architecture (P0-1)**: `restore` builds a dual-side plan with the verified bundle as `source_registry` and the local host as `target_registry`. Real destination paths, pre-apply states (`exists` -> `replace` vs `create`), semantic diffs, and workspace are evaluated on the destination device and locked into `plan_sha256` before apply.
+- **Replayable Restore Plans & TOCTOU State Locks**: Plans saved with `restore --plan-out ` can be replayed and applied via `restore --plan-in --yes` (or `apply --bundle --yes`). Replay verifies bundle integrity, plan checksum, registry checksum, and enforces strict state locks (`expected_source_state` and `expected_target_state`) against destination surfaces.
+- **Authoritative Bundle Precedence (P0-3)**: The bundle is always the single source of truth during `restore`. The presence of a local source IDE on the destination device cannot override or bypass bundle content.
+- **Strict Handoff Whitelist (P0-4)**: Handoff data serializes only explicitly whitelisted fields (`reviewed_summary`, `git_branch`, `selected_files`, `patch`). Raw logs, conversation histories, tokens, and machine paths are dropped.
+- **Closed-World Integrity Verification**: Bundles must pass `bundle-verify` against `checksums.json` and deep secret/binary scans before restore.
+- **Plan-Only Review & Execution Safety**: `restore ` (or `--plan-only`) builds and reviews the plan with zero disk writes. Applying requires explicit `--yes`. Extraction into a review tree (`--restore-root `) is opt-in.
+
+## Surface and runtime boundaries
+
+- **Plugins & Extensions**: Binary packages and executable plugins are not auto-installed or executed; they are recorded as `draft-disabled` or `manual-rebuild`.
+- **Sessions & Runtime State**: Interactive chat logs, runtime tokens, OAuth tokens, and approval grants are strictly non-migratable and excluded.
+- **Probes & Diagnostics**: `detect` and `doctor` run local filesystem and binary checks only; network access is forbidden.
+
+Use [mcp-transport.md](mcp-transport.md) for remote transport, OAuth, or protocol state. The script blanks literal credentials and may translate an exact documented environment reference; mixed or complex expressions need manual reconstruction. MCP target symlinks fail before conversion. Redaction cleanup accepts only the exact target artifacts, while copied-skill cleanup is contained within the canonical target copy root.
+
+| Strategy | Existing selected object |
+| --- | --- |
+| `skip` | Leave unchanged. |
+| `backup` (default) | Save `.bak.`, then merge. |
+| `overwrite` | Replace only the selected object, without backup. |
+
+For shared MCP configuration, preserve unrelated settings; `overwrite` replaces only the selected server map. Do not invent renamed fallback entries.
+
+The explicit `legacy` subcommand supports lookup and zero-write dry-runs only. Calls beginning with an implicit legacy flag are rejected. Any `legacy --yes` write fails before the compatibility engine runs; create and apply a saved profile-aware plan instead.
+
+Restate source, target, objects, scope, workspace, and boundaries. After review, use `apply --yes --json`; report checksums, paths, parse result, source integrity, target evidence, backup, and manual follow-ups.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/object-migration.md b/skills/agent-skills-setup/agent-skills-setup/references/object-migration.md
new file mode 100644
index 000000000..c75041e00
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/object-migration.md
@@ -0,0 +1,21 @@
+# File-backed object migration
+
+Read with [migration-safety.md](migration-safety.md) for non-MCP objects.
+
+| Object | Handling |
+| --- | --- |
+| Skills | Preflight all source text, then copy credential-free named directories as units. |
+| Rules / Instructions | Parse and emit the selected product's native frontmatter; never flatten conditional activation into an unconditional file. |
+| Prompts / Commands | Use the target's documented format; review Gemini TOML and UI/enterprise libraries. |
+| Workflows | Translate deterministic pipeline steps; review complex orchestrations for target engine support. |
+| Config / project | Manual-only; never copy whole config or opaque trees. |
+| Agents / Droids | Recreate reviewed content against target permission, event, and command schemas (generated with `draft-disabled` for safety). |
+| Hooks | Map lifecycle event triggers; shell execution scripts are generated in `draft-disabled` state. |
+| Plugins / Extensions | Non-executable; binaries and package installations are flagged `manual-rebuild` or `draft-disabled`. |
+| Sessions / Chat logs | Strictly non-transferable; runtime conversation logs and state are excluded from migration (handoff uses strict whitelist serialization). |
+| Memory / Context | Do not copy private/generated state (e.g. `~/.cline/data` generated memory); rewrite selected context as rules. |
+| Bundles (ACB) | Package reviewed objects into self-contained, secret-redacted, offline portable archives (`.acb`) under strict allowlists, sub-object field isolation, and replayable dual-side plan binding (`--plan-in`). |
+
+Treat living or generated files, including Replit `replit.md`, as manual conversation state rather than overwrite targets. When no compatible target format is documented, describe reconstruction instead of an unvalidated copy. There is no generic embedded-config exception: a sub-object is automatic only when Registry v2 names a reviewed source and target adapter for the exact profile/version.
+
+The reviewed instruction adapters use native fields for Augment (`type`), Cline/Claude (`paths`), Cursor and Continue (`alwaysApply`/`globs`), Kiro (`inclusion`/`fileMatchPattern`), Copilot (`applyTo`), Trae/Qoder (`alwaysApply`), and Windsurf (`trigger`). Unknown frontmatter is reported as loss. A conversion becomes manual when the target cannot preserve `always`, glob, model-decided, or manual activation semantics.
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/registry-v2.json b/skills/agent-skills-setup/agent-skills-setup/references/registry-v2.json
new file mode 100644
index 000000000..9119d284f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/registry-v2.json
@@ -0,0 +1,5365 @@
+{
+ "$schema": "./registry-v2.schema.json",
+ "aliases": {
+ "claude-desktop": "claude/desktop-chat",
+ "codeium": "windsurf/ide",
+ "jetbrains-ai": "jetbrains/ai-assistant",
+ "trae-cn": "trae/cn-ide",
+ "visual-studio": "copilot/visual-studio",
+ "vscode": "copilot/vscode"
+ },
+ "candidate_discovery": {
+ "auto_promote_threshold": {
+ "min_detection_probes": 1,
+ "min_official_sources": 2,
+ "min_surfaces": 2
+ },
+ "enabled": false,
+ "report_format": {
+ "include_archived_products": true,
+ "include_new_paths": true,
+ "include_new_products": true,
+ "include_renamed_products": true,
+ "include_schema_changes": true,
+ "suggest_registry_diff": true
+ },
+ "schedule": "disabled"
+ },
+ "detection_config": {
+ "installation_states": [
+ "installed",
+ "configured-only",
+ "compatibility-only",
+ "cloud-connected",
+ "legacy",
+ "ambiguous",
+ "not-detected"
+ ],
+ "platforms": [
+ "darwin",
+ "linux",
+ "windows",
+ "wsl",
+ "remote-ssh",
+ "dev-container",
+ "codespaces",
+ "vscode-profile",
+ "extension-host"
+ ],
+ "probes": {
+ "app-bundle": {
+ "description": "macOS app bundle identifier lookup"
+ },
+ "binary": {
+ "description": "CLI binary lookup with version command"
+ },
+ "cloud-account": {
+ "description": "Cloud/API account connection check"
+ },
+ "environment": {
+ "description": "Environment variable override for path"
+ },
+ "file-signature": {
+ "description": "File path existence with content fingerprint"
+ },
+ "schema-probe": {
+ "description": "JSON schema validation for config files"
+ },
+ "vscode-extension": {
+ "description": "VS Code extension marketplace lookup"
+ }
+ }
+ },
+ "freshness": {
+ "candidate_discovery_schedule": "disabled",
+ "candidate_discovery_sources": [],
+ "demote_stale_on_detect": true,
+ "max_age_days": 365,
+ "online_checks_enabled": false,
+ "stale_levels": [
+ "stale-partial",
+ "stale-manual",
+ "stale-source-only"
+ ]
+ },
+ "object_policies": {
+ "agent": "manual-template",
+ "automation": "disabled-draft-only",
+ "chat": "forbidden-regenerate",
+ "cloud_knowledge": "official-api-or-rebuild-checklist",
+ "command": "manual-rebuild",
+ "config": "explicit-subobject-only",
+ "cron": "disabled-draft-only",
+ "database": "forbidden-regenerate",
+ "generated_memory": "forbidden-regenerate",
+ "hook": "disabled-draft-only",
+ "instructions": "semantic-ir-with-loss-report",
+ "mcp": "profile-version-adapter",
+ "mode": "manual-template",
+ "persona": "manual-template",
+ "plugin": "manual-rebuild",
+ "policy": "explicit-subobject-only",
+ "prompt": "manual-rebuild",
+ "rag_index": "forbidden-regenerate",
+ "skill": "validate-then-atomic-copy",
+ "trust": "never-migrate",
+ "user_memory": "review-then-instructions-ir",
+ "workflow": "manual-rebuild"
+ },
+ "products": {
+ "aider": {
+ "reference": "ides/aider.md",
+ "template": "manual-reference"
+ },
+ "amazon-q": {
+ "category": "agent-client",
+ "default_profile": "ide",
+ "display_name": "Amazon Q Developer",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "kind": "cli",
+ "migration_policy": "manual-template",
+ "sources": [
+ "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/qdev-mcp.html"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "amazon-q-agent",
+ "path": "~/.aws/amazonq/cli-agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ },
+ "custom-agent": {
+ "kind": "custom-agent",
+ "migration_policy": "manual-template",
+ "sources": [
+ "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/qdev-mcp.html"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "amazon-q-agent",
+ "path": "~/.aws/amazonq/agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ },
+ "ide": {
+ "kind": "ide-extension",
+ "mcp_path_note": "Dual paths documented: ~/.aws/amazonq/default.json and ~/.aws/amazonq/agents/default.json - probe both and validate root key/signature",
+ "migration_policy": "bidirectional-reviewed",
+ "precedence": [
+ "project-default",
+ "user-default",
+ "legacy-mcp"
+ ],
+ "sources": [
+ "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/mcp-ide.html",
+ "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/qdev-mcp.html"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "amazon-q-rule",
+ "path": ".amazonq/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "mcp": [
+ {
+ "compatibility_paths": [
+ "~/.aws/amazonq/mcp.json",
+ "~/.aws/amazonq/agents/default.json"
+ ],
+ "format": "json:mcpServers",
+ "path": "~/.aws/amazonq/default.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "compatibility_paths": [
+ ".amazonq/mcp.json",
+ ".amazonq/agents/default.json"
+ ],
+ "format": "json:mcpServers",
+ "path": ".amazonq/default.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "android-studio": {
+ "reference": "ides/android-studio.md",
+ "template": "manual-reference"
+ },
+ "antigravity": {
+ "reference": "ides/antigravity.md",
+ "template": "manual-reference"
+ },
+ "augment-code": {
+ "category": "agent-client",
+ "default_profile": "cli-ide",
+ "display_name": "Augment Code",
+ "lifecycle": "active",
+ "profiles": {
+ "cli-ide": {
+ "kind": "cli-and-ide",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://docs.augmentcode.com/cli/rules",
+ "https://docs.augmentcode.com/cli/reference",
+ "https://docs.augmentcode.com/cli/config"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "augment-rule",
+ "path": "~/.augment/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "augment-rule",
+ "path": ".augment/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ },
+ {
+ "format": "plain-markdown",
+ "path": "~/.augment/user-guidelines.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.augment/settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".augment/settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".augment/settings.local.json",
+ "policy": "profile-version-adapter",
+ "scope": "local",
+ "storage": "config-subobject"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.augment/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".augment/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "baidu-comate": {
+ "reference": "ides/baidu-comate.md",
+ "template": "manual-reference"
+ },
+ "baidu-comate-ide": {
+ "reference": "ides/baidu-comate-ide.md",
+ "template": "manual-reference"
+ },
+ "blackbox": {
+ "reference": "ides/blackbox.md",
+ "template": "manual-reference"
+ },
+ "bolt-new": {
+ "reference": "ides/bolt-new.md",
+ "template": "cloud-ui"
+ },
+ "claude": {
+ "category": "agent-suite",
+ "default_profile": "code-cli",
+ "display_name": "Claude",
+ "lifecycle": "active",
+ "profiles": {
+ "code-cli": {
+ "detection": [
+ {
+ "command": [
+ "claude"
+ ],
+ "type": "binary",
+ "version_command": [
+ "claude",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.claude/skills",
+ "CLAUDE.md"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.claude/skills",
+ "linux": "~/.claude/skills",
+ "wsl": "~/.claude/skills"
+ },
+ "sources": [
+ "https://code.claude.com/docs/en/settings",
+ "https://code.claude.com/docs/en/skills",
+ "https://code.claude.com/docs/en/mcp"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "CLAUDE.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.claude.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.claude/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".claude/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-15",
+ "version_range": "current as of 2026-08-15"
+ },
+ "desktop-chat": {
+ "kind": "desktop-chat",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://support.claude.com/en/articles/12512180-use-skills-in-claude"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ },
+ "desktop-code": {
+ "detection": [
+ {
+ "darwin_bundle_id": "com.anthropic.claude-code",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.claude/skills",
+ "CLAUDE.md"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "desktop-coding",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.claude",
+ "linux": "~/.claude",
+ "wsl": "~/.claude"
+ },
+ "sources": [
+ "https://code.claude.com/docs/en/desktop"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "CLAUDE.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.claude.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.claude/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".claude/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-17",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "claude-desktop": {
+ "alias_of": {
+ "product": "claude",
+ "profile": "desktop-chat"
+ },
+ "reference": "ides/claude-desktop.md",
+ "template": "legacy-alias"
+ },
+ "cline": {
+ "category": "agent-client",
+ "default_profile": "ide",
+ "display_name": "Cline",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "inherits": "ide",
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://docs.cline.bot/getting-started/config"
+ ],
+ "verified_at": "2026-08-12"
+ },
+ "ide": {
+ "detection": [
+ {
+ "command": [
+ "cline"
+ ],
+ "type": "binary",
+ "version_command": [
+ "cline",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.cline/skills",
+ "~/.clinerules"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.cline/skills",
+ "linux": "~/.cline/skills",
+ "windows": "$APPDATA/cline/skills"
+ },
+ "precedence": [
+ "project",
+ "user",
+ "compatibility"
+ ],
+ "sources": [
+ "https://docs.cline.bot/getting-started/config"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "cline-agent",
+ "path": "~/.cline/agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cline-agent",
+ "path": ".cline/agents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "cron": [
+ {
+ "format": "cline-cron",
+ "path": "~/.cline/cron",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cline-cron",
+ "path": ".cline/cron",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "generated_memory": [
+ {
+ "path": "~/.cline/data",
+ "policy": "forbidden-regenerate",
+ "scope": "runtime",
+ "storage": "database"
+ }
+ ],
+ "hooks": [
+ {
+ "format": "cline-hook",
+ "path": "~/.cline/hooks",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cline-hook",
+ "path": ".cline/hooks",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "instructions": [
+ {
+ "compatibility_paths": [
+ "~/Documents/Cline/Rules"
+ ],
+ "format": "cline-rule",
+ "path": "~/.cline/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "compatibility_paths": [
+ ".clinerules"
+ ],
+ "format": "cline-rule",
+ "path": ".cline/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "override_env": "CLINE_DATA_DIR",
+ "override_relative_path": "settings/cline_mcp_settings.json",
+ "path": "~/.cline/data/settings/cline_mcp_settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".cline/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "plugins": [
+ {
+ "format": "cline-plugin",
+ "path": "~/.cline/plugins",
+ "policy": "manual-rebuild",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cline-plugin",
+ "path": ".cline/plugins",
+ "policy": "manual-rebuild",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.cline/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".cline/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "workflows": [
+ {
+ "format": "cline-workflow",
+ "path": "~/.cline/data/workflows",
+ "policy": "manual-rebuild",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cline-workflow",
+ "path": ".cline/workflows",
+ "policy": "manual-rebuild",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ },
+ "sdk": {
+ "detection": [
+ {
+ "command": [
+ "cline"
+ ],
+ "type": "binary",
+ "version_command": [
+ "cline",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.cline/skills",
+ "~/.cline/rules"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "sdk",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.cline",
+ "linux": "~/.cline",
+ "wsl": "~/.cline"
+ },
+ "sources": [
+ "https://docs.cline.bot/getting-started/config"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "cline-rule",
+ "path": "~/.cline/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cline-rule",
+ "path": ".cline/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.cline/data/settings/cline_mcp_settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".cline/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.cline/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".cline/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-17",
+ "version_range": "current as of 2026-08-17"
+ }
+ }
+ },
+ "codecompanion-nvim": {
+ "reference": "ides/codecompanion-nvim.md",
+ "template": "manual-reference"
+ },
+ "codeium": {
+ "alias_of": {
+ "product": "windsurf",
+ "profile": "ide"
+ },
+ "reference": "ides/codeium.md",
+ "template": "legacy-alias"
+ },
+ "codely": {
+ "reason": "Product surfaces and MCP schema are not version-bound",
+ "reference": "ides/codely.md",
+ "sources": [
+ "https://developer.unity.cn/projects/6a7189bcedbc2a120fe6d4af",
+ "https://codely-docs.tuanjie.cn/learn/ai-programming-environment-setup-guide"
+ ],
+ "template": "manual-reference",
+ "verified_at": "2026-08-13"
+ },
+ "codex": {
+ "category": "coding-agent",
+ "default_profile": "cli",
+ "display_name": "OpenAI Codex",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "codex"
+ ],
+ "type": "binary",
+ "version_command": [
+ "codex",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.codex/AGENTS.md",
+ "~/.codex/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli-and-desktop-runtime",
+ "migration_policy": "bidirectional-reviewed",
+ "precedence": [
+ "nearest-project-override",
+ "project",
+ "user-override",
+ "user"
+ ],
+ "sources": [
+ "https://developers.openai.com/codex/skills",
+ "https://learn.chatgpt.com/docs/agent-configuration/agents-md.md",
+ "https://learn.chatgpt.com/docs/config-file/config-basic.md"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "toml",
+ "path": ".codex/agents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "generated_memory": [
+ {
+ "format": "codex-memory",
+ "path": "~/.codex/memories",
+ "policy": "forbidden-regenerate",
+ "scope": "user",
+ "storage": "generated-state"
+ }
+ ],
+ "hooks": [
+ {
+ "format": "toml:hooks",
+ "path": "~/.codex/config.toml",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "toml:hooks",
+ "path": ".codex/config.toml",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "config-subobject"
+ }
+ ],
+ "instructions": [
+ {
+ "compatibility_behavior": "precedence",
+ "compatibility_paths": [
+ "~/.codex/AGENTS.override.md"
+ ],
+ "format": "agents-md",
+ "path": "~/.codex/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "precedence-files"
+ },
+ {
+ "compatibility_behavior": "precedence",
+ "compatibility_paths": [
+ "AGENTS.override.md"
+ ],
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "toml:mcp_servers",
+ "path": "~/.codex/config.toml",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "toml:mcp_servers",
+ "path": ".codex/config.toml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "config-subobject"
+ }
+ ],
+ "rules": [
+ {
+ "format": "codex-rule",
+ "path": ".codex/rules",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "trust": [
+ {
+ "path": "~/.codex/config.toml",
+ "policy": "never-migrate",
+ "scope": "user+managed",
+ "storage": "config"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "cody": {
+ "reference": "ides/cody.md",
+ "template": "cloud-ui"
+ },
+ "continue": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Continue",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "continue"
+ ],
+ "type": "binary",
+ "version_command": [
+ "continue",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.continue/skills",
+ "~/.continue/config.yaml"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.continue",
+ "linux": "~/.continue",
+ "wsl": "~/.continue"
+ },
+ "sources": [
+ "https://continue.dev/docs/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.continue/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".continue/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "copilot": {
+ "category": "agent-suite",
+ "default_profile": "cli",
+ "display_name": "GitHub Copilot",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "gh",
+ "copilot"
+ ],
+ "type": "binary",
+ "version_command": [
+ "gh",
+ "copilot",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.github/copilot",
+ "~/.copilot"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.github/copilot",
+ "linux": "~/.github/copilot",
+ "wsl": "~/.github/copilot"
+ },
+ "sources": [
+ "https://docs.github.com/en/copilot/how-tos/copilot-cli"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "copilot-instructions",
+ "path": "~/.github/copilot/instructions.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "copilot-instructions",
+ "path": ".github/copilot/instructions.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.copilot/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".github/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "github-com": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ },
+ "visual-studio": {
+ "detection": [
+ {
+ "id": "github.copilot",
+ "type": "vscode-extension"
+ },
+ {
+ "paths": [
+ "%APPDATA%/Microsoft/VisualStudio/Copilot"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "windows": "%APPDATA%/Microsoft/VisualStudio/Copilot"
+ },
+ "sources": [
+ "https://learn.microsoft.com/en-us/visualstudio/ide/copilot-agent-skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "copilot-instructions",
+ "path": "%APPDATA%/Microsoft/VisualStudio/Copilot/instructions.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "copilot-instructions",
+ "path": "Copilot/instructions.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "%APPDATA%/Microsoft/VisualStudio/Copilot/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "Copilot/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "vscode": {
+ "detection": [
+ {
+ "id": "github.copilot",
+ "type": "vscode-extension"
+ },
+ {
+ "paths": [
+ "~/.vscode/extensions/github.copilot-*"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.vscode/extensions/github.copilot-*",
+ "dev-container": "~/.vscode/extensions/github.copilot-*",
+ "linux": "~/.vscode/extensions/github.copilot-*",
+ "windows": "%USERPROFILE%/.vscode/extensions/github.copilot-*",
+ "wsl": "~/.vscode/extensions/github.copilot-*"
+ },
+ "sources": [
+ "https://code.visualstudio.com/docs/agent-customization/agent-skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "copilot-instructions",
+ "path": "~/.vscode/copilot/instructions.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "copilot-instructions",
+ "path": ".github/copilot/instructions.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.vscode/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".vscode/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.copilot/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".github/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "crush": {
+ "category": "coding-agent",
+ "default_profile": "cli",
+ "display_name": "Crush",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "precedence": [
+ "project-dot",
+ "project",
+ "user"
+ ],
+ "sources": [
+ "https://github.com/charmbracelet/crush"
+ ],
+ "surfaces": {
+ "generated_memory": [
+ {
+ "override_env": "CRUSH_GLOBAL_DATA",
+ "path": "~/.local/share/crush/crush.json",
+ "policy": "forbidden-regenerate",
+ "scope": "user",
+ "storage": "generated-state"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcp",
+ "override_env": "CRUSH_GLOBAL_CONFIG",
+ "path": "~/.config/crush/crush.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "compatibility_paths": [
+ "crush.json"
+ ],
+ "format": "json:mcp",
+ "path": ".crush.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "config-subobject"
+ }
+ ],
+ "skills": [
+ {
+ "compatibility_paths": [
+ "~/.agents/skills",
+ "~/.claude/skills"
+ ],
+ "format": "agent-skill",
+ "override_env": "CRUSH_SKILLS_DIR",
+ "path": "~/.config/crush/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "compatibility_paths": [
+ ".agents/skills",
+ ".claude/skills",
+ ".cursor/skills"
+ ],
+ "format": "agent-skill",
+ "path": ".crush/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "cursor": {
+ "category": "ide-extension",
+ "default_profile": "ide",
+ "display_name": "Cursor",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "detection": [
+ {
+ "darwin_bundle_id": "com.todesclient.ios",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.cursor/skills",
+ "~/.cursor/rules"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.cursor/skills",
+ "linux": "~/.cursor/skills",
+ "windows": "$APPDATA/Cursor/skills"
+ },
+ "sources": [
+ "https://docs.cursor.com/context/rules",
+ "https://docs.cursor.com/context/skills",
+ "https://docs.cursor.com/context/mcp"
+ ],
+ "surfaces": {
+ "hooks": [
+ {
+ "format": "cursor-hook",
+ "path": "~/.cursor/hooks",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cursor-hook",
+ "path": ".cursor/hooks",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "cursor-mdc",
+ "path": "~/.cursor/rules",
+ "policy": "manual-rebuild",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "cursor-mdc",
+ "path": ".cursor/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.cursor/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".cursor/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.cursor/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".cursor/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-15",
+ "version_range": "current as of 2026-08-15"
+ }
+ }
+ },
+ "devin": {
+ "category": "agent-suite",
+ "default_profile": "terminal",
+ "display_name": "Devin",
+ "lifecycle": "active",
+ "profiles": {
+ "cloud": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://app.devin.ai"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "terminal": {
+ "detection": [
+ {
+ "command": [
+ "devin"
+ ],
+ "type": "binary",
+ "version_command": [
+ "devin",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.devin/skills",
+ "~/.devin/sessions"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.devin",
+ "linux": "~/.devin"
+ },
+ "sources": [
+ "https://docs.devin.ai/cli"
+ ],
+ "surfaces": {
+ "handoff": [
+ {
+ "format": "devin-session",
+ "path": "~/.devin/sessions",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.devin/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".devin/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "emacs": {
+ "reference": "ides/emacs.md",
+ "template": "host-editor"
+ },
+ "factory-droid": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Factory Droid",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "droid"
+ ],
+ "type": "binary",
+ "version_command": [
+ "droid",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.factory/skills",
+ "~/.factory/plugins",
+ "~/.factory/droids"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.factory",
+ "linux": "~/.factory"
+ },
+ "sources": [
+ "https://factory.ai/docs/plugins"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "factory-droid",
+ "path": "~/.factory/droids",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "factory-droid",
+ "path": ".factory/droids",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "commands": [
+ {
+ "format": "factory-command",
+ "path": "~/.factory/commands",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "factory-command",
+ "path": ".factory/commands",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "hooks": [
+ {
+ "format": "factory-hooks",
+ "path": "~/.factory/hooks/hooks.json",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "factory-hooks",
+ "path": ".factory/hooks/hooks.json",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.factory/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".factory/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "plugins": [
+ {
+ "format": "factory-plugin",
+ "path": "~/.factory/plugins",
+ "policy": "preserve-package",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "factory-plugin",
+ "path": ".factory/plugins",
+ "policy": "preserve-package",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.factory/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".factory/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "firebase-studio": {
+ "category": "cloud-ide",
+ "default_profile": "legacy-workspace",
+ "display_name": "Firebase Studio",
+ "lifecycle": "sunsetting-2027-03-22",
+ "profiles": {
+ "legacy-workspace": {
+ "kind": "cloud-ide",
+ "migration_policy": "source-only",
+ "sources": [
+ "https://firebase.google.com/docs/studio/get-started",
+ "https://firebase.google.com/docs/studio/mcp-servers"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "plain-markdown",
+ "path": ".idx/airules.md",
+ "policy": "source-only",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": ".idx/mcp.json",
+ "policy": "source-only",
+ "scope": "project",
+ "storage": "file"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "existing workspaces until 2027-03-22"
+ }
+ }
+ },
+ "forge": {
+ "category": "coding-agent",
+ "default_profile": "cli",
+ "display_name": "ForgeCode",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "forge"
+ ],
+ "type": "binary",
+ "version_command": [
+ "forge",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.forge/skills",
+ "~/.agents/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.forge/skills",
+ "extension-host": "~/.forge/skills",
+ "linux": "~/.forge/skills",
+ "remote-ssh": "~/.forge/skills",
+ "wsl": "~/.forge/skills"
+ },
+ "precedence": [
+ "project",
+ "agents",
+ "user",
+ "built-in"
+ ],
+ "sources": [
+ "https://forgecode.dev/docs/skills/",
+ "https://forgecode.dev/docs/mcp-integration/",
+ "https://forgecode.dev/docs/forgecode-config/"
+ ],
+ "surfaces": {
+ "config": [
+ {
+ "format": "toml",
+ "path": ".forge.toml",
+ "policy": "explicit-subobject-only",
+ "scope": "project",
+ "storage": "file"
+ },
+ {
+ "format": "toml",
+ "path": "~/.forge/.forge.toml",
+ "policy": "explicit-subobject-only",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": ".mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": ".forge/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "~/.agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "shared-user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "~/forge/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "gemini-cli": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Gemini CLI",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "gemini"
+ ],
+ "type": "binary",
+ "version_command": [
+ "gemini",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.gemini/AGENTS.md",
+ "~/.gemini/skills",
+ "~/.gemini/commands"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.gemini",
+ "linux": "~/.gemini",
+ "wsl": "~/.gemini"
+ },
+ "sources": [
+ "https://github.com/google-gemini/gemini-cli"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "GEMINI.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.gemini/settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".gemini/settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.gemini/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".gemini/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "gemini-code-assist": {
+ "category": "ide-extension",
+ "default_profile": "vscode",
+ "display_name": "Gemini Code Assist",
+ "lifecycle": "active",
+ "profiles": {
+ "enterprise": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://cloud.google.com/gemini-code-assist/docs/enterprise"
+ ],
+ "surfaces": {
+ "policies": [
+ {
+ "format": "json",
+ "path": "~/.gemini-code-assist/enterprise-policies.json",
+ "policy": "manual-template",
+ "scope": "enterprise",
+ "storage": "file"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "jetbrains": {
+ "detection": [
+ {
+ "id": "com.google.gemini.code.assist",
+ "type": "vscode-extension"
+ },
+ {
+ "paths": [
+ "~/.config/JetBrains/GeminiCodeAssist/skills",
+ "~/.config/JetBrains/GeminiCodeAssist/prompts"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.config/JetBrains/GeminiCodeAssist",
+ "linux": "~/.config/JetBrains/GeminiCodeAssist",
+ "windows": "%APPDATA%/JetBrains/GeminiCodeAssist"
+ },
+ "sources": [
+ "https://plugins.jetbrains.com/plugin/gemini-code-assist"
+ ],
+ "surfaces": {
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.config/JetBrains/GeminiCodeAssist/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".gemini-code-assist/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompt_library": [
+ {
+ "format": "gemini-prompt-library",
+ "path": "~/.config/JetBrains/GeminiCodeAssist/prompt-library",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "gemini-prompt-library",
+ "path": ".gemini-code-assist/prompt-library",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "gemini-prompt",
+ "path": "~/.config/JetBrains/GeminiCodeAssist/prompts",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "gemini-prompt",
+ "path": ".gemini-code-assist/prompts",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.config/JetBrains/GeminiCodeAssist/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".gemini-code-assist/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "vscode": {
+ "detection": [
+ {
+ "id": "google.gemini-code-assist",
+ "type": "vscode-extension"
+ },
+ {
+ "paths": [
+ "~/.gemini-code-assist/skills",
+ "~/.gemini-code-assist/prompts"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.gemini-code-assist",
+ "linux": "~/.gemini-code-assist",
+ "windows": "%APPDATA%/GeminiCodeAssist",
+ "wsl": "~/.gemini-code-assist"
+ },
+ "sources": [
+ "https://cloud.google.com/gemini-code-assist/docs/ide"
+ ],
+ "surfaces": {
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.gemini-code-assist/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".gemini-code-assist/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompt_library": [
+ {
+ "format": "gemini-prompt-library",
+ "path": "~/.gemini-code-assist/prompt-library",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "gemini-prompt-library",
+ "path": ".gemini-code-assist/prompt-library",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "gemini-prompt",
+ "path": "~/.gemini-code-assist/prompts",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "gemini-prompt",
+ "path": ".gemini-code-assist/prompts",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.gemini-code-assist/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".gemini-code-assist/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "gitlab-duo": {
+ "category": "agent-suite",
+ "default_profile": "vscode",
+ "display_name": "GitLab Duo Agent Platform",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "glab"
+ ],
+ "type": "binary",
+ "version_command": [
+ "glab",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.gitlab/duo/AGENTS.md"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.gitlab/duo",
+ "linux": "~/.gitlab/duo",
+ "wsl": "~/.gitlab/duo"
+ },
+ "sources": [
+ "https://docs.gitlab.com/ee/user/duo_agent_platform/cli.html"
+ ],
+ "surfaces": {
+ "flows": [
+ {
+ "format": "gitlab-flow",
+ "path": ".gitlab/duo/flows.yaml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.gitlab/duo/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".gitlab/duo/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "flows": {
+ "detection": [
+ {
+ "paths": [
+ ".gitlab/duo/flows.yaml"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "workflow",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.gitlab/duo",
+ "linux": "~/.gitlab/duo",
+ "wsl": "~/.gitlab/duo"
+ },
+ "sources": [
+ "https://docs.gitlab.com/ee/user/duo_agent_platform/flows.html"
+ ],
+ "surfaces": {
+ "flows": [
+ {
+ "format": "gitlab-flow",
+ "path": ".gitlab/duo/flows.yaml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ]
+ },
+ "verified_at": "2026-08-17",
+ "version_range": "current as of 2026-08-16"
+ },
+ "jetbrains": {
+ "detection": [
+ {
+ "id": "gitlab.gitlab-duo",
+ "type": "vscode-extension"
+ },
+ {
+ "paths": [
+ "~/.config/JetBrains/GitLabDuo/AGENTS.md"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.config/JetBrains/GitLabDuo",
+ "linux": "~/.config/JetBrains/GitLabDuo",
+ "windows": "%APPDATA%/JetBrains/GitLabDuo"
+ },
+ "sources": [
+ "https://plugins.jetbrains.com/plugin/18657-gitlab-duo"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.config/JetBrains/GitLabDuo/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.config/JetBrains/GitLabDuo/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".gitlab/duo/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "vscode": {
+ "detection": [
+ {
+ "id": "gitlab.gitlab-duo",
+ "type": "vscode-extension"
+ },
+ {
+ "paths": [
+ "~/.gitlab/duo/AGENTS.md",
+ "~/.config/gitlab/duo/AGENTS.md"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.gitlab/duo",
+ "dev-container": "~/.gitlab/duo",
+ "linux": "~/.gitlab/duo",
+ "wsl": "~/.gitlab/duo"
+ },
+ "sources": [
+ "https://docs.gitlab.com/ee/user/duo_agent_platform/"
+ ],
+ "surfaces": {
+ "flows": [
+ {
+ "format": "gitlab-flow",
+ "path": ".gitlab/duo/flows.yaml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.gitlab/duo/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.gitlab/duo/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".gitlab/duo/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "web": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://gitlab.com/-/duo"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "goose-cli": {
+ "reference": "ides/goose-cli.md",
+ "template": "manual-reference"
+ },
+ "gptel-mcp-el": {
+ "reference": "ides/gptel-mcp-el.md",
+ "template": "manual-reference"
+ },
+ "helix": {
+ "reference": "ides/helix.md",
+ "template": "host-editor"
+ },
+ "hermes": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Hermes Agent",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "hermes"
+ ],
+ "type": "binary",
+ "version_command": [
+ "hermes",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.hermes/skills",
+ "~/.hermes/memories"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.hermes",
+ "linux": "~/.hermes",
+ "wsl": "~/.hermes"
+ },
+ "sources": [
+ "https://github.com/hermes-agent/hermes"
+ ],
+ "surfaces": {
+ "acp": [
+ {
+ "format": "hermes-acp",
+ "path": "~/.hermes/acp.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "hermes-acp",
+ "path": ".hermes/acp.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "cron": [
+ {
+ "format": "hermes-cron",
+ "path": "~/.hermes/cron.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "hermes-cron",
+ "path": ".hermes/cron.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.hermes/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".hermes/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "memory": [
+ {
+ "format": "hermes-memory",
+ "path": "~/.hermes/memories",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "hermes-memory",
+ "path": ".hermes/memories",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.hermes/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".hermes/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "subagents": [
+ {
+ "format": "hermes-subagent",
+ "path": "~/.hermes/subagents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "hermes-subagent",
+ "path": ".hermes/subagents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "ibm-bob": {
+ "category": "agent-suite",
+ "default_profile": "ide",
+ "display_name": "IBM Bob",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "kind": "ide-extension",
+ "mcp_path_note": "IDE global MCP path differs from Shell; see profiles.",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://www.ibm.com/docs/en/bob"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "plain-markdown",
+ "path": "~/.bob/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "plain-markdown",
+ "path": "~/.bob/rules-agent",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "plain-markdown",
+ "path": "~/.bob/rules-plan",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "plain-markdown",
+ "path": "~/.bob/rules-ask",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.bob/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".bob/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.bob/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".bob/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-15",
+ "version_range": "current as of 2026-08-15"
+ },
+ "shell": {
+ "kind": "cli",
+ "mcp_path_note": "Shell uses ~/.bob/mcp_settings.json (not ~/.bob/mcp.json).",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://www.ibm.com/docs/en/bob/shell"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "plain-markdown",
+ "path": "~/.bob/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.bob/mcp_settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".bob/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.bob/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".bob/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-15",
+ "version_range": "current as of 2026-08-15"
+ }
+ }
+ },
+ "iflycode": {
+ "reference": "ides/ui-only-mcp.md",
+ "template": "manual-reference"
+ },
+ "jetbrains": {
+ "category": "ide-suite",
+ "default_profile": "junie",
+ "display_name": "JetBrains",
+ "lifecycle": "active",
+ "profiles": {
+ "ai-assistant": {
+ "detection": [
+ {
+ "paths": [
+ "~/.config/JetBrains/AI-Assistant/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-assistant",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.config/JetBrains/AI-Assistant",
+ "linux": "~/.config/JetBrains/AI-Assistant",
+ "windows": "%APPDATA%/JetBrains/AI-Assistant"
+ },
+ "sources": [
+ "https://www.jetbrains.com/help/ai-assistant/agent-skills.html"
+ ],
+ "surfaces": {
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.config/JetBrains/AI-Assistant/skills",
+ "policy": "manual-rebuild",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "junie": {
+ "detection": [
+ {
+ "command": [
+ "junie"
+ ],
+ "type": "binary",
+ "version_command": [
+ "junie",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.config/JetBrains/Junie/skills",
+ "~/.junie/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-agent",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.config/JetBrains/Junie",
+ "linux": "~/.config/JetBrains/Junie",
+ "windows": "%APPDATA%/JetBrains/Junie",
+ "wsl": "~/.config/JetBrains/Junie"
+ },
+ "sources": [
+ "https://junie.jetbrains.com/docs/agent-skills.html"
+ ],
+ "surfaces": {
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.junie/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".junie/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "jetbrains-ai": {
+ "alias_of": {
+ "product": "jetbrains",
+ "profile": "ai-assistant"
+ },
+ "reference": "ides/jetbrains-ai.md",
+ "template": "legacy-alias"
+ },
+ "jules": {
+ "category": "agent-suite",
+ "default_profile": "cloud",
+ "display_name": "Google Jules",
+ "lifecycle": "active",
+ "profiles": {
+ "api": {
+ "kind": "cloud-api",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://cloud.google.com/jules/docs/api"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "jules"
+ ],
+ "type": "binary",
+ "version_command": [
+ "jules",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.jules/config.yaml"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.jules",
+ "linux": "~/.jules",
+ "wsl": "~/.jules"
+ },
+ "sources": [
+ "https://cloud.google.com/jules/docs/cli"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "cloud": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://jules.google.com"
+ ],
+ "surfaces": {
+ "environment_setup": [
+ {
+ "format": "bash",
+ "path": ".jules/setup.sh",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "environment_snapshot": [
+ {
+ "format": "json",
+ "path": ".jules/snapshot.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "schedules": [
+ {
+ "format": "yaml",
+ "path": ".jules/schedules.yaml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "kilocode": {
+ "reference": "ides/kilocode.md",
+ "template": "manual-reference"
+ },
+ "kimiai": {
+ "reference": "ides/kimiai.md",
+ "template": "manual-reference"
+ },
+ "kiro": {
+ "category": "ide-agent",
+ "default_profile": "ide",
+ "display_name": "Kiro",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "detection": [
+ {
+ "command": [
+ "kiro"
+ ],
+ "type": "binary",
+ "version_command": [
+ "kiro",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.kiro/skills",
+ "~/.kiro/steering"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.kiro",
+ "linux": "~/.kiro",
+ "windows": "%APPDATA%/Kiro",
+ "wsl": "~/.kiro"
+ },
+ "sources": [
+ "https://kiro.dev/docs"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "kiro-steering",
+ "path": "~/.kiro/steering",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "kiro-steering",
+ "path": ".kiro/steering",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.kiro/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".kiro/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "letta": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Letta Code",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "letta"
+ ],
+ "type": "binary",
+ "version_command": [
+ "letta",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.letta/skills",
+ "~/.letta/agents"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.letta",
+ "linux": "~/.letta",
+ "wsl": "~/.letta"
+ },
+ "sources": [
+ "https://docs.letta.com/agents/skills"
+ ],
+ "surfaces": {
+ "agentfile": [
+ {
+ "format": "letta-agentfile",
+ "path": "~/.letta/agent.af",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "letta-agentfile",
+ "path": ".letta/agent.af",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "memory": [
+ {
+ "format": "letta-memory",
+ "path": "~/.letta/editable_memory",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "letta-memory",
+ "path": ".letta/editable_memory",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "scheduling": [
+ {
+ "format": "letta-scheduler",
+ "path": "~/.letta/scheduler.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "letta-scheduler",
+ "path": ".letta/scheduler.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.letta/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".letta/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "subagents": [
+ {
+ "format": "letta-subagent",
+ "path": "~/.letta/subagents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "letta-subagent",
+ "path": ".letta/subagents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "letta-code": {
+ "category": "agent-client",
+ "default_profile": "desktop-cli",
+ "display_name": "Letta Code",
+ "lifecycle": "active",
+ "profiles": {
+ "agent-file": {
+ "detection": [
+ {
+ "paths": [
+ "~/.letta/agents.af",
+ ".letta/agents.af"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "agent-file",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.letta",
+ "linux": "~/.letta",
+ "wsl": "~/.letta"
+ },
+ "sources": [
+ "https://docs.letta.ai/agent-file"
+ ],
+ "surfaces": {
+ "agent_file": [
+ {
+ "format": "letta-agent-file",
+ "path": "~/.letta/agents.af",
+ "policy": "preserve-package",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "letta-agent-file",
+ "path": ".letta/agents.af",
+ "policy": "preserve-package",
+ "scope": "project",
+ "storage": "file"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "cloud": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://app.letta.com"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "desktop-cli": {
+ "detection": [
+ {
+ "command": [
+ "letta"
+ ],
+ "type": "binary",
+ "version_command": [
+ "letta",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.letta/skills",
+ "~/.letta/memories",
+ "~/.letta/agents"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "desktop-cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.letta",
+ "linux": "~/.letta",
+ "wsl": "~/.letta"
+ },
+ "sources": [
+ "https://docs.letta.ai/letta-code"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.letta/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "memory": [
+ {
+ "format": "letta-memory",
+ "path": "~/.letta/memories",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "letta-memory",
+ "path": ".letta/memories",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.letta/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".letta/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "subagents": [
+ {
+ "format": "letta-agent",
+ "path": "~/.letta/agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "letta-agent",
+ "path": ".letta/agents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "lovable": {
+ "reference": "ides/lovable.md",
+ "template": "cloud-ui"
+ },
+ "mcphub-nvim": {
+ "reference": "ides/mcphub-nvim.md",
+ "template": "manual-reference"
+ },
+ "minimax-code": {
+ "reference": "ides/minimax-code.md",
+ "template": "manual-reference"
+ },
+ "mistral-vibe": {
+ "category": "coding-agent",
+ "default_profile": "cli",
+ "display_name": "Mistral Vibe Code",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "precedence": [
+ "custom",
+ "project-agents",
+ "project-vibe",
+ "user-vibe",
+ "user-agents"
+ ],
+ "sources": [
+ "https://github.com/mistralai/mistral-vibe"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "toml",
+ "path": "~/.vibe/agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.vibe/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "toml:mcp_servers",
+ "path": "~/.vibe/config.toml",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "toml:mcp_servers",
+ "path": ".vibe/config.toml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "config-subobject"
+ }
+ ],
+ "skills": [
+ {
+ "compatibility_paths": [
+ "~/.agents/skills"
+ ],
+ "format": "agent-skill",
+ "path": "~/.vibe/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "compatibility_paths": [
+ ".agents/skills"
+ ],
+ "format": "agent-skill",
+ "path": ".vibe/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "mmx-cli": {
+ "reference": "ides/mmx-cli.md",
+ "template": "manual-reference"
+ },
+ "monkeycode": {
+ "confidence": "high",
+ "reason": "Cloud/self-hosted development platform with no verified portable local context contract",
+ "reference": "ides/monkeycode.md",
+ "sources": [
+ "https://github.com/chaitin/MonkeyCode"
+ ],
+ "template": "cloud-ui",
+ "verified_at": "2026-08-13"
+ },
+ "neovim": {
+ "reference": "ides/neovim.md",
+ "template": "host-editor"
+ },
+ "openclaw": {
+ "reference": "ides/openclaw.md",
+ "template": "manual-reference"
+ },
+ "opencode": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "OpenCode",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "opencode"
+ ],
+ "type": "binary",
+ "version_command": [
+ "opencode",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.config/opencode/skills",
+ "~/.config/opencode/AGENTS.md"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.config/opencode",
+ "linux": "~/.config/opencode",
+ "wsl": "~/.config/opencode"
+ },
+ "sources": [
+ "https://opencode.ai"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.config/opencode/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".opencode/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "openhands": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "OpenHands",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "openhands"
+ ],
+ "type": "binary",
+ "version_command": [
+ "openhands",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.openhands/skills",
+ "~/.agents/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.openhands",
+ "linux": "~/.openhands",
+ "wsl": "~/.openhands"
+ },
+ "sources": [
+ "https://docs.openhands.dev/modules/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.openhands/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".openhands/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "~/.agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "pearai": {
+ "reference": "ides/pearai.md",
+ "template": "manual-reference"
+ },
+ "pi": {
+ "category": "coding-agent",
+ "default_profile": "cli",
+ "display_name": "Pi coding agent",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://pi.dev/docs/latest/skills",
+ "https://pi.dev/docs/latest/settings"
+ ],
+ "surfaces": {
+ "config": [
+ {
+ "format": "json:skills",
+ "path": "~/.pi/agent/settings.json",
+ "policy": "explicit-subobject-only",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:skills",
+ "path": ".pi/settings.json",
+ "policy": "explicit-subobject-only",
+ "scope": "project",
+ "storage": "config-subobject"
+ }
+ ],
+ "skills": [
+ {
+ "compatibility_paths": [
+ "~/.agents/skills"
+ ],
+ "format": "agent-skill",
+ "path": "~/.pi/agent/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "compatibility_paths": [
+ ".agents/skills"
+ ],
+ "format": "agent-skill",
+ "path": ".pi/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "pieces": {
+ "reference": "ides/pieces.md",
+ "template": "provider"
+ },
+ "qoder": {
+ "category": "coding-agent",
+ "default_profile": "cli",
+ "display_name": "Qoder International",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://docs.qoder.com/en/cli/Skills",
+ "https://docs.qoder.com/en/cli/mcp-servers",
+ "https://docs.qoder.com/cli/hooks"
+ ],
+ "surfaces": {
+ "hooks": [
+ {
+ "format": "json:hooks",
+ "path": "~/.qoder/settings.json",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:hooks",
+ "path": ".qoder/settings.json",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:hooks",
+ "path": ".qoder/settings.local.json",
+ "policy": "disabled-draft-only",
+ "scope": "local",
+ "storage": "config-subobject"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.qoder/settings.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".qoder/settings.local.json",
+ "policy": "profile-version-adapter",
+ "scope": "local",
+ "storage": "config-subobject"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.qoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".qoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ },
+ "cloud": {
+ "kind": "cloud-agent",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://docs.qoder.com/"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-12",
+ "version_range": "profile boundary only as of 2026-08-12"
+ },
+ "cn-cli": {
+ "detection": [
+ {
+ "command": [
+ "qoder"
+ ],
+ "type": "binary",
+ "version_command": [
+ "qoder",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.qoder/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.qoder",
+ "linux": "~/.qoder"
+ },
+ "sources": [
+ "https://docs.qoder.com/cli"
+ ],
+ "surfaces": {
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.qoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".qoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-17",
+ "version_range": "current as of 2026-08-16"
+ },
+ "cn-ide": {
+ "detection": [
+ {
+ "darwin_bundle_id": "com.qoder.ide",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.qoder/skills",
+ "~/.qoder/rules"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.qoder",
+ "linux": "~/.qoder",
+ "windows": "%APPDATA%/Qoder"
+ },
+ "sources": [
+ "https://docs.qoder.com/"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "qoder-rule",
+ "path": "~/.qoder/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "qoder-rule",
+ "path": ".qoder/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.qoder/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".qoder/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.qoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".qoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-17",
+ "version_range": "current as of 2026-08-16"
+ },
+ "ide": {
+ "inherits": "cli",
+ "kind": "ide",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://docs.qoder.com/en/cli/Skills",
+ "https://docs.qoder.com/en/cli/mcp-servers",
+ "https://docs.qoder.com/cli/hooks"
+ ],
+ "verified_at": "2026-08-12"
+ },
+ "work": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "sources": [
+ "https://docs.qoder.com/"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-12",
+ "version_range": "profile boundary only as of 2026-08-12"
+ }
+ }
+ },
+ "qoder-cn": {
+ "alias_of": {
+ "product": "qoder",
+ "profile": "cn-ide"
+ },
+ "reference": "ides/qoder-cn.md",
+ "template": "legacy-alias"
+ },
+ "qodo": {
+ "reference": "ides/qodo.md",
+ "template": "manual-reference"
+ },
+ "qwen-code": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Qwen Code",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "qwen"
+ ],
+ "type": "binary",
+ "version_command": [
+ "qwen",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.qwen/skills",
+ "~/.qwen/commands",
+ "~/.qwen/agents"
+ ],
+ "type": "file-signature"
+ },
+ {
+ "paths": [
+ "~/.qwen/review-context",
+ "~/.qwen/sessions",
+ "~/.qwen/desktop",
+ "~/.qwen/serve"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "codespaces": "~/.qwen",
+ "darwin": "~/.qwen",
+ "dev-container": "~/.qwen",
+ "linux": "~/.qwen",
+ "wsl": "~/.qwen"
+ },
+ "sources": [
+ "https://github.com/QwenLM/Qwen-Code"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "qwen-agent",
+ "path": "~/.qwen/agents",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "qwen-agent",
+ "path": ".qwen/agents",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "commands": [
+ {
+ "format": "qwen-command",
+ "path": "~/.qwen/commands",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "qwen-command",
+ "path": ".qwen/commands",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "desktop": [
+ {
+ "format": "qwen-desktop",
+ "path": "~/.qwen/desktop",
+ "policy": "manual-rebuild",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ],
+ "hooks": [
+ {
+ "events": [
+ "pre-tool-use",
+ "post-tool-use",
+ "pre-prompt",
+ "post-prompt",
+ "notification"
+ ],
+ "format": "qwen-hook",
+ "path": "~/.qwen/hooks",
+ "policy": "disabled-draft-only",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "events": [
+ "pre-tool-use",
+ "post-tool-use",
+ "pre-prompt",
+ "post-prompt",
+ "notification"
+ ],
+ "format": "qwen-hook",
+ "path": ".qwen/hooks",
+ "policy": "disabled-draft-only",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.qwen/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".qwen/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "mcp-plugins": [
+ {
+ "format": "qwen-mcp-plugin",
+ "path": "~/.qwen/mcp-plugins",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "qwen-mcp-plugin",
+ "path": ".qwen/mcp-plugins",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "plugins": [
+ {
+ "format": "qwen-plugin",
+ "path": "~/.qwen/plugins",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "qwen-plugin",
+ "path": ".qwen/plugins",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "review_context": [
+ {
+ "format": "qwen-review-context",
+ "path": ".qwen/review-context.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "file"
+ },
+ {
+ "format": "qwen-review-context",
+ "path": "~/.qwen/review-context.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "serve": [
+ {
+ "format": "qwen-serve",
+ "path": "~/.qwen/serve",
+ "policy": "manual-rebuild",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ],
+ "session": [
+ {
+ "format": "qwen-session",
+ "path": "~/.qwen/sessions",
+ "policy": "forbidden-regenerate",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.qwen/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".qwen/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-15",
+ "version_range": "current as of 2026-08-15 (08-13 release)"
+ }
+ }
+ },
+ "raccoon-ai": {
+ "reference": "ides/ui-only-mcp.md",
+ "template": "manual-reference"
+ },
+ "replit": {
+ "reference": "ides/replit.md",
+ "template": "manual-reference"
+ },
+ "roo-code": {
+ "reference": "ides/roo-code.md",
+ "template": "legacy-source-only"
+ },
+ "rovodev": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Atlassian Rovo Dev",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "doc_conflicts": [
+ "MCP path documented at ~/.rovodev/mcp.json and ~/.rovodev/mcp_config.json; resolved via config.yml mcpConfigPath probe."
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://support.atlassian.com/rovo/docs/use-agent-skills-in-rovo-dev-cli/"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.rovodev/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.local.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "doc_alternative_paths": [
+ "~/.rovodev/mcp_config.json"
+ ],
+ "format": "json:mcpServers",
+ "path": "~/.rovodev/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".rovodev/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "yaml:prompts",
+ "path": "~/.rovodev/prompts.yml",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "yaml:prompts",
+ "path": ".rovodev/prompts.yml",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.rovodev/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "~/.agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".rovodev/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "subagents": [
+ {
+ "format": "rovodev-subagent",
+ "path": "~/.rovodev/subagents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "rovodev-subagent",
+ "path": ".rovodev/subagents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-15",
+ "version_range": "current as of 2026-08-15"
+ }
+ }
+ },
+ "sourcegraph-amp": {
+ "category": "agent-client",
+ "default_profile": "cli",
+ "display_name": "Sourcegraph Amp",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "detection": [
+ {
+ "command": [
+ "amp"
+ ],
+ "type": "binary",
+ "version_command": [
+ "amp",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.amp/skills",
+ "~/.config/amp/skills",
+ "~/.agents/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.amp",
+ "linux": "~/.amp",
+ "wsl": "~/.amp"
+ },
+ "sources": [
+ "https://ampcode.com/docs/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.amp/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".amp/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "~/.config/amp/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": "~/.agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "supermaven": {
+ "reference": "ides/supermaven.md",
+ "template": "legacy-source-only"
+ },
+ "tabnine": {
+ "reference": "ides/tabnine.md",
+ "template": "manual-reference"
+ },
+ "tencent-codebuddy": {
+ "reference": "ides/tencent-codebuddy.md",
+ "template": "manual-reference"
+ },
+ "tencent-codebuddy-ide": {
+ "reference": "ides/tencent-codebuddy-ide.md",
+ "template": "manual-reference"
+ },
+ "tongyi-lingma": {
+ "alias_of": {
+ "product": "qoder",
+ "profile": "cn-ide"
+ },
+ "reference": "ides/tongyi-lingma.md",
+ "template": "legacy-alias"
+ },
+ "trae": {
+ "category": "agent-client",
+ "default_profile": "ide",
+ "display_name": "TRAE",
+ "lifecycle": "active",
+ "profiles": {
+ "cn-ide": {
+ "detection": [
+ {
+ "darwin_bundle_id": "com.trae.ide.cn",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.trae/skills",
+ "~/.trae/rules"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.trae",
+ "linux": "~/.trae",
+ "windows": "%APPDATA%/TRAE"
+ },
+ "sources": [
+ "https://docs.trae.cn/ide/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "trae-rule",
+ "path": "~/.trae/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "trae-rule",
+ "path": ".trae/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.trae/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".trae/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "ide": {
+ "detection": [
+ {
+ "darwin_bundle_id": "com.trae.ide",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.trae/skills",
+ "~/.trae/rules"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.trae",
+ "linux": "~/.trae",
+ "windows": "%APPDATA%/TRAE"
+ },
+ "sources": [
+ "https://docs.trae.ai/ide/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "trae-rule",
+ "path": "~/.trae/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "trae-rule",
+ "path": ".trae/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.trae/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".trae/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "trae-cn": {
+ "alias_of": {
+ "product": "trae",
+ "profile": "cn-ide"
+ },
+ "reference": "ides/trae-cn.md",
+ "template": "legacy-alias"
+ },
+ "trae-work": {
+ "alias_of": {
+ "product": "trae",
+ "profile": "ide"
+ },
+ "reference": "ides/trae-work.md",
+ "template": "cloud-ui"
+ },
+ "v0": {
+ "reference": "ides/v0.md",
+ "template": "cloud-ui"
+ },
+ "vecli": {
+ "reference": "ides/vecli.md",
+ "template": "manual-reference"
+ },
+ "visual-studio": {
+ "alias_of": {
+ "product": "copilot",
+ "profile": "visual-studio"
+ },
+ "reference": "ides/visual-studio.md",
+ "template": "legacy-alias"
+ },
+ "void-editor": {
+ "reference": "ides/void-editor.md",
+ "template": "legacy-source-only"
+ },
+ "vscode": {
+ "alias_of": {
+ "product": "copilot",
+ "profile": "vscode"
+ },
+ "reference": "ides/vscode.md",
+ "template": "legacy-alias"
+ },
+ "warp": {
+ "category": "agent-client",
+ "default_profile": "desktop",
+ "display_name": "Warp",
+ "lifecycle": "active",
+ "profiles": {
+ "cloud": {
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "note": "Warp Cloud is a cloud-only UI; no local configuration files. Use Warp desktop app or Warp Drive web interface for configuration.",
+ "sources": [
+ "https://app.warp.dev"
+ ],
+ "surfaces": {},
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "desktop": {
+ "detection": [
+ {
+ "darwin_bundle_id": "dev.warp.Warp",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.warp/skills",
+ "~/.warp/drive"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "desktop-agent",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.warp",
+ "linux": "~/.warp",
+ "windows": "%APPDATA%/Warp"
+ },
+ "sources": [
+ "https://docs.warp.dev/agents/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.warp/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.warp/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".warp/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "warp-prompt",
+ "path": "~/.warp/drive/prompts",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "warp-prompt",
+ "path": ".warp/drive/prompts",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.warp/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".warp/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "workflows": [
+ {
+ "format": "warp-workflow",
+ "path": "~/.warp/drive/workflows",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "warp-workflow",
+ "path": ".warp/drive/workflows",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ },
+ "oz-cli": {
+ "detection": [
+ {
+ "command": [
+ "warp"
+ ],
+ "type": "binary",
+ "version_command": [
+ "warp",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.warp/skills",
+ "~/.warp/drive"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "cli",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.warp",
+ "linux": "~/.warp"
+ },
+ "sources": [
+ "https://docs.warp.dev/warp-oz"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "~/.warp/AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "hierarchy"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.warp/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".warp/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "warp-prompt",
+ "path": "~/.warp/drive/prompts",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "warp-prompt",
+ "path": ".warp/drive/prompts",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.warp/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ }
+ ],
+ "workflows": [
+ {
+ "format": "warp-workflow",
+ "path": "~/.warp/drive/workflows",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "warp-workflow",
+ "path": ".warp/drive/workflows",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "warp-oz": {
+ "category": "cloud-agent-cli",
+ "default_profile": "cli",
+ "display_name": "Warp Oz",
+ "lifecycle": "active",
+ "profiles": {
+ "cli": {
+ "kind": "local-and-cloud-cli",
+ "migration_policy": "manual-rebuild",
+ "sources": [
+ "https://docs.warp.dev/reference/cli"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "warp-agent-profile",
+ "path": "--profile",
+ "policy": "manual-template",
+ "scope": "local",
+ "storage": "profile"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "uuid-or-json",
+ "path": "--mcp",
+ "policy": "manual-rebuild",
+ "scope": "run",
+ "storage": "cli-argument"
+ }
+ ],
+ "skills": [
+ {
+ "format": "repository-skill",
+ "path": "--skill",
+ "policy": "manual-rebuild",
+ "scope": "run",
+ "storage": "cli-argument"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "oz; warp-cli deprecated"
+ }
+ }
+ },
+ "windsurf": {
+ "category": "agent-ide",
+ "default_profile": "ide",
+ "display_name": "Windsurf",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "kind": "ide",
+ "migration_policy": "bidirectional-reviewed",
+ "sources": [
+ "https://docs.windsurf.com/windsurf/cascade/skills",
+ "https://docs.windsurf.com/windsurf/cascade/agents-md",
+ "https://docs.windsurf.com/windsurf/cascade/mcp"
+ ],
+ "surfaces": {
+ "generated_memory": [
+ {
+ "path": "~/.codeium/windsurf/memories",
+ "policy": "forbidden-regenerate",
+ "scope": "user",
+ "storage": "generated-state"
+ }
+ ],
+ "instructions": [
+ {
+ "format": "plain-markdown",
+ "path": "~/.codeium/windsurf/memories/global_rules.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "windsurf-rule",
+ "path": ".windsurf/rules",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "directory"
+ },
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.codeium/windsurf/mcp_config.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.codeium/windsurf/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".windsurf/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-12",
+ "version_range": "current as of 2026-08-12"
+ }
+ }
+ },
+ "workbuddy": {
+ "reference": "ides/workbuddy.md",
+ "template": "manual-reference"
+ },
+ "xcode": {
+ "reference": "ides/xcode.md",
+ "template": "manual-reference"
+ },
+ "zcode": {
+ "reference": "ides/zcode.md",
+ "template": "manual-reference"
+ },
+ "zed": {
+ "category": "editor-agent",
+ "default_profile": "ide",
+ "display_name": "Zed",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "detection": [
+ {
+ "command": [
+ "zed"
+ ],
+ "type": "binary",
+ "version_command": [
+ "zed",
+ "--version"
+ ]
+ },
+ {
+ "darwin_bundle_id": "dev.zed.Zed",
+ "type": "app-bundle"
+ },
+ {
+ "paths": [
+ "~/.config/zed/skills",
+ "~/.zed/skills"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.config/zed",
+ "linux": "~/.config/zed",
+ "wsl": "~/.config/zed"
+ },
+ "sources": [
+ "https://zed.dev/docs/skills"
+ ],
+ "surfaces": {
+ "instructions": [
+ {
+ "format": "agents-md",
+ "path": "AGENTS.md",
+ "policy": "semantic-ir-with-loss-report",
+ "scope": "project",
+ "storage": "hierarchy"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".agents/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "zencoder": {
+ "category": "agent-client",
+ "default_profile": "ide",
+ "display_name": "Zencoder",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "detection": [
+ {
+ "command": [
+ "zencoder"
+ ],
+ "type": "binary",
+ "version_command": [
+ "zencoder",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.zencoder/skills",
+ "~/.zencoder/settings.json"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.zencoder",
+ "linux": "~/.zencoder",
+ "windows": "%APPDATA%/Zencoder",
+ "wsl": "~/.zencoder"
+ },
+ "sources": [
+ "https://docs.zencoder.ai/skills"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "zencoder-agent",
+ "path": "~/.zencoder/agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zencoder-agent",
+ "path": ".zencoder/agents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "cloud_task_state": [
+ {
+ "format": "json",
+ "path": "~/.zencoder/cloud_state.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.zencoder/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".zencoder/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "zencoder-prompt",
+ "path": "~/.zencoder/prompts",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zencoder-prompt",
+ "path": ".zencoder/prompts",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "schedules": [
+ {
+ "format": "json",
+ "path": "~/.zencoder/schedules.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json",
+ "path": ".zencoder/schedules.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "settings": [
+ {
+ "format": "json",
+ "path": "~/.zencoder/settings.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json",
+ "path": ".zencoder/settings.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.zencoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".zencoder/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "subagents": [
+ {
+ "format": "zencoder-subagent",
+ "path": "~/.zencoder/subagents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zencoder-subagent",
+ "path": ".zencoder/subagents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "workflows": [
+ {
+ "format": "zencoder-workflow",
+ "path": "~/.zencoder/workflows",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zencoder-workflow",
+ "path": ".zencoder/workflows",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ },
+ "zenflow": {
+ "category": "agent-client",
+ "default_profile": "ide",
+ "display_name": "Zenflow",
+ "lifecycle": "active",
+ "profiles": {
+ "ide": {
+ "detection": [
+ {
+ "command": [
+ "zenflow"
+ ],
+ "type": "binary",
+ "version_command": [
+ "zenflow",
+ "--version"
+ ]
+ },
+ {
+ "paths": [
+ "~/.zenflow/skills",
+ "~/.zenflow/settings.json"
+ ],
+ "type": "file-signature"
+ }
+ ],
+ "kind": "ide-extension",
+ "migration_policy": "bidirectional-reviewed",
+ "platforms": {
+ "darwin": "~/.zenflow",
+ "linux": "~/.zenflow",
+ "windows": "%APPDATA%/Zenflow",
+ "wsl": "~/.zenflow"
+ },
+ "sources": [
+ "https://docs.zenflow.ai/skills"
+ ],
+ "surfaces": {
+ "agents": [
+ {
+ "format": "zenflow-agent",
+ "path": "~/.zenflow/agents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zenflow-agent",
+ "path": ".zenflow/agents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "mcp": [
+ {
+ "format": "json:mcpServers",
+ "path": "~/.zenflow/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json:mcpServers",
+ "path": ".zenflow/mcp.json",
+ "policy": "profile-version-adapter",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "prompts": [
+ {
+ "format": "zenflow-prompt",
+ "path": "~/.zenflow/prompts",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zenflow-prompt",
+ "path": ".zenflow/prompts",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "schedules": [
+ {
+ "format": "json",
+ "path": "~/.zenflow/schedules.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json",
+ "path": ".zenflow/schedules.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "settings": [
+ {
+ "format": "json",
+ "path": "~/.zenflow/settings.json",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "file"
+ },
+ {
+ "format": "json",
+ "path": ".zenflow/settings.json",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "file"
+ }
+ ],
+ "skills": [
+ {
+ "format": "agent-skill",
+ "path": "~/.zenflow/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "agent-skill",
+ "path": ".zenflow/skills",
+ "policy": "validate-then-atomic-copy",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "subagents": [
+ {
+ "format": "zenflow-subagent",
+ "path": "~/.zenflow/subagents",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zenflow-subagent",
+ "path": ".zenflow/subagents",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ],
+ "workflows": [
+ {
+ "format": "zenflow-workflow",
+ "path": "~/.zenflow/workflows",
+ "policy": "manual-template",
+ "scope": "user",
+ "storage": "directory"
+ },
+ {
+ "format": "zenflow-workflow",
+ "path": ".zenflow/workflows",
+ "policy": "manual-template",
+ "scope": "project",
+ "storage": "directory"
+ }
+ ]
+ },
+ "verified_at": "2026-08-16",
+ "version_range": "current as of 2026-08-16"
+ }
+ }
+ }
+ },
+ "profile_templates": {
+ "cloud-ui": {
+ "confidence": "medium",
+ "kind": "cloud-ui",
+ "migration_policy": "official-api-or-rebuild-checklist",
+ "profile": "cloud",
+ "support_level": "manual",
+ "surfaces": {}
+ },
+ "host-editor": {
+ "confidence": "high",
+ "kind": "editor-host",
+ "migration_policy": "manual-rebuild",
+ "profile": "host",
+ "support_level": "host",
+ "surfaces": {}
+ },
+ "legacy-alias": {
+ "confidence": "high",
+ "kind": "brand-alias",
+ "migration_policy": "alias-only",
+ "profile": "alias",
+ "support_level": "alias",
+ "surfaces": {}
+ },
+ "legacy-source-only": {
+ "confidence": "high",
+ "kind": "retired-product",
+ "migration_policy": "source-only",
+ "profile": "legacy",
+ "support_level": "source-only",
+ "surfaces": {}
+ },
+ "manual-reference": {
+ "confidence": "low",
+ "kind": "documented-reference",
+ "migration_policy": "manual-rebuild",
+ "profile": "reference",
+ "support_level": "unverified",
+ "surfaces": {}
+ },
+ "provider": {
+ "confidence": "high",
+ "kind": "mcp-or-memory-provider",
+ "migration_policy": "configure-consuming-client",
+ "profile": "provider",
+ "support_level": "provider",
+ "surfaces": {}
+ }
+ },
+ "schema_version": 2.1,
+ "support_contract": {
+ "alias-only": {
+ "confidence": "high",
+ "support_level": "alias"
+ },
+ "bidirectional-reviewed": {
+ "confidence": "high",
+ "support_level": "partial"
+ },
+ "configure-consuming-client": {
+ "confidence": "high",
+ "support_level": "provider"
+ },
+ "manual-rebuild": {
+ "confidence": "medium",
+ "support_level": "manual"
+ },
+ "manual-template": {
+ "confidence": "medium",
+ "support_level": "manual"
+ },
+ "official-api-or-rebuild-checklist": {
+ "confidence": "medium",
+ "support_level": "manual"
+ },
+ "source-only": {
+ "confidence": "high",
+ "support_level": "source-only"
+ },
+ "stale-manual": {
+ "confidence": "low",
+ "description": "Profile was manual but exceeded freshness window; may have outdated docs/paths",
+ "support_level": "stale-manual"
+ },
+ "stale-partial": {
+ "confidence": "low",
+ "description": "Profile was partial but exceeded freshness window; may have outdated paths/schemas",
+ "support_level": "stale-partial"
+ },
+ "stale-source-only": {
+ "confidence": "low",
+ "description": "Profile was source-only but exceeded freshness window",
+ "support_level": "stale-source-only"
+ }
+ },
+ "verified_at": "2026-08-12"
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/registry-v2.schema.json b/skills/agent-skills-setup/agent-skills-setup/references/registry-v2.schema.json
new file mode 100644
index 000000000..8a115000e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/registry-v2.schema.json
@@ -0,0 +1,106 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "registry-v2.schema.json",
+ "title": "Agent context product profile registry v2",
+ "type": "object",
+ "required": ["schema_version", "verified_at", "object_policies", "support_contract", "profile_templates", "products"],
+ "properties": {
+ "schema_version": {"enum": [2, 2.1]},
+ "verified_at": {"type": "string", "format": "date"},
+ "object_policies": {"type": "object", "additionalProperties": {"type": "string"}},
+ "support_contract": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "required": ["support_level", "confidence"],
+ "properties": {
+ "support_level": {"enum": ["partial", "manual", "source-only", "provider", "host", "alias", "unverified", "stale-partial", "stale-manual", "stale-source-only"]},
+ "confidence": {"enum": ["high", "medium", "low"]},
+ "description": {"type": "string"}
+ },
+ "additionalProperties": false
+ }
+ },
+ "profile_templates": {"type": "object", "additionalProperties": {"$ref": "#/$defs/profile"}},
+ "products": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/$defs/product"
+ }
+ },
+ "$schema": {"type": "string"},
+ "aliases": {"type": "object"},
+ "candidate_discovery": {"type": "object"},
+ "detection_config": {"type": "object"},
+ "freshness": {"type": "object"}
+ },
+ "additionalProperties": false,
+ "$defs": {
+ "surface": {
+ "type": "object",
+ "required": ["scope", "storage", "path", "policy"],
+ "properties": {
+ "scope": {"type": "string", "minLength": 1},
+ "storage": {"type": "string", "minLength": 1},
+ "path": {"type": "string", "minLength": 1},
+ "format": {"type": "string"},
+ "policy": {"type": "string", "minLength": 1},
+ "override_env": {"type": "string"},
+ "override_relative_path": {"type": "string"},
+ "compatibility_paths": {
+ "type": "array",
+ "items": {"type": "string"}
+ },
+ "compatibility_behavior": {"enum": ["alternative", "precedence"]}
+ },
+ "additionalProperties": true
+ },
+ "profile": {
+ "type": "object",
+ "required": ["kind", "migration_policy"],
+ "properties": {
+ "profile": {"type": "string"},
+ "kind": {"type": "string"},
+ "inherits": {"type": "string"},
+ "version_range": {"type": "string"},
+ "verified_at": {"type": "string", "format": "date"},
+ "sources": {
+ "type": "array",
+ "items": {"type": "string", "format": "uri"}
+ },
+ "migration_policy": {"type": "string"},
+ "support_level": {"enum": ["partial", "manual", "source-only", "provider", "host", "alias", "unverified"]},
+ "confidence": {"enum": ["high", "medium", "low"]},
+ "surfaces": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "array",
+ "items": {"$ref": "#/$defs/surface"}
+ }
+ }
+ },
+ "anyOf": [
+ {"required": ["inherits"]},
+ {"required": ["surfaces"]}
+ ]
+ },
+ "product": {
+ "type": "object",
+ "properties": {
+ "display_name": {"type": "string"},
+ "category": {"type": "string"},
+ "lifecycle": {"type": "string"},
+ "template": {"type": "string"},
+ "default_profile": {"type": "string"},
+ "profiles": {
+ "type": "object",
+ "additionalProperties": {"$ref": "#/$defs/profile"}
+ }
+ },
+ "anyOf": [
+ {"required": ["template"]},
+ {"required": ["display_name", "category", "lifecycle", "default_profile", "profiles"]}
+ ]
+ }
+ }
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/references/verification.md b/skills/agent-skills-setup/agent-skills-setup/references/verification.md
new file mode 100644
index 000000000..b9595e415
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/references/verification.md
@@ -0,0 +1,5 @@
+# Verification and evidence
+
+Before apply, record the saved plan path and `plan_sha256`; confirm that Registry, adapter, source/target, and Git provenance validation succeeded. After apply, use `--json` and report scope/status, manifest checksum, canonical paths, source SHA-256 before/after, `source_unchanged`, target existence/hash/parse result, backup, and manual follow-up. Run `verify --manifest ...` against the checksummed manifest. Rollback refuses to overwrite a target changed after apply.
+
+Parse success does not prove transport, protocol compatibility, credentials, OAuth, permissions, or connectivity. Check the target's native discovery surface (for example `claude mcp list`, `codex mcp list`, `opencode mcp list`, `copilot mcp list`, or its MCP panel) and consult [ide-registry.md](ide-registry.md). Apply [mcp-transport.md](mcp-transport.md) rather than adding protocol headers manually.
diff --git a/skills/agent-skills-setup/agent-skills-setup/scripts/README.md b/skills/agent-skills-setup/agent-skills-setup/scripts/README.md
new file mode 100644
index 000000000..e07f61ac6
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/scripts/README.md
@@ -0,0 +1,35 @@
+# Scripts
+
+`smart-ide-migration.sh` is the public wrapper. Its profile-aware commands are
+`detect`, `inventory`, `plan`, `apply`, `verify`, and `rollback`. Always save a
+plan with `plan --output plan.json`; `apply plan.json --yes` verifies the plan
+checksum, Registry digest, adapter versions, resolved source/target state, and
+Git HEAD before any write. Apply emits a checksummed manifest with exact
+backups. `--json` reserves stdout for one JSON document and sends diagnostics
+to stderr.
+
+Legacy discovery and dry-run compatibility require the explicit `legacy`
+subcommand. Calls beginning with implicit legacy flags are rejected. Every
+`legacy --yes` write fails before the retained compatibility engine runs; use a
+saved profile-aware plan. The legacy engine rejects ordinary direct execution.
+
+The Skill declares local environment lookup, file-read, file-write, and bundled
+shell/Python capabilities only; generic migration requests authorize planning,
+while apply and rollback require separate explicit user approval.
+MCP targets that are symbolic links fail before conversion. Redaction cleanup
+can remove only the exact target artifacts; copied-skill cleanup must remain
+inside its canonicalized target copy root.
+
+`scan-skill-secrets.py` checks every regular source file before a Skill copy and
+reports only relative paths and reason categories, never credential values.
+`ide-paths.tsv` is generated from `references/ide-paths.json`; regenerate it
+with `sync-ide-reference-summaries.py`, never edit it directly. `common.sh` is
+an internal helper.
+
+`check-doc-freshness.py` validates source/freshness metadata and provenance
+offline without network access. It verifies schemas, official HTTPS source
+declarations, and verified_at freshness boundaries locally.
+
+`test-*.sh` files are maintainer regression suites run by `bash validate-all.sh`,
+not local-IDE migration commands. Legacy converter suites opt into the private
+guard explicitly; `test-legacy-registry-gate.sh` covers the public boundary.
diff --git a/skills/agent-skills-setup/agent-skills-setup/scripts/acb/__init__.py b/skills/agent-skills-setup/agent-skills-setup/scripts/acb/__init__.py
new file mode 100644
index 000000000..4703fe4d5
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/scripts/acb/__init__.py
@@ -0,0 +1,7 @@
+"""Agent Context Bundle (ACB) support modules.
+
+An ACB is a portable, cross-device snapshot of agent context. It is
+intentionally separated from the migration plan document so that a
+plan (which is bound to a single device's absolute paths) can be
+produced from an ACB on a different device.
+"""
\ No newline at end of file
diff --git a/skills/agent-skills-setup/agent-skills-setup/scripts/acb/bundle.py b/skills/agent-skills-setup/agent-skills-setup/scripts/acb/bundle.py
new file mode 100644
index 000000000..bdc29801e
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/scripts/acb/bundle.py
@@ -0,0 +1,1415 @@
+"""Agent Context Bundle (.acb) creation, verification, and restore.
+
+Layout::
+
+ .acb/
+ manifest.json schema_version, source_platform, objects
+ inventory.json portable per-product surface inventory
+ compatibility.json per-product target-eligibility matrix
+ requirements.json executables, packages, extensions, manual_installs
+ secrets.required.json non-secret names of required credentials
+ reauth.json per-MCP re-auth action list
+ rebuild.json per-object manual-rebuild manifest
+ checksums.json sha256 of every other file
+ objects// reviewed object content (no secrets)
+
+The bundle is created from a snapshot of the local filesystem plus the
+Registry v2 inventory. :func:`verify_bundle` performs closed-world integrity
+checks ensuring no unexpected or missing files, no symlinks/devices, and
+accurate SHA256 hashes.
+"""
+
+from __future__ import annotations
+
+import base64
+import dataclasses
+import hashlib
+import json
+import os
+import re
+import shutil
+import stat
+import tempfile
+import uuid
+from datetime import datetime, timezone
+from pathlib import Path
+from typing import Any
+
+import skill_secret_scanner
+
+ACB_SCHEMA_VERSION = 1
+ACB_MANIFEST_NAME = "manifest.json"
+ACB_INVENTORY_NAME = "inventory.json"
+ACB_COMPATIBILITY_NAME = "compatibility.json"
+ACB_REQUIREMENTS_NAME = "requirements.json"
+ACB_SECRETS_NAME = "secrets.required.json"
+ACB_REAUTH_NAME = "reauth.json"
+ACB_REBUILD_NAME = "rebuild.json"
+ACB_CHECKSUMS_NAME = "checksums.json"
+ACB_OBJECTS_DIR = "objects"
+
+ACB_JSON_FILES = (
+ ACB_MANIFEST_NAME,
+ ACB_INVENTORY_NAME,
+ ACB_COMPATIBILITY_NAME,
+ ACB_REQUIREMENTS_NAME,
+ ACB_SECRETS_NAME,
+ ACB_REAUTH_NAME,
+ ACB_REBUILD_NAME,
+)
+
+# Resource safety limits
+MAX_BUNDLE_FILES = 5000
+MAX_FILE_SIZE = 10 * 1024 * 1024 # 10 MB per file
+MAX_TOTAL_SIZE = 100 * 1024 * 1024 # 100 MB total
+MAX_DIR_DEPTH = 16
+
+# Safe binary extensions allowlist
+SAFE_BINARY_EXTENSIONS = frozenset({
+ ".png", ".jpg", ".jpeg", ".gif", ".webp", ".ico",
+ ".svg", ".woff", ".woff2", ".ttf", ".eot", ".otf"
+})
+
+# Forbidden snapshot policies and non-migratable object types (audit P0-2)
+FORBIDDEN_SNAPSHOT_POLICIES = frozenset({
+ "forbidden-regenerate",
+ "never-migrate",
+ "source-only",
+ "cloud-rebuild",
+ "disabled-draft-only",
+})
+
+FORBIDDEN_SNAPSHOT_OBJECT_TYPES = frozenset({
+ "generated_memory",
+ "session",
+ "chat",
+ "runtime",
+ "database",
+ "trust",
+ "approval",
+ "oauth_state",
+ "credentials",
+})
+
+_SENSITIVE_FILENAME_HINT = re.compile(
+ r"(?i)(^\.env(\..+)?$|\.pem$|\.key$|^id_rsa|^id_ed25519|^id_ecdsa|\.p12$|\.pfx$)"
+)
+
+
+class ACBError(Exception):
+ """Base class for ACB failures."""
+
+
+class ACBSecretLeak(ACBError):
+ """Raised when literal secret values are detected in bundle content."""
+
+
+class ACBIntegrityError(ACBError):
+ """Raised when bundle integrity or containment check fails."""
+
+
+@dataclasses.dataclass
+class ACBManifest:
+ schema_version: int
+ bundle_id: str
+ created_at: str
+ source_platform: dict[str, str]
+ inventory_summary: dict[str, Any]
+ objects: list[dict[str, Any]]
+
+ def to_dict(self) -> dict[str, Any]:
+ return {
+ "schema_version": self.schema_version,
+ "bundle_id": self.bundle_id,
+ "created_at": self.created_at,
+ "source_platform": self.source_platform,
+ "inventory_summary": self.inventory_summary,
+ "objects": self.objects,
+ }
+
+ @classmethod
+ def from_dict(cls, payload: dict[str, Any]) -> "ACBManifest":
+ return cls(
+ schema_version=int(payload["schema_version"]),
+ bundle_id=str(payload["bundle_id"]),
+ created_at=str(payload["created_at"]),
+ source_platform=dict(payload.get("source_platform", {})),
+ inventory_summary=dict(payload.get("inventory_summary", {})),
+ objects=list(payload.get("objects", [])),
+ )
+
+
+def enrich_manifest_object(
+ obj: dict[str, Any],
+ objects_dir_files: dict[str, bytes],
+ adapter_versions: dict[str, str] | None = None,
+ object_file_map: dict[str, list[str]] | None = None,
+) -> dict[str, Any]:
+ """Enrich a manifest object with file list, hashes, and metadata.
+
+ Adds:
+ - object_path: logical path under objects/
+ - files: list of {path, sha256, size} for each file
+ - source_format_version: format version from plan/registry
+ - adapter_version: adapter version used for this object type
+ - portability_mode: "full" | "lossy" | "manual" | "excluded"
+ - content_hash: SHA256 of primary content file (for quick comparison)
+ """
+ obj_dict = dict(obj)
+ obj_type = obj_dict.get("surface") or obj_dict.get("object_type", "")
+ prod = obj_dict.get("product", "")
+ prof = obj_dict.get("profile", "")
+ scp = obj_dict.get("scope", "")
+
+ # Build logical object path
+ obj_key = f"{obj_type}/{prod}/{prof}/{scp}"
+ obj_dict["object_path"] = obj_key
+
+ # Collect files for this object
+ obj_files = []
+ prefix = f"{obj_key}/"
+ primary_hash = None
+
+ if object_file_map is not None and obj_key in object_file_map:
+ file_paths = sorted(set(object_file_map[obj_key]))
+ else:
+ file_paths = sorted([
+ rel_path for rel_path in (objects_dir_files or {}).keys()
+ if rel_path.startswith(prefix)
+ ])
+
+ for rel_path in file_paths:
+ data = (objects_dir_files or {}).get(rel_path, b"")
+ file_hash = hashlib.sha256(data).hexdigest()
+ file_entry = {
+ "path": f"{ACB_OBJECTS_DIR}/{Path(rel_path).as_posix()}",
+ "sha256": file_hash,
+ "size": len(data),
+ }
+ obj_files.append(file_entry)
+ if primary_hash is None:
+ primary_hash = file_hash
+ obj_dict["files"] = obj_files
+ obj_dict["content_hash"] = primary_hash
+
+ # Add source format version and adapter version if available
+ if adapter_versions:
+ obj_dict["adapter_version"] = adapter_versions.get(obj_type, "")
+ # source_format_version would come from plan item; placeholder for now
+ obj_dict["source_format_version"] = obj_dict.get("source_format", "")
+
+ # Determine portability mode from status
+ status = obj_dict.get("status", "")
+ if status == "ready":
+ obj_dict["portability_mode"] = "full"
+ elif status == "ready-lossy":
+ obj_dict["portability_mode"] = "lossy"
+ elif status in ("manual-rebuild", "draft-disabled", "forbidden"):
+ obj_dict["portability_mode"] = "manual"
+ elif status == "excluded":
+ obj_dict["portability_mode"] = "excluded"
+ else:
+ obj_dict["portability_mode"] = "unknown"
+
+ return obj_dict
+
+
+def sha256_text(text: str) -> str:
+ return hashlib.sha256(text.encode("utf-8")).hexdigest()
+
+
+def sha256_bytes(data: bytes) -> str:
+ return hashlib.sha256(data).hexdigest()
+
+
+def sha256_file(path: Path) -> str:
+ return sha256_bytes(path.read_bytes())
+
+
+def is_binary_bytes(data: bytes) -> bool:
+ """Determine whether data is non-text binary."""
+ if b"\x00" in data:
+ return True
+ try:
+ data.decode("utf-8")
+ return False
+ except UnicodeDecodeError:
+ return True
+
+
+def looks_like_secret_value(value: Any) -> bool:
+ """Heuristic check: does this string look like a literal credential?
+
+ Uses the SAME unified scanner as Skills/objects (audit #6) so that only
+ genuine credential SHAPES are flagged — provider tokens, private-key
+ blocks, or ``key=value`` / ``key: value`` assignments — not prose that
+ merely mentions words like "secret" or "token".
+ """
+ if not isinstance(value, str):
+ return False
+ if not value or value.startswith("${") or value.startswith("$") or value.startswith("<"):
+ return False
+ return skill_secret_scanner.finding_reason(value.encode("utf-8")) is not None
+
+
+def scan_object_bytes(data: bytes, path_name: str) -> None:
+ """Perform strict secret, private-key, and binary safety scans on raw object bytes."""
+ path = Path(path_name)
+ base_name = path.name
+
+ # 1. Block sensitive file names (.env, private keys, certificates)
+ if _SENSITIVE_FILENAME_HINT.search(base_name):
+ raise ACBSecretLeak(f"forbidden sensitive file in bundle: {path_name}")
+
+ # 2. Check binary safety
+ if is_binary_bytes(data):
+ # Check executable magic headers
+ if data.startswith(b"\x7fELF"):
+ raise ACBSecretLeak(f"executable ELF binary rejected: {path_name}")
+ if data.startswith((b"\xfe\xed\xfa\xce", b"\xfe\xed\xfa\xcf", b"\xcf\xfa\xed\xfe", b"\xca\xfe\xba\xbe")):
+ raise ACBSecretLeak(f"executable Mach-O binary rejected: {path_name}")
+ if data.startswith(b"MZ"):
+ raise ACBSecretLeak(f"executable PE binary rejected: {path_name}")
+
+ # Check extension against binary allowlist
+ ext = path.suffix.lower()
+ if ext not in SAFE_BINARY_EXTENSIONS:
+ raise ACBSecretLeak(f"unallowlisted binary file rejected: {path_name}")
+ return
+
+ # 3. Unified generic secret scan. Reuses skill_secret_scanner.finding_reason
+ # so that credentials are detected identically across the Skill scanner and
+ # ACB objects (audit #6): private keys, provider patterns, Bearer tokens,
+ # connection-string userinfo, and literal credential assignments
+ # (password=, client_secret:, DATABASE_URL with embedded creds, etc.).
+ secret_reason = skill_secret_scanner.finding_reason(data)
+ if secret_reason is not None:
+ raise ACBSecretLeak(f"{secret_reason} in {path_name}")
+
+ # 4. Require clean UTF-8 text for non-binary allowlisted content.
+ try:
+ data.decode("utf-8")
+ except UnicodeDecodeError:
+ raise ACBSecretLeak(f"undecodable non-allowlisted text: {path_name}")
+
+
+def assert_no_lateral_secrets(payload: dict[str, Any]) -> None:
+ """Reject literal secret-looking strings in a structured payload."""
+ for key, value in _walk(payload):
+ if isinstance(value, str) and looks_like_secret_value(value):
+ if key.endswith(".name") or key == "name":
+ if isinstance(value, str) and re.match(r"^[A-Z][A-Z0-9_]+$", value):
+ continue
+ raise ACBSecretLeak(
+ f"literal credential-looking string at {key}: {value[:32]!r}"
+ )
+
+
+def _walk(payload: Any, path: tuple[str, ...] = ()) -> Any:
+ if isinstance(payload, dict):
+ for key, value in payload.items():
+ yield from _walk(value, path + (str(key),))
+ elif isinstance(payload, list):
+ for index, value in enumerate(payload):
+ yield from _walk(value, path + (f"[{index}]",))
+ else:
+ yield ".".join(path), payload
+
+
+def validate_path_containment(relative_path: str | Path, base_dir: Path) -> Path:
+ """Ensure path has no absolute segments, traversal, drive specifiers, and stays within base_dir."""
+ p_str = str(relative_path).replace("\\", "/")
+ if p_str.startswith("/") or re.match(r"^[a-zA-Z]:", p_str) or p_str.startswith("//"):
+ raise ACBIntegrityError(f"forbidden absolute/UNC path: {relative_path}")
+ parts = Path(p_str).parts
+ if ".." in parts or any(part.startswith("/") for part in parts):
+ raise ACBIntegrityError(f"path traversal detected: {relative_path}")
+ resolved_target = (base_dir / p_str).resolve()
+ try:
+ resolved_target.relative_to(base_dir.resolve())
+ except ValueError:
+ raise ACBIntegrityError(f"path escapes base directory: {relative_path}")
+ return resolved_target
+
+
+def sanitize_inventory_for_bundle(rows: list[dict[str, Any]]) -> list[dict[str, Any]]:
+ """Sanitize inventory rows for portable bundles by stripping machine-specific paths and local user info."""
+ clean_rows: list[dict[str, Any]] = []
+ for row in rows:
+ clean_row = {
+ "product": row.get("product", ""),
+ "profile": row.get("profile", "default"),
+ "object_type": row.get("object_type", ""),
+ "scope": row.get("scope", ""),
+ "canonical_path": row.get("canonical_path", ""),
+ "format": row.get("format", ""),
+ "policy": row.get("policy", ""),
+ "content_hash": row.get("content_hash", ""),
+ "exists": bool(row.get("exists", False)),
+ }
+ clean_rows.append(clean_row)
+ return clean_rows
+
+
+def collect_requirements(
+ inventory_rows: list[dict[str, Any]],
+ plan_rows: list[dict[str, Any]],
+ objects_dir_files: dict[str, bytes] | None = None,
+) -> tuple[dict[str, Any], dict[str, int]]:
+ """Compute bundle-level prerequisites and surface parse failures.
+
+ Audit P1-2 (0.8.27): never silently swallow MCP parse failures. If a
+ Gemini / Augment / VS Code / Qoder settings.json changes shape and we
+ cannot extract its MCP servers, we record the failure in ``summary``
+ rather than emitting a "successful" bundle with missing data.
+
+ Returns ``(requirements, summary)`` where summary contains:
+ - parse_failed: count of MCP sources we could not parse
+ - parse_failed_details: list[dict] with per-source error context
+ """
+ executables: set[str] = set()
+ extensions: set[str] = set()
+ packages: list[dict[str, str]] = []
+ manual_installs: list[str] = []
+ platform_notes: list[str] = []
+ parse_failed_details: list[dict[str, str]] = []
+
+ def _record_parse_failure(source_label: str, error: Exception) -> None:
+ parse_failed_details.append(
+ {"source": source_label, "error": str(error)}
+ )
+
+ def _normalize_package_name(name: str, manager: str) -> str:
+ """Normalize package name by stripping version suffixes and common prefixes."""
+ # Remove version specifiers (@version, @latest, etc.)
+ if "@" in name and not name.startswith("@"):
+ name = name.split("@")[0]
+ # Remove common prefixes
+ for prefix in ["npm:", "pypi:", "github:"]:
+ if name.startswith(prefix):
+ name = name[len(prefix):]
+ return name
+
+ def _add_package(manager: str, name: str) -> None:
+ """Add a package with normalized name."""
+ normalized = _normalize_package_name(name, manager)
+ if normalized:
+ packages.append({"manager": manager, "name": normalized})
+
+ # 1. Inspect captured raw object files for MCP server requirements
+ if objects_dir_files:
+ for rel, data in objects_dir_files.items():
+ if rel.startswith("mcp/"):
+ try:
+ doc = json.loads(data.decode("utf-8"))
+ servers = doc.get("mcpServers") or doc.get("servers") or {}
+ if isinstance(servers, dict):
+ for _, s_cfg in servers.items():
+ if isinstance(s_cfg, dict):
+ cmd = s_cfg.get("command") or s_cfg.get("runner") or ""
+ if cmd and not str(cmd).endswith(".json") and not str(cmd).startswith("~"):
+ executables.add(str(cmd))
+ args = s_cfg.get("args") or []
+ if isinstance(args, list):
+ for arg in args:
+ if isinstance(arg, str):
+ if arg.startswith("@") or "mcp-server" in arg:
+ _add_package("npm" if cmd in ("npx", "npm", "node") else "auto", arg)
+ # VS Code extension IDs in args (e.g., "ms-vscode.cpptools")
+ elif "." in arg and not arg.endswith((".py", ".js", ".json")) and "/" not in arg:
+ extensions.add(arg)
+ # Python/JS script paths - these are manual installs, not packages
+ elif arg.endswith(".py") or arg.endswith(".js"):
+ manual_installs.append(arg)
+ except Exception as error:
+ _record_parse_failure(f"objects_dir_files:{rel}", error)
+
+ # 2. Inspect plan items to discover required tools & packages from disk sources
+ for item in plan_rows:
+ if item.get("status") not in {"ready", "ready-lossy", "draft-disabled", "manual-rebuild"}:
+ continue
+ obj_type = item.get("object_type")
+ if obj_type == "mcp":
+ src = item.get("source") or {}
+ resolved = src.get("resolved_path")
+ if resolved and Path(resolved).is_file():
+ try:
+ raw_text = Path(resolved).read_text(encoding="utf-8")
+ from migration_core import parse_mcp_document
+ servers = parse_mcp_document(raw_text, src.get("source_format", "json:mcpServers"))
+ for s in servers:
+ if s.command and not str(s.command).endswith(".json") and not str(s.command).startswith("~"):
+ executables.add(str(s.command))
+ for arg in s.args:
+ if isinstance(arg, str):
+ if arg.startswith("@") or "mcp-server" in arg:
+ _add_package("npm" if s.command in ("npx", "npm", "node") else "auto", arg)
+ elif "." in arg and not arg.endswith((".py", ".js", ".json")) and "/" not in arg:
+ extensions.add(arg)
+ elif arg.endswith(".py") or arg.endswith(".js"):
+ manual_installs.append(arg)
+ except Exception as error:
+ src_label = (
+ f"plan_item:{src.get('product', '')}/{src.get('profile', '')}"
+ f"/{src.get('scope', '')}:{resolved}"
+ )
+ _record_parse_failure(src_label, error)
+ elif obj_type in ("skills", "instructions"):
+ # Skills and instructions may require the target IDE to be installed
+ tgt = item.get("target") or {}
+ tgt_product = tgt.get("product", "")
+ if tgt_product:
+ # Add platform-specific notes about required IDE
+ platform_notes.append(f"Target {tgt_product} must be installed to use {obj_type}")
+
+ clean_packages = []
+ seen_pkg = set()
+ for p in packages:
+ key = (p.get("manager"), p.get("name"))
+ if key not in seen_pkg:
+ seen_pkg.add(key)
+ clean_packages.append(p)
+
+ requirements = {
+ "executables": sorted(executables),
+ "extensions": sorted(extensions),
+ "packages": clean_packages,
+ "manual_installs": sorted(set(manual_installs)),
+ "platform_notes": platform_notes,
+ }
+ summary = {
+ "parse_failed": len(parse_failed_details),
+ "parse_failed_details": parse_failed_details,
+ }
+ return requirements, summary
+
+
+def collect_reauth(
+ plan_rows: list[dict[str, Any]],
+) -> list[dict[str, str]]:
+ actions: list[dict[str, str]] = []
+ for item in plan_rows:
+ if item.get("status") == "manual-rebuild" and item.get("object_type") == "mcp":
+ src = item.get("source") or {}
+ actions.append(
+ {
+ "object_id": item.get("object_id", ""),
+ "reason": item.get("reason", "OAuth re-auth required"),
+ "action": "Open the target product's MCP UI, sign in, and re-add the server.",
+ "source": {
+ "package": src.get("package", ""),
+ "command": src.get("command", ""),
+ },
+ }
+ )
+ return actions
+
+
+def collect_rebuild(
+ plan_rows: list[dict[str, Any]],
+) -> list[dict[str, str]]:
+ actions: list[dict[str, str]] = []
+ for item in plan_rows:
+ if item.get("status") in {"manual-rebuild", "forbidden"}:
+ actions.append(
+ {
+ "object_id": item.get("object_id", ""),
+ "object_type": item.get("object_type", ""),
+ "reason": item.get("reason", ""),
+ "actions": item.get("manual_actions", []),
+ }
+ )
+ return actions
+
+
+def write_bundle(
+ *,
+ bundle_root: Path,
+ manifest: ACBManifest,
+ inventory_rows: list[dict[str, Any]],
+ compatibility: dict[str, Any],
+ requirements: dict[str, Any],
+ secrets_required: list[dict[str, str]],
+ reauth: list[dict[str, str]],
+ rebuild: list[dict[str, str]],
+ objects_dir_files: dict[str, bytes] | None = None,
+ adapter_versions: dict[str, str] | None = None,
+ object_file_map: dict[str, list[str]] | None = None,
+) -> Path:
+ """Write a fully-formed, closed-world ACB at ``bundle_root`` atomically.
+
+ Staging & Atomic Swap with Rollback Protection (audit P1-7):
+ 1. Writes all JSON payloads, object files, and checksums to a temporary staging directory
+ on the same filesystem.
+ 2. Performs byte-level secret scanning and path containment checks during staging.
+ 3. Runs verify_bundle() on the staged bundle.
+ 4. Upon successful verification, atomically replaces staging into bundle_root via backup/rename.
+ 5. If any error occurs during write, verification, or replace, rolls back cleanly.
+ """
+ bundle_root = bundle_root.resolve()
+ parent_dir = bundle_root.parent
+ parent_dir.mkdir(parents=True, exist_ok=True)
+
+ staging_dir = Path(tempfile.mkdtemp(prefix=f".tmp_{bundle_root.name}_", dir=parent_dir))
+ backup_dir: Path | None = None
+ try:
+ objects_root = staging_dir / ACB_OBJECTS_DIR
+ objects_root.mkdir(parents=True, exist_ok=True)
+
+ # Sanitize inventory for portable bundle
+ portable_inventory = sanitize_inventory_for_bundle(inventory_rows)
+
+ # Build 1:1 object-to-file mapping for manifest with rich metadata
+ enriched_manifest_objects = []
+ for obj in manifest.objects:
+ enriched = enrich_manifest_object(
+ obj, objects_dir_files, adapter_versions, object_file_map
+ )
+ enriched_manifest_objects.append(enriched)
+
+ manifest_payload = manifest.to_dict()
+ manifest_payload["objects"] = enriched_manifest_objects
+
+ json_payloads: dict[str, dict[str, Any]] = {
+ ACB_MANIFEST_NAME: manifest_payload,
+ ACB_INVENTORY_NAME: {"rows": portable_inventory},
+ ACB_COMPATIBILITY_NAME: compatibility,
+ ACB_REQUIREMENTS_NAME: requirements,
+ ACB_SECRETS_NAME: {"items": secrets_required},
+ ACB_REAUTH_NAME: {"items": reauth},
+ ACB_REBUILD_NAME: {"items": rebuild},
+ }
+ for name, payload in json_payloads.items():
+ assert_no_lateral_secrets(payload)
+ (staging_dir / name).write_text(
+ json.dumps(payload, indent=2, sort_keys=True) + "\n",
+ encoding="utf-8",
+ )
+
+ # Verify and write raw object files with byte-level scanning
+ total_bytes = 0
+ file_count = 0
+ if objects_dir_files:
+ for relative, data in sorted(objects_dir_files.items()):
+ file_count += 1
+ total_bytes += len(data)
+ if file_count > MAX_BUNDLE_FILES:
+ raise ACBError(f"bundle file count exceeded limit ({MAX_BUNDLE_FILES})")
+ if len(data) > MAX_FILE_SIZE:
+ raise ACBError(f"file size exceeded limit ({MAX_FILE_SIZE} bytes): {relative}")
+ if total_bytes > MAX_TOTAL_SIZE:
+ raise ACBError(f"bundle total size exceeded limit ({MAX_TOTAL_SIZE} bytes)")
+
+ # Strict byte-level secret and binary scan
+ scan_object_bytes(data, relative)
+
+ # Strict path containment check
+ target = validate_path_containment(relative, objects_root)
+ target.parent.mkdir(parents=True, exist_ok=True)
+ target.write_bytes(data)
+
+ # Post-write directory-wide secret scan
+ for p in staging_dir.rglob("*"):
+ if p.is_file() and p.name != ACB_CHECKSUMS_NAME:
+ scan_object_bytes(p.read_bytes(), str(p.relative_to(staging_dir)))
+
+ # Compute checksums for all written files
+ checksums: dict[str, str] = {}
+ for name in ACB_JSON_FILES:
+ checksums[name] = sha256_file(staging_dir / name)
+ for relative_path in sorted((objects_dir_files or {}).keys()):
+ norm_path = Path(relative_path).as_posix()
+ checksums[f"{ACB_OBJECTS_DIR}/{norm_path}"] = sha256_file(
+ objects_root / norm_path
+ )
+ (staging_dir / ACB_CHECKSUMS_NAME).write_text(
+ json.dumps(checksums, indent=2, sort_keys=True) + "\n",
+ encoding="utf-8",
+ )
+
+ # Validate staging directory before atomic replace
+ verify_errors = verify_bundle(staging_dir)
+ if verify_errors:
+ raise ACBIntegrityError(f"staged bundle failed verification: {verify_errors}")
+
+ # Atomic replace with rollback protection (audit P1-7)
+ if bundle_root.exists():
+ backup_dir = Path(tempfile.mkdtemp(prefix=f".bak_{bundle_root.name}_", dir=parent_dir))
+ backup_target = backup_dir / "old_bundle"
+ bundle_root.rename(backup_target)
+
+ try:
+ staging_dir.rename(bundle_root)
+ if backup_dir and backup_dir.exists():
+ shutil.rmtree(backup_dir, ignore_errors=True)
+ except Exception:
+ # If staging rename failed, restore the previous bundle from backup
+ if backup_dir and (backup_dir / "old_bundle").exists() and not bundle_root.exists():
+ (backup_dir / "old_bundle").rename(bundle_root)
+ shutil.rmtree(backup_dir, ignore_errors=True)
+ raise
+
+ return bundle_root
+
+ except Exception:
+ if staging_dir.exists():
+ shutil.rmtree(staging_dir, ignore_errors=True)
+ raise
+
+
+def collect_source_objects(
+ registry: Any,
+ rows: list[dict[str, Any]],
+ *,
+ home: Path | None = None,
+ workspace: Path | None = None,
+ source_product: str | None = None,
+ source_profile: str | None = None,
+ allowed_scopes: set[str] | None = None,
+ allowed_object_types: set[str] | None = None,
+ plan_items: list[dict[str, Any]] | None = None,
+) -> tuple[dict[str, bytes], dict[str, int], dict[str, list[str]]]:
+ """Walk plan items and copy source files into stable paths under ``objects/``.
+
+ Audit P1-1 (0.8.27): primary iteration is over plan_items. Each
+ selected PlanItem is processed by reading ``item.source.resolved_path``
+ directly; inventory rows are consulted only as a metadata lookup for
+ fields plan_items do not carry (canonical_path, source_format, storage,
+ policy). This eliminates the previous "row-driven" path that silently
+ widened a single Instructions plan item to every Instructions row in
+ the same profile/scope, and that overwrote canonical/compatibility
+ conflicts at the same bundle-relative path.
+
+ Audit P1-2 (0.8.27): each portable object outcome is tracked in
+ ``summary`` with explicit statuses:
+ - captured - bytes written under objects/
+ - manual_rebuild - plan status=manual-rebuild (no source to extract)
+ - excluded_by_policy - forbidden policy, scope, or object type
+ - parse_failed - source path missing, unreadable, or parse error
+ - secret_rejected - sensitive filename or secret scan hit
+ - conflict - same bundle-relative path mapped from multiple sources
+
+ Audit P0-2: returns explicit 1:1 ``object_file_map`` tracking which
+ files under ``objects/`` belong to each (object_type, product, profile, scope).
+
+ Strict Allowlist (audit P0-2 & 0.8.25):
+ - Refuses forbidden policies (forbidden-regenerate, never-migrate, source-only, etc.)
+ - Refuses non-migratable types (generated_memory, session, chat, runtime, database, trust, etc.)
+ - Only collects requested scopes and requested object types
+
+ Returns ``(objects, summary, object_file_map)``.
+ """
+ objects: dict[str, bytes] = {}
+ object_file_map: dict[str, list[str]] = {}
+ summary: dict[str, int] = {
+ "captured": 0,
+ "manual_rebuild": 0,
+ "excluded_by_policy": 0,
+ "parse_failed": 0,
+ "secret_rejected": 0,
+ "conflict": 0,
+ }
+ # Audit P1-1: detect alias / canonical-vs-compatibility conflicts where
+ # two distinct sources collapse to the same bundle-relative path.
+ seen_relative_sources: dict[str, set[str]] = {}
+
+ def _record(status: str) -> None:
+ summary[status] = summary.get(status, 0) + 1
+
+ # Build (product, profile, object_type, scope) -> inventory row index.
+ # Plan items don't carry storage/format/policy, so rows remain the
+ # canonical metadata source for those fields.
+ row_index: dict[tuple[str, str, str, str], dict[str, Any]] = {}
+ for row in rows:
+ key = (
+ row.get("product", ""),
+ row.get("profile", ""),
+ row.get("object_type", ""),
+ row.get("scope", ""),
+ )
+ row_index.setdefault(key, row)
+
+ def _process_plan_item(item: dict[str, Any]) -> None:
+ src = item.get("source") or {}
+ obj_type = item.get("object_type") or ""
+ prod = src.get("product") or ""
+ prof = src.get("profile") or ""
+ scope = src.get("scope") or ""
+ resolved_path = src.get("resolved_path")
+ item_status = item.get("status") or ""
+
+ obj_key = f"{obj_type}/{prod}/{prof}/{scope}"
+
+ # source_product / source_profile are passed only in single-source
+ # mode. In all-installed mode they are None, so this is a no-op.
+ if source_product and prod != source_product:
+ return
+ if source_profile and prof != source_profile:
+ return
+
+ if allowed_object_types is not None and obj_type not in allowed_object_types:
+ _record("excluded_by_policy")
+ return
+ if allowed_scopes is not None and scope not in allowed_scopes:
+ _record("excluded_by_policy")
+ return
+ if item_status == "manual-rebuild":
+ _record("manual_rebuild")
+ return
+
+ row = row_index.get((prod, prof, obj_type, scope)) or {}
+ policy = row.get("policy") or ""
+ if policy in FORBIDDEN_SNAPSHOT_POLICIES:
+ _record("excluded_by_policy")
+ return
+ if obj_type in FORBIDDEN_SNAPSHOT_OBJECT_TYPES:
+ _record("excluded_by_policy")
+ return
+
+ if not resolved_path:
+ _record("parse_failed")
+ return
+ source_path = Path(resolved_path)
+ if not source_path.exists() or source_path.is_symlink():
+ _record("parse_failed")
+ return
+
+ canonical = row.get("canonical_path") or source_path.name
+ relative = _path_for_object(obj_type, prod, prof, scope, canonical)
+
+ storage = row.get("storage") or ""
+ format_name = row.get("source_format") or row.get("format") or ""
+
+ # Conflict detection (audit P1-1): two distinct sources collapsing
+ # to the same bundle-relative path is recorded as a conflict rather
+ # than silently overwriting the first write.
+ source_id = f"{prod}/{prof}/{obj_type}/{scope}@{resolved_path}"
+ seen = seen_relative_sources.setdefault(relative, set())
+ if seen and source_id not in seen:
+ _record("conflict")
+ return
+ seen.add(source_id)
+
+ if _SENSITIVE_FILENAME_HINT.search(source_path.name):
+ _record("secret_rejected")
+ return
+
+ try:
+ if source_path.is_file():
+ if obj_type == "mcp" or storage == "config-subobject":
+ if obj_type == "mcp":
+ # MCP objects never travel as raw bytes (clawscan
+ # 0.8.30): shared host settings files such as
+ # ~/.gemini/settings.json or ~/.claude.json carry
+ # sibling state the skill promises not to copy.
+ # Extract only the authorized servers subobject;
+ # an undecodable document is a policy exclusion,
+ # never a raw-copy fallback.
+ from migration_core import parse_mcp_document, emit_mcp_document
+ try:
+ raw_text = source_path.read_text(encoding="utf-8")
+ servers = parse_mcp_document(raw_text, format_name)
+ except ValueError:
+ _record("excluded_by_policy")
+ return
+ emitted_text, _ = emit_mcp_document(servers, format_name)
+ objects[relative] = emitted_text.encode("utf-8")
+ object_file_map.setdefault(obj_key, []).append(relative)
+ elif obj_type == "instructions":
+ from migration_core import parse_instruction, emit_instruction
+ raw_text = source_path.read_text(encoding="utf-8")
+ instruction = parse_instruction(raw_text, format_name, scope, storage)
+ emitted_text, _ = emit_instruction(instruction, format_name)
+ objects[relative] = emitted_text.encode("utf-8")
+ object_file_map.setdefault(obj_key, []).append(relative)
+ else:
+ # Refuse to copy raw host config files for unsupported
+ # subobject types. Audit P1-2: this is an explicit
+ # policy exclusion, not a silent skip.
+ _record("excluded_by_policy")
+ return
+ else:
+ objects[relative] = source_path.read_bytes()
+ object_file_map.setdefault(obj_key, []).append(relative)
+ elif source_path.is_dir():
+ start_keys = set(objects.keys())
+ _collect_tree(source_path, relative, objects, depth=0)
+ new_keys = set(objects.keys()) - start_keys
+ object_file_map.setdefault(obj_key, []).extend(sorted(new_keys))
+ else:
+ _record("parse_failed")
+ return
+ except ACBSecretLeak:
+ _record("secret_rejected")
+ return
+ except Exception as error:
+ # Audit P1-2: surface parse failures; do not silently skip a
+ # requested portable object. The summary records parse_failed, and
+ # we re-raise so run_snapshot can decide whether to fail the
+ # snapshot rather than emit a "successful" bundle with missing
+ # data.
+ _record("parse_failed")
+ raise ACBError(
+ f"snapshot parse failed for portable object {relative}: {error}"
+ ) from error
+
+ _record("captured")
+
+ def _process_inventory_row(row: dict[str, Any]) -> None:
+ """Legacy path used only when plan_items is None (single-source mode)."""
+ if not row.get("exists"):
+ return
+ if source_product and row.get("product") != source_product:
+ return
+ if source_profile and row.get("profile") != source_profile:
+ return
+
+ object_type = row.get("object_type") or ""
+ if not object_type:
+ return
+ policy = row.get("policy") or ""
+ scope = row.get("scope") or "unknown"
+ product = row.get("product") or ""
+ profile = row.get("profile") or "default"
+
+ obj_key = f"{object_type}/{product}/{profile}/{scope}"
+
+ if policy in FORBIDDEN_SNAPSHOT_POLICIES:
+ _record("excluded_by_policy")
+ return
+ if object_type in FORBIDDEN_SNAPSHOT_OBJECT_TYPES:
+ _record("excluded_by_policy")
+ return
+ if allowed_scopes is not None and scope not in allowed_scopes:
+ _record("excluded_by_policy")
+ return
+ if allowed_object_types is not None and object_type not in allowed_object_types:
+ _record("excluded_by_policy")
+ return
+
+ resolved = row.get("resolved_path")
+ if not isinstance(resolved, str):
+ _record("parse_failed")
+ return
+ source_path = Path(resolved)
+ if not source_path.exists() or source_path.is_symlink():
+ _record("parse_failed")
+ return
+
+ canonical = row.get("canonical_path") or source_path.name
+ relative = _path_for_object(object_type, product, profile, scope, canonical)
+
+ storage = row.get("storage") or ""
+ format_name = row.get("source_format") or row.get("format") or ""
+
+ try:
+ if source_path.is_file():
+ if _SENSITIVE_FILENAME_HINT.search(source_path.name):
+ _record("secret_rejected")
+ return
+ if object_type == "mcp" or storage == "config-subobject":
+ if object_type == "mcp":
+ # Same subobject-only contract as the plan-item
+ # path: shared host settings files must never be
+ # bundled as raw bytes.
+ from migration_core import parse_mcp_document, emit_mcp_document
+ try:
+ raw_text = source_path.read_text(encoding="utf-8")
+ servers = parse_mcp_document(raw_text, format_name)
+ except ValueError:
+ _record("excluded_by_policy")
+ return
+ emitted_text, _ = emit_mcp_document(servers, format_name)
+ objects[relative] = emitted_text.encode("utf-8")
+ object_file_map.setdefault(obj_key, []).append(relative)
+ elif object_type == "instructions":
+ from migration_core import parse_instruction, emit_instruction
+ raw_text = source_path.read_text(encoding="utf-8")
+ instruction = parse_instruction(raw_text, format_name, scope, storage)
+ emitted_text, _ = emit_instruction(instruction, format_name)
+ objects[relative] = emitted_text.encode("utf-8")
+ object_file_map.setdefault(obj_key, []).append(relative)
+ else:
+ _record("excluded_by_policy")
+ return
+ else:
+ objects[relative] = source_path.read_bytes()
+ object_file_map.setdefault(obj_key, []).append(relative)
+ elif source_path.is_dir():
+ start_keys = set(objects.keys())
+ _collect_tree(source_path, relative, objects, depth=0)
+ new_keys = set(objects.keys()) - start_keys
+ object_file_map.setdefault(obj_key, []).extend(sorted(new_keys))
+ else:
+ _record("parse_failed")
+ return
+ except ACBSecretLeak:
+ _record("secret_rejected")
+ return
+ except Exception as error:
+ _record("parse_failed")
+ raise ACBError(
+ f"snapshot parse failed for {relative}: {error}"
+ ) from error
+ _record("captured")
+
+ if plan_items is not None:
+ for item in plan_items:
+ _process_plan_item(item)
+ else:
+ for row in rows:
+ _process_inventory_row(row)
+
+ return objects, summary, object_file_map
+
+
+def _collect_tree(dir_path: Path, prefix: str, out: dict[str, bytes], depth: int = 0) -> None:
+ if depth > MAX_DIR_DEPTH:
+ return
+ for item in sorted(dir_path.iterdir()):
+ if item.is_symlink():
+ continue
+ if _SENSITIVE_FILENAME_HINT.search(item.name):
+ continue
+ rel = f"{prefix}/{item.name}"
+ if item.is_file():
+ out[rel] = item.read_bytes()
+ elif item.is_dir():
+ _collect_tree(item, rel, out, depth + 1)
+
+
+def _path_for_object(
+ object_type: str, product: str, profile: str, scope: str, canonical: str
+) -> str:
+ """Build a sanitized stable relative path under ``objects/``."""
+ safe_canonical = canonical.strip("/\\").replace("~", "home").replace("..", "_")
+ safe_canonical = re.sub(r"[/\\:]+", "/", safe_canonical)
+ return f"{object_type}/{product}/{profile}/{scope}/{safe_canonical}"
+
+
+def restore_bundle_objects(
+ bundle_root: Path,
+ destination_root: Path,
+ *,
+ dry_run: bool = False,
+) -> dict[str, Any]:
+ """Extract files from ``bundle/objects/`` safely into destination tree."""
+ bundle_root = bundle_root.resolve()
+ destination_root = destination_root.resolve()
+ objects_root = bundle_root / ACB_OBJECTS_DIR
+ if not objects_root.is_dir():
+ raise ACBError(f"bundle has no objects/ directory: {bundle_root}")
+ written: list[dict[str, Any]] = []
+ skipped: list[dict[str, str]] = []
+ for source in sorted(objects_root.rglob("*")):
+ if not source.is_file() or source.is_symlink():
+ continue
+ relative = source.relative_to(objects_root).as_posix()
+ try:
+ target = validate_path_containment(relative, destination_root)
+ if target.is_symlink():
+ raise ACBIntegrityError(f"target path is a symlink: {target}")
+ except ACBIntegrityError as error:
+ skipped.append({"path": relative, "reason": str(error)})
+ continue
+
+ try:
+ data = source.read_bytes()
+ scan_object_bytes(data, relative)
+ except ACBSecretLeak as error:
+ skipped.append({"path": relative, "reason": str(error)})
+ continue
+
+ if not dry_run:
+ target.parent.mkdir(parents=True, exist_ok=True)
+ target.write_bytes(data)
+ written.append(
+ {
+ "path": relative,
+ "sha256": sha256_file(source),
+ "size": source.stat().st_size,
+ }
+ )
+ return {
+ "bundle": str(bundle_root),
+ "destination": str(destination_root),
+ "written": written,
+ "skipped": skipped,
+ "dry_run": dry_run,
+ }
+
+
+def verify_bundle(bundle_root: Path) -> list[str]:
+ """Perform closed-world verification of ACB bundle integrity."""
+ bundle_root = bundle_root.resolve()
+ if not bundle_root.is_dir():
+ return [f"bundle directory not found: {bundle_root}"]
+
+ checksums_path = bundle_root / ACB_CHECKSUMS_NAME
+ if not checksums_path.is_file() or checksums_path.is_symlink():
+ return [f"missing or invalid {ACB_CHECKSUMS_NAME}"]
+
+ try:
+ checksums = json.loads(checksums_path.read_text(encoding="utf-8"))
+ except Exception as error:
+ return [f"corrupted {ACB_CHECKSUMS_NAME}: {error}"]
+
+ errors: list[str] = []
+
+ # 1. Closed-world file enumeration: actual files == expected files
+ expected_files = set(checksums.keys())
+ actual_files: set[str] = set()
+
+ for path in sorted(bundle_root.rglob("*")):
+ # Reject non-regular files: symlinks, sockets, FIFOs, devices
+ st = path.lstat()
+ if stat.S_ISLNK(st.st_mode) or stat.S_ISFIFO(st.st_mode) or stat.S_ISSOCK(st.st_mode) or stat.S_ISCHR(st.st_mode) or stat.S_ISBLK(st.st_mode):
+ errors.append(f"illegal non-regular file in bundle: {path.relative_to(bundle_root).as_posix()}")
+ continue
+ if path.is_file():
+ rel_posix = path.relative_to(bundle_root).as_posix()
+ if rel_posix not in (ACB_CHECKSUMS_NAME, ACB_SIGNATURE_NAME):
+ actual_files.add(rel_posix)
+
+ extra_files = actual_files - expected_files
+ if extra_files:
+ for extra in sorted(extra_files):
+ errors.append(f"unexpected extra file in bundle: {extra}")
+
+ missing_files = expected_files - actual_files
+ if missing_files:
+ for missing in sorted(missing_files):
+ errors.append(f"missing file: {missing}")
+
+ # 2. Checksum validation for all listed files
+ for relative, expected in sorted(checksums.items()):
+ target = bundle_root / relative
+ if target.is_file() and not target.is_symlink():
+ actual = sha256_file(target)
+ if actual != expected:
+ errors.append(f"checksum mismatch: {relative}")
+
+ # 3. Validate JSON schemas & secret scans
+ for json_name in ACB_JSON_FILES:
+ target = bundle_root / json_name
+ if target.is_file():
+ try:
+ payload = json.loads(target.read_text(encoding="utf-8"))
+ assert_no_lateral_secrets(payload)
+ except Exception as error:
+ errors.append(f"invalid JSON payload in {json_name}: {error}")
+
+ # 3b. Re-scan every stored object with the same strict secret/binary
+ # scanner used at write time (audit #7). A bundle that passed write-time
+ # scanning but was later tampered (or supplied by an untrusted source)
+ # must still be rejected at verify time. We also re-apply the
+ # resource safety limits (file count, per-file size, total size, depth).
+ objects_root = bundle_root / ACB_OBJECTS_DIR
+ if not objects_root.is_dir():
+ errors.append(f"bundle has no {ACB_OBJECTS_DIR}/ directory")
+ else:
+ total_object_bytes = 0
+ max_depth_seen = 0
+ object_count = 0
+ for source in sorted(objects_root.rglob("*")):
+ if not source.is_file() or source.is_symlink():
+ continue
+ object_count += 1
+ rel = source.relative_to(objects_root).as_posix()
+ depth = len(Path(rel).parts)
+ max_depth_seen = max(max_depth_seen, depth)
+ if object_count > MAX_BUNDLE_FILES:
+ errors.append(
+ f"object file count exceeded limit ({MAX_BUNDLE_FILES}): {rel}"
+ )
+ break
+ try:
+ data = source.read_bytes()
+ except Exception as error:
+ errors.append(f"cannot read object {rel}: {error}")
+ continue
+ if len(data) > MAX_FILE_SIZE:
+ errors.append(
+ f"object size exceeded limit ({MAX_FILE_SIZE} bytes): {rel}"
+ )
+ total_object_bytes += len(data)
+ try:
+ scan_object_bytes(data, rel)
+ except ACBSecretLeak as error:
+ errors.append(f"secret/binary violation in object {rel}: {error}")
+ if max_depth_seen > MAX_DIR_DEPTH:
+ errors.append(
+ f"object directory depth exceeded limit ({MAX_DIR_DEPTH}): {max_depth_seen}"
+ )
+ if total_object_bytes > MAX_TOTAL_SIZE:
+ errors.append(
+ f"object total size exceeded limit ({MAX_TOTAL_SIZE} bytes)"
+ )
+
+ # 4. Closed-world 1:1 Manifest-to-Objects verification
+ manifest_path = bundle_root / ACB_MANIFEST_NAME
+ if manifest_path.is_file() and not manifest_path.is_symlink():
+ try:
+ manifest_data = json.loads(manifest_path.read_text(encoding="utf-8"))
+ declared_objects = manifest_data.get("objects", [])
+ manifest_files: set[str] = set()
+ file_claimants: dict[str, list[str]] = {}
+ for obj in declared_objects:
+ obj_path = obj.get("object_path") or f"{obj.get('object_type')}/{obj.get('product')}/{obj.get('profile')}/{obj.get('scope')}"
+ obj_status = obj.get("status", "")
+ obj_files = obj.get("files", [])
+ if obj_status in {"ready", "ready-lossy"} and not obj_files:
+ errors.append(f"manifest object {obj_path} ({obj_status}) declares no files")
+ for file_entry in obj_files:
+ rel_p = file_entry.get("path", "")
+ if rel_p:
+ manifest_files.add(rel_p)
+ file_claimants.setdefault(rel_p, []).append(obj_path)
+ expected_sha = file_entry.get("sha256")
+ disk_p = bundle_root / rel_p
+ if not disk_p.is_file():
+ errors.append(f"manifest declared file missing on disk: {rel_p}")
+ elif expected_sha:
+ actual_sha = sha256_file(disk_p)
+ if actual_sha != expected_sha:
+ errors.append(
+ f"manifest file sha256 mismatch for {rel_p}: expected {expected_sha}, got {actual_sha}"
+ )
+
+ # Enforce 1:1: Each file must be claimed by at most one object
+ for rel_p, claimants in file_claimants.items():
+ if len(claimants) > 1:
+ errors.append(
+ f"manifest file {rel_p} claimed by multiple objects: {claimants}"
+ )
+
+ # If manifest declared specific object files, ensure no undeclared files exist in objects/
+ objects_root = bundle_root / ACB_OBJECTS_DIR
+ if objects_root.is_dir() and manifest_files:
+ for disk_file in sorted(objects_root.rglob("*")):
+ if disk_file.is_file():
+ rel = f"{ACB_OBJECTS_DIR}/{disk_file.relative_to(objects_root).as_posix()}"
+ if rel not in manifest_files:
+ errors.append(f"unclaimed file in objects directory not declared in manifest: {rel}")
+ except Exception as error:
+ errors.append(f"manifest verification error: {error}")
+
+ return errors
+
+
+# Audit P1-5 (0.8.27): Ed25519 over `checksums.json`. cryptography is
+# lazy-imported so snapshot / restore work without it; sign / verify
+# fail fast with a clear message if it is missing.
+ACB_SIGNATURE_NAME = "signature.json"
+ACB_SIGNATURE_SCHEMA_VERSION = 2
+_ED25519_KEY_BYTES = 32
+
+
+def _read_signing_key(key_path: Path) -> bytes:
+ if not key_path.is_file():
+ raise ACBError(f"signing key not found: {key_path}")
+ # Refuse group/world bits: a leaked signing key is a leaked bundle.
+ if stat.S_IMODE(key_path.stat().st_mode) & 0o077:
+ raise ACBError(
+ f"signing key {key_path} is group/world accessible; chmod 600 before use"
+ )
+ raw = key_path.read_bytes()
+ if len(raw) != _ED25519_KEY_BYTES:
+ raise ACBError(
+ f"signing key must be {_ED25519_KEY_BYTES} raw bytes; got {len(raw)}"
+ )
+ return raw
+
+
+def _load_public_key(key_path: Path) -> bytes:
+ if not key_path.is_file():
+ raise ACBError(f"public key not found: {key_path}")
+ # Public keys are non-secret but we still refuse symlinks so the
+ # caller can rely on the path being the actual file.
+ if key_path.is_symlink():
+ raise ACBError(f"public key path is a symlink: {key_path}")
+ raw = key_path.read_bytes()
+ if len(raw) != _ED25519_KEY_BYTES:
+ raise ACBError(
+ f"public key must be {_ED25519_KEY_BYTES} raw bytes; got {len(raw)}"
+ )
+ return raw
+
+
+def _ensure_cryptography() -> tuple[Any, Any, Any]:
+ try:
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import (
+ Ed25519PrivateKey,
+ Ed25519PublicKey,
+ )
+ from cryptography.hazmat.primitives import serialization
+ except ImportError as error:
+ raise ACBError(
+ "Ed25519 signing requires the 'cryptography' package. "
+ "Install with: pip install cryptography"
+ ) from error
+ return Ed25519PrivateKey, Ed25519PublicKey, serialization
+
+
+def _build_signature_document(
+ public_key: Any,
+ private_key: Any,
+ payload: bytes,
+ signer: str,
+) -> dict[str, Any]:
+ from cryptography.hazmat.primitives import serialization
+ public_bytes = public_key.public_bytes(
+ serialization.Encoding.Raw, serialization.PublicFormat.Raw,
+ )
+ return {
+ "schema_version": ACB_SIGNATURE_SCHEMA_VERSION,
+ "algorithm": "ed25519",
+ "signer": signer,
+ "signed_at": datetime.now(timezone.utc).isoformat(),
+ "checksum_algorithm": "sha256",
+ "bundle_hash": sha256_bytes(payload),
+ "public_key": base64.b64encode(public_bytes).decode("ascii"),
+ "public_key_fingerprint": sha256_bytes(public_bytes)[:16],
+ "signature": base64.b64encode(private_key.sign(payload)).decode("ascii"),
+ }
+
+
+def _load_signature_artifact(
+ bundle_root: Path,
+) -> tuple[dict[str, Any] | None, bytes, list[str]]:
+ sig_path = bundle_root / ACB_SIGNATURE_NAME
+ checksums_path = bundle_root / ACB_CHECKSUMS_NAME
+ errors: list[str] = []
+ if not sig_path.is_file():
+ return None, checksums_path, [f"missing signature: {sig_path}"]
+ if not checksums_path.is_file():
+ return None, checksums_path, [f"missing {ACB_CHECKSUMS_NAME}"]
+ try:
+ return json.loads(sig_path.read_text(encoding="utf-8")), checksums_path.read_bytes(), errors
+ except Exception as error:
+ return None, checksums_path, [f"corrupted signature.json: {error}"]
+
+
+def _check_signature_metadata(
+ sig_doc: dict[str, Any],
+ payload: bytes,
+) -> list[str]:
+ errors: list[str] = []
+ if sig_doc.get("algorithm") != "ed25519":
+ errors.append(
+ f"unsupported signature algorithm: {sig_doc.get('algorithm')!r} "
+ "(expected 'ed25519')"
+ )
+ if sig_doc.get("schema_version") != ACB_SIGNATURE_SCHEMA_VERSION:
+ errors.append(
+ f"unsupported signature schema_version: {sig_doc.get('schema_version')!r} "
+ f"(expected {ACB_SIGNATURE_SCHEMA_VERSION})"
+ )
+ if sig_doc.get("bundle_hash") != sha256_bytes(payload):
+ errors.append(
+ f"bundle_hash mismatch: signature={sig_doc.get('bundle_hash')} "
+ f"actual={sha256_bytes(payload)}"
+ )
+ return errors
+
+
+def _decode_signature_fields(sig_doc: dict[str, Any]) -> tuple[bytes, bytes] | list[str]:
+ sig_b64 = sig_doc.get("signature")
+ pub_b64 = sig_doc.get("public_key")
+ if not isinstance(sig_b64, str) or not isinstance(pub_b64, str):
+ return ["signature.json missing signature/public_key fields"]
+ try:
+ return base64.b64decode(sig_b64, validate=True), base64.b64decode(pub_b64, validate=True)
+ except Exception as error:
+ return [f"signature.json fields are not valid base64: {error}"]
+
+
+def _verify_signature_payload(
+ public_key: Any,
+ signature: bytes,
+ payload: bytes,
+) -> list[str]:
+ try:
+ public_key.verify(signature, payload)
+ except Exception as error:
+ return [f"signature verification failed: {error}"]
+ return []
+
+
+def sign_bundle(bundle_root: Path, key_path: Path, signer: str) -> Path:
+ Ed25519PrivateKey, _, _ = _ensure_cryptography()
+ bundle_root = bundle_root.resolve()
+ checksums_path = bundle_root / ACB_CHECKSUMS_NAME
+ if not checksums_path.is_file():
+ raise ACBError(f"cannot sign: {checksums_path} missing")
+ private_key = Ed25519PrivateKey.from_private_bytes(_read_signing_key(key_path))
+ payload = checksums_path.read_bytes()
+ signature_doc = _build_signature_document(
+ private_key.public_key(),
+ private_key,
+ payload,
+ signer,
+ )
+ sig_path = bundle_root / ACB_SIGNATURE_NAME
+ sig_path.write_text(
+ json.dumps(signature_doc, indent=2, sort_keys=True) + "\n",
+ encoding="utf-8",
+ )
+ return sig_path
+
+
+def verify_bundle_signature(bundle_root: Path, key_path: Path) -> list[str]:
+ _, Ed25519PublicKeyClass, _ = _ensure_cryptography()
+ bundle_root = bundle_root.resolve()
+ sig_doc, payload, load_errors = _load_signature_artifact(bundle_root)
+ if load_errors:
+ return load_errors
+ assert sig_doc is not None
+ errors = _check_signature_metadata(sig_doc, payload)
+ decoded = _decode_signature_fields(sig_doc)
+ if isinstance(decoded, list):
+ return errors + decoded
+ signature, signature_public_key = decoded
+ try:
+ trusted_public_key = _load_public_key(key_path)
+ except ACBError as error:
+ return errors + [str(error)]
+ if signature_public_key != trusted_public_key:
+ errors.append(
+ "public key in signature.json does not match trusted_key "
+ f"(fingerprint mismatch: signature={sha256_bytes(signature_public_key)[:16]} "
+ f"trusted={sha256_bytes(trusted_public_key)[:16]})"
+ )
+ return errors + _verify_signature_payload(
+ Ed25519PublicKeyClass.from_public_bytes(trusted_public_key),
+ signature,
+ payload,
+ )
+
+
+class BundleSurfaceProvider:
+ """Provides virtual surface items and content from verified bundle objects."""
+
+ def __init__(self, bundle_root: Path):
+ self.bundle_root = bundle_root.resolve()
+ self.objects_root = self.bundle_root / ACB_OBJECTS_DIR
+ self.manifest = load_manifest(self.bundle_root)
+
+ def get_object_tree(self, object_type: str, product: str, profile: str, scope: str) -> list[Path]:
+ """Find all files belonging to a specific surface object in the bundle."""
+ target_dir = self.objects_root / object_type / product / profile / scope
+ if not target_dir.is_dir():
+ return []
+ return sorted(p for p in target_dir.rglob("*") if p.is_file())
+
+
+def load_manifest(bundle_root: Path) -> ACBManifest:
+ bundle_root = bundle_root.resolve()
+ return ACBManifest.from_dict(
+ json.loads((bundle_root / ACB_MANIFEST_NAME).read_text(encoding="utf-8"))
+ )
+
+
+def make_bundle_id(timestamp: datetime | None = None) -> str:
+ timestamp = timestamp or datetime.now(timezone.utc)
+ return f"acb-{timestamp.strftime('%Y%m%dT%H%M%SZ')}"
diff --git a/skills/agent-skills-setup/agent-skills-setup/scripts/check-doc-freshness.py b/skills/agent-skills-setup/agent-skills-setup/scripts/check-doc-freshness.py
new file mode 100644
index 000000000..9ae6b1ca2
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/scripts/check-doc-freshness.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python3
+"""Validate source provenance offline for curated official docs."""
+
+import sys
+from pathlib import Path
+
+# Ensure scripts directory is on sys.path for direct invocation
+sys.path.insert(0, str(Path(__file__).resolve().parent))
+from doc_freshness import main
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/skills/agent-skills-setup/agent-skills-setup/scripts/common.sh b/skills/agent-skills-setup/agent-skills-setup/scripts/common.sh
new file mode 100644
index 000000000..ee301f32f
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/scripts/common.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+
+log_warn() { printf '[WARN] %s\n' "$*" >&2; }
+log_error() { printf '[ERROR] %s\n' "$*" >&2; }
+
+status_token() {
+ case "$1" in
+ success|copied|ok) printf 'OK' ;;
+ manual|partial|warn) printf 'WARN' ;;
+ failed|error) printf 'FAIL' ;;
+ skipped|absent|none) printf '-' ;;
+ *) printf '?' ;;
+ esac
+}
+
+json_escape() {
+ local s="$1"
+ s="${s//\\/\\\\}"
+ s="${s//\"/\\\"}"
+ s="${s//$'\n'/\\n}"
+ s="${s//$'\t'/\\t}"
+ s="${s//$'\r'/\\r}"
+ printf '%s' "$s"
+}
diff --git a/skills/agent-skills-setup/agent-skills-setup/scripts/context-migrator.py b/skills/agent-skills-setup/agent-skills-setup/scripts/context-migrator.py
new file mode 100644
index 000000000..5566ebe5a
--- /dev/null
+++ b/skills/agent-skills-setup/agent-skills-setup/scripts/context-migrator.py
@@ -0,0 +1,2065 @@
+#!/usr/bin/env python3
+"""Safe profile-aware CLI for agent context migration."""
+
+from __future__ import annotations
+
+import argparse
+import contextlib
+import copy
+import hashlib
+import io
+import json
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+from datetime import datetime, timezone
+from pathlib import Path
+from typing import Any
+
+_SCRIPT_DIR = str(Path(__file__).resolve().parent)
+if _SCRIPT_DIR not in sys.path:
+ sys.path.insert(0, _SCRIPT_DIR)
+
+from migration_core import (
+ ADAPTER_VERSIONS,
+ AUTOMATIC_MIGRATION_POLICIES,
+ AUTOMATIC_OBJECT_TYPES,
+ INVENTORY_ONLY_OBJECT_TYPES,
+ KNOWN_COMMANDS,
+ OPT_IN_WRITABLE_OBJECT_TYPES,
+ Registry,
+ apply_plan,
+ atomic_write,
+ build_plan,
+ build_plan_document,
+ choose_surface,
+ git_provenance,
+ hash_path,
+ json_sha256,
+ load_plan_document,
+ parse_mcp_document,
+ path_state,
+ paths_overlap,
+ rollback_manifest,
+ validate_plan_document,
+ verify_manifest,
+ _plan_hash_payload,
+)
+
+from acb.bundle import (
+ ACB_CHECKSUMS_NAME,
+ ACB_OBJECTS_DIR,
+ ACB_SCHEMA_VERSION,
+ ACBError,
+ ACBManifest,
+ ACBSecretLeak,
+ collect_reauth,
+ collect_rebuild,
+ collect_requirements,
+ collect_source_objects,
+ load_manifest,
+ make_bundle_id,
+ restore_bundle_objects,
+ sign_bundle,
+ verify_bundle,
+ verify_bundle_signature,
+ write_bundle,
+)
+
+
+SCRIPT_DIR = Path(__file__).resolve().parent
+REGISTRY_PATH = SCRIPT_DIR.parent / "references" / "registry-v2.json"
+LEGACY_SCRIPT = SCRIPT_DIR / "legacy-smart-ide-migration.sh"
+
+
+def emit(value: Any, as_json: bool) -> None:
+ if as_json:
+ print(json.dumps(value, indent=2, sort_keys=True))
+ return
+ if isinstance(value, list):
+ for row in value:
+ print(json.dumps(row, sort_keys=True))
+ elif isinstance(value, dict):
+ print(json.dumps(value, indent=2, sort_keys=True))
+ else:
+ print(value)
+
+
+def common_workspace(parser: argparse.ArgumentParser) -> None:
+ parser.add_argument("--workspace", type=Path, default=Path.cwd())
+ parser.add_argument("--registry", type=Path, default=REGISTRY_PATH)
+ parser.add_argument("--json", action="store_true")
+
+
+def create_parser() -> argparse.ArgumentParser:
+ parser = argparse.ArgumentParser(
+ description="Inventory, plan, apply, verify, and roll back agent context migrations."
+ )
+ subparsers = parser.add_subparsers(dest="command", required=True)
+
+ detect = subparsers.add_parser("detect")
+ common_workspace(detect)
+ detect.add_argument("--product")
+ detect.add_argument("--profile")
+
+ inventory = subparsers.add_parser("inventory")
+ common_workspace(inventory)
+ inventory.add_argument("--product")
+ inventory.add_argument("--profile")
+
+ plan = subparsers.add_parser("plan")
+ common_workspace(plan)
+ plan.add_argument("--source", required=True)
+ plan.add_argument("--target", required=True)
+ plan.add_argument(
+ "--objects", default="skills,instructions,mcp", help="comma-separated surfaces"
+ )
+ plan.add_argument(
+ "--scope", choices=("user", "project", "local", "all"), default="project"
+ )
+ plan.add_argument("--output", type=Path)
+
+ migrate = subparsers.add_parser(
+ "migrate",
+ help="One-sentence migration: detect -> inventory -> plan -> apply -> verify.",
+ )
+ common_workspace(migrate)
+ migrate.add_argument("--source", required=True, help="/")
+ migrate.add_argument("--target", required=True, help="/")
+ migrate.add_argument(
+ "--objects",
+ default="all-portable",
+ help=(
+ "Comma-separated object list, 'all-portable' (default), or "
+ "'all-inventory' (also records forbidden/generated items)."
+ ),
+ )
+ migrate.add_argument(
+ "--scope",
+ default="user,project",
+ help="user, project, user+project, all (all requires --yes)",
+ )
+ migrate.add_argument(
+ "--plan-only", action="store_true", help="Stop after planning."
+ )
+ migrate.add_argument("--plan-out", type=Path)
+ migrate.add_argument("--manifest-out", type=Path)
+ migrate.add_argument("--verify-out", type=Path)
+ migrate.add_argument("--yes", action="store_true")
+ migrate.add_argument(
+ "--include",
+ dest="include_lossy",
+ choices=("lossy",),
+ help="Also apply ready-lossy items.",
+ )
+ migrate.add_argument(
+ "--accept-loss",
+ dest="accept_loss",
+ default="",
+ help="Comma-separated plan indices to apply as lossy.",
+ )
+ migrate.add_argument(
+ "--strict",
+ action="store_true",
+ help="Reject plans containing any non-ready item.",
+ )
+
+ migrate.add_argument(
+ "--include-session",
+ dest="include_session",
+ action="store_true",
+ help=(
+ "Explicitly opt in to handoff/session transfer "
+ "(whitelisted fields only: reviewed summary, git branch, "
+ "selected file list, reviewed patch)."
+ ),
+ )
+ migrate.add_argument(
+ "--include-plugins",
+ dest="include_plugins",
+ action="store_true",
+ help="Explicitly opt in to plugin package transfer.",
+ )
+ apply = subparsers.add_parser("apply")
+ apply.add_argument("plan", type=Path)
+ apply.add_argument("--registry", type=Path, default=REGISTRY_PATH)
+ apply.add_argument("--manifest", type=Path)
+ apply.add_argument(
+ "--bundle",
+ type=Path,
+ help="Path to .acb bundle archive for bundle-backed restore plans.",
+ )
+ apply.add_argument("--yes", action="store_true")
+ apply.add_argument("--json", action="store_true")
+ apply.add_argument(
+ "--apply-safe",
+ dest="apply_safe",
+ action="store_true",
+ default=True,
+ help="Apply ready and draft-disabled items; manifest the rest (default).",
+ )
+ apply.add_argument(
+ "--no-apply-safe",
+ dest="apply_safe",
+ action="store_false",
+ help="Disable safe apply; require every item to be ready.",
+ )
+ apply.add_argument(
+ "--include",
+ dest="include_lossy",
+ choices=("lossy",),
+ help="Include lossy items alongside ready items.",
+ )
+ apply.add_argument(
+ "--accept-loss",
+ dest="accept_loss",
+ default="",
+ help="Comma-separated plan indices to apply as lossy even without --include lossy.",
+ )
+ apply.add_argument(
+ "--strict",
+ action="store_true",
+ help="Reject any plan containing a non-ready item (legacy semantics).",
+ )
+
+ apply.add_argument(
+ "--include-session",
+ dest="include_session",
+ action="store_true",
+ help=(
+ "Explicitly opt in to handoff/session transfer for replayed "
+ "plans (whitelisted fields only)."
+ ),
+ )
+ apply.add_argument(
+ "--include-plugins",
+ dest="include_plugins",
+ action="store_true",
+ help="Explicitly opt in to plugin package transfer.",
+ )
+ verify = subparsers.add_parser("verify")
+ verify.add_argument("--manifest", type=Path, required=True)
+ verify.add_argument("--json", action="store_true")
+
+ rollback = subparsers.add_parser("rollback")
+ rollback.add_argument("--manifest", type=Path, required=True)
+ rollback.add_argument("--yes", action="store_true")
+ rollback.add_argument("--json", action="store_true")
+
+ legacy = subparsers.add_parser(
+ "legacy", help="run the explicit lookup and zero-write compatibility interface"
+ )
+ legacy.add_argument("legacy_args", nargs=argparse.REMAINDER)
+
+ snapshot = subparsers.add_parser(
+ "snapshot",
+ help="Capture a portable Agent Context Bundle (ACB) of the current device.",
+ )
+ common_workspace(snapshot)
+ snapshot.add_argument("--output", type=Path, help="Bundle output directory (default: /device.acb).")
+ snapshot.add_argument("--source", default="cline/ide")
+ snapshot.add_argument("--target", default="forge/cli")
+ snapshot.add_argument("--scope", default="user,project")
+ snapshot.add_argument(
+ "--all-installed",
+ action="store_true",
+ help="Snapshot all detected and installed products on this device.",
+ )
+ snapshot.add_argument(
+ "--include-configured",
+ action="store_true",
+ help="Include products detected in configured-only state.",
+ )
+ snapshot.add_argument(
+ "--include-compatibility",
+ action="store_true",
+ help="Include products detected in compatibility-only state.",
+ )
+
+ verify_bundle = subparsers.add_parser(
+ "bundle-verify",
+ help="Verify checksums and optional Ed25519 signature inside an ACB directory.",
+ )
+ verify_bundle.add_argument("bundle", type=Path)
+ verify_bundle.add_argument(
+ "--trusted-key",
+ type=Path,
+ help="Path to trusted Ed25519 public key file to verify bundle signature.",
+ )
+ verify_bundle.add_argument("--json", action="store_true", default=True)
+
+ bundle_sign = subparsers.add_parser(
+ "bundle-sign",
+ help="Sign an ACB directory with an Ed25519 private key.",
+ )
+ bundle_sign.add_argument("bundle", type=Path)
+ bundle_sign.add_argument(
+ "--key",
+ type=Path,
+ required=True,
+ help="Path to Ed25519 private key file (must be chmod 600).",
+ )
+ bundle_sign.add_argument(
+ "--signer",
+ default="local-operator",
+ help="Identifier or name of the signer.",
+ )
+ bundle_sign.add_argument("--json", action="store_true", default=True)
+
+ bundle_keygen = subparsers.add_parser(
+ "bundle-keygen",
+ help="Generate Ed25519 keypair for signing and verifying ACBs.",
+ )
+ bundle_keygen.add_argument(
+ "--out-private",
+ type=Path,
+ required=True,
+ help="Destination path for private key file (will be chmod 600).",
+ )
+ bundle_keygen.add_argument(
+ "--out-public",
+ type=Path,
+ required=True,
+ help="Destination path for public key file.",
+ )
+ bundle_keygen.add_argument("--json", action="store_true", default=True)
+
+ restore = subparsers.add_parser(
+ "restore",
+ help="Verify an ACB and rebuild a local restore plan against the current device.",
+ )
+ common_workspace(restore)
+ restore.add_argument("bundle", type=Path)
+ restore.add_argument("--source", default="cline/ide")
+ restore.add_argument("--target", default="forge/cli")
+ restore.add_argument("--scope", default="user,project")
+ restore.add_argument(
+ "--all-installed",
+ action="store_true",
+ help="Restore context across all detected and installed target products.",
+ )
+ restore.add_argument(
+ "--include-configured",
+ action="store_true",
+ help="Include target products detected in configured-only state.",
+ )
+ restore.add_argument(
+ "--include-compatibility",
+ action="store_true",
+ help="Include target products detected in compatibility-only state.",
+ )
+ restore.add_argument(
+ "--include-session",
+ dest="include_session",
+ action="store_true",
+ help="Explicitly opt in to handoff/session transfer.",
+ )
+ restore.add_argument(
+ "--include-plugins",
+ dest="include_plugins",
+ action="store_true",
+ help="Explicitly opt in to plugin package transfer.",
+ )
+ restore.add_argument(
+ "--trusted-key",
+ type=Path,
+ help="Path to trusted Ed25519 public key file to verify bundle signature.",
+ )
+ restore.add_argument("--plan-out", type=Path)
+ restore.add_argument(
+ "--plan-in",
+ "--plan",
+ dest="plan_in",
+ type=Path,
+ help="Replay a previously reviewed plan document.",
+ )
+ restore.add_argument("--manifest-out", type=Path)
+ restore.add_argument("--apply-safe", action="store_true", default=True)
+ restore.add_argument(
+ "--no-apply-safe", dest="apply_safe", action="store_false"
+ )
+ restore.add_argument(
+ "--include", dest="include_lossy", choices=("lossy",),
+ )
+ restore.add_argument("--strict", action="store_true")
+ restore.add_argument("--yes", action="store_true")
+ restore.add_argument(
+ "--plan-only",
+ action="store_true",
+ help="Build and review restore plan without applying to target surfaces.",
+ )
+ restore.add_argument(
+ "--restore-root",
+ type=Path,
+ help="Destination tree for bundle/objects/ restore (default: /.acb-restored).",
+ )
+ restore.add_argument(
+ "--allow-noop",
+ action="store_true",
+ help="Allow restore to succeed with zero applied items (otherwise a bundle that resolves no eligible items is a hard failure).",
+ )
+ restore.add_argument(
+ "--dry-run",
+ action="store_true",
+ help="Plan and stage objects/ without writing.",
+ )
+
+ doctor = subparsers.add_parser(
+ "doctor",
+ help="Inspect an ACB and surface missing executables / re-auth actions.",
+ )
+ doctor.add_argument("bundle", type=Path)
+ doctor.add_argument("--json", action="store_true", default=True)
+ return parser
+
+
+def selector(product: str | None, profile: str | None) -> str | None:
+ if not product:
+ if profile:
+ raise ValueError("--profile requires --product")
+ return None
+ return f"{product}/{profile}" if profile else product
+
+
+def reject_legacy_write(argv: list[str]) -> None:
+ """Enforce the legacy subcommand as strictly read-only.
+
+ The guarantee is structural, not flag filtering (audit SDI-4 /
+ AST4): only the documented read-only modes --print-path and
+ --dry-run are allowed through to the legacy engine at all. Any
+ other invocation — with or without --yes — is refused here.
+ """
+ if "--yes" in argv or "-y" in argv:
+ raise ValueError(
+ "legacy writes are disabled; create a saved plan with 'plan --output', "
+ "then apply that exact plan file"
+ )
+ if not argv or "--help" in argv or "-h" in argv:
+ return
+ readonly = "--print-path" in argv or "--dry-run" in argv
+ if not readonly:
+ raise ValueError(
+ "legacy subcommand is read-only lookup compatibility only: "
+ "pass --print-path