hatch3r 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/agents/hatch3r-a11y-auditor.md +18 -11
- package/agents/hatch3r-architect.md +27 -12
- package/agents/hatch3r-ci-watcher.md +30 -9
- package/agents/hatch3r-context-rules.md +18 -8
- package/agents/hatch3r-dependency-auditor.md +30 -15
- package/agents/hatch3r-devops.md +18 -13
- package/agents/hatch3r-docs-writer.md +33 -12
- package/agents/hatch3r-fixer.md +46 -9
- package/agents/hatch3r-implementer.md +21 -9
- package/agents/hatch3r-learnings-loader.md +24 -7
- package/agents/hatch3r-lint-fixer.md +18 -9
- package/agents/hatch3r-perf-profiler.md +26 -10
- package/agents/hatch3r-researcher.md +57 -919
- package/agents/hatch3r-reviewer.md +29 -10
- package/agents/hatch3r-security-auditor.md +25 -10
- package/agents/hatch3r-test-writer.md +29 -9
- package/agents/modes/architecture.md +1 -0
- package/agents/modes/boundary-analysis.md +2 -1
- package/agents/modes/codebase-impact.md +1 -0
- package/agents/modes/complexity-risk.md +1 -0
- package/agents/modes/coverage-analysis.md +1 -0
- package/agents/modes/current-state.md +1 -0
- package/agents/modes/feature-design.md +1 -0
- package/agents/modes/impact-analysis.md +1 -0
- package/agents/modes/library-docs.md +2 -1
- package/agents/modes/migration-path.md +1 -0
- package/agents/modes/prior-art.md +1 -0
- package/agents/modes/refactoring-strategy.md +1 -0
- package/agents/modes/regression.md +1 -0
- package/agents/modes/requirements-elicitation.md +1 -0
- package/agents/modes/risk-assessment.md +1 -0
- package/agents/modes/risk-prioritization.md +1 -0
- package/agents/modes/root-cause.md +1 -0
- package/agents/modes/similar-implementation.md +2 -1
- package/agents/modes/symptom-trace.md +1 -0
- package/agents/modes/test-pattern.md +2 -1
- package/agents/shared/external-knowledge.md +31 -0
- package/agents/shared/quality-charter.md +96 -0
- package/checks/README.md +1 -0
- package/checks/accessibility.md +55 -0
- package/commands/board/pickup-azure-devops.md +5 -0
- package/commands/board/pickup-delegation-multi.md +9 -1
- package/commands/board/pickup-delegation.md +4 -0
- package/commands/board/pickup-github.md +5 -0
- package/commands/board/pickup-gitlab.md +5 -0
- package/commands/board/pickup-modes.md +1 -0
- package/commands/board/pickup-post-impl.md +9 -1
- package/commands/board/shared-azure-devops.md +14 -3
- package/commands/board/shared-board-overview.md +1 -0
- package/commands/board/shared-github.md +2 -0
- package/commands/board/shared-gitlab.md +10 -2
- package/commands/hatch3r-agent-customize.md +6 -1
- package/commands/hatch3r-api-spec.md +1 -0
- package/commands/hatch3r-benchmark.md +4 -3
- package/commands/hatch3r-board-fill.md +52 -9
- package/commands/hatch3r-board-groom.md +124 -7
- package/commands/hatch3r-board-init.md +7 -3
- package/commands/hatch3r-board-pickup.md +1 -0
- package/commands/hatch3r-board-refresh.md +1 -0
- package/commands/hatch3r-board-shared.md +71 -5
- package/commands/hatch3r-bug-plan.md +2 -1
- package/commands/hatch3r-codebase-map.md +4 -3
- package/commands/hatch3r-command-customize.md +6 -1
- package/commands/hatch3r-context-health.md +1 -0
- package/commands/hatch3r-cost-tracking.md +1 -0
- package/commands/hatch3r-debug.md +4 -3
- package/commands/hatch3r-dep-audit.md +3 -0
- package/commands/hatch3r-feature-plan.md +3 -2
- package/commands/hatch3r-healthcheck.md +1 -0
- package/commands/hatch3r-hooks.md +6 -1
- package/commands/hatch3r-learn.md +1 -0
- package/commands/hatch3r-migration-plan.md +3 -2
- package/commands/hatch3r-onboard.md +2 -1
- package/commands/hatch3r-project-spec.md +4 -3
- package/commands/hatch3r-quick-change.md +31 -3
- package/commands/hatch3r-recipe.md +1 -0
- package/commands/hatch3r-refactor-plan.md +2 -1
- package/commands/hatch3r-release.md +4 -1
- package/commands/hatch3r-revision.md +138 -17
- package/commands/hatch3r-roadmap.md +5 -4
- package/commands/hatch3r-rule-customize.md +5 -0
- package/commands/hatch3r-security-audit.md +1 -0
- package/commands/hatch3r-skill-customize.md +5 -0
- package/commands/hatch3r-test-plan.md +3 -2
- package/commands/hatch3r-workflow.md +15 -1
- package/dist/cli/index.js +7595 -4548
- package/dist/cli/index.js.map +1 -1
- package/hooks/hatch3r-ci-failure.md +1 -0
- package/hooks/hatch3r-file-save.md +1 -0
- package/hooks/hatch3r-post-merge.md +1 -0
- package/hooks/hatch3r-pre-commit.md +1 -0
- package/hooks/hatch3r-pre-push.md +1 -0
- package/hooks/hatch3r-session-start.md +1 -0
- package/package.json +30 -12
- package/rules/hatch3r-accessibility-standards.md +2 -1
- package/rules/hatch3r-accessibility-standards.mdc +1 -1
- package/rules/hatch3r-agent-orchestration-detail.md +207 -0
- package/rules/hatch3r-agent-orchestration-detail.mdc +202 -0
- package/rules/hatch3r-agent-orchestration.md +161 -318
- package/rules/hatch3r-agent-orchestration.mdc +212 -154
- package/rules/hatch3r-api-design.md +2 -1
- package/rules/hatch3r-api-design.mdc +1 -1
- package/rules/hatch3r-browser-verification.md +4 -2
- package/rules/hatch3r-browser-verification.mdc +1 -0
- package/rules/hatch3r-ci-cd.md +2 -1
- package/rules/hatch3r-ci-cd.mdc +1 -1
- package/rules/hatch3r-code-standards.md +15 -2
- package/rules/hatch3r-code-standards.mdc +22 -2
- package/rules/hatch3r-component-conventions.md +2 -1
- package/rules/hatch3r-component-conventions.mdc +1 -1
- package/rules/hatch3r-data-classification.md +2 -1
- package/rules/hatch3r-data-classification.mdc +1 -1
- package/rules/hatch3r-deep-context.md +26 -1
- package/rules/hatch3r-deep-context.mdc +54 -8
- package/rules/hatch3r-dependency-management.md +2 -1
- package/rules/hatch3r-dependency-management.mdc +17 -5
- package/rules/hatch3r-feature-flags.md +2 -0
- package/rules/hatch3r-feature-flags.mdc +1 -0
- package/rules/hatch3r-git-conventions.md +2 -1
- package/rules/hatch3r-git-conventions.mdc +2 -1
- package/rules/hatch3r-i18n.md +2 -1
- package/rules/hatch3r-i18n.mdc +1 -1
- package/rules/hatch3r-learning-consult.md +11 -1
- package/rules/hatch3r-learning-consult.mdc +11 -1
- package/rules/hatch3r-migrations.md +2 -1
- package/rules/hatch3r-migrations.mdc +12 -1
- package/rules/hatch3r-observability-logging.md +34 -0
- package/rules/hatch3r-observability-logging.mdc +30 -0
- package/rules/hatch3r-observability-metrics.md +74 -0
- package/rules/hatch3r-observability-metrics.mdc +70 -0
- package/rules/hatch3r-observability-tracing-detail.md +160 -0
- package/rules/hatch3r-observability-tracing-detail.mdc +63 -0
- package/rules/hatch3r-observability-tracing.md +86 -0
- package/rules/hatch3r-observability-tracing.mdc +77 -0
- package/rules/hatch3r-observability.md +9 -448
- package/rules/hatch3r-observability.mdc +7 -159
- package/rules/hatch3r-performance-budgets.md +2 -0
- package/rules/hatch3r-performance-budgets.mdc +1 -0
- package/rules/hatch3r-secrets-management.md +2 -1
- package/rules/hatch3r-secrets-management.mdc +1 -1
- package/rules/hatch3r-security-patterns.md +3 -2
- package/rules/hatch3r-security-patterns.mdc +12 -1
- package/rules/hatch3r-testing.md +12 -2
- package/rules/hatch3r-testing.mdc +11 -2
- package/rules/hatch3r-theming.md +3 -2
- package/rules/hatch3r-theming.mdc +1 -1
- package/rules/hatch3r-tooling-hierarchy.md +3 -2
- package/rules/hatch3r-tooling-hierarchy.mdc +19 -5
- package/skills/hatch3r-a11y-audit/SKILL.md +11 -4
- package/skills/hatch3r-agent-customize/SKILL.md +5 -72
- package/skills/hatch3r-api-spec/SKILL.md +9 -2
- package/skills/hatch3r-architecture-review/SKILL.md +7 -0
- package/skills/hatch3r-bug-fix/SKILL.md +16 -7
- package/skills/hatch3r-ci-pipeline/SKILL.md +8 -1
- package/skills/hatch3r-command-customize/SKILL.md +5 -62
- package/skills/hatch3r-context-health/SKILL.md +23 -2
- package/skills/hatch3r-cost-tracking/SKILL.md +16 -6
- package/skills/hatch3r-customize/SKILL.md +124 -0
- package/skills/hatch3r-dep-audit/SKILL.md +9 -2
- package/skills/hatch3r-feature/SKILL.md +12 -4
- package/skills/hatch3r-gh-agentic-workflows/SKILL.md +7 -0
- package/skills/hatch3r-incident-response/SKILL.md +7 -0
- package/skills/hatch3r-issue-workflow/SKILL.md +8 -1
- package/skills/hatch3r-logical-refactor/SKILL.md +8 -1
- package/skills/hatch3r-migration/SKILL.md +7 -0
- package/skills/hatch3r-perf-audit/SKILL.md +9 -2
- package/skills/hatch3r-pr-creation/SKILL.md +8 -1
- package/skills/hatch3r-qa-validation/SKILL.md +8 -1
- package/skills/hatch3r-recipe/SKILL.md +8 -1
- package/skills/hatch3r-refactor/SKILL.md +10 -2
- package/skills/hatch3r-release/SKILL.md +8 -1
- package/skills/hatch3r-rule-customize/SKILL.md +5 -65
- package/skills/hatch3r-skill-customize/SKILL.md +5 -62
- package/skills/hatch3r-visual-refactor/SKILL.md +12 -5
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/add.ts","../../src/cli/shared/ui.ts","../../src/version.ts","../../src/cli/commands/worktreeSetup.ts","../../src/types.ts","../../src/worktree/index.ts","../../src/worktree/resolve.ts","../../src/cli/commands/config.ts","../../src/manifest/hatchJson.ts","../../src/merge/safeWrite.ts","../../src/merge/managedBlocks.ts","../../src/models/customize.ts","../../src/adapters/customization.ts","../../src/env/mcpEnv.ts","../../src/cli/commands/update.ts","../../src/adapters/base.ts","../../src/models/aliases.ts","../../src/models/resolve.ts","../../src/cli/shared/agentsContent.ts","../../src/adapters/canonical.ts","../../src/adapters/mcp-utils.ts","../../src/hooks/index.ts","../../src/hooks/types.ts","../../src/adapters/aider.ts","../../src/adapters/amazonq.ts","../../src/adapters/amp.ts","../../src/adapters/antigravity.ts","../../src/adapters/claude.ts","../../src/adapters/cline.ts","../../src/adapters/toml-utils.ts","../../src/adapters/codex.ts","../../src/detect/packageManager.ts","../../src/adapters/copilot.ts","../../src/adapters/cursor.ts","../../src/adapters/gemini.ts","../../src/adapters/goose.ts","../../src/adapters/kiro.ts","../../src/adapters/opencode.ts","../../src/adapters/windsurf.ts","../../src/adapters/zed.ts","../../src/adapters/index.ts","../../src/cli/shared/paths.ts","../../src/integrity/index.ts","../../src/content/index.ts","../../src/archive/index.ts","../../src/workspace/manifest.ts","../../src/workspace/types.ts","../../src/workspace/detect.ts","../../src/workspace/sync.ts","../../src/detect/repoAnalyzer.ts","../../src/workspace/resolve.ts","../../src/workspace/git.ts","../../src/cli/shared/constants.ts","../../src/cli/commands/init.ts","../../src/content/presets.ts","../../src/cli/commands/sync.ts","../../src/cli/commands/validate.ts","../../src/cli/commands/verify.ts","../../src/cli/commands/status.ts"],"sourcesContent":["// Sync I/O (execFileSync) is used intentionally in init/update for package\n// manager operations where async would add complexity without benefit.\n\nimport { Command } from \"commander\";\nimport { addCommand } from \"./commands/add.js\";\nimport { worktreeSetupCommand } from \"./commands/worktreeSetup.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { verifyCommand } from \"./commands/verify.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { HatchError, TOOL_CHOICES } from \"../types.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hatch3r\")\n .description(\n \"Battle-tested agentic coding setup framework. Crack the egg. Hatch better agents.\",\n )\n .version(HATCH3R_VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Install a complete agent setup into the current repo\")\n .option(\n \"--tools <tools>\",\n `Comma-separated tools (${TOOL_CHOICES})`,\n )\n .option(\"--yes\", \"Skip interactive prompts, use defaults\")\n .option(\"--preset <preset>\", \"Content preset: minimal, standard, full\")\n .option(\"--project-type <type>\", \"Project type: greenfield, brownfield\")\n .option(\"--team-size <size>\", \"Team size: solo, team\")\n .option(\"--workspace\", \"Initialize as a multi-repo workspace\")\n .action(initCommand);\n\nprogram\n .command(\"sync\")\n .description(\"Re-generate tool outputs from canonical .agents/ state\")\n .option(\"--repos [paths...]\", \"Sync workspace content to sub-repos (all opted-in if no paths given)\")\n .option(\"--dry-run\", \"Show what would change without modifying files\")\n .option(\"--force\", \"Overwrite locally modified files in sub-repos\")\n .option(\"--minimal\", \"Generate stripped-down output (no comments, minimal formatting) to reduce token usage\")\n .action(syncCommand);\n\nprogram\n .command(\"status\")\n .description(\"Check sync status between canonical .agents/ and generated files\")\n .action(statusCommand);\n\nprogram\n .command(\"update\")\n .description(\"Pull latest hatch3r templates with safe merge\")\n .action(updateCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Validate the canonical .agents/ structure\")\n .action(validateCommand);\n\nprogram\n .command(\"verify\")\n .description(\"Verify integrity of canonical agent files\")\n .action(verifyCommand);\n\nprogram\n .command(\"config\")\n .description(\"Reconfigure tools, MCP servers, features, and platform\")\n .action(configCommand);\n\nprogram\n .command(\"add [pack]\")\n .description(\"Install a community pack (coming soon)\")\n .action(addCommand);\n\nprogram\n .command(\"worktree-setup [worktree-path]\")\n .description(\"Set up gitignored files in a git worktree\")\n .option(\"--from <path>\", \"Main repo path (auto-detected by default)\")\n .option(\"--dry-run\", \"Show what would be done without changes\")\n .option(\"--force\", \"Overwrite existing files in the worktree\")\n .action(worktreeSetupCommand);\n\n// Agent command names that users might try to run directly in the terminal.\n// These are slash commands meant to be invoked inside an AI-powered editor, not from the CLI.\nconst AGENT_COMMAND_NAMES = new Set([\n \"review\", \"workflow\", \"project-spec\", \"codebase-map\", \"debug\", \"release\",\n \"refactor-plan\", \"test-plan\", \"bug-plan\", \"roadmap\", \"onboard\", \"recipe\",\n \"board-init\", \"board-pickup\", \"board-groom\", \"board-refresh\",\n \"security-audit\", \"dep-audit\", \"benchmark\", \"healthcheck\", \"context-health\",\n \"learn\", \"revision\", \"cost-tracking\", \"api-spec\", \"hooks\", \"quick-change\",\n \"command-customize\",\n]);\n\n// Catch-all for unknown commands -- redirect agent commands to the editor\nprogram.on(\"command:*\", (operands: string[]) => {\n const cmd = operands[0];\n if (cmd && AGENT_COMMAND_NAMES.has(cmd)) {\n console.error(\n `\\n \"${cmd}\" is a hatch3r agent command meant to be run inside your AI editor (e.g. /${cmd}).` +\n `\\n It cannot be invoked from the terminal CLI.` +\n `\\n\\n To use agent commands, open your project in Cursor, Claude Code, or another supported tool` +\n `\\n and type /${cmd} in the AI chat.\\n`,\n );\n } else {\n console.error(\n `\\n Unknown command: ${cmd}` +\n `\\n Run \"hatch3r --help\" for available commands.\\n`,\n );\n }\n process.exit(1);\n});\n\nconst nodeVersion = parseInt(process.version.slice(1), 10);\nif (nodeVersion < 22) {\n console.error(\n `hatch3r requires Node.js >= 22.0.0 (current: ${process.version}). Please upgrade Node.js.`,\n );\n process.exit(1);\n}\n\nlet shuttingDown = false;\nfor (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (shuttingDown) return;\n shuttingDown = true;\n // Allow pending writes to flush\n process.stdout.write(\"\", () => {\n process.stderr.write(\"\", () => {\n process.exit(0);\n });\n });\n });\n}\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\n `\\nhatch3r: unhandled promise rejection: ${reason instanceof Error ? reason.message : String(reason)}`,\n );\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\ntry {\n await program.parseAsync();\n} catch (err) {\n if (err instanceof HatchError) {\n process.exit(err.exitCode);\n }\n const isUsageError = err instanceof Error && (\n err.message.includes(\"Invalid\") ||\n err.message.includes(\"Unknown\") ||\n err.message.includes(\"missing required\")\n );\n console.error(\n `\\nhatch3r encountered an ${isUsageError ? \"usage\" : \"unexpected\"} error: ${err instanceof Error ? err.message : String(err)}`,\n );\n console.error(\" For help, see: https://hatch3r.dev/docs/troubleshooting\");\n if (process.env.DEBUG) {\n console.error(err);\n }\n process.exit(isUsageError ? 2 : 1);\n}\n","import chalk from \"chalk\";\nimport { printBanner } from \"../shared/ui.js\";\n\nexport async function addCommand(): Promise<void> {\n printBanner(true);\n console.log();\n console.log(chalk.yellow(\" Coming soon!\"));\n console.log(chalk.dim(\" The `add` command will allow installing community packs.\"));\n console.log(chalk.dim(\" Follow https://github.com/hatch3r for updates.\"));\n console.log();\n}\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport boxen from \"boxen\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\n\nconst CYAN = chalk.hex(\"#06b6d4\");\nconst DIM_CYAN = chalk.hex(\"#67e8f9\");\n\nconst SHADOW_CHARS = new Set(\"╔═╗╚╝║\");\n\nfunction gradient(\n text: string,\n from: [number, number, number],\n to: [number, number, number],\n): string {\n const chars = [...text];\n const len = chars.filter((c) => c !== \" \").length;\n let idx = 0;\n return chars\n .map((c) => {\n if (c === \" \") return c;\n const t = len > 1 ? idx / (len - 1) : 0;\n idx++;\n const r = Math.round(from[0] + (to[0] - from[0]) * t);\n const g = Math.round(from[1] + (to[1] - from[1]) * t);\n const b = Math.round(from[2] + (to[2] - from[2]) * t);\n if (SHADOW_CHARS.has(c)) {\n const DIM = 0.55;\n return chalk.rgb(\n Math.round(r * DIM),\n Math.round(g * DIM),\n Math.round(b * DIM),\n )(c);\n }\n return chalk.rgb(r, g, b).bold(c);\n })\n .join(\"\");\n}\n\n// ANSI Shadow style — 6-row glyphs with 3D depth via block + box-drawing chars\nconst LOGO = [\n \"██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗██████╗ ██████╗ \",\n \"██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║╚════██╗██╔══██╗\",\n \"███████║███████║ ██║ ██║ ███████║ █████╔╝██████╔╝\",\n \"██╔══██║██╔══██║ ██║ ██║ ██╔══██║ ╚═══██╗██╔══██╗\",\n \"██║ ██║██║ ██║ ██║ ╚██████╗██║ ██║██████╔╝██║ ██║\",\n \"╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝\",\n].map((row) => gradient(row, [6, 182, 212], [20, 184, 166]));\n\nfunction buildBanner(): string[] {\n const lines: string[] = [\"\"];\n for (const row of LOGO) {\n lines.push(` ${row}`);\n }\n lines.push(` ${DIM_CYAN(\"Crack the egg. Hatch better agents.\")}`);\n lines.push(` ${chalk.dim(`v${HATCH3R_VERSION}`)}`);\n lines.push(\"\");\n return lines;\n}\n\nconst BANNER_LINES = buildBanner();\n\nexport function printBanner(compact = false): void {\n if (compact) {\n console.log(\n `\\n ${CYAN.bold(\"hatch3r\")} ${chalk.dim(`v${HATCH3R_VERSION}`)}\\n`,\n );\n return;\n }\n for (const line of BANNER_LINES) {\n console.log(line);\n }\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n spinner: \"dots\",\n indent: 2,\n });\n}\n\nexport function printBox(\n title: string,\n lines: string[],\n style: \"success\" | \"info\" | \"error\" = \"info\",\n): void {\n const colors = {\n success: \"#10b981\" as const,\n info: \"#06b6d4\" as const,\n error: \"#ef4444\" as const,\n };\n const content = lines.join(\"\\n\");\n console.log(\n boxen(content, {\n title,\n titleAlignment: \"left\",\n padding: { top: 0, bottom: 0, left: 1, right: 1 },\n margin: { top: 0, bottom: 1, left: 1, right: 0 },\n borderColor: colors[style],\n borderStyle: \"round\",\n dimBorder: style === \"info\",\n }),\n );\n}\n\nexport function error(msg: string): void {\n console.log(` ${chalk.red(\"✖\")} ${msg}`);\n}\n\nexport function warn(msg: string): void {\n console.log(` ${chalk.yellow(\"⚠\")} ${msg}`);\n}\n\nexport function info(msg: string): void {\n console.log(` ${CYAN(\"ℹ\")} ${msg}`);\n}\n\nexport function step(n: number, total: number, msg: string): string {\n return `${chalk.dim(`[${n}/${total}]`)} ${msg}`;\n}\n\nexport function label(name: string, value: string): string {\n return `${chalk.dim(name.padEnd(12))} ${value}`;\n}\n","declare const __VERSION__: string;\nexport const HATCH3R_VERSION = __VERSION__;\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { execFileSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport {\n WORKTREE_INCLUDE_FILE,\n HatchError,\n} from \"../../types.js\";\nimport {\n setupWorktree,\n parseWorktreeInclude,\n} from \"../../worktree/index.js\";\nimport {\n isInsideWorktree,\n findMainWorktree,\n} from \"../../worktree/resolve.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n warn,\n label,\n} from \"../shared/ui.js\";\n\nexport async function worktreeSetupCommand(\n worktreePath?: string,\n opts: { from?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<void> {\n printBanner(true);\n\n const cwd = process.cwd();\n let mainRoot: string;\n let targetRoot: string;\n\n if (isInsideWorktree(cwd)) {\n mainRoot = opts.from ?? findMainWorktree(cwd);\n targetRoot = worktreePath ? join(cwd, worktreePath) : cwd;\n info(`Detected worktree. Main repo: ${chalk.dim(mainRoot)}`);\n } else {\n mainRoot = opts.from ?? cwd;\n if (!worktreePath) {\n logError(\"Worktree path is required when running from the main repo.\");\n console.log(chalk.dim(\" Usage: hatch3r worktree-setup <worktree-path>\"));\n console.log(chalk.dim(\" Or run this command from inside a worktree.\\n\"));\n throw new HatchError(\"Missing worktree path\", 1);\n }\n targetRoot = join(cwd, worktreePath);\n }\n\n const includePath = join(mainRoot, WORKTREE_INCLUDE_FILE);\n let includeContent: string;\n try {\n includeContent = await readFile(includePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n logError(`No ${WORKTREE_INCLUDE_FILE} found in ${mainRoot}`);\n console.log(chalk.dim(\" Run `hatch3r init` or `hatch3r sync` to generate it.\\n\"));\n throw new HatchError(`Missing ${WORKTREE_INCLUDE_FILE}`, 1);\n }\n throw err;\n }\n\n if (opts.dryRun) {\n info(\"Dry run — no changes will be made.\\n\");\n const entries = parseWorktreeInclude(includeContent);\n const summaryLines = entries.map((e) => {\n const icon = e.strategy === \"symlink\" ? chalk.cyan(\"→\") : chalk.green(\"+\");\n return ` ${icon} ${e.pattern} ${chalk.dim(`(${e.strategy})`)}`;\n });\n printBox(\"Worktree setup (dry run)\", [\n label(\"Source\", mainRoot),\n label(\"Target\", targetRoot),\n label(\"Entries\", `${entries.length}`),\n \"\",\n ...summaryLines,\n ], \"info\");\n return;\n }\n\n const s = createSpinner(\"Setting up worktree files...\");\n s.start();\n\n const result = await setupWorktree(mainRoot, targetRoot);\n\n s.succeed(\"Worktree files set up\");\n\n const summaryLines: string[] = [];\n if (result.copied.length > 0) {\n summaryLines.push(label(\"Copied\", `${result.copied.length} file(s)`));\n for (const f of result.copied) {\n summaryLines.push(` ${chalk.green(\"+\")} ${f}`);\n }\n }\n if (result.symlinked.length > 0) {\n summaryLines.push(label(\"Symlinked\", `${result.symlinked.length} path(s)`));\n for (const f of result.symlinked) {\n summaryLines.push(` ${chalk.cyan(\"→\")} ${f}`);\n }\n }\n if (result.skipped.length > 0) {\n summaryLines.push(label(\"Skipped\", `${result.skipped.length} path(s)`));\n }\n if (result.errors.length > 0) {\n for (const e of result.errors) {\n warn(e);\n }\n }\n\n if (summaryLines.length > 0) {\n printBox(\"Worktree setup\", summaryLines, \"success\");\n } else {\n info(\"No files to set up (all patterns already satisfied or source files missing).\");\n }\n\n // Auto-sync adapter output in the worktree so CLAUDE.md, .claude/, etc. are fresh\n try {\n info(\"Syncing adapter output in worktree...\");\n execFileSync(\"npx\", [\"hatch3r\", \"sync\", \"--yes\"], {\n cwd: targetRoot,\n stdio: \"pipe\",\n });\n info(\"Adapter output synced in worktree\");\n } catch {\n warn(\"Could not auto-sync adapter output. Run `hatch3r sync` in the worktree manually.\");\n }\n}\n","export type Platform = \"github\" | \"azure-devops\" | \"gitlab\";\n\nexport interface ModelConfig {\n default?: string;\n agents?: Record<string, string>;\n}\n\nexport interface ClaudeConfig {\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n teammateMode?: \"auto\" | \"in-process\" | \"tmux\" | \"tool-using\" | \"full-trust\" | \"manual-approval\";\n agentTeams?: boolean | \"ga\";\n}\n\n/** Controls how adapter output is generated (verbosity), not what content is selected. */\nexport type GenerationMode = \"standard\" | \"minimal\";\n\nexport interface HatchManifest {\n version: string;\n hatch3rVersion: string;\n platform?: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n board?: BoardConfig;\n repos?: RepoEntry[];\n packages?: PackageEntry[];\n hooks?: HooksConfig;\n models?: ModelConfig;\n claude?: ClaudeConfig;\n /** Content selection from init. undefined = legacy \"full\" (backward compat). */\n content?: ContentSelection;\n /** Detected project languages from repo analysis. */\n languages?: string[];\n /** Git worktree file-isolation settings. */\n worktree?: WorktreeConfig;\n /** Tracks project specs generated by /project-spec or /api-spec commands. */\n specs?: {\n paths: string[];\n lastGenerated?: string;\n };\n /** Present when this repo is managed by a workspace. */\n workspace?: {\n /** Relative path from this repo back to workspace root. */\n rootPath: string;\n /** ISO timestamp of last workspace sync. */\n lastSync: string;\n /** hatch3r version used for last sync. */\n syncVersion: string;\n /** SHA-256 of workspace.json at time of sync. */\n workspaceChecksum: string;\n /** Content IDs explicitly excluded by this repo. */\n excludedContent?: string[];\n /** Content IDs added locally (not from workspace). */\n localContent?: string[];\n };\n managedFiles: string[];\n}\n\nexport interface WorktreeConfig {\n enabled: boolean;\n /** Additional user-specified gitignore patterns to include. */\n extraPatterns?: string[];\n /** Strategy for node_modules: \"symlink\" (default) or \"skip\". */\n nodeModules?: \"symlink\" | \"skip\";\n}\n\nexport const TOOLS = [\"cursor\", \"copilot\", \"claude\", \"opencode\", \"windsurf\", \"amp\", \"codex\", \"gemini\", \"cline\", \"aider\", \"kiro\", \"goose\", \"zed\", \"amazon-q\", \"antigravity\"] as const;\nexport type Tool = (typeof TOOLS)[number];\nexport const VALID_TOOLS = new Set<string>(TOOLS);\nexport const TOOL_CHOICES = TOOLS.join(\", \");\n\nexport interface BoardConfig {\n owner: string;\n repo: string;\n /** Default branch for checkout, PR base, and release. Fallback: \"main\". */\n defaultBranch?: string;\n projectNumber: number | null;\n statusFieldId: number | null;\n statusOptions: {\n backlog: string | null;\n ready: string | null;\n inProgress: string | null;\n inReview: string | null;\n done: string | null;\n };\n labels: {\n types: string[];\n executors: string[];\n statuses: string[];\n meta: string[];\n };\n branchConvention: string;\n areas: string[];\n}\n\nexport interface RepoEntry {\n owner: string;\n repo: string;\n name?: string;\n}\n\nexport interface PackageEntry {\n name: string;\n path: string;\n}\n\nexport interface Features {\n agents: boolean;\n skills: boolean;\n rules: boolean;\n prompts: boolean;\n commands: boolean;\n mcp: boolean;\n githubAgents: boolean;\n hooks: boolean;\n}\n\nexport interface McpConfig {\n servers: string[];\n}\n\nexport interface HooksConfig {\n enabled: boolean;\n}\n\nexport interface CanonicalFile {\n id: string;\n type: \"rule\" | \"agent\" | \"skill\" | \"command\" | \"prompt\" | \"github-agent\" | \"hook\";\n description: string;\n scope?: string;\n model?: string;\n protected?: boolean;\n /** Agent runs with restricted write permissions (Cursor v2.5+ subagents). */\n readonly?: boolean;\n /** Agent runs in background without blocking the parent (Cursor v2.5+ async subagents). */\n background?: boolean;\n tags?: string[];\n content: string;\n rawContent: string;\n sourcePath: string;\n}\n\nexport interface CanonicalMetadata {\n id: string;\n type: string;\n description: string;\n name?: string;\n scope?: string;\n model?: string;\n agent?: string;\n event?: string;\n globs?: string;\n protected?: boolean;\n alwaysApply?: boolean;\n /** Agent runs with restricted write permissions (Cursor v2.5+ subagents). */\n readonly?: boolean;\n /** Agent runs in background without blocking the parent (Cursor v2.5+ async subagents). */\n background?: boolean;\n tags?: string[];\n}\n\nexport interface ContentSelection {\n preset: \"minimal\" | \"standard\" | \"full\" | \"custom\";\n projectType: \"greenfield\" | \"brownfield\";\n teamSize: \"solo\" | \"team\";\n /** Explicit list of selected content IDs (without hatch3r- prefix).\n * Populated for all presets — the resolved result of preset + context filters. */\n items: {\n agents: string[];\n skills: string[];\n rules: string[];\n commands: string[];\n prompts: string[];\n hooks: string[];\n githubAgents: string[];\n };\n}\n\nexport interface AdapterOutput {\n path: string;\n content: string;\n /** Inner content for the managed block (used for merge on update). */\n managedContent?: string;\n action: \"create\" | \"update\" | \"skip\";\n}\n\nexport interface MergeResult {\n path: string;\n action: \"created\" | \"updated\" | \"skipped\";\n warning?: string;\n}\n\nexport interface RepoInfo {\n languages: string[];\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | \"unknown\";\n isMonorepo: boolean;\n hasExistingAgents: boolean;\n existingTools: Tool[];\n rootDir: string;\n}\n\nexport const MANAGED_BLOCK_START = \"<!-- HATCH3R:BEGIN -->\";\nexport const MANAGED_BLOCK_END = \"<!-- HATCH3R:END -->\";\nexport const HATCH3R_PREFIX = \"hatch3r-\";\nexport const AGENTS_DIR = \".agents\";\n\nexport class HatchError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number = 1,\n ) {\n super(message);\n this.name = \"HatchError\";\n }\n}\n\nexport function sanitizeId(id: string): string {\n return id.replace(/[^a-zA-Z0-9._-]/g, \"\");\n}\n\n/** Returns id with exactly one hatch3r- prefix (strips existing prefix before adding). */\nexport function toPrefixedId(id: string, prefix = HATCH3R_PREFIX): string {\n const base = id.replace(new RegExp(`^${prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`), \"\");\n return `${prefix}${base}`;\n}\nexport const MANIFEST_FILE = \"hatch.json\";\nexport const WORKTREE_INCLUDE_FILE = \".worktreeinclude\";\n\nexport const DEFAULT_FEATURES: Features = {\n agents: true,\n skills: true,\n rules: true,\n prompts: true,\n commands: true,\n mcp: true,\n githubAgents: true,\n hooks: true,\n};\n\nexport interface McpServerMeta {\n description: string;\n requiresEnv?: string[];\n}\n\nexport const ENV_VAR_HELP: Record<string, { comment: string; url: string }> = {\n GITHUB_PAT: {\n comment: \"GitHub MCP server — Classic PAT: repo, read:org, project. Fine-grained: Contents(RW), Issues(RW), Pull Requests(RW), Projects(RW)\",\n url: \"https://github.com/settings/tokens/new\",\n },\n AZURE_DEVOPS_PAT: {\n comment: \"Azure DevOps Personal Access Token (Work Items, Code, Build RW)\",\n url: \"https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate\",\n },\n AZURE_DEVOPS_ORG: {\n comment: \"Azure DevOps organization name\",\n url: \"https://dev.azure.com/\",\n },\n GITLAB_TOKEN: {\n comment: \"GitLab Personal Access Token (api scope)\",\n url: \"https://gitlab.com/-/user_settings/personal_access_tokens\",\n },\n BRAVE_API_KEY: {\n comment: \"Brave Search (free: 2,000 queries/month)\",\n url: \"https://brave.com/search/api/\",\n },\n SENTRY_AUTH_TOKEN: {\n comment: \"Sentry error tracking\",\n url: \"https://sentry.io/settings/account/api/auth-tokens/\",\n },\n POSTGRES_URL: {\n comment: \"PostgreSQL connection string (e.g. postgresql://user:pass@host:5432/db)\",\n url: \"\",\n },\n LINEAR_API_KEY: {\n comment: \"Linear issue tracking\",\n url: \"https://linear.app/settings/api\",\n },\n};\n\nexport const AVAILABLE_MCP_SERVERS: Record<string, McpServerMeta> = {\n github: {\n description:\n \"GitHub repository management, code review, issues, PRs, and project boards\",\n requiresEnv: [\"GITHUB_PAT\"],\n },\n \"azure-devops\": {\n description:\n \"Azure DevOps work items, repos, pipelines, and boards\",\n requiresEnv: [\"AZURE_DEVOPS_PAT\", \"AZURE_DEVOPS_ORG\"],\n },\n gitlab: {\n description:\n \"GitLab issues, merge requests, pipelines, and project management\",\n requiresEnv: [\"GITLAB_TOKEN\"],\n },\n context7: {\n description:\n \"Up-to-date, version-specific library documentation for LLMs\",\n },\n filesystem: {\n description: \"File management and code editing operations\",\n },\n playwright: {\n description: \"Browser automation, web testing, and UI interaction\",\n },\n \"brave-search\": {\n description:\n \"Web research, fact-checking, and current information retrieval\",\n requiresEnv: [\"BRAVE_API_KEY\"],\n },\n sentry: {\n description:\n \"Error tracking and performance monitoring (enable and configure with your Sentry auth token)\",\n requiresEnv: [\"SENTRY_AUTH_TOKEN\"],\n },\n postgres: {\n description:\n \"PostgreSQL database queries and schema inspection (enable and configure with your connection string)\",\n requiresEnv: [\"POSTGRES_URL\"],\n },\n linear: {\n description:\n \"Linear issue tracking and project management (enable and configure with your Linear API key)\",\n requiresEnv: [\"LINEAR_API_KEY\"],\n },\n};\n","import { readFile, mkdir, copyFile, symlink, lstat, unlink } from \"node:fs/promises\";\nimport { join, relative, dirname } from \"node:path\";\nimport {\n MANAGED_BLOCK_START,\n MANAGED_BLOCK_END,\n WORKTREE_INCLUDE_FILE,\n type HatchManifest,\n} from \"../types.js\";\nimport type { WorktreeEntry, WorktreeSetupResult } from \"./types.js\";\nimport { resolvePatterns, findMainWorktree } from \"./resolve.js\";\n\n// ─── Adapter worktree patterns ───────────────────────────────────────────────\n\n/**\n * Per-tool adapter output patterns that should be present in worktrees.\n * All use \"copy\" strategy so worktrees can run `hatch3r sync` independently\n * without cross-worktree contamination via symlinks.\n *\n * Including patterns for files that are tracked by git is harmless —\n * `resolvePatterns` uses `git ls-files --others --ignored` which only matches\n * untracked+gitignored files, so tracked patterns are a no-op safety net.\n */\nexport const ADAPTER_WORKTREE_PATTERNS: Record<\n string,\n { pattern: string; strategy: \"copy\" | \"symlink\"; reason: string }[]\n> = {\n claude: [\n { pattern: \"CLAUDE.md\", strategy: \"copy\", reason: \"Claude main instructions\" },\n { pattern: \".claude/\", strategy: \"copy\", reason: \"Claude adapter output (settings, rules, agents, skills, commands)\" },\n { pattern: \".mcp.json\", strategy: \"copy\", reason: \"MCP server config\" },\n ],\n gemini: [\n { pattern: \"GEMINI.md\", strategy: \"copy\", reason: \"Gemini main instructions\" },\n { pattern: \".gemini/\", strategy: \"copy\", reason: \"Gemini adapter output (settings, commands, skills)\" },\n ],\n cursor: [\n { pattern: \".cursor/\", strategy: \"copy\", reason: \"Cursor adapter output (rules, agents, skills, commands, MCP)\" },\n ],\n copilot: [\n { pattern: \".github/copilot-instructions.md\", strategy: \"copy\", reason: \"Copilot instructions\" },\n { pattern: \".github/instructions/\", strategy: \"copy\", reason: \"Copilot scoped instructions\" },\n { pattern: \".github/agents/\", strategy: \"copy\", reason: \"Copilot agents\" },\n { pattern: \".github/prompts/\", strategy: \"copy\", reason: \"Copilot prompts\" },\n { pattern: \".github/copilot/\", strategy: \"copy\", reason: \"Copilot commands and agents\" },\n { pattern: \".github/skills/\", strategy: \"copy\", reason: \"Copilot skills\" },\n { pattern: \".vscode/mcp.json\", strategy: \"copy\", reason: \"VS Code MCP config\" },\n ],\n windsurf: [\n { pattern: \".windsurfrules\", strategy: \"copy\", reason: \"Windsurf main instructions\" },\n { pattern: \".windsurf/\", strategy: \"copy\", reason: \"Windsurf adapter output (rules, skills, workflows, MCP)\" },\n ],\n cline: [\n { pattern: \".roomodes\", strategy: \"copy\", reason: \"Roo Code custom modes\" },\n { pattern: \".roo/\", strategy: \"copy\", reason: \"Roo Code rules and MCP\" },\n { pattern: \".cline/\", strategy: \"copy\", reason: \"Cline skills\" },\n { pattern: \".clinerules/\", strategy: \"copy\", reason: \"Cline workflows\" },\n ],\n amp: [\n { pattern: \".amp/\", strategy: \"copy\", reason: \"Amp adapter output (agents, settings, skills)\" },\n ],\n codex: [\n { pattern: \".codex/\", strategy: \"copy\", reason: \"Codex adapter output (config, skills)\" },\n ],\n opencode: [\n { pattern: \"opencode.json\", strategy: \"copy\", reason: \"OpenCode config\" },\n { pattern: \".opencode/\", strategy: \"copy\", reason: \"OpenCode adapter output (agents, skills, commands)\" },\n ],\n kiro: [\n { pattern: \".kiro/\", strategy: \"copy\", reason: \"Kiro adapter output (steering, settings)\" },\n ],\n aider: [\n { pattern: \"CONVENTIONS.md\", strategy: \"copy\", reason: \"Aider conventions\" },\n { pattern: \".aider.conf.yml\", strategy: \"copy\", reason: \"Aider config\" },\n { pattern: \".aider/\", strategy: \"copy\", reason: \"Aider skills\" },\n ],\n goose: [\n { pattern: \".goosehints\", strategy: \"copy\", reason: \"Goose instructions\" },\n { pattern: \".goose/\", strategy: \"copy\", reason: \"Goose MCP config\" },\n ],\n zed: [\n { pattern: \".rules\", strategy: \"copy\", reason: \"Zed rules\" },\n ],\n \"amazon-q\": [\n { pattern: \".amazonq/\", strategy: \"copy\", reason: \"Amazon Q adapter output (rules, settings)\" },\n ],\n antigravity: [\n { pattern: \".antigravity/\", strategy: \"copy\", reason: \"Antigravity adapter output (rules, skills, settings)\" },\n ],\n};\n\n// ─── Generate ────────────────────────────────────────────────────────────────\n\n/**\n * Builds the `.worktreeinclude` file content with managed blocks.\n * Each entry is annotated with a strategy suffix (`# hatch3r:symlink` or\n * implicit copy) so that `parseWorktreeInclude` can reconstruct the plan.\n */\nexport async function generateWorktreeInclude(\n manifest: HatchManifest,\n rootDir: string,\n): Promise<string> {\n const lines: string[] = [];\n const entries: { pattern: string; strategy: \"copy\" | \"symlink\"; reason: string }[] = [];\n\n // Always include env files (copy — they contain secrets)\n entries.push({ pattern: \".env\", strategy: \"copy\", reason: \"environment variables\" });\n entries.push({ pattern: \".env.*\", strategy: \"copy\", reason: \"environment variables (includes .env.mcp)\" });\n\n // .agents/ — always include (no-op if tracked by git)\n entries.push({ pattern: \".agents/\", strategy: \"symlink\", reason: \"shared agent definitions\" });\n entries.push({\n pattern: \".agents/learnings/\",\n strategy: \"copy\",\n reason: \"per-worktree learnings (diverge across branches)\",\n });\n\n // AGENTS.md — public agent documentation\n entries.push({ pattern: \"AGENTS.md\", strategy: \"copy\", reason: \"public agent documentation\" });\n\n // docs/specs/ — project specifications (read by agents during implementation and review)\n entries.push({ pattern: \"docs/specs/\", strategy: \"copy\", reason: \"project specifications for agent context\" });\n\n // Tool-specific adapter output patterns\n for (const tool of manifest.tools) {\n const toolPatterns = ADAPTER_WORKTREE_PATTERNS[tool];\n if (toolPatterns) {\n entries.push(...toolPatterns);\n }\n }\n\n // node_modules\n if (manifest.worktree?.nodeModules !== \"skip\") {\n entries.push({\n pattern: \"node_modules/\",\n strategy: \"symlink\",\n reason: \"shared dependencies (saves disk space)\",\n });\n }\n\n // Extra user-specified patterns\n if (manifest.worktree?.extraPatterns) {\n for (const p of manifest.worktree.extraPatterns) {\n entries.push({ pattern: p, strategy: \"copy\", reason: \"user-specified\" });\n }\n }\n\n // Build file content\n lines.push(\"# hatch3r worktree include file\");\n lines.push(\"# Defines which gitignored files should be present in worktrees.\");\n lines.push(\"# Lines with '# hatch3r:symlink' are symlinked; others are copied.\");\n lines.push(\"\");\n lines.push(MANAGED_BLOCK_START);\n\n for (const entry of entries) {\n lines.push(`# ${entry.reason}`);\n if (entry.strategy === \"symlink\") {\n lines.push(`${entry.pattern} # hatch3r:symlink`);\n } else {\n lines.push(entry.pattern);\n }\n }\n\n lines.push(MANAGED_BLOCK_END);\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n// ─── Parse ───────────────────────────────────────────────────────────────────\n\n/**\n * Parses a `.worktreeinclude` file into structured entries.\n * - Skips blank lines and comment-only lines.\n * - Detects `# hatch3r:symlink` suffix to determine strategy.\n */\nexport function parseWorktreeInclude(content: string): WorktreeEntry[] {\n const entries: WorktreeEntry[] = [];\n const lines = content.split(\"\\n\");\n\n let lastComment = \"\";\n\n for (const raw of lines) {\n const line = raw.trim();\n\n // Skip empty lines\n if (!line) {\n lastComment = \"\";\n continue;\n }\n\n // Track comments as potential reasons for the next entry\n if (line.startsWith(\"#\") && !line.includes(\"hatch3r:\")) {\n // Skip managed block markers\n if (line === MANAGED_BLOCK_START || line === MANAGED_BLOCK_END) {\n continue;\n }\n lastComment = line.slice(1).trim();\n continue;\n }\n\n // Also skip raw managed block markers (they don't start with #)\n if (line === MANAGED_BLOCK_START || line === MANAGED_BLOCK_END) {\n continue;\n }\n\n // Parse entry line\n const symlinkSuffix = \"# hatch3r:symlink\";\n const isSymlink = line.includes(symlinkSuffix);\n const pattern = line\n .replace(symlinkSuffix, \"\")\n .trim();\n\n if (pattern) {\n entries.push({\n pattern,\n strategy: isSymlink ? \"symlink\" : \"copy\",\n reason: lastComment || undefined,\n });\n }\n\n lastComment = \"\";\n }\n\n return entries;\n}\n\n// ─── Setup ───────────────────────────────────────────────────────────────────\n\n/**\n * Sets up a worktree by reading `.worktreeinclude` from the main root,\n * resolving patterns against the working tree, and copying or symlinking\n * each matched file into the worktree root.\n */\nexport async function setupWorktree(\n mainRoot: string,\n worktreeRoot: string,\n): Promise<WorktreeSetupResult> {\n const result: WorktreeSetupResult = {\n copied: [],\n symlinked: [],\n skipped: [],\n errors: [],\n };\n\n const includePath = join(mainRoot, WORKTREE_INCLUDE_FILE);\n let content: string;\n try {\n content = await readFile(includePath, \"utf-8\");\n } catch {\n result.errors.push(`Could not read ${WORKTREE_INCLUDE_FILE} from ${mainRoot}`);\n return result;\n }\n\n const entries = parseWorktreeInclude(content);\n if (entries.length === 0) return result;\n\n const patterns: string[] = [];\n for (const entry of entries) {\n patterns.push(entry.pattern);\n }\n\n // Resolve patterns to actual files\n const resolvedPaths = await resolvePatterns(mainRoot, patterns);\n\n for (const relPath of resolvedPaths) {\n const srcPath = join(mainRoot, relPath);\n const destPath = join(worktreeRoot, relPath);\n\n // Determine strategy: find the most specific matching pattern\n let strategy: \"copy\" | \"symlink\" = \"copy\";\n for (const entry of entries) {\n const pat = entry.pattern.replace(/\\/$/, \"\");\n if (relPath === pat || relPath.startsWith(pat + \"/\") || relPath === entry.pattern) {\n strategy = entry.strategy;\n // Don't break — later entries can override (e.g., .agents/learnings/ overrides .agents/)\n }\n }\n\n try {\n // Skip if destination already exists (idempotent re-run)\n let destExists = false;\n try {\n await lstat(destPath);\n destExists = true;\n } catch {\n // Doesn't exist — proceed\n }\n if (destExists) {\n result.skipped.push(relPath);\n continue;\n }\n\n await mkdir(dirname(destPath), { recursive: true });\n\n if (strategy === \"symlink\") {\n const relTarget = relative(dirname(destPath), srcPath);\n try {\n await symlink(relTarget, destPath);\n result.symlinked.push(relPath);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"EPERM\") {\n // Fall back to copy on permission errors (e.g., Windows without dev mode)\n await copyFile(srcPath, destPath);\n result.copied.push(relPath);\n } else if (code === \"EEXIST\") {\n result.skipped.push(relPath);\n } else {\n throw err;\n }\n }\n } else {\n await copyFile(srcPath, destPath);\n result.copied.push(relPath);\n }\n } catch (err) {\n result.errors.push(`${relPath}: ${(err as Error).message}`);\n }\n }\n\n return result;\n}\n\n// ─── Cleanup ─────────────────────────────────────────────────────────────────\n\n/**\n * Removes symlinks that were created by `setupWorktree`.\n * Reads the `.worktreeinclude` from the worktree root (it may have been\n * symlinked or copied in), falling back to the main worktree if not found.\n */\nexport async function cleanupWorktree(worktreeRoot: string): Promise<void> {\n let content: string | null = null;\n\n // Try reading from the worktree itself first\n const localPath = join(worktreeRoot, WORKTREE_INCLUDE_FILE);\n try {\n content = await readFile(localPath, \"utf-8\");\n } catch {\n // Not found locally — try the main worktree\n try {\n const mainRoot = findMainWorktree(worktreeRoot);\n content = await readFile(join(mainRoot, WORKTREE_INCLUDE_FILE), \"utf-8\");\n } catch {\n // Can't find include file anywhere — nothing to clean up\n return;\n }\n }\n\n if (!content) return;\n\n const entries = parseWorktreeInclude(content);\n\n for (const entry of entries) {\n if (entry.strategy !== \"symlink\") continue;\n\n const targetPath = join(worktreeRoot, entry.pattern.replace(/\\/$/, \"\"));\n try {\n const stat = await lstat(targetPath);\n if (stat.isSymbolicLink()) {\n await unlink(targetPath);\n }\n } catch {\n // Path doesn't exist or can't be stat'd — skip\n }\n }\n}\n\n// ─── Managed content ─────────────────────────────────────────────────────────\n\n/**\n * Extracts the inner content between `MANAGED_BLOCK_START` and\n * `MANAGED_BLOCK_END` markers. Used by `safeWriteFile` for merge operations.\n */\nexport function extractManagedContent(fullContent: string): string {\n const startIdx = fullContent.indexOf(MANAGED_BLOCK_START);\n const endIdx = fullContent.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return \"\";\n }\n\n return fullContent\n .substring(startIdx + MANAGED_BLOCK_START.length, endIdx)\n .trim();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { statSync, readFileSync, writeFileSync, unlinkSync } from \"node:fs\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\n\n/**\n * Writes the given gitignore-style patterns to a temp file, then runs\n * `git ls-files --others --ignored --exclude-from=<tmpfile>` to resolve\n * them against the working tree. Returns the matched file paths.\n */\nexport async function resolvePatterns(\n rootDir: string,\n patterns: string[],\n): Promise<string[]> {\n if (patterns.length === 0) return [];\n\n const tmpFile = join(\n tmpdir(),\n `hatch3r-worktree-${randomBytes(4).toString(\"hex\")}`,\n );\n\n try {\n writeFileSync(tmpFile, patterns.join(\"\\n\") + \"\\n\", \"utf-8\");\n\n const output = execFileSync(\n \"git\",\n [\"ls-files\", \"--others\", \"--ignored\", `--exclude-from=${tmpFile}`],\n { cwd: rootDir, encoding: \"utf-8\", maxBuffer: 10 * 1024 * 1024 },\n );\n\n return output\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n } catch (err) {\n console.error(`[hatch3r] worktree pattern resolution failed: ${(err as Error).message}`);\n return [];\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n // Temp file may already be gone\n }\n }\n}\n\n/**\n * Checks whether the given directory is inside a git worktree (as opposed to\n * the main repo). In a worktree, `.git` is a *file* containing `gitdir: ...`\n * rather than a directory.\n */\nexport function isInsideWorktree(dir: string): boolean {\n try {\n const stat = statSync(join(dir, \".git\"));\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Given a worktree directory, reads the `.git` file, parses the `gitdir:`\n * pointer, and traverses up to find the main repo root.\n *\n * The gitdir typically points to `.git/worktrees/<name>`, so we go up 3\n * levels to reach the main repo root.\n *\n * @throws if the `.git` file can't be read or parsed.\n */\nexport function findMainWorktree(worktreeDir: string): string {\n const gitFilePath = join(worktreeDir, \".git\");\n const content = readFileSync(gitFilePath, \"utf-8\").trim();\n\n const match = content.match(/^gitdir:\\s*(.+)$/m);\n if (!match) {\n throw new Error(\n `Unable to parse .git file in ${worktreeDir}: expected \"gitdir: <path>\"`,\n );\n }\n\n // gitdir points to <main-repo>/.git/worktrees/<name>\n // Resolve relative paths against the worktree directory, then go up 3 levels.\n const rawGitdir = match[1].trim();\n const absGitdir = resolve(worktreeDir, rawGitdir);\n\n // Traverse: .git/worktrees/<name> → .git/worktrees → .git → repo root\n const mainRoot = dirname(dirname(dirname(absGitdir)));\n return mainRoot;\n}\n\n/**\n * Checks whether a path is gitignored in the given repository root.\n * Runs `git check-ignore -q <path>` — exit code 0 means ignored.\n */\nexport function isGitIgnored(rootDir: string, filePath: string): boolean {\n try {\n execFileSync(\"git\", [\"check-ignore\", \"-q\", filePath], {\n cwd: rootDir,\n stdio: \"ignore\",\n });\n return true;\n } catch {\n return false;\n }\n}\n","import { fileURLToPath } from \"node:url\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { readManifest, writeManifest } from \"../../manifest/hatchJson.js\";\nimport {\n AGENTS_DIR,\n DEFAULT_FEATURES,\n HatchError,\n WORKTREE_INCLUDE_FILE,\n type ContentSelection,\n type Features,\n type HatchManifest,\n type Platform,\n type Tool,\n} from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n error as logError,\n step,\n label,\n warn,\n} from \"../shared/ui.js\";\nimport { runUpdate } from \"./update.js\";\nimport { archiveToolOutputs, removeManagedFilesForPaths, type MigrationNotice } from \"../../archive/index.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { readWorkspaceManifest, writeWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { detectSubRepos } from \"../../workspace/detect.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport { detectRepoGitIdentity } from \"../../workspace/git.js\";\nimport { TOOL_DISPLAY_NAMES, TOOL_PROMPT_CHOICES, FEATURE_CHOICES, MCP_CHOICES, PLATFORM_DISPLAY_NAMES, PLATFORM_MCP_SERVER, sanitizeInput, isWSL } from \"../shared/constants.js\";\nimport {\n buildContentIndex,\n getAvailableItems,\n addContentItem,\n removeContentItem,\n countSelectionItems,\n selectionSummary,\n extractContentReferences,\n validateOrchestrationDependencies,\n TYPE_TO_SELECTION_KEY,\n} from \"../../content/index.js\";\nimport { generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\ninterface ConfigDiff {\n addedTools: Tool[];\n removedTools: Tool[];\n addedMcp: string[];\n removedMcp: string[];\n enabledFeatures: (keyof Features)[];\n disabledFeatures: (keyof Features)[];\n platformChanged: boolean;\n repoChanged: boolean;\n addedContent: Array<{ type: string; id: string }>;\n removedContent: Array<{ type: string; id: string }>;\n}\n\nfunction computeDiff(\n oldManifest: HatchManifest,\n newTools: Tool[],\n newFeatures: Features,\n newMcp: string[],\n newPlatform: Platform,\n newOwner: string,\n newRepo: string,\n newNamespace: string,\n newProject: string,\n): ConfigDiff {\n const oldToolSet = new Set(oldManifest.tools);\n const newToolSet = new Set(newTools);\n const oldMcpSet = new Set(oldManifest.mcp.servers);\n const newMcpSet = new Set(newMcp);\n\n const enabledFeatures: (keyof Features)[] = [];\n const disabledFeatures: (keyof Features)[] = [];\n for (const key of Object.keys(DEFAULT_FEATURES) as (keyof Features)[]) {\n if (newFeatures[key] && !oldManifest.features[key]) enabledFeatures.push(key);\n if (!newFeatures[key] && oldManifest.features[key]) disabledFeatures.push(key);\n }\n\n return {\n addedTools: newTools.filter((t) => !oldToolSet.has(t)),\n removedTools: oldManifest.tools.filter((t) => !newToolSet.has(t)),\n addedMcp: newMcp.filter((s) => !oldMcpSet.has(s)),\n removedMcp: oldManifest.mcp.servers.filter((s) => !newMcpSet.has(s)),\n enabledFeatures,\n disabledFeatures,\n platformChanged: newPlatform !== oldManifest.platform,\n repoChanged:\n newOwner !== oldManifest.owner ||\n newRepo !== oldManifest.repo ||\n newNamespace !== oldManifest.namespace ||\n newProject !== oldManifest.project,\n addedContent: [],\n removedContent: [],\n };\n}\n\nfunction isDiffEmpty(diff: ConfigDiff): boolean {\n return (\n diff.addedTools.length === 0 &&\n diff.removedTools.length === 0 &&\n diff.addedMcp.length === 0 &&\n diff.removedMcp.length === 0 &&\n diff.enabledFeatures.length === 0 &&\n diff.disabledFeatures.length === 0 &&\n !diff.platformChanged &&\n !diff.repoChanged &&\n diff.addedContent.length === 0 &&\n diff.removedContent.length === 0\n );\n}\n\nfunction printCurrentConfig(manifest: HatchManifest): void {\n const platformLabel = manifest.platform\n ? `${PLATFORM_DISPLAY_NAMES[manifest.platform]} (${manifest.namespace || manifest.owner}/${manifest.project || manifest.repo})`\n : \"Not set\";\n const branch = manifest.board?.defaultBranch ?? \"main\";\n const enabledFeatures = Object.entries(manifest.features)\n .filter(([, v]) => v)\n .map(([k]) => k);\n const toolNames = manifest.tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \");\n\n const lines = [\n label(\"Platform\", platformLabel),\n label(\"Branch\", branch),\n label(\"Tools\", toolNames),\n label(\"Features\", enabledFeatures.join(\", \")),\n label(\"MCP\", manifest.mcp.servers.length > 0 ? manifest.mcp.servers.join(\", \") : \"none\"),\n ];\n\n if (manifest.content) {\n const total = countSelectionItems(manifest.content);\n lines.push(label(\"Content\", `${total} items (${selectionSummary(manifest.content)})`));\n }\n\n printBox(\"Current configuration\", lines, \"info\");\n}\n\nexport async function configCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1);\n }\n\n // Warn early if this repo is managed by a workspace\n if (manifest.workspace) {\n warn(\n `This repo is managed by workspace at ${manifest.workspace.rootPath}. ` +\n `Changes here may be overwritten on next workspace sync.`,\n );\n console.log();\n }\n\n printCurrentConfig(manifest);\n\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n // --- Platform ---\n const platformAnswer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"list\",\n name: \"platform\",\n message: \"Platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: manifest.platform ?? \"github\",\n },\n ]);\n const platform = platformAnswer.platform;\n\n // --- Repo identity ---\n let owner: string;\n let repo: string;\n let namespace: string;\n let project: string;\n\n if (platform === \"azure-devops\") {\n const adoAnswers = await inquirer.prompt<{ org: string; project: string; repo: string }>([\n { type: \"input\", name: \"org\", message: \"Azure DevOps organization:\", default: manifest.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Azure DevOps project:\", default: manifest.project || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: manifest.repo || undefined },\n ]);\n owner = sanitizeInput(adoAnswers.org);\n repo = sanitizeInput(adoAnswers.repo);\n namespace = owner;\n project = sanitizeInput(adoAnswers.project);\n } else if (platform === \"gitlab\") {\n const glAnswers = await inquirer.prompt<{ namespace: string; project: string }>([\n { type: \"input\", name: \"namespace\", message: \"GitLab namespace (group or username):\", default: manifest.namespace || manifest.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Project name:\", default: manifest.project || manifest.repo || undefined },\n ]);\n owner = sanitizeInput(glAnswers.namespace);\n repo = sanitizeInput(glAnswers.project);\n namespace = owner;\n project = repo;\n } else {\n const repoAnswers = await inquirer.prompt<{ owner: string; repo: string }>([\n { type: \"input\", name: \"owner\", message: \"GitHub owner (org or username):\", default: manifest.owner || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: manifest.repo || undefined },\n ]);\n owner = sanitizeInput(repoAnswers.owner);\n repo = sanitizeInput(repoAnswers.repo);\n namespace = owner;\n project = repo;\n }\n\n // --- Default branch ---\n const currentBranch = manifest.board?.defaultBranch ?? \"main\";\n const branchAnswer = await inquirer.prompt<{ defaultBranch: string }>([\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch (for checkout, PR base, release):\",\n default: currentBranch,\n },\n ]);\n const defaultBranch = branchAnswer.defaultBranch.trim() || currentBranch;\n\n // --- Tools ---\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: manifest.tools,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const tools = toolAnswers.tools;\n\n if (tools.length === 0) {\n logError(\"At least one tool must be selected.\");\n throw new HatchError(\"At least one tool must be selected.\", 1);\n }\n\n // --- Features ---\n const currentFeatureKeys = (Object.keys(DEFAULT_FEATURES) as (keyof Features)[])\n .filter((k) => manifest.features[k]);\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features:\",\n choices: FEATURE_CHOICES,\n default: currentFeatureKeys,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n const features: Features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n // --- MCP servers ---\n let mcpServers: string[] = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: manifest.mcp.servers,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n // --- Worktree isolation ---\n const worktreeCapableTools = new Set([\"claude\"]);\n const hasWorktreeTool = tools.some(t => worktreeCapableTools.has(t));\n if (hasWorktreeTool) {\n const wtAnswer = await inquirer.prompt<{ enabled: boolean }>([{\n type: \"confirm\",\n name: \"enabled\",\n message: \"Enable worktree file isolation (for parallel agent sessions)?\",\n default: manifest.worktree?.enabled ?? true,\n }]);\n manifest.worktree = {\n ...manifest.worktree,\n enabled: wtAnswer.enabled,\n };\n }\n\n // --- Content management ---\n const contentChanges: { added: Array<{ type: string; id: string }>; removed: Array<{ type: string; id: string }> } = { added: [], removed: [] };\n if (manifest.content) {\n const manageContent = await inquirer.prompt<{ manage: boolean }>([\n {\n type: \"confirm\",\n name: \"manage\",\n message: \"Manage content items?\",\n default: false,\n },\n ]);\n\n if (manageContent.manage) {\n // #145 (D19-16): Explain config vs .customize.yaml distinction\n info(\n chalk.dim(\"Config adds/removes content items. To customize an item's behavior without \") +\n chalk.dim(\"removing it, use .hatch3r/<type>/<id>.customize.yaml instead.\"),\n );\n console.log();\n\n const contentRoot = findPackageRoot(__dirname);\n const agentsDir = join(rootDir, AGENTS_DIR);\n const index = await buildContentIndex(contentRoot);\n\n // Build current installed set from manifest\n const currentIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) currentIds.add(id);\n }\n\n const contentAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items (space to toggle):\",\n choices: index.items.map((item) => ({\n name: `${item.type}: ${item.id.replace(/^hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: currentIds.has(item.id),\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n\n const newIds = new Set(contentAnswer.items);\n\n // Identify removed items and warn about dependents (D19-6)\n const pendingRemovals: string[] = [];\n for (const id of currentIds) {\n if (!newIds.has(id)) pendingRemovals.push(id);\n }\n\n if (pendingRemovals.length > 0) {\n const dependencyWarnings: string[] = [];\n for (const removedId of pendingRemovals) {\n const dependents: string[] = [];\n for (const keepId of contentAnswer.items) {\n const keepItem = index.byId.get(keepId);\n if (!keepItem) continue;\n try {\n const filePath = keepItem.type === \"skill\"\n ? join(agentsDir, keepItem.relativePath, \"SKILL.md\")\n : join(agentsDir, keepItem.relativePath);\n const content = await readFile(filePath, \"utf-8\");\n const refs = extractContentReferences(content);\n if (refs.includes(removedId)) {\n dependents.push(keepId);\n }\n } catch {\n // File not readable, skip\n }\n }\n if (dependents.length > 0) {\n dependencyWarnings.push(\n `Removing \"${removedId}\" — referenced by: ${dependents.join(\", \")}`,\n );\n }\n }\n\n // Check orchestration dependencies with the proposed new selection\n const proposedSelection: ContentSelection = {\n ...manifest.content!,\n items: {\n agents: [], skills: [], rules: [], commands: [],\n prompts: [], hooks: [], githubAgents: [],\n },\n };\n for (const id of contentAnswer.items) {\n const proposedItem = index.byId.get(id);\n if (proposedItem) {\n const key = TYPE_TO_SELECTION_KEY[proposedItem.type];\n if (key) proposedSelection.items[key].push(proposedItem.id);\n }\n }\n const orchWarnings = validateOrchestrationDependencies(proposedSelection);\n dependencyWarnings.push(...orchWarnings);\n\n if (dependencyWarnings.length > 0) {\n console.log();\n warn(\"Dependency warnings for removed content:\");\n for (const w of dependencyWarnings) {\n console.log(chalk.dim(` ${w}`));\n }\n console.log();\n }\n }\n\n // Find added and removed items\n for (const id of contentAnswer.items) {\n if (!currentIds.has(id)) {\n const item = index.byId.get(id);\n if (item) {\n contentChanges.added.push({ type: item.type, id: item.id });\n await addContentItem(contentRoot, agentsDir, item);\n }\n }\n }\n for (const id of currentIds) {\n if (!newIds.has(id)) {\n const item = index.byId.get(id);\n if (item) {\n contentChanges.removed.push({ type: item.type, id: item.id });\n await removeContentItem(agentsDir, item, { rootDir });\n }\n }\n }\n\n // Update manifest content items\n const newItems: ContentSelection[\"items\"] = {\n agents: [], skills: [], rules: [], commands: [],\n prompts: [], hooks: [], githubAgents: [],\n };\n for (const id of contentAnswer.items) {\n const item = index.byId.get(id);\n if (item) {\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) newItems[key].push(item.id);\n }\n }\n manifest.content.items = newItems;\n\n // Regenerate canonical AGENTS.md after content changes\n if (contentChanges.added.length > 0 || contentChanges.removed.length > 0) {\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n }\n }\n }\n\n // --- Compute diff ---\n const diff = computeDiff(manifest, tools, features, mcpServers, platform, owner, repo, namespace, project);\n diff.addedContent = contentChanges.added;\n diff.removedContent = contentChanges.removed;\n\n if (isDiffEmpty(diff) && defaultBranch === currentBranch) {\n console.log();\n info(\"No changes detected.\");\n console.log();\n return;\n }\n\n // --- Archive removed tool outputs ---\n const allMigrations: MigrationNotice[] = [];\n const allArchivedFiles: string[] = [];\n const totalArchiveSteps = diff.removedTools.length;\n\n if (totalArchiveSteps > 0) {\n console.log();\n for (let i = 0; i < diff.removedTools.length; i++) {\n const tool = diff.removedTools[i];\n const s = createSpinner(\n step(i + 1, totalArchiveSteps, `Archiving ${TOOL_DISPLAY_NAMES[tool] ?? tool} output...`),\n );\n s.start();\n\n const result = await archiveToolOutputs(rootDir, tool);\n removeManagedFilesForPaths(manifest, result.archivedFiles);\n allArchivedFiles.push(...result.archivedFiles);\n allMigrations.push(...result.migrations);\n\n s.succeed(\n step(i + 1, totalArchiveSteps, `Archived ${result.archivedFiles.length} files from ${TOOL_DISPLAY_NAMES[tool] ?? tool}`),\n );\n }\n }\n\n // --- Apply changes to manifest ---\n manifest.platform = platform;\n manifest.owner = owner;\n manifest.repo = repo;\n manifest.namespace = namespace;\n manifest.project = project;\n manifest.tools = tools;\n manifest.features = features;\n manifest.mcp = { servers: mcpServers };\n\n if (manifest.board) {\n manifest.board.owner = owner;\n manifest.board.repo = repo;\n manifest.board.defaultBranch = defaultBranch;\n } else if (defaultBranch !== \"main\" || owner || repo) {\n manifest.board = {\n owner,\n repo,\n defaultBranch,\n projectNumber: null,\n statusFieldId: null,\n statusOptions: { backlog: null, ready: null, inProgress: null, inReview: null, done: null },\n labels: {\n types: [\"type:bug\", \"type:feature\", \"type:refactor\", \"type:qa\", \"type:docs\", \"type:infra\"],\n executors: [\"executor:agent\", \"executor:human\", \"executor:hybrid\"],\n statuses: [\"status:triage\", \"status:ready\", \"status:in-progress\", \"status:in-review\", \"status:blocked\"],\n meta: [\"meta:board-overview\"],\n },\n branchConvention: \"{type}/{short-description}\",\n areas: [],\n };\n }\n\n await writeManifest(rootDir, manifest);\n\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n managedContent: wtManaged,\n });\n }\n\n // --- Run full update (pull latest + copy templates + sync adapters) ---\n console.log();\n const updateResult = await runUpdate(rootDir, manifest);\n\n // --- Handle .env.mcp for new MCP servers ---\n if (features.mcp && mcpServers.length > 0) {\n try {\n const envResult = await ensureEnvMcp(rootDir, mcpServers);\n await ensureGitignoreEntry(rootDir);\n if (envResult.newVars.length > 0) {\n warn(`New secrets needed in .env.mcp: ${envResult.newVars.join(\", \")}`);\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\n } catch (err) {\n warn(`Could not update .env.mcp: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Print summary ---\n console.log();\n const summaryLines: string[] = [];\n\n if (diff.addedTools.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Tools added: ${diff.addedTools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")}`);\n }\n if (diff.removedTools.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Tools removed: ${diff.removedTools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")}`);\n }\n if (diff.addedMcp.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} MCP added: ${diff.addedMcp.join(\", \")}`);\n }\n if (diff.removedMcp.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} MCP removed: ${diff.removedMcp.join(\", \")}`);\n }\n if (diff.enabledFeatures.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Features enabled: ${diff.enabledFeatures.join(\", \")}`);\n }\n if (diff.disabledFeatures.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Features disabled: ${diff.disabledFeatures.join(\", \")}`);\n }\n if (diff.platformChanged) {\n summaryLines.push(`${chalk.yellow(\"~\")} Platform: ${PLATFORM_DISPLAY_NAMES[platform]}`);\n }\n if (diff.repoChanged) {\n summaryLines.push(`${chalk.yellow(\"~\")} Repo: ${namespace}/${project}`);\n }\n if (diff.addedContent.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Content added: ${diff.addedContent.length} item(s)`);\n }\n if (diff.removedContent.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Content removed: ${diff.removedContent.length} item(s)`);\n }\n if (defaultBranch !== currentBranch) {\n summaryLines.push(`${chalk.yellow(\"~\")} Default branch: ${defaultBranch}`);\n }\n\n summaryLines.push(\"\");\n summaryLines.push(label(\"Files\", `${updateResult.copiedFiles} canonical files updated`));\n summaryLines.push(label(\"Tools\", `${updateResult.syncedTools} tool(s) synced`));\n summaryLines.push(label(\"Version\", `v${updateResult.version}`));\n\n if (allArchivedFiles.length > 0) {\n summaryLines.push(\"\");\n summaryLines.push(label(\"Archived\", `${allArchivedFiles.length} files to .hatch3r-archive/`));\n }\n\n printBox(\"Config updated\", summaryLines, \"success\");\n\n if (allMigrations.length > 0) {\n console.log();\n info(\"Customizations migrated to .hatch3r/ (tool-agnostic):\");\n for (const m of allMigrations) {\n console.log(` ${chalk.dim(m.from)} ${chalk.cyan(\"→\")} ${m.to}`);\n }\n console.log();\n }\n\n // #146 (D19-17): Show migration guide when switching tools\n if (diff.addedTools.length > 0 || diff.removedTools.length > 0) {\n console.log();\n info(\"Tool migration notes:\");\n if (diff.removedTools.length > 0) {\n info(chalk.dim(` Removed tool output archived to .hatch3r-archive/ (recoverable).`));\n info(chalk.dim(` Customizations in .hatch3r/ are tool-agnostic and carry forward.`));\n }\n if (diff.addedTools.length > 0) {\n info(chalk.dim(` New tool output generated. Restart your editor to pick up changes.`));\n info(chalk.dim(` MCP secrets (.env.mcp) are shared across tools — no re-entry needed.`));\n }\n console.log();\n }\n\n // ── Workspace management ──────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (wsManifest) {\n console.log();\n info(chalk.bold(\"Workspace configuration\"));\n const currentRepos = wsManifest.repos.map((r) => r.path);\n console.log(chalk.dim(` Repos: ${currentRepos.join(\", \") || \"(none)\"}`));\n console.log(chalk.dim(` Sync strategy: ${wsManifest.syncStrategy}`));\n\n const { manageWorkspace } = await inquirer.prompt<{ manageWorkspace: boolean }>([\n {\n type: \"confirm\",\n name: \"manageWorkspace\",\n message: \"Configure workspace settings?\",\n default: false,\n },\n ]);\n\n if (manageWorkspace) {\n // Scan for new repos\n const detectedRepos = await detectSubRepos(rootDir);\n const existingPaths = new Set(wsManifest.repos.map((r) => r.path));\n const newRepos = detectedRepos.filter((r) => !existingPaths.has(r.path));\n\n if (newRepos.length > 0) {\n const { addRepos } = await inquirer.prompt<{ addRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"addRepos\",\n message: \"New repos detected. Add to workspace?\",\n choices: newRepos.map((r) => ({\n name: r.name,\n value: r.path,\n checked: false,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n for (const path of addRepos) {\n wsManifest.repos.push({ path, name: path, sync: false });\n }\n }\n\n // Toggle sync per repo\n if (wsManifest.repos.length > 0) {\n const { syncRepos } = await inquirer.prompt<{ syncRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"syncRepos\",\n message: \"Select repos to sync:\",\n choices: wsManifest.repos.map((r) => ({\n name: r.name ?? r.path,\n value: r.path,\n checked: r.sync,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const syncSet = new Set(syncRepos);\n for (const repo of wsManifest.repos) {\n repo.sync = syncSet.has(repo.path);\n }\n }\n\n // Per-repo git identity\n if (wsManifest.repos.length > 0) {\n const { editIdentity } = await inquirer.prompt<{ editIdentity: string }>([\n {\n type: \"list\",\n name: \"editIdentity\",\n message: \"Repo git identities:\",\n choices: [\n { name: \"Keep current\", value: \"keep\" },\n { name: \"Re-detect all from git remotes\", value: \"detect\" },\n { name: \"Edit manually\", value: \"edit\" },\n ],\n default: \"keep\",\n },\n ]);\n\n if (editIdentity === \"detect\") {\n for (const repo of wsManifest.repos) {\n const identity = detectRepoGitIdentity(join(rootDir, repo.path));\n repo.owner = identity.owner || undefined;\n repo.repo = identity.repo || undefined;\n repo.defaultBranch = identity.defaultBranch || undefined;\n repo.platform = identity.platform || undefined;\n }\n info(\"Re-detected git identities for all repos.\");\n } else if (editIdentity === \"edit\") {\n for (const repo of wsManifest.repos) {\n console.log(chalk.bold(`\\n ${repo.name ?? repo.path}:`));\n const identity = await inquirer.prompt<{ owner: string; repo: string; defaultBranch: string }>([\n { type: \"input\", name: \"owner\", message: \" Owner:\", default: repo.owner || undefined },\n { type: \"input\", name: \"repo\", message: \" Repo:\", default: repo.repo || undefined },\n { type: \"input\", name: \"defaultBranch\", message: \" Default branch:\", default: repo.defaultBranch || \"main\" },\n ]);\n repo.owner = sanitizeInput(identity.owner) || undefined;\n repo.repo = sanitizeInput(identity.repo) || undefined;\n repo.defaultBranch = identity.defaultBranch.trim() || undefined;\n }\n }\n }\n\n // Sync strategy\n const { strategy } = await inquirer.prompt<{ strategy: \"manual\" | \"on-sync\" }>([\n {\n type: \"list\",\n name: \"strategy\",\n message: \"Sync strategy:\",\n choices: [\n { name: \"Manual — sync sub-repos only with --repos flag\", value: \"manual\" as const },\n { name: \"On sync — auto-sync sub-repos when running hatch3r sync\", value: \"on-sync\" as const },\n ],\n default: wsManifest.syncStrategy,\n },\n ]);\n wsManifest.syncStrategy = strategy;\n\n await writeWorkspaceManifest(rootDir, wsManifest);\n\n // Offer to sync now\n const syncCount = wsManifest.repos.filter((r) => r.sync).length;\n if (syncCount > 0) {\n const { syncNow } = await inquirer.prompt<{ syncNow: boolean }>([\n {\n type: \"confirm\",\n name: \"syncNow\",\n message: `Sync ${syncCount} repo(s) now?`,\n default: false,\n },\n ]);\n if (syncNow) {\n const wsSpinner = createSpinner(`Syncing ${syncCount} repo(s)...`);\n wsSpinner.start();\n const result = await syncWorkspaceRepos(rootDir, { onWarn: (msg) => warn(msg) });\n const succeeded = result.repos.filter((r) => r.action === \"synced\").length;\n wsSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n }\n }\n }\n\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n AGENTS_DIR,\n MANIFEST_FILE,\n DEFAULT_FEATURES,\n type BoardConfig,\n type ContentSelection,\n type HatchManifest,\n type Platform,\n type Tool,\n} from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\nfunction createMinimalBoardConfig(owner: string, repo: string, defaultBranch: string): BoardConfig {\n return {\n owner,\n repo,\n defaultBranch,\n projectNumber: null,\n statusFieldId: null,\n statusOptions: {\n backlog: null,\n ready: null,\n inProgress: null,\n inReview: null,\n done: null,\n },\n labels: {\n types: [\"type:bug\", \"type:feature\", \"type:refactor\", \"type:qa\", \"type:docs\", \"type:infra\"],\n executors: [\"executor:agent\", \"executor:human\", \"executor:hybrid\"],\n statuses: [\"status:triage\", \"status:ready\", \"status:in-progress\", \"status:in-review\", \"status:blocked\"],\n meta: [\"meta:board-overview\"],\n },\n branchConvention: \"{type}/{short-description}\",\n areas: [],\n };\n}\n\nexport function createManifest(options: {\n platform?: Platform;\n owner?: string;\n repo?: string;\n namespace?: string;\n project?: string;\n defaultBranch?: string;\n tools: Tool[];\n features?: Partial<HatchManifest[\"features\"]>;\n mcpServers?: string[];\n content?: ContentSelection;\n languages?: string[];\n}): HatchManifest {\n const platform = options.platform ?? \"github\";\n const owner = options.owner ?? \"\";\n const repo = options.repo ?? \"\";\n const namespace = options.namespace ?? owner;\n const project = options.project ?? repo;\n const manifest: HatchManifest = {\n version: \"2.0.0\",\n hatch3rVersion: HATCH3R_VERSION,\n platform,\n owner,\n repo,\n namespace,\n project,\n tools: options.tools,\n features: { ...DEFAULT_FEATURES, ...options.features },\n mcp: { servers: options.mcpServers ?? [] },\n managedFiles: [],\n };\n if (options.content) {\n manifest.content = options.content;\n }\n if (options.languages && options.languages.length > 0 && options.languages[0] !== \"unknown\") {\n manifest.languages = options.languages;\n }\n if (options.defaultBranch) {\n manifest.board = createMinimalBoardConfig(owner, repo, options.defaultBranch);\n }\n const worktreeCapableTools = new Set([\"claude\"]);\n if (options.tools.some(t => worktreeCapableTools.has(t))) {\n manifest.worktree = { enabled: true };\n }\n return manifest;\n}\n\nexport function migrateManifest(raw: Record<string, unknown>): Record<string, unknown> {\n const migrated = { ...raw };\n\n if (!migrated.namespace && typeof migrated.owner === \"string\") {\n migrated.namespace = migrated.owner;\n }\n if (!migrated.namespace) {\n migrated.namespace = \"\";\n }\n\n if (!migrated.project && typeof migrated.repo === \"string\") {\n migrated.project = migrated.repo;\n }\n if (!migrated.project) {\n migrated.project = \"\";\n }\n\n if (migrated.version === \"1.0.0\") {\n migrated.version = \"2.0.0\";\n }\n\n return migrated;\n}\n\nfunction validateManifest(data: unknown): data is HatchManifest {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n typeof obj.version !== \"string\" ||\n typeof obj.hatch3rVersion !== \"string\" ||\n (obj.platform !== undefined && typeof obj.platform !== \"string\") ||\n !Array.isArray(obj.tools) ||\n obj.features === null ||\n typeof obj.features !== \"object\" ||\n obj.mcp === null ||\n typeof obj.mcp !== \"object\" ||\n !Array.isArray(obj.managedFiles)\n ) {\n return false;\n }\n\n if (obj.content !== undefined) {\n if (typeof obj.content !== \"object\" || obj.content === null) return false;\n const content = obj.content as Record<string, unknown>;\n if (typeof content.preset !== \"string\") return false;\n if (typeof content.projectType !== \"string\") return false;\n if (typeof content.teamSize !== \"string\") return false;\n if (!content.items || typeof content.items !== \"object\") return false;\n const items = content.items as Record<string, unknown>;\n const requiredKeys = [\"agents\", \"skills\", \"rules\", \"commands\", \"prompts\", \"hooks\", \"githubAgents\"];\n for (const key of requiredKeys) {\n if (!Array.isArray(items[key])) return false;\n if (!(items[key] as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n if (obj.worktree !== undefined) {\n if (typeof obj.worktree !== \"object\" || obj.worktree === null) return false;\n const wt = obj.worktree as Record<string, unknown>;\n if (typeof wt.enabled !== \"boolean\") return false;\n }\n\n if (obj.specs !== undefined) {\n if (typeof obj.specs !== \"object\" || obj.specs === null) return false;\n const specs = obj.specs as Record<string, unknown>;\n if (!Array.isArray(specs.paths)) return false;\n if (!(specs.paths as unknown[]).every((v) => typeof v === \"string\")) return false;\n if (specs.lastGenerated !== undefined && typeof specs.lastGenerated !== \"string\") return false;\n }\n\n if (obj.workspace !== undefined) {\n if (typeof obj.workspace !== \"object\" || obj.workspace === null) return false;\n const ws = obj.workspace as Record<string, unknown>;\n if (typeof ws.rootPath !== \"string\") return false;\n if (typeof ws.lastSync !== \"string\") return false;\n if (typeof ws.syncVersion !== \"string\") return false;\n if (typeof ws.workspaceChecksum !== \"string\") return false;\n if (ws.excludedContent !== undefined) {\n if (!Array.isArray(ws.excludedContent)) return false;\n if (!(ws.excludedContent as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n if (ws.localContent !== undefined) {\n if (!Array.isArray(ws.localContent)) return false;\n if (!(ws.localContent as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n return true;\n}\n\nexport async function readManifest(\n rootDir: string,\n): Promise<HatchManifest | null> {\n const manifestPath = join(rootDir, AGENTS_DIR, MANIFEST_FILE);\n\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err: unknown) {\n throw new Error(\n `Malformed JSON in ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const migrated = migrateManifest(parsed as Record<string, unknown>);\n\n if (!validateManifest(migrated)) {\n throw new Error(\n `Invalid manifest in ${manifestPath}: required fields missing or malformed. Run hatch3r init to regenerate.`,\n );\n }\n return migrated;\n}\n\nexport async function writeManifest(\n rootDir: string,\n manifest: HatchManifest,\n): Promise<void> {\n const manifestPath = join(rootDir, AGENTS_DIR, MANIFEST_FILE);\n await atomicWriteFile(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nexport function addManagedFile(\n manifest: HatchManifest,\n filePath: string,\n): void {\n if (!manifest.managedFiles.includes(filePath)) {\n manifest.managedFiles.push(filePath);\n }\n}\n\nexport function removeManagedFile(\n manifest: HatchManifest,\n filePath: string,\n): void {\n manifest.managedFiles = manifest.managedFiles.filter((f) => f !== filePath);\n}\n","import {\n readFile,\n writeFile,\n mkdir,\n access,\n rename,\n unlink,\n open,\n} from \"node:fs/promises\";\nimport { dirname, basename } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { HATCH3R_PREFIX, type MergeResult } from \"../types.js\";\nimport { insertManagedBlock, hasManagedBlock, extractCustomContent } from \"./managedBlocks.js\";\nimport { scanForDeniedPatterns } from \"../adapters/customization.js\";\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return false;\n }\n}\n\n/**\n * Write a file atomically via tmp+rename with fsync.\n *\n * **Concurrency note:** This function does not use file locking. Running\n * multiple hatch3r processes against the same directory concurrently is\n * unsupported and may produce corrupted output. If you need to sync from\n * multiple terminals, run them sequentially.\n */\nexport async function atomicWriteFile(filePath: string, content: string): Promise<void> {\n const tmpPath = filePath + \".tmp.\" + randomBytes(4).toString(\"hex\");\n try {\n await writeFile(tmpPath, content, \"utf-8\");\n const fh = await open(tmpPath, \"r\");\n try {\n await fh.datasync();\n } catch (err) {\n // Windows rejects fdatasync on read-only handles (EPERM).\n // The atomic rename provides the safety guarantee; datasync is best-effort.\n if ((err as NodeJS.ErrnoException).code !== \"EPERM\") throw err;\n } finally {\n await fh.close();\n }\n try {\n await rename(tmpPath, filePath);\n } catch (err) {\n // Retry once for Windows AV locks (EBUSY/EPERM)\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"EBUSY\" || code === \"EPERM\") {\n await new Promise((r) => setTimeout(r, 100));\n await rename(tmpPath, filePath);\n } else {\n throw err;\n }\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOSPC\") {\n throw new Error(\n `Not enough disk space to write ${filePath}. Free up space and re-run the command.`,\n );\n }\n throw err;\n } finally {\n try {\n await unlink(tmpPath);\n } catch {\n // Temp file already renamed or doesn't exist\n }\n }\n}\n\n/**\n * Safely write or merge a file, preserving user content outside managed blocks.\n *\n * **Concurrency note:** This function relies on {@link atomicWriteFile} which\n * does not acquire file locks. Running multiple hatch3r processes (e.g. two\n * terminal tabs running `hatch3r sync`) against the same target directory at\n * the same time is unsupported. To avoid conflicts, run sync operations\n * sequentially. Workspace sync already processes repos one at a time\n * internally, so a single `hatch3r sync --repos` invocation is safe.\n */\nexport async function safeWriteFile(\n filePath: string,\n content: string,\n options: {\n managedContent?: string;\n /** When true, prepend managed block to existing content if file has no markers (init flow). */\n appendIfNoBlock?: boolean;\n /** When true, always write through regardless of filename prefix. */\n force?: boolean;\n } = {},\n): Promise<MergeResult> {\n await mkdir(dirname(filePath), { recursive: true });\n\n const exists = await fileExists(filePath);\n\n if (!exists) {\n await atomicWriteFile(filePath, content);\n return { path: filePath, action: \"created\" };\n }\n\n const existingContent = await readFile(filePath, \"utf-8\");\n\n if (options.managedContent) {\n if (!hasManagedBlock(existingContent)) {\n if (options.appendIfNoBlock) {\n const prepended = [content.trim(), \"\", existingContent.trimStart()].join(\"\\n\");\n await atomicWriteFile(filePath, prepended);\n return { path: filePath, action: \"updated\" };\n }\n // #144 (D19-15): Improved recovery guidance — avoid suggesting init --force\n return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: managed block markers (HATCH3R:BEGIN/END) missing. To fix: restore the markers around hatch3r content, or move your custom content and re-run hatch3r update.`,\n };\n }\n const customContent = extractCustomContent(existingContent);\n const deniedFindings = customContent ? scanForDeniedPatterns(customContent) : [];\n let merged: string;\n try {\n merged = insertManagedBlock(existingContent, options.managedContent);\n } catch {\n // Managed block is corrupted (duplicate markers, wrong order, etc.).\n // Overwrite with fresh content; previous version is recoverable via git.\n await atomicWriteFile(filePath, content);\n return {\n path: filePath,\n action: \"updated\",\n warning: `Auto-repaired corrupted managed block in ${filePath}`,\n };\n }\n await atomicWriteFile(filePath, merged);\n const result: MergeResult = { path: filePath, action: \"updated\" };\n if (deniedFindings.length > 0) {\n result.warning = `Content outside managed block in ${filePath} contains suspicious patterns: ${deniedFindings.join(\"; \")}`;\n }\n return result;\n }\n\n const fileName = basename(filePath) ?? \"\";\n const isManagedFile = fileName.startsWith(HATCH3R_PREFIX);\n\n if (isManagedFile || options.force) {\n await atomicWriteFile(filePath, content);\n return { path: filePath, action: \"updated\" };\n }\n\n // #144 (D19-15): Improved recovery guidance — avoid suggesting init --force\n return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: managed block markers (HATCH3R:BEGIN/END) missing. To fix: restore the markers around hatch3r content, or move your custom content and re-run hatch3r update.`,\n };\n}\n\nexport function isManagedPath(filePath: string): boolean {\n const fileName = basename(filePath) ?? \"\";\n return fileName.startsWith(HATCH3R_PREFIX);\n}\n","import { MANAGED_BLOCK_START, MANAGED_BLOCK_END } from \"../types.js\";\n\nexport function insertManagedBlock(\n existingContent: string,\n managedContent: string,\n): string {\n const startIdx = existingContent.indexOf(MANAGED_BLOCK_START);\n const endIdx = existingContent.indexOf(MANAGED_BLOCK_END);\n\n const block = `${MANAGED_BLOCK_START}\\n${managedContent}\\n${MANAGED_BLOCK_END}`;\n\n if (startIdx === -1 || endIdx === -1) {\n throw new Error(\"Content must contain managed block markers\");\n }\n\n const secondStart = existingContent.indexOf(MANAGED_BLOCK_START, startIdx + 1);\n const secondEnd = existingContent.indexOf(MANAGED_BLOCK_END, endIdx + 1);\n if (secondStart !== -1) {\n throw new Error(\"Corrupted managed block: duplicate start marker found. Remove the duplicate before syncing.\");\n }\n if (secondEnd !== -1) {\n throw new Error(\"Corrupted managed block: duplicate end marker found. Remove the duplicate before syncing.\");\n }\n\n if (startIdx >= endIdx) {\n throw new Error(\"Corrupted managed block: start marker must appear before end marker\");\n }\n\n const before = existingContent.substring(0, startIdx);\n const after = existingContent.substring(endIdx + MANAGED_BLOCK_END.length);\n return `${before}${block}${after}`;\n}\n\nexport function extractManagedBlock(content: string): string | null {\n const startIdx = content.indexOf(MANAGED_BLOCK_START);\n const endIdx = content.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return null;\n }\n\n return content\n .substring(startIdx + MANAGED_BLOCK_START.length, endIdx)\n .trim();\n}\n\nexport function extractCustomContent(content: string): string {\n const startIdx = content.indexOf(MANAGED_BLOCK_START);\n const endIdx = content.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return content;\n }\n\n const before = content.substring(0, startIdx).trim();\n const after = content.substring(endIdx + MANAGED_BLOCK_END.length).trim();\n return [before, after].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport function wrapInManagedBlock(content: string): string {\n return `${MANAGED_BLOCK_START}\\n${content}\\n${MANAGED_BLOCK_END}`;\n}\n\nexport function hasManagedBlock(content: string): boolean {\n return (\n content.includes(MANAGED_BLOCK_START) &&\n content.includes(MANAGED_BLOCK_END)\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { sanitizeId } from \"../types.js\";\n\nexport type CustomizableType = \"agents\" | \"skills\" | \"commands\" | \"rules\";\n\nconst MAX_CUSTOMIZE_YAML_BYTES = 10_240;\n\nexport interface Customization {\n model?: string;\n scope?: string;\n description?: string;\n enabled?: boolean;\n}\n\nexport interface CustomizationReadResult {\n value: Customization | undefined;\n warnings: string[];\n}\n\nexport type AgentCustomization = Customization;\n\nexport async function readCustomization(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<Customization | undefined> {\n const { value } = await readCustomizationWithWarnings(projectRoot, type, id);\n return value;\n}\n\nexport async function readCustomizationWithWarnings(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<CustomizationReadResult> {\n const warnings: string[] = [];\n const safeId = sanitizeId(id);\n const filePath = join(projectRoot, \".hatch3r\", type, `${safeId}.customize.yaml`);\n const resolvedPath = resolve(filePath);\n const resolvedBase = resolve(projectRoot);\n if (!resolvedPath.startsWith(resolvedBase)) {\n return { value: undefined, warnings };\n }\n const path = filePath;\n try {\n const raw = await readFile(path, \"utf-8\");\n if (Buffer.byteLength(raw, \"utf-8\") > MAX_CUSTOMIZE_YAML_BYTES) {\n warnings.push(`Customization YAML for \"${id}\" exceeds ${MAX_CUSTOMIZE_YAML_BYTES} bytes. Skipping.`);\n return { value: undefined, warnings };\n }\n const parsed = parseYaml(raw) as Record<string, unknown> | null;\n if (!parsed || typeof parsed !== \"object\") return { value: undefined, warnings };\n\n const result: Customization = {};\n let hasValue = false;\n\n if (typeof parsed.model === \"string\" && parsed.model.length > 0) {\n result.model = parsed.model;\n hasValue = true;\n }\n if (typeof parsed.scope === \"string\" && parsed.scope.length > 0) {\n result.scope = parsed.scope;\n hasValue = true;\n }\n if (typeof parsed.description === \"string\" && parsed.description.length > 0) {\n result.description = parsed.description;\n hasValue = true;\n }\n if (typeof parsed.enabled === \"boolean\") {\n result.enabled = parsed.enabled;\n hasValue = true;\n }\n\n return { value: hasValue ? result : undefined, warnings };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\" && !(err instanceof Error && err.name.startsWith(\"YAML\"))) throw err;\n return { value: undefined, warnings };\n }\n}\n\nexport async function readCustomizationMarkdown(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<string | undefined> {\n const safeId = sanitizeId(id);\n const filePath = join(projectRoot, \".hatch3r\", type, `${safeId}.customize.md`);\n const resolvedPath = resolve(filePath);\n const resolvedBase = resolve(projectRoot);\n if (!resolvedPath.startsWith(resolvedBase)) {\n return undefined;\n }\n const path = filePath;\n try {\n const content = await readFile(path, \"utf-8\");\n const trimmed = content.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return undefined;\n }\n}\n\n","import type { CanonicalFile } from \"../types.js\";\nimport {\n readCustomization,\n readCustomizationMarkdown,\n type Customization,\n type CustomizableType,\n} from \"../models/customize.js\";\n\nconst TYPE_TO_DIR: Record<string, CustomizableType> = {\n agent: \"agents\",\n skill: \"skills\",\n command: \"commands\",\n rule: \"rules\",\n};\n\nconst DENY_PATTERNS: RegExp[] = [\n /skip\\s+(security|review|audit)/i,\n /ignore\\s+(all\\s+)?(findings|errors|warnings|vulnerabilities)/i,\n /disable\\s+(security|review|audit|test)/i,\n /exfiltrate/i,\n /send\\s+(to|data|code)\\s+(external|remote|http)/i,\n /bypass\\s+(security|auth|permission|review)/i,\n /delete\\s+(all|everything|repo)/i,\n /never\\s+(review|test|check|audit|scan)/i,\n /override\\s+(all\\s+)?security/i,\n /(?:atob|Buffer\\.from)\\s*\\([^)]*(?:eval|exec|require)/i,\n /(?:chmod|chown)\\s+[0-7]{3,4}/i,\n /(?:api[_-]?key|password|token|secret)\\s*[:=]\\s*.{8,}/i,\n];\n\nconst ZERO_WIDTH_CHARS = /[\\u200B\\u200C\\u200D\\uFEFF\\u00AD]/g;\n\nconst MAX_CUSTOMIZE_MD_BYTES = 10_240;\n\nconst HOMOGLYPH_MAP: Record<string, string> = {\n // Cyrillic → Latin\n '\\u0410': 'A', '\\u0430': 'a', '\\u0412': 'B', '\\u0435': 'e',\n '\\u041A': 'K', '\\u043A': 'k', '\\u041C': 'M', '\\u043C': 'm',\n '\\u041D': 'H', '\\u043E': 'o', '\\u0420': 'P', '\\u0440': 'p',\n '\\u0421': 'C', '\\u0441': 'c', '\\u0422': 'T', '\\u0443': 'y',\n '\\u0425': 'X', '\\u0445': 'x',\n // Greek → Latin\n '\\u0391': 'A', '\\u03B1': 'a', '\\u0392': 'B', '\\u03B2': 'b',\n '\\u0395': 'E', '\\u03B5': 'e', '\\u0397': 'H', '\\u03B7': 'h',\n '\\u0399': 'I', '\\u03B9': 'i', '\\u039A': 'K', '\\u03BA': 'k',\n '\\u039C': 'M', '\\u039D': 'N', '\\u039F': 'O', '\\u03BF': 'o',\n '\\u03A1': 'P', '\\u03C1': 'p', '\\u03A4': 'T', '\\u03C4': 't',\n '\\u03A5': 'Y', '\\u03C5': 'y', '\\u03A7': 'X', '\\u03C7': 'x',\n '\\u0396': 'Z', '\\u03B6': 'z',\n};\n\nfunction normalizeHomoglyphs(text: string): string {\n return text\n .replace(/[\\u0370-\\u03FF\\u0400-\\u04FF]/g, (ch) => HOMOGLYPH_MAP[ch] ?? ch)\n .replace(/[\\u2000-\\u200F\\uFEFF]/g, ''); // Remove zero-width characters\n}\n\nfunction stripBoundaryMarkers(content: string): string {\n return content\n .replace(/<!-- MANAGED-BLOCK:(BEGIN|END) -->/g, '')\n .replace(/<!-- USER-CUSTOMIZATION:(BEGIN|END) -->/g, '');\n}\n\nfunction collapseNewlines(content: string): string {\n return content.replace(/\\n{3,}/g, '\\n\\n');\n}\n\nfunction normalizeInput(content: string): string {\n return normalizeHomoglyphs(collapseNewlines(stripBoundaryMarkers(content.replace(ZERO_WIDTH_CHARS, \"\"))));\n}\n\nexport function scanForDeniedPatterns(content: string): string[] {\n const normalized = normalizeInput(content);\n const violations: string[] = [];\n for (const pattern of DENY_PATTERNS) {\n const match = normalized.match(pattern);\n if (match) {\n violations.push(`Denied pattern found: \"${match[0]}\"`);\n }\n }\n return violations;\n}\n\nexport interface CustomizationResult {\n content: string;\n skip: boolean;\n overrides: Customization;\n warnings: string[];\n}\n\nasync function applyCustomizationImpl(\n projectRoot: string,\n file: CanonicalFile,\n contentKey: \"content\" | \"rawContent\",\n): Promise<CustomizationResult> {\n const warnings: string[] = [];\n const dir = TYPE_TO_DIR[file.type];\n if (!dir) {\n return { content: file[contentKey], skip: false, overrides: {}, warnings };\n }\n\n const [yaml, md] = await Promise.all([\n readCustomization(projectRoot, dir, file.id),\n readCustomizationMarkdown(projectRoot, dir, file.id),\n ]);\n\n const overrides: Customization = yaml ?? {};\n\n if (file.protected) {\n if (overrides.enabled === false) {\n warnings.push(`Cannot disable protected ${file.type} \"${file.id}\" via customization. Ignoring enabled: false.`);\n return { content: file[contentKey], skip: false, overrides: {}, warnings };\n }\n if (overrides.scope !== undefined || overrides.description !== undefined) {\n if (overrides.scope !== undefined) {\n warnings.push(`Cannot override scope on protected ${file.type} \"${file.id}\" via customization. Using original scope.`);\n }\n if (overrides.description !== undefined) {\n warnings.push(`Cannot override description on protected ${file.type} \"${file.id}\" via customization. Using original description.`);\n }\n delete overrides.scope;\n delete overrides.description;\n }\n }\n\n for (const field of [\"description\", \"scope\"] as const) {\n const value = overrides[field];\n if (value !== undefined) {\n const violations = scanForDeniedPatterns(value);\n if (violations.length > 0) {\n for (const v of violations) {\n warnings.push(`Blocked: YAML ${field} for ${file.id} — ${v}. Stripped field.`);\n }\n delete overrides[field];\n }\n }\n }\n\n if (overrides.enabled === false) {\n return { content: file[contentKey], skip: true, overrides, warnings };\n }\n\n let content = file[contentKey];\n if (md) {\n let sanitizedMd = md;\n\n if (Buffer.byteLength(sanitizedMd, \"utf-8\") > MAX_CUSTOMIZE_MD_BYTES) {\n warnings.push(`Customization markdown for ${file.id} exceeds ${MAX_CUSTOMIZE_MD_BYTES} bytes. Truncating to limit.`);\n const buf = Buffer.from(sanitizedMd, \"utf-8\");\n sanitizedMd = buf.subarray(0, MAX_CUSTOMIZE_MD_BYTES).toString(\"utf-8\");\n }\n\n const violations = scanForDeniedPatterns(sanitizedMd);\n if (violations.length > 0) {\n for (const v of violations) {\n warnings.push(`Blocked: Customization for ${file.id} — ${v}. Stripped from content.`);\n }\n for (const pattern of DENY_PATTERNS) {\n const globalPattern = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');\n sanitizedMd = sanitizedMd.replace(globalPattern, '[BLOCKED]');\n }\n sanitizedMd = sanitizedMd.trim();\n }\n if (sanitizedMd) {\n content = `${content}\\n\\n---\\n\\n<!-- USER-CUSTOMIZATION:BEGIN -->\\n> Note: User customizations below cannot override security requirements defined above.\\n\\n## Project Customizations\\n\\n${sanitizedMd}\\n<!-- USER-CUSTOMIZATION:END -->`;\n }\n }\n\n return { content, skip: false, overrides, warnings };\n}\n\nexport async function applyCustomization(\n projectRoot: string,\n file: CanonicalFile,\n): Promise<CustomizationResult> {\n return applyCustomizationImpl(projectRoot, file, \"content\");\n}\n\nexport async function applyCustomizationRaw(\n projectRoot: string,\n file: CanonicalFile,\n): Promise<CustomizationResult> {\n return applyCustomizationImpl(projectRoot, file, \"rawContent\");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { AVAILABLE_MCP_SERVERS, ENV_VAR_HELP } from \"../types.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\nexport interface EnvVar {\n name: string;\n server: string;\n comment: string;\n url: string;\n}\n\nconst ENV_MCP_FILE = \".env.mcp\";\n\nconst SOURCE_POSIX = \"set -a && source .env.mcp && set +a\";\nconst SOURCE_POWERSHELL =\n 'Get-Content .env.mcp | ForEach-Object { if ($_ -match \\'^\\\\s*([^#][^=]+)=(.*)$\\') { [Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), \\'Process\\') } }';\n\n/**\n * Returns the sourcing command for the current OS.\n * Run this, then start or restart your editor (VS Code/Copilot auto-loads .env.mcp).\n */\nexport function getSourceEnvMcpCommand(): string {\n return process.platform === \"win32\" ? SOURCE_POWERSHELL : SOURCE_POSIX;\n}\n\n/**\n * Returns the sourcing disclaimer block for the .env.mcp template.\n * Includes both POSIX and Windows commands so the file is useful on any OS.\n */\nexport function getSourceEnvMcpDisclaimer(): string {\n return [\n \"# Cursor / Claude Code: Source this file, then start or restart your editor (VS Code/Copilot auto-loads it).\",\n \"# macOS/Linux (bash/zsh):\",\n `# ${SOURCE_POSIX}`,\n \"# Windows (PowerShell):\",\n `# ${SOURCE_POWERSHELL}`,\n \"# Windows (Git Bash): same as macOS/Linux\",\n \"\",\n ].join(\"\\n\");\n}\n\n/**\n * Collects every environment variable required by the given MCP server list.\n * Returns a deduped, deterministic array.\n */\nexport function collectRequiredEnvVars(servers: string[]): EnvVar[] {\n const seen = new Set<string>();\n const vars: EnvVar[] = [];\n\n for (const id of servers) {\n const meta = AVAILABLE_MCP_SERVERS[id];\n if (!meta?.requiresEnv) continue;\n for (const name of meta.requiresEnv) {\n if (seen.has(name)) continue;\n seen.add(name);\n const help = ENV_VAR_HELP[name];\n vars.push({\n name,\n server: id,\n comment: help?.comment ?? id,\n url: help?.url ?? \"\",\n });\n }\n }\n\n return vars;\n}\n\n/**\n * Renders the contents of a `.env.mcp` file.\n * Existing values (from a prior file) are preserved; new vars get empty placeholders.\n */\nexport function generateEnvMcpContent(\n vars: EnvVar[],\n existing: Record<string, string> = {},\n): string {\n if (vars.length === 0) return \"\";\n\n const lines: string[] = [\n \"# hatch3r MCP secrets\",\n \"# Fill in your values below. This file is gitignored — never commit it.\",\n \"# Docs: https://docs.hatch3r.com/docs/guides/mcp-setup\",\n \"\",\n getSourceEnvMcpDisclaimer(),\n ];\n\n for (const v of vars) {\n const urlPart = v.url ? ` — ${v.url}` : \"\";\n lines.push(`# ${v.comment}${urlPart}`);\n lines.push(`${v.name}=${existing[v.name] ?? \"\"}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Parses a KEY=VALUE env file, ignoring comments and blank lines.\n * Handles optional quoting and `export` prefix.\n */\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const raw of content.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const stripped = line.startsWith(\"export \") ? line.slice(7) : line;\n const eqIdx = stripped.indexOf(\"=\");\n if (eqIdx < 1) continue;\n const key = stripped.slice(0, eqIdx).trim();\n let val = stripped.slice(eqIdx + 1).trim();\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n return result;\n}\n\n/**\n * Appends `.env.mcp` to the project's `.gitignore` if not already covered\n * by an existing `.env.mcp` or `.env.*` entry.\n */\nexport async function ensureGitignoreEntry(rootDir: string): Promise<void> {\n const gitignorePath = join(rootDir, \".gitignore\");\n let content = \"\";\n try {\n content = await readFile(gitignorePath, \"utf-8\");\n } catch {\n // .gitignore doesn't exist yet — will be created below\n }\n\n const dominated = content\n .split(\"\\n\")\n .some((l) => {\n const trimmed = l.trim();\n return trimmed === \".env.mcp\" || trimmed === \".env.*\";\n });\n if (dominated) return;\n\n const separator = content.length > 0 && !content.endsWith(\"\\n\") ? \"\\n\" : \"\";\n await writeFile(gitignorePath, `${content}${separator}.env.mcp\\n`, \"utf-8\");\n}\n\nexport interface EnsureResult {\n action: \"created\" | \"updated\" | \"skipped\";\n path: string;\n newVars: string[];\n}\n\n/**\n * Creates or updates `.env.mcp` in the given root directory.\n * Never overwrites existing values — only appends missing vars.\n */\nexport async function ensureEnvMcp(\n rootDir: string,\n servers: string[],\n): Promise<EnsureResult> {\n const envPath = join(rootDir, ENV_MCP_FILE);\n const vars = collectRequiredEnvVars(servers);\n\n if (vars.length === 0) {\n return { action: \"skipped\", path: ENV_MCP_FILE, newVars: [] };\n }\n\n let existing: Record<string, string> = {};\n let hadFile = false;\n\n if (existsSync(envPath)) {\n hadFile = true;\n const raw = await readFile(envPath, \"utf-8\");\n existing = parseEnvFile(raw);\n }\n\n const newVars = vars.filter((v) => !(v.name in existing)).map((v) => v.name);\n\n if (hadFile && newVars.length === 0) {\n return { action: \"skipped\", path: ENV_MCP_FILE, newVars: [] };\n }\n\n const content = generateEnvMcpContent(vars, existing);\n await atomicWriteFile(envPath, content);\n\n return {\n action: hadFile ? \"updated\" : \"created\",\n path: ENV_MCP_FILE,\n newVars,\n };\n}\n","import { cp, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { execFileSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { readManifest, writeManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter } from \"../../adapters/index.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { AGENTS_DIR, HATCH3R_PREFIX, HatchError, WORKTREE_INCLUDE_FILE, type HatchManifest, type Platform } from \"../../types.js\";\nimport { generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport { generateWorktreeInclude } from \"../../worktree/index.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n warn,\n step,\n label,\n} from \"../shared/ui.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { detectPackageManager } from \"../../detect/packageManager.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest } from \"../../integrity/index.js\";\nimport { buildSelectionsFromDisk } from \"../../content/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_DIRS = [\"agents\", \"commands\", \"rules\", \"skills\", \"prompts\", \"github-agents\", \"mcp\", \"hooks\"];\nconst ALWAYS_COPY_FILES = new Set([\"mcp.json\"]);\n\nasync function copyHatch3rFiles(\n srcDir: string,\n destDir: string,\n insideHatch3rDir = false,\n selectedIds?: Set<string>,\n): Promise<string[]> {\n const copied: string[] = [];\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(srcDir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name);\n const destPath = join(destDir, entry.name);\n\n if (entry.isDirectory()) {\n // If we have selectedIds and this is a skill dir, check if the skill is selected\n if (selectedIds && entry.name.startsWith(HATCH3R_PREFIX)) {\n if (!selectedIds.has(entry.name)) continue;\n }\n await mkdir(destPath, { recursive: true });\n const subCopied = await copyHatch3rFiles(\n srcPath,\n destPath,\n insideHatch3rDir || !entry.name.startsWith(HATCH3R_PREFIX),\n selectedIds,\n );\n copied.push(...subCopied.map((p) => join(entry.name, p)));\n } else if (entry.name.startsWith(HATCH3R_PREFIX) || insideHatch3rDir || ALWAYS_COPY_FILES.has(entry.name)) {\n // If we have selectedIds, check if this file's base ID is selected\n if (selectedIds && entry.name.startsWith(HATCH3R_PREFIX)) {\n const baseId = entry.name.replace(/\\.(md|mdc)$/, \"\");\n if (!selectedIds.has(baseId)) continue;\n }\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n copied.push(entry.name);\n }\n }\n\n return copied;\n}\n\nexport interface UpdateResult {\n copiedFiles: number;\n syncedTools: number;\n failedTools: number;\n version: string;\n}\n\nexport async function runUpdate(\n rootDir: string,\n manifest: HatchManifest,\n options: { stepOffset?: number; totalSteps?: number } = {},\n): Promise<UpdateResult> {\n const offset = options.stepOffset ?? 0;\n const total = options.totalSteps ?? 4;\n const agentsDir = join(rootDir, AGENTS_DIR);\n\n let contentRoot = findPackageRoot(__dirname);\n\n const pm = await detectPackageManager(rootDir);\n const s0 = createSpinner(step(offset + 1, total, \"Updating package...\"));\n s0.start();\n try {\n const cmd = process.platform === \"win32\" && pm.name !== \"bun\"\n ? `${pm.updateCmd}.cmd`\n : pm.updateCmd;\n execFileSync(cmd, pm.updateArgs, { stdio: \"pipe\", timeout: 30_000, killSignal: \"SIGTERM\" });\n contentRoot = findPackageRoot(__dirname);\n } catch (err) {\n const isTimeout = err && typeof err === \"object\" && (\"killed\" in err || \"signal\" in err);\n const msg = isTimeout\n ? \"Package update timed out after 30s. Check network connectivity and retry.\"\n : (err instanceof Error ? err.message : String(err));\n s0.fail(step(offset + 1, total, \"Failed to update package\"));\n logError(msg);\n throw new HatchError(msg, 1);\n }\n s0.succeed(step(offset + 1, total, \"Package updated\"));\n\n const s1 = createSpinner(step(offset + 2, total, \"Updating canonical files...\"));\n s1.start();\n\n // Build a set of selected IDs if manifest has content selections\n let selectedIds: Set<string> | undefined;\n if (manifest.content) {\n selectedIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) selectedIds.add(id);\n }\n }\n\n const copied: string[] = [];\n for (const dir of CONTENT_DIRS) {\n const srcDir = join(contentRoot, dir);\n try {\n const dirCopied = await copyHatch3rFiles(srcDir, join(agentsDir, dir), false, selectedIds);\n copied.push(...dirCopied.map((p) => join(dir, p)));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n // Generate dynamic AGENTS.md based on what's on disk\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n s1.succeed(step(offset + 2, total, `Updated ${copied.length} canonical files`));\n\n const s2 = createSpinner(step(offset + 3, total, \"Re-syncing adapter output...\"));\n s2.start();\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of manifest.tools) {\n const adapter = getAdapter(tool);\n try {\n const outputs = await adapter.generate(agentsDir, manifest);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n const fullPath = join(rootDir, out.path);\n if (out.managedContent) {\n await safeWriteFile(fullPath, out.content, {\n managedContent: out.managedContent,\n });\n } else {\n await safeWriteFile(fullPath, out.content);\n }\n }\n } catch (err) {\n adapterFailures.push({\n tool,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === manifest.tools.length) {\n s2.fail(step(offset + 3, total, \"All adapters failed\"));\n throw new HatchError(\"All adapters failed\", 1);\n }\n }\n s2.succeed(step(offset + 3, total, adapterFailures.length > 0\n ? `Re-synced ${manifest.tools.length - adapterFailures.length}/${manifest.tools.length} tool(s)`\n : `Re-synced ${manifest.tools.length} tool(s)`));\n\n const s3 = createSpinner(step(offset + 4, total, \"Writing manifest...\"));\n s3.start();\n manifest.hatch3rVersion = HATCH3R_VERSION;\n await writeManifest(rootDir, manifest);\n\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n s3.succeed(step(offset + 4, total, \"Manifest updated\"));\n\n return {\n copiedFiles: copied.length,\n syncedTools: manifest.tools.length - adapterFailures.length,\n failedTools: adapterFailures.length,\n version: HATCH3R_VERSION,\n };\n}\n\ninterface MigrationCheckpoint {\n id: string;\n condition: (manifest: HatchManifest, rootDir: string) => Promise<boolean>;\n execute: (manifest: HatchManifest, rootDir: string) => Promise<{ manifest: HatchManifest; notices: string[] }>;\n}\n\nconst MIGRATION_CHECKPOINTS: MigrationCheckpoint[] = [\n {\n id: \"content-selections-init\",\n condition: async (manifest) => manifest.content === undefined,\n execute: async (manifest, rootDir) => {\n const agentsDir = join(rootDir, AGENTS_DIR);\n const content = await buildSelectionsFromDisk(agentsDir);\n\n // Ask user for context since we can't infer it from legacy installs\n const { projectType } = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"list\",\n name: \"projectType\",\n message: \"For content tracking — is this a greenfield or brownfield project?\",\n choices: [\n { name: \"Greenfield — new project\", value: \"greenfield\" as const },\n { name: \"Brownfield — existing codebase\", value: \"brownfield\" as const },\n ],\n default: \"brownfield\",\n },\n ]);\n const { teamSize } = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"list\",\n name: \"teamSize\",\n message: \"Solo developer or team?\",\n choices: [\n { name: \"Solo\", value: \"solo\" as const },\n { name: \"Team\", value: \"team\" as const },\n ],\n default: \"team\",\n },\n ]);\n content.projectType = projectType;\n content.teamSize = teamSize;\n\n return {\n manifest: { ...manifest, content },\n notices: [\"Migrated to explicit content tracking (all existing items preserved)\"],\n };\n },\n },\n {\n id: \"platform-selection\",\n condition: async (manifest) => !manifest.platform,\n execute: async (manifest) => {\n const { platform } = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"list\",\n name: \"platform\",\n message: \"hatch3r now supports multiple platforms. Select your platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: \"github\",\n },\n ]);\n\n const updated = { ...manifest, platform };\n const notices: string[] = [];\n\n if (platform === \"github\") {\n updated.namespace = updated.namespace || updated.owner;\n updated.project = updated.project || updated.repo;\n notices.push(\"Migrated to GitHub platform (auto-detected from existing config)\");\n } else {\n const answers = await inquirer.prompt<{ namespace: string; project: string; repo: string }>([\n { type: \"input\", name: \"namespace\", message: platform === \"azure-devops\" ? \"Azure DevOps organization:\" : \"GitLab namespace (group or username):\", default: updated.owner || undefined },\n { type: \"input\", name: \"project\", message: platform === \"azure-devops\" ? \"Azure DevOps project:\" : \"Project name:\", default: updated.repo || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: updated.repo || undefined },\n ]);\n updated.owner = answers.namespace;\n updated.repo = answers.repo;\n updated.namespace = answers.namespace;\n updated.project = answers.project;\n notices.push(`Migrated to ${platform === \"azure-devops\" ? \"Azure DevOps\" : \"GitLab\"} platform`);\n }\n\n if (updated.version === \"1.0.0\") {\n updated.version = \"2.0.0\";\n }\n\n return { manifest: updated, notices };\n },\n },\n {\n id: \"customize-yaml-size\",\n condition: async (_manifest, rootDir) => {\n const agentsDir = join(rootDir, AGENTS_DIR);\n try {\n const entries = await readdir(agentsDir, { recursive: true });\n for (const entry of entries) {\n if (typeof entry === \"string\" && entry.endsWith(\".customize.yaml\")) {\n const s = await stat(join(agentsDir, entry));\n if (s.size > 10240) return true;\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n return false;\n },\n execute: async (manifest, rootDir) => {\n const notices: string[] = [];\n const agentsDir = join(rootDir, AGENTS_DIR);\n try {\n const entries = await readdir(agentsDir, { recursive: true });\n for (const entry of entries) {\n if (typeof entry === \"string\" && entry.endsWith(\".customize.yaml\")) {\n const s = await stat(join(agentsDir, entry));\n if (s.size > 10240) {\n notices.push(`Large customize file detected: ${entry} (${Math.round(s.size / 1024)}KB) — consider splitting`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n return { manifest, notices };\n },\n },\n {\n id: \"worktree-config-init\",\n condition: async (manifest) => {\n if (manifest.worktree !== undefined) return false;\n const worktreeCapableTools = new Set([\"claude\"]);\n return manifest.tools.some(t => worktreeCapableTools.has(t));\n },\n execute: async (manifest, rootDir) => {\n const { enabled } = await inquirer.prompt<{ enabled: boolean }>([{\n type: \"confirm\",\n name: \"enabled\",\n message: \"hatch3r now supports worktree file isolation for parallel agent sessions. Enable it?\",\n default: true,\n }]);\n\n const updated = { ...manifest, worktree: { enabled } };\n const notices: string[] = [];\n\n if (enabled) {\n const wtContent = await generateWorktreeInclude(updated, rootDir);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n appendIfNoBlock: true,\n });\n notices.push(\"Worktree isolation enabled — .worktreeinclude generated\");\n } else {\n notices.push(\"Worktree isolation skipped (enable later with `hatch3r config`)\");\n }\n\n return { manifest: updated, notices };\n },\n },\n];\n\nasync function runMigrationCheckpoints(manifest: HatchManifest, rootDir: string): Promise<{ manifest: HatchManifest; allNotices: string[] }> {\n let current = manifest;\n const allNotices: string[] = [];\n\n for (const checkpoint of MIGRATION_CHECKPOINTS) {\n if (await checkpoint.condition(current, rootDir)) {\n const { manifest: updated, notices } = await checkpoint.execute(current, rootDir);\n current = updated;\n allNotices.push(...notices);\n }\n }\n\n return { manifest: current, allNotices };\n}\n\nexport async function updateCommand(_opts?: Record<string, unknown>): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1);\n }\n\n const { manifest: migrated, allNotices } = await runMigrationCheckpoints(manifest, rootDir);\n const m = migrated;\n\n for (const notice of allNotices) {\n warn(notice);\n }\n\n const isUpToDate = m.hatch3rVersion === HATCH3R_VERSION;\n if (isUpToDate) {\n info(`Already at hatch3r v${HATCH3R_VERSION}`);\n } else {\n info(`Updating from v${m.hatch3rVersion} to v${HATCH3R_VERSION}`);\n }\n console.log();\n\n const result = await runUpdate(rootDir, m);\n\n console.log();\n printBox(\"Update complete\", [\n label(\"Files\", `${result.copiedFiles} canonical files updated`),\n label(\"Tools\", `${result.syncedTools} tool(s) re-synced`),\n label(\"Version\", `v${result.version}`),\n ], \"success\");\n}\n","import { dirname } from \"node:path\";\nimport type {\n AdapterOutput,\n Features,\n GenerationMode,\n HatchManifest,\n} from \"../types.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization, applyCustomizationRaw } from \"./customization.js\";\nimport { readMcpConfig, type McpServerEntry } from \"./mcp-utils.js\";\nimport { readHookDefinitions } from \"../hooks/index.js\";\n\nexport interface Adapter {\n name: string;\n warnings: string[];\n generate(agentsDir: string, manifest: HatchManifest, generationMode?: GenerationMode): Promise<AdapterOutput[]>;\n getOutputPaths(agentsDir: string, manifest: HatchManifest): Promise<string[]>;\n}\n\nexport function output(\n path: string,\n content: string,\n managedContent?: string,\n): AdapterOutput {\n return { path, content, managedContent, action: \"create\" };\n}\n\nexport interface AdapterContext {\n agentsDir: string;\n manifest: HatchManifest;\n features: Features;\n projectRoot: string;\n /** Generation verbosity mode. \"minimal\" strips comments, descriptions, and reduces formatting. */\n generationMode: GenerationMode;\n}\n\nexport interface ModelFormat {\n text: string;\n after?: boolean;\n}\n\nexport type CleanMcpEntry = Omit<McpServerEntry, \"_disabled\" | \"_description\">;\n\nfunction defaultModelFormat(model: string): ModelFormat {\n return { text: `**Recommended model:** \\`${model}\\`` };\n}\n\nexport abstract class BaseAdapter implements Adapter {\n abstract readonly name: string;\n warnings: string[] = [];\n\n /**\n * Generate adapter output files from canonical content.\n *\n * Output structure contract -- each AdapterOutput returned MUST satisfy:\n * - `path` must be a valid relative path (no absolute paths, no leading `/`)\n * - `path` must not traverse upward (no `..` segments)\n * - `content` must be non-empty (zero-length content indicates a generation bug)\n * - `managedContent`, if present, must be a substring of `content` (it represents\n * the hatch3r-managed portion within the full file content)\n *\n * Adapters that violate these invariants will produce broken output files or\n * corrupt user content during the merge phase.\n */\n async generate(agentsDir: string, manifest: HatchManifest, generationMode: GenerationMode = \"standard\"): Promise<AdapterOutput[]> {\n this.warnings = [];\n return this.doGenerate({\n agentsDir,\n manifest,\n features: manifest.features,\n projectRoot: dirname(agentsDir),\n generationMode,\n });\n }\n\n /**\n * Returns the list of output file paths this adapter would produce.\n * Override in subclasses for a lightweight implementation that avoids\n * full content generation when only paths are needed.\n */\n async getOutputPaths(agentsDir: string, manifest: HatchManifest): Promise<string[]> {\n const outputs = await this.generate(agentsDir, manifest);\n return outputs.map((o) => o.path);\n }\n\n protected abstract doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]>;\n\n protected async bridgeHeader(ctx: AdapterContext, agentsPath = \"/.agents/AGENTS.md\"): Promise<string[]> {\n const orchestration = await generateBridgeOrchestration(ctx.agentsDir);\n if (this.isMinimal(ctx)) {\n return [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n `Instructions: \\`${agentsPath}\\``,\n \"\",\n this.stripMinimal(orchestration),\n \"\",\n ];\n }\n return [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n `Full canonical agent instructions are at \\`${agentsPath}\\`.`,\n \"\",\n orchestration,\n \"\",\n ];\n }\n\n protected async inlineRules(ctx: AdapterContext): Promise<string[]> {\n if (!ctx.features.rules) return [];\n const lines: string[] = [];\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const minimal = this.isMinimal(ctx);\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n if (minimal) {\n lines.push(`## ${rule.id}`, \"\", this.stripMinimal(content), \"\");\n } else {\n lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\n }\n }\n return lines;\n }\n\n protected async inlineAgents(\n ctx: AdapterContext,\n formatModel?: (model: string) => ModelFormat,\n ): Promise<string[]> {\n if (!ctx.features.agents) return [];\n const lines: string[] = [];\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n const minimal = this.isMinimal(ctx);\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const fmt = model ? (formatModel ?? defaultModelFormat)(model) : undefined;\n lines.push(`## Agent: ${agent.id}`);\n if (fmt && !fmt.after) lines.push(fmt.text);\n if (minimal) {\n lines.push(\"\", this.stripMinimal(content));\n } else {\n lines.push(\"\", desc, \"\", content);\n }\n if (fmt?.after) lines.push(\"\", fmt.text);\n lines.push(\"\");\n }\n return lines;\n }\n\n protected async processSkillsRaw(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.skills) return [];\n const results: AdapterOutput[] = [];\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n results.push(output(pathFn(skill.id), wrapInManagedBlock(content), content));\n }\n return results;\n }\n\n protected async processSkillsWithFm(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.skills) return [];\n const results: AdapterOutput[] = [];\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? skill.description;\n const fm = `---\\nname: ${skill.id}\\ndescription: ${desc}\\n---`;\n results.push(output(pathFn(skill.id), `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n return results;\n }\n\n protected async processCommandsRaw(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.commands) return [];\n const results: AdapterOutput[] = [];\n const commands = await readCanonicalFiles(ctx.agentsDir, \"commands\");\n for (const cmd of commands) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, cmd);\n this.warnings.push(...warnings);\n if (skip) continue;\n results.push(output(pathFn(cmd.id), wrapInManagedBlock(content), content));\n }\n return results;\n }\n\n protected async readFilteredMcp(\n ctx: AdapterContext,\n ): Promise<Record<string, CleanMcpEntry> | null> {\n if (!ctx.features.mcp || ctx.manifest.mcp.servers.length === 0) return null;\n const { servers: mcpServers, warnings } = await readMcpConfig(ctx.agentsDir);\n this.warnings.push(...warnings);\n if (Object.keys(mcpServers).length === 0) return null;\n const selectedSet = new Set(ctx.manifest.mcp.servers);\n const filtered: Record<string, CleanMcpEntry> = {};\n for (const [name, entry] of Object.entries(mcpServers)) {\n if (entry._disabled) continue;\n if (!selectedSet.has(name)) continue;\n const { _disabled, _description, ...clean } = entry;\n filtered[name] = clean;\n }\n return Object.keys(filtered).length > 0 ? filtered : null;\n }\n\n protected buildStdMcpEntries(\n filtered: Record<string, CleanMcpEntry>,\n ): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(filtered)) {\n if (server.command) {\n result[name] = {\n command: server.command,\n args: server.args || [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n } else if (server.url) {\n result[name] = { url: server.url };\n }\n }\n return result;\n }\n\n protected async readHooks(ctx: AdapterContext) {\n if (!ctx.features.hooks) return [];\n return readHookDefinitions(ctx.agentsDir);\n }\n\n /** Returns true when the adapter is running in minimal generation mode. */\n protected isMinimal(ctx: AdapterContext): boolean {\n return ctx.generationMode === \"minimal\";\n }\n\n /**\n * Strip verbose content for minimal generation mode.\n * Removes markdown comments, collapses excessive blank lines,\n * strips decorative formatting, and trims descriptions.\n */\n protected stripMinimal(content: string): string {\n let result = content;\n // Remove HTML comments\n result = result.replace(/<!--[\\s\\S]*?-->/g, \"\");\n // Remove lines that are only horizontal rules\n result = result.replace(/^[-*_]{3,}\\s*$/gm, \"\");\n // Collapse 3+ consecutive blank lines to a single blank line\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n // Trim leading/trailing whitespace\n result = result.trim();\n return result;\n }\n}\n","export const MODEL_ALIASES: Record<string, string> = {\n \"opus\": \"claude-opus-4-6\",\n \"sonnet\": \"claude-sonnet-4-6\",\n \"haiku\": \"claude-haiku-4-5\",\n \"codex\": \"gpt-5.3-codex\",\n \"codex-prev\": \"gpt-5.2-codex\",\n \"codex-mini\": \"gpt-5.1-codex-mini\",\n \"codex-spark\": \"gpt-5.3-codex-spark\",\n \"gemini-pro\": \"gemini-3.1-pro\",\n \"gemini-flash\": \"gemini-3-flash\",\n \"gemini-stable\": \"gemini-2.5-pro\",\n};\n\nexport function resolveModelAlias(input: string): string {\n return MODEL_ALIASES[input] ?? input;\n}\n","import type { CanonicalFile, HatchManifest } from \"../types.js\";\nimport type { AgentCustomization } from \"./customize.js\";\nimport { resolveModelAlias } from \"./aliases.js\";\n\nexport function resolveAgentModel(\n agentId: string,\n agent: CanonicalFile,\n manifest: HatchManifest,\n customize?: AgentCustomization,\n): string | undefined {\n const raw =\n customize?.model\n ?? manifest.models?.agents?.[agentId]\n ?? agent.model\n ?? manifest.models?.default;\n return raw ? resolveModelAlias(raw) : undefined;\n}\n\nconst PROVIDER_PREFIXES: [RegExp, string][] = [\n [/^claude-/, \"anthropic\"],\n [/^gpt-|^codex-/, \"openai\"],\n [/^gemini-/, \"google\"],\n];\n\nexport function withProviderPrefix(modelId: string): string {\n for (const [pattern, provider] of PROVIDER_PREFIXES) {\n if (pattern.test(modelId)) return `${provider}/${modelId}`;\n }\n return modelId;\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { wrapInManagedBlock } from \"../../merge/managedBlocks.js\";\nimport { parseFrontmatter } from \"../../adapters/canonical.js\";\n\n/**\n * Shared orchestration content inlined into adapter bridge files (CLAUDE.md, GEMINI.md,\n * .windsurfrules, .amp/AGENTS.md, .github/copilot-instructions.md, .cursor/rules/hatch3r-bridge.mdc).\n * Includes mandatory behaviors, agent quick reference, and canonical structure.\n * Ensures every platform receives inline orchestration guidance instead of relying solely\n * on \"read /.agents/AGENTS.md\" references.\n */\n/** Static bridge orchestration (no skill index). Used as fallback. */\nexport const BRIDGE_ORCHESTRATION = `## Sub-Agent Pipeline (mandatory, no exceptions)\n\nAll tasks use this four-phase pipeline. Never implement inline; always delegate.\n\n**Phase 1 — Research:** Spawn \\`hatch3r-researcher\\`. Skip only for trivial edits. Score complexity per \\`hatch3r-deep-context\\` and add tier modes.\n**Phase 2 — Implement:** Spawn \\`hatch3r-implementer\\` (one per task). Pass research context.\n**Phase 3 — Review Loop:** \\`hatch3r-reviewer\\` → if Critical/Warning: \\`hatch3r-fixer\\` → re-review → repeat (max 3). After clean verdict: one confirmation pass (regressions, acceptance criteria). Remaining findings after max iterations → surface to user.\n**Phase 4 — Final Quality** (after clean review): \\`hatch3r-test-writer\\` + \\`hatch3r-security-auditor\\` (always), \\`hatch3r-docs-writer\\` (evaluate), then conditional: lint-fixer, a11y-auditor, perf-profiler, dependency-auditor.\n\n## Mandatory Behaviors\n\n1. **Load skill** from \\`/.agents/skills/\\` matching task type before implementation.\n2. **Task tool** (\\`subagent_type: \"generalPurpose\"\\`) for all delegations. Max parallelism.\n3. **Propagate rules**: include \\`scope: always\\` directives in subagent prompts.\n4. **Consult learnings**: check \\`/.agents/learnings/\\` before implementation.\n5. **Consult specs**: if \\`docs/specs/\\` exists, read relevant specifications before implementation and cross-reference during review.\n\n## Agent Quick Reference\n\n| Agent | When |\n|-------|------|\n| \\`hatch3r-researcher\\` | Always before impl (skip trivial edits) |\n| \\`hatch3r-implementer\\` | Always — one per task |\n| \\`hatch3r-reviewer\\` | Always (Phase 3 loop) |\n| \\`hatch3r-fixer\\` | Critical/Warning findings (Phase 3) |\n| \\`hatch3r-test-writer\\` | Always for code changes (Phase 4) |\n| \\`hatch3r-security-auditor\\` | Always for code changes (Phase 4) |\n| \\`hatch3r-docs-writer\\` | Evaluate; spawn if doc impact (Phase 4) |\n| \\`hatch3r-lint-fixer\\` | Lint/type errors after impl |\n| \\`hatch3r-a11y-auditor\\` | UI/accessibility changes |\n| \\`hatch3r-architect\\` | Architectural decisions, API design |\n| \\`hatch3r-perf-profiler\\` | Performance-sensitive changes |\n| \\`hatch3r-dependency-auditor\\` | Dependency changes |\n| \\`hatch3r-ci-watcher\\` | CI failures |\n| \\`hatch3r-devops\\` | Infra, deployment, CI/CD changes |\n\nFull protocol: \\`hatch3r-agent-orchestration\\` rule in \\`/.agents/rules/\\`.\n\n## Canonical Structure\n\n- Rules: \\`/.agents/rules/\\` — Agents: \\`/.agents/agents/\\` — Skills: \\`/.agents/skills/\\`\n- Commands: \\`/.agents/commands/\\` — MCP: \\`/.agents/mcp/mcp.json\\` — Policy: \\`/.agents/policy/\\`\n\nDo not edit \\`hatch3r-\\` prefixed files — managed by hatch3r, overwritten on update.\n\n## Getting Started (staged introduction)\n\nNew to hatch3r? Start here and expand as you go:\n\n**Day 1 — Core workflow:** Use the 4-phase pipeline above for any task. Start by invoking \\`hatch3r-researcher\\` for context, then \\`hatch3r-implementer\\` for changes.\n**Week 1 — Skills & commands:** Load skills from \\`/.agents/skills/\\` matching your task type. Try \\`/hatch3r-feature\\` or \\`/hatch3r-bug-fix\\` commands.\n**Week 2 — Board & team:** If using project management, run \\`/hatch3r-board-init\\` to set up your board. Use \\`/hatch3r-board-pickup\\` for structured delivery.\n**Ongoing — Customization:** Override agent behavior via \\`.hatch3r/{type}/{id}.customize.yaml\\`. Add project learnings to \\`/.agents/learnings/\\`.`;\n\n/**\n * Generate bridge orchestration with an inline skill dispatch table.\n * Falls back to the static BRIDGE_ORCHESTRATION if agentsDir is unavailable.\n */\nexport async function generateBridgeOrchestration(agentsDir: string): Promise<string> {\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length === 0) return BRIDGE_ORCHESTRATION;\n\n const skillTable = [\n \"\\n## Skill Dispatch Table\\n\",\n \"Load the matching skill before implementation. Full content in `/.agents/skills/{id}/SKILL.md`.\\n\",\n \"| Task Type | Skill | Description |\",\n \"|-----------|-------|-------------|\",\n ];\n for (const skill of skills) {\n skillTable.push(`| — | \\`${skill.id}\\` | ${skill.description.slice(0, 80)} |`);\n }\n\n // Insert skill table after the Agent Quick Reference table\n const insertPoint = \"Do not edit `hatch3r-` prefixed files\";\n const idx = BRIDGE_ORCHESTRATION.indexOf(insertPoint);\n if (idx === -1) return BRIDGE_ORCHESTRATION;\n\n return (\n BRIDGE_ORCHESTRATION.slice(0, idx) +\n skillTable.join(\"\\n\") +\n \"\\n\\n\" +\n BRIDGE_ORCHESTRATION.slice(idx)\n );\n}\n\nexport const AGENTS_MD_INNER = [\n \"# Project Agent Instructions\",\n \"\",\n \"This project uses hatch3r for agentic coding setup.\",\n \"Full canonical instructions are at `/.agents/AGENTS.md`.\",\n \"\",\n \"## Quick Reference\",\n \"\",\n \"- Rules: `/.agents/rules/`\",\n \"- Agents: `/.agents/agents/`\",\n \"- Skills: `/.agents/skills/`\",\n \"- Commands: `/.agents/commands/`\",\n].join(\"\\n\");\n\nexport const AGENTS_MD_FULL = `${wrapInManagedBlock(AGENTS_MD_INNER)}\\n`;\n\n// ── Dynamic AGENTS.md generation ──────────────────────────────\n\n/**\n * Generate canonical AGENTS.md content based on what's actually installed on disk.\n * Reads agent, skill, and command files from the .agents/ directory.\n */\nexport async function generateCanonicalAgentsMd(agentsDir: string): Promise<string> {\n const sections: string[] = [];\n\n sections.push(`# hatch3r — Canonical Agent Instructions\n\nThis file is the canonical reference for all agent orchestration in this project. It is auto-generated by hatch3r and should not be manually edited.\n\n## Universal Sub-Agent Pipeline\n\nEvery task — board-pickup, workflow command, plain chat, single-task, or multi-task — MUST use this four-phase sub-agent pipeline. There are NO exceptions. Never implement code inline; always delegate to sub-agents.\n\n**Phase 1 — Research:** Spawn \\`hatch3r-researcher\\` for context gathering before implementation. Skip only for trivial single-line edits.\n\n**Phase 2 — Implement:** Spawn \\`hatch3r-implementer\\` for ALL code changes. One dedicated implementer per task.\n\n**Phase 3 — Review Loop:** Spawn \\`hatch3r-reviewer\\`, then \\`hatch3r-fixer\\` for Critical/Warning findings, re-review, repeat until clean (max 3 iterations).\n\n**Phase 4 — Final Quality** (runs ONLY after review loop is clean): Spawn applicable specialists in parallel.\n\n## Orchestration Protocol\n\n1. **Load the matching skill** from \\`/.agents/skills/\\` based on task type before implementation.\n2. **Score task complexity** per the \\`hatch3r-deep-context\\` rule.\n3. **Spawn a researcher subagent** (\\`hatch3r-researcher\\`) for context gathering.\n4. **Spawn an implementer subagent** (\\`hatch3r-implementer\\`) for code changes.\n5. **Run the review loop** (Phase 3).\n6. **Spawn final quality subagents** (Phase 4).\n7. **Propagate rules** to all subagent prompts.\n8. **Consult learnings** from \\`/.agents/learnings/\\`.`);\n\n // Build agent roster from what's on disk\n const agents = await readDirFiles(join(agentsDir, \"agents\"));\n if (agents.length > 0) {\n sections.push(\"\\n## Agent Roster\\n\");\n sections.push(\"| Agent | Purpose |\");\n sections.push(\"|-------|---------|\");\n for (const agent of agents) {\n const { metadata } = parseFrontmatter(agent.content);\n const id = metadata.id || metadata.name || agent.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n // Build skill dispatch table with inline checklists from what's on disk\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length > 0) {\n sections.push(\"\\n## Available Skills\\n\");\n sections.push(\"| Skill | Description |\");\n sections.push(\"|-------|-------------|\");\n for (const skill of skills) {\n sections.push(`| \\`${skill.id}\\` | ${skill.description.slice(0, 100)} |`);\n }\n\n // Inline condensed skill checklists so agents don't need a separate file read\n const skillsWithChecklists = skills.filter((s) => s.checklist);\n if (skillsWithChecklists.length > 0) {\n sections.push(\"\\n## Skill Quick Reference\\n\");\n sections.push(\"When loading a skill, follow its checklist steps below. Full skill content is in `/.agents/skills/{id}/SKILL.md`.\\n\");\n for (const skill of skillsWithChecklists) {\n sections.push(`### \\`${skill.id}\\`\\n`);\n sections.push(skill.checklist!);\n sections.push(\"\");\n }\n }\n }\n\n // Build command list from what's on disk\n const commands = await readDirFiles(join(agentsDir, \"commands\"));\n if (commands.length > 0) {\n sections.push(\"\\n## Available Commands\\n\");\n sections.push(\"| Command | Description |\");\n sections.push(\"|---------|-------------|\");\n for (const cmd of commands) {\n const { metadata } = parseFrontmatter(cmd.content);\n const id = metadata.id || metadata.name || cmd.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n sections.push(`\n## Directory Structure\n\n- \\`/.agents/rules/\\` — Rules (source of truth for all tool-specific rules)\n- \\`/.agents/agents/\\` — Agent definitions\n- \\`/.agents/skills/\\` — Skill workflows\n- \\`/.agents/commands/\\` — Executable commands\n- \\`/.agents/mcp/\\` — MCP server configuration\n- \\`/.agents/policy/\\` — Guardrails and deny lists\n- \\`/.agents/learnings/\\` — Project learnings (pitfalls, patterns, decisions)\n`);\n\n return sections.join(\"\\n\");\n}\n\n// ── Helpers ──────────────────────────────────────────────────\n\ninterface DirFile {\n name: string;\n content: string;\n}\n\nasync function readDirFiles(dir: string): Promise<DirFile[]> {\n try {\n const entries = await readdir(dir);\n const mdFiles = entries.filter((f) => f.endsWith(\".md\")).sort();\n return Promise.all(\n mdFiles.map(async (name) => ({\n name,\n content: await readFile(join(dir, name), \"utf-8\"),\n })),\n );\n } catch {\n return [];\n }\n}\n\n/**\n * Extract a condensed checklist from skill content by pulling numbered lists\n * and heading structure (max ~20 lines per skill to keep token count manageable).\n */\nfunction extractSkillChecklist(content: string): string | undefined {\n const lines = content.split(\"\\n\");\n const checklist: string[] = [];\n let inSteps = false;\n\n for (const line of lines) {\n // Start capturing at headings containing \"steps\", \"protocol\", \"workflow\", \"checklist\", or numbered procedure\n if (/^#{1,3}\\s+.*(step|protocol|workflow|checklist|procedure|implementation)/i.test(line)) {\n inSteps = true;\n continue;\n }\n // Stop at the next major heading that isn't a sub-step\n if (inSteps && /^#{1,2}\\s+/.test(line) && !/step|phase/i.test(line)) {\n break;\n }\n if (inSteps && (line.match(/^\\d+\\.\\s/) || line.match(/^-\\s/) || line.match(/^\\s+\\d+\\.\\s/) || line.match(/^\\s+-\\s/))) {\n checklist.push(line);\n if (checklist.length >= 20) break;\n }\n }\n\n return checklist.length > 0 ? checklist.join(\"\\n\") : undefined;\n}\n\nasync function readSkillDirs(dir: string): Promise<{ id: string; description: string; checklist?: string }[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const skills: { id: string; description: string; checklist?: string }[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const raw = await readFile(join(dir, entry.name, \"SKILL.md\"), \"utf-8\");\n const { metadata, content } = parseFrontmatter(raw);\n skills.push({\n id: metadata.id || metadata.name || entry.name,\n description: metadata.description ?? \"\",\n checklist: extractSkillChecklist(content),\n });\n } catch {\n // skip\n }\n }\n return skills.sort((a, b) => a.id.localeCompare(b.id));\n } catch {\n return [];\n }\n}\n","import { readFile, readdir, lstat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CanonicalFile, CanonicalMetadata } from \"../types.js\";\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n([\\s\\S]*))?$/;\n\nexport function parseFrontmatter(rawContent: string): {\n metadata: CanonicalMetadata;\n content: string;\n} {\n const match = rawContent.match(FRONTMATTER_REGEX);\n if (!match) {\n return {\n metadata: { id: \"\", type: \"rule\", description: \"\" },\n content: rawContent,\n };\n }\n\n const [, frontmatterStr, content = \"\"] = match;\n const parsed = parseYaml(frontmatterStr ?? \"\") as Record<string, unknown> | null;\n const metadata: CanonicalMetadata = {\n id: \"\",\n type: \"rule\",\n description: \"\",\n };\n\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.id === \"string\") metadata.id = parsed.id;\n if (typeof parsed.type === \"string\") metadata.type = parsed.type;\n if (typeof parsed.description === \"string\") metadata.description = parsed.description;\n if (typeof parsed.name === \"string\") metadata.name = parsed.name;\n if (typeof parsed.scope === \"string\") metadata.scope = parsed.scope;\n if (typeof parsed.model === \"string\") metadata.model = parsed.model;\n if (typeof parsed.agent === \"string\") metadata.agent = parsed.agent;\n if (typeof parsed.event === \"string\") metadata.event = parsed.event;\n if (typeof parsed.globs === \"string\") metadata.globs = parsed.globs;\n if (typeof parsed.protected === \"boolean\") metadata.protected = parsed.protected;\n if (typeof parsed.alwaysApply === \"boolean\") metadata.alwaysApply = parsed.alwaysApply;\n if (typeof parsed.readonly === \"boolean\") metadata.readonly = parsed.readonly;\n if (typeof parsed.background === \"boolean\") metadata.background = parsed.background;\n if (Array.isArray(parsed.tags)) metadata.tags = parsed.tags.filter((t: unknown) => typeof t === \"string\");\n }\n\n if (!metadata.id && metadata.name) {\n metadata.id = metadata.name;\n }\n metadata.type = metadata.type ?? \"rule\";\n metadata.description = metadata.description ?? \"\";\n\n return { metadata, content: content ?? \"\" };\n}\n\nexport type CanonicalType =\n | \"rules\"\n | \"agents\"\n | \"skills\"\n | \"commands\"\n | \"prompts\"\n | \"github-agents\";\n\ninterface ReaderConfig {\n type: CanonicalFile[\"type\"];\n dir: string;\n strategy: \"glob\" | \"subdirectory\";\n}\n\nconst READER_CONFIGS: Record<CanonicalType, ReaderConfig> = {\n rules: { type: \"rule\", dir: \"rules\", strategy: \"glob\" },\n agents: { type: \"agent\", dir: \"agents\", strategy: \"glob\" },\n skills: { type: \"skill\", dir: \"skills\", strategy: \"subdirectory\" },\n commands: { type: \"command\", dir: \"commands\", strategy: \"glob\" },\n prompts: { type: \"prompt\", dir: \"prompts\", strategy: \"glob\" },\n \"github-agents\": { type: \"github-agent\", dir: \"github-agents\", strategy: \"glob\" },\n};\n\nasync function readGlobMd(baseDir: string, fileType: CanonicalFile[\"type\"]): Promise<CanonicalFile[]> {\n let entries: string[];\n try {\n const all = await readdir(baseDir, { recursive: true });\n entries = all.filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const results = await Promise.all(\n entries.map(async (relPath) => {\n const fullPath = join(baseDir, relPath);\n const stats = await lstat(fullPath);\n if (stats.isSymbolicLink()) {\n return null;\n }\n const rawContent = await readFile(fullPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(rawContent);\n const id = metadata.id || metadata.name || relPath.replace(/\\.md$/, \"\").replace(/\\//g, \"-\");\n return {\n id,\n type: fileType,\n description: metadata.description ?? \"\",\n scope: metadata.scope,\n model: metadata.model,\n protected: metadata.protected,\n readonly: metadata.readonly,\n background: metadata.background,\n tags: metadata.tags,\n content,\n rawContent,\n sourcePath: fullPath,\n };\n }),\n );\n return results.filter((r): r is NonNullable<typeof r> => r !== null);\n}\n\nasync function readSkillSubdirs(baseDir: string): Promise<CanonicalFile[]> {\n let dirents: { name: string; isDirectory: () => boolean }[];\n try {\n dirents = await readdir(baseDir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const entries = await Promise.all(\n dirents\n .filter((d) => d.isDirectory())\n .map(async (dir) => {\n const skillPath = join(baseDir, dir.name, \"SKILL.md\");\n try {\n const skillStats = await lstat(skillPath);\n if (skillStats.isSymbolicLink()) {\n return null;\n }\n const rawContent = await readFile(skillPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(rawContent);\n const id = metadata.name ?? metadata.id ?? dir.name;\n return {\n id,\n type: \"skill\" as const,\n description: metadata.description ?? \"\",\n protected: metadata.protected,\n tags: metadata.tags,\n content,\n rawContent,\n sourcePath: skillPath,\n };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return null;\n }\n }),\n );\n\n return entries.filter((e): e is NonNullable<typeof e> => e !== null);\n}\n\nexport async function readCanonicalFiles(\n agentsDir: string,\n type: CanonicalType,\n): Promise<CanonicalFile[]> {\n const config = READER_CONFIGS[type];\n const baseDir = join(agentsDir, config.dir);\n return config.strategy === \"subdirectory\"\n ? readSkillSubdirs(baseDir)\n : readGlobMd(baseDir, config.type);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface McpServerEntry {\n command?: string;\n args?: string[];\n url?: string;\n env?: Record<string, string>;\n _description?: string;\n _disabled?: boolean;\n}\n\nconst ALLOWED_COMMANDS = new Set([\n \"npx\",\n \"node\",\n \"uvx\",\n \"docker\",\n \"python\",\n \"python3\",\n \"pip\",\n \"pip3\",\n \"deno\",\n \"bun\",\n \"uv\",\n \"go\",\n \"cargo\",\n]);\n\nconst ALLOWED_URL_SCHEMES = new Set([\"http:\", \"https:\"]);\n\nexport function validateMcpEntry(\n name: string,\n entry: McpServerEntry,\n): string[] {\n const warnings: string[] = [];\n\n if (entry.command) {\n const baseCommand =\n entry.command.split(\"/\").pop()?.split(\"\\\\\").pop() ?? entry.command;\n if (!ALLOWED_COMMANDS.has(baseCommand)) {\n warnings.push(\n `MCP server \"${name}\" uses unrecognized command \"${entry.command}\". ` +\n `Expected one of: ${[...ALLOWED_COMMANDS].join(\", \")}`,\n );\n }\n }\n\n if (entry.url) {\n try {\n const parsed = new URL(entry.url);\n if (!ALLOWED_URL_SCHEMES.has(parsed.protocol)) {\n warnings.push(\n `MCP server \"${name}\" uses unsupported URL scheme \"${parsed.protocol}\". ` +\n `Allowed: ${[...ALLOWED_URL_SCHEMES].join(\", \")}`,\n );\n }\n } catch {\n warnings.push(\n `MCP server \"${name}\" has invalid URL: \"${entry.url}\"`,\n );\n }\n }\n\n if (!entry.command && !entry.url) {\n warnings.push(\n `MCP server \"${name}\" has neither command nor url configured`,\n );\n }\n\n if (entry.args) {\n const SHELL_METACHAR = /[|;&`$()]/;\n for (const arg of entry.args) {\n if (SHELL_METACHAR.test(arg)) {\n warnings.push(\n `MCP server \"${name}\" arg contains shell metacharacters: \"${arg}\". ` +\n `This may indicate a command injection risk.`,\n );\n }\n }\n\n const hasAutoYes = entry.args.some((a) => a === \"-y\" || a === \"--yes\");\n if (hasAutoYes) {\n const pkgArg = entry.args.find(\n (a) => !a.startsWith(\"-\") && a !== entry.command,\n );\n if (pkgArg && !pkgArg.startsWith(\"@\")) {\n warnings.push(\n `MCP server \"${name}\" uses npx -y with unscoped package \"${pkgArg}\". ` +\n `Unscoped packages are susceptible to typosquatting. Consider using a scoped package (@org/pkg).`,\n );\n }\n }\n }\n\n return warnings;\n}\n\n// Server names must contain only alphanumeric characters, hyphens, and underscores.\n// Names with other special characters are rejected to prevent path traversal,\n// injection, or config key manipulation.\nconst VALID_SERVER_NAME = /^[a-zA-Z0-9_-]+$/;\n\nexport function validateServerName(name: string): string | null {\n if (!VALID_SERVER_NAME.test(name)) {\n return (\n `MCP server name \"${name}\" contains invalid characters. ` +\n `Only alphanumeric characters, hyphens, and underscores are allowed.`\n );\n }\n return null;\n}\n\nfunction validateMcpConfig(\n parsed: unknown,\n): parsed is { mcpServers: Record<string, McpServerEntry> } {\n if (typeof parsed !== \"object\" || parsed === null) return false;\n const obj = parsed as Record<string, unknown>;\n return typeof obj.mcpServers === \"object\" && obj.mcpServers !== null;\n}\n\nexport interface McpConfigResult {\n servers: Record<string, McpServerEntry>;\n warnings: string[];\n}\n\nexport async function readMcpConfig(\n agentsDir: string,\n): Promise<McpConfigResult> {\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n const warnings: string[] = [];\n try {\n const mcpRaw = await readFile(mcpPath, \"utf-8\");\n const parsed: unknown = JSON.parse(mcpRaw);\n if (validateMcpConfig(parsed)) {\n const validServers: Record<string, McpServerEntry> = {};\n for (const [name, entry] of Object.entries(parsed.mcpServers)) {\n const nameWarning = validateServerName(name);\n if (nameWarning) {\n warnings.push(nameWarning);\n continue;\n }\n warnings.push(...validateMcpEntry(name, entry));\n validServers[name] = entry;\n }\n return { servers: validServers, warnings };\n }\n return { servers: {}, warnings };\n } catch (err) {\n warnings.push(`Could not read MCP config: ${err instanceof Error ? err.message : String(err)}`);\n return { servers: {}, warnings };\n }\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { HookDefinition } from \"./types.js\";\nimport { isValidHookEvent } from \"./types.js\";\n\nexport async function readHookDefinitions(\n agentsDir: string,\n): Promise<HookDefinition[]> {\n const hooksDir = join(agentsDir, \"hooks\");\n\n let entries: string[];\n try {\n const dirEntries = await readdir(hooksDir);\n entries = dirEntries.filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const hooks: HookDefinition[] = [];\n\n for (const entry of entries) {\n const content = await readFile(join(hooksDir, entry), \"utf-8\");\n const hook = parseHookFrontmatter(content);\n if (hook) {\n hooks.push(hook);\n }\n }\n\n return hooks;\n}\n\nfunction parseHookFrontmatter(content: string): HookDefinition | null {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n\n const parsed = parseYaml(match[1]) as Record<string, unknown> | null;\n if (!parsed || typeof parsed !== \"object\") return null;\n\n if (!parsed.id || !parsed.event || !parsed.agent) return null;\n\n const eventStr = String(parsed.event);\n if (!isValidHookEvent(eventStr)) return null;\n\n const hook: HookDefinition = {\n id: String(parsed.id),\n event: eventStr,\n agent: String(parsed.agent),\n description: parsed.description ? String(parsed.description) : \"\",\n };\n\n const condition: HookDefinition[\"condition\"] = {};\n let hasCondition = false;\n\n if (parsed.globs) {\n condition.globs = Array.isArray(parsed.globs)\n ? parsed.globs.map(String)\n : String(parsed.globs).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n if (parsed.labels) {\n condition.labels = Array.isArray(parsed.labels)\n ? parsed.labels.map(String)\n : String(parsed.labels).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n if (parsed.branches) {\n condition.branches = Array.isArray(parsed.branches)\n ? parsed.branches.map(String)\n : String(parsed.branches).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n\n if (hasCondition) {\n hook.condition = condition;\n }\n\n return hook;\n}\n","export type HookEvent =\n | \"pre-commit\"\n | \"post-merge\"\n | \"ci-failure\"\n | \"file-save\"\n | \"session-start\"\n | \"pre-push\"\n | \"worktree-create\"\n | \"worktree-remove\";\n\nexport const VALID_HOOK_EVENTS = new Set<HookEvent>([\n \"pre-commit\",\n \"post-merge\",\n \"ci-failure\",\n \"file-save\",\n \"session-start\",\n \"pre-push\",\n \"worktree-create\",\n \"worktree-remove\",\n]);\n\nexport function isValidHookEvent(event: string): event is HookEvent {\n return VALID_HOOK_EVENTS.has(event as HookEvent);\n}\n\nexport interface HookDefinition {\n id: string;\n event: HookEvent;\n agent: string;\n description: string;\n condition?: HookCondition;\n}\n\nexport interface HookCondition {\n globs?: string[];\n labels?: string[];\n branches?: string[];\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class AiderAdapter extends BaseAdapter {\n readonly name = \"aider\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n\n const results: AdapterOutput[] = [\n output(\"CONVENTIONS.md\", wrapInManagedBlock(inner), inner),\n ];\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.aider/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n // Note: Aider config is output as YAML (.aider.conf.yml). If TOML output is\n // ever added for Aider, all string values must be properly escaped using\n // escapeTomlString() from toml-utils.ts to handle backslashes, quotes, and\n // control characters correctly.\n results.push(output(\".aider.conf.yml\", [\n \"# Managed by hatch3r — do not edit manually\",\n \"read:\",\n \" - CONVENTIONS.md\",\n \" - .agents/AGENTS.md\",\n \"auto-lint: true\",\n \"\",\n ].join(\"\\n\")));\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class AmazonQAdapter extends BaseAdapter {\n readonly name = \"amazon-q\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".amazonq/rules/hatch3r-agents.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.amazonq/rules/hatch3r-skill-${id}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".amazonq/settings.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class AmpAdapter extends BaseAdapter {\n readonly name = \"amp\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx, (m) => ({\n text: `**Recommended model:** \\`${m}\\`. Use Smart mode for Opus, Rush for Haiku, Deep for Codex.`,\n })),\n ].join(\"\\n\");\n results.push(output(\".amp/AGENTS.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.amp/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".amp/settings.json\", JSON.stringify({ \"amp.mcpServers\": entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\n// Antigravity adapter — generates configuration for Google Antigravity IDE.\n// Antigravity reads project rules from `.antigravity/rules.md` and skills\n// from `.antigravity/skills/`. MCP servers are configured in\n// `.antigravity/settings.json`. The adapter also generates a bridge file\n// referencing the canonical `.agents/AGENTS.md`.\nexport class AntigravityAdapter extends BaseAdapter {\n readonly name = \"antigravity\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx, \".agents/AGENTS.md\"),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".antigravity/rules.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.antigravity/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".antigravity/settings.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookDefinition, HookEvent } from \"../hooks/types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nconst AGENT_TEAMS_SECTION = [\n \"## Agent Teams\",\n \"\",\n \"This project uses hatch3r's 4-phase sub-agent pipeline (Research -> Implement -> Review -> Quality)\",\n \"which maps directly to Claude Code Agent Teams. Each phase becomes a teammate role.\",\n \"\",\n \"### Enabling Agent Teams\",\n \"\",\n \"Agent Teams is enabled via `.claude/settings.json`. The env var `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`\",\n \"is set automatically by hatch3r. Once enabled, request a team in the prompt:\",\n \"\",\n \"```\",\n 'Create an agent team for this task. Use the hatch3r 4-phase pipeline.',\n \"```\",\n \"\",\n \"### Teammate Display Modes\",\n \"\",\n \"Agent Teams supports two display modes configured via `teammateMode` in `.claude/settings.json`:\",\n \"\",\n '- `\"auto\"` (default): uses split panes if inside tmux, in-process otherwise.',\n '- `\"in-process\"`: all teammates run inside your main terminal. Use Shift+Down to cycle.',\n '- `\"tmux\"`: each teammate gets its own pane. Requires tmux or iTerm2.',\n \"\",\n \"### Pipeline-to-Team Mapping\",\n \"\",\n \"| Phase | Teammate Role | hatch3r Agents | Delegation Notes |\",\n \"|-------|--------------|----------------|------------------|\",\n \"| **1 — Research** | `researcher` | `hatch3r-researcher`, `hatch3r-learnings-loader` | Read-only; shares findings via task list |\",\n \"| **2 — Implement** | `implementer` | `hatch3r-implementer` | Require plan approval for complex tasks |\",\n \"| **3 — Review** | `reviewer` | `hatch3r-reviewer`, `hatch3r-fixer` | Review loop: reviewer finds issues, fixer resolves them |\",\n \"| **4 — Quality** | `quality-*` (parallel) | `hatch3r-test-writer`, `hatch3r-security-auditor`, `hatch3r-docs-writer`, `hatch3r-lint-fixer`, `hatch3r-a11y-auditor`, `hatch3r-perf-profiler`, `hatch3r-dependency-auditor` | Spawn in parallel; each owns distinct files |\",\n \"\",\n \"### Spawn Prompt Template\",\n \"\",\n \"When creating a team, use explicit file boundaries and role assignments:\",\n \"\",\n \"```\",\n \"Create an agent team with these roles:\",\n \"1. researcher — gather context from src/ and docs/. Read-only, no code changes.\",\n \" Share findings via the task list.\",\n \"2. implementer — implement changes in {target directories}.\",\n \" Require plan approval before making changes.\",\n \"3. reviewer — review the implementer's changes for correctness, style, and security.\",\n \" Post findings to the task list.\",\n \"4. test-writer — write tests for the implemented changes in {test directories}.\",\n \"5. security-auditor — audit changes for security vulnerabilities. Read-only.\",\n \"```\",\n \"\",\n \"### Delegation Rules\",\n \"\",\n \"- **Researcher before implementer**: Block implementer tasks on researcher completion.\",\n \" The lead should not approve the implementer's plan until researcher findings are posted.\",\n \"- **Reviewer in loop**: After implementation, the reviewer teammate inspects changes.\",\n \" If critical issues are found, message the implementer directly to fix them.\",\n \"- **Quality in parallel**: Once review is clean, spawn quality teammates simultaneously.\",\n \" Each quality teammate owns a distinct concern (tests, security, docs) to avoid conflicts.\",\n \"- **Plan approval**: Require plan approval for the implementer teammate to ensure\",\n \" the implementation approach aligns with researcher findings before any code is written.\",\n \"\",\n \"### Quality Gate Hooks\",\n \"\",\n \"The `TaskCompleted` and `TeammateIdle` hooks in `.claude/settings.json` enforce the pipeline:\",\n \"\",\n \"- `TaskCompleted` validates that completed tasks meet review criteria before marking done.\",\n \"- `TeammateIdle` checks whether idle teammates can pick up pending quality-phase tasks.\",\n \"\",\n \"### Important Notes\",\n \"\",\n \"- Teammates read this `CLAUDE.md` automatically — all hatch3r instructions apply to every teammate.\",\n \"- Teammates do **not** inherit conversation history; include full task context in spawn prompts.\",\n \"- Assign explicit file boundaries to avoid edit conflicts between teammates.\",\n \"- Use the `hatch3r-agent-team` command (`/hatch3r-agent-team`) for guided team creation.\",\n];\n\n/** Minimal version of Agent Teams section -- essential mapping only, no prose. */\nconst AGENT_TEAMS_SECTION_MINIMAL = [\n \"## Agent Teams\",\n \"\",\n \"Pipeline maps to Claude Code Agent Teams. Enable via `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`.\",\n \"\",\n \"| Phase | Role | Agents |\",\n \"|-------|------|--------|\",\n \"| Research | `researcher` | `hatch3r-researcher` |\",\n \"| Implement | `implementer` | `hatch3r-implementer` |\",\n \"| Review | `reviewer` | `hatch3r-reviewer`, `hatch3r-fixer` |\",\n \"| Quality | `quality-*` | `hatch3r-test-writer`, `hatch3r-security-auditor`, + conditional |\",\n \"\",\n \"Use `/hatch3r-agent-team` for guided team creation.\",\n];\n\nconst AGENT_TEAM_COMMAND = `# hatch3r Agent Team\n\nCreate a Claude Code Agent Team that follows the hatch3r 4-phase pipeline.\n\n## Usage\n\nDescribe the task when invoking this command. The team will be structured according\nto the hatch3r pipeline: Research → Implement → Review → Quality.\n\n## Team Structure\n\nSet up an Agent Team with these roles based on the task described above:\n\n### Phase 1 — Research (read-only)\n\nSpawn a \\`researcher\\` teammate:\n- Read the codebase to understand context, patterns, and conventions\n- Identify affected files and blast radius\n- Share findings via the shared task list\n- Do NOT modify any files\n\n### Phase 2 — Implement (requires plan approval)\n\nSpawn an \\`implementer\\` teammate after the researcher completes:\n- Review the researcher's findings from the task list before planning\n- Create a plan and submit for approval before writing code\n- Implement changes within the assigned file boundaries\n- Mark implementation tasks complete when done\n\n### Phase 3 — Review\n\nSpawn a \\`reviewer\\` teammate after implementation:\n- Review all changes made by the implementer\n- Post findings (Critical/Warning/Info) to the task list\n- If Critical or Warning findings exist, message the implementer to fix\n- Re-review after fixes; repeat up to 3 iterations\n\n### Phase 4 — Quality (parallel)\n\nAfter review is clean, spawn quality teammates in parallel:\n- \\`test-writer\\` — write/update tests for the changes\n- \\`security-auditor\\` — audit for security vulnerabilities (read-only)\n- \\`docs-writer\\` — update documentation if APIs or behavior changed\n\nEach quality teammate owns distinct files to avoid conflicts.\n\n## Task Dependencies\n\n- implementer depends on researcher\n- reviewer depends on implementer\n- quality teammates depend on reviewer (clean review)\n\n## Important\n\n- Teammate display mode is configured in \\`.claude/settings.json\\` via \\`teammateMode\\` (\\`auto\\`, \\`in-process\\`, or \\`tmux\\`)\n- Override for a single session: \\`claude --teammate-mode in-process\\`\n- Each teammate reads CLAUDE.md and inherits project rules automatically\n- Assign explicit file/directory boundaries to each teammate\n- The lead coordinates; it should NOT implement code itself (use delegate mode)\n`;\n\n// Claude Code hooks use an event+matcher pattern, not direct git hook names.\n// Each hook fires on a Claude event (e.g. PreToolUse, PostToolUse, SessionStart)\n// paired with a tool matcher regex that scopes when the hook triggers.\n//\n// Mapping from hatch3r canonical hook events to Claude Code hook semantics:\n// pre-commit -> PreToolUse + matcher \"Bash\" (intercept before shell commands)\n// post-merge -> PostToolUse + matcher \"Bash\" (react after shell commands)\n// ci-failure -> SubagentStart + matcher \"Bash\" (trigger on sub-agent launch)\n// file-save -> PostToolUse + matcher \"Write\" (react after file writes)\n// session-start -> SessionStart + matcher \".*\" (fire on every session start)\n// pre-push -> PreToolUse + matcher \"Bash\" (intercept before shell commands)\nfunction mapToClaudeEvent(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"PreToolUse\",\n \"post-merge\": \"PostToolUse\",\n \"ci-failure\": \"SubagentStart\",\n \"file-save\": \"PostToolUse\",\n \"session-start\": \"SessionStart\",\n \"pre-push\": \"PreToolUse\",\n \"worktree-create\": \"PostToolUse\",\n \"worktree-remove\": \"PreToolUse\",\n };\n return mapping[event] || event;\n}\n\nfunction getClaudeToolMatcher(hook: HookDefinition): string {\n const eventToolMap: Record<HookEvent, string> = {\n \"pre-commit\": \"Bash\",\n \"post-merge\": \"Bash\",\n \"file-save\": \"Write\",\n \"session-start\": \".*\",\n \"pre-push\": \"Bash\",\n \"ci-failure\": \"Bash\",\n \"worktree-create\": \"Bash\",\n \"worktree-remove\": \"Bash\",\n };\n return eventToolMap[hook.event] || \".*\";\n}\n\nfunction transformEnvVarsForClaude(value: unknown): unknown {\n if (typeof value === \"string\") {\n return value.replace(/\\$\\{env:([^}]+)\\}/g, \"${$1}\");\n }\n if (Array.isArray(value)) {\n return value.map(transformEnvVarsForClaude);\n }\n if (typeof value === \"object\" && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = transformEnvVarsForClaude(v);\n }\n return result;\n }\n return value;\n}\n\nexport class ClaudeAdapter extends BaseAdapter {\n readonly name = \"claude\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n const minimal = this.isMinimal(ctx);\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const teamsSection = minimal ? AGENT_TEAMS_SECTION_MINIMAL : AGENT_TEAMS_SECTION;\n const innerParts = minimal\n ? [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Instructions: `.agents/AGENTS.md`. Rules: `.claude/rules/`. Agents: `.claude/agents/`.\",\n \"\",\n this.stripMinimal(bridgeOrchestration),\n \"\",\n ...teamsSection,\n \"\",\n ]\n : [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Full canonical agent instructions are at `.agents/AGENTS.md`.\",\n \"Rules are managed in `.claude/rules/` and agents in `.claude/agents/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...teamsSection,\n \"\",\n \"## Personal Settings\",\n \"\",\n \"Create `CLAUDE.local.md` for personal settings (not committed to git).\",\n \"Claude Code reads this file for user-specific preferences.\",\n \"\",\n \"## Getting Started with Claude Code\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.claude/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use `/hatch3r-feature` or `/hatch3r-bug-fix` commands for guided workflows.\",\n \"**Then:** Delegate to agents in `.claude/agents/` — use Agent Teams for parallel execution.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ];\n const innerContent = innerParts.join(\"\\n\");\n results.push(output(\"CLAUDE.md\", wrapInManagedBlock(innerContent), innerContent));\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const body = minimal\n ? `# ${rule.id}\\n\\n${this.stripMinimal(content)}`\n : `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.claude/rules/${toPrefixedId(rule.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const fm = `---\\ndescription: ${desc}\\n---`;\n if (minimal) {\n const modelNote = model ? `\\nModel: \\`${model}\\`` : \"\";\n const body = `${this.stripMinimal(content)}${modelNote}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n } else {\n const modelGuidance = model\n ? `\\n\\n## Recommended Model\\n\\nPreferred: \\`${model}\\`. Set via \\`/model ${model}\\` or env \\`CLAUDE_CODE_SUBAGENT_MODEL=${model}\\`.`\n : \"\";\n const body = `${content}${modelGuidance}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n }\n\n const defaultAllow = [\"Read\", \"Edit\", \"MultiEdit\", \"Write\", \"Grep\", \"Glob\", \"LS\", \"TodoRead\", \"TodoWrite\"];\n const claudeConfig = ctx.manifest.claude;\n\n // Agent Teams GA compatibility: use \"auto\" as default teammateMode.\n // Legacy values (\"tool-using\", \"full-trust\", \"manual-approval\") are still\n // accepted for backward compatibility but \"auto\" is the GA default.\n const teammateMode = claudeConfig?.teammateMode ?? \"auto\";\n\n const settingsObj: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n permissions: {\n allow: claudeConfig?.permissions?.allow ?? defaultAllow,\n deny: claudeConfig?.permissions?.deny ?? [],\n },\n teammateMode,\n };\n\n const hooksConfig: Record<string, Array<{ matcher: string; hooks: Array<{ type: string; command: string }> }>> = {};\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const claudeEvent = mapToClaudeEvent(hook.event);\n if (!hooksConfig[claudeEvent]) hooksConfig[claudeEvent] = [];\n hooksConfig[claudeEvent].push({\n matcher: getClaudeToolMatcher(hook),\n hooks: [{ type: \"command\", command: `echo \"HATCH3R_HOOK_ACTIVATED: Spawn the ${hook.agent} agent now. Follow the ${hook.agent} agent protocol in .claude/agents/${toPrefixedId(hook.agent)}.md. Event: ${hook.event}. Hook ID: ${hook.id}.\"` }],\n });\n }\n\n hooksConfig.TaskCompleted = [{\n matcher: \".*\",\n hooks: [{ type: \"command\", command: \"echo \\\"HATCH3R_QUALITY_GATE: Before marking this task complete, verify: (1) Phase 3 review loop passed with 0 Critical + 0 Warning, (2) Phase 4 specialists ran (hatch3r-test-writer + hatch3r-security-auditor at minimum), (3) all acceptance criteria met. If any check fails, do NOT mark complete — spawn the appropriate agent to address the gap.\\\"\" }],\n }];\n hooksConfig.TeammateIdle = [{\n matcher: \".*\",\n hooks: [{ type: \"command\", command: \"echo \\\"HATCH3R_PIPELINE_CHECK: Idle teammate detected. Check for pending Phase 4 quality tasks: hatch3r-test-writer, hatch3r-security-auditor, hatch3r-docs-writer, hatch3r-lint-fixer, hatch3r-a11y-auditor. If any are pending and within this teammate's scope, pick up the next task.\\\"\" }],\n }];\n\n // Worktree file isolation: detect `git worktree add` and sync gitignored files\n if (ctx.manifest.worktree?.enabled) {\n if (!hooksConfig.PostToolUse) hooksConfig.PostToolUse = [];\n hooksConfig.PostToolUse.push({\n matcher: \"Bash\",\n hooks: [{\n type: \"command\",\n command: 'bash -c \\'CMD=\"${TOOL_INPUT:-}\"; if echo \"$CMD\" | grep -q \"git worktree add\"; then ARGS=\"${CMD#*git worktree add}\"; WTDIR=\"\"; SKIP=false; for w in $ARGS; do if $SKIP; then SKIP=false; continue; fi; case \"$w\" in -b|-B|--reason) SKIP=true;; -*) ;; *) WTDIR=\"$w\"; break;; esac; done; [ -n \"$WTDIR\" ] && npx hatch3r worktree-setup \"$WTDIR\" || true; fi\\'',\n }],\n });\n }\n\n settingsObj.hooks = hooksConfig;\n\n // Agent Teams: when agentTeams is \"ga\", omit the experimental env var\n // (the feature is natively available). Otherwise, set the experimental flag\n // to enable Agent Teams unless explicitly disabled (agentTeams === false).\n const agentTeamsSetting = ctx.manifest.claude?.agentTeams;\n if (agentTeamsSetting === \"ga\") {\n // GA mode: no experimental flag needed, Agent Teams is natively available.\n // Only set env if there are other env vars to include.\n } else if (agentTeamsSetting !== false) {\n settingsObj.env = { CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: \"1\" };\n }\n results.push(output(\".claude/settings.json\", JSON.stringify(settingsObj, null, 2)));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.claude/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.claude/commands/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp) {\n const claudeMcp: Record<string, unknown> = {};\n for (const [name, entry] of Object.entries(mcp)) {\n const type = entry.command ? \"stdio\" : entry.url ? \"http\" : undefined;\n const withType = type ? { type, ...entry } : { ...entry };\n claudeMcp[name] = transformEnvVarsForClaude(withType);\n }\n results.push(output(\".mcp.json\", JSON.stringify({ mcpServers: claudeMcp }, null, 2)));\n }\n\n results.push(output(\".claude/commands/hatch3r-agent-team.md\", wrapInManagedBlock(AGENT_TEAM_COMMAND), AGENT_TEAM_COMMAND));\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\ninterface ClineCustomMode {\n slug: string;\n name: string;\n roleDefinition: string;\n groups: string[];\n customInstructions?: string;\n whenToUse?: string;\n}\n\nexport class ClineAdapter extends BaseAdapter {\n readonly name = \"cline\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const customModes: ClineCustomMode[] = [];\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const slug = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const modelGuidance = model\n ? `\\n\\nRecommended model: ${model}. Select this model in the Roo Code model dropdown when using this mode.`\n : \"\";\n customModes.push({\n slug,\n name: agent.id,\n roleDefinition: content + modelGuidance,\n groups: [\"read\", \"edit\", \"browser\", \"command\", \"mcp\"],\n whenToUse: overrides.description ?? agent.description,\n });\n }\n }\n if (customModes.length > 0) {\n results.push(output(\".roomodes\", JSON.stringify({\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n customModes,\n }, null, 2)));\n }\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.cline/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.roo/rules/${toPrefixedId(rule.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const globs = hook.condition?.globs || [];\n const body = [\n `# Hook: ${hook.id}`,\n \"\",\n `**Event:** ${hook.event}`,\n `**Agent:** ${hook.agent}`,\n \"\",\n hook.description,\n \"\",\n `HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered${globs.length > 0 ? ` for files matching ${globs.join(\", \")}` : \"\"}, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`,\n ].join(\"\\n\");\n results.push(output(`.roo/rules/${toPrefixedId(`hook-${hook.id}`)}.md`, wrapInManagedBlock(body), body));\n }\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.clinerules/workflows/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const rooMcp: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcp)) {\n if (server.command) {\n rooMcp[name] = {\n command: server.command,\n args: server.args || [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n } else if (server.url) {\n rooMcp[name] = { url: server.url, transport: \"streamable-http\" };\n }\n }\n if (Object.keys(rooMcp).length > 0) {\n results.push(output(\".roo/mcp.json\", JSON.stringify({ mcpServers: rooMcp }, null, 2)));\n }\n }\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const bridgeBody = [\n \"# Hatch3r Bridge\",\n \"\",\n \"This project uses hatch3r for agentic coding setup.\",\n \"Canonical agent instructions live at `/.agents/AGENTS.md`.\",\n \"Rules and skills are managed in `.roo/rules/` and `.cline/skills/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n \"## Getting Started with Roo Code\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.roo/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use workflow commands in `.clinerules/workflows/` for guided task execution.\",\n \"**Then:** Switch to custom modes (defined in `.roomodes`) for specialized agent behaviors.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n ].join(\"\\n\");\n results.push(output(\".roo/rules/hatch3r-bridge.md\", wrapInManagedBlock(bridgeBody), bridgeBody));\n\n return results;\n }\n}\n","export function escapeTomlString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\");\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { escapeTomlString } from \"./toml-utils.js\";\n\n// Codex adapter — generates configuration for OpenAI Codex CLI.\n// Codex reads project config from the `.codex/` directory and uses\n// `.agents/AGENTS.md` as the primary model instructions file (set via\n// model_instructions_file in .codex/config.toml). Agent-specific\n// instructions are referenced from `.agents/agents/<id>.md`.\nexport class CodexAdapter extends BaseAdapter {\n readonly name = \"codex\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const configLines: string[] = [\n \"# Codex project configuration (managed by hatch3r)\",\n \"#\",\n \"# Do not manually edit — run `npx hatch3r sync` to regenerate.\",\n \"\",\n 'model_instructions_file = \".agents/AGENTS.md\"',\n \"\",\n ];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const enabledRules = [];\n for (const rule of rules) {\n const { skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n enabledRules.push({ ...rule, description: desc });\n }\n if (enabledRules.length > 0) {\n configLines.push(\"# Additional instruction files (rules)\");\n for (const rule of enabledRules) {\n configLines.push(`# rule: ${rule.id} — ${rule.description}`);\n }\n configLines.push(\"\");\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n configLines.push(`[agents.${agentId}]`);\n configLines.push(`model_instructions_file = \"${escapeTomlString(`.agents/agents/${agent.id}.md`)}\"`);\n if (model) configLines.push(`model = \"${escapeTomlString(model)}\"`);\n configLines.push(\"\");\n }\n }\n\n const mcpFiltered = await this.readFilteredMcp(ctx);\n if (mcpFiltered) {\n for (const [name, server] of Object.entries(mcpFiltered)) {\n configLines.push(`[mcp_servers.${name}]`);\n if (server.command) {\n configLines.push(`command = \"${escapeTomlString(server.command)}\"`);\n if (server.args && server.args.length > 0) {\n const argsStr = server.args.map((a) => `\"${escapeTomlString(a)}\"`).join(\", \");\n configLines.push(`args = [${argsStr}]`);\n }\n } else if (server.url) {\n configLines.push(`url = \"${escapeTomlString(server.url)}\"`);\n }\n if (server.env) {\n for (const [k, v] of Object.entries(server.env)) {\n configLines.push(`env.${k} = \"${escapeTomlString(v)}\"`);\n }\n }\n configLines.push(\"\");\n }\n }\n\n results.push(output(\".codex/config.toml\", configLines.join(\"\\n\")));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.codex/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n return results;\n }\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport type PackageManagerName = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nexport interface PackageManagerInfo {\n name: PackageManagerName;\n installCmd: string;\n installArgs: string[];\n updateCmd: string;\n updateArgs: string[];\n}\n\nconst LOCK_FILE_MAP: Array<{ file: string; name: PackageManagerName }> = [\n { file: \"bun.lockb\", name: \"bun\" },\n { file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n { file: \"yarn.lock\", name: \"yarn\" },\n];\n\nconst PM_INFO: Record<PackageManagerName, Omit<PackageManagerInfo, \"name\">> = {\n bun: { installCmd: \"bun\", installArgs: [\"install\"], updateCmd: \"bun\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n pnpm: { installCmd: \"pnpm\", installArgs: [\"install\"], updateCmd: \"pnpm\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n yarn: { installCmd: \"yarn\", installArgs: [\"install\"], updateCmd: \"yarn\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n npm: { installCmd: \"npm\", installArgs: [\"install\"], updateCmd: \"npm\", updateArgs: [\"install\", \"hatch3r@latest\"] },\n};\n\nexport async function detectPackageManager(rootDir: string): Promise<PackageManagerInfo> {\n for (const { file, name } of LOCK_FILE_MAP) {\n try {\n await access(join(rootDir, file));\n return { name, ...PM_INFO[name] };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n return { name: \"npm\", ...PM_INFO.npm };\n}\n","import type {\n AdapterOutput,\n CanonicalFile,\n} from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { detectPackageManager } from \"../detect/packageManager.js\";\n\nexport class CopilotAdapter extends BaseAdapter {\n readonly name = \"copilot\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const alwaysRules: { rule: CanonicalFile; content: string }[] = [];\n const scopedRules: { rule: CanonicalFile; content: string; scope: string }[] = [];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n if (scope && scope !== \"always\") {\n scopedRules.push({ rule: { ...rule, description: overrides.description ?? rule.description }, content, scope });\n } else {\n alwaysRules.push({ rule: { ...rule, description: overrides.description ?? rule.description }, content });\n }\n }\n }\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const innerContent = [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Full canonical agent instructions are at `/.agents/AGENTS.md`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n \"## Hatch3r Rules\",\n \"\",\n ...alwaysRules.map(\n (r) => `### ${r.rule.id}\\n\\n${r.rule.description}\\n\\n${r.content}`,\n ),\n \"\",\n \"## Getting Started with Copilot\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Instructions in `.github/instructions/` scope rules to specific file patterns. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use prompts in `.github/prompts/` and commands in `.github/copilot/commands/` for guided workflows.\",\n \"**Then:** Delegate to agents in `.github/agents/` for specialized tasks.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ].join(\"\\n\");\n results.push(output(\".github/copilot-instructions.md\", wrapInManagedBlock(innerContent), innerContent));\n\n const pm = await detectPackageManager(ctx.projectRoot);\n const install = [pm.installCmd, ...pm.installArgs].join(\" \");\n const build = `${pm.installCmd} run build`;\n const copilotSetupSteps = `name: \"Copilot Setup Steps\"\non: [push]\njobs:\n setup:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - name: Install dependencies\n run: ${install}\n - name: Build\n run: ${build}\n`;\n results.push(output(\".github/workflows/copilot-setup-steps.yml\", copilotSetupSteps));\n\n for (const { rule, content, scope } of scopedRules) {\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n const applyTo = globs.join(\", \");\n const fm = `---\\napplyTo: \"${applyTo}\"\\n---`;\n const body = `# ${rule.id}\\n\\n${rule.description}\\n\\n${content}`;\n results.push(\n output(\n `.github/instructions/${toPrefixedId(rule.id)}.instructions.md`,\n `${fm}\\n\\n${wrapInManagedBlock(body)}`,\n body,\n ),\n );\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`name: ${agent.id}`, `description: ${desc}`];\n if (model) lines.push(`model: ${model}`);\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(output(`.github/agents/${toPrefixedId(agent.id)}.agent.md`, `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n }\n\n if (ctx.features.prompts) {\n const prompts = await readCanonicalFiles(ctx.agentsDir, \"prompts\");\n for (const prompt of prompts) {\n const body = prompt.rawContent;\n results.push(output(`.github/prompts/${toPrefixedId(prompt.id)}.prompt.md`, wrapInManagedBlock(body), body));\n }\n }\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.github/copilot/commands/${toPrefixedId(id)}.prompt.md`),\n );\n\n if (ctx.features.githubAgents) {\n const ghAgents = await readCanonicalFiles(ctx.agentsDir, \"github-agents\");\n for (const agent of ghAgents) {\n const body = agent.rawContent;\n results.push(output(`.github/copilot/agents/${toPrefixedId(agent.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.github/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const vscodeServers: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcp)) {\n const entry: Record<string, unknown> = {};\n if (server.command) entry.command = server.command;\n if (server.args) entry.args = server.args;\n if (server.url) entry.url = server.url;\n if (server.env) entry.env = server.env;\n if (server.command && server.env && Object.keys(server.env).length > 0) {\n entry.env = server.env;\n }\n vscodeServers[name] = entry;\n }\n results.push(output(\".vscode/mcp.json\", JSON.stringify({ servers: vscodeServers }, null, 2) + \"\\n\"));\n }\n\n return results;\n }\n}\n","import type {\n AdapterOutput,\n CanonicalFile,\n} from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\n\n/**\n * The Cursor adapter generates .mdc files from .md canonical files by adding\n * Cursor-specific frontmatter (description, globs/alwaysApply) and wrapping\n * content in managed blocks. Rules get `alwaysApply: true` or `globs: [...]`\n * based on their scope. Agents get `name`, `description`, `model`, `readonly`,\n * and `background` frontmatter fields.\n */\nfunction cursorRuleFrontmatter(rule: CanonicalFile, scopeOverride?: string): string {\n const scope = scopeOverride ?? rule.scope;\n const lines: string[] = [`description: ${rule.description}`];\n if (scope === \"always\") {\n lines.push(\"alwaysApply: true\");\n } else if (scope) {\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n lines.push(`globs: [${globs.map((g) => `\"${g}\"`).join(\", \")}]`);\n } else {\n lines.push(\"alwaysApply: false\");\n }\n return `---\\n${lines.join(\"\\n\")}\\n---`;\n}\n\nfunction mdcOutput(path: string, frontmatter: string, body: string): AdapterOutput {\n return output(path, `${frontmatter}\\n\\n${wrapInManagedBlock(body)}`, body);\n}\n\nexport class CursorAdapter extends BaseAdapter {\n readonly name = \"cursor\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const ruleWithDesc = { ...rule, description: desc };\n const baseName = `${toPrefixedId(rule.id)}.mdc`;\n results.push(mdcOutput(`.cursor/rules/${baseName}`, cursorRuleFrontmatter(ruleWithDesc, overrides.scope), content));\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`name: ${agent.id}`, `description: ${desc}`];\n if (model) lines.push(`model: ${model}`);\n if (agent.readonly) lines.push(\"readonly: true\");\n if (agent.background) lines.push(\"background: true\");\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(mdcOutput(`.cursor/agents/${toPrefixedId(agent.id)}.md`, fm, content));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.cursor/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.cursor/commands/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp) {\n results.push(output(\".cursor/mcp.json\", JSON.stringify({ mcpServers: mcp }, null, 2)));\n }\n\n const hookResults = await this.readHooks(ctx);\n for (const hook of hookResults) {\n const globs = hook.condition?.globs || [];\n const globLine =\n globs.length > 0\n ? `globs: [${globs.map((g: string) => `\"${g}\"`).join(\", \")}]`\n : \"alwaysApply: false\";\n const fm = `---\\ndescription: \"Hook: ${hook.description}\"\\n${globLine}\\n---`;\n const body = `# Hook: ${hook.id}\\n\\n**Event:** ${hook.event}\\n**Agent:** ${hook.agent}\\n\\n${hook.description}\\n\\nHATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered${globs.length > 0 ? ` for files matching ${globs.join(\", \")}` : \"\"}, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`;\n results.push(mdcOutput(`.cursor/rules/${toPrefixedId(`hook-${hook.id}`)}.mdc`, fm, body));\n }\n\n const bridgeFm = `---\ndescription: Bridge to canonical agent instructions and mandatory orchestration directives\nalwaysApply: true\n---`;\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const bridgeBody = `# Hatch3r Bridge\n\nThis project uses hatch3r for agentic coding setup.\nCanonical agent instructions live at \\`/.agents/AGENTS.md\\`.\n\n${bridgeOrchestration}\n\n## Cursor Subagent Configuration (v2.5+)\n\nCursor supports up to 4 subagents running in parallel. Custom subagents in \\`.cursor/agents/\\` support these frontmatter fields:\n- \\`model\\`: \\`fast\\`, \\`inherit\\`, or a specific model ID\n- \\`readonly\\`: \\`true\\` to restrict write permissions (verification/audit agents)\n- \\`background\\`: \\`true\\` to run without blocking the parent agent\n\nWhen delegating to hatch3r agents, explicitly request \"up to 4 in parallel\" for maximum throughput.\nBackground subagents write output to \\`~/.cursor/subagents/\\` for later inspection.\n\n## Cursor v2.6 Capabilities\n\nCursor v2.6 added MCP Apps (interactive UIs in agent chats) and Team Marketplaces for plugins.\nIf this project includes MCP servers that expose UI components, they will render inline as MCP Apps.\nPlugin configurations in \\`.cursor/mcp.json\\` are compatible with Team Marketplace distribution.\n\n## Getting Started with Cursor\n\nNew to this project's agent setup? Progress through these stages:\n\n**Start here:** Rules in \\`.cursor/rules/\\` are loaded automatically. The orchestration bridge above guides your workflow.\n**Next:** Use \\`/hatch3r-feature\\` or \\`/hatch3r-bug-fix\\` commands in Cursor chat for guided workflows.\n**Then:** Delegate to agents in \\`.cursor/agents/\\` — Cursor supports up to 4 subagents in parallel.\n**Later:** Customize agent behavior via \\`.hatch3r/{type}/{id}.customize.yaml\\` without editing managed files.`;\n results.push(mdcOutput(\".cursor/rules/hatch3r-bridge.mdc\", bridgeFm, bridgeBody));\n\n if (ctx.manifest.tools.includes(\"cursor\")) {\n const envConfig = {\n instructions: [\"Read /.agents/AGENTS.md for project instructions\"],\n mcpServers: {},\n };\n results.push(output(\".cursor/environment.json\", JSON.stringify(envConfig, null, 2) + \"\\n\"));\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\nimport { escapeTomlString } from \"./toml-utils.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nfunction mapToGeminiEvent(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"BeforeTool\",\n \"post-merge\": \"AfterTool\",\n \"ci-failure\": \"AfterAgent\",\n \"file-save\": \"AfterTool\",\n \"session-start\": \"SessionStart\",\n \"pre-push\": \"BeforeTool\",\n \"worktree-create\": \"AfterTool\",\n \"worktree-remove\": \"BeforeTool\",\n };\n return mapping[event] || event;\n}\n\nexport class GeminiAdapter extends BaseAdapter {\n readonly name = \"gemini\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx, \".agents/AGENTS.md\"),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx, (m) => ({\n text: `**Recommended model:** \\`${m}\\`. Set via \\`gemini --model ${m}\\` or select in Google AI Studio.`,\n after: true,\n })),\n ].join(\"\\n\");\n results.push(output(\"GEMINI.md\", wrapInManagedBlock(inner), inner));\n\n const settings: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n context: { fileName: [\"GEMINI.md\", \"AGENTS.md\"] },\n };\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n settings.mcpServers = entries;\n }\n }\n\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n const hooksObj: Record<string, Array<{ matcher: string; hooks: Array<{ type: string; command: string }> }>> = {};\n for (const hook of hooks) {\n const geminiEvent = mapToGeminiEvent(hook.event);\n if (!hooksObj[geminiEvent]) hooksObj[geminiEvent] = [];\n const matcher = hook.condition?.globs?.join(\"|\") || \".*\";\n hooksObj[geminiEvent].push({\n matcher,\n hooks: [{ type: \"command\", command: `echo \"HATCH3R_HOOK_ACTIVATED: Spawn the ${hook.agent} agent now. Follow the ${hook.agent} agent protocol in .gemini/agents/${toPrefixedId(hook.agent)}.md. Event: ${hook.event}. Hook ID: ${hook.id}.\"` }],\n });\n }\n settings.hooks = hooksObj;\n }\n\n results.push(output(\".gemini/settings.json\", JSON.stringify(settings, null, 2)));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.gemini/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n if (ctx.features.commands) {\n const commands = await readCanonicalFiles(ctx.agentsDir, \"commands\");\n for (const cmd of commands) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, cmd);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? cmd.description;\n const toml = [\n `description = \"${escapeTomlString(desc)}\"`,\n `prompt = \"${escapeTomlString(content)}\"`,\n ].join(\"\\n\");\n results.push(output(`.gemini/commands/${toPrefixedId(cmd.id)}.toml`, toml));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput, CanonicalFile } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext, type CleanMcpEntry } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization, applyCustomizationRaw } from \"./customization.js\";\nimport { stringify as yamlStringify } from \"yaml\";\n\n// Goose profile structure — represents a `.goose/profiles/{name}.yaml` file.\n// Goose reads profiles to configure agent behavior, extensions, and recipes.\ninterface GooseProfile {\n name: string;\n description: string;\n instructions: string;\n extensions?: GooseExtension[];\n recipes?: GooseRecipeRef[];\n /** ACP (Agent Communication Protocol) compatibility metadata. */\n acp?: GooseAcpConfig;\n}\n\ninterface GooseExtension {\n name: string;\n type: \"builtin\" | \"mcp\";\n config?: Record<string, unknown>;\n}\n\ninterface GooseRecipeRef {\n name: string;\n description: string;\n /** Steps map to hatch3r agent phases. */\n steps: GooseRecipeStep[];\n}\n\ninterface GooseRecipeStep {\n instruction: string;\n /** Optional agent reference — maps to a hatch3r canonical agent. */\n agent?: string;\n}\n\ninterface GooseAcpConfig {\n enabled: boolean;\n /** ACP protocol version supported by this configuration. */\n version: string;\n /** Agent capabilities advertised via ACP discovery. */\n capabilities: string[];\n}\n\nexport class GooseAdapter extends BaseAdapter {\n readonly name = \"goose\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const lines = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ];\n\n if (ctx.features.skills) {\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n lines.push(`## Skill: ${toPrefixedId(skill.id)}`, \"\", content, \"\");\n }\n }\n\n const inner = lines.join(\"\\n\");\n const results: AdapterOutput[] = [output(\".goosehints\", wrapInManagedBlock(inner), inner)];\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n const gooseMcp: Record<string, unknown> = {};\n for (const [name, entry] of Object.entries(entries)) {\n gooseMcp[name] = entry;\n }\n results.push(output(\".goose/mcp.json\", JSON.stringify(gooseMcp, null, 2)));\n }\n }\n\n // Generate Goose profile with recipe interoperability and ACP compatibility.\n const agents = ctx.features.agents\n ? await readCanonicalFiles(ctx.agentsDir, \"agents\")\n : [];\n const profile = await this.buildProfile(ctx, agents, mcp);\n const profileYaml = yamlStringify(profile);\n results.push(output(\".goose/profiles/hatch3r.yaml\", profileYaml));\n\n return results;\n }\n\n /** Build a Goose profile that maps hatch3r content to Goose's recipe system. */\n private async buildProfile(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n mcp: Record<string, CleanMcpEntry> | null,\n ): Promise<GooseProfile> {\n const extensions = this.buildExtensions(mcp);\n const recipe = await this.buildRecipe(ctx, agents);\n const capabilities = this.deriveAcpCapabilities(ctx, agents);\n\n return {\n name: \"hatch3r\",\n description: `hatch3r-managed Goose profile for ${ctx.manifest.project || ctx.manifest.repo}. Provides agent pipeline, recipe interoperability, and ACP compatibility.`,\n instructions: `Follow the canonical agent instructions at .agents/AGENTS.md. Use the hatch3r 4-phase pipeline: Research, Implement, Review, Quality.`,\n ...(extensions.length > 0 ? { extensions } : {}),\n recipes: [recipe],\n acp: {\n enabled: true,\n version: \"0.2\",\n capabilities,\n },\n };\n }\n\n /** Map MCP servers to Goose extensions. */\n private buildExtensions(\n mcp: Record<string, CleanMcpEntry> | null,\n ): GooseExtension[] {\n if (!mcp) return [];\n const extensions: GooseExtension[] = [];\n for (const [name, entry] of Object.entries(mcp)) {\n if (entry.command) {\n extensions.push({\n name,\n type: \"mcp\",\n config: {\n command: entry.command,\n args: entry.args || [],\n ...(entry.env && Object.keys(entry.env).length > 0 ? { env: entry.env } : {}),\n },\n });\n } else if (entry.url) {\n extensions.push({\n name,\n type: \"mcp\",\n config: { url: entry.url },\n });\n }\n }\n return extensions;\n }\n\n /** Build a Goose recipe from hatch3r's agent pipeline. */\n private async buildRecipe(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n ): Promise<GooseRecipeRef> {\n const steps: GooseRecipeStep[] = [];\n\n // Map hatch3r's 4-phase pipeline to Goose recipe steps.\n // Each step references a canonical agent when available.\n const phaseMap: Array<{ phase: string; agentPattern: string; fallback: string }> = [\n { phase: \"Research\", agentPattern: \"researcher\", fallback: \"Gather context from the codebase. Identify affected files, patterns, and conventions. Do not modify any files.\" },\n { phase: \"Implement\", agentPattern: \"implementer\", fallback: \"Implement the requested changes following project conventions. Require plan approval before making changes.\" },\n { phase: \"Review\", agentPattern: \"reviewer\", fallback: \"Review all changes for correctness, style, security, and adherence to project rules. Report findings as Critical/Warning/Info.\" },\n { phase: \"Quality\", agentPattern: \"test-writer\", fallback: \"Write or update tests for the implemented changes. Run the test suite and verify all tests pass.\" },\n ];\n\n for (const { phase, agentPattern, fallback } of phaseMap) {\n const matchingAgent = agents.find((a) =>\n a.id.includes(agentPattern),\n );\n if (matchingAgent) {\n const { skip, warnings } = await applyCustomization(ctx.projectRoot, matchingAgent);\n this.warnings.push(...warnings);\n if (!skip) {\n // Use the agent description as the step instruction,\n // or fall back to the default, truncated for recipe brevity.\n const instruction = matchingAgent.description || fallback;\n steps.push({\n instruction: `[${phase}] ${instruction}`,\n agent: toPrefixedId(matchingAgent.id),\n });\n continue;\n }\n }\n steps.push({ instruction: `[${phase}] ${fallback}` });\n }\n\n return {\n name: \"hatch3r-pipeline\",\n description: \"hatch3r 4-phase development pipeline: Research, Implement, Review, Quality.\",\n steps,\n };\n }\n\n /** Derive ACP capability advertisements from project configuration. */\n private deriveAcpCapabilities(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n ): string[] {\n const capabilities: string[] = [\n \"code-generation\",\n \"code-review\",\n ];\n\n if (agents.some((a) => a.id.includes(\"test\"))) {\n capabilities.push(\"test-generation\");\n }\n if (agents.some((a) => a.id.includes(\"security\"))) {\n capabilities.push(\"security-audit\");\n }\n if (agents.some((a) => a.id.includes(\"docs\"))) {\n capabilities.push(\"documentation\");\n }\n if (ctx.features.mcp) {\n capabilities.push(\"tool-use\");\n }\n\n return capabilities;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\n\nfunction steeringFrontmatter(globs?: string): string {\n if (!globs) return \"\";\n return `---\\ninclusion: fileMatch\\nfileMatchPattern: \"${globs}\"\\n---\\n\\n`;\n}\n\nexport class KiroAdapter extends BaseAdapter {\n readonly name = \"kiro\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n const lines = [...await this.bridgeHeader(ctx)];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n const desc = overrides.description ?? rule.description;\n\n if (scope && scope !== \"always\") {\n const globs = scope.includes(\"*\") ? scope : `${scope}/**`;\n const fm = steeringFrontmatter(globs);\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.kiro/steering/hatch3r-rule-${rule.id}.md`, `${fm}${wrapInManagedBlock(body)}`, body));\n } else {\n lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\n }\n }\n }\n\n lines.push(...await this.inlineAgents(ctx));\n const inner = lines.join(\"\\n\");\n results.push(output(\".kiro/steering/hatch3r-agents.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.kiro/steering/hatch3r-skill-${id}.md`),\n );\n\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n const hookLines: string[] = [\"# Hatch3r Hooks\", \"\"];\n for (const hook of hooks) {\n hookLines.push(`## ${hook.id}`, \"\");\n hookLines.push(`**Event:** ${hook.event}`);\n hookLines.push(`**Agent:** ${hook.agent}`);\n hookLines.push(`**Description:** ${hook.description}`);\n if (hook.condition?.globs) {\n hookLines.push(`**Globs:** ${hook.condition.globs.join(\", \")}`);\n }\n hookLines.push(\"\");\n hookLines.push(`HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`);\n hookLines.push(\"\");\n }\n const hookContent = hookLines.join(\"\\n\");\n results.push(output(\".kiro/steering/hatch3r-hooks.md\", wrapInManagedBlock(hookContent), hookContent));\n }\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".kiro/settings/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { resolveAgentModel, withProviderPrefix } from \"../models/resolve.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nexport class OpenCodeAdapter extends BaseAdapter {\n readonly name = \"opencode\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const instructions: string[] = [\".agents/AGENTS.md\"];\n if (ctx.features.rules) instructions.push(\".agents/rules/*.md\");\n if (ctx.features.agents) instructions.push(\".agents/agents/*.md\");\n if (ctx.features.skills) instructions.push(\".agents/skills/*/SKILL.md\");\n if (ctx.features.commands) instructions.push(\".agents/commands/*.md\");\n\n const opencodeConfig: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n $schema: \"https://opencode.ai/config.json\",\n instructions,\n };\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const mcpObj: Record<string, unknown> = {};\n for (const [name, server] of Object.entries(mcp)) {\n if (server.command) {\n const cmd = [server.command, ...(server.args || [])];\n mcpObj[name] = {\n type: \"local\",\n command: cmd,\n enabled: true,\n ...(server.env && Object.keys(server.env).length > 0 ? { environment: server.env } : {}),\n };\n } else if (server.url) {\n mcpObj[name] = { type: \"remote\", url: server.url, enabled: true };\n }\n }\n if (Object.keys(mcpObj).length > 0) {\n opencodeConfig.mcp = mcpObj;\n }\n }\n\n results.push(output(\"opencode.json\", JSON.stringify(opencodeConfig, null, 2)));\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`description: ${desc}`];\n if (model) lines.push(`model: ${withProviderPrefix(model)}`);\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(output(`.opencode/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n }\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.opencode/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.opencode/commands/${toPrefixedId(id)}.md`),\n );\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\n\nfunction isGlobPattern(scope: string): boolean {\n return scope.includes(\"*\") || scope.includes(\"?\") || scope.includes(\"[\");\n}\n\nfunction ruleTrigger(scope: string | undefined): \"always_on\" | \"glob_pattern\" | \"model_decision\" {\n if (!scope) return \"model_decision\";\n if (scope === \"always\") return \"always_on\";\n return \"glob_pattern\";\n}\n\nexport class WindsurfAdapter extends BaseAdapter {\n readonly name = \"windsurf\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const windsurfInner = [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n \"Full canonical agent instructions are at `/.agents/AGENTS.md`.\",\n \"Rules and skills are managed in `.windsurf/rules/` and `.windsurf/skills/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...await this.inlineAgents(ctx),\n \"\",\n \"## Getting Started with Windsurf\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.windsurf/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use commands in `.windsurf/workflows/` for guided workflows (e.g., feature development, bug fixes).\",\n \"**Then:** Use parallel Cascade sessions for independent tasks to maximize throughput.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ].join(\"\\n\");\n results.push(output(\".windsurfrules\", wrapInManagedBlock(windsurfInner), windsurfInner));\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n const trigger = ruleTrigger(scope);\n const globScope = (trigger === \"glob_pattern\" && scope)\n ? (isGlobPattern(scope) ? scope : `${scope}/**`)\n : undefined;\n const fm = `---\\ntrigger: ${trigger}${globScope ? `\\nglobs: \"${globScope}\"` : \"\"}\\n---`;\n const desc = overrides.description ?? rule.description;\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.windsurf/rules/${toPrefixedId(rule.id)}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.windsurf/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.windsurf/workflows/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".windsurf/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2) + \"\\n\"));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class ZedAdapter extends BaseAdapter {\n readonly name = \"zed\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n return [output(\".rules\", wrapInManagedBlock(inner), inner)];\n }\n}\n","import type { HatchManifest, Tool } from \"../types.js\";\nimport type { Adapter } from \"./base.js\";\nimport { AiderAdapter } from \"./aider.js\";\nimport { AmazonQAdapter } from \"./amazonq.js\";\nimport { AmpAdapter } from \"./amp.js\";\nimport { AntigravityAdapter } from \"./antigravity.js\";\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { ClineAdapter } from \"./cline.js\";\nimport { CodexAdapter } from \"./codex.js\";\nimport { CopilotAdapter } from \"./copilot.js\";\nimport { CursorAdapter } from \"./cursor.js\";\nimport { GeminiAdapter } from \"./gemini.js\";\nimport { GooseAdapter } from \"./goose.js\";\nimport { KiroAdapter } from \"./kiro.js\";\nimport { OpenCodeAdapter } from \"./opencode.js\";\nimport { WindsurfAdapter } from \"./windsurf.js\";\nimport { ZedAdapter } from \"./zed.js\";\n\nconst adapters: Record<Tool, Adapter> = {\n cursor: new CursorAdapter(),\n copilot: new CopilotAdapter(),\n claude: new ClaudeAdapter(),\n opencode: new OpenCodeAdapter(),\n windsurf: new WindsurfAdapter(),\n amp: new AmpAdapter(),\n codex: new CodexAdapter(),\n gemini: new GeminiAdapter(),\n cline: new ClineAdapter(),\n aider: new AiderAdapter(),\n kiro: new KiroAdapter(),\n goose: new GooseAdapter(),\n zed: new ZedAdapter(),\n \"amazon-q\": new AmazonQAdapter(),\n antigravity: new AntigravityAdapter(),\n};\n\nexport function getAdapter(tool: Tool): Adapter {\n const adapter = adapters[tool];\n if (!adapter) {\n throw new Error(`Unknown tool: ${tool}`);\n }\n return adapter;\n}\n\ninterface AdapterCapability {\n agents: boolean;\n skills: boolean;\n rules: boolean;\n hooks: boolean;\n mcp: boolean;\n commands: boolean;\n prompts: boolean;\n githubAgents: boolean;\n}\n\n// Adapter capability matrix — last updated for hatch3r v1.2.0.\n// Review this matrix when adding new adapters, removing adapters, or when\n// an existing tool gains/loses support for a feature (e.g. a tool ships\n// native hook support). Each row must match the adapter's doGenerate() output.\nconst ADAPTER_CAPABILITIES: Record<Tool, AdapterCapability> = {\n cursor: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n claude: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n gemini: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n cline: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n codex: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n \"amazon-q\": { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n copilot: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: true, githubAgents: true },\n opencode: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: false, githubAgents: false },\n windsurf: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: false, githubAgents: false },\n amp: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n kiro: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: false, prompts: false, githubAgents: false },\n aider: { agents: true, skills: true, rules: true, hooks: false, mcp: false, commands: false, prompts: false, githubAgents: false },\n goose: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n zed: { agents: true, skills: false, rules: true, hooks: false, mcp: false, commands: false, prompts: false, githubAgents: false },\n antigravity: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n};\n\nexport function getUnsupportedFeatureWarnings(tool: string, manifest: HatchManifest): string[] {\n const caps = ADAPTER_CAPABILITIES[tool as Tool];\n if (!caps) return [];\n\n const warnings: string[] = [];\n const featureLabels: Array<{ key: keyof AdapterCapability; label: string }> = [\n { key: \"agents\", label: \"agents\" },\n { key: \"skills\", label: \"skills\" },\n { key: \"rules\", label: \"rules\" },\n { key: \"hooks\", label: \"hooks\" },\n { key: \"mcp\", label: \"MCP\" },\n { key: \"commands\", label: \"commands\" },\n { key: \"prompts\", label: \"prompts\" },\n { key: \"githubAgents\", label: \"GitHub agents\" },\n ];\n\n for (const { key, label } of featureLabels) {\n if (manifest.features[key] && !caps[key]) {\n warnings.push(`${tool}: ${label} are enabled but not supported by this adapter`);\n }\n }\n return warnings;\n}\n\nexport { AiderAdapter } from \"./aider.js\";\nexport { AmazonQAdapter } from \"./amazonq.js\";\nexport { AmpAdapter } from \"./amp.js\";\nexport { AntigravityAdapter } from \"./antigravity.js\";\nexport { ClaudeAdapter } from \"./claude.js\";\nexport { ClineAdapter } from \"./cline.js\";\nexport { CodexAdapter } from \"./codex.js\";\nexport { CopilotAdapter } from \"./copilot.js\";\nexport { CursorAdapter } from \"./cursor.js\";\nexport { GeminiAdapter } from \"./gemini.js\";\nexport { GooseAdapter } from \"./goose.js\";\nexport { KiroAdapter } from \"./kiro.js\";\nexport { OpenCodeAdapter } from \"./opencode.js\";\nexport { WindsurfAdapter } from \"./windsurf.js\";\nexport { ZedAdapter } from \"./zed.js\";\nexport type { Adapter } from \"./base.js\";\nexport { readCanonicalFiles } from \"./canonical.js\";\nexport type { CanonicalType } from \"./canonical.js\";\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nexport function findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return startDir;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join, posix } from \"node:path\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\n/**\n * Integrity manifest for hatch3r canonical files.\n *\n * **Guarantees:**\n * - Detects unauthorized modifications to hatch3r-managed files (agents, rules, skills, commands, hooks, prompts).\n * - Detects missing or newly added files relative to the last `hatch3r init` or `hatch3r update`.\n * - Manifest-level checksum detects tampering with the integrity file itself.\n *\n * **Limitations:**\n * - Content-addressed only: detects WHAT changed, not WHO or WHEN.\n * - No signing: an attacker with write access can regenerate a valid manifest.\n * - Symlinks are excluded from scanning to prevent symlink-based bypass.\n * - Only scans `.md`, `.mdc`, and `.json` files in designated directories.\n */\nexport interface IntegrityManifest {\n version: number;\n generated: string;\n hatchVersion: string;\n files: Record<string, string>;\n checksum?: string;\n}\n\nexport interface VerifyResult {\n file: string;\n status: \"pass\" | \"modified\" | \"missing\" | \"new\" | \"tampered\";\n expected?: string;\n actual?: string;\n}\n\nconst INTEGRITY_FILE = \".integrity.json\";\nconst SCANNED_DIRS = [\"agents\", \"commands\", \"rules\", \"skills\", \"hooks\", \"prompts\", \"github-agents\", \"mcp\"];\n\nfunction sha256(content: string): string {\n return `sha256:${createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\")}`;\n}\n\nasync function collectFiles(dir: string, base: string): Promise<string[]> {\n const files: string[] = [];\n let entries: { name: string; isDirectory: () => boolean; isFile: () => boolean; isSymbolicLink: () => boolean }[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return files;\n throw err;\n }\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = join(dir, entry.name);\n const relPath = posix.join(base, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(fullPath, relPath)));\n } else if (entry.isFile() && (entry.name.endsWith(\".md\") || entry.name.endsWith(\".mdc\") || entry.name.endsWith(\".json\"))) {\n files.push(relPath);\n }\n }\n return files;\n}\n\nexport async function generateIntegrityManifest(\n agentsDir: string,\n hatchVersion: string,\n): Promise<IntegrityManifest> {\n const files: Record<string, string> = {};\n\n for (const dir of SCANNED_DIRS) {\n const dirPath = join(agentsDir, dir);\n const mdFiles = await collectFiles(dirPath, dir);\n for (const relPath of mdFiles) {\n const content = await readFile(join(agentsDir, relPath), \"utf-8\");\n files[relPath] = sha256(content);\n }\n }\n\n const checksum = createHash(\"sha256\")\n .update(JSON.stringify(files))\n .digest(\"hex\");\n\n return {\n version: 1,\n generated: new Date().toISOString(),\n hatchVersion,\n files,\n checksum,\n };\n}\n\nexport async function writeIntegrityManifest(\n agentsDir: string,\n manifest: IntegrityManifest,\n): Promise<void> {\n const filePath = join(agentsDir, INTEGRITY_FILE);\n await atomicWriteFile(filePath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nfunction validateIntegrityManifest(data: unknown): data is IntegrityManifest {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n if (typeof obj.version !== \"number\") return false;\n if (typeof obj.generated !== \"string\") return false;\n if (typeof obj.hatchVersion !== \"string\") return false;\n if (typeof obj.files !== \"object\" || obj.files === null) return false;\n for (const val of Object.values(obj.files as Record<string, unknown>)) {\n if (typeof val !== \"string\") return false;\n }\n if (\"checksum\" in obj && typeof obj.checksum !== \"string\") return false;\n return true;\n}\n\nexport async function readIntegrityManifest(\n agentsDir: string,\n): Promise<IntegrityManifest | null> {\n try {\n const raw = await readFile(join(agentsDir, INTEGRITY_FILE), \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n if (!validateIntegrityManifest(parsed)) return null;\n return parsed;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n if (err instanceof SyntaxError) return null;\n throw err;\n }\n}\n\nexport async function verifyIntegrity(\n agentsDir: string,\n): Promise<VerifyResult[]> {\n const manifest = await readIntegrityManifest(agentsDir);\n if (!manifest) {\n return [];\n }\n\n const results: VerifyResult[] = [];\n\n if (manifest.checksum !== undefined) {\n const expected = createHash(\"sha256\")\n .update(JSON.stringify(manifest.files))\n .digest(\"hex\");\n if (manifest.checksum !== expected) {\n results.push({ file: INTEGRITY_FILE, status: \"tampered\" });\n return results;\n }\n }\n const manifestFiles = new Set(Object.keys(manifest.files));\n\n for (const [filePath, expectedHash] of Object.entries(manifest.files)) {\n const fullPath = join(agentsDir, filePath);\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const actualHash = sha256(content);\n if (actualHash === expectedHash) {\n results.push({ file: filePath, status: \"pass\" });\n } else {\n results.push({\n file: filePath,\n status: \"modified\",\n expected: expectedHash,\n actual: actualHash,\n });\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n results.push({\n file: filePath,\n status: \"missing\",\n expected: expectedHash,\n });\n } else {\n throw err;\n }\n }\n }\n\n for (const dir of SCANNED_DIRS) {\n const dirPath = join(agentsDir, dir);\n const onDisk = await collectFiles(dirPath, dir);\n for (const filePath of onDisk) {\n if (!manifestFiles.has(filePath)) {\n const content = await readFile(join(agentsDir, filePath), \"utf-8\");\n results.push({\n file: filePath,\n status: \"new\",\n actual: sha256(content),\n });\n }\n }\n }\n\n results.sort((a, b) => a.file.localeCompare(b.file));\n return results;\n}\n","import { readFile, readdir, cp, mkdir, rm } from \"node:fs/promises\";\nimport { join, dirname, normalize, isAbsolute } from \"node:path\";\nimport { parseFrontmatter } from \"../adapters/canonical.js\";\nimport { HatchError } from \"../types.js\";\nimport type { ContentSelection } from \"../types.js\";\nimport type { ContentPreset } from \"./presets.js\";\n\nexport function assertSafePath(relativePath: string, label: string): void {\n // Strip null bytes before validation — prevents null byte injection bypasses\n const sanitized = relativePath.replace(/\\0/g, '');\n const normalized = normalize(sanitized);\n if (normalized.startsWith('..') || isAbsolute(normalized)) {\n throw new HatchError(`Unsafe path detected in ${label}: ${relativePath}`, 1);\n }\n if (sanitized !== relativePath) {\n throw new HatchError(`Unsafe path detected in ${label}: ${relativePath}`, 1);\n }\n}\n\n// ── Content Cross-References ───────────────────────────────────\n\n/**\n * Extract hatch3r content IDs referenced in markdown content.\n * Looks for backtick-quoted `hatch3r-{name}` patterns.\n */\nexport function extractContentReferences(content: string): string[] {\n const refs = new Set<string>();\n const pattern = /`(hatch3r-[a-z0-9-]+)`/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n refs.add(match[1]);\n }\n return [...refs];\n}\n\nexport interface CrossReferenceResult {\n warnings: string[];\n}\n\n/**\n * Validate cross-references between content items.\n * Parses markdown bodies for references to other content IDs and verifies\n * all referenced IDs exist in the index.\n */\nexport async function validateCrossReferences(\n contentRoot: string,\n index: ContentIndex,\n): Promise<CrossReferenceResult> {\n const warnings: string[] = [];\n const allIds = new Set(index.items.map((item) => item.id));\n\n for (const item of index.items) {\n let content: string;\n try {\n const filePath =\n item.type === \"skill\"\n ? join(contentRoot, item.relativePath, \"SKILL.md\")\n : join(contentRoot, `${item.relativePath}`);\n content = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n\n const refs = extractContentReferences(content);\n for (const ref of refs) {\n if (ref === item.id) continue; // self-reference is fine\n if (!allIds.has(ref)) {\n warnings.push(\n `${item.type} \"${item.id}\" references \"${ref}\" which does not exist in the content index`,\n );\n }\n }\n }\n\n return { warnings };\n}\n\n// Agents required by the orchestration pipeline (\"Always\" in Agent Roster)\nconst ORCHESTRATION_REQUIRED_AGENTS = [\n \"hatch3r-researcher\",\n \"hatch3r-implementer\",\n \"hatch3r-reviewer\",\n \"hatch3r-test-writer\",\n \"hatch3r-security-auditor\",\n];\n\n/**\n * Validate that a content selection includes all agents required by the\n * orchestration pipeline. Returns warnings for missing agents.\n */\nexport function validateOrchestrationDependencies(\n selection: ContentSelection,\n): string[] {\n const warnings: string[] = [];\n const selectedAgents = new Set(selection.items.agents);\n\n // Check if orchestration rule is selected\n const hasOrchestration = selection.items.rules.includes(\"hatch3r-agent-orchestration\");\n if (!hasOrchestration) return warnings;\n\n for (const agentId of ORCHESTRATION_REQUIRED_AGENTS) {\n if (!selectedAgents.has(agentId)) {\n warnings.push(\n `Orchestration pipeline requires agent \"${agentId}\" but it is not in the content selection. ` +\n `The 4-phase pipeline (Research → Implement → Review → Quality) will be incomplete.`,\n );\n }\n }\n\n return warnings;\n}\n\n// ── Types ──────────────────────────────────────────────────────\n\nexport interface CatalogItem {\n id: string;\n type: \"agent\" | \"skill\" | \"rule\" | \"command\" | \"prompt\" | \"hook\" | \"github-agent\";\n description: string;\n tags: string[];\n protected?: boolean;\n /** For glob-strategy: relative path from content root (e.g. \"agents/hatch3r-implementer.md\") */\n relativePath: string;\n /** For rules: companion .mdc file path, if it exists */\n companionPath?: string;\n}\n\nexport interface ContentCollision {\n id: string;\n kind: \"cross-type\" | \"same-type\";\n existingType: CatalogItem[\"type\"];\n existingPath: string;\n duplicateType: CatalogItem[\"type\"];\n duplicatePath: string;\n}\n\nexport interface ContentIndex {\n items: CatalogItem[];\n byType: Record<string, CatalogItem[]>;\n byId: Map<string, CatalogItem>;\n /** Structured records of ID collisions detected during indexing. */\n collisions: ContentCollision[];\n}\n\n// ── Content type configs ───────────────────────────────────────\n\ninterface ContentTypeConfig {\n dir: string;\n type: CatalogItem[\"type\"];\n strategy: \"glob\" | \"subdirectory\";\n}\n\nconst CONTENT_TYPE_CONFIGS: ContentTypeConfig[] = [\n { dir: \"agents\", type: \"agent\", strategy: \"glob\" },\n { dir: \"commands\", type: \"command\", strategy: \"glob\" },\n { dir: \"rules\", type: \"rule\", strategy: \"glob\" },\n { dir: \"skills\", type: \"skill\", strategy: \"subdirectory\" },\n { dir: \"prompts\", type: \"prompt\", strategy: \"glob\" },\n { dir: \"hooks\", type: \"hook\", strategy: \"glob\" },\n { dir: \"github-agents\", type: \"github-agent\", strategy: \"glob\" },\n];\n\n// ── Build content index ────────────────────────────────────────\n\n/**\n * Scan package content dirs, parse frontmatter, return indexed catalog.\n */\nexport async function buildContentIndex(contentRoot: string): Promise<ContentIndex> {\n const items: CatalogItem[] = [];\n\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(contentRoot, config.dir);\n\n if (config.strategy === \"subdirectory\") {\n // Skills: each subdirectory has a SKILL.md\n let dirents: { name: string; isDirectory: () => boolean }[];\n try {\n dirents = await readdir(dirPath, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const dirent of dirents) {\n if (!dirent.isDirectory()) continue;\n const skillPath = join(dirPath, dirent.name, \"SKILL.md\");\n try {\n const raw = await readFile(skillPath, \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const id = metadata.id || metadata.name || dirent.name;\n items.push({\n id,\n type: config.type,\n description: metadata.description ?? \"\",\n tags: metadata.tags ?? [],\n protected: metadata.protected,\n relativePath: join(config.dir, dirent.name),\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n } else {\n // Glob: read all .md files\n let entries: string[];\n try {\n const all = await readdir(dirPath);\n entries = all.filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const file of entries) {\n const filePath = join(dirPath, file);\n const raw = await readFile(filePath, \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const id = metadata.id || metadata.name || file.replace(/\\.md$/, \"\");\n\n const item: CatalogItem = {\n id,\n type: config.type,\n description: metadata.description ?? \"\",\n tags: metadata.tags ?? [],\n protected: metadata.protected,\n relativePath: join(config.dir, file),\n };\n\n // For rules, check for companion .mdc file\n if (config.type === \"rule\") {\n const mdcFile = file.replace(/\\.md$/, \".mdc\");\n try {\n await readFile(join(dirPath, mdcFile), \"utf-8\");\n item.companionPath = join(config.dir, mdcFile);\n } catch {\n // No companion file\n }\n }\n\n items.push(item);\n }\n }\n }\n\n // Build indexes\n const byType: Record<string, CatalogItem[]> = {};\n const byId = new Map<string, CatalogItem>();\n const collisions: ContentCollision[] = [];\n\n for (const item of items) {\n if (!byType[item.type]) byType[item.type] = [];\n byType[item.type].push(item);\n const existing = byId.get(item.id);\n if (existing) {\n const kind: ContentCollision[\"kind\"] = existing.type !== item.type ? \"cross-type\" : \"same-type\";\n collisions.push({\n id: item.id,\n kind,\n existingType: existing.type,\n existingPath: existing.relativePath,\n duplicateType: item.type,\n duplicatePath: item.relativePath,\n });\n if (kind === \"cross-type\") {\n console.warn(\n `[hatch3r] Content ID collision: \"${item.id}\" exists as both ${existing.type} (${existing.relativePath}) and ${item.type} (${item.relativePath}). The ${item.type} entry will shadow the ${existing.type} entry in ID lookups.`,\n );\n } else {\n console.warn(\n `[hatch3r] Duplicate content ID: \"${item.id}\" found in ${existing.relativePath} and ${item.relativePath}. The later entry will shadow the earlier one in ID lookups.`,\n );\n }\n }\n byId.set(item.id, item);\n }\n\n return { items, byType, byId, collisions };\n}\n\n// ── Shared type-to-key mapping ──────────────────────────────────\n\nexport const TYPE_TO_SELECTION_KEY: Record<string, keyof ContentSelection[\"items\"]> = {\n agent: \"agents\",\n skill: \"skills\",\n rule: \"rules\",\n command: \"commands\",\n prompt: \"prompts\",\n hook: \"hooks\",\n \"github-agent\": \"githubAgents\",\n};\n\n// ── Selection resolution ───────────────────────────────────────\n\n/**\n * Apply preset + context filters to determine which IDs to include.\n *\n * Filtering logic:\n * 1. Start with all items from the index\n * 2. If preset has includeTags, keep only items matching ANY of those tags\n * 3. If preset has excludeTags, remove items matching ANY of those tags\n * 4. If projectType is \"greenfield\", remove items tagged ONLY with \"brownfield\"\n * 5. If projectType is \"brownfield\", remove items tagged ONLY with \"greenfield\"\n * 6. If teamSize is \"solo\", remove items whose ONLY tags are \"team\" / \"board\"\n * 7. Items with protected: true are always included\n * 8. For \"custom\" preset, use customSelections as explicit ID list\n */\nexport function resolveSelection(\n preset: ContentPreset,\n projectType: \"greenfield\" | \"brownfield\",\n teamSize: \"solo\" | \"team\",\n index: ContentIndex,\n customSelections?: string[],\n): ContentSelection {\n let selected: CatalogItem[];\n\n if (preset.id === \"custom\" && customSelections) {\n // For custom, use explicit ID list\n const customSet = new Set(customSelections);\n selected = index.items.filter(\n (item) => customSet.has(item.id) || item.protected,\n );\n } else {\n selected = [...index.items];\n\n // Apply includeTags filter (if non-empty, keep only items matching ANY tag)\n if (preset.includeTags.length > 0) {\n const includeSet = new Set<string>(preset.includeTags);\n selected = selected.filter(\n (item) =>\n item.protected ||\n item.tags.length === 0 || // items without tags pass through\n item.tags.some((t) => includeSet.has(t)),\n );\n }\n\n // Apply excludeTags filter\n if (preset.excludeTags.length > 0) {\n const excludeSet = new Set<string>(preset.excludeTags);\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.every((t) => excludeSet.has(t)),\n );\n }\n\n // Context filtering: project type\n if (projectType === \"greenfield\") {\n // Remove items tagged ONLY with \"brownfield\"\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.includes(\"brownfield\") ||\n item.tags.some((t) => t !== \"brownfield\" && t !== \"team\" && t !== \"solo\"),\n );\n } else {\n // Remove items tagged ONLY with \"greenfield\"\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.includes(\"greenfield\") ||\n item.tags.some((t) => t !== \"greenfield\" && t !== \"team\" && t !== \"solo\"),\n );\n }\n\n // Context filtering: team size\n if (teamSize === \"solo\") {\n // Remove items whose tags are exclusively team/board (no other workflow/domain tags)\n selected = selected.filter((item) => {\n if (item.protected) return true;\n if (!item.tags.includes(\"team\") && !item.tags.includes(\"board\")) return true;\n // Has team/board tag — keep if it has other non-context tags too\n return item.tags.some(\n (t) => t !== \"team\" && t !== \"board\" && t !== \"solo\" && t !== \"greenfield\" && t !== \"brownfield\",\n );\n });\n }\n }\n\n // Build the selection items grouped by type\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const item of selected) {\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) items[key].push(item.id);\n }\n\n return {\n preset: preset.id,\n projectType,\n teamSize,\n items,\n };\n}\n\n// ── Exclusion counting ─────────────────────────────────────────\n\n/**\n * Count how many items a preset would exclude relative to the full item set.\n */\nexport function countPresetExclusions(\n preset: ContentPreset,\n index: ContentIndex,\n): number {\n if (preset.id === \"custom\") return 0;\n if (preset.id === \"full\") return 0;\n\n let count = 0;\n for (const item of index.items) {\n if (item.protected) continue;\n // includeTags filter\n if (preset.includeTags.length > 0) {\n const includeSet = new Set<string>(preset.includeTags);\n if (item.tags.length > 0 && !item.tags.some((t) => includeSet.has(t))) {\n count++;\n continue;\n }\n }\n // excludeTags filter\n if (preset.excludeTags.length > 0) {\n const excludeSet = new Set<string>(preset.excludeTags);\n if (item.tags.every((t) => excludeSet.has(t))) {\n count++;\n }\n }\n }\n return count;\n}\n\n/**\n * Count how many items the project type filter would remove from a pre-filtered set.\n */\nexport function countProjectTypeExclusions(\n projectType: \"greenfield\" | \"brownfield\",\n items: CatalogItem[],\n): number {\n const opposite = projectType === \"greenfield\" ? \"brownfield\" : \"greenfield\";\n let count = 0;\n for (const item of items) {\n if (item.protected) continue;\n if (\n item.tags.includes(opposite) &&\n !item.tags.some((t) => t !== opposite && t !== \"team\" && t !== \"solo\")\n ) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Count how many items the team size filter would remove from a pre-filtered set.\n */\nexport function countTeamSizeExclusions(\n teamSize: \"solo\" | \"team\",\n items: CatalogItem[],\n): number {\n if (teamSize !== \"solo\") return 0;\n let count = 0;\n for (const item of items) {\n if (item.protected) continue;\n if (!item.tags.includes(\"team\") && !item.tags.includes(\"board\")) continue;\n const hasOther = item.tags.some(\n (t) => t !== \"team\" && t !== \"board\" && t !== \"solo\" && t !== \"greenfield\" && t !== \"brownfield\",\n );\n if (!hasOther) count++;\n }\n return count;\n}\n\n// ── Copy selected content ──────────────────────────────────────\n\n/**\n * Copy only selected content files from package to .agents/.\n * Returns list of relative paths copied.\n */\nexport async function copySelectedContent(\n contentRoot: string,\n agentsDir: string,\n selection: ContentSelection,\n index: ContentIndex,\n): Promise<string[]> {\n const copied: string[] = [];\n\n // Collect all selected IDs\n const selectedIds = new Set<string>();\n for (const ids of Object.values(selection.items)) {\n for (const id of ids) selectedIds.add(id);\n }\n\n for (const item of index.items) {\n if (!selectedIds.has(item.id)) continue;\n\n assertSafePath(item.relativePath, \"copySelectedContent\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"copySelectedContent companion\");\n }\n\n const srcPath = join(contentRoot, item.relativePath);\n const destPath = join(agentsDir, item.relativePath);\n\n if (item.type === \"skill\") {\n // Copy entire skill subdirectory\n await mkdir(destPath, { recursive: true });\n await cp(srcPath, destPath, { recursive: true, force: true });\n copied.push(item.relativePath);\n } else {\n // Copy individual .md file\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n copied.push(item.relativePath);\n\n // Copy companion .mdc file if it exists (rules)\n if (item.companionPath) {\n const mdcSrc = join(contentRoot, item.companionPath);\n const mdcDest = join(agentsDir, item.companionPath);\n try {\n await cp(mdcSrc, mdcDest, { force: true });\n copied.push(item.companionPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n }\n\n // Always copy support subdirectories (non-hatch3r-prefixed dirs inside glob-strategy content types)\n // These are shared/companion files referenced by agents and commands (e.g. agents/shared/, agents/modes/, commands/board/)\n for (const config of CONTENT_TYPE_CONFIGS) {\n if (config.strategy !== \"glob\") continue;\n try {\n const dirEntries = await readdir(join(contentRoot, config.dir), { withFileTypes: true });\n for (const entry of dirEntries) {\n if (!entry.isDirectory() || entry.name.startsWith(\"hatch3r-\")) continue;\n const subSrc = join(contentRoot, config.dir, entry.name);\n const subDest = join(agentsDir, config.dir, entry.name);\n await mkdir(subDest, { recursive: true });\n await cp(subSrc, subDest, { recursive: true, force: true });\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n\n // Always copy checks/ (referenced by agents, small)\n try {\n const checksSrc = join(contentRoot, \"checks\");\n const checksDest = join(agentsDir, \"checks\");\n await mkdir(checksDest, { recursive: true });\n await cp(checksSrc, checksDest, { recursive: true, force: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n // Always copy mcp/ (handled separately by init for filtering)\n try {\n const mcpSrc = join(contentRoot, \"mcp\");\n const mcpDest = join(agentsDir, \"mcp\");\n await mkdir(mcpDest, { recursive: true });\n await cp(mcpSrc, mcpDest, { recursive: true, force: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n return copied;\n}\n\n// ── Available items ────────────────────────────────────────────\n\n/**\n * Get items available in package but not currently installed on disk.\n */\nexport async function getAvailableItems(\n contentRoot: string,\n agentsDir: string,\n index: ContentIndex,\n): Promise<CatalogItem[]> {\n const installed = new Set<string>();\n\n // Scan what's on disk\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(agentsDir, config.dir);\n\n if (config.strategy === \"subdirectory\") {\n try {\n const dirents = await readdir(dirPath, { withFileTypes: true });\n for (const d of dirents) {\n if (d.isDirectory()) {\n try {\n const raw = await readFile(join(dirPath, d.name, \"SKILL.md\"), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n installed.add(metadata.id || metadata.name || d.name);\n } catch {\n // skip\n }\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else {\n try {\n const files = await readdir(dirPath);\n for (const f of files.filter((f) => f.endsWith(\".md\"))) {\n const raw = await readFile(join(dirPath, f), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n installed.add(metadata.id || metadata.name || f.replace(/\\.md$/, \"\"));\n }\n } catch {\n // directory doesn't exist\n }\n }\n }\n\n return index.items.filter((item) => !installed.has(item.id));\n}\n\n// ── Build selections from disk ─────────────────────────────────\n\n/**\n * Scan .agents/ to build a ContentSelection from what's on disk.\n * Used for legacy migration — converts \"everything installed\" to explicit tracking.\n */\nexport async function buildSelectionsFromDisk(\n agentsDir: string,\n): Promise<ContentSelection> {\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(agentsDir, config.dir);\n const key = TYPE_TO_SELECTION_KEY[config.type];\n if (!key) continue;\n\n if (config.strategy === \"subdirectory\") {\n try {\n const dirents = await readdir(dirPath, { withFileTypes: true });\n for (const d of dirents) {\n if (!d.isDirectory()) continue;\n try {\n const raw = await readFile(join(dirPath, d.name, \"SKILL.md\"), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n items[key].push(metadata.id || metadata.name || d.name);\n } catch {\n // skip\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else {\n try {\n const files = await readdir(dirPath);\n for (const f of files.filter((f) => f.endsWith(\".md\"))) {\n const raw = await readFile(join(dirPath, f), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n items[key].push(metadata.id || metadata.name || f.replace(/\\.md$/, \"\"));\n }\n } catch {\n // directory doesn't exist\n }\n }\n }\n\n return {\n preset: \"full\",\n projectType: \"brownfield\",\n teamSize: \"team\",\n items,\n };\n}\n\n// ── Content item add/remove ────────────────────────────────────\n\n/**\n * Add a single content item from the package to .agents/.\n */\nexport async function addContentItem(\n contentRoot: string,\n agentsDir: string,\n item: CatalogItem,\n): Promise<void> {\n assertSafePath(item.relativePath, \"addContentItem\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"addContentItem companion\");\n }\n\n const srcPath = join(contentRoot, item.relativePath);\n const destPath = join(agentsDir, item.relativePath);\n\n try {\n if (item.type === \"skill\") {\n await mkdir(destPath, { recursive: true });\n await cp(srcPath, destPath, { recursive: true, force: true });\n } else {\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n\n if (item.companionPath) {\n try {\n await cp(\n join(contentRoot, item.companionPath),\n join(agentsDir, item.companionPath),\n { force: true },\n );\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new HatchError(\n `Content \"${item.id}\" (${item.type}) not found in package at ${item.relativePath}. ` +\n `It may have been renamed or removed in this hatch3r version.`,\n 1,\n );\n }\n throw err;\n }\n}\n\n/**\n * Remove a single content item from .agents/ and optionally clean up customization files.\n */\nexport async function removeContentItem(\n agentsDir: string,\n item: CatalogItem,\n options?: { rootDir?: string },\n): Promise<void> {\n assertSafePath(item.relativePath, \"removeContentItem\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"removeContentItem companion\");\n }\n\n const destPath = join(agentsDir, item.relativePath);\n\n if (item.type === \"skill\") {\n await rm(destPath, { recursive: true, force: true });\n } else {\n await rm(destPath, { force: true });\n\n if (item.companionPath) {\n await rm(join(agentsDir, item.companionPath), { force: true });\n }\n }\n\n // Clean up customize files if rootDir provided\n if (options?.rootDir) {\n const typeToDir: Record<string, string> = {\n agent: \"agents\",\n skill: \"skills\",\n rule: \"rules\",\n command: \"commands\",\n };\n const customDir = typeToDir[item.type];\n if (customDir) {\n const yamlPath = join(options.rootDir, \".hatch3r\", customDir, `${item.id}.customize.yaml`);\n const mdPath = join(options.rootDir, \".hatch3r\", customDir, `${item.id}.customize.md`);\n await rm(yamlPath, { force: true });\n await rm(mdPath, { force: true });\n }\n }\n}\n\n/**\n * Get all content IDs from a ContentSelection as a flat Set.\n */\nexport function getAllContentIds(selection: ContentSelection): Set<string> {\n const ids = new Set<string>();\n for (const arr of Object.values(selection.items)) {\n for (const id of arr) ids.add(id);\n }\n return ids;\n}\n\n/**\n * Estimate the item count a preset would yield for a given project type and team size.\n * Used to show expected item counts in the profile selector prompt (#147 D19-18).\n */\nexport function estimatePresetItemCount(\n preset: ContentPreset,\n projectType: \"greenfield\" | \"brownfield\",\n teamSize: \"solo\" | \"team\",\n index: ContentIndex,\n): number {\n const selection = resolveSelection(preset, projectType, teamSize, index);\n return Object.values(selection.items).reduce((sum, arr) => sum + arr.length, 0);\n}\n\n/**\n * Get total count of selected items.\n */\nexport function countSelectionItems(selection: ContentSelection): number {\n return Object.values(selection.items).reduce((sum, arr) => sum + arr.length, 0);\n}\n\n/**\n * Get a summary string of selection items by type.\n */\nexport function selectionSummary(selection: ContentSelection): string {\n const parts: string[] = [];\n const { items } = selection;\n if (items.agents.length > 0) parts.push(`${items.agents.length} agents`);\n if (items.skills.length > 0) parts.push(`${items.skills.length} skills`);\n if (items.rules.length > 0) parts.push(`${items.rules.length} rules`);\n if (items.commands.length > 0) parts.push(`${items.commands.length} commands`);\n if (items.prompts.length > 0) parts.push(`${items.prompts.length} prompts`);\n if (items.hooks.length > 0) parts.push(`${items.hooks.length} hooks`);\n if (items.githubAgents.length > 0) parts.push(`${items.githubAgents.length} github-agents`);\n return parts.join(\", \");\n}\n","import { access, cp, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join, sep } from \"node:path\";\nimport type { HatchManifest, Tool } from \"../types.js\";\nimport { HATCH3R_PREFIX, sanitizeId } from \"../types.js\";\nimport { extractCustomContent, hasManagedBlock } from \"../merge/managedBlocks.js\";\nimport type { CustomizableType } from \"../models/customize.js\";\n\nfunction toPosixPath(p: string): string {\n return sep === \"\\\\\" ? p.replaceAll(\"\\\\\", \"/\") : p;\n}\n\nconst ARCHIVE_DIR = \".hatch3r-archive\";\n\nexport interface MigrationNotice {\n from: string;\n to: string;\n type: string;\n id: string;\n}\n\ninterface ParsedOutputPath {\n type: CustomizableType;\n id: string;\n}\n\nconst TOOL_PATH_PREFIXES: Record<Tool, string[]> = {\n cursor: [\".cursor/\"],\n claude: [\".claude/\", \"CLAUDE.md\", \".mcp.json\"],\n copilot: [\".github/copilot-instructions.md\", \".github/workflows/copilot-setup-steps.yml\", \".vscode/mcp.json\"],\n windsurf: [\".windsurf/\", \".windsurfrules\"],\n amp: [\".amp/\"],\n codex: [\".codex/\"],\n gemini: [\".gemini/\", \"GEMINI.md\"],\n cline: [\".roo/\", \".roomodes\"],\n aider: [\"CONVENTIONS.md\", \".aider.conf.yml\"],\n kiro: [\".kiro/\"],\n opencode: [\"opencode.json\"],\n goose: [\".goosehints\"],\n zed: [\".rules\"],\n \"amazon-q\": [\".amazonq/\"],\n antigravity: [\".antigravity/\"],\n};\n\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: CustomizableType }> = [\n { pattern: /\\/rules\\/([^/]+)\\.(mdc|md)$/, type: \"rules\" },\n { pattern: /\\/agents\\/([^/]+)\\.md$/, type: \"agents\" },\n { pattern: /\\/skills\\/([^/]+)\\/SKILL\\.md$/, type: \"skills\" },\n { pattern: /\\/commands\\/([^/]+)\\.md$/, type: \"commands\" },\n];\n\nfunction parseOutputPath(filePath: string): ParsedOutputPath | null {\n for (const { pattern, type } of PATH_PATTERNS) {\n const match = filePath.match(pattern);\n if (match) {\n let id = match[1];\n if (id.startsWith(HATCH3R_PREFIX)) {\n id = id.slice(HATCH3R_PREFIX.length);\n }\n id = sanitizeId(id);\n if (id.length > 0) return { type, id };\n }\n }\n return null;\n}\n\nfunction stripFrontmatter(content: string): string {\n const trimmed = content.trimStart();\n if (trimmed.startsWith(\"---\")) {\n const endIdx = trimmed.indexOf(\"\\n---\", 3);\n if (endIdx !== -1) {\n return trimmed.slice(endIdx + 4).trim();\n }\n }\n return content.trim();\n}\n\nfunction fileMatchesTool(filePath: string, tool: Tool): boolean {\n const prefixes = TOOL_PATH_PREFIXES[tool];\n if (!prefixes) return false;\n return prefixes.some((prefix) =>\n prefix.endsWith(\"/\") ? filePath.startsWith(prefix) : filePath === prefix,\n );\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function collectToolFiles(rootDir: string, tool: Tool): Promise<string[]> {\n const prefixes = TOOL_PATH_PREFIXES[tool];\n if (!prefixes) return [];\n\n const files: string[] = [];\n\n for (const prefix of prefixes) {\n const absPath = join(rootDir, prefix);\n if (prefix.endsWith(\"/\")) {\n try {\n const entries = await readdir(absPath, { recursive: true, withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile()) {\n const parent = entry.parentPath ?? (entry as unknown as { path: string }).path ?? absPath;\n const relPath = toPosixPath(join(prefix, parent.slice(absPath.length), entry.name));\n files.push(relPath);\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else if (await fileExists(absPath)) {\n files.push(prefix);\n }\n }\n\n return files;\n}\n\nexport async function archiveToolOutputs(\n rootDir: string,\n tool: Tool,\n): Promise<{ archivedFiles: string[]; migrations: MigrationNotice[] }> {\n const filesToArchive = await collectToolFiles(rootDir, tool);\n if (filesToArchive.length === 0) {\n return { archivedFiles: [], migrations: [] };\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const archiveBase = join(rootDir, ARCHIVE_DIR, tool, timestamp);\n\n const archivedFiles: string[] = [];\n const migrations: MigrationNotice[] = [];\n\n for (const relPath of filesToArchive) {\n const absPath = join(rootDir, relPath);\n if (!(await fileExists(absPath))) continue;\n\n let content: string;\n try {\n content = await readFile(absPath, \"utf-8\");\n } catch {\n continue;\n }\n\n if (hasManagedBlock(content)) {\n const customContent = stripFrontmatter(extractCustomContent(content));\n if (customContent.length > 0) {\n const parsed = parseOutputPath(relPath);\n if (parsed) {\n const customizePath = join(rootDir, \".hatch3r\", parsed.type, `${parsed.id}.customize.md`);\n if (!(await fileExists(customizePath))) {\n await mkdir(dirname(customizePath), { recursive: true });\n await writeFile(customizePath, customContent + \"\\n\", \"utf-8\");\n migrations.push({\n from: relPath,\n to: `.hatch3r/${parsed.type}/${parsed.id}.customize.md`,\n type: parsed.type,\n id: parsed.id,\n });\n }\n }\n }\n }\n\n const archiveDest = join(archiveBase, relPath);\n await mkdir(dirname(archiveDest), { recursive: true });\n await cp(absPath, archiveDest);\n // Verify the copy succeeded before removing the original\n const srcStat = await stat(absPath);\n const destStat = await stat(archiveDest);\n if (destStat.size !== srcStat.size) {\n throw new Error(`Archive copy size mismatch for ${relPath}: source=${srcStat.size}, dest=${destStat.size}`);\n }\n await rm(absPath);\n archivedFiles.push(relPath);\n }\n\n await cleanEmptyDirs(rootDir, filesToArchive);\n\n return { archivedFiles, migrations };\n}\n\nasync function cleanEmptyDirs(rootDir: string, paths: string[]): Promise<void> {\n const dirs = new Set<string>();\n for (const p of paths) {\n let dir = dirname(join(rootDir, p));\n while (dir !== rootDir && dir.length > rootDir.length) {\n dirs.add(dir);\n dir = dirname(dir);\n }\n }\n\n const sorted = [...dirs].sort((a, b) => b.length - a.length);\n for (const dir of sorted) {\n try {\n const entries = await readdir(dir);\n if (entries.length === 0) {\n await rm(dir, { recursive: true });\n }\n } catch {\n // directory may not exist or already removed\n }\n }\n}\n\nexport function removeManagedFilesForPaths(\n manifest: HatchManifest,\n paths: string[],\n): void {\n const pathSet = new Set(paths);\n manifest.managedFiles = manifest.managedFiles.filter((f) => !pathSet.has(f));\n}\n\nexport function getManagedFilesForTool(\n manifest: HatchManifest,\n tool: Tool,\n): string[] {\n return manifest.managedFiles.filter((f) => fileMatchesTool(f, tool));\n}\n\nconst MAX_ARCHIVE_ENTRIES = 5;\n\n/**\n * Prune old archive entries, keeping only the most recent MAX_ARCHIVE_ENTRIES per tool.\n */\nexport async function pruneArchives(rootDir: string): Promise<string[]> {\n const archiveRoot = join(rootDir, ARCHIVE_DIR);\n const pruned: string[] = [];\n\n let toolDirs: string[];\n try {\n toolDirs = await readdir(archiveRoot);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n for (const toolDir of toolDirs) {\n const toolPath = join(archiveRoot, toolDir);\n let entries: string[];\n try {\n const s = await stat(toolPath);\n if (!s.isDirectory()) continue;\n entries = await readdir(toolPath);\n } catch {\n continue;\n }\n\n // Sort descending (newest first) — timestamps are ISO-formatted\n entries.sort((a, b) => b.localeCompare(a));\n\n for (const entry of entries.slice(MAX_ARCHIVE_ENTRIES)) {\n const entryPath = join(toolPath, entry);\n await rm(entryPath, { recursive: true, force: true });\n pruned.push(`${toolDir}/${entry}`);\n }\n }\n\n return pruned;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AGENTS_DIR, HatchError } from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\nimport type { WorkspaceManifest } from \"./types.js\";\nimport { WORKSPACE_MANIFEST_FILE, WORKSPACE_MANIFEST_VERSION } from \"./types.js\";\n\nfunction validateWorkspaceManifest(data: unknown): data is WorkspaceManifest {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.version !== \"string\") return false;\n if (typeof obj.hatch3rVersion !== \"string\") return false;\n if (typeof obj.name !== \"string\") return false;\n if (!Array.isArray(obj.repos)) return false;\n if (typeof obj.syncStrategy !== \"string\") return false;\n if (![\"manual\", \"on-sync\"].includes(obj.syncStrategy)) return false;\n\n if (!obj.defaults || typeof obj.defaults !== \"object\") return false;\n const defaults = obj.defaults as Record<string, unknown>;\n if (!Array.isArray(defaults.tools)) return false;\n if (!defaults.features || typeof defaults.features !== \"object\") return false;\n if (!defaults.mcp || typeof defaults.mcp !== \"object\") return false;\n\n // Validate MCP servers array\n const mcp = defaults.mcp as Record<string, unknown>;\n if (!Array.isArray(mcp.servers)) return false;\n\n // Validate content selection if present\n if (defaults.content !== undefined) {\n if (typeof defaults.content !== \"object\" || defaults.content === null) return false;\n const content = defaults.content as Record<string, unknown>;\n if (typeof content.preset !== \"string\") return false;\n if (typeof content.projectType !== \"string\") return false;\n if (typeof content.teamSize !== \"string\") return false;\n if (!content.items || typeof content.items !== \"object\") return false;\n }\n\n for (const repo of obj.repos as unknown[]) {\n if (!repo || typeof repo !== \"object\") return false;\n const r = repo as Record<string, unknown>;\n if (typeof r.path !== \"string\") return false;\n if (typeof r.sync !== \"boolean\") return false;\n if (r.owner !== undefined && typeof r.owner !== \"string\") return false;\n if (r.repo !== undefined && typeof r.repo !== \"string\") return false;\n if (r.defaultBranch !== undefined && typeof r.defaultBranch !== \"string\") return false;\n if (r.platform !== undefined && typeof r.platform !== \"string\") return false;\n }\n\n return true;\n}\n\nexport async function readWorkspaceManifest(\n rootDir: string,\n): Promise<WorkspaceManifest | null> {\n const manifestPath = join(rootDir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE);\n\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err: unknown) {\n throw new HatchError(\n `Malformed JSON in ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,\n 1,\n );\n }\n\n if (!validateWorkspaceManifest(parsed)) {\n throw new HatchError(\n `Invalid workspace manifest in ${manifestPath}: required fields missing or malformed.`,\n 1,\n );\n }\n\n return parsed;\n}\n\nexport async function writeWorkspaceManifest(\n rootDir: string,\n manifest: WorkspaceManifest,\n): Promise<void> {\n const manifestPath = join(rootDir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE);\n await atomicWriteFile(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nexport function createWorkspaceManifest(\n name: string,\n defaults: WorkspaceManifest[\"defaults\"],\n repos: WorkspaceManifest[\"repos\"],\n syncStrategy: WorkspaceManifest[\"syncStrategy\"] = \"manual\",\n): WorkspaceManifest {\n return {\n version: WORKSPACE_MANIFEST_VERSION,\n hatch3rVersion: HATCH3R_VERSION,\n name,\n repos,\n defaults,\n syncStrategy,\n };\n}\n","import type { ContentSelection, Features, McpConfig, ModelConfig, Platform, Tool } from \"../types.js\";\n\n// ── Workspace Manifest ──────────────────────────────────────────\n\nexport interface WorkspaceManifest {\n /** Workspace manifest schema version. */\n version: string;\n /** hatch3r version that created/last updated this workspace. */\n hatch3rVersion: string;\n /** Workspace display name. */\n name: string;\n /** Registered sub-repos. */\n repos: WorkspaceRepoEntry[];\n /** Default settings inherited by all sub-repos. */\n defaults: WorkspaceDefaults;\n /** When sub-repos are synced: \"manual\" or \"on-sync\" (cascade from hatch3r sync). */\n syncStrategy: \"manual\" | \"on-sync\";\n}\n\nexport interface WorkspaceDefaults {\n platform?: Platform;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n content: ContentSelection;\n models?: ModelConfig;\n}\n\n// ── Repo Entries ────────────────────────────────────────────────\n\nexport interface WorkspaceRepoEntry {\n /** Relative path from workspace root (e.g. \"api-service\"). */\n path: string;\n /** Display name (defaults to directory name). */\n name?: string;\n /** Whether workspace sync propagates content to this repo. */\n sync: boolean;\n /** Per-repo overrides merged on top of workspace defaults. */\n overrides?: WorkspaceRepoOverrides;\n /** ISO timestamp of last successful sync. */\n lastSync?: string;\n /** Git remote owner (org/user). Auto-detected from sub-repo remote. */\n owner?: string;\n /** Git remote repository name. Auto-detected from sub-repo remote. */\n repo?: string;\n /** Default branch for this repo. Auto-detected from sub-repo. */\n defaultBranch?: string;\n /** Platform for this repo. Auto-detected from remote URL. */\n platform?: Platform;\n}\n\nexport interface WorkspaceRepoOverrides {\n /** Replaces workspace tools entirely. */\n tools?: Tool[];\n /** Partial merge on top of workspace features. */\n features?: Partial<Features>;\n /** Replaces workspace MCP config entirely. */\n mcp?: McpConfig;\n /** Add or remove content IDs relative to workspace selection. */\n contentOverrides?: {\n /** Content IDs to add beyond workspace selection. */\n include?: string[];\n /** Content IDs to remove from workspace selection. */\n exclude?: string[];\n };\n models?: ModelConfig;\n platform?: Platform;\n}\n\n// ── Sync Results ────────────────────────────────────────────────\n\nexport interface WorkspaceSyncResult {\n repos: WorkspaceRepoSyncResult[];\n}\n\nexport interface WorkspaceRepoSyncResult {\n path: string;\n added: string[];\n removed: string[];\n toolsSynced: string[];\n action: \"synced\" | \"dry-run\" | \"skipped\" | \"error\";\n error?: string;\n /** Estimated token count for content being synced (populated in dry-run mode). */\n estimatedTokens?: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────\n\nexport const WORKSPACE_MANIFEST_FILE = \"workspace.json\";\nexport const WORKSPACE_MANIFEST_VERSION = \"1.0.0\";\n","import { readdir, stat, access } from \"node:fs/promises\";\nimport { join, dirname, relative } from \"node:path\";\nimport { AGENTS_DIR } from \"../types.js\";\nimport { WORKSPACE_MANIFEST_FILE } from \"./types.js\";\n\nexport interface DetectedRepo {\n /** Relative path from workspace root. */\n path: string;\n /** Directory name (default display name). */\n name: string;\n /** Whether this repo already has a hatch3r setup. */\n hasHatch3r: boolean;\n}\n\n/**\n * Scan immediate subdirectories of rootDir for git repositories.\n * Returns directories that contain a .git folder or file (worktree).\n */\nexport async function detectSubRepos(rootDir: string): Promise<DetectedRepo[]> {\n const repos: DetectedRepo[] = [];\n\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(rootDir, { withFileTypes: true });\n } catch {\n return repos;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip hidden directories and node_modules\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\n const subDir = join(rootDir, entry.name);\n const gitPath = join(subDir, \".git\");\n\n let isGitRepo = false;\n try {\n const gitStat = await stat(gitPath);\n // .git can be a directory (normal repo) or file (worktree)\n isGitRepo = gitStat.isDirectory() || gitStat.isFile();\n } catch {\n // Not a git repo\n }\n\n if (!isGitRepo) continue;\n\n let hasHatch3r = false;\n try {\n await access(join(subDir, AGENTS_DIR, \"hatch.json\"));\n hasHatch3r = true;\n } catch {\n // No existing hatch3r setup\n }\n\n repos.push({\n path: entry.name,\n name: entry.name,\n hasHatch3r,\n });\n }\n\n return repos.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport interface WorkspaceContext {\n type: \"workspace-root\" | \"workspace-member\" | \"standalone\";\n workspaceRoot?: string;\n rootPath?: string;\n}\n\n/**\n * Check if the given directory has a .git directory.\n */\nasync function hasGitDir(dir: string): Promise<boolean> {\n try {\n const gitStat = await stat(join(dir, \".git\"));\n return gitStat.isDirectory() || gitStat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the workspace context for a given directory.\n *\n * Returns:\n * - \"workspace-root\" if the dir has .agents/workspace.json\n * - \"workspace-member\" if the dir's hatch.json has a workspace.rootPath\n * pointing to a valid workspace root\n * - \"standalone\" otherwise\n */\nexport async function detectWorkspaceContext(dir: string): Promise<WorkspaceContext> {\n // Check 1: Is this directory a workspace root?\n try {\n await access(join(dir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return { type: \"workspace-root\", workspaceRoot: dir };\n } catch {\n // Not a workspace root\n }\n\n // Check 2: Walk up to 3 levels looking for workspace.json\n let current = dirname(dir);\n for (let i = 0; i < 3; i++) {\n try {\n await access(join(current, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return {\n type: \"workspace-member\",\n workspaceRoot: current,\n rootPath: relative(dir, current),\n };\n } catch {\n // Continue\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return { type: \"standalone\" };\n}\n\n/**\n * Determine if CWD looks like it should be a workspace root:\n * - No .git directory\n * - Has subdirectories with .git\n */\nexport async function shouldSuggestWorkspace(dir: string): Promise<boolean> {\n if (await hasGitDir(dir)) return false;\n\n const repos = await detectSubRepos(dir);\n return repos.length > 0;\n}\n\n/**\n * Check if a directory is a workspace root (has workspace.json).\n */\nexport async function isWorkspaceRoot(dir: string): Promise<boolean> {\n try {\n await access(join(dir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return true;\n } catch {\n return false;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, access, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n buildContentIndex,\n copySelectedContent,\n getAllContentIds,\n removeContentItem,\n} from \"../content/index.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest } from \"../integrity/index.js\";\nimport {\n createManifest,\n readManifest,\n writeManifest,\n addManagedFile,\n} from \"../manifest/hatchJson.js\";\nimport { safeWriteFile } from \"../merge/safeWrite.js\";\nimport { AGENTS_DIR } from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { AGENTS_MD_INNER, AGENTS_MD_FULL, generateCanonicalAgentsMd } from \"../cli/shared/agentsContent.js\";\nimport { findPackageRoot } from \"../cli/shared/paths.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname } from \"node:path\";\nimport { analyzeRepo } from \"../detect/repoAnalyzer.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry } from \"../env/mcpEnv.js\";\nimport { readWorkspaceManifest, writeWorkspaceManifest } from \"./manifest.js\";\nimport { resolveRepoConfig, buildSelectionFromIds } from \"./resolve.js\";\nimport { detectRepoGitIdentity } from \"./git.js\";\nimport type { WorkspaceManifest, WorkspaceRepoEntry, WorkspaceSyncResult, WorkspaceRepoSyncResult } from \"./types.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_ROOT = findPackageRoot(__dirname);\n\n/** Estimate token count from character count (~4 chars per token). */\nconst CHARS_PER_TOKEN = 4;\n\n/**\n * Estimate total tokens for a set of content IDs by summing the character\n * length of their source files and dividing by the chars-per-token ratio.\n */\nasync function estimateTokensForContent(\n contentIds: Set<string>,\n index: Awaited<ReturnType<typeof buildContentIndex>>,\n): Promise<number> {\n let totalChars = 0;\n for (const id of contentIds) {\n const item = index.byId.get(id);\n if (!item) continue;\n try {\n if (item.type === \"skill\") {\n // For skills, read the SKILL.md file\n const skillPath = join(CONTENT_ROOT, item.relativePath, \"SKILL.md\");\n const content = await readFile(skillPath, \"utf-8\");\n totalChars += content.length;\n } else {\n const filePath = join(CONTENT_ROOT, item.relativePath);\n const content = await readFile(filePath, \"utf-8\");\n totalChars += content.length;\n }\n } catch {\n // File not readable; skip\n }\n }\n return Math.ceil(totalChars / CHARS_PER_TOKEN);\n}\n\nexport interface WorkspaceSyncOptions {\n /** Only sync these repo paths (sync all opted-in repos if empty/undefined). */\n repos?: string[];\n /** Show what would change without modifying files. */\n dryRun?: boolean;\n /** Overwrite locally modified canonical files in sub-repos. */\n force?: boolean;\n /** Log callback for progress reporting. */\n onProgress?: (message: string) => void;\n /** Warning callback. */\n onWarn?: (message: string) => void;\n}\n\n/**\n * Sync workspace content to all (or selected) opted-in sub-repos.\n *\n * For each repo with sync=true:\n * 1. Resolve effective config (workspace defaults + repo overrides)\n * 2. Copy canonical content from workspace .agents/ to sub-repo .agents/\n * 3. Write sub-repo hatch.json with workspace provenance\n * 4. Run adapter generation for the sub-repo\n * 5. Generate integrity manifest\n */\nexport async function syncWorkspaceRepos(\n workspaceRoot: string,\n options: WorkspaceSyncOptions = {},\n): Promise<WorkspaceSyncResult> {\n const wsManifest = await readWorkspaceManifest(workspaceRoot);\n if (!wsManifest) {\n return { repos: [] };\n }\n\n const wsChecksum = createHash(\"sha256\")\n .update(JSON.stringify(wsManifest))\n .digest(\"hex\");\n\n // Build content index from workspace .agents/ (which has the canonical content)\n const index = await buildContentIndex(CONTENT_ROOT);\n const protectedIds = new Set(\n index.items.filter((item) => item.protected).map((item) => item.id),\n );\n\n // Select target repos\n const targetRepos = options.repos?.length\n ? wsManifest.repos.filter((r) => options.repos!.includes(r.path))\n : wsManifest.repos.filter((r) => r.sync);\n\n const results: WorkspaceRepoSyncResult[] = [];\n\n for (const repoEntry of targetRepos) {\n try {\n const result = await syncSingleRepo(\n workspaceRoot,\n wsManifest,\n wsChecksum,\n repoEntry,\n index,\n protectedIds,\n options,\n );\n results.push(result);\n } catch (err) {\n results.push({\n path: repoEntry.path,\n added: [],\n removed: [],\n toolsSynced: [],\n action: \"error\",\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Update workspace manifest with lastSync timestamps (unless dry-run)\n if (!options.dryRun) {\n const now = new Date().toISOString();\n for (const result of results) {\n if (result.action === \"synced\") {\n const entry = wsManifest.repos.find((r) => r.path === result.path);\n if (entry) entry.lastSync = now;\n }\n }\n await writeWorkspaceManifest(workspaceRoot, wsManifest);\n }\n\n return { repos: results };\n}\n\nasync function syncSingleRepo(\n workspaceRoot: string,\n wsManifest: WorkspaceManifest,\n wsChecksum: string,\n repoEntry: WorkspaceRepoEntry,\n index: Awaited<ReturnType<typeof buildContentIndex>>,\n protectedIds: Set<string>,\n options: WorkspaceSyncOptions,\n): Promise<WorkspaceRepoSyncResult> {\n const repoDir = join(workspaceRoot, repoEntry.path);\n const repoAgentsDir = join(repoDir, AGENTS_DIR);\n\n // Verify repo directory exists\n try {\n await access(repoDir);\n } catch {\n return {\n path: repoEntry.path,\n added: [],\n removed: [],\n toolsSynced: [],\n action: \"error\",\n error: `Directory not found: ${repoEntry.path}`,\n };\n }\n\n // Resolve effective config\n const resolved = resolveRepoConfig(wsManifest.defaults, repoEntry.overrides, protectedIds);\n const effectiveSelection = buildSelectionFromIds(resolved.contentIds, wsManifest.defaults.content, index.items);\n\n // Compute diff\n const existingManifest = await readManifest(repoDir);\n const previousIds = existingManifest?.content\n ? getAllContentIds(existingManifest.content)\n : new Set<string>();\n\n const toAdd = [...resolved.contentIds].filter((id) => !previousIds.has(id));\n const toRemove = [...previousIds].filter(\n (id) =>\n !resolved.contentIds.has(id) &&\n !existingManifest?.workspace?.localContent?.includes(id),\n );\n\n if (options.dryRun) {\n const estimatedTokens = await estimateTokensForContent(resolved.contentIds, index);\n return {\n path: repoEntry.path,\n added: toAdd,\n removed: toRemove,\n toolsSynced: resolved.tools,\n action: \"dry-run\",\n estimatedTokens,\n };\n }\n\n options.onProgress?.(`Syncing ${repoEntry.name ?? repoEntry.path}...`);\n\n // Ensure .agents/ exists\n await mkdir(repoAgentsDir, { recursive: true });\n\n // Copy selected content to sub-repo\n await copySelectedContent(CONTENT_ROOT, repoAgentsDir, effectiveSelection, index);\n\n // Remove stale content\n for (const id of toRemove) {\n const item = index.byId.get(id);\n if (item) {\n await removeContentItem(repoAgentsDir, item, { rootDir: repoDir });\n }\n }\n\n // Generate AGENTS.md for sub-repo\n const canonicalAgentsMd = await generateCanonicalAgentsMd(repoAgentsDir);\n await safeWriteFile(join(repoAgentsDir, \"AGENTS.md\"), canonicalAgentsMd, { force: true });\n\n // Write sub-repo manifest — resolve per-repo git identity\n const repoInfo = await analyzeRepo(repoDir);\n\n // 1. Per-repo identity from workspace.json\n let gitOwner = repoEntry.owner ?? \"\";\n let gitRepo = repoEntry.repo ?? \"\";\n let gitBranch = repoEntry.defaultBranch ?? \"\";\n let gitPlatform = repoEntry.platform;\n\n // 2. Fallback: auto-detect from sub-repo's git remote\n if (!gitOwner && !gitRepo) {\n const identity = detectRepoGitIdentity(repoDir);\n gitOwner = identity.owner;\n gitRepo = identity.repo;\n gitBranch = gitBranch || identity.defaultBranch;\n gitPlatform = gitPlatform ?? identity.platform;\n }\n\n // 3. Fallback: existing manifest values\n if (!gitOwner && !gitRepo && existingManifest) {\n gitOwner = existingManifest.owner;\n gitRepo = existingManifest.repo;\n }\n\n if (!gitBranch) gitBranch = \"main\";\n\n const manifest = createManifest({\n platform: gitPlatform ?? resolved.platform,\n owner: gitOwner,\n repo: gitRepo,\n namespace: gitOwner,\n project: gitRepo,\n defaultBranch: gitBranch,\n tools: resolved.tools,\n features: resolved.features,\n mcpServers: resolved.mcp.servers,\n content: effectiveSelection,\n languages: repoInfo.languages,\n });\n\n // Add workspace provenance\n manifest.workspace = {\n rootPath: relative(repoDir, workspaceRoot),\n lastSync: new Date().toISOString(),\n syncVersion: HATCH3R_VERSION,\n workspaceChecksum: wsChecksum,\n excludedContent: resolved.excludedContent.length > 0 ? resolved.excludedContent : undefined,\n localContent: existingManifest?.workspace?.localContent,\n };\n\n if (resolved.models) {\n manifest.models = resolved.models;\n }\n\n await writeManifest(repoDir, manifest);\n\n // Generate root AGENTS.md for sub-repo\n await safeWriteFile(join(repoDir, \"AGENTS.md\"), AGENTS_MD_FULL, {\n managedContent: AGENTS_MD_INNER,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, \"AGENTS.md\");\n\n // Run adapter generation\n const toolsSynced: string[] = [];\n for (const tool of resolved.tools) {\n try {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(repoAgentsDir, manifest);\n for (const w of adapter.warnings) {\n options.onWarn?.(w);\n }\n for (const out of outputs) {\n await safeWriteFile(join(repoDir, out.path), out.content, {\n managedContent: out.managedContent,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, out.path);\n }\n toolsSynced.push(tool);\n } catch (err) {\n options.onWarn?.(\n `Failed to generate ${tool} output for ${repoEntry.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Write manifest again with managedFiles populated\n await writeManifest(repoDir, manifest);\n\n // Generate integrity manifest\n const integrityManifest = await generateIntegrityManifest(repoAgentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(repoAgentsDir, integrityManifest);\n\n // Ensure .env.mcp for MCP servers\n if (manifest.features.mcp && manifest.mcp.servers.length > 0) {\n await ensureEnvMcp(repoDir, manifest.mcp.servers);\n await ensureGitignoreEntry(repoDir);\n }\n\n return {\n path: repoEntry.path,\n added: toAdd,\n removed: toRemove,\n toolsSynced,\n action: \"synced\",\n };\n}\n","import { access, readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { RepoInfo, Tool } from \"../types.js\";\nimport { detectPackageManager } from \"./packageManager.js\";\n\nexport async function analyzeRepo(rootDir: string): Promise<RepoInfo> {\n const [languages, pm, isMonorepo, hasExistingAgents, existingTools] =\n await Promise.all([\n detectLanguages(rootDir),\n detectPackageManager(rootDir),\n detectMonorepo(rootDir),\n detectExistingAgents(rootDir),\n detectExistingTools(rootDir),\n ]);\n const packageManager = pm.name;\n\n return {\n languages,\n packageManager,\n isMonorepo,\n hasExistingAgents,\n existingTools,\n rootDir,\n };\n}\n\nasync function detectLanguages(rootDir: string): Promise<string[]> {\n const languages: string[] = [];\n const indicators: Record<string, string[]> = {\n typescript: [\"tsconfig.json\", \"tsconfig.base.json\"],\n javascript: [\"jsconfig.json\"],\n python: [\"pyproject.toml\", \"setup.py\", \"requirements.txt\", \"Pipfile\"],\n rust: [\"Cargo.toml\", \"Cargo.lock\"],\n go: [\"go.mod\", \"go.sum\"],\n java: [\"pom.xml\", \"build.gradle\"],\n kotlin: [\"build.gradle.kts\"],\n ruby: [\"Gemfile\"],\n php: [\"composer.json\"],\n swift: [\"Package.swift\"],\n dart: [\"pubspec.yaml\"],\n elixir: [\"mix.exs\"],\n };\n\n for (const [lang, files] of Object.entries(indicators)) {\n for (const file of files) {\n if (await pathExists(join(rootDir, file))) {\n languages.push(lang);\n break;\n }\n }\n }\n\n try {\n const rootEntries = await readdir(rootDir);\n if (rootEntries.some(f => f.endsWith(\".csproj\") || f.endsWith(\".sln\"))) {\n languages.push(\"csharp\");\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n\n if (languages.length === 0) {\n languages.push(\"unknown\");\n }\n\n return languages;\n}\n\nasync function detectMonorepo(rootDir: string): Promise<boolean> {\n if (await pathExists(join(rootDir, \"pnpm-workspace.yaml\"))) return true;\n if (await pathExists(join(rootDir, \"lerna.json\"))) return true;\n if (await pathExists(join(rootDir, \"nx.json\"))) return true;\n if (await pathExists(join(rootDir, \"turbo.json\"))) return true;\n if (await pathExists(join(rootDir, \"pants.toml\"))) return true;\n\n try {\n const pkgJson = await readFile(join(rootDir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(pkgJson);\n if (pkg.workspaces) return true;\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === 'ENOENT' || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n return false;\n}\n\nasync function detectExistingAgents(rootDir: string): Promise<boolean> {\n return pathExists(join(rootDir, \".agents\"));\n}\n\nconst TOOL_INDICATORS: { tool: Tool; paths: string[] }[] = [\n { tool: \"cursor\", paths: [\".cursor\"] },\n { tool: \"copilot\", paths: [join(\".github\", \"copilot-instructions.md\")] },\n { tool: \"claude\", paths: [\"CLAUDE.md\", \".claude\"] },\n { tool: \"opencode\", paths: [\"opencode.json\", \"opencode.jsonc\"] },\n { tool: \"windsurf\", paths: [\".windsurfrules\"] },\n { tool: \"amp\", paths: [\".amp\"] },\n { tool: \"codex\", paths: [\".codex\"] },\n { tool: \"gemini\", paths: [\".gemini\", \"GEMINI.md\"] },\n { tool: \"cline\", paths: [\".clinerules\", \".roo\", \".roomodes\"] },\n { tool: \"aider\", paths: [\".aider\", \".aider.conf.yml\"] },\n { tool: \"kiro\", paths: [\".kiro\"] },\n { tool: \"goose\", paths: [\".goosehints\", \".goose\"] },\n { tool: \"zed\", paths: [\".rules\"] },\n { tool: \"amazon-q\", paths: [\".amazonq\"] },\n];\n\nasync function detectExistingTools(rootDir: string): Promise<Tool[]> {\n const results = await Promise.allSettled(\n TOOL_INDICATORS.map(async ({ tool, paths }) => {\n for (const p of paths) {\n if (await pathExists(join(rootDir, p))) return tool;\n }\n return null;\n }),\n );\n\n return results\n .filter(\n (r): r is PromiseFulfilledResult<Tool> =>\n r.status === \"fulfilled\" && r.value !== null,\n )\n .map((r) => r.value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n return false;\n }\n}\n\nexport function formatRepoSummary(info: RepoInfo): string {\n const lines = [\n `Languages: ${info.languages.join(\", \")}`,\n `Package manager: ${info.packageManager}`,\n `Monorepo: ${info.isMonorepo ? \"yes\" : \"no\"}`,\n `Existing .agents/: ${info.hasExistingAgents ? \"yes\" : \"no\"}`,\n ];\n\n if (info.existingTools.length > 0) {\n lines.push(`Existing tool configs: ${info.existingTools.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { getAllContentIds, TYPE_TO_SELECTION_KEY } from \"../content/index.js\";\nimport type { ContentSelection, Features, McpConfig, ModelConfig, Platform, Tool } from \"../types.js\";\nimport type { WorkspaceDefaults, WorkspaceRepoOverrides } from \"./types.js\";\n\nexport interface ResolvedRepoConfig {\n platform?: Platform;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n models?: ModelConfig;\n /** Effective content IDs after merge (workspace base + include - exclude). */\n contentIds: Set<string>;\n /** Content IDs excluded by the repo override. */\n excludedContent: string[];\n /** Content IDs added by the repo override. */\n addedContent: string[];\n}\n\n/**\n * Merge workspace defaults with per-repo overrides to produce effective config.\n *\n * Merge rules:\n * - tools: repo overrides replace entirely (not merged)\n * - features: partial merge (repo values override workspace values)\n * - mcp: repo overrides replace entirely\n * - content: workspace base + include - exclude (protected items cannot be excluded)\n * - models: deep merge (repo agent overrides take precedence)\n * - platform: repo overrides replace\n */\nexport function resolveRepoConfig(\n defaults: WorkspaceDefaults,\n overrides?: WorkspaceRepoOverrides,\n protectedIds?: Set<string>,\n): ResolvedRepoConfig {\n const tools = overrides?.tools ?? defaults.tools;\n const features = { ...defaults.features, ...(overrides?.features ?? {}) } as Features;\n const mcp = overrides?.mcp ?? defaults.mcp;\n const platform = overrides?.platform ?? defaults.platform;\n\n // Models: deep merge (agent-level overrides take precedence)\n let models: ModelConfig | undefined;\n if (defaults.models || overrides?.models) {\n models = {\n ...defaults.models,\n ...overrides?.models,\n agents: {\n ...defaults.models?.agents,\n ...overrides?.models?.agents,\n },\n };\n if (!models.default && !models.agents) models = undefined;\n }\n\n // Content: start from workspace, apply include/exclude\n const contentIds = getAllContentIds(defaults.content);\n const excludedContent: string[] = [];\n const addedContent: string[] = [];\n\n if (overrides?.contentOverrides?.exclude) {\n for (const id of overrides.contentOverrides.exclude) {\n // Protected items cannot be excluded\n if (protectedIds?.has(id)) continue;\n if (contentIds.has(id)) {\n contentIds.delete(id);\n excludedContent.push(id);\n }\n }\n }\n\n if (overrides?.contentOverrides?.include) {\n for (const id of overrides.contentOverrides.include) {\n if (!contentIds.has(id)) {\n contentIds.add(id);\n addedContent.push(id);\n }\n }\n }\n\n return { platform, tools, features, mcp, models, contentIds, excludedContent, addedContent };\n}\n\n/**\n * Build a ContentSelection object from a set of content IDs and the\n * workspace base selection (to preserve preset/projectType/teamSize metadata).\n */\nexport function buildSelectionFromIds(\n ids: Set<string>,\n baseSelection: ContentSelection,\n allItems: { id: string; type: string }[],\n): ContentSelection {\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const item of allItems) {\n if (!ids.has(item.id)) continue;\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) items[key].push(item.id);\n }\n\n return {\n preset: \"custom\",\n projectType: baseSelection.projectType,\n teamSize: baseSelection.teamSize,\n items,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\n\n// ── Git Identity ───────────────────────────────────────────────\n\nexport interface RepoGitIdentity {\n owner: string;\n repo: string;\n defaultBranch: string;\n platform: Platform;\n}\n\n// ── Detection Functions ────────────────────────────────────────\n\nexport function parseGitRemote(cwd?: string): { owner: string; repo: string } {\n try {\n const url = execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd,\n stdio: \"pipe\",\n })\n .toString()\n .trim();\n\n const sshMatch = url.match(/[:\\/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return { owner: \"\", repo: \"\" };\n } catch {\n return { owner: \"\", repo: \"\" };\n }\n}\n\nexport function parseGitDefaultBranch(cwd?: string): string {\n try {\n const ref = execFileSync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"origin/HEAD\"], {\n cwd,\n stdio: \"pipe\",\n })\n .toString()\n .trim();\n if (ref && ref.startsWith(\"origin/\")) {\n return ref.replace(/^origin\\//, \"\");\n }\n return \"main\";\n } catch {\n return \"main\";\n }\n}\n\nexport function detectPlatformFromRemote(remoteUrl: string): Platform {\n if (remoteUrl.includes(\"dev.azure.com\") || remoteUrl.includes(\"visualstudio.com\")) return \"azure-devops\";\n if (remoteUrl.includes(\"gitlab.com\") || remoteUrl.includes(\"gitlab.\")) return \"gitlab\";\n return \"github\";\n}\n\nexport function getGitRemoteUrl(cwd?: string): string {\n try {\n return execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], { cwd, stdio: \"pipe\" }).toString().trim();\n } catch {\n return \"\";\n }\n}\n\n// ── Composite Detection ────────────────────────────────────────\n\n/**\n * Auto-detect git identity for a repository directory.\n * Returns owner, repo, defaultBranch, and platform by inspecting the git remote.\n */\nexport function detectRepoGitIdentity(repoDir: string): RepoGitIdentity {\n const remoteUrl = getGitRemoteUrl(repoDir);\n const { owner, repo } = parseGitRemote(repoDir);\n const defaultBranch = parseGitDefaultBranch(repoDir);\n const platform = remoteUrl ? detectPlatformFromRemote(remoteUrl) : \"github\";\n\n return { owner, repo, defaultBranch, platform };\n}\n","import { readFileSync } from \"node:fs\";\nimport {\n TOOLS,\n AVAILABLE_MCP_SERVERS,\n type Tool,\n type Features,\n type Platform,\n} from \"../../types.js\";\n\nexport const TOOL_DISPLAY_NAMES: Record<Tool, string> = {\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n claude: \"Claude Code\",\n opencode: \"OpenCode\",\n windsurf: \"Windsurf\",\n amp: \"Amp\",\n codex: \"Codex CLI\",\n gemini: \"Gemini CLI\",\n cline: \"Cline / Roo Code\",\n aider: \"Aider\",\n kiro: \"Kiro\",\n goose: \"Goose\",\n zed: \"Zed\",\n \"amazon-q\": \"Amazon Q\",\n antigravity: \"Antigravity\",\n};\n\nexport const TOOL_PROMPT_CHOICES: { name: string; value: Tool }[] = TOOLS.map((t) => ({\n name: TOOL_DISPLAY_NAMES[t],\n value: t,\n}));\n\nexport const FEATURE_CHOICES: { name: string; value: keyof Features }[] = [\n { name: \"Agents\", value: \"agents\" },\n { name: \"Skills\", value: \"skills\" },\n { name: \"Rules\", value: \"rules\" },\n { name: \"Prompts\", value: \"prompts\" },\n { name: \"Commands\", value: \"commands\" },\n { name: \"MCP\", value: \"mcp\" },\n { name: \"Hooks\", value: \"hooks\" },\n { name: \"GitHub agents\", value: \"githubAgents\" },\n];\n\nexport const MCP_CHOICES = Object.entries(AVAILABLE_MCP_SERVERS).map(([id, meta]) => ({\n name: `${id}: ${meta.description}`,\n value: id,\n}));\n\nexport const PLATFORM_DISPLAY_NAMES: Record<Platform, string> = {\n github: \"GitHub\",\n \"azure-devops\": \"Azure DevOps\",\n gitlab: \"GitLab\",\n};\n\nexport const PLATFORM_MCP_SERVER: Record<Platform, string> = {\n github: \"github\",\n \"azure-devops\": \"azure-devops\",\n gitlab: \"gitlab\",\n};\n\n/**\n * Maps tools to their command invocation syntax (how users trigger hatch3r commands).\n * Tools that use slash commands get \"/\", others get a description of how to invoke.\n */\nexport const TOOL_COMMAND_SYNTAX: Record<Tool, string> = {\n cursor: \"/\",\n copilot: \"/\",\n claude: \"/\",\n opencode: \"/\",\n windsurf: \"run workflow \",\n amp: \"/\",\n codex: \"prompt with \",\n gemini: \"/\",\n cline: \"run workflow \",\n aider: \"prompt with \",\n kiro: \"/\",\n goose: \"prompt with \",\n zed: \"/\",\n \"amazon-q\": \"/\",\n antigravity: \"/\",\n};\n\n/**\n * Returns a user-facing string showing how to invoke a command for the given tool(s).\n * If all selected tools use slash-command syntax, returns \"/command-name\".\n * Otherwise returns a generic phrasing.\n */\nexport function formatCommandHint(tools: Tool[], commandName: string): string {\n const allSlash = tools.every((t) => TOOL_COMMAND_SYNTAX[t] === \"/\");\n if (allSlash) {\n return `/${commandName}`;\n }\n return `the ${commandName} command`;\n}\n\n/**\n * Per-editor notes about how MCP secrets (.env.mcp) are loaded.\n * Surfaced during tool selection to avoid post-init confusion.\n */\nexport const TOOL_SECRET_NOTES: Partial<Record<Tool, string>> = {\n cursor: \"Cursor: auto-loads .env.mcp from project root\",\n copilot: \"VS Code / Copilot: auto-loads .env.mcp from project root\",\n claude: \"Claude Code: reads .env.mcp via shell sourcing (run `set -a && source .env.mcp && set +a` before starting)\",\n windsurf: \"Windsurf: auto-loads .env.mcp from project root\",\n cline: \"Cline / Roo Code: reads env from VS Code settings; copy values to .vscode/settings.json or use shell sourcing\",\n amp: \"Amp: reads env from shell; source .env.mcp in your shell profile\",\n codex: \"Codex CLI: reads env from shell; source .env.mcp before running\",\n gemini: \"Gemini CLI: reads env from shell; source .env.mcp before running\",\n aider: \"Aider: reads env from shell; source .env.mcp before running\",\n opencode: \"OpenCode: reads env from shell; source .env.mcp before running\",\n};\n\nexport function sanitizeInput(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"\");\n}\n\nexport function isWSL(): boolean {\n if (process.env.WSL_DISTRO_NAME) return true;\n try {\n return /microsoft|wsl/i.test(readFileSync(\"/proc/version\", \"utf-8\"));\n } catch {\n return false;\n }\n}\n","import { access, mkdir, readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { basename, dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport {\n createManifest,\n readManifest,\n writeManifest,\n addManagedFile,\n} from \"../../manifest/hatchJson.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport {\n AGENTS_DIR,\n DEFAULT_FEATURES,\n HatchError,\n VALID_TOOLS,\n WORKTREE_INCLUDE_FILE,\n type ContentSelection,\n type Features,\n type Platform,\n type RepoInfo,\n type Tool,\n} from \"../../types.js\";\nimport { analyzeRepo } from \"../../detect/repoAnalyzer.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { AGENTS_MD_INNER, AGENTS_MD_FULL, generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n error as logError,\n step,\n label,\n warn,\n} from \"../shared/ui.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { TOOL_DISPLAY_NAMES, TOOL_PROMPT_CHOICES, FEATURE_CHOICES, MCP_CHOICES, PLATFORM_DISPLAY_NAMES, PLATFORM_MCP_SERVER, sanitizeInput, isWSL, formatCommandHint, TOOL_SECRET_NOTES } from \"../shared/constants.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest } from \"../../integrity/index.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport { buildContentIndex, resolveSelection, copySelectedContent, countSelectionItems, selectionSummary, getAllContentIds, removeContentItem, validateOrchestrationDependencies, countPresetExclusions, countProjectTypeExclusions, countTeamSizeExclusions, estimatePresetItemCount } from \"../../content/index.js\";\nimport { PRESETS, getPreset, type PresetId } from \"../../content/presets.js\";\nimport { detectSubRepos, shouldSuggestWorkspace } from \"../../workspace/detect.js\";\nimport { createWorkspaceManifest, writeWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport type { WorkspaceRepoEntry } from \"../../workspace/types.js\";\nimport { parseGitRemote, parseGitDefaultBranch, getGitRemoteUrl, detectPlatformFromRemote, detectRepoGitIdentity } from \"../../workspace/git.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_ROOT = findPackageRoot(__dirname);\n\nconst DEFAULT_TOOLS: Tool[] = [\"cursor\"];\nconst DEFAULT_FEATURE_KEYS = Object.keys(DEFAULT_FEATURES) as (keyof Features)[];\nconst DEFAULT_MCP: string[] = [\"playwright\", \"github\", \"context7\"];\n\n/**\n * Check if a content selection includes any board-related content.\n * Board content IDs follow the pattern \"hatch3r-board-*\".\n */\nfunction selectionHasBoardContent(selection: ContentSelection): boolean {\n return selection.items.commands.some((id) => id.startsWith(\"hatch3r-board\"));\n}\n\n/**\n * Surface board command prerequisites when board content is included in the selection.\n * Board commands require GitHub Projects V2 and a PAT with the `project` scope.\n */\nfunction warnBoardPrerequisites(selection: ContentSelection): void {\n if (!selectionHasBoardContent(selection)) return;\n info(\n `Board commands selected. Prerequisites: ${chalk.bold(\"GitHub Projects V2\")} must be enabled ` +\n `and your PAT needs the ${chalk.bold(\"project\")} scope. ` +\n `See ${chalk.dim(\"https://docs.github.com/en/issues/planning-and-tracking-with-projects\")}`,\n );\n}\n\n// Git detection functions imported from ../../workspace/git.js\n\nfunction deriveWorkspacePlatform(identities: Array<{ platform: Platform }>): Platform {\n const counts = new Map<Platform, number>();\n for (const id of identities) {\n counts.set(id.platform, (counts.get(id.platform) ?? 0) + 1);\n }\n let best: Platform = \"github\";\n let max = 0;\n for (const [p, c] of counts) { if (c > max) { best = p; max = c; } }\n return best;\n}\n\ninterface RunInitOptions {\n rootDir: string;\n platform: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n defaultBranch: string;\n tools: Tool[];\n features: Features;\n mcpServers: string[];\n repoInfo: RepoInfo;\n contentSelection: ContentSelection;\n}\n\nasync function runInit(options: RunInitOptions): Promise<void> {\n const { rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection } = options;\n const agentsDir = join(rootDir, AGENTS_DIR);\n const totalSteps = 4;\n\n const s1 = createSpinner(step(1, totalSteps, \"Creating canonical files...\"));\n s1.start();\n await mkdir(agentsDir, { recursive: true });\n\n // Detect re-init: check if manifest exists and compute content delta\n const existingManifest = await readManifest(rootDir);\n\n // Build content index from package and copy only selected items\n const index = await buildContentIndex(CONTENT_ROOT);\n await copySelectedContent(CONTENT_ROOT, agentsDir, contentSelection, index);\n\n // Clean up stale content from previous init\n if (existingManifest?.content) {\n const oldIds = getAllContentIds(existingManifest.content);\n const newIds = getAllContentIds(contentSelection);\n for (const id of oldIds) {\n if (!newIds.has(id)) {\n const item = index.byId.get(id);\n if (item) await removeContentItem(agentsDir, item, { rootDir });\n }\n }\n }\n\n await mkdir(join(agentsDir, \"learnings\"), { recursive: true });\n\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n try {\n const mcpRaw = await readFile(mcpPath, \"utf-8\");\n const mcpParsed = JSON.parse(mcpRaw) as { mcpServers?: Record<string, Record<string, unknown>> };\n if (mcpParsed.mcpServers) {\n const selected = new Set(mcpServers);\n const filtered: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcpParsed.mcpServers)) {\n if (!selected.has(name)) continue;\n const entry = { ...server };\n delete entry._disabled;\n filtered[name] = entry;\n }\n await safeWriteFile(\n mcpPath,\n JSON.stringify({ mcpServers: filtered }, null, 2) + \"\\n\",\n { force: true },\n );\n }\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === 'ENOENT' || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n // Generate dynamic AGENTS.md based on what's actually installed\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd, { force: true });\n\n s1.succeed(step(1, totalSteps, `Canonical files created (${countSelectionItems(contentSelection)} items)`));\n\n const s2 = createSpinner(step(2, totalSteps, \"Writing manifest...\"));\n s2.start();\n const manifest = createManifest({ platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, content: contentSelection, languages: repoInfo.languages });\n await writeManifest(rootDir, manifest);\n s2.succeed(step(2, totalSteps, \"Manifest written\"));\n\n const s3 = createSpinner(\n step(3, totalSteps, `Generating ${tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")} output...`),\n );\n s3.start();\n // On init, preserve existing user content: prepend managed block if file has no markers.\n await safeWriteFile(join(rootDir, \"AGENTS.md\"), AGENTS_MD_FULL, {\n managedContent: AGENTS_MD_INNER,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, \"AGENTS.md\");\n\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of tools) {\n const adapter = getAdapter(tool);\n try {\n const outputs = await adapter.generate(agentsDir, manifest);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n await safeWriteFile(join(rootDir, out.path), out.content, {\n managedContent: out.managedContent,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, out.path);\n }\n } catch (err) {\n adapterFailures.push({\n tool: TOOL_DISPLAY_NAMES[tool] ?? tool,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === tools.length) {\n s3.fail(step(3, totalSteps, \"All adapters failed\"));\n throw new HatchError(\"All adapters failed\", 1);\n }\n }\n s3.succeed(step(3, totalSteps, adapterFailures.length > 0\n ? `Adapter output generated (${adapterFailures.length} failed)`\n : \"Adapter output generated\"));\n\n for (const tool of tools) {\n const warnings = getUnsupportedFeatureWarnings(tool, manifest);\n for (const w of warnings) {\n warn(w);\n }\n }\n\n // Generate .worktreeinclude for worktree-capable tools\n const worktreeCapableTools = new Set([\"claude\"]);\n const hasWorktreeTool = tools.some(t => worktreeCapableTools.has(t));\n if (hasWorktreeTool) {\n manifest.worktree = manifest.worktree ?? { enabled: true };\n }\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n managedContent: wtManaged,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, WORKTREE_INCLUDE_FILE);\n }\n\n const s4 = createSpinner(step(4, totalSteps, \"Finalizing...\"));\n s4.start();\n await writeManifest(rootDir, manifest);\n\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n\n let envResult: { action: string; path: string; newVars: string[] } | undefined;\n if (features.mcp && mcpServers.length > 0) {\n envResult = await ensureEnvMcp(rootDir, mcpServers);\n await ensureGitignoreEntry(rootDir);\n }\n\n s4.succeed(step(4, totalSteps, \"Done\"));\n\n console.log();\n const enabledFeatures = Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n const presetLabel = contentSelection.preset.charAt(0).toUpperCase() + contentSelection.preset.slice(1);\n const summaryLines = [\n label(\"Profile\", `${presetLabel} (${contentSelection.projectType}, ${contentSelection.teamSize})`),\n label(\"Content\", `${countSelectionItems(contentSelection)} items (${selectionSummary(contentSelection)})`),\n label(\"Tools\", tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")),\n label(\"Features\", enabledFeatures.join(\", \")),\n ];\n if (owner || repo) {\n const platformLabel = PLATFORM_DISPLAY_NAMES[platform];\n summaryLines.push(label(platformLabel, `${namespace || owner}/${project || repo}`));\n }\n if (defaultBranch) {\n summaryLines.push(label(\"Default branch\", defaultBranch));\n }\n if (mcpServers.length > 0) {\n summaryLines.push(label(\"MCP\", mcpServers.join(\", \")));\n }\n if (manifest.worktree?.enabled) {\n summaryLines.push(label(\"Worktree\", \"isolation enabled\"));\n }\n if (envResult && envResult.action !== \"skipped\") {\n summaryLines.push(label(\"Secrets\", `.env.mcp (fill in your API keys)`));\n }\n summaryLines.push(\"\");\n summaryLines.push(label(\"Canonical\", `${AGENTS_DIR}/`));\n summaryLines.push(label(\"Manifest\", `${AGENTS_DIR}/hatch.json`));\n\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n summaryLines.push(\"\");\n if (isGreenfield) {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(formatCommandHint(tools, \"project-spec\"))} to define your new project`);\n } else {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(formatCommandHint(tools, \"codebase-map\"))} to map your existing codebase`);\n }\n\n if (envResult && envResult.newVars.length > 0) {\n summaryLines.push(\"\");\n summaryLines.push(`${chalk.yellow(\"!\")} Add your secrets to ${chalk.bold(\".env.mcp\")}: ${envResult.newVars.join(\", \")}`);\n summaryLines.push(` Then run: ${chalk.dim(getSourceEnvMcpCommand())}`);\n }\n\n printBox(\"Hatch complete\", summaryLines, \"success\");\n}\n\nasync function checkExisting(rootDir: string, skipPrompt: boolean, newSelection?: ContentSelection): Promise<void> {\n const hatchJsonPath = join(rootDir, AGENTS_DIR, \"hatch.json\");\n try {\n await access(hatchJsonPath);\n if (!skipPrompt) {\n let message = \"Existing .agents/ found. This will overwrite managed files. Continue?\";\n\n // Compute removal count if we have both old and new selections\n if (newSelection) {\n const existingManifest = await readManifest(rootDir);\n if (existingManifest?.content) {\n const oldIds = getAllContentIds(existingManifest.content);\n const newIds = getAllContentIds(newSelection);\n let removeCount = 0;\n for (const id of oldIds) {\n if (!newIds.has(id)) removeCount++;\n }\n if (removeCount > 0) {\n const oldPreset = existingManifest.content.preset.charAt(0).toUpperCase() + existingManifest.content.preset.slice(1);\n const newPreset = newSelection.preset.charAt(0).toUpperCase() + newSelection.preset.slice(1);\n message = `Existing .agents/ found. ${removeCount} content item(s) will be removed (switching from ${oldPreset} to ${newPreset}). Continue?`;\n }\n }\n }\n\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message,\n default: false,\n },\n ]);\n if (!proceed) {\n console.log(chalk.dim(\"\\n Init cancelled.\\n\"));\n throw new HatchError(\"Init cancelled.\", 0);\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nfunction validateFlag<T extends string>(value: string | undefined, valid: T[], fallback: T, name: string): T {\n if (!value) return fallback;\n if (!(valid as string[]).includes(value)) {\n logError(`Invalid --${name}: \"${value}\". Valid: ${valid.join(\", \")}`);\n throw new HatchError(`Invalid --${name}: \"${value}\"`, 1);\n }\n return value as T;\n}\n\nexport async function initCommand(\n opts: {\n tools?: string;\n yes?: boolean;\n preset?: string;\n projectType?: string;\n teamSize?: string;\n workspace?: boolean;\n } = {},\n): Promise<void> {\n printBanner();\n\n const rootDir = process.cwd();\n\n // Workspace auto-detection: if no .git but has git subdirectories, suggest workspace mode\n if (!opts.workspace) {\n const suggestWs = await shouldSuggestWorkspace(rootDir);\n if (suggestWs) {\n const detectedRepos = await detectSubRepos(rootDir);\n if (opts.yes) {\n opts.workspace = true;\n info(chalk.dim(`No git repo found. ${detectedRepos.length} git repo(s) detected in subdirectories — initializing as workspace.`));\n } else {\n info(`No git repo found, but ${detectedRepos.length} git repo(s) detected in subdirectories.`);\n const { useWorkspace } = await inquirer.prompt<{ useWorkspace: boolean }>([\n {\n type: \"confirm\",\n name: \"useWorkspace\",\n message: \"Initialize as a multi-repo workspace?\",\n default: true,\n },\n ]);\n opts.workspace = useWorkspace;\n }\n }\n }\n\n // Workspace: branch into dedicated flow that skips single-repo identity prompts\n if (opts.workspace) {\n const detectedRepos = await detectSubRepos(rootDir);\n const repoInfo = await analyzeRepo(rootDir);\n await runWorkspaceInit(rootDir, detectedRepos, repoInfo, opts);\n return;\n }\n\n const detectSpinner = createSpinner(\"Detecting repository...\");\n detectSpinner.start();\n const repoInfo = await analyzeRepo(rootDir);\n const remote = parseGitRemote();\n detectSpinner.succeed(\"Repository detected\");\n\n const detected: string[] = [];\n if (repoInfo.languages.length > 0 && repoInfo.languages[0] !== \"unknown\") {\n detected.push(...repoInfo.languages);\n }\n if (repoInfo.packageManager !== \"unknown\") {\n detected.push(repoInfo.packageManager);\n }\n if (repoInfo.isMonorepo) detected.push(\"monorepo\");\n if (detected.length > 0) {\n info(chalk.dim(`Detected: ${detected.join(\", \")}`));\n }\n\n if (opts.yes) {\n const remoteUrl = getGitRemoteUrl();\n const platform = detectPlatformFromRemote(remoteUrl);\n const owner = sanitizeInput(remote.owner);\n const repo = sanitizeInput(remote.repo);\n const namespace = owner;\n const project = repo;\n\n let tools: Tool[];\n if (opts.tools) {\n const rawTools = opts.tools.split(\",\").map((t) => t.trim());\n const invalid = rawTools.filter((t) => !VALID_TOOLS.has(t));\n if (invalid.length > 0) {\n logError(`Invalid tool(s): ${invalid.join(\", \")}`);\n console.log(chalk.dim(` Valid tools: ${[...VALID_TOOLS].join(\", \")}`));\n throw new HatchError(`Invalid tool(s): ${invalid.join(\", \")}`, 1);\n }\n tools = rawTools as Tool[];\n } else if (repoInfo.existingTools.length > 0) {\n tools = repoInfo.existingTools;\n } else {\n tools = DEFAULT_TOOLS;\n }\n\n const features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const defaultBranch = parseGitDefaultBranch();\n\n // Use CLI flags with validation, falling back to auto-detect / defaults\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const presetId = validateFlag(opts.preset, [\"minimal\", \"standard\", \"full\"], \"standard\", \"preset\");\n const projectType = validateFlag(opts.projectType, [\"greenfield\", \"brownfield\"], isGreenfield ? \"greenfield\" : \"brownfield\", \"project-type\");\n const teamSize = validateFlag(opts.teamSize, [\"solo\", \"team\"], \"solo\", \"team-size\");\n const preset = getPreset(presetId);\n const index = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(preset, projectType, teamSize, index);\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n await checkExisting(rootDir, true, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\n return;\n }\n\n console.log();\n\n const remoteUrl = getGitRemoteUrl();\n const detectedPlatform = detectPlatformFromRemote(remoteUrl);\n\n const platformAnswer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"list\",\n name: \"platform\",\n message: \"Select your platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: detectedPlatform,\n },\n ]);\n const platform = platformAnswer.platform;\n\n let owner: string;\n let repo: string;\n let namespace: string;\n let project: string;\n\n if (platform === \"azure-devops\") {\n const adoAnswers = await inquirer.prompt<{ org: string; project: string; repo: string }>([\n { type: \"input\", name: \"org\", message: \"Azure DevOps organization:\", default: remote.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Azure DevOps project:\" },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(adoAnswers.org);\n repo = sanitizeInput(adoAnswers.repo);\n namespace = owner;\n project = sanitizeInput(adoAnswers.project);\n } else if (platform === \"gitlab\") {\n const glAnswers = await inquirer.prompt<{ namespace: string; project: string }>([\n { type: \"input\", name: \"namespace\", message: \"GitLab namespace (group or username):\", default: remote.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Project name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(glAnswers.namespace);\n repo = sanitizeInput(glAnswers.project);\n namespace = owner;\n project = repo;\n } else {\n const repoAnswers = await inquirer.prompt<{ owner: string; repo: string }>([\n { type: \"input\", name: \"owner\", message: \"GitHub owner (org or username):\", default: remote.owner || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(repoAnswers.owner);\n repo = sanitizeInput(repoAnswers.repo);\n namespace = owner;\n project = repo;\n }\n\n const defaultBranchDefault = parseGitDefaultBranch();\n const defaultBranchAnswers = await inquirer.prompt<{ defaultBranch: string }>([\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch (for checkout, PR base, release):\",\n default: defaultBranchDefault,\n },\n ]);\n const defaultBranch = defaultBranchAnswers.defaultBranch.trim() || defaultBranchDefault;\n\n // --- Project type (with filter exclusion counts) ---\n const filterIndex = await buildContentIndex(CONTENT_ROOT);\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const greenfieldExcl = countProjectTypeExclusions(\"greenfield\", filterIndex.items);\n const brownfieldExcl = countProjectTypeExclusions(\"brownfield\", filterIndex.items);\n const projectTypeAnswer = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"list\",\n name: \"projectType\",\n message: \"Is this a new (greenfield) or existing (brownfield) project?\",\n choices: [\n { name: `Greenfield — new project from scratch${greenfieldExcl > 0 ? ` (filters out ${greenfieldExcl} brownfield-only item${greenfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"greenfield\" as const },\n { name: `Brownfield — existing codebase${brownfieldExcl > 0 ? ` (filters out ${brownfieldExcl} greenfield-only item${brownfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n // --- Team size (with filter exclusion counts) ---\n const soloExcl = countTeamSizeExclusions(\"solo\", filterIndex.items);\n const teamSizeAnswer = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"list\",\n name: \"teamSize\",\n message: \"Solo developer or team collaboration?\",\n choices: [\n { name: `Solo — just me${soloExcl > 0 ? ` (filters out ${soloExcl} team-only item${soloExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"solo\" as const },\n { name: \"Team — multiple contributors\", value: \"team\" as const },\n ],\n default: \"solo\",\n },\n ]);\n const teamSize = teamSizeAnswer.teamSize;\n\n // --- Content preset (with exclusion counts) ---\n const totalItems = filterIndex.items.length;\n const presetAnswer = await inquirer.prompt<{ preset: PresetId }>([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Select content profile:\",\n choices: PRESETS.map((p) => {\n const excluded = countPresetExclusions(p, filterIndex);\n const estimated = p.id !== \"custom\" ? estimatePresetItemCount(p, projectType, teamSize, filterIndex) : 0;\n const countHint = estimated > 0 ? ` (~${estimated} items)` : \"\";\n const suffix = excluded > 0 ? ` (excludes ${excluded} of ${totalItems})` : \"\";\n return {\n name: `${p.name} — ${p.description}${countHint}${suffix}`,\n value: p.id,\n };\n }),\n default: \"standard\" as PresetId,\n },\n ]);\n const selectedPreset = getPreset(presetAnswer.preset);\n\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n // --- Custom content selection ---\n // #148 (D19-19): Group content by tags in custom profile display\n let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = filterIndex;\n const tagGroups = new Map<string, typeof contentIndex.items>();\n for (const item of contentIndex.items) {\n const primaryTag = item.tags[0] ?? \"other\";\n if (!tagGroups.has(primaryTag)) tagGroups.set(primaryTag, []);\n tagGroups.get(primaryTag)!.push(item);\n }\n\n // Build grouped choices with separators\n const TAG_LABELS: Record<string, string> = {\n core: \"Core\", planning: \"Planning\", implementation: \"Implementation\",\n review: \"Review\", devops: \"DevOps\", maintenance: \"Maintenance\",\n greenfield: \"Greenfield\", brownfield: \"Brownfield\", board: \"Board\",\n security: \"Security\", a11y: \"Accessibility\", performance: \"Performance\",\n customize: \"Customization\", other: \"Other\",\n };\n const groupedChoices: Array<InstanceType<typeof inquirer.Separator> | { name: string; value: string; checked: boolean }> = [];\n for (const [tag, items] of tagGroups) {\n groupedChoices.push(new inquirer.Separator(`── ${TAG_LABELS[tag] ?? tag} (${items.length}) ──`));\n for (const item of items) {\n groupedChoices.push({\n name: `${item.type}: ${item.id.replace(/^hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: item.protected || item.tags.includes(\"core\"),\n });\n }\n }\n\n const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: groupedChoices,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n customSelections = customAnswer.items;\n }\n\n const toolDefaults = repoInfo.existingTools.length > 0 ? repoInfo.existingTools : DEFAULT_TOOLS;\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: toolDefaults,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const tools = toolAnswers.tools.length > 0 ? toolAnswers.tools : DEFAULT_TOOLS;\n\n // #143 (D19-14): Streamline MCP onboarding — surface secret notes inline\n const secretNotes = tools.map((t) => TOOL_SECRET_NOTES[t]).filter(Boolean);\n if (secretNotes.length > 0) {\n info(chalk.dim(\"MCP secret loading by tool:\"));\n for (const note of secretNotes) {\n info(chalk.dim(` ${note}`));\n }\n }\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features (MCP provides tool-server integration):\",\n choices: FEATURE_CHOICES,\n default: DEFAULT_FEATURE_KEYS,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n const features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n let mcpServers: string[] = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const defaultMcpForPlatform = Array.from(\n new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]),\n );\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: defaultMcpForPlatform,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n // --- Resolve content selection ---\n const contentSelection = resolveSelection(selectedPreset, projectType, teamSize, filterIndex, customSelections);\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n await checkExisting(rootDir, false, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\n}\n\n// ── Workspace initialization ──────────────────────────────────────\n\nasync function runWorkspaceInit(\n rootDir: string,\n detectedRepos: Awaited<ReturnType<typeof detectSubRepos>>,\n repoInfo: RepoInfo,\n opts: { tools?: string; yes?: boolean; preset?: string; projectType?: string; teamSize?: string },\n): Promise<void> {\n const headless = !!opts.yes;\n\n // Step 1: Detect sub-repo git identities\n console.log();\n const wsSpinner = createSpinner(\"Detecting workspace repos...\");\n wsSpinner.start();\n\n if (detectedRepos.length === 0) {\n wsSpinner.succeed(\"Workspace created (no sub-repos found)\");\n // Create empty workspace manifest with defaults\n const platform: Platform = \"github\";\n const tools: Tool[] = resolveToolsFromOpts(opts.tools, repoInfo);\n const features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const index = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(getPreset(\"standard\"), \"brownfield\", \"solo\", index);\n const wsManifest = createWorkspaceManifest(\n basename(rootDir) || \"workspace\",\n { platform, tools, features, mcp: { servers: mcpServers }, content: contentSelection },\n [],\n \"manual\",\n );\n await writeWorkspaceManifest(rootDir, wsManifest);\n return;\n }\n\n const enriched = detectedRepos.map((r) => ({\n ...r,\n ...detectRepoGitIdentity(join(rootDir, r.path)),\n }));\n\n wsSpinner.succeed(`Workspace: ${detectedRepos.length} repo(s) detected`);\n\n // Step 2: Display detected repos with git identity\n console.log();\n console.log(chalk.dim(\" Repo Platform Owner/Repo Branch\"));\n for (const r of enriched) {\n const name = (r.name ?? r.path).padEnd(16);\n if (r.owner && r.repo) {\n const platLabel = PLATFORM_DISPLAY_NAMES[r.platform].padEnd(14);\n const identity = `${r.owner}/${r.repo}`.padEnd(32);\n console.log(` ${name}${chalk.dim(platLabel)}${chalk.dim(identity)}${chalk.dim(r.defaultBranch)}`);\n } else {\n console.log(` ${name}${chalk.dim(\"(no remote detected)\")}`);\n }\n }\n console.log();\n\n // Step 3: Interactive — confirm/edit repo identities\n if (!headless) {\n const { acceptIdentity } = await inquirer.prompt<{ acceptIdentity: boolean }>([\n {\n type: \"confirm\",\n name: \"acceptIdentity\",\n message: \"Accept detected repo identities?\",\n default: true,\n },\n ]);\n\n if (!acceptIdentity) {\n for (const r of enriched) {\n console.log(chalk.bold(`\\n ${r.name ?? r.path}:`));\n const identity = await inquirer.prompt<{ owner: string; repo: string; defaultBranch: string }>([\n { type: \"input\", name: \"owner\", message: \" Owner:\", default: r.owner || undefined },\n { type: \"input\", name: \"repo\", message: \" Repo:\", default: r.repo || undefined },\n { type: \"input\", name: \"defaultBranch\", message: \" Default branch:\", default: r.defaultBranch || \"main\" },\n ]);\n r.owner = sanitizeInput(identity.owner);\n r.repo = sanitizeInput(identity.repo);\n r.defaultBranch = identity.defaultBranch.trim() || \"main\";\n }\n }\n }\n\n // Step 4: Derive workspace-root platform from sub-repos (workspace root has no git remote)\n const platform = deriveWorkspacePlatform(enriched);\n\n // Step 5: Resolve workspace-wide config (tools, features, content, MCP)\n let tools: Tool[];\n let features: Features;\n let mcpServers: string[];\n let contentSelection: ContentSelection;\n\n if (headless) {\n tools = resolveToolsFromOpts(opts.tools, repoInfo);\n features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const presetId = validateFlag(opts.preset, [\"minimal\", \"standard\", \"full\"], \"standard\", \"preset\");\n const projectType = validateFlag(opts.projectType, [\"greenfield\", \"brownfield\"], isGreenfield ? \"greenfield\" : \"brownfield\", \"project-type\");\n const teamSize = validateFlag(opts.teamSize, [\"solo\", \"team\"], \"solo\", \"team-size\");\n const preset = getPreset(presetId);\n const index = await buildContentIndex(CONTENT_ROOT);\n contentSelection = resolveSelection(preset, projectType, teamSize, index);\n } else {\n // Interactive workspace-wide config prompts\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n const wsFilterIndex = await buildContentIndex(CONTENT_ROOT);\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const wsGreenfieldExcl = countProjectTypeExclusions(\"greenfield\", wsFilterIndex.items);\n const wsBrownfieldExcl = countProjectTypeExclusions(\"brownfield\", wsFilterIndex.items);\n const projectTypeAnswer = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"list\",\n name: \"projectType\",\n message: \"Is this a new (greenfield) or existing (brownfield) project?\",\n choices: [\n { name: `Greenfield — new project from scratch${wsGreenfieldExcl > 0 ? ` (filters out ${wsGreenfieldExcl} brownfield-only item${wsGreenfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"greenfield\" as const },\n { name: `Brownfield — existing codebase${wsBrownfieldExcl > 0 ? ` (filters out ${wsBrownfieldExcl} greenfield-only item${wsBrownfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n const wsSoloExcl = countTeamSizeExclusions(\"solo\", wsFilterIndex.items);\n const teamSizeAnswer = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"list\",\n name: \"teamSize\",\n message: \"Solo developer or team collaboration?\",\n choices: [\n { name: `Solo — just me${wsSoloExcl > 0 ? ` (filters out ${wsSoloExcl} team-only item${wsSoloExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"solo\" as const },\n { name: \"Team — multiple contributors\", value: \"team\" as const },\n ],\n default: \"solo\",\n },\n ]);\n const teamSize = teamSizeAnswer.teamSize;\n\n const wsTotalItems = wsFilterIndex.items.length;\n const presetAnswer = await inquirer.prompt<{ preset: PresetId }>([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Select content profile:\",\n choices: PRESETS.map((p) => {\n const excluded = countPresetExclusions(p, wsFilterIndex);\n const wsEstimated = p.id !== \"custom\" ? estimatePresetItemCount(p, projectType, teamSize, wsFilterIndex) : 0;\n const wsCountHint = wsEstimated > 0 ? ` (~${wsEstimated} items)` : \"\";\n const suffix = excluded > 0 ? ` (excludes ${excluded} of ${wsTotalItems})` : \"\";\n return {\n name: `${p.name} — ${p.description}${wsCountHint}${suffix}`,\n value: p.id,\n };\n }),\n default: \"standard\" as PresetId,\n },\n ]);\n const selectedPreset = getPreset(presetAnswer.preset);\n\n // #148 (D19-19): Group content by tags in workspace custom profile display\n let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = wsFilterIndex;\n const wsTagGroups = new Map<string, typeof contentIndex.items>();\n for (const item of contentIndex.items) {\n const primaryTag = item.tags[0] ?? \"other\";\n if (!wsTagGroups.has(primaryTag)) wsTagGroups.set(primaryTag, []);\n wsTagGroups.get(primaryTag)!.push(item);\n }\n\n const WS_TAG_LABELS: Record<string, string> = {\n core: \"Core\", planning: \"Planning\", implementation: \"Implementation\",\n review: \"Review\", devops: \"DevOps\", maintenance: \"Maintenance\",\n greenfield: \"Greenfield\", brownfield: \"Brownfield\", board: \"Board\",\n security: \"Security\", a11y: \"Accessibility\", performance: \"Performance\",\n customize: \"Customization\", other: \"Other\",\n };\n const wsGroupedChoices: Array<InstanceType<typeof inquirer.Separator> | { name: string; value: string; checked: boolean }> = [];\n for (const [tag, items] of wsTagGroups) {\n wsGroupedChoices.push(new inquirer.Separator(`── ${WS_TAG_LABELS[tag] ?? tag} (${items.length}) ──`));\n for (const item of items) {\n wsGroupedChoices.push({\n name: `${item.type}: ${item.id.replace(/^hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: item.protected || item.tags.includes(\"core\"),\n });\n }\n }\n\n const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: wsGroupedChoices,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n customSelections = customAnswer.items;\n }\n\n const toolDefaults = repoInfo.existingTools.length > 0 ? repoInfo.existingTools : DEFAULT_TOOLS;\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: toolDefaults,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n tools = toolAnswers.tools.length > 0 ? toolAnswers.tools : DEFAULT_TOOLS;\n\n // Surface per-editor secret loading notes\n const wsSecretNotes = tools.map((t) => TOOL_SECRET_NOTES[t]).filter(Boolean);\n if (wsSecretNotes.length > 0) {\n info(chalk.dim(\"MCP secret loading by tool:\"));\n for (const note of wsSecretNotes) {\n info(chalk.dim(` ${note}`));\n }\n }\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features:\",\n choices: FEATURE_CHOICES,\n default: DEFAULT_FEATURE_KEYS,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n mcpServers = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const defaultMcpForPlatform = Array.from(\n new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]),\n );\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: defaultMcpForPlatform,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n contentSelection = resolveSelection(selectedPreset, projectType, teamSize, wsFilterIndex, customSelections);\n }\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n // Step 6: Create canonical .agents/ at workspace root (empty identity — workspace root is not a repo)\n await checkExisting(rootDir, headless, contentSelection);\n await runInit({\n rootDir,\n platform,\n owner: \"\",\n repo: \"\",\n namespace: \"\",\n project: \"\",\n defaultBranch: \"\",\n tools,\n features,\n mcpServers,\n repoInfo,\n contentSelection,\n });\n\n // Step 7: Build repo entries and select which to sync\n let repoEntries: WorkspaceRepoEntry[];\n\n if (headless) {\n repoEntries = enriched.map((r) => ({\n path: r.path,\n name: r.name,\n sync: false,\n owner: r.owner || undefined,\n repo: r.repo || undefined,\n defaultBranch: r.defaultBranch || undefined,\n platform: r.platform || undefined,\n }));\n } else {\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n const { syncRepos } = await inquirer.prompt<{ syncRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"syncRepos\",\n message: \"Select repos to sync workspace content to:\",\n choices: enriched.map((r) => ({\n name: `${r.name}${r.hasHatch3r ? chalk.dim(\" (has existing hatch3r)\") : \"\"}`,\n value: r.path,\n checked: false,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n\n const syncSet = new Set(syncRepos);\n repoEntries = enriched.map((r) => ({\n path: r.path,\n name: r.name,\n sync: syncSet.has(r.path),\n owner: r.owner || undefined,\n repo: r.repo || undefined,\n defaultBranch: r.defaultBranch || undefined,\n platform: r.platform || undefined,\n }));\n }\n\n // Step 8: Create workspace manifest and sync\n const dirName = basename(rootDir) || \"workspace\";\n const wsManifest = createWorkspaceManifest(\n dirName,\n { platform, tools, features, mcp: { servers: mcpServers }, content: contentSelection },\n repoEntries,\n \"manual\",\n );\n await writeWorkspaceManifest(rootDir, wsManifest);\n\n const syncCount = repoEntries.filter((r) => r.sync).length;\n if (syncCount > 0) {\n const syncSpinner = createSpinner(`Syncing ${syncCount} repo(s)...`);\n syncSpinner.start();\n\n const result = await syncWorkspaceRepos(rootDir, {\n onWarn: (msg) => warn(msg),\n });\n\n const succeeded = result.repos.filter((r) => r.action === \"synced\").length;\n const failed = result.repos.filter((r) => r.action === \"error\").length;\n\n if (failed > 0) {\n syncSpinner.warn(`Workspace sync: ${succeeded} synced, ${failed} failed`);\n for (const r of result.repos.filter((r) => r.action === \"error\")) {\n logError(` ${r.path}: ${r.error}`);\n }\n } else {\n syncSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n }\n\n console.log();\n const wsLines = [\n label(\"Mode\", \"workspace\"),\n label(\"Repos\", `${repoEntries.length} registered, ${syncCount} synced`),\n label(\"Strategy\", \"manual (use hatch3r sync --repos to propagate)\"),\n label(\"Manifest\", `${AGENTS_DIR}/workspace.json`),\n ];\n printBox(\"Workspace ready\", wsLines, \"success\");\n}\n\nfunction resolveToolsFromOpts(toolsFlag: string | undefined, repoInfo: RepoInfo): Tool[] {\n if (toolsFlag) {\n const rawTools = toolsFlag.split(\",\").map((t) => t.trim());\n const invalid = rawTools.filter((t) => !VALID_TOOLS.has(t));\n if (invalid.length > 0) {\n logError(`Invalid tool(s): ${invalid.join(\", \")}`);\n console.log(chalk.dim(` Valid tools: ${[...VALID_TOOLS].join(\", \")}`));\n throw new HatchError(`Invalid tool(s): ${invalid.join(\", \")}`, 1);\n }\n return rawTools as Tool[];\n }\n if (repoInfo.existingTools.length > 0) return repoInfo.existingTools;\n return DEFAULT_TOOLS;\n}\n","import type { ContentTag } from \"./tags.js\";\n\nexport type PresetId = \"minimal\" | \"standard\" | \"full\" | \"custom\";\n\nexport interface ContentPreset {\n id: PresetId;\n name: string;\n description: string;\n includeTags: ContentTag[];\n excludeTags: ContentTag[];\n}\n\nexport const PRESETS: ContentPreset[] = [\n {\n id: \"minimal\",\n name: \"Minimal\",\n description: \"Core agents and workflows only\",\n includeTags: [\"core\"],\n excludeTags: [],\n },\n {\n id: \"standard\",\n name: \"Standard (recommended)\",\n description: \"Full development lifecycle without niche audits\",\n includeTags: [\"core\", \"planning\", \"implementation\", \"review\", \"devops\", \"maintenance\"],\n excludeTags: [\"board\", \"a11y\", \"performance\", \"customize\"],\n },\n {\n id: \"full\",\n name: \"Full\",\n description: \"Everything including board management and all audits\",\n includeTags: [], // empty = include all\n excludeTags: [],\n },\n {\n id: \"custom\",\n name: \"Custom\",\n description: \"Choose exactly what you need\",\n includeTags: [],\n excludeTags: [],\n },\n];\n\nexport function getPreset(id: PresetId): ContentPreset {\n const preset = PRESETS.find((p) => p.id === id);\n if (!preset) throw new Error(`Unknown preset: ${id}`);\n return preset;\n}\n","import { stat, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport { AGENTS_DIR, HatchError, WORKTREE_INCLUDE_FILE, type GenerationMode } from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { readWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport { AGENTS_MD_INNER, AGENTS_MD_FULL, generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport { verifyIntegrity } from \"../../integrity/index.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n step,\n warn,\n} from \"../shared/ui.js\";\n\n/**\n * Check if docs/specs/ exists and whether spec files are older than\n * the most recent git commit, indicating they may be stale.\n */\nasync function checkSpecFreshness(rootDir: string): Promise<void> {\n const specsDir = join(rootDir, \"docs\", \"specs\");\n try {\n await stat(specsDir);\n } catch {\n return; // No specs directory — nothing to check\n }\n\n // Find the oldest spec file mtime\n let oldestSpecMtime = Date.now();\n try {\n const entries = await readdir(specsDir, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue;\n const parentPath = entry.parentPath ?? (entry as unknown as { path?: string }).path ?? specsDir;\n const fileStat = await stat(join(parentPath, entry.name));\n if (fileStat.mtimeMs < oldestSpecMtime) {\n oldestSpecMtime = fileStat.mtimeMs;\n }\n }\n } catch {\n return;\n }\n\n // Get the latest commit timestamp\n try {\n const commitDate = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%ct\"], { stdio: \"pipe\" })\n .toString()\n .trim();\n const latestCommitMs = parseInt(commitDate, 10) * 1000;\n\n if (latestCommitMs > oldestSpecMtime) {\n const daysSinceSpecUpdate = Math.floor((Date.now() - oldestSpecMtime) / (1000 * 60 * 60 * 24));\n if (daysSinceSpecUpdate > 7) {\n warn(\n `Project specs in docs/specs/ may be stale (oldest spec last modified ${daysSinceSpecUpdate} days ago). ` +\n `Consider running /project-spec to refresh.`,\n );\n }\n }\n } catch {\n // git not available or no commits — skip\n }\n}\n\nexport async function syncCommand(\n opts: {\n repos?: string[] | true;\n dryRun?: boolean;\n force?: boolean;\n minimal?: boolean;\n } = {},\n): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1);\n }\n\n const m = manifest;\n\n const integrityResults = await verifyIntegrity(agentsDir);\n const modified = integrityResults.filter((r) => r.status === \"modified\");\n const missing = integrityResults.filter((r) => r.status === \"missing\");\n if (modified.length > 0 || missing.length > 0) {\n warn(\"Integrity issues detected in canonical files:\");\n for (const r of modified) {\n warn(` MODIFIED: ${r.file}`);\n }\n for (const r of missing) {\n warn(` MISSING: ${r.file}`);\n }\n warn(\"These files may have been tampered with. Syncing will propagate their current content.\");\n console.log();\n }\n\n const results: { path: string; action: string }[] = [];\n const totalSteps = m.tools.length + 1;\n let currentStep = 0;\n\n const s1 = createSpinner(step(++currentStep, totalSteps, \"Syncing AGENTS.md...\"));\n s1.start();\n const agentsMdResult = await safeWriteFile(join(rootDir, \"AGENTS.md\"), AGENTS_MD_FULL, {\n managedContent: AGENTS_MD_INNER,\n });\n if (agentsMdResult.warning) warn(agentsMdResult.warning);\n results.push({ path: \"AGENTS.md\", action: agentsMdResult.action });\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n const canonicalResult = await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n if (canonicalResult.warning) warn(canonicalResult.warning);\n results.push({ path: `${AGENTS_DIR}/AGENTS.md`, action: canonicalResult.action });\n s1.succeed(step(currentStep, totalSteps, \"AGENTS.md synced\"));\n\n const generationMode: GenerationMode = opts.minimal ? \"minimal\" : \"standard\";\n if (opts.minimal) {\n info(\"Minimal generation mode: output will be stripped-down to reduce token usage.\");\n }\n\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of m.tools) {\n const s = createSpinner(step(++currentStep, totalSteps, `Generating ${tool} output...`));\n s.start();\n try {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(agentsDir, m, generationMode);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n const fullPath = join(rootDir, out.path);\n if (out.managedContent) {\n const result = await safeWriteFile(fullPath, out.content, {\n managedContent: out.managedContent,\n });\n if (result.warning) warn(result.warning);\n results.push({ path: out.path, action: result.action });\n } else {\n const result = await safeWriteFile(fullPath, out.content);\n if (result.warning) warn(result.warning);\n results.push({ path: out.path, action: result.action });\n }\n }\n s.succeed(step(currentStep, totalSteps, `${tool} output generated`));\n } catch (err) {\n s.fail(step(currentStep, totalSteps, `Failed to generate ${tool} output`));\n adapterFailures.push({\n tool,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === m.tools.length) {\n throw new HatchError(\"All adapters failed\", 1);\n }\n }\n\n for (const tool of m.tools) {\n const warnings = getUnsupportedFeatureWarnings(tool, m);\n for (const w of warnings) {\n warn(w);\n }\n }\n\n // Regenerate .worktreeinclude\n if (m.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(m, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n const wtResult = await safeWriteFile(\n join(rootDir, WORKTREE_INCLUDE_FILE),\n wtContent,\n { managedContent: wtManaged },\n );\n if (wtResult.warning) warn(wtResult.warning);\n results.push({ path: WORKTREE_INCLUDE_FILE, action: wtResult.action });\n }\n\n if (m.features.mcp && m.mcp.servers.length > 0) {\n const envResult = await ensureEnvMcp(rootDir, m.mcp.servers);\n await ensureGitignoreEntry(rootDir);\n if (envResult.action !== \"skipped\") {\n results.push({ path: envResult.path, action: envResult.action });\n }\n if (envResult.newVars.length > 0) {\n warn(\n `New secrets needed in .env.mcp: ${envResult.newVars.join(\", \")}`,\n );\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\n }\n\n // Check spec freshness\n await checkSpecFreshness(rootDir);\n\n console.log();\n\n const icons: Record<string, string> = {\n created: chalk.green(\"+\"),\n updated: chalk.yellow(\"~\"),\n skipped: chalk.dim(\"=\"),\n };\n\n const summaryLines = results.map((r) => {\n const icon = icons[r.action] ?? chalk.dim(\" \");\n return `${icon} ${r.path} ${chalk.dim(`(${r.action})`)}`;\n });\n\n printBox(\"Sync complete\", summaryLines, \"success\");\n\n // ── Workspace sync cascade ────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (!wsManifest) return;\n\n const syncReposRequested = opts.repos !== undefined;\n const syncOnSync = wsManifest.syncStrategy === \"on-sync\";\n const syncableCount = wsManifest.repos.filter((r) => r.sync).length;\n\n if (!syncReposRequested && !syncOnSync) {\n if (syncableCount > 0) {\n info(`Workspace: ${syncableCount} repo(s) available for sync. Run ${chalk.bold(\"hatch3r sync --repos\")} to propagate.`);\n }\n return;\n }\n\n // Determine which repos to sync\n const repoPaths = Array.isArray(opts.repos) ? opts.repos : undefined;\n\n console.log();\n const wsSpinner = createSpinner(\n opts.dryRun\n ? \"Workspace sync (dry run)...\"\n : `Syncing workspace to ${repoPaths ? repoPaths.length : syncableCount} repo(s)...`,\n );\n wsSpinner.start();\n\n const wsResult = await syncWorkspaceRepos(rootDir, {\n repos: repoPaths,\n dryRun: opts.dryRun,\n force: opts.force,\n onWarn: (msg) => warn(msg),\n });\n\n if (opts.dryRun) {\n wsSpinner.succeed(\"Workspace sync (dry run)\");\n for (const r of wsResult.repos) {\n const changes = [];\n if (r.added.length > 0) changes.push(`+${r.added.length} content`);\n if (r.removed.length > 0) changes.push(`-${r.removed.length} content`);\n if (r.toolsSynced.length > 0) changes.push(`${r.toolsSynced.length} tools`);\n info(` ${r.path}: ${changes.length > 0 ? changes.join(\", \") : \"up to date\"}`);\n }\n return;\n }\n\n const succeeded = wsResult.repos.filter((r) => r.action === \"synced\").length;\n const failed = wsResult.repos.filter((r) => r.action === \"error\").length;\n\n if (failed > 0) {\n wsSpinner.warn(`Workspace sync: ${succeeded} synced, ${failed} failed`);\n for (const r of wsResult.repos.filter((r) => r.action === \"error\")) {\n logError(` ${r.path}: ${r.error}`);\n }\n } else {\n wsSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n}\n","import { readdir, readFile, access } from \"node:fs/promises\";\nimport { join, posix } from \"node:path\";\nimport chalk from \"chalk\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { isValidHookEvent } from \"../../hooks/types.js\";\nimport { AGENTS_DIR, HATCH3R_PREFIX, HatchError } from \"../../types.js\";\nimport type { HatchManifest } from \"../../types.js\";\nimport { scanForDeniedPatterns } from \"../../adapters/customization.js\";\nimport { buildContentIndex, validateCrossReferences, validateOrchestrationDependencies } from \"../../content/index.js\";\nimport { readCustomizationWithWarnings } from \"../../models/customize.js\";\nimport type { CustomizableType } from \"../../models/customize.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n warn,\n info,\n} from \"../shared/ui.js\";\n\n// Default fallback set; overridden by manifest.content when available\nconst DEFAULT_KNOWN_AGENTS = new Set([\n \"hatch3r-a11y-auditor\", \"hatch3r-architect\", \"hatch3r-ci-watcher\", \"hatch3r-context-rules\",\n \"hatch3r-dependency-auditor\", \"hatch3r-devops\", \"hatch3r-docs-writer\", \"hatch3r-fixer\",\n \"hatch3r-implementer\", \"hatch3r-learnings-loader\", \"hatch3r-lint-fixer\", \"hatch3r-perf-profiler\",\n \"hatch3r-researcher\", \"hatch3r-reviewer\", \"hatch3r-security-auditor\", \"hatch3r-test-writer\",\n]);\n\ninterface ValidationResult {\n errors: string[];\n warnings: string[];\n}\n\nconst CUSTOMIZATION_TYPES = [\n { dir: \"agents\", canonical: \"agents\" },\n { dir: \"commands\", canonical: \"commands\" },\n { dir: \"skills\", canonical: \"skills\" },\n { dir: \"rules\", canonical: \"rules\" },\n];\n\nasync function validateManifest(\n rootDir: string,\n manifest: HatchManifest | null,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest) {\n result.errors.push(\"Missing .agents/hatch.json manifest\");\n return;\n }\n if (!manifest.version) result.errors.push(\"hatch.json: missing 'version' field\");\n if (!manifest.tools || manifest.tools.length === 0) result.warnings.push(\"hatch.json: no tools configured\");\n\n for (const managedFile of manifest.managedFiles ?? []) {\n try {\n await access(join(rootDir, managedFile));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Managed file missing from disk: ${managedFile}`);\n }\n }\n}\n\nasync function validateDirectories(\n agentsDir: string,\n result: ValidationResult,\n): Promise<void> {\n const requiredDirs = [\"agents\", \"skills\", \"rules\"];\n const optionalDirs = [\"commands\", \"prompts\", \"mcp\", \"policy\", \"github-agents\"];\n\n for (const dir of requiredDirs) {\n try {\n await access(join(agentsDir, dir));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.errors.push(`Required directory missing: .agents/${dir}/`);\n }\n }\n\n for (const dir of optionalDirs) {\n try {\n await access(join(agentsDir, dir));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Optional directory missing: .agents/${dir}/`);\n }\n }\n}\n\nasync function validateFrontmatter(\n agentsDir: string,\n result: ValidationResult,\n): Promise<void> {\n const requiredDirs = [\"agents\", \"skills\", \"rules\"];\n const optionalDirs = [\"commands\", \"prompts\", \"mcp\", \"policy\", \"github-agents\"];\n\n for (const dir of [...requiredDirs, ...optionalDirs]) {\n const dirPath = join(agentsDir, dir);\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const filePath = join(dirPath, entry.name);\n const content = await readFile(filePath, \"utf-8\");\n if (!content.startsWith(\"---\")) {\n result.warnings.push(`Missing frontmatter: .agents/${dir}/${entry.name}`);\n } else {\n const endIdx = content.indexOf(\"---\", 3);\n if (endIdx === -1) {\n result.errors.push(`Invalid frontmatter (no closing ---): .agents/${dir}/${entry.name}`);\n } else {\n const frontmatter = content.slice(3, endIdx).trim();\n const parsedFm = parseYaml(frontmatter) as Record<string, unknown> | null;\n if (!parsedFm || typeof parsedFm !== \"object\" || !parsedFm.id) {\n result.warnings.push(`Missing 'id' in frontmatter: .agents/${dir}/${entry.name}`);\n }\n if (!parsedFm || typeof parsedFm !== \"object\" || !parsedFm.type) {\n result.warnings.push(`Missing 'type' in frontmatter: .agents/${dir}/${entry.name}`);\n }\n }\n }\n } else if (entry.isDirectory()) {\n const skillPath = join(dirPath, entry.name, \"SKILL.md\");\n try {\n await access(skillPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Skill directory missing SKILL.md: .agents/${dir}/${entry.name}/`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n\n try {\n await access(join(agentsDir, \"AGENTS.md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(\"Missing .agents/AGENTS.md\");\n }\n}\n\nasync function validateManagedFilePrefixes(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n for (const managedFile of manifest.managedFiles ?? []) {\n const fileName = posix.basename(managedFile) || \"\";\n const isSharedFile = [\"AGENTS.md\", \"CLAUDE.md\", \"copilot-instructions.md\", \".windsurfrules\", \"mcp.json\", \"opencode.json\", \".mcp.json\", \"copilot-setup-steps.yml\", \"settings.json\"].some(\n (sf) => fileName === sf || managedFile.endsWith(sf),\n );\n if (!isSharedFile && !fileName.startsWith(HATCH3R_PREFIX) && !fileName.startsWith(\".\")) {\n result.warnings.push(`Managed file without hatch3r- prefix: ${managedFile}`);\n }\n }\n}\n\nasync function validateHooks(\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.features.hooks) return;\n\n const hooksDir = join(agentsDir, \"hooks\");\n try {\n const hookFiles = await readdir(hooksDir);\n const mdHooks = hookFiles.filter(f => f.endsWith(\".md\"));\n if (mdHooks.length === 0) {\n result.warnings.push(\"Hooks feature enabled but no hook definitions found in .agents/hooks/\");\n }\n\n let agentFiles: Set<string> | undefined;\n try {\n const agentEntries = await readdir(join(agentsDir, \"agents\"));\n agentFiles = new Set(agentEntries.filter(f => f.endsWith(\".md\")));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n for (const hookFile of mdHooks) {\n const hookContent = await readFile(join(hooksDir, hookFile), \"utf-8\");\n if (!hookContent.startsWith(\"---\")) {\n result.warnings.push(`Hook missing frontmatter: .agents/hooks/${hookFile}`);\n continue;\n }\n const endIdx = hookContent.indexOf(\"---\", 3);\n if (endIdx === -1) continue;\n const fm = parseYaml(hookContent.slice(3, endIdx).trim()) as Record<string, unknown> | null;\n if (fm?.event && typeof fm.event === \"string\") {\n if (!isValidHookEvent(fm.event)) {\n result.errors.push(`Hook \"${hookFile}\" has invalid event \"${fm.event}\". Valid events: pre-commit, post-merge, ci-failure, file-save, session-start, pre-push`);\n }\n }\n if (fm?.agent && typeof fm.agent === \"string\" && agentFiles) {\n const agentName = typeof fm.agent === \"string\" && fm.agent.startsWith(HATCH3R_PREFIX)\n ? fm.agent\n : `${HATCH3R_PREFIX}${fm.agent}`;\n const expectedFile = `${agentName}.md`;\n if (!agentFiles.has(expectedFile)) {\n result.errors.push(`Hook \"${hookFile}\" references agent \"${fm.agent}\" but .agents/agents/${expectedFile} does not exist`);\n }\n // Build known agents set from manifest content or fallback\n const knownAgents = manifest.content\n ? new Set(manifest.content.items.agents)\n : DEFAULT_KNOWN_AGENTS;\n if (!knownAgents.has(agentName)) {\n result.warnings.push(`Hook \"${hookFile}\" references agent \"${fm.agent}\" which is not in the standard hatch3r agent roster`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(\"Hooks feature enabled but .agents/hooks/ directory not found\");\n }\n}\n\nasync function validateMcp(\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.features.mcp || manifest.mcp.servers.length === 0) return;\n\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n try {\n const mcpContent = await readFile(mcpPath, \"utf-8\");\n const mcpParsed = JSON.parse(mcpContent);\n if (!mcpParsed.mcpServers || typeof mcpParsed.mcpServers !== \"object\") {\n result.errors.push(\"MCP config missing 'mcpServers' key\");\n }\n } catch (err) {\n if (err instanceof SyntaxError) {\n result.errors.push(\"Invalid JSON in .agents/mcp/mcp.json\");\n } else {\n result.warnings.push(\"MCP servers configured but .agents/mcp/mcp.json not found\");\n }\n }\n}\n\nasync function validateModels(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.models) return;\n\n if (manifest.models.default && typeof manifest.models.default !== \"string\") {\n result.errors.push(\"hatch.json: models.default must be a string\");\n }\n if (manifest.models.agents) {\n for (const [agentId, model] of Object.entries(manifest.models.agents)) {\n if (typeof model !== \"string\") {\n result.errors.push(`hatch.json: models.agents.${agentId} must be a string`);\n }\n }\n }\n}\n\n/**\n * Validate .customize.yaml files for syntax and known field usage.\n * Checks that YAML parses correctly, uses only recognized fields,\n * and that field values have the expected types.\n */\nasync function validateCustomizeYaml(\n rootDir: string,\n result: ValidationResult,\n): Promise<void> {\n const VALID_FIELDS = new Set([\"model\", \"scope\", \"description\", \"enabled\"]);\n const FIELD_TYPES: Record<string, string> = {\n model: \"string\",\n scope: \"string\",\n description: \"string\",\n enabled: \"boolean\",\n };\n\n for (const { dir } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n let files: string[];\n try {\n files = await readdir(customDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n const yamlFiles = files.filter(f => f.endsWith(\".customize.yaml\"));\n for (const file of yamlFiles) {\n const filePath = join(customDir, file);\n const itemId = file.replace(\".customize.yaml\", \"\");\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n\n // Check size limit (same as customize.ts: 10KB)\n if (Buffer.byteLength(raw, \"utf-8\") > 10_240) {\n result.warnings.push(\n `.customize.yaml for \"${itemId}\" exceeds 10KB limit and will be skipped during generation`,\n );\n continue;\n }\n\n // Check YAML syntax\n let parsed: Record<string, unknown> | null;\n try {\n parsed = parseYaml(raw) as Record<string, unknown> | null;\n } catch {\n result.errors.push(\n `Invalid YAML syntax in .hatch3r/${dir}/${file}`,\n );\n continue;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n result.warnings.push(\n `.customize.yaml for \"${itemId}\" is empty or not an object`,\n );\n continue;\n }\n\n // Check for unknown fields\n for (const key of Object.keys(parsed)) {\n if (!VALID_FIELDS.has(key)) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: unknown field \"${key}\" (valid: ${[...VALID_FIELDS].join(\", \")})`,\n );\n }\n }\n\n // Check field types\n for (const [key, expectedType] of Object.entries(FIELD_TYPES)) {\n if (key in parsed && parsed[key] !== undefined && parsed[key] !== null) {\n const actualType = typeof parsed[key];\n if (actualType !== expectedType) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: field \"${key}\" should be ${expectedType} but is ${actualType}`,\n );\n }\n }\n }\n\n // Run denied-pattern scan on string fields\n for (const field of [\"description\", \"scope\"] as const) {\n const value = parsed[field];\n if (typeof value === \"string\") {\n const violations = scanForDeniedPatterns(value);\n for (const v of violations) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: field \"${field}\" contains denied pattern: ${v}`,\n );\n }\n }\n }\n\n // Validate the customization through the canonical reader for deeper checks\n const type = dir as CustomizableType;\n const readResult = await readCustomizationWithWarnings(rootDir, type, itemId);\n for (const w of readResult.warnings) {\n result.warnings.push(w);\n }\n }\n }\n}\n\nasync function validateCustomizations(\n rootDir: string,\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n for (const { dir, canonical } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n try {\n const customFiles = await readdir(customDir);\n for (const file of customFiles) {\n if (file.endsWith(\".customize.yaml\")) {\n const itemId = file.replace(\".customize.yaml\", \"\");\n const canonicalPath = canonical === \"skills\"\n ? join(agentsDir, canonical, itemId)\n : join(agentsDir, canonical, `${itemId}.md`);\n try {\n await access(canonicalPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Customization file for non-existent ${canonical.slice(0, -1)}: .hatch3r/${dir}/${file}`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n}\n\nasync function validateContentConsistency(\n rootDir: string,\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n // Content consistency: manifest items vs disk\n if (manifest.content) {\n const contentDirs: Record<keyof typeof manifest.content.items, { dir: string; strategy: \"glob\" | \"subdir\" }> = {\n agents: { dir: \"agents\", strategy: \"glob\" },\n skills: { dir: \"skills\", strategy: \"subdir\" },\n rules: { dir: \"rules\", strategy: \"glob\" },\n commands: { dir: \"commands\", strategy: \"glob\" },\n prompts: { dir: \"prompts\", strategy: \"glob\" },\n hooks: { dir: \"hooks\", strategy: \"glob\" },\n githubAgents: { dir: \"github-agents\", strategy: \"glob\" },\n };\n for (const [key, cfg] of Object.entries(contentDirs)) {\n const ids = manifest.content.items[key as keyof typeof manifest.content.items];\n for (const id of ids) {\n const checkPath = cfg.strategy === \"subdir\"\n ? join(agentsDir, cfg.dir, id, \"SKILL.md\")\n : join(agentsDir, cfg.dir, `${id}.md`);\n try {\n await access(checkPath);\n } catch {\n result.warnings.push(`Content \"${id}\" (${key}) in manifest but missing from .agents/${cfg.dir}/`);\n }\n }\n }\n\n // Orphaned customize files\n const allContentIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) allContentIds.add(id);\n }\n for (const { dir } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n try {\n const files = await readdir(customDir);\n for (const f of files.filter(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n const itemId = f.replace(/\\.customize\\.(yaml|md)$/, \"\");\n if (!allContentIds.has(itemId) && !allContentIds.has(`${HATCH3R_PREFIX}${itemId}`)) {\n result.warnings.push(`Orphaned customization: .hatch3r/${dir}/${f} (content not in manifest)`);\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n\n // Validate learnings for denied patterns\n const learningsDir = join(agentsDir, \"learnings\");\n try {\n const learningFiles = await readdir(learningsDir);\n const mdFiles = learningFiles.filter(f => f.endsWith(\".md\"));\n for (const file of mdFiles) {\n const content = await readFile(join(learningsDir, file), \"utf-8\");\n const violations = scanForDeniedPatterns(content);\n if (violations.length > 0) {\n for (const v of violations) {\n result.warnings.push(`Learning file \"${file}\" contains suspicious content: ${v}`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n}\n\nexport async function validateCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const result: ValidationResult = { errors: [], warnings: [] };\n\n const spinner = createSpinner(\"Validating .agents/ structure...\");\n spinner.start();\n\n try {\n await access(agentsDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n spinner.fail(\"Validation failed\");\n logError(\".agents/ directory not found. Run `hatch3r init` first.\");\n console.log();\n throw new HatchError(\".agents/ directory not found.\", 1);\n }\n\n const manifest = await readManifest(rootDir);\n\n await validateManifest(rootDir, manifest, result);\n await validateDirectories(agentsDir, result);\n await validateFrontmatter(agentsDir, result);\n\n if (manifest) {\n await validateManagedFilePrefixes(manifest, result);\n await validateHooks(agentsDir, manifest, result);\n await validateMcp(agentsDir, manifest, result);\n await validateModels(manifest, result);\n await validateCustomizations(rootDir, agentsDir, manifest, result);\n await validateCustomizeYaml(rootDir, result);\n await validateContentConsistency(rootDir, agentsDir, manifest, result);\n\n // Cross-reference validation: check that installed content doesn't have broken references\n try {\n const index = await buildContentIndex(agentsDir);\n if (index.items.length > 0) {\n const crossRefResult = await validateCrossReferences(agentsDir, index);\n for (const w of crossRefResult.warnings) {\n result.warnings.push(w);\n }\n }\n } catch {\n // Content scanning failed — skip cross-ref validation\n }\n\n // Orchestration dependency validation: check required agents are selected\n if (manifest.content) {\n const orchWarnings = validateOrchestrationDependencies(manifest.content);\n for (const w of orchWarnings) {\n result.warnings.push(w);\n }\n }\n }\n\n spinner.stop();\n\n // Detect if customization files exist for contextual help (#56 D19-4)\n let hasCustomizations = false;\n for (const { dir } of CUSTOMIZATION_TYPES) {\n try {\n const files = await readdir(join(rootDir, \".hatch3r\", dir));\n if (files.some(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n hasCustomizations = true;\n break;\n }\n } catch {\n // directory doesn't exist\n }\n }\n\n if (result.errors.length === 0 && result.warnings.length === 0) {\n printBox(\"Validation\", [chalk.green(\"All checks passed\")], \"success\");\n if (hasCustomizations) {\n printCustomizationHint();\n }\n return;\n }\n\n console.log();\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n logError(err);\n }\n console.log();\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n warn(w);\n }\n console.log();\n }\n\n if (result.errors.length > 0) {\n const summaryLines = [\n `${chalk.red(\"✖\")} ${result.errors.length} error(s)`,\n `${chalk.yellow(\"⚠\")} ${result.warnings.length} warning(s)`,\n ];\n printBox(\"Validation failed\", summaryLines, \"error\");\n throw new HatchError(\"Validation failed\", 1);\n } else {\n const summaryLines = [\n `${chalk.green(\"✔\")} 0 errors`,\n `${chalk.yellow(\"⚠\")} ${result.warnings.length} warning(s)`,\n ];\n printBox(\"Validation passed\", summaryLines, \"success\");\n }\n\n if (hasCustomizations) {\n printCustomizationHint();\n }\n}\n\n/**\n * Print a contextual explanation of the three customization mechanisms\n * when customization files are detected (D19-4).\n */\nfunction printCustomizationHint(): void {\n console.log();\n info(chalk.bold(\"Customization mechanisms detected. Quick reference:\"));\n console.log(chalk.dim(\" 1. hatch3r- prefix: Files prefixed with hatch3r- are managed by hatch3r and\"));\n console.log(chalk.dim(\" overwritten on update. Do not edit these directly.\"));\n console.log(chalk.dim(\" 2. Managed blocks: Sections between <!-- MANAGED-BLOCK:BEGIN --> and\"));\n console.log(chalk.dim(\" <!-- MANAGED-BLOCK:END --> are auto-updated. Add content outside these markers.\"));\n console.log(chalk.dim(\" 3. .customize.yaml/.md: Place in .hatch3r/{type}/ to override model, scope,\"));\n console.log(chalk.dim(\" description, or disable items. Use .customize.md for content additions.\"));\n console.log(chalk.dim(\" See: https://docs.hatch3r.com/docs/guides/customization\"));\n}\n","import { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { AGENTS_DIR, HatchError } from \"../../types.js\";\nimport { readIntegrityManifest, verifyIntegrity } from \"../../integrity/index.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n} from \"../shared/ui.js\";\n\nexport async function verifyCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n\n const spinner = createSpinner(\"Verifying file integrity...\");\n spinner.start();\n\n const manifest = await readIntegrityManifest(agentsDir);\n if (!manifest) {\n spinner.fail(\"No integrity manifest found\");\n logError(\"Missing .agents/.integrity.json — run `hatch3r init` or `hatch3r update` to generate it.\");\n console.log();\n throw new HatchError(\"Missing .agents/.integrity.json\", 1);\n }\n\n const results = await verifyIntegrity(agentsDir);\n spinner.stop();\n\n if (results.length === 0) {\n printBox(\"Integrity\", [chalk.dim(\"No files to verify\")], \"info\");\n return;\n }\n\n const icons: Record<string, string> = {\n pass: chalk.green(\"✔\"),\n modified: chalk.yellow(\"✖\"),\n missing: chalk.red(\"✖\"),\n new: chalk.cyan(\"+\"),\n tampered: chalk.red(\"⚠\"),\n };\n\n const labels: Record<string, string> = {\n pass: chalk.green(\"PASS\"),\n modified: chalk.yellow(\"MODIFIED\"),\n missing: chalk.red(\"MISSING\"),\n new: chalk.cyan(\"NEW\"),\n tampered: chalk.red(\"TAMPERED\"),\n };\n\n console.log();\n for (const r of results) {\n const icon = icons[r.status] ?? \" \";\n const lbl = labels[r.status] ?? r.status;\n console.log(` ${icon} ${lbl.padEnd(18)} ${r.file}`);\n }\n console.log();\n\n const counts: Record<string, number> = { pass: 0, modified: 0, missing: 0, new: 0, tampered: 0 };\n for (const r of results) {\n counts[r.status] = (counts[r.status] ?? 0) + 1;\n }\n\n const summaryLines: string[] = [];\n if (counts.pass > 0) summaryLines.push(`${chalk.green(\"✔\")} Passed: ${counts.pass}`);\n if (counts.modified > 0) summaryLines.push(`${chalk.yellow(\"✖\")} Modified: ${counts.modified}`);\n if (counts.missing > 0) summaryLines.push(`${chalk.red(\"✖\")} Missing: ${counts.missing}`);\n if (counts.new > 0) summaryLines.push(`${chalk.cyan(\"+\")} New: ${counts.new}`);\n if (counts.tampered > 0) summaryLines.push(`${chalk.red(\"⚠\")} Tampered: ${counts.tampered}`);\n\n const hasIssues = counts.modified > 0 || counts.missing > 0 || counts.tampered > 0;\n\n if (hasIssues) {\n printBox(\"Integrity check failed\", summaryLines, \"error\");\n if (counts.tampered > 0) {\n logError(\"Integrity manifest has been tampered with. Re-run `hatch3r update` to regenerate it.\");\n }\n if (counts.modified > 0) {\n info(`Modified files may have been tampered with. Run ${chalk.bold(\"hatch3r update\")} to restore originals.`);\n }\n console.log();\n throw new HatchError(\"Integrity check failed\", 1);\n } else {\n printBox(\"Integrity check passed\", summaryLines, \"success\");\n }\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter } from \"../../adapters/index.js\";\nimport { AGENTS_DIR, HatchError } from \"../../types.js\";\nimport { extractManagedBlock } from \"../../merge/managedBlocks.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n} from \"../shared/ui.js\";\nimport { readWorkspaceManifest } from \"../../workspace/manifest.js\";\n\n/** Recursively sum the byte size of all files under a directory. */\nasync function dirCharCount(dir: string): Promise<number> {\n let total = 0;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n total += await dirCharCount(fullPath);\n } else if (entry.isFile()) {\n const info = await stat(fullPath);\n total += info.size;\n }\n }\n return total;\n}\n\nexport async function statusCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1);\n }\n\n const spinner = createSpinner(\"Checking sync status...\");\n spinner.start();\n\n const stats = { synced: 0, drifted: 0, missing: 0 };\n const fileLines: string[] = [];\n\n for (const tool of manifest.tools) {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(agentsDir, manifest);\n\n fileLines.push(chalk.bold(`${tool}:`));\n\n for (const out of outputs) {\n const destPath = join(rootDir, out.path);\n try {\n const existing = await readFile(destPath, \"utf-8\");\n const existingBlock = extractManagedBlock(existing);\n const expectedBlock = out.managedContent ?? extractManagedBlock(out.content);\n if (existingBlock !== null && expectedBlock !== null ? existingBlock === expectedBlock : existing === out.content) {\n fileLines.push(` ${chalk.green(\"=\")} ${out.path}`);\n stats.synced++;\n } else {\n fileLines.push(` ${chalk.yellow(\"~\")} ${out.path} ${chalk.dim(\"(drifted)\")}`);\n stats.drifted++;\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n fileLines.push(` ${chalk.red(\"+\")} ${out.path} ${chalk.dim(\"(missing)\")}`);\n stats.missing++;\n }\n }\n }\n\n spinner.stop();\n console.log();\n\n for (const line of fileLines) {\n console.log(` ${line}`);\n }\n console.log();\n\n const summaryLines = [\n `${chalk.green(\"=\")} In sync: ${stats.synced}`,\n ];\n if (stats.drifted > 0) {\n summaryLines.push(`${chalk.yellow(\"~\")} Drifted: ${stats.drifted}`);\n }\n if (stats.missing > 0) {\n summaryLines.push(`${chalk.red(\"+\")} Missing: ${stats.missing}`);\n }\n\n // Estimate canonical token count from .agents/ directory size\n const totalChars = await dirCharCount(agentsDir);\n const estimatedTokens = Math.round(totalChars / 4);\n const formattedTokens = estimatedTokens.toLocaleString(\"en-US\");\n summaryLines.push(`${chalk.dim(\"~\")} Estimated canonical tokens: ~${formattedTokens}`);\n\n const style = stats.drifted > 0 || stats.missing > 0 ? \"info\" as const : \"success\" as const;\n printBox(\"Status\", summaryLines, style);\n\n if (stats.drifted > 0 || stats.missing > 0) {\n info(`Run ${chalk.bold(\"hatch3r sync\")} to regenerate drifted/missing files.`);\n console.log();\n }\n\n // ── Workspace topology ──────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (wsManifest && wsManifest.repos.length > 0) {\n const wsLines: string[] = [];\n for (const repo of wsManifest.repos) {\n const icon = repo.sync ? chalk.green(\"\\u2713\") : chalk.dim(\"\\u25CB\");\n let detail: string;\n if (!repo.sync) {\n detail = chalk.dim(\"sync disabled\");\n } else if (repo.lastSync) {\n const elapsed = Math.max(0, Date.now() - new Date(repo.lastSync).getTime());\n const hours = Math.floor(elapsed / (1000 * 60 * 60));\n const timeAgo = hours < 1 ? \"just now\" : hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n detail = `synced ${timeAgo}`;\n } else {\n detail = chalk.yellow(\"never synced\");\n }\n const identity = repo.owner && repo.repo\n ? chalk.dim(`${repo.owner}/${repo.repo}`)\n : \"\";\n const branch = repo.defaultBranch\n ? chalk.dim(`[${repo.defaultBranch}]`)\n : \"\";\n const identityPart = identity || branch ? ` ${identity} ${branch}` : \"\";\n wsLines.push(`${icon} ${repo.name ?? repo.path}${identityPart} ${chalk.dim(`(${detail})`)}`);\n }\n printBox(`Workspace: ${wsManifest.name} (${wsManifest.repos.length} repos)`, wsLines, \"info\");\n }\n\n // Show workspace membership info if this repo is managed by a workspace\n if (manifest.workspace) {\n const wsInfo = [\n `Managed by workspace at ${chalk.bold(manifest.workspace.rootPath)}`,\n `Last synced: ${manifest.workspace.lastSync ? new Date(manifest.workspace.lastSync).toLocaleString() : \"never\"}`,\n ];\n printBox(\"Workspace member\", wsInfo, \"info\");\n }\n}\n"],"mappings":"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","names":["chalk","chalk","join","readFile","execFileSync","chalk","join","dirname","output","stat","join","dirname","join","chalk","readFile","summaryLines","execFileSync","fileURLToPath","readFile","dirname","join","chalk","inquirer","readFile","join","readFile","mkdir","unlink","dirname","randomBytes","readFile","join","resolve","join","resolve","readFile","randomBytes","unlink","mkdir","dirname","readFile","join","readFile","readFile","writeFile","join","join","readFile","writeFile","cp","mkdir","readdir","execFileSync","dirname","join","chalk","dirname","readdir","readFile","join","readFile","lstat","join","parseYaml","join","readdir","readFile","readFile","join","readdir","readFile","join","parseYaml","join","readdir","readFile","parseYaml","dirname","access","join","label","existsSync","dirname","join","readFile","readdir","join","readdir","join","readFile","readFile","readdir","mkdir","join","dirname","label","join","readFile","readdir","mkdir","dirname","join","readdir","readFile","f","mkdir","dirname","dirname","readdir","join","mkdir","cp","execFileSync","chalk","access","cp","mkdir","readFile","readdir","rm","stat","writeFile","dirname","join","fileExists","access","join","readdir","readFile","mkdir","dirname","writeFile","cp","stat","rm","readFile","join","join","readFile","readdir","stat","access","join","dirname","relative","readdir","join","stat","access","createHash","mkdir","access","readFile","join","relative","fileURLToPath","dirname","access","readFile","readdir","join","join","readdir","readFile","access","execFileSync","__dirname","dirname","fileURLToPath","join","readFile","createHash","access","mkdir","relative","readFileSync","readFileSync","__dirname","dirname","fileURLToPath","chalk","inquirer","join","readFile","repo","access","mkdir","readFile","fileURLToPath","basename","dirname","join","chalk","inquirer","__dirname","dirname","fileURLToPath","CONTENT_ROOT","chalk","join","mkdir","readFile","access","inquirer","repoInfo","remoteUrl","platform","owner","repo","namespace","project","tools","features","mcpServers","defaultBranch","projectType","teamSize","contentSelection","orchWarnings","wsManifest","basename","r","stat","readdir","join","execFileSync","chalk","join","stat","readdir","execFileSync","chalk","r","readdir","readFile","access","join","posix","chalk","parseYaml","validateManifest","access","join","readdir","readFile","parseYaml","posix","f","chalk","join","chalk","join","chalk","readFile","readdir","stat","join","chalk","readdir","join","info","stat","chalk","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../../src/version.ts","../../src/cli/shared/ui.ts","../../src/types.ts","../../src/worktree/resolve.ts","../../src/worktree/index.ts","../../src/merge/managedBlocks.ts","../../src/models/customize.ts","../../src/adapters/customization.ts","../../src/merge/safeWrite.ts","../../src/archive/index.ts","../../src/manifest/hatchJson.ts","../../src/models/aliases.ts","../../src/models/resolve.ts","../../src/adapters/canonical.ts","../../src/cli/shared/agentsContent.ts","../../src/adapters/mcp-utils.ts","../../src/hooks/types.ts","../../src/hooks/index.ts","../../src/adapters/base.ts","../../src/adapters/agentsmd.ts","../../src/adapters/aider.ts","../../src/adapters/amazonq.ts","../../src/adapters/amp.ts","../../src/adapters/antigravity.ts","../../src/adapters/claude.ts","../../src/adapters/cline.ts","../../src/adapters/toml-utils.ts","../../src/adapters/codex.ts","../../src/detect/packageManager.ts","../../src/adapters/copilot.ts","../../src/adapters/cursor.ts","../../src/adapters/gemini.ts","../../src/adapters/goose.ts","../../src/adapters/kiro.ts","../../src/adapters/opencode.ts","../../src/adapters/windsurf.ts","../../src/adapters/zed.ts","../../src/adapters/index.ts","../../src/env/mcpEnv.ts","../../src/cli/shared/paths.ts","../../src/integrity/index.ts","../../src/content/tags.ts","../../src/content/index.ts","../../src/version/compare.ts","../../src/version/checkpoints.ts","../../src/pipeline/failureLog.ts","../../src/cli/commands/update.ts","../../src/cli/index.ts","../../src/cli/commands/add.ts","../../src/cli/commands/worktreeSetup.ts","../../src/cli/commands/worktreeCleanup.ts","../../src/cli/commands/clean.ts","../../src/clean/index.ts","../../src/workspace/detect.ts","../../src/workspace/types.ts","../../src/cli/commands/init.ts","../../src/detect/repoAnalyzer.ts","../../src/cli/shared/constants.ts","../../src/content/presets.ts","../../src/workspace/manifest.ts","../../src/workspace/sync.ts","../../src/workspace/resolve.ts","../../src/workspace/git.ts","../../src/pipeline/observability.ts","../../src/cli/commands/config.ts","../../src/cli/commands/sync.ts","../../src/adapters/contextBudget.ts","../../src/cli/commands/validate.ts","../../src/content/learningsValidation.ts","../../src/env/secretDetection.ts","../../src/pipeline/agentToolAllowlist.ts","../../src/pipeline/reviewLoop.ts","../../src/pipeline/promptGuard.ts","../../src/pipeline/pipelineTimeout.ts","../../src/pipeline/complianceVerification.ts","../../src/cli/commands/verify.ts","../../src/cli/commands/status.ts"],"sourcesContent":["declare const __VERSION__: string;\nexport const HATCH3R_VERSION = __VERSION__;\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport boxen from \"boxen\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\n\nconst CYAN = chalk.hex(\"#06b6d4\");\nconst DIM_CYAN = chalk.hex(\"#67e8f9\");\n\nconst SHADOW_CHARS = new Set(\"╔═╗╚╝║\");\n\nfunction gradient(\n text: string,\n from: [number, number, number],\n to: [number, number, number],\n): string {\n const chars = [...text];\n const len = chars.filter((c) => c !== \" \").length;\n let idx = 0;\n return chars\n .map((c) => {\n if (c === \" \") return c;\n const t = len > 1 ? idx / (len - 1) : 0;\n idx++;\n const r = Math.round(from[0] + (to[0] - from[0]) * t);\n const g = Math.round(from[1] + (to[1] - from[1]) * t);\n const b = Math.round(from[2] + (to[2] - from[2]) * t);\n if (SHADOW_CHARS.has(c)) {\n const DIM = 0.55;\n return chalk.rgb(\n Math.round(r * DIM),\n Math.round(g * DIM),\n Math.round(b * DIM),\n )(c);\n }\n return chalk.rgb(r, g, b).bold(c);\n })\n .join(\"\");\n}\n\n// ANSI Shadow style — 6-row glyphs with 3D depth via block + box-drawing chars\nconst LOGO = [\n \"██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗██████╗ ██████╗ \",\n \"██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║╚════██╗██╔══██╗\",\n \"███████║███████║ ██║ ██║ ███████║ █████╔╝██████╔╝\",\n \"██╔══██║██╔══██║ ██║ ██║ ██╔══██║ ╚═══██╗██╔══██╗\",\n \"██║ ██║██║ ██║ ██║ ╚██████╗██║ ██║██████╔╝██║ ██║\",\n \"╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝\",\n].map((row) => gradient(row, [6, 182, 212], [20, 184, 166]));\n\nfunction buildBanner(): string[] {\n const lines: string[] = [\"\"];\n for (const row of LOGO) {\n lines.push(` ${row}`);\n }\n lines.push(` ${DIM_CYAN(\"Crack the egg. Hatch better agents.\")}`);\n lines.push(` ${chalk.dim(`v${HATCH3R_VERSION}`)}`);\n lines.push(\"\");\n return lines;\n}\n\nconst BANNER_LINES = buildBanner();\n\nexport function printBanner(compact = false): void {\n if (compact) {\n console.log(\n `\\n ${CYAN.bold(\"hatch3r\")} ${chalk.dim(`v${HATCH3R_VERSION}`)}\\n`,\n );\n return;\n }\n for (const line of BANNER_LINES) {\n console.log(line);\n }\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n spinner: \"dots\",\n indent: 2,\n });\n}\n\nexport function printBox(\n title: string,\n lines: string[],\n style: \"success\" | \"info\" | \"error\" = \"info\",\n): void {\n const colors = {\n success: \"#10b981\" as const,\n info: \"#06b6d4\" as const,\n error: \"#ef4444\" as const,\n };\n const content = lines.join(\"\\n\");\n console.log(\n boxen(content, {\n title,\n titleAlignment: \"left\",\n padding: { top: 0, bottom: 0, left: 1, right: 1 },\n margin: { top: 0, bottom: 1, left: 1, right: 0 },\n borderColor: colors[style],\n borderStyle: \"round\",\n dimBorder: style === \"info\",\n }),\n );\n}\n\nexport function error(msg: string): void {\n console.log(` ${chalk.red(\"✖\")} ${msg}`);\n}\n\nexport function warn(msg: string): void {\n console.log(` ${chalk.yellow(\"⚠\")} ${msg}`);\n}\n\nexport function info(msg: string): void {\n console.log(` ${CYAN(\"ℹ\")} ${msg}`);\n}\n\nexport function step(n: number, total: number, msg: string): string {\n return `${chalk.dim(`[${n}/${total}]`)} ${msg}`;\n}\n\nexport function label(name: string, value: string): string {\n return `${chalk.dim(name.padEnd(12))} ${value}`;\n}\n\n/** Whether verbose output is enabled for the current command. */\nlet verboseEnabled = false;\n\n/** Enable or disable verbose output. Call before command execution. */\nexport function setVerbose(enabled: boolean): void {\n verboseEnabled = enabled;\n}\n\n/** Print a verbose-only message to stderr. No-op when verbose is off. */\nexport function verbose(msg: string): void {\n if (!verboseEnabled) return;\n console.error(` ${chalk.dim(\"[verbose]\")} ${msg}`);\n}\n\n/**\n * D19 Medium (#415-#431): Display a success message with next-steps guidance.\n * Used after init/update to reduce first-run friction.\n */\nexport function printNextSteps(steps: string[]): void {\n if (steps.length === 0) return;\n console.log(chalk.dim(\"\\n Next steps:\"));\n for (const s of steps) {\n console.log(chalk.dim(` ${s}`));\n }\n console.log();\n}\n\n/**\n * D19 Medium (#415-#431): Print a compact timing summary.\n * Used at the end of sync/validate to show elapsed time.\n */\nexport function printTimingSummary(startMs: number): void {\n const elapsed = Date.now() - startMs;\n const seconds = (elapsed / 1000).toFixed(1);\n console.log(chalk.dim(` Completed in ${seconds}s\\n`));\n}\n","export type Platform = \"github\" | \"azure-devops\" | \"gitlab\";\n\nexport interface ModelConfig {\n default?: string;\n agents?: Record<string, string>;\n}\n\nexport interface ClaudeConfig {\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n /**\n * Claude Code Agent Teams teammate display mode.\n *\n * GA values: \"auto\" (default), \"in-process\", \"tmux\".\n * Deprecated values (pre-GA): \"tool-using\", \"full-trust\", \"manual-approval\".\n * #264 (D9-9.35): Legacy values are still accepted for backward compatibility\n * but map to \"auto\" at runtime. Use GA values in new configurations.\n */\n teammateMode?: \"auto\" | \"in-process\" | \"tmux\" | \"tool-using\" | \"full-trust\" | \"manual-approval\";\n agentTeams?: boolean | \"ga\";\n}\n\n/** Controls how adapter output is generated (verbosity), not what content is selected. */\nexport type GenerationMode = \"standard\" | \"minimal\";\n\nexport interface CostTrackingConfig {\n /** Maximum estimated cost per session in configured currency. */\n sessionBudget?: number;\n /** Maximum estimated cost per issue in configured currency. */\n issueBudget?: number;\n /** Maximum estimated cost per epic in configured currency. */\n epicBudget?: number;\n /** Currency code for cost display (default: \"USD\"). */\n currency?: string;\n /** Budget percentage thresholds that trigger warnings (default: [0.5, 0.75, 0.9]). */\n warningThresholds?: number[];\n /** When true, halt work when budget is exhausted. When false, warn only (default: false). */\n hardStop?: boolean;\n}\n\nexport interface HatchManifest {\n version: string;\n hatch3rVersion: string;\n platform?: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n board?: BoardConfig;\n repos?: RepoEntry[];\n packages?: PackageEntry[];\n hooks?: HooksConfig;\n models?: ModelConfig;\n claude?: ClaudeConfig;\n /** Token usage and cost tracking configuration. */\n costTracking?: CostTrackingConfig;\n /** Content selection from init. undefined = legacy \"full\" (backward compat). */\n content?: ContentSelection;\n /** Detected project languages from repo analysis. */\n languages?: string[];\n /** Git worktree file-isolation settings. */\n worktree?: WorktreeConfig;\n /** Tracks project specs generated by /project-spec or /api-spec commands. */\n specs?: {\n paths: string[];\n lastGenerated?: string;\n };\n /** Present when this repo is managed by a workspace. */\n workspace?: {\n /** Relative path from this repo back to workspace root. */\n rootPath: string;\n /** ISO timestamp of last workspace sync. */\n lastSync: string;\n /** hatch3r version used for last sync. */\n syncVersion: string;\n /** SHA-256 of workspace.json at time of sync. */\n workspaceChecksum: string;\n /** Content IDs explicitly excluded by this repo. */\n excludedContent?: string[];\n /** Content IDs added locally (not from workspace). */\n localContent?: string[];\n };\n managedFiles: string[];\n}\n\nexport interface WorktreeConfig {\n enabled: boolean;\n /** Additional user-specified gitignore patterns to include. */\n extraPatterns?: string[];\n /** Strategy for node_modules: \"symlink\" (default) or \"skip\". */\n nodeModules?: \"symlink\" | \"skip\";\n}\n\nexport const TOOLS = [\"cursor\", \"copilot\", \"claude\", \"opencode\", \"windsurf\", \"amp\", \"codex\", \"gemini\", \"cline\", \"aider\", \"kiro\", \"goose\", \"zed\", \"amazon-q\", \"antigravity\", \"agents-md\"] as const;\nexport type Tool = (typeof TOOLS)[number];\nexport const VALID_TOOLS = new Set<string>(TOOLS);\nexport const TOOL_CHOICES = TOOLS.join(\", \");\n\n/** Tools that support git worktree file isolation. Shared across init, update, and config. */\nexport const WORKTREE_CAPABLE_TOOLS = new Set<string>([\"claude\"]);\n\nexport interface BoardConfig {\n owner: string;\n repo: string;\n /** Default branch for checkout, PR base, and release. Fallback: \"main\". */\n defaultBranch?: string;\n projectNumber: number | null;\n statusFieldId: number | null;\n statusOptions: {\n backlog: string | null;\n ready: string | null;\n inProgress: string | null;\n inReview: string | null;\n done: string | null;\n };\n labels: {\n types: string[];\n executors: string[];\n statuses: string[];\n meta: string[];\n };\n branchConvention: string;\n areas: string[];\n}\n\nexport interface RepoEntry {\n owner: string;\n repo: string;\n name?: string;\n}\n\nexport interface PackageEntry {\n name: string;\n path: string;\n}\n\nexport interface Features {\n agents: boolean;\n skills: boolean;\n rules: boolean;\n prompts: boolean;\n commands: boolean;\n mcp: boolean;\n githubAgents: boolean;\n hooks: boolean;\n}\n\nexport interface McpConfig {\n servers: string[];\n}\n\nexport interface HooksConfig {\n enabled: boolean;\n}\n\nexport interface CanonicalFile {\n id: string;\n type: \"rule\" | \"agent\" | \"skill\" | \"command\" | \"prompt\" | \"github-agent\" | \"hook\";\n description: string;\n scope?: string;\n model?: string;\n protected?: boolean;\n /** Agent runs with restricted write permissions (Cursor v2.5+ subagents). */\n readonly?: boolean;\n /** Agent runs in background without blocking the parent (Cursor v2.5+ async subagents). */\n background?: boolean;\n tags?: string[];\n content: string;\n rawContent: string;\n sourcePath: string;\n}\n\nexport interface CanonicalMetadata {\n id: string;\n type: string;\n description: string;\n name?: string;\n scope?: string;\n model?: string;\n agent?: string;\n event?: string;\n globs?: string;\n protected?: boolean;\n alwaysApply?: boolean;\n /** Agent runs with restricted write permissions (Cursor v2.5+ subagents). */\n readonly?: boolean;\n /** Agent runs in background without blocking the parent (Cursor v2.5+ async subagents). */\n background?: boolean;\n tags?: string[];\n}\n\nexport interface ContentSelection {\n preset: \"minimal\" | \"standard\" | \"full\" | \"custom\";\n projectType: \"greenfield\" | \"brownfield\";\n teamSize: \"solo\" | \"team\";\n /** Explicit list of selected content IDs (without hatch3r- prefix).\n * Populated for all presets — the resolved result of preset + context filters. */\n items: {\n agents: string[];\n skills: string[];\n rules: string[];\n commands: string[];\n prompts: string[];\n hooks: string[];\n githubAgents: string[];\n };\n}\n\nexport interface AdapterOutput {\n path: string;\n content: string;\n /** Inner content for the managed block (used for merge on update). */\n managedContent?: string;\n action: \"create\" | \"update\" | \"skip\";\n}\n\nexport interface MergeResult {\n path: string;\n action: \"created\" | \"updated\" | \"skipped\";\n warning?: string;\n}\n\nexport type Framework =\n | \"next\"\n | \"angular\"\n | \"vue\"\n | \"svelte\"\n | \"sveltekit\"\n | \"remix\"\n | \"astro\"\n | \"nuxt\"\n | \"react\"\n | \"express\"\n | \"fastify\"\n | \"hono\"\n | \"nestjs\"\n | \"django\"\n | \"flask\"\n | \"rails\"\n | \"spring\"\n | \"laravel\";\n\nexport interface RepoInfo {\n languages: string[];\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | \"unknown\";\n frameworks: Framework[];\n isMonorepo: boolean;\n hasExistingAgents: boolean;\n existingTools: Tool[];\n rootDir: string;\n /** D14 Medium (#14.5): Detected linter/formatter tools. */\n linters?: string[];\n /** D14 Medium (#14.6): Detected test framework(s). */\n testFrameworks?: string[];\n /** D14 Medium (#14.7): Detected CI provider(s). */\n ciProviders?: string[];\n}\n\nexport const MANAGED_BLOCK_START = \"<!-- HATCH3R:BEGIN -->\";\nexport const MANAGED_BLOCK_END = \"<!-- HATCH3R:END -->\";\nexport const HATCH3R_PREFIX = \"hatch3r-\";\nexport const AGENTS_DIR = \".agents\";\nexport const ARCHIVE_DIR = \".hatch3r-archive\";\nexport const CUSTOMIZE_DIR = \".hatch3r\";\n\n/** Structured error codes for programmatic error handling (e.g., CI scripts). */\nexport type HatchErrorCode =\n | \"VALIDATION_ERROR\"\n | \"CONFIG_ERROR\"\n | \"FS_ERROR\"\n | \"INTEGRITY_ERROR\"\n | \"ADAPTER_ERROR\"\n | \"NETWORK_ERROR\"\n | \"CLEAN_ERROR\"\n | \"UNKNOWN_ERROR\";\n\nexport class HatchError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number = 1,\n public readonly errorCode: HatchErrorCode = \"UNKNOWN_ERROR\",\n ) {\n super(message);\n this.name = \"HatchError\";\n }\n}\n\n/** Remove characters that are not alphanumeric, dot, hyphen, or underscore from an ID. */\nexport function sanitizeId(id: string): string {\n return id.replace(/[^a-zA-Z0-9._-]/g, \"\");\n}\n\n/** Returns id with exactly one hatch3r- prefix (strips existing prefix before adding). */\nexport function toPrefixedId(id: string, prefix = HATCH3R_PREFIX): string {\n const base = id.replace(new RegExp(`^${prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`), \"\");\n return `${prefix}${base}`;\n}\nexport const MANIFEST_FILE = \"hatch.json\";\nexport const WORKTREE_INCLUDE_FILE = \".worktreeinclude\";\n\nexport const DEFAULT_FEATURES: Features = {\n agents: true,\n skills: true,\n rules: true,\n prompts: true,\n commands: true,\n mcp: true,\n githubAgents: true,\n hooks: true,\n};\n\nexport interface McpServerMeta {\n description: string;\n requiresEnv?: string[];\n}\n\nexport const ENV_VAR_HELP: Record<string, { comment: string; url: string }> = {\n GITHUB_PAT: {\n comment: \"GitHub MCP server — Classic PAT: repo, read:org, project. Fine-grained: Contents(RW), Issues(RW), Pull Requests(RW), Projects(RW)\",\n url: \"https://github.com/settings/tokens/new\",\n },\n AZURE_DEVOPS_PAT: {\n comment: \"Azure DevOps Personal Access Token (Work Items, Code, Build RW)\",\n url: \"https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate\",\n },\n AZURE_DEVOPS_ORG: {\n comment: \"Azure DevOps organization name\",\n url: \"https://dev.azure.com/\",\n },\n GITLAB_TOKEN: {\n comment: \"GitLab Personal Access Token (api scope)\",\n url: \"https://gitlab.com/-/user_settings/personal_access_tokens\",\n },\n BRAVE_API_KEY: {\n comment: \"Brave Search (free: 2,000 queries/month)\",\n url: \"https://brave.com/search/api/\",\n },\n SENTRY_AUTH_TOKEN: {\n comment: \"Sentry error tracking\",\n url: \"https://sentry.io/settings/account/api/auth-tokens/\",\n },\n POSTGRES_URL: {\n comment: \"PostgreSQL connection string (e.g. postgresql://user:pass@host:5432/db)\",\n url: \"\",\n },\n LINEAR_API_KEY: {\n comment: \"Linear issue tracking\",\n url: \"https://linear.app/settings/api\",\n },\n};\n\nexport const AVAILABLE_MCP_SERVERS: Record<string, McpServerMeta> = {\n github: {\n description:\n \"GitHub repository management, code review, issues, PRs, and project boards\",\n requiresEnv: [\"GITHUB_PAT\"],\n },\n \"azure-devops\": {\n description:\n \"Azure DevOps work items, repos, pipelines, and boards\",\n requiresEnv: [\"AZURE_DEVOPS_PAT\", \"AZURE_DEVOPS_ORG\"],\n },\n gitlab: {\n description:\n \"GitLab issues, merge requests, pipelines, and project management\",\n requiresEnv: [\"GITLAB_TOKEN\"],\n },\n context7: {\n description:\n \"Up-to-date, version-specific library documentation for LLMs\",\n },\n filesystem: {\n description: \"File management and code editing operations\",\n },\n playwright: {\n description: \"Browser automation, web testing, and UI interaction\",\n },\n \"brave-search\": {\n description:\n \"Web research, fact-checking, and current information retrieval\",\n requiresEnv: [\"BRAVE_API_KEY\"],\n },\n sentry: {\n description:\n \"Error tracking and performance monitoring (enable and configure with your Sentry auth token)\",\n requiresEnv: [\"SENTRY_AUTH_TOKEN\"],\n },\n postgres: {\n description:\n \"PostgreSQL database queries and schema inspection (enable and configure with your connection string)\",\n requiresEnv: [\"POSTGRES_URL\"],\n },\n linear: {\n description:\n \"Linear issue tracking and project management (enable and configure with your Linear API key)\",\n requiresEnv: [\"LINEAR_API_KEY\"],\n },\n};\n","import { execFileSync } from \"node:child_process\";\nimport { statSync, readFileSync, writeFileSync, unlinkSync } from \"node:fs\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\n\n/**\n * Writes the given gitignore-style patterns to a temp file, then runs\n * `git ls-files --others --ignored --exclude-from=<tmpfile>` to resolve\n * them against the working tree. Returns the matched file paths.\n */\nexport async function resolvePatterns(\n rootDir: string,\n patterns: string[],\n): Promise<string[]> {\n if (patterns.length === 0) return [];\n\n const tmpFile = join(\n tmpdir(),\n `hatch3r-worktree-${randomBytes(4).toString(\"hex\")}`,\n );\n\n try {\n writeFileSync(tmpFile, patterns.join(\"\\n\") + \"\\n\", \"utf-8\");\n\n const output = execFileSync(\n \"git\",\n [\"ls-files\", \"--others\", \"--ignored\", `--exclude-from=${tmpFile}`],\n { cwd: rootDir, encoding: \"utf-8\", maxBuffer: 10 * 1024 * 1024 },\n );\n\n return output\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n } catch (err) {\n console.error(`[hatch3r] worktree pattern resolution failed: ${(err as Error).message}`);\n return [];\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n // Temp file may already be gone\n }\n }\n}\n\n/**\n * Checks whether the given directory is inside a git worktree (as opposed to\n * the main repo). In a worktree, `.git` is a *file* containing `gitdir: ...`\n * rather than a directory.\n */\nexport function isInsideWorktree(dir: string): boolean {\n try {\n const stat = statSync(join(dir, \".git\"));\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Given a worktree directory, reads the `.git` file, parses the `gitdir:`\n * pointer, and traverses up to find the main repo root.\n *\n * The gitdir typically points to `.git/worktrees/<name>`, so we go up 3\n * levels to reach the main repo root.\n *\n * @throws if the `.git` file can't be read or parsed.\n */\nexport function findMainWorktree(worktreeDir: string): string {\n const gitFilePath = join(worktreeDir, \".git\");\n const content = readFileSync(gitFilePath, \"utf-8\").trim();\n\n const match = content.match(/^gitdir:\\s*(.+)$/m);\n if (!match) {\n throw new Error(\n `Unable to parse .git file in ${worktreeDir}: expected \"gitdir: <path>\"`,\n );\n }\n\n // gitdir points to <main-repo>/.git/worktrees/<name>\n // Resolve relative paths against the worktree directory, then go up 3 levels.\n const rawGitdir = match[1].trim();\n const absGitdir = resolve(worktreeDir, rawGitdir);\n\n // Traverse: .git/worktrees/<name> → .git/worktrees → .git → repo root\n const mainRoot = dirname(dirname(dirname(absGitdir)));\n return mainRoot;\n}\n\n/**\n * Checks whether a path is gitignored in the given repository root.\n * Runs `git check-ignore -q <path>` — exit code 0 means ignored.\n */\nexport function isGitIgnored(rootDir: string, filePath: string): boolean {\n try {\n execFileSync(\"git\", [\"check-ignore\", \"-q\", filePath], {\n cwd: rootDir,\n stdio: \"ignore\",\n });\n return true;\n } catch {\n return false;\n }\n}\n","import { readFile, mkdir, copyFile, symlink, lstat, unlink } from \"node:fs/promises\";\nimport { join, relative, dirname } from \"node:path\";\nimport {\n MANAGED_BLOCK_START,\n MANAGED_BLOCK_END,\n WORKTREE_INCLUDE_FILE,\n type HatchManifest,\n} from \"../types.js\";\nimport type { WorktreeEntry, WorktreeSetupResult } from \"./types.js\";\nimport { resolvePatterns, findMainWorktree } from \"./resolve.js\";\n\n// ─── Adapter worktree patterns ───────────────────────────────────────────────\n\n/**\n * Per-tool adapter output patterns that should be present in worktrees.\n * All use \"copy\" strategy so worktrees can run `hatch3r sync` independently\n * without cross-worktree contamination via symlinks.\n *\n * Including patterns for files that are tracked by git is harmless —\n * `resolvePatterns` uses `git ls-files --others --ignored` which only matches\n * untracked+gitignored files, so tracked patterns are a no-op safety net.\n */\nexport const ADAPTER_WORKTREE_PATTERNS: Record<\n string,\n { pattern: string; strategy: \"copy\" | \"symlink\"; reason: string }[]\n> = {\n claude: [\n { pattern: \"CLAUDE.md\", strategy: \"copy\", reason: \"Claude main instructions\" },\n { pattern: \".claude/\", strategy: \"copy\", reason: \"Claude adapter output (settings, rules, agents, skills, commands)\" },\n { pattern: \".mcp.json\", strategy: \"copy\", reason: \"MCP server config\" },\n ],\n gemini: [\n { pattern: \"GEMINI.md\", strategy: \"copy\", reason: \"Gemini main instructions\" },\n { pattern: \".gemini/\", strategy: \"copy\", reason: \"Gemini adapter output (settings, commands, skills)\" },\n ],\n cursor: [\n { pattern: \".cursor/\", strategy: \"copy\", reason: \"Cursor adapter output (rules, agents, skills, commands, MCP)\" },\n ],\n copilot: [\n { pattern: \".github/copilot-instructions.md\", strategy: \"copy\", reason: \"Copilot instructions\" },\n { pattern: \".github/instructions/\", strategy: \"copy\", reason: \"Copilot scoped instructions\" },\n { pattern: \".github/agents/\", strategy: \"copy\", reason: \"Copilot agents\" },\n { pattern: \".github/prompts/\", strategy: \"copy\", reason: \"Copilot prompts\" },\n{ pattern: \".github/skills/\", strategy: \"copy\", reason: \"Copilot skills\" },\n { pattern: \".vscode/mcp.json\", strategy: \"copy\", reason: \"VS Code MCP config\" },\n ],\n windsurf: [\n { pattern: \".windsurfrules\", strategy: \"copy\", reason: \"Windsurf main instructions\" },\n { pattern: \".windsurf/\", strategy: \"copy\", reason: \"Windsurf adapter output (rules, skills, workflows, MCP)\" },\n ],\n cline: [\n { pattern: \".roomodes\", strategy: \"copy\", reason: \"Roo Code custom modes\" },\n { pattern: \".roo/\", strategy: \"copy\", reason: \"Roo Code rules and MCP\" },\n { pattern: \".cline/\", strategy: \"copy\", reason: \"Cline skills\" },\n { pattern: \".clinerules/\", strategy: \"copy\", reason: \"Cline workflows\" },\n ],\n amp: [\n { pattern: \".amp/\", strategy: \"copy\", reason: \"Amp adapter output (agents, settings, skills)\" },\n ],\n codex: [\n { pattern: \".codex/\", strategy: \"copy\", reason: \"Codex adapter output (config, skills)\" },\n ],\n opencode: [\n { pattern: \"opencode.json\", strategy: \"copy\", reason: \"OpenCode config\" },\n { pattern: \".opencode/\", strategy: \"copy\", reason: \"OpenCode adapter output (agents, skills, commands)\" },\n ],\n kiro: [\n { pattern: \".kiro/\", strategy: \"copy\", reason: \"Kiro adapter output (steering, settings)\" },\n ],\n aider: [\n { pattern: \"CONVENTIONS.md\", strategy: \"copy\", reason: \"Aider conventions\" },\n { pattern: \".aider.conf.yml\", strategy: \"copy\", reason: \"Aider config\" },\n { pattern: \".aider/\", strategy: \"copy\", reason: \"Aider skills\" },\n ],\n goose: [\n { pattern: \".goosehints\", strategy: \"copy\", reason: \"Goose instructions\" },\n { pattern: \".goose/\", strategy: \"copy\", reason: \"Goose MCP config\" },\n ],\n zed: [\n { pattern: \".rules\", strategy: \"copy\", reason: \"Zed rules\" },\n ],\n \"amazon-q\": [\n { pattern: \".amazonq/\", strategy: \"copy\", reason: \"Amazon Q adapter output (rules, settings)\" },\n ],\n antigravity: [\n { pattern: \".antigravity/\", strategy: \"copy\", reason: \"Antigravity adapter output (rules, skills, settings)\" },\n ],\n \"agents-md\": [\n { pattern: \"AGENTS.md\", strategy: \"copy\", reason: \"AGENTS.md agent instructions\" },\n ],\n};\n\n// ─── Generate ────────────────────────────────────────────────────────────────\n\n/**\n * Builds the `.worktreeinclude` file content with managed blocks.\n * Each entry is annotated with a strategy suffix (`# hatch3r:symlink` or\n * implicit copy) so that `parseWorktreeInclude` can reconstruct the plan.\n */\nexport async function generateWorktreeInclude(\n manifest: HatchManifest,\n rootDir: string,\n): Promise<string> {\n const lines: string[] = [];\n const entries: { pattern: string; strategy: \"copy\" | \"symlink\"; reason: string }[] = [];\n\n // Always include env files (copy — they contain secrets)\n entries.push({ pattern: \".env\", strategy: \"copy\", reason: \"environment variables\" });\n entries.push({ pattern: \".env.*\", strategy: \"copy\", reason: \"environment variables (includes .env.mcp)\" });\n\n // .agents/ — always include (no-op if tracked by git)\n entries.push({ pattern: \".agents/\", strategy: \"symlink\", reason: \"shared agent definitions\" });\n entries.push({\n pattern: \".agents/learnings/\",\n strategy: \"copy\",\n reason: \"per-worktree learnings (diverge across branches)\",\n });\n\n // AGENTS.md — public agent documentation\n entries.push({ pattern: \"AGENTS.md\", strategy: \"copy\", reason: \"public agent documentation\" });\n\n // docs/specs/ — project specifications (read by agents during implementation and review)\n entries.push({ pattern: \"docs/specs/\", strategy: \"copy\", reason: \"project specifications for agent context\" });\n\n // Tool-specific adapter output patterns\n for (const tool of manifest.tools) {\n const toolPatterns = ADAPTER_WORKTREE_PATTERNS[tool];\n if (toolPatterns) {\n entries.push(...toolPatterns);\n }\n }\n\n // node_modules\n if (manifest.worktree?.nodeModules !== \"skip\") {\n entries.push({\n pattern: \"node_modules/\",\n strategy: \"symlink\",\n reason: \"shared dependencies (saves disk space)\",\n });\n }\n\n // Extra user-specified patterns\n if (manifest.worktree?.extraPatterns) {\n for (const p of manifest.worktree.extraPatterns) {\n entries.push({ pattern: p, strategy: \"copy\", reason: \"user-specified\" });\n }\n }\n\n // Build file content\n lines.push(\"# hatch3r worktree include file\");\n lines.push(\"# Defines which gitignored files should be present in worktrees.\");\n lines.push(\"# Lines with '# hatch3r:symlink' are symlinked; others are copied.\");\n lines.push(\"\");\n lines.push(MANAGED_BLOCK_START);\n\n for (const entry of entries) {\n lines.push(`# ${entry.reason}`);\n if (entry.strategy === \"symlink\") {\n lines.push(`${entry.pattern} # hatch3r:symlink`);\n } else {\n lines.push(entry.pattern);\n }\n }\n\n lines.push(MANAGED_BLOCK_END);\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n// ─── Parse ───────────────────────────────────────────────────────────────────\n\n/**\n * Parses a `.worktreeinclude` file into structured entries.\n * - Skips blank lines and comment-only lines.\n * - Detects `# hatch3r:symlink` suffix to determine strategy.\n */\nexport function parseWorktreeInclude(content: string): WorktreeEntry[] {\n const entries: WorktreeEntry[] = [];\n const lines = content.split(\"\\n\");\n\n let lastComment = \"\";\n\n for (const raw of lines) {\n const line = raw.trim();\n\n // Skip empty lines\n if (!line) {\n lastComment = \"\";\n continue;\n }\n\n // Track comments as potential reasons for the next entry\n if (line.startsWith(\"#\") && !line.includes(\"hatch3r:\")) {\n // Skip managed block markers\n if (line === MANAGED_BLOCK_START || line === MANAGED_BLOCK_END) {\n continue;\n }\n lastComment = line.slice(1).trim();\n continue;\n }\n\n // Also skip raw managed block markers (they don't start with #)\n if (line === MANAGED_BLOCK_START || line === MANAGED_BLOCK_END) {\n continue;\n }\n\n // Parse entry line\n const symlinkSuffix = \"# hatch3r:symlink\";\n const isSymlink = line.includes(symlinkSuffix);\n const pattern = line\n .replace(symlinkSuffix, \"\")\n .trim();\n\n if (pattern) {\n entries.push({\n pattern,\n strategy: isSymlink ? \"symlink\" : \"copy\",\n reason: lastComment || undefined,\n });\n }\n\n lastComment = \"\";\n }\n\n return entries;\n}\n\n// ─── Setup ───────────────────────────────────────────────────────────────────\n\n/**\n * Sets up a worktree by reading `.worktreeinclude` from the main root,\n * resolving patterns against the working tree, and copying or symlinking\n * each matched file into the worktree root.\n */\nexport async function setupWorktree(\n mainRoot: string,\n worktreeRoot: string,\n options: { force?: boolean } = {},\n): Promise<WorktreeSetupResult> {\n const result: WorktreeSetupResult = {\n copied: [],\n symlinked: [],\n skipped: [],\n errors: [],\n };\n\n const includePath = join(mainRoot, WORKTREE_INCLUDE_FILE);\n let content: string;\n try {\n content = await readFile(includePath, \"utf-8\");\n } catch {\n result.errors.push(`Could not read ${WORKTREE_INCLUDE_FILE} from ${mainRoot}`);\n return result;\n }\n\n const entries = parseWorktreeInclude(content);\n if (entries.length === 0) return result;\n\n const patterns: string[] = [];\n for (const entry of entries) {\n patterns.push(entry.pattern);\n }\n\n // Resolve patterns to actual files\n const resolvedPaths = await resolvePatterns(mainRoot, patterns);\n\n for (const relPath of resolvedPaths) {\n const srcPath = join(mainRoot, relPath);\n const destPath = join(worktreeRoot, relPath);\n\n // Determine strategy: find the most specific matching pattern\n let strategy: \"copy\" | \"symlink\" = \"copy\";\n for (const entry of entries) {\n const pat = entry.pattern.replace(/\\/$/, \"\");\n if (relPath === pat || relPath.startsWith(pat + \"/\") || relPath === entry.pattern) {\n strategy = entry.strategy;\n // Don't break — later entries can override (e.g., .agents/learnings/ overrides .agents/)\n }\n }\n\n try {\n // Skip if destination already exists (idempotent re-run), unless --force\n let destExists = false;\n try {\n await lstat(destPath);\n destExists = true;\n } catch {\n // Doesn't exist — proceed\n }\n if (destExists && !options.force) {\n result.skipped.push(relPath);\n continue;\n }\n if (destExists && options.force) {\n // Remove existing file/symlink before overwriting\n await unlink(destPath);\n }\n\n await mkdir(dirname(destPath), { recursive: true });\n\n if (strategy === \"symlink\") {\n const relTarget = relative(dirname(destPath), srcPath);\n try {\n await symlink(relTarget, destPath);\n result.symlinked.push(relPath);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"EPERM\") {\n // Fall back to copy on permission errors (e.g., Windows without dev mode)\n await copyFile(srcPath, destPath);\n result.copied.push(relPath);\n } else if (code === \"EEXIST\") {\n result.skipped.push(relPath);\n } else {\n throw err;\n }\n }\n } else {\n await copyFile(srcPath, destPath);\n result.copied.push(relPath);\n }\n } catch (err) {\n result.errors.push(`${relPath}: ${(err as Error).message}`);\n }\n }\n\n return result;\n}\n\n// ─── Cleanup ─────────────────────────────────────────────────────────────────\n\n/**\n * Removes symlinks and copied files that were created by `setupWorktree`.\n * Reads the `.worktreeinclude` from the worktree root (it may have been\n * symlinked or copied in), falling back to the main worktree if not found.\n *\n * #110: Handles both symlink and copy strategy entries. Symlinks are always\n * removed; copied files are only removed if they are exact matches of the\n * source (not user-modified).\n */\nexport async function cleanupWorktree(worktreeRoot: string): Promise<void> {\n let content: string | null = null;\n let mainRoot: string | null = null;\n\n // Try reading from the worktree itself first\n const localPath = join(worktreeRoot, WORKTREE_INCLUDE_FILE);\n try {\n content = await readFile(localPath, \"utf-8\");\n } catch {\n // Not found locally — try the main worktree\n try {\n mainRoot = findMainWorktree(worktreeRoot);\n content = await readFile(join(mainRoot, WORKTREE_INCLUDE_FILE), \"utf-8\");\n } catch {\n // Can't find include file anywhere — nothing to clean up\n return;\n }\n }\n\n if (!content) return;\n if (!mainRoot) {\n try { mainRoot = findMainWorktree(worktreeRoot); } catch { /* no main root */ }\n }\n\n const entries = parseWorktreeInclude(content);\n\n for (const entry of entries) {\n const targetPath = join(worktreeRoot, entry.pattern.replace(/\\/$/, \"\"));\n try {\n const stat = await lstat(targetPath);\n if (stat.isSymbolicLink()) {\n await unlink(targetPath);\n } else if (entry.strategy === \"copy\" && stat.isFile() && mainRoot) {\n // Only remove copied files that match the source (not user-modified)\n const sourcePath = join(mainRoot, entry.pattern.replace(/\\/$/, \"\"));\n try {\n const sourceContent = await readFile(sourcePath, \"utf-8\");\n const targetContent = await readFile(targetPath, \"utf-8\");\n if (sourceContent === targetContent) {\n await unlink(targetPath);\n }\n } catch {\n // Source not readable or target not readable — skip\n }\n }\n } catch {\n // Path doesn't exist or can't be stat'd — skip\n }\n }\n}\n\n// ─── Managed content ─────────────────────────────────────────────────────────\n\n/**\n * Extracts the inner content between `MANAGED_BLOCK_START` and\n * `MANAGED_BLOCK_END` markers. Used by `safeWriteFile` for merge operations.\n */\nexport function extractManagedContent(fullContent: string): string {\n const startIdx = fullContent.indexOf(MANAGED_BLOCK_START);\n const endIdx = fullContent.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return \"\";\n }\n\n return fullContent\n .substring(startIdx + MANAGED_BLOCK_START.length, endIdx)\n .trim();\n}\n","import { MANAGED_BLOCK_START, MANAGED_BLOCK_END } from \"../types.js\";\n\n/**\n * Replace the content inside an existing managed block with new content.\n *\n * Throws if the managed block markers are missing, duplicated, or misordered.\n */\nexport function insertManagedBlock(\n existingContent: string,\n managedContent: string,\n): string {\n const startIdx = existingContent.indexOf(MANAGED_BLOCK_START);\n const endIdx = existingContent.indexOf(MANAGED_BLOCK_END);\n\n const block = `${MANAGED_BLOCK_START}\\n${managedContent}\\n${MANAGED_BLOCK_END}`;\n\n if (startIdx === -1 || endIdx === -1) {\n throw new Error(\"Content must contain managed block markers (HATCH3R:BEGIN and HATCH3R:END)\");\n }\n\n const secondStart = existingContent.indexOf(MANAGED_BLOCK_START, startIdx + 1);\n const secondEnd = existingContent.indexOf(MANAGED_BLOCK_END, endIdx + 1);\n if (secondStart !== -1) {\n throw new Error(\"Corrupted managed block: duplicate start marker found. Remove the duplicate before syncing.\");\n }\n if (secondEnd !== -1) {\n throw new Error(\"Corrupted managed block: duplicate end marker found. Remove the duplicate before syncing.\");\n }\n\n if (startIdx >= endIdx) {\n throw new Error(\"Corrupted managed block: start marker must appear before end marker\");\n }\n\n const before = existingContent.substring(0, startIdx);\n const after = existingContent.substring(endIdx + MANAGED_BLOCK_END.length);\n return `${before}${block}${after}`;\n}\n\n/** Extract the text between HATCH3R:BEGIN and HATCH3R:END markers, or null if absent. */\nexport function extractManagedBlock(content: string): string | null {\n const startIdx = content.indexOf(MANAGED_BLOCK_START);\n const endIdx = content.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return null;\n }\n\n return content\n .substring(startIdx + MANAGED_BLOCK_START.length, endIdx)\n .trim();\n}\n\n/** Extract user-authored content outside the managed block markers. */\nexport function extractCustomContent(content: string): string {\n const startIdx = content.indexOf(MANAGED_BLOCK_START);\n const endIdx = content.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return content;\n }\n\n const before = content.substring(0, startIdx).trim();\n const after = content.substring(endIdx + MANAGED_BLOCK_END.length).trim();\n return [before, after].filter(Boolean).join(\"\\n\\n\");\n}\n\n/** Wrap content with HATCH3R:BEGIN / HATCH3R:END markers. */\nexport function wrapInManagedBlock(content: string): string {\n return `${MANAGED_BLOCK_START}\\n${content}\\n${MANAGED_BLOCK_END}`;\n}\n\n/** Check whether content contains both managed block start and end markers. */\nexport function hasManagedBlock(content: string): boolean {\n return (\n content.includes(MANAGED_BLOCK_START) &&\n content.includes(MANAGED_BLOCK_END)\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport { sanitizeId } from \"../types.js\";\n\nexport type CustomizableType = \"agents\" | \"skills\" | \"commands\" | \"rules\";\n\nconst MAX_CUSTOMIZE_YAML_BYTES = 10_240;\n\nexport interface Customization {\n model?: string;\n scope?: string;\n description?: string;\n enabled?: boolean;\n}\n\nexport interface CustomizationReadResult {\n value: Customization | undefined;\n warnings: string[];\n}\n\nexport type AgentCustomization = Customization;\n\n/**\n * Read a `.customize.yaml` override for a content item.\n *\n * Looks for `.hatch3r/{type}/{id}.customize.yaml` relative to the project root.\n * Returns undefined if no customization file exists or the file is empty.\n */\nexport async function readCustomization(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<Customization | undefined> {\n const { value } = await readCustomizationWithWarnings(projectRoot, type, id);\n return value;\n}\n\n/**\n * Read a `.customize.yaml` override with structured warnings.\n *\n * Same as {@link readCustomization} but also returns any warnings\n * generated during parsing (e.g. oversized file, YAML errors).\n */\nexport async function readCustomizationWithWarnings(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<CustomizationReadResult> {\n const warnings: string[] = [];\n const safeId = sanitizeId(id);\n const filePath = join(projectRoot, \".hatch3r\", type, `${safeId}.customize.yaml`);\n const resolvedPath = resolve(filePath);\n const resolvedBase = resolve(projectRoot);\n if (!resolvedPath.startsWith(resolvedBase)) {\n return { value: undefined, warnings };\n }\n const path = filePath;\n try {\n const raw = await readFile(path, \"utf-8\");\n if (Buffer.byteLength(raw, \"utf-8\") > MAX_CUSTOMIZE_YAML_BYTES) {\n warnings.push(`Customization YAML for \"${id}\" exceeds ${MAX_CUSTOMIZE_YAML_BYTES} bytes. Skipping.`);\n return { value: undefined, warnings };\n }\n const parsed = parseYaml(raw) as Record<string, unknown> | null;\n if (!parsed || typeof parsed !== \"object\") return { value: undefined, warnings };\n\n const result: Customization = {};\n let hasValue = false;\n\n if (typeof parsed.model === \"string\" && parsed.model.length > 0) {\n result.model = parsed.model;\n hasValue = true;\n }\n if (typeof parsed.scope === \"string\" && parsed.scope.length > 0) {\n result.scope = parsed.scope;\n hasValue = true;\n }\n if (typeof parsed.description === \"string\" && parsed.description.length > 0) {\n result.description = parsed.description;\n hasValue = true;\n }\n if (typeof parsed.enabled === \"boolean\") {\n result.enabled = parsed.enabled;\n hasValue = true;\n }\n\n return { value: hasValue ? result : undefined, warnings };\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\" && !(err instanceof Error && err.name.startsWith(\"YAML\"))) throw err;\n return { value: undefined, warnings };\n }\n}\n\n/** D15 Medium (#15.37): Maximum size for .customize.md files in bytes. */\nconst MAX_CUSTOMIZE_MD_BYTES = 10_240;\n\nexport interface CustomizationMdReadResult {\n value: string | undefined;\n warnings: string[];\n}\n\n/**\n * Read a `.customize.md` content append for a content item.\n *\n * Looks for `.hatch3r/{type}/{id}.customize.md` relative to the project root.\n * Returns undefined if no file exists or the file is empty.\n *\n * D15 Medium (#15.37): Enforces content-length limit at read time so\n * oversized customization files are caught before they reach the adapter.\n */\nexport async function readCustomizationMarkdown(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<string | undefined> {\n const { value } = await readCustomizationMarkdownWithWarnings(projectRoot, type, id);\n return value;\n}\n\n/**\n * Read a `.customize.md` content append with structured warnings.\n *\n * Same as {@link readCustomizationMarkdown} but also returns warnings\n * (e.g. when the file exceeds the byte-length limit).\n */\nexport async function readCustomizationMarkdownWithWarnings(\n projectRoot: string,\n type: CustomizableType,\n id: string,\n): Promise<CustomizationMdReadResult> {\n const warnings: string[] = [];\n const safeId = sanitizeId(id);\n const filePath = join(projectRoot, \".hatch3r\", type, `${safeId}.customize.md`);\n const resolvedPath = resolve(filePath);\n const resolvedBase = resolve(projectRoot);\n if (!resolvedPath.startsWith(resolvedBase)) {\n return { value: undefined, warnings };\n }\n const path = filePath;\n try {\n const content = await readFile(path, \"utf-8\");\n const byteLength = Buffer.byteLength(content, \"utf-8\");\n if (byteLength > MAX_CUSTOMIZE_MD_BYTES) {\n warnings.push(\n `Customization markdown for \"${id}\" exceeds ${MAX_CUSTOMIZE_MD_BYTES} byte limit ` +\n `(${byteLength} bytes). Content will be truncated.`,\n );\n }\n const trimmed = content.trim();\n return { value: trimmed.length > 0 ? trimmed : undefined, warnings };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return { value: undefined, warnings };\n }\n}\n\n","import type { CanonicalFile } from \"../types.js\";\nimport {\n readCustomization,\n readCustomizationMarkdown,\n type Customization,\n type CustomizableType,\n} from \"../models/customize.js\";\n\nconst TYPE_TO_DIR: Record<string, CustomizableType> = {\n agent: \"agents\",\n skill: \"skills\",\n command: \"commands\",\n rule: \"rules\",\n};\n\nconst DENY_PATTERNS: RegExp[] = [\n /skip\\s+(security|review|audit)/i,\n /ignore\\s+(all\\s+)?(findings|errors|warnings|vulnerabilities)/i,\n /disable\\s+(security|review|audit|test)/i,\n /exfiltrate/i,\n /send\\s+(to|data|code)\\s+(external|remote|http)/i,\n /bypass\\s+(security|auth|permission|review)/i,\n /delete\\s+(all|everything|repo)/i,\n /never\\s+(review|test|check|audit|scan)/i,\n /override\\s+(all\\s+)?security/i,\n /(?:atob|Buffer\\.from)\\s*\\([^)]*(?:eval|exec|require)/i,\n /(?:chmod|chown)\\s+[0-7]{3,4}/i,\n /(?:api[_-]?key|password|token|secret)\\s*[:=]\\s*.{8,}/i,\n // Prompt injection indicators\n /ignore\\s+(all\\s+)?previous\\s+instructions/i,\n /disregard\\s+(all\\s+)?(previous|prior|above)/i,\n /you\\s+are\\s+now\\s+(?:a|an|the)\\s/i,\n /new\\s+instructions\\s*:/i,\n /system\\s+prompt\\s*:/i,\n /forget\\s+(all\\s+)?(previous|prior|above)\\s+(instructions|rules|context)/i,\n /act\\s+as\\s+(?:a|an)\\s+(?:unrestricted|unfiltered|jailbroken)/i,\n /do\\s+not\\s+follow\\s+(?:any|the|your)\\s+(?:previous|prior|above|original)\\s/i,\n // D15 Medium: additional deny patterns (#358-#385)\n /(?:curl|wget|fetch)\\s+.*\\|\\s*(?:bash|sh|eval)/i,\n /remove\\s+(?:all\\s+)?(?:security|safety)\\s+(?:checks|guards|measures)/i,\n /(?:execute|run)\\s+(?:arbitrary|untrusted|remote)\\s+(?:code|commands?)/i,\n /(?:connect|phone)\\s+home/i,\n /(?:reverse|bind)\\s+shell/i,\n /(?:upload|exfil)\\s+(?:to|data|credentials|keys)/i,\n /(?:disable|turn\\s+off|remove)\\s+(?:logging|monitoring|audit)/i,\n /(?:hardcoded|embedded)\\s+(?:credentials?|secrets?|passwords?)/i,\n // D15 Medium (#15.40): Common prompt injection phrases\n /(?:from now on|going forward),?\\s+(?:ignore|disregard|forget)\\s/i,\n /pretend\\s+(?:you\\s+are|to\\s+be)\\s+(?:a|an|the)\\s/i,\n /(?:reveal|show|display|output)\\s+(?:your|the)\\s+(?:system\\s+)?(?:prompt|instructions|rules)/i,\n /(?:jailbreak|dan\\s+mode|developer\\s+mode)/i,\n /(?:output|print|write)\\s+(?:the|your)\\s+(?:initial|original|system)\\s+(?:prompt|instructions)/i,\n];\n\nconst ZERO_WIDTH_CHARS = /[\\u200B\\u200C\\u200D\\uFEFF\\u00AD]/g;\n\nconst MAX_CUSTOMIZE_MD_BYTES = 10_240;\nconst MAX_PROTECTED_CUSTOMIZE_MD_BYTES = 2_048;\n\nconst HOMOGLYPH_MAP: Record<string, string> = {\n // Cyrillic → Latin\n '\\u0410': 'A', '\\u0430': 'a', '\\u0412': 'B', '\\u0435': 'e',\n '\\u041A': 'K', '\\u043A': 'k', '\\u041C': 'M', '\\u043C': 'm',\n '\\u041D': 'H', '\\u043E': 'o', '\\u0420': 'P', '\\u0440': 'p',\n '\\u0421': 'C', '\\u0441': 'c', '\\u0422': 'T', '\\u0443': 'y',\n '\\u0425': 'X', '\\u0445': 'x',\n // Greek → Latin\n '\\u0391': 'A', '\\u03B1': 'a', '\\u0392': 'B', '\\u03B2': 'b',\n '\\u0395': 'E', '\\u03B5': 'e', '\\u0397': 'H', '\\u03B7': 'h',\n '\\u0399': 'I', '\\u03B9': 'i', '\\u039A': 'K', '\\u03BA': 'k',\n '\\u039C': 'M', '\\u039D': 'N', '\\u039F': 'O', '\\u03BF': 'o',\n '\\u03A1': 'P', '\\u03C1': 'p', '\\u03A4': 'T', '\\u03C4': 't',\n '\\u03A5': 'Y', '\\u03C5': 'y', '\\u03A7': 'X', '\\u03C7': 'x',\n '\\u0396': 'Z', '\\u03B6': 'z',\n // Armenian → Latin\n '\\u0531': 'A', '\\u0561': 'a', '\\u0532': 'B', '\\u0562': 'b',\n '\\u0533': 'G', '\\u0563': 'g', '\\u0534': 'D', '\\u0564': 'd',\n '\\u0535': 'E', '\\u0565': 'e', '\\u0540': 'H', '\\u0570': 'h',\n '\\u054B': 'J', '\\u057B': 'j', '\\u053D': 'X', '\\u056D': 'x',\n '\\u054D': 'S', '\\u057D': 's', '\\u054F': 'T', '\\u057F': 't',\n '\\u0555': 'O', '\\u0585': 'o', '\\u054C': 'L', '\\u057C': 'l',\n // Cherokee → Latin\n '\\u13A0': 'D', '\\u13A1': 'R', '\\u13A2': 'T', '\\u13A9': 'A',\n '\\u13AB': 'H', '\\u13AC': 'S', '\\u13B3': 'W', '\\u13B7': 'M',\n '\\u13BB': 'G', '\\u13BE': 'P', '\\u13C0': 'V', '\\u13C2': 'B',\n '\\u13C3': 'Y', '\\u13CF': 'E', '\\u13D2': 'J', '\\u13DA': 'K',\n '\\u13DE': 'C', '\\u13DF': 'Z', '\\u13A4': 'O', '\\u13B1': 'I',\n // Georgian → Latin\n '\\u10D0': 'a', '\\u10D1': 'b', '\\u10D2': 'g', '\\u10D3': 'd',\n '\\u10D4': 'e', '\\u10D8': 'i', '\\u10DA': 'l', '\\u10DB': 'm',\n '\\u10DC': 'n', '\\u10DD': 'o', '\\u10DE': 'p', '\\u10E0': 'r',\n '\\u10E1': 's', '\\u10E2': 't', '\\u10E3': 'u', '\\u10E5': 'k',\n '\\u10E8': 'x', '\\u10EE': 'h',\n};\n\nfunction normalizeHomoglyphs(text: string): string {\n // Apply NFKC normalization first to collapse fullwidth and mathematical forms\n const nfkc = text.normalize(\"NFKC\");\n return nfkc\n // Cyrillic, Greek, Armenian, Cherokee, Georgian ranges\n .replace(/[\\u0370-\\u03FF\\u0400-\\u04FF\\u0530-\\u058F\\u10D0-\\u10FF\\u13A0-\\u13FF]/g, (ch) => HOMOGLYPH_MAP[ch] ?? ch)\n .replace(/[\\u2000-\\u200F\\uFEFF]/g, ''); // Remove zero-width characters\n}\n\n/**\n * Strip boundary markers before deny-pattern scanning so markers\n * themselves don't trigger false positives. Covers the actual marker\n * formats used in managed blocks and user customization sections.\n *\n * D15 Medium (#15.20): Fixed marker names — `MANAGED-BLOCK:*` replaced\n * with the correct `HATCH3R:*` format matching `src/types.ts` constants.\n */\nfunction stripBoundaryMarkers(content: string): string {\n return content\n .replace(/<!-- HATCH3R:(BEGIN|END) -->/g, '')\n .replace(/<!-- USER-CUSTOMIZATION:(BEGIN|END) -->/g, '')\n .replace(/<!-- HATCH3R-PHASE:[^>]+ -->/g, '');\n}\n\nfunction collapseNewlines(content: string): string {\n return content.replace(/\\n{3,}/g, '\\n\\n');\n}\n\nfunction normalizeInput(content: string): string {\n return normalizeHomoglyphs(collapseNewlines(stripBoundaryMarkers(content.replace(ZERO_WIDTH_CHARS, \"\"))));\n}\n\nexport function scanForDeniedPatterns(content: string): string[] {\n const normalized = normalizeInput(content);\n const violations: string[] = [];\n for (const pattern of DENY_PATTERNS) {\n const match = normalized.match(pattern);\n if (match) {\n violations.push(`Denied pattern found: \"${match[0]}\"`);\n }\n }\n return violations;\n}\n\nexport interface CustomizationResult {\n content: string;\n skip: boolean;\n overrides: Customization;\n warnings: string[];\n}\n\nasync function applyCustomizationImpl(\n projectRoot: string,\n file: CanonicalFile,\n contentKey: \"content\" | \"rawContent\",\n): Promise<CustomizationResult> {\n const warnings: string[] = [];\n const dir = TYPE_TO_DIR[file.type];\n if (!dir) {\n return { content: file[contentKey], skip: false, overrides: {}, warnings };\n }\n\n const [yaml, md] = await Promise.all([\n readCustomization(projectRoot, dir, file.id),\n readCustomizationMarkdown(projectRoot, dir, file.id),\n ]);\n\n const overrides: Customization = yaml ?? {};\n\n if (file.protected) {\n if (overrides.enabled === false) {\n warnings.push(`Cannot disable protected ${file.type} \"${file.id}\" via customization. Ignoring enabled: false.`);\n return { content: file[contentKey], skip: false, overrides: {}, warnings };\n }\n if (overrides.scope !== undefined || overrides.description !== undefined) {\n if (overrides.scope !== undefined) {\n warnings.push(`Cannot override scope on protected ${file.type} \"${file.id}\" via customization. Using original scope.`);\n }\n if (overrides.description !== undefined) {\n warnings.push(`Cannot override description on protected ${file.type} \"${file.id}\" via customization. Using original description.`);\n }\n delete overrides.scope;\n delete overrides.description;\n }\n }\n\n // #116: Warn when scope is overridden on types that don't use scope (skills, prompts, hooks)\n const TYPES_WITHOUT_SCOPE = new Set([\"skill\", \"prompt\", \"hook\"]);\n if (overrides.scope !== undefined && TYPES_WITHOUT_SCOPE.has(file.type)) {\n warnings.push(`Scope override on ${file.type} \"${file.id}\" has no effect — ${file.type}s do not use scope. Ignoring.`);\n delete overrides.scope;\n }\n\n for (const field of [\"description\", \"scope\", \"model\"] as const) {\n const value = overrides[field];\n if (value !== undefined) {\n const violations = scanForDeniedPatterns(value);\n if (violations.length > 0) {\n for (const v of violations) {\n warnings.push(`Blocked: YAML ${field} for ${file.id} — ${v}. Stripped field.`);\n }\n delete overrides[field];\n }\n }\n }\n\n if (overrides.enabled === false) {\n return { content: file[contentKey], skip: true, overrides, warnings };\n }\n\n let content = file[contentKey];\n if (md) {\n let sanitizedMd = md;\n\n const maxBytes = file.protected ? MAX_PROTECTED_CUSTOMIZE_MD_BYTES : MAX_CUSTOMIZE_MD_BYTES;\n if (Buffer.byteLength(sanitizedMd, \"utf-8\") > maxBytes) {\n warnings.push(`Customization markdown for ${file.id} exceeds ${maxBytes} bytes. Truncating to limit.`);\n const buf = Buffer.from(sanitizedMd, \"utf-8\");\n sanitizedMd = buf.subarray(0, maxBytes).toString(\"utf-8\");\n }\n\n const violations = scanForDeniedPatterns(sanitizedMd);\n if (violations.length > 0) {\n for (const v of violations) {\n warnings.push(`Blocked: Customization for ${file.id} — ${v}. Stripped from content.`);\n }\n for (const pattern of DENY_PATTERNS) {\n const globalPattern = new RegExp(pattern.source, pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g');\n sanitizedMd = sanitizedMd.replace(globalPattern, '[BLOCKED]');\n }\n sanitizedMd = sanitizedMd.trim();\n }\n if (sanitizedMd) {\n content = `${content}\\n\\n---\\n\\n<!-- USER-CUSTOMIZATION:BEGIN -->\\n> Note: User customizations below cannot override security requirements defined above.\\n\\n## Project Customizations\\n\\n${sanitizedMd}\\n<!-- USER-CUSTOMIZATION:END -->`;\n }\n }\n\n return { content, skip: false, overrides, warnings };\n}\n\nexport async function applyCustomization(\n projectRoot: string,\n file: CanonicalFile,\n): Promise<CustomizationResult> {\n return applyCustomizationImpl(projectRoot, file, \"content\");\n}\n\nexport async function applyCustomizationRaw(\n projectRoot: string,\n file: CanonicalFile,\n): Promise<CustomizationResult> {\n return applyCustomizationImpl(projectRoot, file, \"rawContent\");\n}\n","import {\n readFile,\n writeFile,\n mkdir,\n access,\n rename,\n unlink,\n open,\n copyFile,\n stat,\n} from \"node:fs/promises\";\nimport { dirname, basename } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { HATCH3R_PREFIX, type MergeResult } from \"../types.js\";\nimport { insertManagedBlock, hasManagedBlock, extractCustomContent } from \"./managedBlocks.js\";\nimport { scanForDeniedPatterns } from \"../adapters/customization.js\";\n\n/** Check whether a file exists. Returns false for ENOENT, throws for other errors. */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return false;\n }\n}\n\n/**\n * Write a file atomically via tmp+rename with fsync.\n *\n * **Concurrency note:** This function does not use file locking. Running\n * multiple hatch3r processes against the same directory concurrently is\n * unsupported and may produce corrupted output. If you need to sync from\n * multiple terminals, run them sequentially.\n */\nexport async function atomicWriteFile(filePath: string, content: string): Promise<void> {\n const tmpPath = filePath + \".tmp.\" + randomBytes(4).toString(\"hex\");\n try {\n await writeFile(tmpPath, content, \"utf-8\");\n // #239 (D8-8.6): Open with \"r+\" instead of \"r\" so fdatasync operates on a\n // writable file descriptor. Read-only descriptors cause EPERM/EBADF on some\n // platforms (Windows, certain Linux configurations).\n const fh = await open(tmpPath, \"r+\");\n try {\n await fh.datasync();\n } catch (err) {\n // Some filesystems or OS configurations still reject fdatasync (e.g. FAT32,\n // network mounts). The atomic rename provides the safety guarantee; datasync\n // is best-effort durability.\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EPERM\" && code !== \"ENOTSUP\" && code !== \"EINVAL\") throw err;\n } finally {\n await fh.close();\n }\n // Retry with exponential backoff for Windows file-lock contention (EBUSY/EPERM)\n const MAX_RENAME_RETRIES = 4;\n for (let attempt = 0; ; attempt++) {\n try {\n await rename(tmpPath, filePath);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if ((code === \"EBUSY\" || code === \"EPERM\") && attempt < MAX_RENAME_RETRIES) {\n await new Promise((r) => setTimeout(r, 50 * 2 ** attempt));\n continue;\n }\n throw err;\n }\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOSPC\") {\n throw new Error(\n `Not enough disk space to write ${filePath}. Free up space and re-run the command.`,\n );\n }\n // #239 (D8-8.6): Actionable error for EACCES/permission-denied failures.\n if (code === \"EACCES\") {\n throw new Error(\n `Permission denied writing ${filePath}. Check file/directory permissions and ensure the current user has write access.`,\n );\n }\n throw err;\n } finally {\n try {\n await unlink(tmpPath);\n } catch {\n // Temp file already renamed or doesn't exist\n }\n }\n}\n\n/**\n * Safely write or merge a file, preserving user content outside managed blocks.\n *\n * **Concurrency note:** This function relies on {@link atomicWriteFile} which\n * does not acquire file locks. Running multiple hatch3r processes (e.g. two\n * terminal tabs running `hatch3r sync`) against the same target directory at\n * the same time is unsupported. To avoid conflicts, run sync operations\n * sequentially. Workspace sync already processes repos one at a time\n * internally, so a single `hatch3r sync --repos` invocation is safe.\n */\nexport async function safeWriteFile(\n filePath: string,\n content: string,\n options: {\n managedContent?: string;\n /** When true, prepend managed block to existing content if file has no markers (init flow). */\n appendIfNoBlock?: boolean;\n /** When true, always write through regardless of filename prefix. */\n force?: boolean;\n } = {},\n): Promise<MergeResult> {\n await mkdir(dirname(filePath), { recursive: true });\n\n const exists = await fileExists(filePath);\n\n if (!exists) {\n await atomicWriteFile(filePath, content);\n return { path: filePath, action: \"created\" };\n }\n\n const existingContent = await readFile(filePath, \"utf-8\");\n\n if (options.managedContent) {\n if (!hasManagedBlock(existingContent)) {\n if (options.appendIfNoBlock) {\n const prepended = [content.trim(), \"\", existingContent.trimStart()].join(\"\\n\");\n await atomicWriteFile(filePath, prepended);\n return { path: filePath, action: \"updated\" };\n }\n // #144 (D19-15): Improved recovery guidance — avoid suggesting init --force\n return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: managed block markers (HATCH3R:BEGIN/END) missing. To fix: restore the markers around hatch3r content, or move your custom content and re-run hatch3r update.`,\n };\n }\n const customContent = extractCustomContent(existingContent);\n const deniedFindings = customContent ? scanForDeniedPatterns(customContent) : [];\n let merged: string;\n try {\n merged = insertManagedBlock(existingContent, options.managedContent);\n } catch {\n // Managed block is corrupted (duplicate markers, wrong order, etc.).\n // Create a .bak backup before overwriting so user content is not lost.\n // #242 (D8-8.9): Verify backup integrity before proceeding with overwrite.\n const bakPath = filePath + \".bak\";\n await copyFile(filePath, bakPath);\n const srcStat = await stat(filePath);\n const bakStat = await stat(bakPath);\n if (bakStat.size !== srcStat.size) {\n throw new Error(\n `Backup verification failed for ${filePath}: source=${srcStat.size} bytes, backup=${bakStat.size} bytes. ` +\n `Aborting auto-repair to prevent data loss.`,\n );\n }\n await atomicWriteFile(filePath, content);\n return {\n path: filePath,\n action: \"updated\",\n warning: `Auto-repaired corrupted managed block in ${filePath} (backup saved to ${bakPath})`,\n };\n }\n await atomicWriteFile(filePath, merged);\n const result: MergeResult = { path: filePath, action: \"updated\" };\n if (deniedFindings.length > 0) {\n result.warning = `Content outside managed block in ${filePath} contains suspicious patterns: ${deniedFindings.join(\"; \")}`;\n }\n return result;\n }\n\n const fileName = basename(filePath) ?? \"\";\n const isManagedFile = fileName.startsWith(HATCH3R_PREFIX);\n\n if (isManagedFile || options.force) {\n await atomicWriteFile(filePath, content);\n return { path: filePath, action: \"updated\" };\n }\n\n // #144 (D19-15): Improved recovery guidance — avoid suggesting init --force\n return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: managed block markers (HATCH3R:BEGIN/END) missing. To fix: restore the markers around hatch3r content, or move your custom content and re-run hatch3r update.`,\n };\n}\n\n/** Check whether a file path's basename starts with the hatch3r- prefix. */\nexport function isManagedPath(filePath: string): boolean {\n const fileName = basename(filePath) ?? \"\";\n return fileName.startsWith(HATCH3R_PREFIX);\n}\n","import { access, cp, mkdir, open, readFile, readdir, rm, stat } from \"node:fs/promises\";\nimport { dirname, join, sep } from \"node:path\";\nimport type { HatchManifest, Tool } from \"../types.js\";\nimport { ARCHIVE_DIR, HATCH3R_PREFIX, sanitizeId } from \"../types.js\";\nimport { extractCustomContent, hasManagedBlock } from \"../merge/managedBlocks.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\nimport type { CustomizableType } from \"../models/customize.js\";\n\nfunction toPosixPath(p: string): string {\n return sep === \"\\\\\" ? p.replaceAll(\"\\\\\", \"/\") : p;\n}\n\n// ARCHIVE_DIR imported from types.ts\n\nexport interface MigrationNotice {\n from: string;\n to: string;\n type: string;\n id: string;\n}\n\ninterface ParsedOutputPath {\n type: CustomizableType;\n id: string;\n}\n\n// #255 (D9-9.26): Added \"AGENTS.md\" to amp prefixes so archive cleanup catches amp's root-level output.\n// #256 (D9-9.27): Added \".aider/\" to aider prefixes so archive cleanup catches aider's skills subdirectory.\nexport const TOOL_PATH_PREFIXES: Record<Tool, string[]> = {\n cursor: [\".cursor/\"],\n claude: [\".claude/\", \"CLAUDE.md\", \".mcp.json\"],\n copilot: [\".github/copilot-instructions.md\", \".github/workflows/copilot-setup-steps.yml\", \".vscode/mcp.json\", \".github/instructions/\", \".github/agents/\", \".github/prompts/\", \".github/skills/\"],\n windsurf: [\".windsurf/\", \".windsurfrules\"],\n amp: [\".amp/\", \"AGENTS.md\"],\n codex: [\".codex/\"],\n gemini: [\".gemini/\", \"GEMINI.md\"],\n cline: [\".cline/\", \".clinerules/\", \".roo/\", \".roomodes\"],\n aider: [\"CONVENTIONS.md\", \".aider.conf.yml\", \".aider/\"],\n kiro: [\".kiro/\"],\n opencode: [\"opencode.json\", \".opencode/\"],\n goose: [\".goosehints\", \".goose/\"],\n zed: [\".rules\", \".zed/\"],\n \"amazon-q\": [\".amazonq/\"],\n antigravity: [\".antigravity/\"],\n \"agents-md\": [\"AGENTS.md\"],\n};\n\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: CustomizableType }> = [\n { pattern: /\\/rules\\/([^/]+)\\.(mdc|md)$/, type: \"rules\" },\n { pattern: /\\/agents\\/([^/]+)\\.md$/, type: \"agents\" },\n { pattern: /\\/skills\\/([^/]+)\\/SKILL\\.md$/, type: \"skills\" },\n { pattern: /\\/commands\\/([^/]+)\\.md$/, type: \"commands\" },\n];\n\nfunction parseOutputPath(filePath: string): ParsedOutputPath | null {\n for (const { pattern, type } of PATH_PATTERNS) {\n const match = filePath.match(pattern);\n if (match) {\n let id = match[1];\n if (id.startsWith(HATCH3R_PREFIX)) {\n id = id.slice(HATCH3R_PREFIX.length);\n }\n id = sanitizeId(id);\n if (id.length > 0) return { type, id };\n }\n }\n return null;\n}\n\nfunction stripFrontmatter(content: string): string {\n const trimmed = content.trimStart();\n if (trimmed.startsWith(\"---\")) {\n const endIdx = trimmed.indexOf(\"\\n---\", 3);\n if (endIdx !== -1) {\n return trimmed.slice(endIdx + 4).trim();\n }\n }\n return content.trim();\n}\n\nfunction fileMatchesTool(filePath: string, tool: Tool): boolean {\n const prefixes = TOOL_PATH_PREFIXES[tool];\n if (!prefixes) return false;\n return prefixes.some((prefix) =>\n prefix.endsWith(\"/\") ? filePath.startsWith(prefix) : filePath === prefix,\n );\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function collectToolFiles(rootDir: string, tool: Tool): Promise<string[]> {\n const prefixes = TOOL_PATH_PREFIXES[tool];\n if (!prefixes) return [];\n\n const files: string[] = [];\n\n for (const prefix of prefixes) {\n const absPath = join(rootDir, prefix);\n if (prefix.endsWith(\"/\")) {\n try {\n const entries = await readdir(absPath, { recursive: true, withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile()) {\n const parent = entry.parentPath ?? (entry as unknown as { path: string }).path ?? absPath;\n const relPath = toPosixPath(join(prefix, parent.slice(absPath.length), entry.name));\n files.push(relPath);\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else if (await fileExists(absPath)) {\n files.push(prefix);\n }\n }\n\n return files;\n}\n\nexport async function archiveToolOutputs(\n rootDir: string,\n tool: Tool,\n): Promise<{ archivedFiles: string[]; migrations: MigrationNotice[] }> {\n const filesToArchive = await collectToolFiles(rootDir, tool);\n if (filesToArchive.length === 0) {\n return { archivedFiles: [], migrations: [] };\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const archiveBase = join(rootDir, ARCHIVE_DIR, tool, timestamp);\n\n const archivedFiles: string[] = [];\n const migrations: MigrationNotice[] = [];\n\n for (const relPath of filesToArchive) {\n const absPath = join(rootDir, relPath);\n if (!(await fileExists(absPath))) continue;\n\n let content: string;\n try {\n content = await readFile(absPath, \"utf-8\");\n } catch {\n continue;\n }\n\n if (hasManagedBlock(content)) {\n const customContent = stripFrontmatter(extractCustomContent(content));\n if (customContent.length > 0) {\n const parsed = parseOutputPath(relPath);\n if (parsed) {\n const customizePath = join(rootDir, \".hatch3r\", parsed.type, `${parsed.id}.customize.md`);\n if (!(await fileExists(customizePath))) {\n await mkdir(dirname(customizePath), { recursive: true });\n // #241 (D8-8.8): Route through atomicWriteFile for crash-safe migration writes\n await atomicWriteFile(customizePath, customContent + \"\\n\");\n migrations.push({\n from: relPath,\n to: `.hatch3r/${parsed.type}/${parsed.id}.customize.md`,\n type: parsed.type,\n id: parsed.id,\n });\n }\n }\n }\n }\n\n const archiveDest = join(archiveBase, relPath);\n await mkdir(dirname(archiveDest), { recursive: true });\n await cp(absPath, archiveDest);\n // #243 (D8-8.10): Use fd-based stat to avoid TOCTOU race between stat\n // calls. Opening both files and using fh.stat() ensures we read sizes\n // atomically from the same inodes we just wrote/read.\n const srcFh = await open(absPath, \"r\");\n try {\n const destFh = await open(archiveDest, \"r\");\n try {\n const srcStat = await srcFh.stat();\n const destStat = await destFh.stat();\n if (destStat.size !== srcStat.size) {\n throw new Error(`Archive copy size mismatch for ${relPath}: source=${srcStat.size}, dest=${destStat.size}`);\n }\n } finally {\n await destFh.close();\n }\n } finally {\n await srcFh.close();\n }\n await rm(absPath);\n archivedFiles.push(relPath);\n }\n\n await cleanEmptyDirs(rootDir, filesToArchive);\n\n return { archivedFiles, migrations };\n}\n\nexport async function cleanEmptyDirs(rootDir: string, paths: string[]): Promise<void> {\n const dirs = new Set<string>();\n for (const p of paths) {\n let dir = dirname(join(rootDir, p));\n while (dir !== rootDir && dir.length > rootDir.length) {\n dirs.add(dir);\n dir = dirname(dir);\n }\n }\n\n const sorted = [...dirs].sort((a, b) => b.length - a.length);\n for (const dir of sorted) {\n try {\n const entries = await readdir(dir);\n if (entries.length === 0) {\n await rm(dir, { recursive: true });\n }\n } catch {\n // directory may not exist or already removed\n }\n }\n}\n\nexport function removeManagedFilesForPaths(\n manifest: HatchManifest,\n paths: string[],\n): void {\n const pathSet = new Set(paths);\n manifest.managedFiles = manifest.managedFiles.filter((f) => !pathSet.has(f));\n}\n\nexport function getManagedFilesForTool(\n manifest: HatchManifest,\n tool: Tool,\n): string[] {\n return manifest.managedFiles.filter((f) => fileMatchesTool(f, tool));\n}\n\nconst MAX_ARCHIVE_ENTRIES = 5;\n\n/**\n * Prune old archive entries, keeping only the most recent MAX_ARCHIVE_ENTRIES per tool.\n */\nexport async function pruneArchives(rootDir: string): Promise<string[]> {\n const archiveRoot = join(rootDir, ARCHIVE_DIR);\n const pruned: string[] = [];\n\n let toolDirs: string[];\n try {\n toolDirs = await readdir(archiveRoot);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n for (const toolDir of toolDirs) {\n const toolPath = join(archiveRoot, toolDir);\n let entries: string[];\n try {\n const s = await stat(toolPath);\n if (!s.isDirectory()) continue;\n entries = await readdir(toolPath);\n } catch {\n continue;\n }\n\n // Sort descending (newest first) — timestamps are ISO-formatted\n entries.sort((a, b) => b.localeCompare(a));\n\n for (const entry of entries.slice(MAX_ARCHIVE_ENTRIES)) {\n const entryPath = join(toolPath, entry);\n await rm(entryPath, { recursive: true, force: true });\n pruned.push(`${toolDir}/${entry}`);\n }\n }\n\n return pruned;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n AGENTS_DIR,\n MANIFEST_FILE,\n VALID_TOOLS,\n WORKTREE_CAPABLE_TOOLS,\n DEFAULT_FEATURES,\n type BoardConfig,\n type ContentSelection,\n type HatchManifest,\n type Platform,\n type Tool,\n} from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\n/**\n * Validate a git branch name against the rules from `git check-ref-format`.\n *\n * Rejects names that:\n * - are empty or whitespace-only\n * - contain `..\", `~`, `^`, `:`, `\\`, spaces, or control characters\n * - start or end with `/` or `.`\n * - contain consecutive slashes `//`\n * - end with `.lock`\n * - contain `@{` (reflog syntax)\n * - are exactly `@`\n */\nexport function isValidGitBranchName(name: string): boolean {\n if (!name || name.trim() !== name) return false;\n if (/[~^:\\\\\\x00-\\x1f\\x7f ]/.test(name)) return false;\n if (name.startsWith(\"/\") || name.endsWith(\"/\")) return false;\n if (name.startsWith(\".\") || name.endsWith(\".\")) return false;\n if (name.includes(\"..\")) return false;\n if (name.includes(\"//\")) return false;\n if (name.endsWith(\".lock\")) return false;\n if (name.includes(\"@{\")) return false;\n if (name === \"@\") return false;\n return true;\n}\n\nfunction createMinimalBoardConfig(owner: string, repo: string, defaultBranch: string): BoardConfig {\n return {\n owner,\n repo,\n defaultBranch,\n projectNumber: null,\n statusFieldId: null,\n statusOptions: {\n backlog: null,\n ready: null,\n inProgress: null,\n inReview: null,\n done: null,\n },\n labels: {\n types: [\"type:bug\", \"type:feature\", \"type:refactor\", \"type:qa\", \"type:docs\", \"type:infra\"],\n executors: [\"executor:agent\", \"executor:human\", \"executor:hybrid\"],\n statuses: [\"status:triage\", \"status:ready\", \"status:in-progress\", \"status:in-review\", \"status:blocked\"],\n meta: [\"meta:board-overview\"],\n },\n branchConvention: \"{type}/{short-description}\",\n areas: [],\n };\n}\n\nexport function createManifest(options: {\n platform?: Platform;\n owner?: string;\n repo?: string;\n namespace?: string;\n project?: string;\n defaultBranch?: string;\n tools: Tool[];\n features?: Partial<HatchManifest[\"features\"]>;\n mcpServers?: string[];\n content?: ContentSelection;\n languages?: string[];\n}): HatchManifest {\n const platform = options.platform ?? \"github\";\n const owner = options.owner ?? \"\";\n const repo = options.repo ?? \"\";\n const namespace = options.namespace ?? owner;\n const project = options.project ?? repo;\n const manifest: HatchManifest = {\n version: \"2.0.0\",\n hatch3rVersion: HATCH3R_VERSION,\n platform,\n owner,\n repo,\n namespace,\n project,\n tools: options.tools,\n features: { ...DEFAULT_FEATURES, ...options.features },\n mcp: { servers: options.mcpServers ?? [] },\n managedFiles: [],\n };\n if (options.content) {\n manifest.content = options.content;\n }\n if (options.languages && options.languages.length > 0 && options.languages[0] !== \"unknown\") {\n manifest.languages = options.languages;\n }\n if (options.defaultBranch) {\n manifest.board = createMinimalBoardConfig(owner, repo, options.defaultBranch);\n }\n if (options.tools.some(t => WORKTREE_CAPABLE_TOOLS.has(t))) {\n manifest.worktree = { enabled: true };\n }\n return manifest;\n}\n\nexport function migrateManifest(raw: Record<string, unknown>): Record<string, unknown> {\n const migrated = { ...raw };\n\n if (!migrated.namespace && typeof migrated.owner === \"string\") {\n migrated.namespace = migrated.owner;\n }\n if (!migrated.namespace) {\n migrated.namespace = \"\";\n }\n\n if (!migrated.project && typeof migrated.repo === \"string\") {\n migrated.project = migrated.repo;\n }\n if (!migrated.project) {\n migrated.project = \"\";\n }\n\n if (migrated.version === \"1.0.0\") {\n migrated.version = \"2.0.0\";\n }\n\n return migrated;\n}\n\nfunction validateManifest(data: unknown): data is HatchManifest {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n typeof obj.version !== \"string\" ||\n typeof obj.hatch3rVersion !== \"string\" ||\n (obj.platform !== undefined && typeof obj.platform !== \"string\") ||\n !Array.isArray(obj.tools) ||\n obj.features === null ||\n typeof obj.features !== \"object\" ||\n obj.mcp === null ||\n typeof obj.mcp !== \"object\" ||\n !Array.isArray(obj.managedFiles)\n ) {\n return false;\n }\n\n // #108: Validate tools array entries are known tool strings\n for (const tool of obj.tools as unknown[]) {\n if (typeof tool !== \"string\" || !VALID_TOOLS.has(tool)) return false;\n }\n\n // #108: Validate board sub-schema when present\n if (obj.board !== undefined) {\n if (typeof obj.board !== \"object\" || obj.board === null) return false;\n const board = obj.board as Record<string, unknown>;\n if (typeof board.owner !== \"string\") return false;\n if (typeof board.repo !== \"string\") return false;\n if (board.defaultBranch !== undefined) {\n if (typeof board.defaultBranch !== \"string\") return false;\n // #1.15: Validate defaultBranch against git branch naming rules\n if (!isValidGitBranchName(board.defaultBranch)) return false;\n }\n }\n\n // #108: Validate worktree.extraPatterns when present\n if (obj.worktree !== undefined) {\n const wt = obj.worktree as Record<string, unknown>;\n if (wt.extraPatterns !== undefined) {\n if (!Array.isArray(wt.extraPatterns)) return false;\n if (!(wt.extraPatterns as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n if (obj.content !== undefined) {\n if (typeof obj.content !== \"object\" || obj.content === null) return false;\n const content = obj.content as Record<string, unknown>;\n if (typeof content.preset !== \"string\") return false;\n if (typeof content.projectType !== \"string\") return false;\n if (typeof content.teamSize !== \"string\") return false;\n if (!content.items || typeof content.items !== \"object\") return false;\n const items = content.items as Record<string, unknown>;\n const requiredKeys = [\"agents\", \"skills\", \"rules\", \"commands\", \"prompts\", \"hooks\", \"githubAgents\"];\n for (const key of requiredKeys) {\n if (!Array.isArray(items[key])) return false;\n if (!(items[key] as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n if (obj.costTracking !== undefined) {\n if (typeof obj.costTracking !== \"object\" || obj.costTracking === null) return false;\n const ct = obj.costTracking as Record<string, unknown>;\n if (ct.sessionBudget !== undefined && typeof ct.sessionBudget !== \"number\") return false;\n if (ct.issueBudget !== undefined && typeof ct.issueBudget !== \"number\") return false;\n if (ct.epicBudget !== undefined && typeof ct.epicBudget !== \"number\") return false;\n if (ct.currency !== undefined && typeof ct.currency !== \"string\") return false;\n if (ct.warningThresholds !== undefined) {\n if (!Array.isArray(ct.warningThresholds)) return false;\n if (!(ct.warningThresholds as unknown[]).every((v) => typeof v === \"number\")) return false;\n }\n if (ct.hardStop !== undefined && typeof ct.hardStop !== \"boolean\") return false;\n }\n\n if (obj.specs !== undefined) {\n if (typeof obj.specs !== \"object\" || obj.specs === null) return false;\n const specs = obj.specs as Record<string, unknown>;\n if (!Array.isArray(specs.paths)) return false;\n if (!(specs.paths as unknown[]).every((v) => typeof v === \"string\")) return false;\n if (specs.lastGenerated !== undefined && typeof specs.lastGenerated !== \"string\") return false;\n }\n\n if (obj.workspace !== undefined) {\n if (typeof obj.workspace !== \"object\" || obj.workspace === null) return false;\n const ws = obj.workspace as Record<string, unknown>;\n if (typeof ws.rootPath !== \"string\") return false;\n if (typeof ws.lastSync !== \"string\") return false;\n if (typeof ws.syncVersion !== \"string\") return false;\n if (typeof ws.workspaceChecksum !== \"string\") return false;\n if (ws.excludedContent !== undefined) {\n if (!Array.isArray(ws.excludedContent)) return false;\n if (!(ws.excludedContent as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n if (ws.localContent !== undefined) {\n if (!Array.isArray(ws.localContent)) return false;\n if (!(ws.localContent as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n return true;\n}\n\nexport async function readManifest(\n rootDir: string,\n): Promise<HatchManifest | null> {\n const manifestPath = join(rootDir, AGENTS_DIR, MANIFEST_FILE);\n\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err: unknown) {\n throw new Error(\n `Malformed JSON in ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const migrated = migrateManifest(parsed as Record<string, unknown>);\n\n if (!validateManifest(migrated)) {\n throw new Error(\n `Invalid manifest in ${manifestPath}: required fields missing or malformed. Run hatch3r init to regenerate.`,\n );\n }\n return migrated;\n}\n\nexport async function writeManifest(\n rootDir: string,\n manifest: HatchManifest,\n): Promise<void> {\n const manifestPath = join(rootDir, AGENTS_DIR, MANIFEST_FILE);\n await atomicWriteFile(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nexport function addManagedFile(\n manifest: HatchManifest,\n filePath: string,\n): void {\n if (!manifest.managedFiles.includes(filePath)) {\n manifest.managedFiles.push(filePath);\n }\n}\n\nexport function removeManagedFile(\n manifest: HatchManifest,\n filePath: string,\n): void {\n manifest.managedFiles = manifest.managedFiles.filter((f) => f !== filePath);\n}\n","/**\n * Short alias -> full model ID mapping.\n * Used in hatch.json `models` configuration and .customize.yaml files\n * so users can write `\"opus\"` instead of `\"claude-opus-4-6\"`.\n */\nexport const MODEL_ALIASES: Record<string, string> = {\n \"opus\": \"claude-opus-4-6\",\n \"sonnet\": \"claude-sonnet-4-6\",\n \"haiku\": \"claude-haiku-4-5\",\n \"codex\": \"gpt-5.3-codex\",\n \"codex-prev\": \"gpt-5.2-codex\",\n \"codex-mini\": \"gpt-5.1-codex-mini\",\n \"codex-spark\": \"gpt-5.3-codex-spark\",\n \"gemini-pro\": \"gemini-3.1-pro\",\n \"gemini-flash\": \"gemini-3-flash\",\n \"gemini-stable\": \"gemini-2.5-pro\",\n};\n\n/** Expand a model alias to its full ID, or return the input if not an alias. */\nexport function resolveModelAlias(input: string): string {\n return MODEL_ALIASES[input] ?? input;\n}\n","import type { CanonicalFile, HatchManifest } from \"../types.js\";\nimport type { AgentCustomization } from \"./customize.js\";\nimport { resolveModelAlias } from \"./aliases.js\";\n\n/**\n * Resolve the effective model for an agent.\n *\n * Priority (highest to lowest):\n * 1. Per-agent customization (.customize.yaml)\n * 2. Manifest agent-level override (models.agents[agentId])\n * 3. Agent frontmatter model field\n * 4. Manifest default model (models.default)\n *\n * The resolved value is passed through alias expansion (e.g. \"opus\" -> \"claude-opus-4-6\").\n */\nexport function resolveAgentModel(\n agentId: string,\n agent: CanonicalFile,\n manifest: HatchManifest,\n customize?: AgentCustomization,\n): string | undefined {\n const raw =\n customize?.model\n ?? manifest.models?.agents?.[agentId]\n ?? agent.model\n ?? manifest.models?.default;\n return raw ? resolveModelAlias(raw) : undefined;\n}\n\nconst PROVIDER_PREFIXES: [RegExp, string][] = [\n [/^claude-/, \"anthropic\"],\n [/^gpt-|^codex-/, \"openai\"],\n [/^gemini-/, \"google\"],\n];\n\n/**\n * Prepend a provider prefix (e.g. \"anthropic/\", \"openai/\") to a model ID\n * when the model name matches a known provider pattern. Returns the input\n * unchanged if no provider is detected.\n */\nexport function withProviderPrefix(modelId: string): string {\n for (const [pattern, provider] of PROVIDER_PREFIXES) {\n if (pattern.test(modelId)) return `${provider}/${modelId}`;\n }\n return modelId;\n}\n","import { readFile, readdir, lstat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CanonicalFile, CanonicalMetadata } from \"../types.js\";\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n([\\s\\S]*))?$/;\n\n/**\n * Parse YAML frontmatter from a markdown file's raw content.\n *\n * Returns the parsed metadata and the body content after the frontmatter block.\n * If the file has no frontmatter delimiters (`---`), returns empty metadata\n * and the full content as the body.\n */\nexport function parseFrontmatter(rawContent: string): {\n metadata: CanonicalMetadata;\n content: string;\n} {\n const match = rawContent.match(FRONTMATTER_REGEX);\n if (!match) {\n return {\n metadata: { id: \"\", type: \"rule\", description: \"\" },\n content: rawContent,\n };\n }\n\n const [, frontmatterStr, content = \"\"] = match;\n const parsed = parseYaml(frontmatterStr ?? \"\") as Record<string, unknown> | null;\n const metadata: CanonicalMetadata = {\n id: \"\",\n type: \"rule\",\n description: \"\",\n };\n\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.id === \"string\") metadata.id = parsed.id;\n if (typeof parsed.type === \"string\") metadata.type = parsed.type;\n if (typeof parsed.description === \"string\") metadata.description = parsed.description;\n if (typeof parsed.name === \"string\") metadata.name = parsed.name;\n if (typeof parsed.scope === \"string\") metadata.scope = parsed.scope;\n if (typeof parsed.model === \"string\") metadata.model = parsed.model;\n if (typeof parsed.agent === \"string\") metadata.agent = parsed.agent;\n if (typeof parsed.event === \"string\") metadata.event = parsed.event;\n if (typeof parsed.globs === \"string\") metadata.globs = parsed.globs;\n if (typeof parsed.protected === \"boolean\") metadata.protected = parsed.protected;\n if (typeof parsed.alwaysApply === \"boolean\") metadata.alwaysApply = parsed.alwaysApply;\n if (typeof parsed.readonly === \"boolean\") metadata.readonly = parsed.readonly;\n if (typeof parsed.background === \"boolean\") metadata.background = parsed.background;\n if (Array.isArray(parsed.tags)) metadata.tags = parsed.tags.filter((t: unknown) => typeof t === \"string\");\n }\n\n if (!metadata.id && metadata.name) {\n metadata.id = metadata.name;\n }\n metadata.type = metadata.type ?? \"rule\";\n metadata.description = metadata.description ?? \"\";\n\n return { metadata, content: content ?? \"\" };\n}\n\nexport type CanonicalType =\n | \"rules\"\n | \"agents\"\n | \"skills\"\n | \"commands\"\n | \"prompts\"\n | \"github-agents\";\n\ninterface ReaderConfig {\n type: CanonicalFile[\"type\"];\n dir: string;\n strategy: \"glob\" | \"subdirectory\";\n}\n\nconst READER_CONFIGS: Record<CanonicalType, ReaderConfig> = {\n rules: { type: \"rule\", dir: \"rules\", strategy: \"glob\" },\n agents: { type: \"agent\", dir: \"agents\", strategy: \"glob\" },\n skills: { type: \"skill\", dir: \"skills\", strategy: \"subdirectory\" },\n commands: { type: \"command\", dir: \"commands\", strategy: \"glob\" },\n prompts: { type: \"prompt\", dir: \"prompts\", strategy: \"glob\" },\n \"github-agents\": { type: \"github-agent\", dir: \"github-agents\", strategy: \"glob\" },\n};\n\n/**\n * Read all `.md` files in a directory (recursively) and parse frontmatter.\n * Per-file errors are caught and the file is skipped, so a single corrupt\n * file does not prevent reading the rest of the directory.\n */\nasync function readGlobMd(baseDir: string, fileType: CanonicalFile[\"type\"]): Promise<CanonicalFile[]> {\n let entries: string[];\n try {\n const all = await readdir(baseDir, { recursive: true });\n entries = all.filter((f) => f.endsWith(\".md\")).sort();\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const results = await Promise.all(\n entries.map(async (relPath) => {\n const fullPath = join(baseDir, relPath);\n try {\n const stats = await lstat(fullPath);\n if (stats.isSymbolicLink()) {\n return null;\n }\n const rawContent = await readFile(fullPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(rawContent);\n const id = metadata.id || metadata.name || relPath.replace(/\\.md$/, \"\").replace(/\\//g, \"-\");\n return {\n id,\n type: fileType,\n description: metadata.description ?? \"\",\n scope: metadata.scope,\n model: metadata.model,\n protected: metadata.protected,\n readonly: metadata.readonly,\n background: metadata.background,\n tags: metadata.tags,\n content,\n rawContent,\n sourcePath: fullPath,\n };\n } catch {\n // Per-file error handling: skip this file but continue reading the rest\n return null;\n }\n }),\n );\n return results.filter((r): r is NonNullable<typeof r> => r !== null);\n}\n\n/**\n * Read skill content from subdirectories (`{baseDir}/{skillName}/SKILL.md`).\n * Each skill is a directory containing a `SKILL.md` file with frontmatter.\n * Symlinks are skipped; missing `SKILL.md` files cause the directory to be skipped.\n */\nasync function readSkillSubdirs(baseDir: string): Promise<CanonicalFile[]> {\n let dirents: { name: string; isDirectory: () => boolean }[];\n try {\n dirents = (await readdir(baseDir, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const entries = await Promise.all(\n dirents\n .filter((d) => d.isDirectory())\n .map(async (dir) => {\n const skillPath = join(baseDir, dir.name, \"SKILL.md\");\n try {\n const skillStats = await lstat(skillPath);\n if (skillStats.isSymbolicLink()) {\n return null;\n }\n const rawContent = await readFile(skillPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(rawContent);\n const id = metadata.name ?? metadata.id ?? dir.name;\n return {\n id,\n type: \"skill\" as const,\n description: metadata.description ?? \"\",\n protected: metadata.protected,\n tags: metadata.tags,\n content,\n rawContent,\n sourcePath: skillPath,\n };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return null;\n }\n }),\n );\n\n return entries.filter((e): e is NonNullable<typeof e> => e !== null);\n}\n\n/**\n * Read all canonical files of a given type from the `.agents/` directory.\n *\n * Returns parsed `CanonicalFile` objects with frontmatter metadata and body content.\n * Skills use subdirectory strategy (`skills/{name}/SKILL.md`); all others use glob\n * strategy (flat `.md` files in the type directory).\n */\nexport async function readCanonicalFiles(\n agentsDir: string,\n type: CanonicalType,\n): Promise<CanonicalFile[]> {\n const config = READER_CONFIGS[type];\n const baseDir = join(agentsDir, config.dir);\n return config.strategy === \"subdirectory\"\n ? readSkillSubdirs(baseDir)\n : readGlobMd(baseDir, config.type);\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { wrapInManagedBlock } from \"../../merge/managedBlocks.js\";\nimport { parseFrontmatter } from \"../../adapters/canonical.js\";\n\n/**\n * Shared orchestration content inlined into adapter bridge files (CLAUDE.md, GEMINI.md,\n * .windsurfrules, .amp/AGENTS.md, .github/copilot-instructions.md, .cursor/rules/hatch3r-bridge.mdc).\n * Includes mandatory behaviors, agent quick reference, and canonical structure.\n * Ensures every platform receives inline orchestration guidance instead of relying solely\n * on \"read /.agents/AGENTS.md\" references.\n */\n/** Static bridge orchestration (no skill index). Used as fallback. */\nexport const BRIDGE_ORCHESTRATION = `## Sub-Agent Pipeline (mandatory, no exceptions)\n\nAll tasks use this four-phase pipeline. Never implement inline; always delegate.\n\n**Phase 1 — Research:** Spawn \\`hatch3r-researcher\\`. Skip only for trivial edits. Score complexity per \\`hatch3r-deep-context\\` and add tier modes.\n**Phase 2 — Implement:** Spawn \\`hatch3r-implementer\\` (one per task). Pass research context.\n**Phase 3 — Review Loop:** \\`hatch3r-reviewer\\` → if Critical/Warning: \\`hatch3r-fixer\\` → re-review → repeat (max 3). After clean verdict: one confirmation pass (regressions, acceptance criteria). Remaining findings after max iterations → surface to user.\n**Phase 4 — Final Quality** (after clean review): \\`hatch3r-test-writer\\` + \\`hatch3r-security-auditor\\` (always), \\`hatch3r-docs-writer\\` (evaluate), then conditional: lint-fixer, a11y-auditor, perf-profiler, dependency-auditor.\n\n## Mandatory Behaviors\n\n1. **Load skill** from \\`/.agents/skills/\\` matching task type before implementation.\n2. **Task tool** (\\`subagent_type: \"generalPurpose\"\\`) for all delegations. Max parallelism.\n3. **Propagate rules**: include \\`scope: always\\` directives in subagent prompts.\n4. **Consult learnings**: check \\`/.agents/learnings/\\` before implementation.\n5. **Consult specs**: if \\`docs/specs/\\` exists, read relevant specifications before implementation and cross-reference during review.\n\n## Agent Quick Reference\n\n| Agent | When |\n|-------|------|\n| \\`hatch3r-researcher\\` | Always before impl (skip trivial edits) |\n| \\`hatch3r-implementer\\` | Always — one per task |\n| \\`hatch3r-reviewer\\` | Always (Phase 3 loop) |\n| \\`hatch3r-fixer\\` | Critical/Warning findings (Phase 3) |\n| \\`hatch3r-test-writer\\` | Always for code changes (Phase 4) |\n| \\`hatch3r-security-auditor\\` | Always for code changes (Phase 4) |\n| \\`hatch3r-docs-writer\\` | Evaluate; spawn if doc impact (Phase 4) |\n| \\`hatch3r-lint-fixer\\` | Lint/type errors after impl |\n| \\`hatch3r-a11y-auditor\\` | UI/accessibility changes |\n| \\`hatch3r-architect\\` | Architectural decisions, API design |\n| \\`hatch3r-perf-profiler\\` | Performance-sensitive changes |\n| \\`hatch3r-dependency-auditor\\` | Dependency changes |\n| \\`hatch3r-ci-watcher\\` | CI failures |\n| \\`hatch3r-devops\\` | Infra, deployment, CI/CD changes |\n\nFull protocol: \\`hatch3r-agent-orchestration\\` rule in \\`/.agents/rules/\\`.\n\n## Canonical Structure\n\n- Rules: \\`/.agents/rules/\\` — Agents: \\`/.agents/agents/\\` — Skills: \\`/.agents/skills/\\`\n- Commands: \\`/.agents/commands/\\` — MCP: \\`/.agents/mcp/mcp.json\\` — Policy: \\`/.agents/policy/\\`\n\nDo not edit \\`hatch3r-\\` prefixed files — managed by hatch3r, overwritten on update.\n\n## Getting Started (staged introduction)\n\nNew to hatch3r? Start here and expand as you go:\n\n**Day 1 — Core workflow:** Use the 4-phase pipeline above for any task. Start by invoking \\`hatch3r-researcher\\` for context, then \\`hatch3r-implementer\\` for changes.\n**Week 1 — Skills & commands:** Load skills from \\`/.agents/skills/\\` matching your task type. Try \\`/hatch3r-feature-plan\\` or \\`/hatch3r-bug-plan\\` commands.\n**Week 2 — Board & team:** If using project management, run \\`/hatch3r-board-init\\` to set up your board. Use \\`/hatch3r-board-pickup\\` for structured delivery.\n**Ongoing — Customization:** Override agent behavior via \\`.hatch3r/{type}/{id}.customize.yaml\\`. Add project learnings to \\`/.agents/learnings/\\`.`;\n\nconst GETTING_STARTED_MINIMAL = `## Getting Started (minimal preset)\n\nYou are running the **minimal** content preset — only core agents and workflows are installed. This keeps token usage low and focuses on essentials.\n\n**Day 1 — Core workflow:** Use the 4-phase pipeline above for any task. Start by invoking \\`hatch3r-researcher\\` for context, then \\`hatch3r-implementer\\` for changes.\n**Expanding later:** Run \\`npx hatch3r config\\` to switch to the Standard or Full preset and unlock additional skills, commands, and audits.`;\n\n/**\n * Generate bridge orchestration with an inline skill dispatch table.\n * Falls back to the static BRIDGE_ORCHESTRATION if agentsDir is unavailable.\n *\n * @param preset - Content preset from the manifest. When \"minimal\", the Getting\n * Started section is replaced with minimal-specific messaging that sets\n * expectations about reduced content and explains how to expand later.\n */\nexport async function generateBridgeOrchestration(agentsDir: string, preset?: string): Promise<string> {\n let base = BRIDGE_ORCHESTRATION;\n\n // Swap Getting Started section for minimal preset users (#99 D19)\n if (preset === \"minimal\") {\n const gsStart = base.indexOf(\"## Getting Started\");\n if (gsStart !== -1) {\n base = base.slice(0, gsStart) + GETTING_STARTED_MINIMAL;\n }\n }\n\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length === 0) return base;\n\n const skillTable = [\n \"\\n## Skill Dispatch Table\\n\",\n \"Load the matching skill before implementation. Full content in `/.agents/skills/{id}/SKILL.md`.\\n\",\n \"| Task Type | Skill | Description |\",\n \"|-----------|-------|-------------|\",\n ];\n for (const skill of skills) {\n skillTable.push(`| — | \\`${skill.id}\\` | ${skill.description.slice(0, 80)} |`);\n }\n\n // Insert skill table after the Agent Quick Reference table\n const insertPoint = \"Do not edit `hatch3r-` prefixed files\";\n const idx = base.indexOf(insertPoint);\n if (idx === -1) return base;\n\n return (\n base.slice(0, idx) +\n skillTable.join(\"\\n\") +\n \"\\n\\n\" +\n base.slice(idx)\n );\n}\n\nexport const AGENTS_MD_INNER = [\n \"# Project Agent Instructions\",\n \"\",\n \"This project uses hatch3r for agentic coding setup.\",\n \"Full canonical instructions are at `/.agents/AGENTS.md`.\",\n \"\",\n \"## Quick Reference\",\n \"\",\n \"- Rules: `/.agents/rules/`\",\n \"- Agents: `/.agents/agents/`\",\n \"- Skills: `/.agents/skills/`\",\n \"- Commands: `/.agents/commands/`\",\n].join(\"\\n\");\n\nexport const AGENTS_MD_FULL = `${wrapInManagedBlock(AGENTS_MD_INNER)}\\n`;\n\n/**\n * Generate a rich root-level AGENTS.md from what's on disk.\n *\n * Platforms like GitHub Copilot, Cursor, and others scan for AGENTS.md at the\n * project root. This function produces inline agent/skill/command rosters so\n * those platforms discover available agents without following a pointer to\n * `/.agents/AGENTS.md`.\n *\n * The content is wrapped in a managed block so user-added content outside the\n * block is preserved across syncs.\n *\n * Falls back to the static AGENTS_MD_FULL when the agents directory is empty\n * or unreadable.\n */\nexport async function generateRootAgentsMd(agentsDir: string): Promise<{ full: string; inner: string }> {\n const sections: string[] = [];\n\n sections.push(\"# Project Agent Instructions\");\n sections.push(\"\");\n sections.push(\"This project uses [hatch3r](https://github.com/hatch3r/hatch3r) for agentic coding orchestration.\");\n sections.push(\"Full canonical instructions are at `/.agents/AGENTS.md`.\");\n\n // Build agent roster from what's on disk\n const agents = await readDirFiles(join(agentsDir, \"agents\"));\n if (agents.length > 0) {\n sections.push(\"\");\n sections.push(\"## Agents\");\n sections.push(\"\");\n sections.push(\"| Agent | Purpose |\");\n sections.push(\"|-------|---------|\");\n for (const agent of agents) {\n const { metadata } = parseFrontmatter(agent.content);\n const id = metadata.id || metadata.name || agent.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n // Build skill table from what's on disk\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length > 0) {\n sections.push(\"\");\n sections.push(\"## Skills\");\n sections.push(\"\");\n sections.push(\"| Skill | Description |\");\n sections.push(\"|-------|-------------|\");\n for (const skill of skills) {\n sections.push(`| \\`${skill.id}\\` | ${skill.description.slice(0, 100)} |`);\n }\n }\n\n // Build command list from what's on disk\n const commands = await readDirFiles(join(agentsDir, \"commands\"));\n if (commands.length > 0) {\n sections.push(\"\");\n sections.push(\"## Commands\");\n sections.push(\"\");\n sections.push(\"| Command | Description |\");\n sections.push(\"|---------|-------------|\");\n for (const cmd of commands) {\n const { metadata } = parseFrontmatter(cmd.content);\n const id = metadata.id || metadata.name || cmd.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n sections.push(\"\");\n sections.push(\"## Directory Structure\");\n sections.push(\"\");\n sections.push(\"- Rules: `/.agents/rules/`\");\n sections.push(\"- Agents: `/.agents/agents/`\");\n sections.push(\"- Skills: `/.agents/skills/`\");\n sections.push(\"- Commands: `/.agents/commands/`\");\n sections.push(\"- MCP: `/.agents/mcp/mcp.json`\");\n sections.push(\"- Learnings: `/.agents/learnings/`\");\n\n // If nothing dynamic was found, fall back to the static stub\n if (agents.length === 0 && skills.length === 0 && commands.length === 0) {\n return { full: AGENTS_MD_FULL, inner: AGENTS_MD_INNER };\n }\n\n const inner = sections.join(\"\\n\");\n const full = `${wrapInManagedBlock(inner)}\\n`;\n return { full, inner };\n}\n\n// ── Dynamic AGENTS.md generation ──────────────────────────────\n\n/**\n * Generate canonical AGENTS.md content based on what's actually installed on disk.\n * Reads agent, skill, and command files from the .agents/ directory.\n */\nexport async function generateCanonicalAgentsMd(agentsDir: string): Promise<string> {\n const sections: string[] = [];\n\n sections.push(`# hatch3r — Canonical Agent Instructions\n\nThis file is the canonical reference for all agent orchestration in this project. It is auto-generated by hatch3r and should not be manually edited.\n\n## Universal Sub-Agent Pipeline\n\nEvery task — board-pickup, workflow command, plain chat, single-task, or multi-task — MUST use this four-phase sub-agent pipeline. There are NO exceptions. Never implement code inline; always delegate to sub-agents.\n\n**Phase 1 — Research:** Spawn \\`hatch3r-researcher\\` for context gathering before implementation. Skip only for trivial single-line edits.\n\n**Phase 2 — Implement:** Spawn \\`hatch3r-implementer\\` for ALL code changes. One dedicated implementer per task.\n\n**Phase 3 — Review Loop:** Spawn \\`hatch3r-reviewer\\`, then \\`hatch3r-fixer\\` for Critical/Warning findings, re-review, repeat until clean (max 3 iterations).\n\n**Phase 4 — Final Quality** (runs ONLY after review loop is clean): Spawn applicable specialists in parallel.\n\n## Orchestration Protocol\n\n1. **Load the matching skill** from \\`/.agents/skills/\\` based on task type before implementation.\n2. **Score task complexity** per the \\`hatch3r-deep-context\\` rule.\n3. **Spawn a researcher subagent** (\\`hatch3r-researcher\\`) for context gathering.\n4. **Spawn an implementer subagent** (\\`hatch3r-implementer\\`) for code changes.\n5. **Run the review loop** (Phase 3).\n6. **Spawn final quality subagents** (Phase 4).\n7. **Propagate rules** to all subagent prompts.\n8. **Consult learnings** from \\`/.agents/learnings/\\`.`);\n\n // Build agent roster from what's on disk\n const agents = await readDirFiles(join(agentsDir, \"agents\"));\n if (agents.length > 0) {\n sections.push(\"\\n## Agent Roster\\n\");\n sections.push(\"| Agent | Purpose |\");\n sections.push(\"|-------|---------|\");\n for (const agent of agents) {\n const { metadata } = parseFrontmatter(agent.content);\n const id = metadata.id || metadata.name || agent.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n // Build skill dispatch table with inline checklists from what's on disk\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length > 0) {\n sections.push(\"\\n## Available Skills\\n\");\n sections.push(\"| Skill | Description |\");\n sections.push(\"|-------|-------------|\");\n for (const skill of skills) {\n sections.push(`| \\`${skill.id}\\` | ${skill.description.slice(0, 100)} |`);\n }\n\n // Inline condensed skill checklists so agents don't need a separate file read\n const skillsWithChecklists = skills.filter((s) => s.checklist);\n if (skillsWithChecklists.length > 0) {\n sections.push(\"\\n## Skill Quick Reference\\n\");\n sections.push(\"When loading a skill, follow its checklist steps below. Full skill content is in `/.agents/skills/{id}/SKILL.md`.\\n\");\n for (const skill of skillsWithChecklists) {\n sections.push(`### \\`${skill.id}\\`\\n`);\n sections.push(skill.checklist!);\n sections.push(\"\");\n }\n }\n }\n\n // Build command list from what's on disk\n const commands = await readDirFiles(join(agentsDir, \"commands\"));\n if (commands.length > 0) {\n sections.push(\"\\n## Available Commands\\n\");\n sections.push(\"| Command | Description |\");\n sections.push(\"|---------|-------------|\");\n for (const cmd of commands) {\n const { metadata } = parseFrontmatter(cmd.content);\n const id = metadata.id || metadata.name || cmd.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n sections.push(`\n## Directory Structure\n\n- \\`/.agents/rules/\\` — Rules (source of truth for all tool-specific rules)\n- \\`/.agents/agents/\\` — Agent definitions\n- \\`/.agents/skills/\\` — Skill workflows\n- \\`/.agents/commands/\\` — Executable commands\n- \\`/.agents/mcp/\\` — MCP server configuration\n- \\`/.agents/policy/\\` — Guardrails and deny lists\n- \\`/.agents/learnings/\\` — Project learnings (pitfalls, patterns, decisions)\n`);\n\n return sections.join(\"\\n\");\n}\n\n// ── Helpers ──────────────────────────────────────────────────\n\ninterface DirFile {\n name: string;\n content: string;\n}\n\nasync function readDirFiles(dir: string): Promise<DirFile[]> {\n try {\n const entries = await readdir(dir);\n const mdFiles = entries.filter((f) => f.endsWith(\".md\")).sort();\n return Promise.all(\n mdFiles.map(async (name) => ({\n name,\n content: await readFile(join(dir, name), \"utf-8\"),\n })),\n );\n } catch {\n return [];\n }\n}\n\n/**\n * Extract a condensed checklist from skill content by pulling numbered lists\n * and heading structure (max ~20 lines per skill to keep token count manageable).\n */\nfunction extractSkillChecklist(content: string): string | undefined {\n const lines = content.split(\"\\n\");\n const checklist: string[] = [];\n let inSteps = false;\n\n for (const line of lines) {\n // Start capturing at headings containing \"steps\", \"protocol\", \"workflow\", \"checklist\", or numbered procedure\n if (/^#{1,3}\\s+.*(step|protocol|workflow|checklist|procedure|implementation)/i.test(line)) {\n inSteps = true;\n continue;\n }\n // Stop at the next major heading that isn't a sub-step\n if (inSteps && /^#{1,2}\\s+/.test(line) && !/step|phase/i.test(line)) {\n break;\n }\n if (inSteps && (line.match(/^\\d+\\.\\s/) || line.match(/^-\\s/) || line.match(/^\\s+\\d+\\.\\s/) || line.match(/^\\s+-\\s/))) {\n checklist.push(line);\n if (checklist.length >= 20) break;\n }\n }\n\n return checklist.length > 0 ? checklist.join(\"\\n\") : undefined;\n}\n\nasync function readSkillDirs(dir: string): Promise<{ id: string; description: string; checklist?: string }[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const skills: { id: string; description: string; checklist?: string }[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const raw = await readFile(join(dir, entry.name, \"SKILL.md\"), \"utf-8\");\n const { metadata, content } = parseFrontmatter(raw);\n skills.push({\n id: metadata.id || metadata.name || entry.name,\n description: metadata.description ?? \"\",\n checklist: extractSkillChecklist(content),\n });\n } catch {\n // skip\n }\n }\n return skills.sort((a, b) => a.id.localeCompare(b.id));\n } catch {\n return [];\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface McpServerEntry {\n command?: string;\n args?: string[];\n url?: string;\n env?: Record<string, string>;\n headers?: Record<string, string>;\n _description?: string;\n _disabled?: boolean;\n /** D15 Medium (#15.44): Per-server timeout in milliseconds (default: 30000). */\n _timeout?: number;\n}\n\n/** Default MCP server request timeout in milliseconds. */\nexport const DEFAULT_MCP_TIMEOUT_MS = 30_000;\n/** Maximum allowed MCP timeout in milliseconds (5 minutes). */\nexport const MAX_MCP_TIMEOUT_MS = 300_000;\n\n/**\n * Transforms `${env:VAR}` references to the native format for a given adapter.\n *\n * The canonical MCP config uses `${env:VAR}` syntax (matching the MCP spec).\n * Different adapters have different native env var reference syntaxes:\n * - \"claude\": `${VAR}` (Claude Code native)\n * - \"process\": `process.env.VAR` replaced at generation time (not used yet)\n * - \"passthrough\": keep `${env:VAR}` as-is (for adapters that support MCP spec natively)\n * - \"shell\": `$VAR` (for shell-based expansion)\n *\n * For adapters that don't understand `${env:VAR}`, this prevents silent failures\n * by converting to a syntax the adapter can process.\n */\nexport function transformEnvVarSyntax(\n value: unknown,\n format: \"claude\" | \"shell\" | \"passthrough\" = \"passthrough\",\n): unknown {\n if (typeof value === \"string\") {\n switch (format) {\n case \"claude\":\n return value.replace(/\\$\\{env:([^}]+)\\}/g, \"${$1}\");\n case \"shell\":\n return value.replace(/\\$\\{env:([^}]+)\\}/g, \"$$$1\");\n case \"passthrough\":\n return value;\n }\n }\n if (Array.isArray(value)) {\n return value.map((v) => transformEnvVarSyntax(v, format));\n }\n if (typeof value === \"object\" && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = transformEnvVarSyntax(v, format);\n }\n return result;\n }\n return value;\n}\n\nconst ALLOWED_COMMANDS = new Set([\n \"npx\",\n \"node\",\n \"uvx\",\n \"docker\",\n \"python\",\n \"python3\",\n \"pip\",\n \"pip3\",\n \"deno\",\n \"bun\",\n \"uv\",\n \"go\",\n \"cargo\",\n]);\n\nconst ALLOWED_URL_SCHEMES = new Set([\"http:\", \"https:\"]);\n\n/**\n * Validate a single MCP server entry and return any warnings.\n *\n * Checks: command allowlist, URL scheme, env key naming (POSIX),\n * arg shell metacharacters, unscoped npx packages, and timeout bounds.\n */\nexport function validateMcpEntry(\n name: string,\n entry: McpServerEntry,\n): string[] {\n const warnings: string[] = [];\n\n if (entry.command) {\n const baseCommand =\n entry.command.split(\"/\").pop()?.split(\"\\\\\").pop() ?? entry.command;\n if (!ALLOWED_COMMANDS.has(baseCommand)) {\n warnings.push(\n `MCP server \"${name}\" uses unrecognized command \"${entry.command}\". ` +\n `Expected one of: ${[...ALLOWED_COMMANDS].join(\", \")}`,\n );\n }\n }\n\n if (entry.url) {\n try {\n const parsed = new URL(entry.url);\n if (!ALLOWED_URL_SCHEMES.has(parsed.protocol)) {\n warnings.push(\n `MCP server \"${name}\" uses unsupported URL scheme \"${parsed.protocol}\". ` +\n `Allowed: ${[...ALLOWED_URL_SCHEMES].join(\", \")}`,\n );\n }\n } catch {\n warnings.push(\n `MCP server \"${name}\" has invalid URL: \"${entry.url}\"`,\n );\n }\n }\n\n if (!entry.command && !entry.url) {\n warnings.push(\n `MCP server \"${name}\" has neither command nor url configured`,\n );\n }\n\n // #120: Validate env key names follow POSIX convention\n if (entry.env) {\n for (const key of Object.keys(entry.env)) {\n if (!VALID_ENV_KEY.test(key)) {\n warnings.push(\n `MCP server \"${name}\" has invalid env key \"${key}\". ` +\n `Environment variable names must match [A-Za-z_][A-Za-z0-9_]*.`,\n );\n }\n }\n }\n\n if (entry.args) {\n const SHELL_METACHAR = /[|;&`$()]/;\n for (const arg of entry.args) {\n if (SHELL_METACHAR.test(arg)) {\n warnings.push(\n `MCP server \"${name}\" arg contains shell metacharacters: \"${arg}\". ` +\n `This may indicate a command injection risk.`,\n );\n }\n }\n\n const hasAutoYes = entry.args.some((a) => a === \"-y\" || a === \"--yes\");\n if (hasAutoYes) {\n const pkgArg = entry.args.find(\n (a) => !a.startsWith(\"-\") && a !== entry.command,\n );\n if (pkgArg && !pkgArg.startsWith(\"@\")) {\n warnings.push(\n `MCP server \"${name}\" uses npx -y with unscoped package \"${pkgArg}\". ` +\n `Unscoped packages are susceptible to typosquatting. Consider using a scoped package (@org/pkg).`,\n );\n }\n }\n }\n\n // D15 Medium (#15.44): Validate timeout if specified\n if (entry._timeout !== undefined) {\n if (typeof entry._timeout !== \"number\" || entry._timeout <= 0) {\n warnings.push(\n `MCP server \"${name}\" has invalid timeout: ${entry._timeout}. ` +\n `Timeout must be a positive number (milliseconds). Using default ${DEFAULT_MCP_TIMEOUT_MS}ms.`,\n );\n } else if (entry._timeout > MAX_MCP_TIMEOUT_MS) {\n warnings.push(\n `MCP server \"${name}\" timeout (${entry._timeout}ms) exceeds maximum (${MAX_MCP_TIMEOUT_MS}ms). ` +\n `Capping at ${MAX_MCP_TIMEOUT_MS}ms.`,\n );\n }\n }\n\n return warnings;\n}\n\n// Env var keys must follow POSIX convention: letters, digits, and underscores.\n// Keys with other characters are rejected to prevent injection.\nconst VALID_ENV_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// Server names must contain only alphanumeric characters, hyphens, and underscores.\n// Names with other special characters are rejected to prevent path traversal,\n// injection, or config key manipulation.\nconst VALID_SERVER_NAME = /^[a-zA-Z0-9_-]+$/;\n\n/**\n * Validate an MCP server name. Returns a warning string if invalid, or null if valid.\n * Server names must contain only alphanumeric characters, hyphens, and underscores.\n */\nexport function validateServerName(name: string): string | null {\n if (!VALID_SERVER_NAME.test(name)) {\n return (\n `MCP server name \"${name}\" contains invalid characters. ` +\n `Only alphanumeric characters, hyphens, and underscores are allowed.`\n );\n }\n return null;\n}\n\n/** Runtime type guard for the top-level MCP config shape (`{ mcpServers: {...} }`). */\nfunction validateMcpConfig(\n parsed: unknown,\n): parsed is { mcpServers: Record<string, McpServerEntry> } {\n if (typeof parsed !== \"object\" || parsed === null) return false;\n const obj = parsed as Record<string, unknown>;\n return typeof obj.mcpServers === \"object\" && obj.mcpServers !== null;\n}\n\nexport interface McpConfigResult {\n servers: Record<string, McpServerEntry>;\n warnings: string[];\n}\n\n/**\n * Read and validate the MCP server configuration from `.agents/mcp/mcp.json`.\n *\n * Parses the JSON, validates each server name and entry, and returns\n * the validated servers with any accumulated warnings. Servers with\n * invalid names are skipped entirely.\n */\nexport async function readMcpConfig(\n agentsDir: string,\n): Promise<McpConfigResult> {\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n const warnings: string[] = [];\n try {\n const mcpRaw = await readFile(mcpPath, \"utf-8\");\n const parsed: unknown = JSON.parse(mcpRaw);\n if (validateMcpConfig(parsed)) {\n const validServers: Record<string, McpServerEntry> = {};\n for (const [name, entry] of Object.entries(parsed.mcpServers)) {\n const nameWarning = validateServerName(name);\n if (nameWarning) {\n warnings.push(nameWarning);\n continue;\n }\n warnings.push(...validateMcpEntry(name, entry));\n validServers[name] = entry;\n }\n return { servers: validServers, warnings };\n }\n return { servers: {}, warnings };\n } catch (err) {\n warnings.push(`Could not read MCP config: ${err instanceof Error ? err.message : String(err)}`);\n return { servers: {}, warnings };\n }\n}\n","/**\n * Lifecycle events that hooks can attach to.\n *\n * Adapters map these to their native hook mechanism (e.g. Cursor rules,\n * Kiro lifecycle hooks, Codex shell hooks).\n */\nexport type HookEvent =\n | \"pre-commit\"\n | \"post-merge\"\n | \"ci-failure\"\n | \"file-save\"\n | \"session-start\"\n | \"pre-push\"\n | \"worktree-create\"\n | \"worktree-remove\";\n\n/** Set of all valid hook event names for runtime validation. */\nexport const VALID_HOOK_EVENTS = new Set<HookEvent>([\n \"pre-commit\",\n \"post-merge\",\n \"ci-failure\",\n \"file-save\",\n \"session-start\",\n \"pre-push\",\n \"worktree-create\",\n \"worktree-remove\",\n]);\n\n/** Type guard: check if a string is a valid hook event name. */\nexport function isValidHookEvent(event: string): event is HookEvent {\n return VALID_HOOK_EVENTS.has(event as HookEvent);\n}\n\n/** A canonical hook definition parsed from `.agents/hooks/*.md` frontmatter. */\nexport interface HookDefinition {\n /** Unique hook identifier (sanitized for shell safety). */\n id: string;\n /** Lifecycle event this hook listens for. */\n event: HookEvent;\n /** Agent ID to dispatch when the hook fires. */\n agent: string;\n /** Human-readable description of the hook's purpose. */\n description: string;\n /** Optional conditions that narrow when the hook fires. */\n condition?: HookCondition;\n}\n\n/** Conditions that control when a hook fires beyond the event trigger. */\nexport interface HookCondition {\n /** File glob patterns -- hook fires only when matching files are affected. */\n globs?: string[];\n /** Issue/PR labels -- hook fires only when matching labels are present. */\n labels?: string[];\n /** Branch name patterns -- hook fires only on matching branches. */\n branches?: string[];\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { HookDefinition } from \"./types.js\";\nimport { isValidHookEvent } from \"./types.js\";\n\n/**\n * Read all hook definitions from `.agents/hooks/` by parsing YAML frontmatter.\n *\n * Each hook must have `id`, `event`, and `agent` in its frontmatter.\n * Duplicate IDs across files are silently deduplicated (first wins).\n */\nexport async function readHookDefinitions(\n agentsDir: string,\n): Promise<HookDefinition[]> {\n const hooksDir = join(agentsDir, \"hooks\");\n\n // #121: Use recursive readdir to match canonical reader's pattern\n let entries: string[];\n try {\n const allEntries = await readdir(hooksDir, { recursive: true });\n entries = allEntries\n .filter((f) => typeof f === \"string\" && f.endsWith(\".md\"))\n .sort();\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const hooks: HookDefinition[] = [];\n const seenIds = new Set<string>();\n\n for (const entry of entries) {\n const content = await readFile(join(hooksDir, entry), \"utf-8\");\n const hook = parseHookFrontmatter(content);\n if (hook) {\n // #119: Prevent hook ID duplication across files\n if (seenIds.has(hook.id)) continue;\n seenIds.add(hook.id);\n hooks.push(hook);\n }\n }\n\n return hooks;\n}\n\n/**\n * Sanitize a hook field value that may be interpolated into shell commands\n * or TOML strings. Strips characters that could enable shell injection\n * (backticks, $, semicolons, pipes, newlines, null bytes).\n */\nfunction sanitizeHookField(value: string): string {\n return value.replace(/[`$;|&\\n\\r\\0\\\\'\"]/g, \"\");\n}\n\n/** Parse hook frontmatter from a markdown file. Returns null if required fields are missing or the event is invalid. */\nfunction parseHookFrontmatter(content: string): HookDefinition | null {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n\n const parsed = parseYaml(match[1]) as Record<string, unknown> | null;\n if (!parsed || typeof parsed !== \"object\") return null;\n\n if (!parsed.id || !parsed.event || !parsed.agent) return null;\n\n const eventStr = String(parsed.event);\n if (!isValidHookEvent(eventStr)) return null;\n\n // #1.18: Sanitize id and agent fields that get interpolated into\n // shell echo commands (e.g. Codex adapter hook output)\n const hook: HookDefinition = {\n id: sanitizeHookField(String(parsed.id)),\n event: eventStr,\n agent: sanitizeHookField(String(parsed.agent)),\n description: parsed.description ? String(parsed.description) : \"\",\n };\n\n const condition: HookDefinition[\"condition\"] = {};\n let hasCondition = false;\n\n if (parsed.globs) {\n condition.globs = Array.isArray(parsed.globs)\n ? parsed.globs.map(String)\n : String(parsed.globs).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n if (parsed.labels) {\n condition.labels = Array.isArray(parsed.labels)\n ? parsed.labels.map(String)\n : String(parsed.labels).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n if (parsed.branches) {\n condition.branches = Array.isArray(parsed.branches)\n ? parsed.branches.map(String)\n : String(parsed.branches).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n\n if (hasCondition) {\n hook.condition = condition;\n }\n\n return hook;\n}\n","import { dirname } from \"node:path\";\nimport type {\n AdapterOutput,\n Features,\n GenerationMode,\n HatchManifest,\n} from \"../types.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization, applyCustomizationRaw } from \"./customization.js\";\nimport { readMcpConfig, transformEnvVarSyntax, type McpServerEntry } from \"./mcp-utils.js\";\nimport { readHookDefinitions } from \"../hooks/index.js\";\n\nexport interface Adapter {\n name: string;\n warnings: string[];\n generate(agentsDir: string, manifest: HatchManifest, generationMode?: GenerationMode): Promise<AdapterOutput[]>;\n getOutputPaths(agentsDir: string, manifest: HatchManifest): Promise<string[]>;\n}\n\n/** Convenience factory for creating an AdapterOutput with `action: \"create\"`. */\nexport function output(\n path: string,\n content: string,\n managedContent?: string,\n): AdapterOutput {\n return { path, content, managedContent, action: \"create\" };\n}\n\nexport interface AdapterContext {\n agentsDir: string;\n manifest: HatchManifest;\n features: Features;\n projectRoot: string;\n /** Generation verbosity mode. \"minimal\" strips comments, descriptions, and reduces formatting. */\n generationMode: GenerationMode;\n}\n\nexport interface ModelFormat {\n text: string;\n after?: boolean;\n}\n\nexport type CleanMcpEntry = Omit<McpServerEntry, \"_disabled\" | \"_description\">;\n\nfunction defaultModelFormat(model: string): ModelFormat {\n return { text: `**Recommended model:** \\`${model}\\`` };\n}\n\nexport abstract class BaseAdapter implements Adapter {\n abstract readonly name: string;\n warnings: string[] = [];\n\n /**\n * Generate adapter output files from canonical content.\n *\n * Output structure contract -- each AdapterOutput returned MUST satisfy:\n * - `path` must be a valid relative path (no absolute paths, no leading `/`)\n * - `path` must not traverse upward (no `..` segments)\n * - `content` must be non-empty (zero-length content indicates a generation bug)\n * - `managedContent`, if present, must be a substring of `content` (it represents\n * the hatch3r-managed portion within the full file content)\n *\n * Adapters that violate these invariants will produce broken output files or\n * corrupt user content during the merge phase.\n */\n async generate(agentsDir: string, manifest: HatchManifest, generationMode: GenerationMode = \"standard\"): Promise<AdapterOutput[]> {\n this.warnings = [];\n this._cachedOutputPaths = null; // Invalidate path cache on re-generation\n const outputs = await this.doGenerate({\n agentsDir,\n manifest,\n features: manifest.features,\n projectRoot: dirname(agentsDir),\n generationMode,\n });\n\n // #119: Validate output invariants to catch generation bugs early\n for (const out of outputs) {\n if (out.path.startsWith(\"/\") || out.path.includes(\"..\")) {\n this.warnings.push(`[${this.name}] Invalid output path \"${out.path}\" — must be relative with no traversal`);\n }\n if (!out.content) {\n this.warnings.push(`[${this.name}] Empty content for output \"${out.path}\" — possible generation bug`);\n }\n if (out.managedContent && !out.content.includes(out.managedContent)) {\n this.warnings.push(`[${this.name}] managedContent is not a substring of content for \"${out.path}\"`);\n }\n }\n\n return outputs;\n }\n\n /**\n * Returns the list of output file paths this adapter would produce.\n *\n * The default implementation calls `generate()` and extracts paths, which\n * is correct but incurs the cost of full content generation. Subclasses\n * that can determine paths without rendering content (e.g. adapters with\n * fixed output paths or paths derived only from canonical file IDs)\n * should override this with a lightweight implementation.\n *\n * Caches the result so repeated calls do not re-generate.\n */\n private _cachedOutputPaths: string[] | null = null;\n async getOutputPaths(agentsDir: string, manifest: HatchManifest): Promise<string[]> {\n if (this._cachedOutputPaths) return this._cachedOutputPaths;\n const outputs = await this.generate(agentsDir, manifest);\n this._cachedOutputPaths = outputs.map((o) => o.path);\n return this._cachedOutputPaths;\n }\n\n protected abstract doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]>;\n\n /**\n * Returns the raw bridge orchestration content (no surrounding headers).\n * Use this when the adapter needs custom formatting around the bridge content.\n */\n protected async bridgeOrchestration(ctx: AdapterContext): Promise<string> {\n const orchestration = await generateBridgeOrchestration(ctx.agentsDir, ctx.manifest.content?.preset);\n return this.isMinimal(ctx) ? this.stripMinimal(orchestration) : orchestration;\n }\n\n protected async bridgeHeader(ctx: AdapterContext, agentsPath = \"/.agents/AGENTS.md\"): Promise<string[]> {\n const orchestration = await this.bridgeOrchestration(ctx);\n if (this.isMinimal(ctx)) {\n return [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n `Instructions: \\`${agentsPath}\\``,\n \"\",\n orchestration,\n \"\",\n ];\n }\n return [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n `Full canonical agent instructions are at \\`${agentsPath}\\`.`,\n \"\",\n orchestration,\n \"\",\n ];\n }\n\n /** Read canonical rules and format them as inline markdown sections. */\n protected async inlineRules(ctx: AdapterContext): Promise<string[]> {\n if (!ctx.features.rules) return [];\n const lines: string[] = [];\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const minimal = this.isMinimal(ctx);\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n if (minimal) {\n lines.push(`## ${rule.id}`, \"\", this.stripMinimal(content), \"\");\n } else {\n lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\n }\n }\n return lines;\n }\n\n /** Read canonical agents and format them as inline markdown sections with optional model annotations. */\n protected async inlineAgents(\n ctx: AdapterContext,\n formatModel?: (model: string) => ModelFormat,\n ): Promise<string[]> {\n if (!ctx.features.agents) return [];\n const lines: string[] = [];\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n const minimal = this.isMinimal(ctx);\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const fmt = model ? (formatModel ?? defaultModelFormat)(model) : undefined;\n lines.push(`## Agent: ${agent.id}`);\n if (fmt && !fmt.after) lines.push(fmt.text);\n if (minimal) {\n lines.push(\"\", this.stripMinimal(content));\n } else {\n lines.push(\"\", desc, \"\", content);\n }\n if (fmt?.after) lines.push(\"\", fmt.text);\n lines.push(\"\");\n }\n return lines;\n }\n\n /** Process skills and output each as a raw managed-block file at the path returned by `pathFn`. */\n protected async processSkillsRaw(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.skills) return [];\n const results: AdapterOutput[] = [];\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n results.push(output(pathFn(skill.id), wrapInManagedBlock(content), content));\n }\n return results;\n }\n\n /** Process skills and output each with YAML frontmatter (name, description) at the path returned by `pathFn`. */\n protected async processSkillsWithFm(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.skills) return [];\n const results: AdapterOutput[] = [];\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? skill.description;\n const fm = `---\\nname: ${skill.id}\\ndescription: ${desc}\\n---`;\n results.push(output(pathFn(skill.id), `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n return results;\n }\n\n /** Process commands and output each as a raw managed-block file at the path returned by `pathFn`. */\n protected async processCommandsRaw(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.commands) return [];\n const results: AdapterOutput[] = [];\n const commands = await readCanonicalFiles(ctx.agentsDir, \"commands\");\n for (const cmd of commands) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, cmd);\n this.warnings.push(...warnings);\n if (skip) continue;\n results.push(output(pathFn(cmd.id), wrapInManagedBlock(content), content));\n }\n return results;\n }\n\n /** Read MCP server config and filter to only the servers selected in the manifest. */\n protected async readFilteredMcp(\n ctx: AdapterContext,\n ): Promise<Record<string, CleanMcpEntry> | null> {\n if (!ctx.features.mcp || ctx.manifest.mcp.servers.length === 0) return null;\n const { servers: mcpServers, warnings } = await readMcpConfig(ctx.agentsDir);\n this.warnings.push(...warnings);\n if (Object.keys(mcpServers).length === 0) return null;\n const selectedSet = new Set(ctx.manifest.mcp.servers);\n const filtered: Record<string, CleanMcpEntry> = {};\n for (const [name, entry] of Object.entries(mcpServers)) {\n if (entry._disabled) continue;\n if (!selectedSet.has(name)) continue;\n const { _disabled, _description, ...clean } = entry;\n filtered[name] = clean;\n }\n return Object.keys(filtered).length > 0 ? filtered : null;\n }\n\n /** Build a standard MCP server configuration object from filtered entries, with env var syntax transformation. */\n protected buildStdMcpEntries(\n filtered: Record<string, CleanMcpEntry>,\n envVarFormat: \"claude\" | \"shell\" | \"passthrough\" = \"passthrough\",\n ): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(filtered)) {\n if (server.command) {\n const entry: Record<string, unknown> = {\n command: server.command,\n args: server.args || [],\n ...(server.env && Object.keys(server.env).length > 0\n ? { env: transformEnvVarSyntax(server.env, envVarFormat) }\n : {}),\n };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.headers = transformEnvVarSyntax(server.headers, envVarFormat);\n }\n result[name] = entry;\n } else if (server.url) {\n const entry: Record<string, unknown> = { url: server.url };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.headers = transformEnvVarSyntax(server.headers, envVarFormat);\n }\n result[name] = entry;\n }\n }\n return result;\n }\n\n protected async readHooks(ctx: AdapterContext) {\n if (!ctx.features.hooks) return [];\n return readHookDefinitions(ctx.agentsDir);\n }\n\n /** Returns true when the adapter is running in minimal generation mode. */\n protected isMinimal(ctx: AdapterContext): boolean {\n return ctx.generationMode === \"minimal\";\n }\n\n /**\n * Strip verbose content for minimal generation mode.\n * Removes markdown comments, collapses excessive blank lines,\n * strips decorative formatting, and trims descriptions.\n */\n protected stripMinimal(content: string): string {\n let result = content;\n // Remove HTML comments\n result = result.replace(/<!--[\\s\\S]*?-->/g, \"\");\n // Remove lines that are only horizontal rules\n result = result.replace(/^[-*_]{3,}\\s*$/gm, \"\");\n // Collapse 3+ consecutive blank lines to a single blank line\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n // Trim leading/trailing whitespace\n result = result.trim();\n return result;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\n\n// AGENTS.md adapter — generates a standalone AGENTS.md file at the project root\n// following the AAIF (AI Agent Instruction File) convention. Over 60K repos use\n// this format to declare agent capabilities, instructions, and rules in a single\n// discoverable markdown file.\nexport class AgentsMdAdapter extends BaseAdapter {\n readonly name = \"agents-md\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const minimal = this.isMinimal(ctx);\n const sections: string[] = [];\n\n // Header\n sections.push(\"# Agents\");\n sections.push(\"\");\n if (!minimal) {\n sections.push(\"This file defines the available AI agents, rules, and skills for this project.\");\n sections.push(\"Generated by [hatch3r](https://github.com/hatch3r/hatch3r).\");\n sections.push(\"\");\n }\n\n // Bridge orchestration\n const orchestration = await this.bridgeOrchestration(ctx);\n if (orchestration.trim()) {\n sections.push(orchestration);\n sections.push(\"\");\n }\n\n // Agents section\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? agent.description;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n\n sections.push(`## Agent: ${agent.id}`);\n sections.push(\"\");\n if (!minimal) {\n sections.push(desc);\n sections.push(\"\");\n }\n if (model) {\n sections.push(`**Model:** \\`${model}\\``);\n sections.push(\"\");\n }\n sections.push(\"### Instructions\");\n sections.push(\"\");\n sections.push(minimal ? this.stripMinimal(content) : content);\n sections.push(\"\");\n }\n }\n\n // Rules section\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const enabledRules: Array<{ id: string; description: string; content: string }> = [];\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n enabledRules.push({ id: rule.id, description: desc, content });\n }\n if (enabledRules.length > 0) {\n sections.push(\"## Rules\");\n sections.push(\"\");\n for (const rule of enabledRules) {\n sections.push(`### ${rule.id}`);\n sections.push(\"\");\n if (!minimal) {\n sections.push(rule.description);\n sections.push(\"\");\n }\n sections.push(minimal ? this.stripMinimal(rule.content) : rule.content);\n sections.push(\"\");\n }\n }\n }\n\n // Skills section\n if (ctx.features.skills) {\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n const enabledSkills: Array<{ id: string; description: string; content: string }> = [];\n for (const skill of skills) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? skill.description;\n enabledSkills.push({ id: skill.id, description: desc, content });\n }\n if (enabledSkills.length > 0) {\n sections.push(\"## Skills\");\n sections.push(\"\");\n for (const skill of enabledSkills) {\n sections.push(`### ${skill.id}`);\n sections.push(\"\");\n if (!minimal) {\n sections.push(skill.description);\n sections.push(\"\");\n }\n sections.push(minimal ? this.stripMinimal(skill.content) : skill.content);\n sections.push(\"\");\n }\n }\n }\n\n const inner = sections.join(\"\\n\");\n return [output(\"AGENTS.md\", wrapInManagedBlock(inner), inner)];\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\n/**\n * Aider adapter.\n *\n * Generates `CONVENTIONS.md` (bridge with inline rules/agents),\n * skills in `.aider/skills/`, and `.aider.conf.yml` pointing to\n * CONVENTIONS.md and AGENTS.md. Aider has no MCP or hooks support.\n */\nexport class AiderAdapter extends BaseAdapter {\n readonly name = \"aider\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n\n const results: AdapterOutput[] = [\n output(\"CONVENTIONS.md\", wrapInManagedBlock(inner), inner),\n ];\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.aider/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n // Note: Aider config is output as YAML (.aider.conf.yml). If TOML output is\n // ever added for Aider, all string values must be properly escaped using\n // escapeTomlString() from toml-utils.ts to handle backslashes, quotes, and\n // control characters correctly.\n results.push(output(\".aider.conf.yml\", [\n \"# Managed by hatch3r — do not edit manually\",\n \"read:\",\n \" - CONVENTIONS.md\",\n \" - .agents/AGENTS.md\",\n \"auto-lint: true\",\n \"\",\n ].join(\"\\n\")));\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\n\n// Amazon Q lifecycle hook events.\n// Amazon Q supports 5 lifecycle events for custom agent hooks.\n// Reference: https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-cli-agents.html\nfunction mapToAmazonQEvent(event: HookEvent): string | null {\n const mapping: Partial<Record<HookEvent, string>> = {\n \"pre-commit\": \"onPreCommit\",\n \"file-save\": \"onFileSave\",\n \"session-start\": \"onSessionStart\",\n \"post-merge\": \"onPostMerge\",\n \"ci-failure\": \"onCIFailure\",\n };\n return mapping[event] ?? null;\n}\n\n// Amazon Q custom agent descriptor — written to .amazonq/cli-agents/{name}.json.\n// Reference: https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-cli-agents.html\ninterface AmazonQAgentDescriptor {\n name: string;\n description: string;\n instructions: string;\n hooks?: Record<string, { agent: string; description: string }>;\n}\n\nexport class AmazonQAdapter extends BaseAdapter {\n readonly name = \"amazon-q\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".amazonq/rules/hatch3r-agents.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.amazonq/rules/hatch3r-skill-${id}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n results.push(output(\".amazonq/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n // Generate native Amazon Q custom agent descriptors in .amazonq/cli-agents/.\n // Each canonical agent maps to a JSON descriptor that Amazon Q discovers natively.\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? agent.description;\n const descriptor: AmazonQAgentDescriptor = {\n name: toPrefixedId(agent.id),\n description: desc,\n instructions: content,\n };\n results.push(output(\n `.amazonq/cli-agents/${toPrefixedId(agent.id)}.json`,\n JSON.stringify(descriptor, null, 2),\n ));\n }\n }\n\n // Generate hooks as lifecycle event bindings.\n // Amazon Q supports 5 lifecycle events: onPreCommit, onFileSave,\n // onSessionStart, onPostMerge, onCIFailure.\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n const hookLines: string[] = [\"# Hatch3r Hooks\", \"\"];\n for (const hook of hooks) {\n const amazonQEvent = mapToAmazonQEvent(hook.event);\n if (!amazonQEvent) continue;\n hookLines.push(`## ${hook.id}`, \"\");\n hookLines.push(`**Event:** ${amazonQEvent} (${hook.event})`);\n hookLines.push(`**Agent:** ${hook.agent}`);\n hookLines.push(`**Description:** ${hook.description}`);\n if (hook.condition?.globs) {\n hookLines.push(`**Globs:** ${hook.condition.globs.join(\", \")}`);\n }\n hookLines.push(\"\");\n hookLines.push(`HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`);\n hookLines.push(\"\");\n }\n if (hookLines.length > 2) {\n const hookContent = hookLines.join(\"\\n\");\n results.push(output(\".amazonq/rules/hatch3r-hooks.md\", wrapInManagedBlock(hookContent), hookContent));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\n/**\n * Amp adapter.\n *\n * Generates `AGENTS.md` (root-level bridge with inline rules/agents),\n * skills in `.agents/skills/`, and `.amp/settings.json` for MCP.\n * Amp reads commands natively from `.agents/commands/`.\n */\nexport class AmpAdapter extends BaseAdapter {\n readonly name = \"amp\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx, (m) => ({\n text: `**Recommended model:** \\`${m}\\`. Use Smart mode for Opus, Rush for Haiku, Deep for Codex.`,\n })),\n ].join(\"\\n\");\n results.push(output(\"AGENTS.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.agents/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n results.push(output(\".amp/settings.json\", JSON.stringify({ \"amp.mcpServers\": entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\n/**\n * Antigravity adapter.\n *\n * Generates `.antigravity/rules.md` (bridge with inline rules/agents),\n * skills in `.antigravity/skills/`, and `.antigravity/settings.json`\n * for MCP server configuration. No hooks or commands support.\n */\nexport class AntigravityAdapter extends BaseAdapter {\n readonly name = \"antigravity\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx, \".agents/AGENTS.md\"),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".antigravity/rules.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.antigravity/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n results.push(output(\".antigravity/settings.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { transformEnvVarSyntax } from \"./mcp-utils.js\";\nimport type { HookDefinition, HookEvent } from \"../hooks/types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nconst AGENT_TEAMS_SECTION = [\n \"## Agent Teams\",\n \"\",\n \"This project uses hatch3r's 4-phase sub-agent pipeline (Research -> Implement -> Review -> Quality)\",\n \"which maps directly to Claude Code Agent Teams. Each phase becomes a teammate role.\",\n \"\",\n \"### Enabling Agent Teams\",\n \"\",\n \"Agent Teams is enabled via `.claude/settings.json`. The env var `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`\",\n \"is set automatically by hatch3r. Once enabled, request a team in the prompt:\",\n \"\",\n \"```\",\n 'Create an agent team for this task. Use the hatch3r 4-phase pipeline.',\n \"```\",\n \"\",\n \"### Teammate Display Modes\",\n \"\",\n \"Agent Teams supports two display modes configured via `teammateMode` in `.claude/settings.json`:\",\n \"\",\n '- `\"auto\"` (default): uses split panes if inside tmux, in-process otherwise.',\n '- `\"in-process\"`: all teammates run inside your main terminal. Use Shift+Down to cycle.',\n '- `\"tmux\"`: each teammate gets its own pane. Requires tmux or iTerm2.',\n \"\",\n \"### Pipeline-to-Team Mapping\",\n \"\",\n \"| Phase | Teammate Role | hatch3r Agents | Delegation Notes |\",\n \"|-------|--------------|----------------|------------------|\",\n \"| **1 — Research** | `researcher` | `hatch3r-researcher`, `hatch3r-learnings-loader` | Read-only; shares findings via task list |\",\n \"| **2 — Implement** | `implementer` | `hatch3r-implementer` | Require plan approval for complex tasks |\",\n \"| **3 — Review** | `reviewer` | `hatch3r-reviewer`, `hatch3r-fixer` | Review loop: reviewer finds issues, fixer resolves them |\",\n \"| **4 — Quality** | `quality-*` (parallel) | `hatch3r-test-writer`, `hatch3r-security-auditor`, `hatch3r-docs-writer`, `hatch3r-lint-fixer`, `hatch3r-a11y-auditor`, `hatch3r-perf-profiler`, `hatch3r-dependency-auditor` | Spawn in parallel; each owns distinct files |\",\n \"\",\n \"### Spawn Prompt Template\",\n \"\",\n \"When creating a team, use explicit file boundaries and role assignments:\",\n \"\",\n \"```\",\n \"Create an agent team with these roles:\",\n \"1. researcher — gather context from src/ and docs/. Read-only, no code changes.\",\n \" Share findings via the task list.\",\n \"2. implementer — implement changes in {target directories}.\",\n \" Require plan approval before making changes.\",\n \"3. reviewer — review the implementer's changes for correctness, style, and security.\",\n \" Post findings to the task list.\",\n \"4. test-writer — write tests for the implemented changes in {test directories}.\",\n \"5. security-auditor — audit changes for security vulnerabilities. Read-only.\",\n \"```\",\n \"\",\n \"### Delegation Rules\",\n \"\",\n \"- **Researcher before implementer**: Block implementer tasks on researcher completion.\",\n \" The lead should not approve the implementer's plan until researcher findings are posted.\",\n \"- **Reviewer in loop**: After implementation, the reviewer teammate inspects changes.\",\n \" If critical issues are found, message the implementer directly to fix them.\",\n \"- **Quality in parallel**: Once review is clean, spawn quality teammates simultaneously.\",\n \" Each quality teammate owns a distinct concern (tests, security, docs) to avoid conflicts.\",\n \"- **Plan approval**: Require plan approval for the implementer teammate to ensure\",\n \" the implementation approach aligns with researcher findings before any code is written.\",\n \"\",\n \"### Quality Gate Hooks\",\n \"\",\n \"The `TaskCompleted` and `TeammateIdle` hooks in `.claude/settings.json` enforce the pipeline:\",\n \"\",\n \"- `TaskCompleted` validates that completed tasks meet review criteria before marking done.\",\n \"- `TeammateIdle` checks whether idle teammates can pick up pending quality-phase tasks.\",\n \"\",\n \"### Important Notes\",\n \"\",\n \"- Teammates read this `CLAUDE.md` automatically — all hatch3r instructions apply to every teammate.\",\n \"- Teammates do **not** inherit conversation history; include full task context in spawn prompts.\",\n \"- Assign explicit file boundaries to avoid edit conflicts between teammates.\",\n \"- Use the `hatch3r-agent-team` command (`/hatch3r-agent-team`) for guided team creation.\",\n];\n\n/** Minimal version of Agent Teams section -- essential mapping only, no prose. */\nconst AGENT_TEAMS_SECTION_MINIMAL = [\n \"## Agent Teams\",\n \"\",\n \"Pipeline maps to Claude Code Agent Teams. Enable via `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`.\",\n \"\",\n \"| Phase | Role | Agents |\",\n \"|-------|------|--------|\",\n \"| Research | `researcher` | `hatch3r-researcher` |\",\n \"| Implement | `implementer` | `hatch3r-implementer` |\",\n \"| Review | `reviewer` | `hatch3r-reviewer`, `hatch3r-fixer` |\",\n \"| Quality | `quality-*` | `hatch3r-test-writer`, `hatch3r-security-auditor`, + conditional |\",\n \"\",\n \"Use `/hatch3r-agent-team` for guided team creation.\",\n];\n\nconst AGENT_TEAM_COMMAND = `# hatch3r Agent Team\n\nCreate a Claude Code Agent Team that follows the hatch3r 4-phase pipeline.\n\n## Usage\n\nDescribe the task when invoking this command. The team will be structured according\nto the hatch3r pipeline: Research → Implement → Review → Quality.\n\n## Team Structure\n\nSet up an Agent Team with these roles based on the task described above:\n\n### Phase 1 — Research (read-only)\n\nSpawn a \\`researcher\\` teammate:\n- Read the codebase to understand context, patterns, and conventions\n- Identify affected files and blast radius\n- Share findings via the shared task list\n- Do NOT modify any files\n\n### Phase 2 — Implement (requires plan approval)\n\nSpawn an \\`implementer\\` teammate after the researcher completes:\n- Review the researcher's findings from the task list before planning\n- Create a plan and submit for approval before writing code\n- Implement changes within the assigned file boundaries\n- Mark implementation tasks complete when done\n\n### Phase 3 — Review\n\nSpawn a \\`reviewer\\` teammate after implementation:\n- Review all changes made by the implementer\n- Post findings (Critical/Warning/Info) to the task list\n- If Critical or Warning findings exist, message the implementer to fix\n- Re-review after fixes; repeat up to 3 iterations\n\n### Phase 4 — Quality (parallel)\n\nAfter review is clean, spawn quality teammates in parallel:\n- \\`test-writer\\` — write/update tests for the changes\n- \\`security-auditor\\` — audit for security vulnerabilities (read-only)\n- \\`docs-writer\\` — update documentation if APIs or behavior changed\n\nEach quality teammate owns distinct files to avoid conflicts.\n\n## Task Dependencies\n\n- implementer depends on researcher\n- reviewer depends on implementer\n- quality teammates depend on reviewer (clean review)\n\n## Important\n\n- Teammate display mode is configured in \\`.claude/settings.json\\` via \\`teammateMode\\` (\\`auto\\`, \\`in-process\\`, or \\`tmux\\`)\n- Override for a single session: \\`claude --teammate-mode in-process\\`\n- Each teammate reads CLAUDE.md and inherits project rules automatically\n- Assign explicit file/directory boundaries to each teammate\n- The lead coordinates; it should NOT implement code itself (use delegate mode)\n`;\n\n// Claude Code hooks use an event+matcher pattern, not direct git hook names.\n// Each hook fires on a Claude event (e.g. PreToolUse, PostToolUse, SessionStart)\n// paired with a tool matcher regex that scopes when the hook triggers.\n//\n// Mapping from hatch3r canonical hook events to Claude Code hook semantics:\n// pre-commit -> PreToolUse + matcher \"Bash\" (intercept before shell commands)\n// post-merge -> PostToolUse + matcher \"Bash\" (react after shell commands)\n// ci-failure -> SubagentStart + matcher \"Bash\" (trigger on sub-agent launch)\n// file-save -> PostToolUse + matcher \"Write\" (react after file writes)\n// session-start -> SessionStart + matcher \".*\" (fire on every session start)\n// pre-push -> PreToolUse + matcher \"Bash\" (intercept before shell commands)\nfunction mapToClaudeEvent(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"PreToolUse\",\n \"post-merge\": \"PostToolUse\",\n \"ci-failure\": \"SubagentStart\",\n \"file-save\": \"PostToolUse\",\n \"session-start\": \"SessionStart\",\n \"pre-push\": \"PreToolUse\",\n \"worktree-create\": \"PostToolUse\",\n \"worktree-remove\": \"PreToolUse\",\n };\n return mapping[event] || event;\n}\n\nfunction getClaudeToolMatcher(hook: HookDefinition): string {\n const eventToolMap: Record<HookEvent, string> = {\n \"pre-commit\": \"Bash\",\n \"post-merge\": \"Bash\",\n \"file-save\": \"Write\",\n \"session-start\": \".*\",\n \"pre-push\": \"Bash\",\n \"ci-failure\": \"Bash\",\n \"worktree-create\": \"Bash\",\n \"worktree-remove\": \"Bash\",\n };\n return eventToolMap[hook.event] || \".*\";\n}\n\nexport class ClaudeAdapter extends BaseAdapter {\n readonly name = \"claude\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n const minimal = this.isMinimal(ctx);\n\n const bridgeOrchestration = await this.bridgeOrchestration(ctx);\n const teamsSection = minimal ? AGENT_TEAMS_SECTION_MINIMAL : AGENT_TEAMS_SECTION;\n const innerParts = minimal\n ? [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Instructions: `.agents/AGENTS.md`. Rules: `.claude/rules/`. Agents: `.claude/agents/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...teamsSection,\n \"\",\n ]\n : [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Full canonical agent instructions are at `.agents/AGENTS.md`.\",\n \"Rules are managed in `.claude/rules/` and agents in `.claude/agents/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...teamsSection,\n \"\",\n \"## Personal Settings\",\n \"\",\n \"Create `CLAUDE.local.md` for personal settings (not committed to git).\",\n \"Claude Code reads this file for user-specific preferences.\",\n \"\",\n \"## Getting Started with Claude Code\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.claude/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use `/hatch3r-feature` or `/hatch3r-bug-fix` commands for guided workflows.\",\n \"**Then:** Delegate to agents in `.claude/agents/` — use Agent Teams for parallel execution.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ];\n const innerContent = innerParts.join(\"\\n\");\n results.push(output(\"CLAUDE.md\", wrapInManagedBlock(innerContent), innerContent));\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const body = minimal\n ? `# ${rule.id}\\n\\n${this.stripMinimal(content)}`\n : `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.claude/rules/${toPrefixedId(rule.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const fm = `---\\ndescription: ${desc}\\n---`;\n if (minimal) {\n const modelNote = model ? `\\nModel: \\`${model}\\`` : \"\";\n const body = `${this.stripMinimal(content)}${modelNote}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n } else {\n const modelGuidance = model\n ? `\\n\\n## Recommended Model\\n\\nPreferred: \\`${model}\\`. Set via \\`/model ${model}\\` or env \\`CLAUDE_CODE_SUBAGENT_MODEL=${model}\\`.`\n : \"\";\n const body = `${content}${modelGuidance}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n }\n\n const defaultAllow = [\"Read\", \"Edit\", \"MultiEdit\", \"Write\", \"Grep\", \"Glob\", \"LS\", \"TodoRead\", \"TodoWrite\"];\n const claudeConfig = ctx.manifest.claude;\n\n // Agent Teams GA compatibility: use \"auto\" as default teammateMode.\n // #264 (D9-9.35): Legacy values are deprecated; warn and map to \"auto\".\n const DEPRECATED_TEAMMATE_MODES = new Set([\"tool-using\", \"full-trust\", \"manual-approval\"]);\n const rawTeammateMode = claudeConfig?.teammateMode ?? \"auto\";\n if (DEPRECATED_TEAMMATE_MODES.has(rawTeammateMode)) {\n this.warnings.push(\n `claude: teammateMode \"${rawTeammateMode}\" is deprecated. ` +\n `Use \"auto\", \"in-process\", or \"tmux\" instead. Defaulting to \"auto\".`,\n );\n }\n const teammateMode = DEPRECATED_TEAMMATE_MODES.has(rawTeammateMode) ? \"auto\" : rawTeammateMode;\n\n const settingsObj: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n permissions: {\n allow: claudeConfig?.permissions?.allow ?? defaultAllow,\n deny: claudeConfig?.permissions?.deny ?? [],\n },\n teammateMode,\n };\n\n const hooksConfig: Record<string, Array<{ matcher: string; hooks: Array<{ type: string; command: string }> }>> = {};\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const claudeEvent = mapToClaudeEvent(hook.event);\n if (!hooksConfig[claudeEvent]) hooksConfig[claudeEvent] = [];\n hooksConfig[claudeEvent].push({\n matcher: getClaudeToolMatcher(hook),\n hooks: [{ type: \"command\", command: `echo \"HATCH3R_HOOK_ACTIVATED: Spawn the ${hook.agent} agent now. Follow the ${hook.agent} agent protocol in .claude/agents/${toPrefixedId(hook.agent)}.md. Event: ${hook.event}. Hook ID: ${hook.id}.\"` }],\n });\n }\n\n hooksConfig.TaskCompleted = [{\n matcher: \".*\",\n hooks: [{ type: \"command\", command: \"echo \\\"HATCH3R_QUALITY_GATE: Before marking this task complete, verify: (1) Phase 3 review loop passed with 0 Critical + 0 Warning, (2) Phase 4 specialists ran (hatch3r-test-writer + hatch3r-security-auditor at minimum), (3) all acceptance criteria met. If any check fails, do NOT mark complete — spawn the appropriate agent to address the gap.\\\"\" }],\n }];\n hooksConfig.TeammateIdle = [{\n matcher: \".*\",\n hooks: [{ type: \"command\", command: \"echo \\\"HATCH3R_PIPELINE_CHECK: Idle teammate detected. Check for pending Phase 4 quality tasks: hatch3r-test-writer, hatch3r-security-auditor, hatch3r-docs-writer, hatch3r-lint-fixer, hatch3r-a11y-auditor. If any are pending and within this teammate's scope, pick up the next task.\\\"\" }],\n }];\n\n // Worktree file isolation: detect `git worktree add` and sync gitignored files\n if (ctx.manifest.worktree?.enabled) {\n if (!hooksConfig.PostToolUse) hooksConfig.PostToolUse = [];\n hooksConfig.PostToolUse.push({\n matcher: \"Bash\",\n hooks: [{\n type: \"command\",\n command: 'bash -c \\'CMD=\"${TOOL_INPUT:-}\"; if echo \"$CMD\" | grep -q \"git worktree add\"; then ARGS=\"${CMD#*git worktree add}\"; WTDIR=\"\"; SKIP=false; for w in $ARGS; do if $SKIP; then SKIP=false; continue; fi; case \"$w\" in -b|-B|--reason) SKIP=true;; -*) ;; *) WTDIR=\"$w\"; break;; esac; done; [ -n \"$WTDIR\" ] && npx hatch3r worktree-setup \"$WTDIR\" || true; fi\\'',\n }],\n });\n }\n\n settingsObj.hooks = hooksConfig;\n\n // Agent Teams: when agentTeams is \"ga\", omit the experimental env var\n // (the feature is natively available). Otherwise, set the experimental flag\n // to enable Agent Teams unless explicitly disabled (agentTeams === false).\n const agentTeamsSetting = ctx.manifest.claude?.agentTeams;\n if (agentTeamsSetting === \"ga\") {\n // GA mode: no experimental flag needed, Agent Teams is natively available.\n // Only set env if there are other env vars to include.\n } else if (agentTeamsSetting !== false) {\n settingsObj.env = { CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: \"1\" };\n }\n results.push(output(\".claude/settings.json\", JSON.stringify(settingsObj, null, 2)));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.claude/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.claude/commands/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp) {\n const claudeMcp: Record<string, unknown> = {};\n for (const [name, entry] of Object.entries(mcp)) {\n const type = entry.command ? \"stdio\" : entry.url ? \"http\" : undefined;\n const withType = type ? { type, ...entry } : { ...entry };\n claudeMcp[name] = transformEnvVarSyntax(withType, \"claude\");\n }\n results.push(output(\".mcp.json\", JSON.stringify({ mcpServers: claudeMcp }, null, 2)));\n }\n\n results.push(output(\".claude/commands/hatch3r-agent-team.md\", wrapInManagedBlock(AGENT_TEAM_COMMAND), AGENT_TEAM_COMMAND));\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { transformEnvVarSyntax } from \"./mcp-utils.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\ninterface ClineCustomMode {\n slug: string;\n name: string;\n roleDefinition: string;\n groups: string[];\n customInstructions?: string;\n whenToUse?: string;\n}\n\nexport class ClineAdapter extends BaseAdapter {\n readonly name = \"cline\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const customModes: ClineCustomMode[] = [];\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const slug = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const modelGuidance = model\n ? `\\n\\nRecommended model: ${model}. Select this model in the Roo Code model dropdown when using this mode.`\n : \"\";\n customModes.push({\n slug,\n name: agent.id,\n roleDefinition: content + modelGuidance,\n groups: [\"read\", \"edit\", \"browser\", \"command\", \"mcp\"],\n whenToUse: overrides.description ?? agent.description,\n });\n }\n }\n if (customModes.length > 0) {\n results.push(output(\".roomodes\", JSON.stringify({\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n customModes,\n }, null, 2)));\n }\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.cline/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.roo/rules/${toPrefixedId(rule.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const globs = hook.condition?.globs || [];\n const body = [\n `# Hook: ${hook.id}`,\n \"\",\n `**Event:** ${hook.event}`,\n `**Agent:** ${hook.agent}`,\n \"\",\n hook.description,\n \"\",\n `HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered${globs.length > 0 ? ` for files matching ${globs.join(\", \")}` : \"\"}, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`,\n ].join(\"\\n\");\n results.push(output(`.roo/rules/${toPrefixedId(`hook-${hook.id}`)}.md`, wrapInManagedBlock(body), body));\n }\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.clinerules/workflows/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const rooMcp: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcp)) {\n if (server.command) {\n const entry: Record<string, unknown> = {\n command: server.command,\n args: server.args || [],\n ...(server.env && Object.keys(server.env).length > 0\n ? { env: transformEnvVarSyntax(server.env, \"shell\") }\n : {}),\n };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.headers = transformEnvVarSyntax(server.headers, \"shell\");\n }\n rooMcp[name] = entry;\n } else if (server.url) {\n const entry: Record<string, unknown> = { url: server.url, transport: \"streamable-http\" };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.headers = transformEnvVarSyntax(server.headers, \"shell\");\n }\n rooMcp[name] = entry;\n }\n }\n if (Object.keys(rooMcp).length > 0) {\n results.push(output(\".roo/mcp.json\", JSON.stringify({ mcpServers: rooMcp }, null, 2)));\n }\n }\n\n const bridgeOrchestration = await this.bridgeOrchestration(ctx);\n const bridgeBody = [\n \"# Hatch3r Bridge\",\n \"\",\n \"This project uses hatch3r for agentic coding setup.\",\n \"Canonical agent instructions live at `/.agents/AGENTS.md`.\",\n \"Rules and skills are managed in `.roo/rules/` and `.cline/skills/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n \"## Getting Started with Roo Code\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.roo/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use workflow commands in `.clinerules/workflows/` for guided task execution.\",\n \"**Then:** Switch to custom modes (defined in `.roomodes`) for specialized agent behaviors.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n ].join(\"\\n\");\n results.push(output(\".roo/rules/hatch3r-bridge.md\", wrapInManagedBlock(bridgeBody), bridgeBody));\n\n return results;\n }\n}\n","/**\n * Escape a string value for use in a TOML quoted string.\n *\n * Handles backslash, double-quote, backspace (`\\b`), form-feed (`\\f`),\n * tab, newline, and carriage-return per the TOML v1.0 spec.\n *\n * @param s - The raw string value to escape.\n * @returns The escaped string (without surrounding quotes).\n */\nexport function escapeTomlString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\x08/g, \"\\\\b\")\n .replace(/\\f/g, \"\\\\f\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\");\n}\n\n/**\n * TOML bare key regex — keys matching this pattern can be used unquoted.\n * TOML spec: bare keys may only contain A-Za-z0-9, dashes, and underscores.\n */\nconst TOML_BARE_KEY = /^[A-Za-z0-9_-]+$/;\n\n/**\n * Validate that a string is a valid TOML key. If not a valid bare key,\n * returns the key quoted. Throws if the key contains characters that\n * cannot be represented in TOML (e.g. newlines, control chars).\n */\nexport function tomlKey(key: string): string {\n if (TOML_BARE_KEY.test(key)) return key;\n // Keys with special chars need quoting — reject control characters\n if (/[\\x00-\\x08\\x0a-\\x1f\\x7f]/.test(key)) {\n throw new Error(`Invalid TOML key: contains control characters: \"${key}\"`);\n }\n return `\"${escapeTomlString(key)}\"`;\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { escapeTomlString, tomlKey } from \"./toml-utils.js\";\nimport { transformEnvVarSyntax } from \"./mcp-utils.js\";\n\n// Codex adapter — generates configuration for OpenAI Codex CLI.\n// Codex reads project config from the `.codex/` directory. Agent-specific\n// configurations are written as individual TOML files in `.codex/agents/`.\nexport class CodexAdapter extends BaseAdapter {\n readonly name = \"codex\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const configLines: string[] = [\n \"# Codex project configuration (managed by hatch3r)\",\n \"#\",\n \"# Do not manually edit — run `npx hatch3r sync` to regenerate.\",\n \"\",\n ];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const enabledRules = [];\n for (const rule of rules) {\n const { skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n enabledRules.push({ ...rule, description: desc });\n }\n if (enabledRules.length > 0) {\n configLines.push(\"# Additional instruction files (rules)\");\n for (const rule of enabledRules) {\n configLines.push(`# rule: ${rule.id} — ${rule.description}`);\n }\n configLines.push(\"\");\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n\n // Codex expects individual TOML files per agent, not sections in config.toml.\n // model_instructions_file is legacy/reserved — Codex discovers AGENTS.md natively.\n const agentLines: string[] = [\n \"# Codex agent configuration (managed by hatch3r)\",\n \"#\",\n \"# Do not manually edit — run `npx hatch3r sync` to regenerate.\",\n \"\",\n `description = \"${escapeTomlString(desc)}\"`,\n ];\n if (model) agentLines.push(`model = \"${escapeTomlString(model)}\"`);\n agentLines.push(\"\");\n results.push(output(`.codex/agents/${agentId}.toml`, agentLines.join(\"\\n\")));\n }\n }\n\n const mcpFiltered = await this.readFilteredMcp(ctx);\n if (mcpFiltered) {\n for (const [name, server] of Object.entries(mcpFiltered)) {\n configLines.push(`[mcp_servers.${name}]`);\n if (server.command) {\n configLines.push(`command = \"${escapeTomlString(server.command)}\"`);\n if (server.args && server.args.length > 0) {\n const argsStr = server.args.map((a) => `\"${escapeTomlString(a)}\"`).join(\", \");\n configLines.push(`args = [${argsStr}]`);\n }\n } else if (server.url) {\n configLines.push(`url = \"${escapeTomlString(server.url)}\"`);\n }\n // Codex v0.114+: use TOML table sections for env and headers.\n // Keys are validated against TOML bare-key rules via tomlKey().\n if (server.env && Object.keys(server.env).length > 0) {\n configLines.push(`[mcp_servers.${name}.env]`);\n for (const [k, v] of Object.entries(server.env)) {\n const transformed = transformEnvVarSyntax(v, \"shell\") as string;\n configLines.push(`${tomlKey(k)} = \"${escapeTomlString(transformed)}\"`);\n }\n }\n if (server.headers && Object.keys(server.headers).length > 0) {\n configLines.push(`[mcp_servers.${name}.headers]`);\n for (const [k, v] of Object.entries(server.headers)) {\n const transformed = transformEnvVarSyntax(v, \"shell\") as string;\n configLines.push(`${tomlKey(k)} = \"${escapeTomlString(transformed)}\"`);\n }\n }\n configLines.push(\"\");\n }\n }\n\n // Codex v0.114+ supports hooks\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n configLines.push(\"# Hooks (v0.114+)\");\n for (const hook of hooks) {\n configLines.push(`[hooks.\"${escapeTomlString(hook.event)}\"]`);\n configLines.push(`command = \"echo \\\\\"HATCH3R_HOOK_ACTIVATED: Spawn the ${escapeTomlString(hook.agent)} agent now. Event: ${escapeTomlString(hook.event)}. Hook ID: ${escapeTomlString(hook.id)}.\\\\\"\"`)\n if (hook.condition?.globs && hook.condition.globs.length > 0) {\n const globsStr = hook.condition.globs.map((g) => `\"${escapeTomlString(g)}\"`).join(\", \");\n configLines.push(`globs = [${globsStr}]`);\n }\n configLines.push(\"\");\n }\n }\n\n results.push(output(\".codex/config.toml\", configLines.join(\"\\n\")));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.codex/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n return results;\n }\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport type PackageManagerName = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nexport interface PackageManagerInfo {\n name: PackageManagerName;\n installCmd: string;\n installArgs: string[];\n updateCmd: string;\n updateArgs: string[];\n}\n\nconst LOCK_FILE_MAP: Array<{ file: string; name: PackageManagerName }> = [\n { file: \"bun.lockb\", name: \"bun\" },\n { file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n { file: \"yarn.lock\", name: \"yarn\" },\n];\n\nconst PM_INFO: Record<PackageManagerName, Omit<PackageManagerInfo, \"name\">> = {\n bun: { installCmd: \"bun\", installArgs: [\"install\"], updateCmd: \"bun\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n pnpm: { installCmd: \"pnpm\", installArgs: [\"install\"], updateCmd: \"pnpm\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n yarn: { installCmd: \"yarn\", installArgs: [\"install\"], updateCmd: \"yarn\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n npm: { installCmd: \"npm\", installArgs: [\"install\"], updateCmd: \"npm\", updateArgs: [\"install\", \"hatch3r@latest\"] },\n};\n\n/** Detect the project's package manager by checking for lockfile presence. Falls back to npm. */\nexport async function detectPackageManager(rootDir: string): Promise<PackageManagerInfo> {\n for (const { file, name } of LOCK_FILE_MAP) {\n try {\n await access(join(rootDir, file));\n return { name, ...PM_INFO[name] };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n return { name: \"npm\", ...PM_INFO.npm };\n}\n","import type {\n AdapterOutput,\n CanonicalFile,\n} from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { detectPackageManager } from \"../detect/packageManager.js\";\n\nexport class CopilotAdapter extends BaseAdapter {\n readonly name = \"copilot\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const alwaysRules: { rule: CanonicalFile; content: string }[] = [];\n const scopedRules: { rule: CanonicalFile; content: string; scope: string }[] = [];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n if (scope && scope !== \"always\") {\n scopedRules.push({ rule: { ...rule, description: overrides.description ?? rule.description }, content, scope });\n } else {\n alwaysRules.push({ rule: { ...rule, description: overrides.description ?? rule.description }, content });\n }\n }\n }\n\n const bridgeOrchestration = await this.bridgeOrchestration(ctx);\n const innerContent = [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Full canonical agent instructions are at `/.agents/AGENTS.md`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n \"## Hatch3r Rules\",\n \"\",\n ...alwaysRules.map(\n (r) => `### ${r.rule.id}\\n\\n${r.rule.description}\\n\\n${r.content}`,\n ),\n \"\",\n \"## Getting Started with Copilot\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Instructions in `.github/instructions/` scope rules to specific file patterns. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use prompts and commands in `.github/prompts/` for guided workflows.\",\n \"**Then:** Delegate to agents in `.github/agents/` for specialized tasks.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ].join(\"\\n\");\n results.push(output(\".github/copilot-instructions.md\", wrapInManagedBlock(innerContent), innerContent));\n\n const pm = await detectPackageManager(ctx.projectRoot);\n const install = [pm.installCmd, ...pm.installArgs].join(\" \");\n const build = `${pm.installCmd} run build`;\n const copilotSetupStepsInner = `name: \"Copilot Setup Steps\"\non: push\njobs:\n copilot-setup-steps:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - name: Install dependencies\n run: ${install}\n - name: Build\n run: ${build}`;\n results.push(output(\n \".github/workflows/copilot-setup-steps.yml\",\n wrapInManagedBlock(copilotSetupStepsInner) + \"\\n\",\n copilotSetupStepsInner,\n ));\n\n for (const { rule, content, scope } of scopedRules) {\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n const applyTo = globs.join(\", \");\n const fm = `---\\napplyTo: \"${applyTo}\"\\n---`;\n const body = `# ${rule.id}\\n\\n${rule.description}\\n\\n${content}`;\n results.push(\n output(\n `.github/instructions/${toPrefixedId(rule.id)}.instructions.md`,\n `${fm}\\n\\n${wrapInManagedBlock(body)}`,\n body,\n ),\n );\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`name: ${agent.id}`, `description: ${desc}`];\n if (model) lines.push(`model: ${model}`);\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(output(`.github/agents/${toPrefixedId(agent.id)}.agent.md`, `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n }\n\n if (ctx.features.prompts) {\n const prompts = await readCanonicalFiles(ctx.agentsDir, \"prompts\");\n for (const prompt of prompts) {\n const body = prompt.rawContent;\n results.push(output(`.github/prompts/${toPrefixedId(prompt.id)}.prompt.md`, wrapInManagedBlock(body), body));\n }\n }\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.github/prompts/${toPrefixedId(id)}.prompt.md`),\n );\n\n if (ctx.features.githubAgents) {\n const ghAgents = await readCanonicalFiles(ctx.agentsDir, \"github-agents\");\n for (const agent of ghAgents) {\n const body = agent.rawContent;\n results.push(output(`.github/agents/${toPrefixedId(agent.id)}.agent.md`, wrapInManagedBlock(body), body));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.github/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n // Use shared buildStdMcpEntries to avoid redundant env construction (#2.19)\n const vscodeServers = this.buildStdMcpEntries(mcp, \"shell\");\n results.push(output(\".vscode/mcp.json\", JSON.stringify({ servers: vscodeServers }, null, 2) + \"\\n\"));\n }\n\n return results;\n }\n}\n","import type {\n AdapterOutput,\n CanonicalFile,\n} from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { transformEnvVarSyntax } from \"./mcp-utils.js\";\n\n/**\n * The Cursor adapter generates .mdc files from .md canonical files by adding\n * Cursor-specific frontmatter (description, globs/alwaysApply) and wrapping\n * content in managed blocks. Rules get `alwaysApply: true` or `globs: [...]`\n * based on their scope. Agents get `name`, `description`, `model`, `readonly`,\n * and `is_background` frontmatter fields.\n */\nfunction cursorRuleFrontmatter(rule: CanonicalFile, scopeOverride?: string): string {\n const scope = scopeOverride ?? rule.scope;\n const lines: string[] = [`description: ${rule.description}`];\n if (scope === \"always\") {\n lines.push(\"alwaysApply: true\");\n } else if (scope) {\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n lines.push(`globs: [${globs.map((g) => `\"${g}\"`).join(\", \")}]`);\n } else {\n lines.push(\"alwaysApply: false\");\n }\n return `---\\n${lines.join(\"\\n\")}\\n---`;\n}\n\nfunction mdcOutput(path: string, frontmatter: string, body: string): AdapterOutput {\n return output(path, `${frontmatter}\\n\\n${wrapInManagedBlock(body)}`, body);\n}\n\nexport class CursorAdapter extends BaseAdapter {\n readonly name = \"cursor\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const ruleWithDesc = { ...rule, description: desc };\n const baseName = `${toPrefixedId(rule.id)}.mdc`;\n results.push(mdcOutput(`.cursor/rules/${baseName}`, cursorRuleFrontmatter(ruleWithDesc, overrides.scope), content));\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`name: ${agent.id}`, `description: ${desc}`];\n if (model) lines.push(`model: ${model}`);\n if (agent.readonly) lines.push(\"readonly: true\");\n if (agent.background) lines.push(\"is_background: true\");\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(mdcOutput(`.cursor/agents/${toPrefixedId(agent.id)}.md`, fm, content));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.cursor/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.cursor/commands/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp) {\n const transformed = transformEnvVarSyntax(mcp, \"shell\") as Record<string, Record<string, unknown>>;\n results.push(output(\".cursor/mcp.json\", JSON.stringify({ mcpServers: transformed }, null, 2)));\n }\n\n const hookResults = await this.readHooks(ctx);\n for (const hook of hookResults) {\n const globs = hook.condition?.globs || [];\n const globLine =\n globs.length > 0\n ? `globs: [${globs.map((g: string) => `\"${g}\"`).join(\", \")}]`\n : \"alwaysApply: false\";\n const fm = `---\\ndescription: \"Hook: ${hook.description}\"\\n${globLine}\\n---`;\n const body = `# Hook: ${hook.id}\\n\\n**Event:** ${hook.event}\\n**Agent:** ${hook.agent}\\n\\n${hook.description}\\n\\nHATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered${globs.length > 0 ? ` for files matching ${globs.join(\", \")}` : \"\"}, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`;\n results.push(mdcOutput(`.cursor/rules/${toPrefixedId(`hook-${hook.id}`)}.mdc`, fm, body));\n }\n\n const bridgeFm = `---\ndescription: Bridge to canonical agent instructions and mandatory orchestration directives\nalwaysApply: true\n---`;\n const bridgeOrchestration = await this.bridgeOrchestration(ctx);\n const bridgeBody = `# Hatch3r Bridge\n\nThis project uses hatch3r for agentic coding setup.\nCanonical agent instructions live at \\`/.agents/AGENTS.md\\`.\n\n${bridgeOrchestration}\n\n## Cursor Subagent Configuration (v2.5+)\n\nCursor supports up to 4 subagents running in parallel. Custom subagents in \\`.cursor/agents/\\` support these frontmatter fields:\n- \\`model\\`: \\`fast\\`, \\`inherit\\`, or a specific model ID\n- \\`readonly\\`: \\`true\\` to restrict write permissions (verification/audit agents)\n- \\`background\\`: \\`true\\` to run without blocking the parent agent\n\nWhen delegating to hatch3r agents, explicitly request \"up to 4 in parallel\" for maximum throughput.\nBackground subagents write output to \\`~/.cursor/subagents/\\` for later inspection.\n\n## Cursor v2.6 Capabilities\n\nCursor v2.6 added MCP Apps (interactive UIs in agent chats) and Team Marketplaces for plugins.\nIf this project includes MCP servers that expose UI components, they will render inline as MCP Apps.\nPlugin configurations in \\`.cursor/mcp.json\\` are compatible with Team Marketplace distribution.\n\n## Getting Started with Cursor\n\nNew to this project's agent setup? Progress through these stages:\n\n**Start here:** Rules in \\`.cursor/rules/\\` are loaded automatically. The orchestration bridge above guides your workflow.\n**Next:** Use \\`/hatch3r-feature\\` or \\`/hatch3r-bug-fix\\` commands in Cursor chat for guided workflows.\n**Then:** Delegate to agents in \\`.cursor/agents/\\` — Cursor supports up to 4 subagents in parallel.\n**Later:** Customize agent behavior via \\`.hatch3r/{type}/{id}.customize.yaml\\` without editing managed files.`;\n results.push(mdcOutput(\".cursor/rules/hatch3r-bridge.mdc\", bridgeFm, bridgeBody));\n\n if (ctx.manifest.tools.includes(\"cursor\")) {\n const envConfig = {\n instructions: [\"Read /.agents/AGENTS.md for project instructions\"],\n mcpServers: {},\n };\n results.push(output(\".cursor/environment.json\", JSON.stringify(envConfig, null, 2) + \"\\n\"));\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\nimport { escapeTomlString } from \"./toml-utils.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nfunction mapToGeminiEvent(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"BeforeTool\",\n \"post-merge\": \"AfterTool\",\n \"ci-failure\": \"AfterAgent\",\n \"file-save\": \"AfterTool\",\n \"session-start\": \"SessionStart\",\n \"pre-push\": \"BeforeTool\",\n \"worktree-create\": \"AfterTool\",\n \"worktree-remove\": \"BeforeTool\",\n };\n return mapping[event] || event;\n}\n\nexport class GeminiAdapter extends BaseAdapter {\n readonly name = \"gemini\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx, \".agents/AGENTS.md\"),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx, (m) => ({\n text: `**Recommended model:** \\`${m}\\`. Set via \\`gemini --model ${m}\\` or select in Google AI Studio.`,\n after: true,\n })),\n ].join(\"\\n\");\n results.push(output(\"GEMINI.md\", wrapInManagedBlock(inner), inner));\n\n const settings: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n context: { fileName: [\"GEMINI.md\", \"AGENTS.md\"] },\n };\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n settings.mcpServers = entries;\n }\n }\n\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n const hooksObj: Record<string, Array<{ matcher: string; hooks: Array<{ type: string; command: string }> }>> = {};\n for (const hook of hooks) {\n const geminiEvent = mapToGeminiEvent(hook.event);\n if (!hooksObj[geminiEvent]) hooksObj[geminiEvent] = [];\n const matcher = hook.condition?.globs?.join(\"|\") || \".*\";\n hooksObj[geminiEvent].push({\n matcher,\n hooks: [{ type: \"command\", command: `echo \"HATCH3R_HOOK_ACTIVATED: Spawn the ${hook.agent} agent now. Follow the ${hook.agent} agent protocol in .gemini/agents/${toPrefixedId(hook.agent)}.md. Event: ${hook.event}. Hook ID: ${hook.id}.\"` }],\n });\n }\n settings.hooks = hooksObj;\n }\n\n results.push(output(\".gemini/settings.json\", JSON.stringify(settings, null, 2)));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.gemini/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n if (ctx.features.commands) {\n const commands = await readCanonicalFiles(ctx.agentsDir, \"commands\");\n for (const cmd of commands) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, cmd);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? cmd.description;\n const toml = [\n `description = \"${escapeTomlString(desc)}\"`,\n `prompt = \"${escapeTomlString(content)}\"`,\n ].join(\"\\n\");\n results.push(output(`.gemini/commands/${toPrefixedId(cmd.id)}.toml`, toml));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput, CanonicalFile } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext, type CleanMcpEntry } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomizationRaw } from \"./customization.js\";\nimport { transformEnvVarSyntax } from \"./mcp-utils.js\";\nimport { stringify as yamlStringify } from \"yaml\";\n\n// Goose profile structure — matches the actual Goose platform schema.\n// Goose profiles live at `.goose/profiles/{name}.yaml` and configure\n// instructions and extensions. MCP servers are configured as extensions\n// within the profile (there is no separate mcp.json in Goose).\n// Reference: https://block.github.io/goose/docs/getting-started/profiles\ninterface GooseProfile {\n instructions: string[];\n extensions?: GooseExtension[];\n}\n\n// Goose extension entry — configures an MCP server or builtin extension.\n// `type` is \"stdio\" for command-based servers, \"sse\" for SSE-based servers,\n// or \"builtin\" for Goose's built-in extensions.\n// Reference: https://block.github.io/goose/docs/getting-started/using-extensions\ninterface GooseExtension {\n name: string;\n type: \"stdio\" | \"sse\" | \"builtin\";\n cmd?: string;\n args?: string[];\n env_keys?: string[];\n uri?: string;\n headers?: Record<string, string>;\n description?: string;\n}\n\nexport class GooseAdapter extends BaseAdapter {\n readonly name = \"goose\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n // #123: Read agents once and reuse for both inline content and profile generation\n // to avoid double readCanonicalFiles + double applyCustomization.\n const agents = ctx.features.agents\n ? await readCanonicalFiles(ctx.agentsDir, \"agents\")\n : [];\n\n const lines = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ];\n\n if (ctx.features.skills) {\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n lines.push(`## Skill: ${toPrefixedId(skill.id)}`, \"\", content, \"\");\n }\n }\n\n const inner = lines.join(\"\\n\");\n const results: AdapterOutput[] = [output(\".goosehints\", wrapInManagedBlock(inner), inner)];\n\n // MCP servers are configured as extensions within the Goose profile.\n // Goose does not use a separate mcp.json file — all MCP configuration\n // belongs in the profile's extensions array.\n const mcp = await this.readFilteredMcp(ctx);\n\n // Reuse agents already read above for profile generation\n const profile = this.buildProfile(ctx, agents, mcp);\n const profileYaml = yamlStringify(profile);\n results.push(output(\".goose/profiles/hatch3r.yaml\", profileYaml));\n\n return results;\n }\n\n /**\n * Build a Goose profile matching the actual Goose platform schema.\n *\n * Goose profiles use:\n * - `instructions`: array of instruction strings (not a single string)\n * - `extensions`: array of extension configs for MCP servers\n *\n * Goose does NOT support `recipes`, `acp`, `name`, or `description`\n * as top-level profile fields.\n */\n private buildProfile(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n mcp: Record<string, CleanMcpEntry> | null,\n ): GooseProfile {\n const extensions = this.buildExtensions(mcp);\n\n const instructions: string[] = [\n `Follow the canonical agent instructions at .agents/AGENTS.md.`,\n ];\n\n // Add agent pipeline instructions directly.\n const phaseMap: Array<{ phase: string; agentPattern: string; fallback: string }> = [\n { phase: \"Research\", agentPattern: \"researcher\", fallback: \"Gather context from the codebase. Identify affected files, patterns, and conventions. Do not modify any files.\" },\n { phase: \"Implement\", agentPattern: \"implementer\", fallback: \"Implement the requested changes following project conventions. Require plan approval before making changes.\" },\n { phase: \"Review\", agentPattern: \"reviewer\", fallback: \"Review all changes for correctness, style, security, and adherence to project rules. Report findings as Critical/Warning/Info.\" },\n { phase: \"Quality\", agentPattern: \"test-writer\", fallback: \"Write or update tests for the implemented changes. Run the test suite and verify all tests pass.\" },\n ];\n\n for (const { phase, agentPattern, fallback } of phaseMap) {\n const matchingAgent = agents.find((a) => a.id.includes(agentPattern));\n const instruction = matchingAgent?.description || fallback;\n instructions.push(`[${phase}] ${instruction}`);\n }\n\n return {\n instructions,\n ...(extensions.length > 0 ? { extensions } : {}),\n };\n }\n\n /**\n * Map MCP servers to Goose extensions using the actual Goose schema.\n *\n * Goose uses:\n * - `type: \"stdio\"` with `cmd` and `args` for command-based servers\n * - `type: \"sse\"` with `uri` for URL-based servers\n * - `env_keys` for environment variable names (not values)\n */\n private buildExtensions(\n mcp: Record<string, CleanMcpEntry> | null,\n ): GooseExtension[] {\n if (!mcp) return [];\n const extensions: GooseExtension[] = [];\n for (const [name, entry] of Object.entries(mcp)) {\n if (entry.command) {\n const ext: GooseExtension = {\n name,\n type: \"stdio\",\n cmd: entry.command,\n args: entry.args || [],\n };\n if (entry.env && Object.keys(entry.env).length > 0) {\n ext.env_keys = Object.keys(entry.env);\n }\n if (entry.headers && Object.keys(entry.headers).length > 0) {\n ext.headers = transformEnvVarSyntax(entry.headers, \"shell\") as Record<string, string>;\n }\n extensions.push(ext);\n } else if (entry.url) {\n const ext: GooseExtension = {\n name,\n type: \"sse\",\n uri: entry.url,\n };\n if (entry.headers && Object.keys(entry.headers).length > 0) {\n ext.headers = transformEnvVarSyntax(entry.headers, \"shell\") as Record<string, string>;\n }\n extensions.push(ext);\n }\n }\n return extensions;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\n\nfunction steeringFrontmatter(globs?: string): string {\n if (!globs) return \"\";\n return `---\\ninclusion: fileMatch\\nfileMatchPattern: \"${globs}\"\\n---\\n\\n`;\n}\n\n// Map hatch3r hook events to Kiro native hook trigger types.\n// Kiro supports hooks via .kiro/hooks/ directory with per-hook files\n// containing YAML frontmatter specifying trigger and conditions.\nfunction mapToKiroTrigger(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"beforeCommit\",\n \"post-merge\": \"afterMerge\",\n \"ci-failure\": \"onCIFailure\",\n \"file-save\": \"onFileSave\",\n \"session-start\": \"onSessionStart\",\n \"pre-push\": \"beforePush\",\n \"worktree-create\": \"onWorktreeCreate\",\n \"worktree-remove\": \"onWorktreeRemove\",\n };\n return mapping[event] || event;\n}\n\nexport class KiroAdapter extends BaseAdapter {\n readonly name = \"kiro\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n const lines = [...await this.bridgeHeader(ctx)];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n const desc = overrides.description ?? rule.description;\n\n if (scope && scope !== \"always\") {\n const globs = scope.includes(\"*\") ? scope : `${scope}/**`;\n const fm = steeringFrontmatter(globs);\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.kiro/steering/hatch3r-rule-${rule.id}.md`, `${fm}${wrapInManagedBlock(body)}`, body));\n } else {\n lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\n }\n }\n }\n\n lines.push(...await this.inlineAgents(ctx));\n const inner = lines.join(\"\\n\");\n results.push(output(\".kiro/steering/hatch3r-agents.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.kiro/steering/hatch3r-skill-${id}.md`),\n );\n\n // Generate native Kiro hooks in .kiro/hooks/ directory.\n // Each hook gets its own file with YAML frontmatter specifying\n // the trigger type and conditions.\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const trigger = mapToKiroTrigger(hook.event);\n const fmLines: string[] = [\n \"---\",\n `trigger: ${trigger}`,\n ];\n if (hook.condition?.globs && hook.condition.globs.length > 0) {\n fmLines.push(`filePattern: \"${hook.condition.globs.join(\", \")}\"`);\n }\n if (hook.condition?.branches && hook.condition.branches.length > 0) {\n fmLines.push(`branches: \"${hook.condition.branches.join(\", \")}\"`);\n }\n fmLines.push(\"---\");\n fmLines.push(\"\");\n\n const body = [\n `# Hook: ${hook.id}`,\n \"\",\n hook.description,\n \"\",\n `HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`,\n ].join(\"\\n\");\n\n const fm = fmLines.join(\"\\n\");\n const fullContent = `${fm}\\n${wrapInManagedBlock(body)}`;\n results.push(output(`.kiro/hooks/hatch3r-${hook.id}.md`, fullContent, body));\n }\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n results.push(output(\".kiro/settings/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { resolveAgentModel, withProviderPrefix } from \"../models/resolve.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { transformEnvVarSyntax } from \"./mcp-utils.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\n/**\n * OpenCode adapter.\n *\n * #267 (D9-9.38): OpenCode loads instructions from both `opencode.json`\n * (via the `instructions` array) and individual `.opencode/` files.\n * When both exist, content may be loaded twice in the LLM context.\n * To avoid duplication, `opencode.json` references canonical files\n * in `.agents/` while agent/skill/command files are placed in `.opencode/`.\n * OpenCode deduplicates by file path, so the same file path appearing\n * in both `instructions[]` and `.opencode/` will only be loaded once.\n */\nexport class OpenCodeAdapter extends BaseAdapter {\n readonly name = \"opencode\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n // #267 (D9-9.38): instructions[] references canonical paths in .agents/ only.\n // Agent/skill/command files go in .opencode/ to avoid dual-loading.\n const instructions: string[] = [\".agents/AGENTS.md\"];\n if (ctx.features.rules) instructions.push(\".agents/rules/*.md\");\n if (ctx.features.agents) instructions.push(\".agents/agents/*.md\");\n if (ctx.features.skills) instructions.push(\".agents/skills/*/SKILL.md\");\n if (ctx.features.commands) instructions.push(\".agents/commands/*.md\");\n\n const opencodeConfig: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n $schema: \"https://opencode.ai/config.json\",\n instructions,\n };\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const mcpObj: Record<string, unknown> = {};\n for (const [name, server] of Object.entries(mcp)) {\n if (server.command) {\n const cmd = [server.command, ...(server.args || [])];\n const entry: Record<string, unknown> = {\n type: \"local\",\n command: cmd,\n enabled: true,\n ...(server.env && Object.keys(server.env).length > 0\n ? { environment: transformEnvVarSyntax(server.env, \"shell\") }\n : {}),\n };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.headers = transformEnvVarSyntax(server.headers, \"shell\");\n }\n mcpObj[name] = entry;\n } else if (server.url) {\n const entry: Record<string, unknown> = { type: \"remote\", url: server.url, enabled: true };\n if (server.headers && Object.keys(server.headers).length > 0) {\n entry.headers = transformEnvVarSyntax(server.headers, \"shell\");\n }\n mcpObj[name] = entry;\n }\n }\n if (Object.keys(mcpObj).length > 0) {\n opencodeConfig.mcp = mcpObj;\n }\n }\n\n results.push(output(\"opencode.json\", JSON.stringify(opencodeConfig, null, 2)));\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`description: ${desc}`];\n if (model) lines.push(`model: ${withProviderPrefix(model)}`);\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(output(`.opencode/agent/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n }\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.opencode/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.opencode/command/${toPrefixedId(id)}.md`),\n );\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\n\nfunction isGlobPattern(scope: string): boolean {\n return scope.includes(\"*\") || scope.includes(\"?\") || scope.includes(\"[\");\n}\n\nfunction ruleTrigger(scope: string | undefined): \"always_on\" | \"glob\" | \"model_decision\" {\n if (!scope) return \"model_decision\";\n if (scope === \"always\") return \"always_on\";\n return \"glob\";\n}\n\nexport class WindsurfAdapter extends BaseAdapter {\n readonly name = \"windsurf\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const bridgeOrchestration = await this.bridgeOrchestration(ctx);\n const windsurfInner = [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n \"Full canonical agent instructions are at `/.agents/AGENTS.md`.\",\n \"Rules and skills are managed in `.windsurf/rules/` and `.windsurf/skills/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...await this.inlineAgents(ctx),\n \"\",\n \"## Getting Started with Windsurf\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.windsurf/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use commands in `.windsurf/workflows/` for guided workflows (e.g., feature development, bug fixes).\",\n \"**Then:** Use parallel Cascade sessions for independent tasks to maximize throughput.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ].join(\"\\n\");\n results.push(output(\".windsurfrules\", wrapInManagedBlock(windsurfInner), windsurfInner));\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n const trigger = ruleTrigger(scope);\n const globScope = (trigger === \"glob\" && scope)\n ? (isGlobPattern(scope) ? scope : `${scope}/**`)\n : undefined;\n const desc = overrides.description ?? rule.description;\n // Windsurf requires a description field for model_decision triggers\n // so the AI model knows when to activate the rule.\n const descField = trigger === \"model_decision\" ? `\\ndescription: \"${desc.replace(/\"/g, '\\\\\"')}\"` : \"\";\n const fm = `---\\ntrigger: ${trigger}${descField}${globScope ? `\\nglobs: \"${globScope}\"` : \"\"}\\n---`;\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.windsurf/rules/${toPrefixedId(rule.id)}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.windsurf/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.windsurf/workflows/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n results.push(output(\".windsurf/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2) + \"\\n\"));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\n/**\n * Zed adapter.\n *\n * Generates `.rules` with inline bridge/rules/agents and optional\n * `.zed/mcp.json` for project-level MCP configuration.\n * Zed has no skills, commands, or hooks concepts.\n */\nexport class ZedAdapter extends BaseAdapter {\n readonly name = \"zed\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".rules\", wrapInManagedBlock(inner), inner));\n\n // Zed supports project-level MCP configuration via .zed/mcp.json\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp, \"shell\");\n if (Object.keys(entries).length > 0) {\n results.push(output(\".zed/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2) + \"\\n\"));\n }\n }\n\n return results;\n }\n}\n","import type { HatchManifest, Tool } from \"../types.js\";\nimport type { Adapter } from \"./base.js\";\nimport { AgentsMdAdapter } from \"./agentsmd.js\";\nimport { AiderAdapter } from \"./aider.js\";\nimport { AmazonQAdapter } from \"./amazonq.js\";\nimport { AmpAdapter } from \"./amp.js\";\nimport { AntigravityAdapter } from \"./antigravity.js\";\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { ClineAdapter } from \"./cline.js\";\nimport { CodexAdapter } from \"./codex.js\";\nimport { CopilotAdapter } from \"./copilot.js\";\nimport { CursorAdapter } from \"./cursor.js\";\nimport { GeminiAdapter } from \"./gemini.js\";\nimport { GooseAdapter } from \"./goose.js\";\nimport { KiroAdapter } from \"./kiro.js\";\nimport { OpenCodeAdapter } from \"./opencode.js\";\nimport { WindsurfAdapter } from \"./windsurf.js\";\nimport { ZedAdapter } from \"./zed.js\";\n\n// Adapter factory map — instantiates adapters lazily on first access to avoid\n// allocating all adapters at module load time (#117).\nconst adapterFactories: Record<Tool, () => Adapter> = {\n cursor: () => new CursorAdapter(),\n copilot: () => new CopilotAdapter(),\n claude: () => new ClaudeAdapter(),\n opencode: () => new OpenCodeAdapter(),\n windsurf: () => new WindsurfAdapter(),\n amp: () => new AmpAdapter(),\n codex: () => new CodexAdapter(),\n gemini: () => new GeminiAdapter(),\n cline: () => new ClineAdapter(),\n aider: () => new AiderAdapter(),\n kiro: () => new KiroAdapter(),\n goose: () => new GooseAdapter(),\n zed: () => new ZedAdapter(),\n \"amazon-q\": () => new AmazonQAdapter(),\n antigravity: () => new AntigravityAdapter(),\n \"agents-md\": () => new AgentsMdAdapter(),\n};\n\nconst adapterCache = new Map<Tool, Adapter>();\n\n/**\n * Retrieve or lazily instantiate the adapter for a given tool.\n *\n * Adapters are cached after first creation so repeated calls return the\n * same instance. Throws if the tool name is not in the factory map.\n */\nexport function getAdapter(tool: Tool): Adapter {\n let adapter = adapterCache.get(tool);\n if (adapter) return adapter;\n const factory = adapterFactories[tool];\n if (!factory) {\n throw new Error(`Unknown tool: ${tool}`);\n }\n adapter = factory();\n adapterCache.set(tool, adapter);\n return adapter;\n}\n\n// #258 (D9-9.29): Extended AdapterCapability to include worktree, customization, and modelOverride\n// columns that were tracked in the external audit matrix but missing from the type.\ninterface AdapterCapability {\n agents: boolean;\n skills: boolean;\n rules: boolean;\n hooks: boolean;\n mcp: boolean;\n commands: boolean;\n prompts: boolean;\n githubAgents: boolean;\n /** Whether the adapter supports git worktree file-isolation. */\n worktree: boolean;\n /** Whether the adapter supports per-item customization (.customize.md). */\n customization: boolean;\n /** Whether the adapter supports model override configuration. */\n modelOverride: boolean;\n}\n\n// Adapter capability matrix — last updated for hatch3r v1.5.0.\n// #260 (D9-9.31): Updated \"last verified\" version from v1.2.0 to v1.4.0.\n// Review this matrix when adding new adapters, removing adapters, or when\n// an existing tool gains/loses support for a feature (e.g. a tool ships\n// native hook support). Each row must match the adapter's doGenerate() output.\nconst ADAPTER_CAPABILITIES: Record<Tool, AdapterCapability> = {\n cursor: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false, worktree: true, customization: true, modelOverride: true },\n claude: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false, worktree: true, customization: true, modelOverride: true },\n gemini: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false, worktree: true, customization: true, modelOverride: true },\n cline: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false, worktree: true, customization: true, modelOverride: true },\n codex: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n \"amazon-q\": { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n copilot: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: true, githubAgents: true, worktree: true, customization: true, modelOverride: true },\n opencode: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n windsurf: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: false, githubAgents: false, worktree: true, customization: true, modelOverride: true },\n amp: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n kiro: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n aider: { agents: true, skills: true, rules: true, hooks: false, mcp: false, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n goose: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n zed: { agents: true, skills: false, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: false, modelOverride: false },\n antigravity: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n \"agents-md\": { agents: true, skills: true, rules: true, hooks: false, mcp: false, commands: false, prompts: false, githubAgents: false, worktree: false, customization: true, modelOverride: true },\n};\n\n/**\n * Return warnings for features enabled in the manifest but not supported\n * by the given tool's adapter. Used during sync to surface capability gaps.\n */\nexport function getUnsupportedFeatureWarnings(tool: string, manifest: HatchManifest): string[] {\n const caps = ADAPTER_CAPABILITIES[tool as Tool];\n if (!caps) return [];\n\n const warnings: string[] = [];\n const featureLabels: Array<{ key: keyof AdapterCapability; label: string }> = [\n { key: \"agents\", label: \"agents\" },\n { key: \"skills\", label: \"skills\" },\n { key: \"rules\", label: \"rules\" },\n { key: \"hooks\", label: \"hooks\" },\n { key: \"mcp\", label: \"MCP\" },\n { key: \"commands\", label: \"commands\" },\n { key: \"prompts\", label: \"prompts\" },\n { key: \"githubAgents\", label: \"GitHub agents\" },\n ];\n\n for (const { key, label } of featureLabels) {\n if (manifest.features[key as keyof typeof manifest.features] && !caps[key]) {\n warnings.push(`${tool}: ${label} are enabled but not supported by this adapter`);\n }\n }\n return warnings;\n}\n\nexport { AgentsMdAdapter } from \"./agentsmd.js\";\nexport { AiderAdapter } from \"./aider.js\";\nexport { AmazonQAdapter } from \"./amazonq.js\";\nexport { AmpAdapter } from \"./amp.js\";\nexport { AntigravityAdapter } from \"./antigravity.js\";\nexport { ClaudeAdapter } from \"./claude.js\";\nexport { ClineAdapter } from \"./cline.js\";\nexport { CodexAdapter } from \"./codex.js\";\nexport { CopilotAdapter } from \"./copilot.js\";\nexport { CursorAdapter } from \"./cursor.js\";\nexport { GeminiAdapter } from \"./gemini.js\";\nexport { GooseAdapter } from \"./goose.js\";\nexport { KiroAdapter } from \"./kiro.js\";\nexport { OpenCodeAdapter } from \"./opencode.js\";\nexport { WindsurfAdapter } from \"./windsurf.js\";\nexport { ZedAdapter } from \"./zed.js\";\nexport type { Adapter, AdapterContext } from \"./base.js\";\nexport { BaseAdapter, output } from \"./base.js\";\nexport { readCanonicalFiles } from \"./canonical.js\";\nexport type { CanonicalType } from \"./canonical.js\";\nexport type { CustomizationResult } from \"./customization.js\";\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { AVAILABLE_MCP_SERVERS, ENV_VAR_HELP } from \"../types.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\nexport interface EnvVar {\n name: string;\n server: string;\n comment: string;\n url: string;\n}\n\nconst ENV_MCP_FILE = \".env.mcp\";\n\nconst SOURCE_POSIX = \"set -a && source .env.mcp && set +a\";\nconst SOURCE_POWERSHELL =\n 'Get-Content .env.mcp | ForEach-Object { if ($_ -match \\'^\\\\s*([^#][^=]+)=(.*)$\\') { [Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), \\'Process\\') } }';\n\n/**\n * Returns the sourcing command for the current OS.\n * Run this, then start or restart your editor (VS Code/Copilot auto-loads .env.mcp).\n */\nexport function getSourceEnvMcpCommand(): string {\n return process.platform === \"win32\" ? SOURCE_POWERSHELL : SOURCE_POSIX;\n}\n\n/**\n * Returns the sourcing disclaimer block for the .env.mcp template.\n * Includes both POSIX and Windows commands so the file is useful on any OS.\n */\nexport function getSourceEnvMcpDisclaimer(): string {\n return [\n \"# Cursor / Claude Code: Source this file, then start or restart your editor (VS Code/Copilot auto-loads it).\",\n \"# macOS/Linux (bash/zsh):\",\n `# ${SOURCE_POSIX}`,\n \"# Windows (PowerShell):\",\n `# ${SOURCE_POWERSHELL}`,\n \"# Windows (Git Bash): same as macOS/Linux\",\n \"\",\n ].join(\"\\n\");\n}\n\n/**\n * Collects every environment variable required by the given MCP server list.\n * Returns a deduped, deterministic array.\n */\nexport function collectRequiredEnvVars(servers: string[]): EnvVar[] {\n const seen = new Set<string>();\n const vars: EnvVar[] = [];\n\n for (const id of servers) {\n const meta = AVAILABLE_MCP_SERVERS[id];\n if (!meta?.requiresEnv) continue;\n for (const name of meta.requiresEnv) {\n if (seen.has(name)) continue;\n seen.add(name);\n const help = ENV_VAR_HELP[name];\n vars.push({\n name,\n server: id,\n comment: help?.comment ?? id,\n url: help?.url ?? \"\",\n });\n }\n }\n\n return vars;\n}\n\n/**\n * Renders the contents of a `.env.mcp` file.\n * Existing values (from a prior file) are preserved; new vars get empty placeholders.\n */\nexport function generateEnvMcpContent(\n vars: EnvVar[],\n existing: Record<string, string> = {},\n): string {\n if (vars.length === 0) return \"\";\n\n const lines: string[] = [\n \"# hatch3r MCP secrets\",\n \"# Fill in your values below. This file is gitignored — never commit it.\",\n \"# Docs: https://docs.hatch3r.com/docs/guides/mcp-setup\",\n \"\",\n getSourceEnvMcpDisclaimer(),\n ];\n\n for (const v of vars) {\n const urlPart = v.url ? ` — ${v.url}` : \"\";\n lines.push(`# ${v.comment}${urlPart}`);\n lines.push(`${v.name}=${existing[v.name] ?? \"\"}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Parses a KEY=VALUE env file, ignoring comments and blank lines.\n * Handles optional quoting and `export` prefix.\n */\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const raw of content.split(\"\\n\")) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const stripped = line.startsWith(\"export \") ? line.slice(7) : line;\n const eqIdx = stripped.indexOf(\"=\");\n if (eqIdx < 1) continue;\n const key = stripped.slice(0, eqIdx).trim();\n let val = stripped.slice(eqIdx + 1).trim();\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n return result;\n}\n\n/**\n * Appends `.env.mcp` to the project's `.gitignore` if not already covered\n * by an existing `.env.mcp` or `.env.*` entry.\n */\nexport async function ensureGitignoreEntry(rootDir: string): Promise<void> {\n const gitignorePath = join(rootDir, \".gitignore\");\n let content = \"\";\n try {\n content = await readFile(gitignorePath, \"utf-8\");\n } catch {\n // .gitignore doesn't exist yet — will be created below\n }\n\n const dominated = content\n .split(\"\\n\")\n .some((l) => {\n const trimmed = l.trim();\n return trimmed === \".env.mcp\" || trimmed === \".env.*\";\n });\n if (dominated) return;\n\n const separator = content.length > 0 && !content.endsWith(\"\\n\") ? \"\\n\" : \"\";\n // #240 (D8-8.7): Route through atomicWriteFile for crash-safe writes\n await atomicWriteFile(gitignorePath, `${content}${separator}.env.mcp\\n`);\n}\n\nexport interface EnsureResult {\n action: \"created\" | \"updated\" | \"skipped\";\n path: string;\n newVars: string[];\n}\n\n/**\n * Creates or updates `.env.mcp` in the given root directory.\n * Never overwrites existing values — only appends missing vars.\n */\nexport async function ensureEnvMcp(\n rootDir: string,\n servers: string[],\n): Promise<EnsureResult> {\n const envPath = join(rootDir, ENV_MCP_FILE);\n const vars = collectRequiredEnvVars(servers);\n\n if (vars.length === 0) {\n return { action: \"skipped\", path: ENV_MCP_FILE, newVars: [] };\n }\n\n let existing: Record<string, string> = {};\n let hadFile = false;\n\n if (existsSync(envPath)) {\n hadFile = true;\n const raw = await readFile(envPath, \"utf-8\");\n existing = parseEnvFile(raw);\n }\n\n const newVars = vars.filter((v) => !(v.name in existing)).map((v) => v.name);\n\n if (hadFile && newVars.length === 0) {\n return { action: \"skipped\", path: ENV_MCP_FILE, newVars: [] };\n }\n\n const content = generateEnvMcpContent(vars, existing);\n await atomicWriteFile(envPath, content);\n\n return {\n action: hadFile ? \"updated\" : \"created\",\n path: ENV_MCP_FILE,\n newVars,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nexport function findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return startDir;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join, posix } from \"node:path\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\n/**\n * Integrity manifest for hatch3r canonical files.\n *\n * **Guarantees:**\n * - Detects unauthorized modifications to hatch3r-managed files (agents, rules, skills, commands, hooks, prompts).\n * - Detects missing or newly added files relative to the last `hatch3r init` or `hatch3r update`.\n * - Manifest-level checksum detects tampering with the integrity file itself.\n *\n * **Limitations:**\n * - Content-addressed only: detects WHAT changed, not WHO or WHEN.\n * - No signing: an attacker with write access can regenerate a valid manifest.\n * - Symlinks are excluded from scanning to prevent symlink-based bypass.\n * - Only scans `.md`, `.mdc`, and `.json` files in designated directories.\n */\nexport interface IntegrityManifest {\n version: number;\n generated: string;\n hatchVersion: string;\n /** Tool and version that generated this manifest. Present in manifests generated by hatch3r >=1.5.0. */\n generatedBy?: { tool: string; version: string };\n files: Record<string, string>;\n checksum: string;\n}\n\nexport interface VerifyResult {\n file: string;\n status: \"pass\" | \"modified\" | \"missing\" | \"new\" | \"tampered\";\n expected?: string;\n actual?: string;\n}\n\nconst INTEGRITY_FILE = \".integrity.json\";\nconst SCANNED_DIRS = [\"agents\", \"commands\", \"rules\", \"skills\", \"hooks\", \"prompts\", \"github-agents\", \"mcp\"];\n\n/** Compute a SHA-256 hash of a UTF-8 string, prefixed with `sha256:`. */\nfunction sha256(content: string): string {\n return `sha256:${createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\")}`;\n}\n\n/** Recursively collect `.md`, `.mdc`, and `.json` file paths from a directory, skipping symlinks. */\nasync function collectFiles(dir: string, base: string): Promise<string[]> {\n const files: string[] = [];\n let entries: { name: string; isDirectory: () => boolean; isFile: () => boolean; isSymbolicLink: () => boolean }[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return files;\n throw err;\n }\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = join(dir, entry.name);\n const relPath = posix.join(base, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(fullPath, relPath)));\n } else if (entry.isFile() && (entry.name.endsWith(\".md\") || entry.name.endsWith(\".mdc\") || entry.name.endsWith(\".json\"))) {\n files.push(relPath);\n }\n }\n return files;\n}\n\n/**\n * Generate an integrity manifest by hashing all canonical files in the .agents directory.\n *\n * Scans `.md`, `.mdc`, and `.json` files in designated subdirectories\n * and produces a SHA-256 hash for each. The manifest-level checksum\n * covers the entire file hash map to detect tampering.\n */\nexport async function generateIntegrityManifest(\n agentsDir: string,\n hatchVersion: string,\n): Promise<IntegrityManifest> {\n const files: Record<string, string> = {};\n\n for (const dir of SCANNED_DIRS) {\n const dirPath = join(agentsDir, dir);\n const mdFiles = await collectFiles(dirPath, dir);\n for (const relPath of mdFiles) {\n const content = await readFile(join(agentsDir, relPath), \"utf-8\");\n files[relPath] = sha256(content);\n }\n }\n\n const checksum = createHash(\"sha256\")\n .update(JSON.stringify(files))\n .digest(\"hex\");\n\n return {\n version: 1,\n generated: new Date().toISOString(),\n hatchVersion,\n generatedBy: { tool: \"hatch3r\", version: hatchVersion },\n files,\n checksum,\n };\n}\n\n/** Atomically write the integrity manifest to `.agents/.integrity.json`. */\nexport async function writeIntegrityManifest(\n agentsDir: string,\n manifest: IntegrityManifest,\n): Promise<void> {\n const filePath = join(agentsDir, INTEGRITY_FILE);\n await atomicWriteFile(filePath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\n/** Runtime type guard that validates an unknown value conforms to the IntegrityManifest shape. */\nfunction validateIntegrityManifest(data: unknown): data is IntegrityManifest {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n if (typeof obj.version !== \"number\") return false;\n if (typeof obj.generated !== \"string\") return false;\n if (typeof obj.hatchVersion !== \"string\") return false;\n // generatedBy is required in new manifests but tolerated absent for backward compat\n if (obj.generatedBy !== undefined) {\n if (typeof obj.generatedBy !== \"object\" || obj.generatedBy === null) return false;\n const gb = obj.generatedBy as Record<string, unknown>;\n if (typeof gb.tool !== \"string\" || typeof gb.version !== \"string\") return false;\n }\n if (typeof obj.files !== \"object\" || obj.files === null) return false;\n for (const val of Object.values(obj.files as Record<string, unknown>)) {\n if (typeof val !== \"string\") return false;\n }\n if (typeof obj.checksum !== \"string\") return false;\n return true;\n}\n\n/** Read and validate the integrity manifest, returning null if absent or malformed. */\nexport async function readIntegrityManifest(\n agentsDir: string,\n): Promise<IntegrityManifest | null> {\n try {\n const raw = await readFile(join(agentsDir, INTEGRITY_FILE), \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n if (!validateIntegrityManifest(parsed)) return null;\n return parsed;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n if (err instanceof SyntaxError) return null;\n throw err;\n }\n}\n\n/**\n * Verify integrity of all canonical files against the stored manifest.\n *\n * Returns an array of per-file results: `pass`, `modified`, `missing`,\n * `new` (file on disk but not in manifest), or `tampered` (manifest\n * checksum mismatch). Returns an empty array if no manifest exists.\n */\nexport async function verifyIntegrity(\n agentsDir: string,\n): Promise<VerifyResult[]> {\n const manifest = await readIntegrityManifest(agentsDir);\n if (!manifest) {\n return [];\n }\n\n const results: VerifyResult[] = [];\n\n const expected = createHash(\"sha256\")\n .update(JSON.stringify(manifest.files))\n .digest(\"hex\");\n if (manifest.checksum !== expected) {\n results.push({ file: INTEGRITY_FILE, status: \"tampered\" });\n return results;\n }\n const manifestFiles = new Set(Object.keys(manifest.files));\n\n for (const [filePath, expectedHash] of Object.entries(manifest.files)) {\n const fullPath = join(agentsDir, filePath);\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const actualHash = sha256(content);\n if (actualHash === expectedHash) {\n results.push({ file: filePath, status: \"pass\" });\n } else {\n results.push({\n file: filePath,\n status: \"modified\",\n expected: expectedHash,\n actual: actualHash,\n });\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n results.push({\n file: filePath,\n status: \"missing\",\n expected: expectedHash,\n });\n } else {\n throw err;\n }\n }\n }\n\n for (const dir of SCANNED_DIRS) {\n const dirPath = join(agentsDir, dir);\n const onDisk = await collectFiles(dirPath, dir);\n for (const filePath of onDisk) {\n if (!manifestFiles.has(filePath)) {\n const content = await readFile(join(agentsDir, filePath), \"utf-8\");\n results.push({\n file: filePath,\n status: \"new\",\n actual: sha256(content),\n });\n }\n }\n }\n\n results.sort((a, b) => a.file.localeCompare(b.file));\n return results;\n}\n","/**\n * Tag taxonomy for hatch3r content files.\n *\n * Workflow tags describe what phase of the dev lifecycle a content item serves.\n * Context tags describe what kind of project/team the item is relevant to.\n * Domain tags describe specialized areas.\n */\n\n// ── Workflow tags ──────────────────────────────────────────────\n/** Essential for any hatch3r project */\nexport const TAG_CORE = \"core\";\n/** Spec creation, roadmapping, feature/bug/refactor planning */\nexport const TAG_PLANNING = \"planning\";\n/** Code writing, fixing, refactoring */\nexport const TAG_IMPLEMENTATION = \"implementation\";\n/** Code review, QA, security auditing */\nexport const TAG_REVIEW = \"review\";\n/** CI/CD, releases, deployment */\nexport const TAG_DEVOPS = \"devops\";\n/** Dependency auditing, health checks, context management */\nexport const TAG_MAINTENANCE = \"maintenance\";\n\n// ── Context tags ──────────────────────────────────────────────\n/** New project specific (project-spec, roadmap) */\nexport const TAG_GREENFIELD = \"greenfield\";\n/** Existing project specific (codebase-map, onboard, migration) */\nexport const TAG_BROWNFIELD = \"brownfield\";\n/** Solo developer */\nexport const TAG_SOLO = \"solo\";\n/** Team collaboration */\nexport const TAG_TEAM = \"team\";\n\n// ── Domain tags ──────────────────────────────────────────────\n/** Board/project management commands */\nexport const TAG_BOARD = \"board\";\n/** Security-related agents/rules/skills */\nexport const TAG_SECURITY = \"security\";\n/** Accessibility */\nexport const TAG_A11Y = \"a11y\";\n/** Performance profiling/budgets */\nexport const TAG_PERFORMANCE = \"performance\";\n/** Meta-customization commands/skills */\nexport const TAG_CUSTOMIZE = \"customize\";\n\n// ── Language tags (Finding #71, #74) ─────────────────────────\n/** TypeScript/JavaScript projects */\nexport const TAG_LANG_TYPESCRIPT = \"lang:typescript\";\n/** Python projects */\nexport const TAG_LANG_PYTHON = \"lang:python\";\n/** Go projects */\nexport const TAG_LANG_GO = \"lang:go\";\n/** Rust projects */\nexport const TAG_LANG_RUST = \"lang:rust\";\n/** Java projects */\nexport const TAG_LANG_JAVA = \"lang:java\";\n/** Ruby projects */\nexport const TAG_LANG_RUBY = \"lang:ruby\";\n\n/** All valid tags */\nexport const ALL_TAGS = [\n TAG_CORE,\n TAG_PLANNING,\n TAG_IMPLEMENTATION,\n TAG_REVIEW,\n TAG_DEVOPS,\n TAG_MAINTENANCE,\n TAG_GREENFIELD,\n TAG_BROWNFIELD,\n TAG_SOLO,\n TAG_TEAM,\n TAG_BOARD,\n TAG_SECURITY,\n TAG_A11Y,\n TAG_PERFORMANCE,\n TAG_CUSTOMIZE,\n TAG_LANG_TYPESCRIPT,\n TAG_LANG_PYTHON,\n TAG_LANG_GO,\n TAG_LANG_RUST,\n TAG_LANG_JAVA,\n TAG_LANG_RUBY,\n] as const;\n\nexport type ContentTag = (typeof ALL_TAGS)[number];\n\n/** Workflow tags — used in preset definitions */\nexport const WORKFLOW_TAGS: ContentTag[] = [\n TAG_CORE,\n TAG_PLANNING,\n TAG_IMPLEMENTATION,\n TAG_REVIEW,\n TAG_DEVOPS,\n TAG_MAINTENANCE,\n];\n\n/** Context tags — used for project type / team size filtering */\nexport const CONTEXT_TAGS: ContentTag[] = [\n TAG_GREENFIELD,\n TAG_BROWNFIELD,\n TAG_SOLO,\n TAG_TEAM,\n];\n\n/** Domain tags — specialized areas */\nexport const DOMAIN_TAGS: ContentTag[] = [\n TAG_BOARD,\n TAG_SECURITY,\n TAG_A11Y,\n TAG_PERFORMANCE,\n TAG_CUSTOMIZE,\n];\n\n/** Language tags — for language-specific content filtering (Finding #71) */\nexport const LANGUAGE_TAGS: ContentTag[] = [\n TAG_LANG_TYPESCRIPT,\n TAG_LANG_PYTHON,\n TAG_LANG_GO,\n TAG_LANG_RUST,\n TAG_LANG_JAVA,\n TAG_LANG_RUBY,\n];\n\n/**\n * Map detected language names to their corresponding language tags.\n * Used by resolveSelection to filter content by project language (Finding #71).\n */\nexport const LANGUAGE_TO_TAG: Record<string, ContentTag> = {\n typescript: TAG_LANG_TYPESCRIPT,\n javascript: TAG_LANG_TYPESCRIPT, // JS projects also benefit from TS rules\n python: TAG_LANG_PYTHON,\n go: TAG_LANG_GO,\n rust: TAG_LANG_RUST,\n java: TAG_LANG_JAVA,\n kotlin: TAG_LANG_JAVA, // Kotlin shares Java ecosystem\n ruby: TAG_LANG_RUBY,\n};\n\n/**\n * Check whether a tag is a language tag (prefixed with \"lang:\").\n */\nexport function isLanguageTag(tag: string): boolean {\n return tag.startsWith(\"lang:\");\n}\n","import { readFile, readdir, writeFile, cp, mkdir, rm } from \"node:fs/promises\";\nimport { join, dirname, normalize, isAbsolute } from \"node:path\";\nimport { parseFrontmatter } from \"../adapters/canonical.js\";\nimport { HatchError } from \"../types.js\";\nimport type { ContentSelection } from \"../types.js\";\nimport type { ContentPreset } from \"./presets.js\";\nimport { isLanguageTag, LANGUAGE_TO_TAG } from \"./tags.js\";\n\n/**\n * Validate that a relative path does not escape its base directory.\n *\n * Throws a HatchError if the path contains directory traversal (`..`),\n * is absolute, or contains null bytes. Used to prevent path injection\n * during content copy and install operations.\n */\nexport function assertSafePath(relativePath: string, label: string): void {\n // Strip null bytes before validation — prevents null byte injection bypasses\n const sanitized = relativePath.replace(/\\0/g, '');\n const normalized = normalize(sanitized);\n if (normalized.startsWith('..') || isAbsolute(normalized)) {\n throw new HatchError(`Unsafe path detected in ${label}: ${relativePath}`, 1, \"FS_ERROR\");\n }\n if (sanitized !== relativePath) {\n throw new HatchError(`Unsafe path detected in ${label}: ${relativePath}`, 1, \"FS_ERROR\");\n }\n}\n\n// ── Content Cross-References ───────────────────────────────────\n\n/**\n * Extract hatch3r content IDs referenced in markdown content.\n * Looks for backtick-quoted `hatch3r-{name}` patterns.\n */\nexport function extractContentReferences(content: string): string[] {\n const refs = new Set<string>();\n const pattern = /`((?:cmd-)?hatch3r-[a-z0-9-]+)`/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n refs.add(match[1]);\n }\n return [...refs];\n}\n\nexport interface CrossReferenceResult {\n warnings: string[];\n}\n\n/**\n * Validate cross-references between content items.\n * Parses markdown bodies for references to other content IDs and verifies\n * all referenced IDs exist in the index.\n */\nexport async function validateCrossReferences(\n contentRoot: string,\n index: ContentIndex,\n): Promise<CrossReferenceResult> {\n const warnings: string[] = [];\n const allIds = new Set(index.items.map((item) => item.id));\n\n for (const item of index.items) {\n let content: string;\n try {\n const filePath =\n item.type === \"skill\"\n ? join(contentRoot, item.relativePath, \"SKILL.md\")\n : join(contentRoot, `${item.relativePath}`);\n content = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n\n const refs = extractContentReferences(content);\n for (const ref of refs) {\n if (ref === item.id) continue; // self-reference is fine\n // Check both the raw ref and the cmd-prefixed form (command IDs are prefixed during indexing)\n if (!allIds.has(ref) && !allIds.has(`${COMMAND_ID_PREFIX}${ref}`)) {\n warnings.push(\n `${item.type} \"${item.id}\" references \"${ref}\" which does not exist in the content index`,\n );\n }\n }\n }\n\n return { warnings };\n}\n\n// Agents required by the orchestration pipeline (\"Always\" in Agent Roster)\nconst ORCHESTRATION_REQUIRED_AGENTS = [\n \"hatch3r-researcher\",\n \"hatch3r-implementer\",\n \"hatch3r-reviewer\",\n \"hatch3r-test-writer\",\n \"hatch3r-security-auditor\",\n];\n\n/**\n * Validate that a content selection includes all agents required by the\n * orchestration pipeline. Returns warnings for missing agents.\n */\nexport function validateOrchestrationDependencies(\n selection: ContentSelection,\n): string[] {\n const warnings: string[] = [];\n const selectedAgents = new Set(selection.items.agents);\n\n // Check if orchestration rule is selected\n const hasOrchestration = selection.items.rules.includes(\"hatch3r-agent-orchestration\");\n if (!hasOrchestration) return warnings;\n\n for (const agentId of ORCHESTRATION_REQUIRED_AGENTS) {\n if (!selectedAgents.has(agentId)) {\n warnings.push(\n `Orchestration pipeline requires agent \"${agentId}\" but it is not in the content selection. ` +\n `The 4-phase pipeline (Research → Implement → Review → Quality) will be incomplete.`,\n );\n }\n }\n\n return warnings;\n}\n\n// ── Types ──────────────────────────────────────────────────────\n\nexport interface CatalogItem {\n id: string;\n type: \"agent\" | \"skill\" | \"rule\" | \"command\" | \"prompt\" | \"hook\" | \"github-agent\";\n description: string;\n tags: string[];\n protected?: boolean;\n /** For glob-strategy: relative path from content root (e.g. \"agents/hatch3r-implementer.md\") */\n relativePath: string;\n /** For rules: companion .mdc file path, if it exists */\n companionPath?: string;\n}\n\nexport interface ContentCollision {\n id: string;\n kind: \"cross-type\" | \"same-type\";\n existingType: CatalogItem[\"type\"];\n existingPath: string;\n duplicateType: CatalogItem[\"type\"];\n duplicatePath: string;\n}\n\nexport interface ContentIndex {\n items: CatalogItem[];\n byType: Record<string, CatalogItem[]>;\n byId: Map<string, CatalogItem>;\n /**\n * Collision-safe lookup: `\"type:id\"` → CatalogItem.\n * Use this when the content type is known to avoid cross-type ID shadows.\n * Key format: `\"agent:hatch3r-implementer\"`, `\"skill:hatch3r-recipe\"`, etc.\n */\n byTypeAndId: Map<string, CatalogItem>;\n /** Structured records of ID collisions detected during indexing. */\n collisions: ContentCollision[];\n}\n\n/**\n * Build a composite key for the `byTypeAndId` map.\n */\nexport function typeIdKey(type: CatalogItem[\"type\"], id: string): string {\n return `${type}:${id}`;\n}\n\n/**\n * Get all items matching an ID, across all content types.\n * Unlike `byId.get()` which returns only the last-indexed item for a colliding ID,\n * this returns every item that shares the given ID (typically 1, but 2+ when\n * a command and skill share the same name).\n */\nexport function getAllItemsById(index: ContentIndex, id: string): CatalogItem[] {\n return index.items.filter((item) => item.id === id);\n}\n\n// ── Command ID prefix ─────────────────────────────────────────\n\n/**\n * Prefix applied to command-type content IDs to prevent cross-type\n * collisions (e.g. a command and skill sharing the same base name).\n */\nexport const COMMAND_ID_PREFIX = \"cmd-\";\n\n/**\n * Apply the command ID prefix if the content type is \"command\".\n * Other content types are returned unchanged.\n */\nexport function applyCommandPrefix(id: string, type: string): string {\n return type === \"command\" ? `${COMMAND_ID_PREFIX}${id}` : id;\n}\n\n// ── Content type configs ───────────────────────────────────────\n\ninterface ContentTypeConfig {\n dir: string;\n type: CatalogItem[\"type\"];\n strategy: \"glob\" | \"subdirectory\";\n}\n\nconst CONTENT_TYPE_CONFIGS: ContentTypeConfig[] = [\n { dir: \"agents\", type: \"agent\", strategy: \"glob\" },\n { dir: \"commands\", type: \"command\", strategy: \"glob\" },\n { dir: \"rules\", type: \"rule\", strategy: \"glob\" },\n { dir: \"skills\", type: \"skill\", strategy: \"subdirectory\" },\n { dir: \"prompts\", type: \"prompt\", strategy: \"glob\" },\n { dir: \"hooks\", type: \"hook\", strategy: \"glob\" },\n { dir: \"github-agents\", type: \"github-agent\", strategy: \"glob\" },\n];\n\n// ── Build content index ────────────────────────────────────────\n\n/**\n * Scan package content dirs, parse frontmatter, return indexed catalog.\n */\nexport async function buildContentIndex(contentRoot: string): Promise<ContentIndex> {\n const items: CatalogItem[] = [];\n\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(contentRoot, config.dir);\n\n if (config.strategy === \"subdirectory\") {\n // Skills: each subdirectory has a SKILL.md\n let dirents: { name: string; isDirectory: () => boolean }[];\n try {\n dirents = (await readdir(dirPath, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const dirent of dirents) {\n if (!dirent.isDirectory()) continue;\n const skillPath = join(dirPath, dirent.name, \"SKILL.md\");\n try {\n const raw = await readFile(skillPath, \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const rawId = metadata.id || metadata.name || dirent.name;\n const id = applyCommandPrefix(rawId, config.type);\n items.push({\n id,\n type: config.type,\n description: metadata.description ?? \"\",\n tags: metadata.tags ?? [],\n protected: metadata.protected,\n relativePath: join(config.dir, dirent.name),\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n } else {\n // Glob: read all .md files\n let entries: string[];\n try {\n const all = await readdir(dirPath);\n entries = all.filter((f) => f.endsWith(\".md\")).sort();\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const file of entries) {\n const filePath = join(dirPath, file);\n const raw = await readFile(filePath, \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const rawId = metadata.id || metadata.name || file.replace(/\\.md$/, \"\");\n const id = applyCommandPrefix(rawId, config.type);\n\n const item: CatalogItem = {\n id,\n type: config.type,\n description: metadata.description ?? \"\",\n tags: metadata.tags ?? [],\n protected: metadata.protected,\n relativePath: join(config.dir, file),\n };\n\n // For rules, check for companion .mdc file\n if (config.type === \"rule\") {\n const mdcFile = file.replace(/\\.md$/, \".mdc\");\n try {\n await readFile(join(dirPath, mdcFile), \"utf-8\");\n item.companionPath = join(config.dir, mdcFile);\n } catch {\n // No companion file\n }\n }\n\n items.push(item);\n }\n }\n }\n\n // Build indexes\n const byType: Record<string, CatalogItem[]> = {};\n const byId = new Map<string, CatalogItem>();\n const byTypeAndId = new Map<string, CatalogItem>();\n const collisions: ContentCollision[] = [];\n\n for (const item of items) {\n if (!byType[item.type]) byType[item.type] = [];\n byType[item.type].push(item);\n\n // Collision-safe type-qualified lookup (never shadows)\n byTypeAndId.set(typeIdKey(item.type, item.id), item);\n\n const existing = byId.get(item.id);\n if (existing) {\n const kind: ContentCollision[\"kind\"] = existing.type !== item.type ? \"cross-type\" : \"same-type\";\n collisions.push({\n id: item.id,\n kind,\n existingType: existing.type,\n existingPath: existing.relativePath,\n duplicateType: item.type,\n duplicatePath: item.relativePath,\n });\n if (kind === \"cross-type\") {\n console.warn(\n `[hatch3r] Content ID collision: \"${item.id}\" exists as both ${existing.type} (${existing.relativePath}) and ${item.type} (${item.relativePath}). Use index.byTypeAndId for collision-safe lookup.`,\n );\n } else {\n console.warn(\n `[hatch3r] Duplicate content ID: \"${item.id}\" found in ${existing.relativePath} and ${item.relativePath}. The later entry will shadow the earlier one in ID lookups.`,\n );\n }\n }\n byId.set(item.id, item);\n }\n\n return { items, byType, byId, byTypeAndId, collisions };\n}\n\n// ── Shared type-to-key mapping ──────────────────────────────────\n\nexport const TYPE_TO_SELECTION_KEY: Record<string, keyof ContentSelection[\"items\"]> = {\n agent: \"agents\",\n skill: \"skills\",\n rule: \"rules\",\n command: \"commands\",\n prompt: \"prompts\",\n hook: \"hooks\",\n \"github-agent\": \"githubAgents\",\n};\n\n// ── Selection resolution ───────────────────────────────────────\n\n/**\n * Apply preset + context filters to determine which IDs to include.\n *\n * Filtering logic:\n * 1. Start with all items from the index\n * 2. If preset has includeTags, keep only items matching ANY of those tags\n * 3. If preset has excludeTags, remove items matching ANY of those tags\n * 4. If projectType is \"greenfield\", remove items tagged ONLY with \"brownfield\"\n * 5. If projectType is \"brownfield\", remove items tagged ONLY with \"greenfield\"\n * 6. If teamSize is \"solo\", remove items whose ONLY tags are \"team\" / \"board\"\n * 7. Items with protected: true are always included\n * 8. For \"custom\" preset, use customSelections as explicit ID list\n * 9. Language filtering (Finding #71): items with language tags (lang:*) are only\n * included when the project's detected languages match. Items without language\n * tags are always included.\n */\nexport function resolveSelection(\n preset: ContentPreset,\n projectType: \"greenfield\" | \"brownfield\",\n teamSize: \"solo\" | \"team\",\n index: ContentIndex,\n customSelections?: string[],\n projectLanguages?: string[],\n): ContentSelection {\n let selected: CatalogItem[];\n\n // Build the set of relevant language tags from detected project languages\n const relevantLangTags = new Set<string>();\n if (projectLanguages) {\n for (const lang of projectLanguages) {\n const tag = LANGUAGE_TO_TAG[lang];\n if (tag) relevantLangTags.add(tag);\n }\n }\n\n if (preset.id === \"custom\" && customSelections) {\n // For custom, use explicit ID list\n const customSet = new Set(customSelections);\n selected = index.items.filter(\n (item) => customSet.has(item.id) || item.protected,\n );\n } else {\n selected = [...index.items];\n\n // Apply includeTags filter (if non-empty, keep only items matching ANY tag)\n if (preset.includeTags.length > 0) {\n const includeSet = new Set<string>(preset.includeTags);\n selected = selected.filter(\n (item) =>\n item.protected ||\n item.tags.length === 0 || // items without tags pass through\n item.tags.some((t) => includeSet.has(t)),\n );\n }\n\n // Apply excludeTags filter\n // #122: Guard against vacuous truth — items with no tags should pass through,\n // not be excluded (Array.every on empty array returns true).\n if (preset.excludeTags.length > 0) {\n const excludeSet = new Set<string>(preset.excludeTags);\n selected = selected.filter(\n (item) =>\n item.protected ||\n item.tags.length === 0 ||\n !item.tags.every((t) => excludeSet.has(t)),\n );\n }\n\n // Context filtering: project type\n if (projectType === \"greenfield\") {\n // Remove items tagged ONLY with \"brownfield\"\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.includes(\"brownfield\") ||\n item.tags.some((t) => t !== \"brownfield\" && t !== \"team\" && t !== \"solo\"),\n );\n } else {\n // Remove items tagged ONLY with \"greenfield\"\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.includes(\"greenfield\") ||\n item.tags.some((t) => t !== \"greenfield\" && t !== \"team\" && t !== \"solo\"),\n );\n }\n\n // Context filtering: team size\n if (teamSize === \"solo\") {\n // Remove items whose tags are exclusively team/board (no other workflow/domain tags)\n selected = selected.filter((item) => {\n if (item.protected) return true;\n if (!item.tags.includes(\"team\") && !item.tags.includes(\"board\")) return true;\n // Has team/board tag — keep if it has other non-context tags too\n return item.tags.some(\n (t) => t !== \"team\" && t !== \"board\" && t !== \"solo\" && t !== \"greenfield\" && t !== \"brownfield\",\n );\n });\n }\n }\n\n // Language filtering (Finding #71): remove items whose language tags\n // don't match the detected project languages. Items without any language\n // tags pass through (language-agnostic content).\n if (projectLanguages && projectLanguages.length > 0) {\n selected = selected.filter((item) => {\n if (item.protected) return true;\n const itemLangTags = item.tags.filter(isLanguageTag);\n // Items with no language tags are language-agnostic — always included\n if (itemLangTags.length === 0) return true;\n // Items with language tags must match at least one project language\n return itemLangTags.some((t) => relevantLangTags.has(t));\n });\n }\n\n // Build the selection items grouped by type\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const item of selected) {\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) items[key].push(item.id);\n }\n\n return {\n preset: preset.id,\n projectType,\n teamSize,\n items,\n };\n}\n\n// ── Exclusion counting ─────────────────────────────────────────\n\n/**\n * Count how many items a preset would exclude relative to the full item set.\n */\nexport function countPresetExclusions(\n preset: ContentPreset,\n index: ContentIndex,\n): number {\n if (preset.id === \"custom\") return 0;\n if (preset.id === \"full\") return 0;\n\n let count = 0;\n for (const item of index.items) {\n if (item.protected) continue;\n // includeTags filter\n if (preset.includeTags.length > 0) {\n const includeSet = new Set<string>(preset.includeTags);\n if (item.tags.length > 0 && !item.tags.some((t) => includeSet.has(t))) {\n count++;\n continue;\n }\n }\n // excludeTags filter (#122: guard against vacuous truth for empty tags)\n if (preset.excludeTags.length > 0) {\n const excludeSet = new Set<string>(preset.excludeTags);\n if (item.tags.length > 0 && item.tags.every((t) => excludeSet.has(t))) {\n count++;\n }\n }\n }\n return count;\n}\n\n/**\n * Count how many items the project type filter would remove from a pre-filtered set.\n */\nexport function countProjectTypeExclusions(\n projectType: \"greenfield\" | \"brownfield\",\n items: CatalogItem[],\n): number {\n const opposite = projectType === \"greenfield\" ? \"brownfield\" : \"greenfield\";\n let count = 0;\n for (const item of items) {\n if (item.protected) continue;\n if (\n item.tags.includes(opposite) &&\n !item.tags.some((t) => t !== opposite && t !== \"team\" && t !== \"solo\")\n ) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Count how many items the team size filter would remove from a pre-filtered set.\n */\nexport function countTeamSizeExclusions(\n teamSize: \"solo\" | \"team\",\n items: CatalogItem[],\n): number {\n if (teamSize !== \"solo\") return 0;\n let count = 0;\n for (const item of items) {\n if (item.protected) continue;\n if (!item.tags.includes(\"team\") && !item.tags.includes(\"board\")) continue;\n const hasOther = item.tags.some(\n (t) => t !== \"team\" && t !== \"board\" && t !== \"solo\" && t !== \"greenfield\" && t !== \"brownfield\",\n );\n if (!hasOther) count++;\n }\n return count;\n}\n\n// ── Copy selected content ──────────────────────────────────────\n\n/**\n * Copy only selected content files from package to .agents/.\n * Returns list of relative paths copied.\n */\nexport async function copySelectedContent(\n contentRoot: string,\n agentsDir: string,\n selection: ContentSelection,\n index: ContentIndex,\n): Promise<string[]> {\n const copied: string[] = [];\n\n // Collect all selected IDs\n const selectedIds = new Set<string>();\n for (const ids of Object.values(selection.items)) {\n for (const id of ids) selectedIds.add(id);\n }\n\n for (const item of index.items) {\n if (!selectedIds.has(item.id)) continue;\n\n assertSafePath(item.relativePath, \"copySelectedContent\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"copySelectedContent companion\");\n }\n\n const srcPath = join(contentRoot, item.relativePath);\n const destPath = join(agentsDir, item.relativePath);\n\n if (item.type === \"skill\") {\n // Copy entire skill subdirectory\n await mkdir(destPath, { recursive: true });\n await cp(srcPath, destPath, { recursive: true, force: true });\n copied.push(item.relativePath);\n } else {\n // Copy individual .md file\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n copied.push(item.relativePath);\n\n // Copy companion .mdc file if it exists (rules)\n if (item.companionPath) {\n const mdcSrc = join(contentRoot, item.companionPath);\n const mdcDest = join(agentsDir, item.companionPath);\n try {\n await cp(mdcSrc, mdcDest, { force: true });\n copied.push(item.companionPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n }\n\n // Always copy support subdirectories (non-hatch3r-prefixed dirs inside glob-strategy content types)\n // These are shared/companion files referenced by agents and commands (e.g. agents/shared/, agents/modes/, commands/board/)\n for (const config of CONTENT_TYPE_CONFIGS) {\n if (config.strategy !== \"glob\") continue;\n try {\n const dirEntries = await readdir(join(contentRoot, config.dir), { withFileTypes: true });\n for (const entry of dirEntries) {\n if (!entry.isDirectory() || entry.name.startsWith(\"hatch3r-\")) continue;\n const subSrc = join(contentRoot, config.dir, entry.name);\n const subDest = join(agentsDir, config.dir, entry.name);\n await mkdir(subDest, { recursive: true });\n await cp(subSrc, subDest, { recursive: true, force: true });\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n\n // Always copy checks/ (referenced by agents, small)\n try {\n const checksSrc = join(contentRoot, \"checks\");\n const checksDest = join(agentsDir, \"checks\");\n await mkdir(checksDest, { recursive: true });\n await cp(checksSrc, checksDest, { recursive: true, force: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n // Always copy mcp/ (handled separately by init for filtering)\n try {\n const mcpSrc = join(contentRoot, \"mcp\");\n const mcpDest = join(agentsDir, \"mcp\");\n await mkdir(mcpDest, { recursive: true });\n await cp(mcpSrc, mcpDest, { recursive: true, force: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n return copied;\n}\n\n// ── Available items ────────────────────────────────────────────\n\n/**\n * Get items available in package but not currently installed on disk.\n */\nexport async function getAvailableItems(\n contentRoot: string,\n agentsDir: string,\n index: ContentIndex,\n): Promise<CatalogItem[]> {\n const installed = new Set<string>();\n\n // Scan what's on disk\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(agentsDir, config.dir);\n\n if (config.strategy === \"subdirectory\") {\n try {\n const dirents = await readdir(dirPath, { withFileTypes: true });\n for (const d of dirents) {\n if (d.isDirectory()) {\n try {\n const raw = await readFile(join(dirPath, d.name, \"SKILL.md\"), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const rawId = metadata.id || metadata.name || d.name;\n installed.add(applyCommandPrefix(rawId, config.type));\n } catch {\n // skip\n }\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else {\n try {\n const files = await readdir(dirPath);\n for (const f of files.filter((f) => f.endsWith(\".md\"))) {\n const raw = await readFile(join(dirPath, f), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const rawId = metadata.id || metadata.name || f.replace(/\\.md$/, \"\");\n installed.add(applyCommandPrefix(rawId, config.type));\n }\n } catch {\n // directory doesn't exist\n }\n }\n }\n\n return index.items.filter((item) => !installed.has(item.id));\n}\n\n// ── Build selections from disk ─────────────────────────────────\n\n/**\n * Scan .agents/ to build a ContentSelection from what's on disk.\n * Used for legacy migration — converts \"everything installed\" to explicit tracking.\n */\nexport async function buildSelectionsFromDisk(\n agentsDir: string,\n): Promise<ContentSelection> {\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(agentsDir, config.dir);\n const key = TYPE_TO_SELECTION_KEY[config.type];\n if (!key) continue;\n\n if (config.strategy === \"subdirectory\") {\n try {\n const dirents = await readdir(dirPath, { withFileTypes: true });\n for (const d of dirents) {\n if (!d.isDirectory()) continue;\n try {\n const raw = await readFile(join(dirPath, d.name, \"SKILL.md\"), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const rawId = metadata.id || metadata.name || d.name;\n items[key].push(applyCommandPrefix(rawId, config.type));\n } catch {\n // skip\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else {\n try {\n const files = await readdir(dirPath);\n for (const f of files.filter((f) => f.endsWith(\".md\"))) {\n const raw = await readFile(join(dirPath, f), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const rawId = metadata.id || metadata.name || f.replace(/\\.md$/, \"\");\n items[key].push(applyCommandPrefix(rawId, config.type));\n }\n } catch {\n // directory doesn't exist\n }\n }\n }\n\n return {\n preset: \"full\",\n projectType: \"brownfield\",\n teamSize: \"team\",\n items,\n };\n}\n\n// ── Content item add/remove ────────────────────────────────────\n\n/**\n * Add a single content item from the package to .agents/.\n */\nexport async function addContentItem(\n contentRoot: string,\n agentsDir: string,\n item: CatalogItem,\n): Promise<void> {\n assertSafePath(item.relativePath, \"addContentItem\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"addContentItem companion\");\n }\n\n const srcPath = join(contentRoot, item.relativePath);\n const destPath = join(agentsDir, item.relativePath);\n\n try {\n if (item.type === \"skill\") {\n await mkdir(destPath, { recursive: true });\n await cp(srcPath, destPath, { recursive: true, force: true });\n } else {\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n\n if (item.companionPath) {\n try {\n await cp(\n join(contentRoot, item.companionPath),\n join(agentsDir, item.companionPath),\n { force: true },\n );\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new HatchError(\n `Content \"${item.id}\" (${item.type}) not found in package at ${item.relativePath}. ` +\n `It may have been renamed or removed in this hatch3r version.`,\n 1,\n \"FS_ERROR\",\n );\n }\n throw err;\n }\n}\n\n/**\n * Remove a single content item from .agents/ and optionally clean up customization files.\n */\nexport async function removeContentItem(\n agentsDir: string,\n item: CatalogItem,\n options?: { rootDir?: string },\n): Promise<void> {\n assertSafePath(item.relativePath, \"removeContentItem\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"removeContentItem companion\");\n }\n\n const destPath = join(agentsDir, item.relativePath);\n\n if (item.type === \"skill\") {\n await rm(destPath, { recursive: true, force: true });\n } else {\n await rm(destPath, { force: true });\n\n if (item.companionPath) {\n await rm(join(agentsDir, item.companionPath), { force: true });\n }\n }\n\n // Clean up customize files if rootDir provided\n if (options?.rootDir) {\n const typeToDir: Record<string, string> = {\n agent: \"agents\",\n skill: \"skills\",\n rule: \"rules\",\n command: \"commands\",\n };\n const customDir = typeToDir[item.type];\n if (customDir) {\n const cleanId = item.id.replace(/^cmd-/, \"\").replace(/^hatch3r-/, \"\");\n const yamlPath = join(options.rootDir, \".hatch3r\", customDir, `${cleanId}.customize.yaml`);\n const mdPath = join(options.rootDir, \".hatch3r\", customDir, `${cleanId}.customize.md`);\n await rm(yamlPath, { force: true });\n await rm(mdPath, { force: true });\n }\n }\n}\n\n/**\n * Get all content IDs from a ContentSelection as a flat Set.\n */\nexport function getAllContentIds(selection: ContentSelection): Set<string> {\n const ids = new Set<string>();\n for (const arr of Object.values(selection.items)) {\n for (const id of arr) ids.add(id);\n }\n return ids;\n}\n\n/**\n * Estimate the item count a preset would yield for a given project type and team size.\n * Used to show expected item counts in the profile selector prompt (#147 D19-18).\n */\nexport function estimatePresetItemCount(\n preset: ContentPreset,\n projectType: \"greenfield\" | \"brownfield\",\n teamSize: \"solo\" | \"team\",\n index: ContentIndex,\n projectLanguages?: string[],\n): number {\n const selection = resolveSelection(preset, projectType, teamSize, index, undefined, projectLanguages);\n return Object.values(selection.items).reduce((sum, arr) => sum + arr.length, 0);\n}\n\n/**\n * Get total count of selected items.\n */\nexport function countSelectionItems(selection: ContentSelection): number {\n return Object.values(selection.items).reduce((sum, arr) => sum + arr.length, 0);\n}\n\n/**\n * Get a summary string of selection items by type.\n */\nexport function selectionSummary(selection: ContentSelection): string {\n const parts: string[] = [];\n const { items } = selection;\n if (items.agents.length > 0) parts.push(`${items.agents.length} agents`);\n if (items.skills.length > 0) parts.push(`${items.skills.length} skills`);\n if (items.rules.length > 0) parts.push(`${items.rules.length} rules`);\n if (items.commands.length > 0) parts.push(`${items.commands.length} commands`);\n if (items.prompts.length > 0) parts.push(`${items.prompts.length} prompts`);\n if (items.hooks.length > 0) parts.push(`${items.hooks.length} hooks`);\n if (items.githubAgents.length > 0) parts.push(`${items.githubAgents.length} github-agents`);\n return parts.join(\", \");\n}\n\n// ── MDC companion generation ───────────────────────────────────\n\n/**\n * Generate Cursor-native frontmatter from canonical rule metadata.\n * Maps `scope` to `alwaysApply` / `globs` as the Cursor adapter does.\n */\nfunction cursorCompanionFrontmatter(description: string, scope?: string): string {\n const lines: string[] = [`description: ${description}`];\n if (scope === \"always\") {\n lines.push(\"alwaysApply: true\");\n } else if (scope && scope !== \"conditional\") {\n // Treat non-\"always\", non-\"conditional\" scope values as glob patterns\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n lines.push(`globs: [${globs.map((g) => `\"${g}\"`).join(\", \")}]`);\n } else {\n lines.push(\"alwaysApply: false\");\n }\n return `---\\n${lines.join(\"\\n\")}\\n---`;\n}\n\n/**\n * Generate .mdc companion files for all .md rule files in a directory.\n * Each .mdc file contains Cursor-native frontmatter (description, alwaysApply/globs)\n * and the full body content from the source .md file.\n *\n * Returns the list of .mdc file paths that were written.\n */\nexport async function generateMdcCompanions(rulesDir: string): Promise<string[]> {\n let entries: string[];\n try {\n entries = (await readdir(rulesDir)).filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n const written: string[] = [];\n for (const mdFile of entries) {\n const mdPath = join(rulesDir, mdFile);\n const raw = await readFile(mdPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(raw);\n const description = metadata.description || \"\";\n const scope = metadata.scope;\n const frontmatter = cursorCompanionFrontmatter(description, scope);\n const mdcContent = `${frontmatter}\\n${content}`;\n const mdcFile = mdFile.replace(/\\.md$/, \".mdc\");\n const mdcPath = join(rulesDir, mdcFile);\n await writeFile(mdcPath, mdcContent, \"utf-8\");\n written.push(mdcPath);\n }\n return written;\n}\n","export interface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n pre: string;\n}\n\nexport function parseVersion(v: string): ParsedVersion {\n const cleaned = v.replace(/^v/, \"\");\n const [core, pre = \"\"] = cleaned.split(\"-\", 2);\n const parts = core.split(\".\");\n return {\n major: parseInt(parts[0] ?? \"0\", 10) || 0,\n minor: parseInt(parts[1] ?? \"0\", 10) || 0,\n patch: parseInt(parts[2] ?? \"0\", 10) || 0,\n pre,\n };\n}\n\nexport function compareVersions(a: string, b: string): -1 | 0 | 1 {\n const va = parseVersion(a);\n const vb = parseVersion(b);\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (va[key] < vb[key]) return -1;\n if (va[key] > vb[key]) return 1;\n }\n\n // No pre-release > any pre-release (1.0.0 > 1.0.0-alpha)\n if (!va.pre && vb.pre) return 1;\n if (va.pre && !vb.pre) return -1;\n if (va.pre < vb.pre) return -1;\n if (va.pre > vb.pre) return 1;\n\n return 0;\n}\n","import type { HatchManifest } from \"../types.js\";\nimport { compareVersions } from \"./compare.js\";\n\nexport interface VersionCheckpoint {\n /** Semver at which this checkpoint applies (e.g., \"2.0.0\"). */\n version: string;\n /** \"migration\" = auto-execute during update. \"reinit-advisory\" = suggest hatch3r clean. */\n action: \"migration\" | \"reinit-advisory\";\n /** Human-readable explanation for why this checkpoint exists. */\n reason: string;\n /** Auto-migration function (only for action: \"migration\"). */\n migrate?: (manifest: HatchManifest, rootDir: string) => Promise<HatchManifest>;\n /** Specific changes listed in the reinit advisory. */\n changes?: string[];\n}\n\n/**\n * Registry of version-gated checkpoints.\n * Populated as breaking changes are introduced in future releases.\n * Ordered by version ascending.\n */\nexport const VERSION_CHECKPOINTS: VersionCheckpoint[] = [];\n\n/**\n * Return checkpoints that apply when upgrading from `fromVersion` to `toVersion`.\n * A checkpoint applies when its version is greater than `fromVersion` and less than\n * or equal to `toVersion`.\n */\nexport function getApplicableCheckpoints(\n fromVersion: string,\n toVersion: string,\n): VersionCheckpoint[] {\n return VERSION_CHECKPOINTS.filter((cp) =>\n compareVersions(cp.version, fromVersion) > 0 &&\n compareVersions(cp.version, toVersion) <= 0,\n );\n}\n","/**\n * Persistent audit trail for pipeline failures.\n *\n * #251 (D8-8.18): Records pipeline failures to a persistent log file\n * so failures can be reviewed after the fact. Each entry includes\n * timestamp, phase, error details, and context for debugging.\n *\n * The log is append-only and auto-rotated when it exceeds MAX_LOG_SIZE.\n */\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface FailureLogEntry {\n /** ISO-8601 timestamp of the failure. */\n timestamp: string;\n /** Pipeline phase where the failure occurred. */\n phase: string;\n /** Which adapter/tool was involved (if applicable). */\n tool?: string;\n /** Error message. */\n error: string;\n /** Error code (if HatchError). */\n errorCode?: string;\n /** Correlation ID for the pipeline run (if available). */\n correlationId?: string;\n /** hatch3r version. */\n version?: string;\n}\n\n// ── Constants ────────────────────────────────────────────────────\n\n/** Maximum log file size in bytes before rotation (500KB). */\nexport const MAX_LOG_SIZE = 512 * 1024;\n\n/** Default log file name within the .agents directory. */\nexport const FAILURE_LOG_FILE = \".failure-log.jsonl\";\n\n// ── Implementation ───────────────────────────────────────────────\n\n/**\n * Format a failure log entry as a single JSONL line.\n */\nexport function formatLogEntry(entry: FailureLogEntry): string {\n return JSON.stringify(entry);\n}\n\n/**\n * Create a failure log entry from an error and context.\n */\nexport function createFailureLogEntry(\n phase: string,\n error: unknown,\n options?: {\n tool?: string;\n correlationId?: string;\n version?: string;\n },\n): FailureLogEntry {\n const entry: FailureLogEntry = {\n timestamp: new Date().toISOString(),\n phase,\n error: error instanceof Error ? error.message : String(error),\n };\n\n if (error instanceof Error && \"errorCode\" in error) {\n entry.errorCode = (error as { errorCode: string }).errorCode;\n }\n\n if (options?.tool) entry.tool = options.tool;\n if (options?.correlationId) entry.correlationId = options.correlationId;\n if (options?.version) entry.version = options.version;\n\n return entry;\n}\n\n/**\n * Parse a JSONL failure log into entries.\n *\n * Tolerant of malformed lines (skips them silently).\n */\nexport function parseFailureLog(content: string): FailureLogEntry[] {\n const entries: FailureLogEntry[] = [];\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as FailureLogEntry;\n if (parsed.timestamp && parsed.phase && parsed.error) {\n entries.push(parsed);\n }\n } catch {\n // Skip malformed lines -- do not let log parsing errors break the pipeline\n }\n }\n return entries;\n}\n\n/**\n * Check whether the log content exceeds the max size and needs rotation.\n */\nexport function shouldRotateLog(content: string): boolean {\n return Buffer.byteLength(content, \"utf-8\") > MAX_LOG_SIZE;\n}\n\n/**\n * Rotate the log by keeping only the most recent half of entries.\n */\nexport function rotateLog(content: string): string {\n const entries = parseFailureLog(content);\n if (entries.length <= 1) return content;\n const keepCount = Math.ceil(entries.length / 2);\n const kept = entries.slice(-keepCount);\n return kept.map(formatLogEntry).join(\"\\n\") + \"\\n\";\n}\n","import { appendFile, cp, mkdir, readFile, readdir, stat } from \"node:fs/promises\";\nimport { execFileSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { readManifest, writeManifest, addManagedFile } from \"../../manifest/hatchJson.js\";\nimport { getApplicableCheckpoints } from \"../../version/checkpoints.js\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { AGENTS_DIR, HATCH3R_PREFIX, HatchError, WORKTREE_CAPABLE_TOOLS, WORKTREE_INCLUDE_FILE, type HatchManifest, type Platform } from \"../../types.js\";\nimport { generateCanonicalAgentsMd, generateRootAgentsMd } from \"../shared/agentsContent.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport {\n createFailureLogEntry,\n formatLogEntry,\n shouldRotateLog,\n rotateLog,\n FAILURE_LOG_FILE,\n} from \"../../pipeline/failureLog.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n warn,\n step,\n label,\n} from \"../shared/ui.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { detectPackageManager } from \"../../detect/packageManager.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest, verifyIntegrity } from \"../../integrity/index.js\";\nimport { pruneArchives } from \"../../archive/index.js\";\nimport { buildSelectionsFromDisk } from \"../../content/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_DIRS = [\"agents\", \"commands\", \"rules\", \"skills\", \"prompts\", \"github-agents\", \"mcp\", \"hooks\"];\nconst ALWAYS_COPY_FILES = new Set([\"mcp.json\"]);\n\n/**\n * Package update timeout in milliseconds.\n * Override with HATCH3R_UPDATE_TIMEOUT_MS env var (default: 30000).\n */\nconst UPDATE_TIMEOUT_MS = (() => {\n const envVal = process.env.HATCH3R_UPDATE_TIMEOUT_MS;\n if (envVal) {\n const parsed = parseInt(envVal, 10);\n if (!Number.isNaN(parsed) && parsed > 0) return parsed;\n }\n return 30_000;\n})();\n\n/**\n * Read a file's content, returning null if the file does not exist.\n */\nasync function readFileOrNull(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * Append a failure entry to the persistent failure log in .agents/.\n * Performs log rotation when the log exceeds 500KB.\n * Silently skips if the write fails (failure logging must not break update).\n */\nasync function appendFailure(agentsDir: string, phase: string, error: unknown, tool?: string): Promise<void> {\n try {\n const logPath = join(agentsDir, FAILURE_LOG_FILE);\n const entry = createFailureLogEntry(phase, error, {\n tool,\n version: HATCH3R_VERSION,\n });\n const line = formatLogEntry(entry) + \"\\n\";\n\n // Check if rotation is needed before appending\n try {\n const existing = await readFile(logPath, \"utf-8\");\n if (shouldRotateLog(existing + line)) {\n const rotated = rotateLog(existing);\n await safeWriteFile(logPath, rotated + line);\n return;\n }\n } catch {\n // File does not exist yet -- appendFile will create it\n }\n\n await appendFile(logPath, line);\n } catch {\n // Failure logging must not break the update command\n }\n}\n\nasync function copyHatch3rFiles(\n srcDir: string,\n destDir: string,\n insideHatch3rDir = false,\n selectedIds?: Set<string>,\n): Promise<string[]> {\n const copied: string[] = [];\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(srcDir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name);\n const destPath = join(destDir, entry.name);\n\n if (entry.isDirectory()) {\n // If we have selectedIds and this is a skill dir, check if the skill is selected\n if (selectedIds && entry.name.startsWith(HATCH3R_PREFIX)) {\n if (!selectedIds.has(entry.name)) continue;\n }\n await mkdir(destPath, { recursive: true });\n const subCopied = await copyHatch3rFiles(\n srcPath,\n destPath,\n insideHatch3rDir || !entry.name.startsWith(HATCH3R_PREFIX),\n selectedIds,\n );\n copied.push(...subCopied.map((p) => join(entry.name, p)));\n } else if (entry.name.startsWith(HATCH3R_PREFIX) || insideHatch3rDir || ALWAYS_COPY_FILES.has(entry.name)) {\n // If we have selectedIds, check if this file's base ID is selected\n if (selectedIds && entry.name.startsWith(HATCH3R_PREFIX)) {\n const baseId = entry.name.replace(/\\.(md|mdc)$/, \"\");\n if (!selectedIds.has(baseId)) continue;\n }\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n copied.push(entry.name);\n }\n }\n\n return copied;\n}\n\nexport interface UpdateResult {\n copiedFiles: number;\n syncedTools: number;\n failedTools: number;\n version: string;\n /** Diff data: before/after snapshots for each generated file (only populated when --diff is used). */\n diffBefore?: Map<string, string | null>;\n diffAfter?: Map<string, string | null>;\n}\n\nexport async function runUpdate(\n rootDir: string,\n manifest: HatchManifest,\n options: { stepOffset?: number; totalSteps?: number; diff?: boolean } = {},\n): Promise<UpdateResult> {\n const offset = options.stepOffset ?? 0;\n const total = options.totalSteps ?? 4;\n const agentsDir = join(rootDir, AGENTS_DIR);\n\n let contentRoot = findPackageRoot(__dirname);\n\n const pm = await detectPackageManager(rootDir);\n const s0 = createSpinner(step(offset + 1, total, \"Updating package...\"));\n s0.start();\n try {\n const cmd = process.platform === \"win32\" && pm.name !== \"bun\"\n ? `${pm.updateCmd}.cmd`\n : pm.updateCmd;\n execFileSync(cmd, pm.updateArgs, { stdio: \"pipe\", timeout: UPDATE_TIMEOUT_MS, killSignal: \"SIGTERM\" });\n contentRoot = findPackageRoot(__dirname);\n } catch (err) {\n const isTimeout = err && typeof err === \"object\" && (\"killed\" in err || \"signal\" in err);\n const msg = isTimeout\n ? `Package update timed out after ${UPDATE_TIMEOUT_MS / 1000}s. Check network connectivity and retry, or set HATCH3R_UPDATE_TIMEOUT_MS to increase the timeout.`\n : (err instanceof Error ? err.message : String(err));\n s0.fail(step(offset + 1, total, \"Failed to update package\"));\n logError(msg);\n throw new HatchError(msg, 1, isTimeout ? \"NETWORK_ERROR\" : \"UNKNOWN_ERROR\");\n }\n s0.succeed(step(offset + 1, total, \"Package updated\"));\n\n const s1 = createSpinner(step(offset + 2, total, \"Updating canonical files...\"));\n s1.start();\n\n // Build a set of selected IDs if manifest has content selections\n let selectedIds: Set<string> | undefined;\n if (manifest.content) {\n selectedIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) selectedIds.add(id);\n }\n }\n\n const copied: string[] = [];\n for (const dir of CONTENT_DIRS) {\n const srcDir = join(contentRoot, dir);\n try {\n const dirCopied = await copyHatch3rFiles(srcDir, join(agentsDir, dir), false, selectedIds);\n copied.push(...dirCopied.map((p) => join(dir, p)));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n // Generate dynamic AGENTS.md based on what's on disk\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n // Regenerate root AGENTS.md with inline agent/skill/command rosters for platform discovery\n const rootAgentsMd = await generateRootAgentsMd(agentsDir);\n await safeWriteFile(join(rootDir, \"AGENTS.md\"), rootAgentsMd.full, {\n managedContent: rootAgentsMd.inner,\n });\n s1.succeed(step(offset + 2, total, `Updated ${copied.length} canonical files`));\n\n // --diff: track file snapshots before and after generation\n const diffBefore = new Map<string, string | null>();\n const diffAfter = new Map<string, string | null>();\n\n const s2 = createSpinner(step(offset + 3, total, \"Re-syncing adapter output...\"));\n s2.start();\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of manifest.tools) {\n const adapter = getAdapter(tool);\n try {\n const outputs = await adapter.generate(agentsDir, manifest);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n if (options.diff) {\n diffBefore.set(out.path, await readFileOrNull(join(rootDir, out.path)));\n }\n const fullPath = join(rootDir, out.path);\n if (out.managedContent) {\n await safeWriteFile(fullPath, out.content, {\n managedContent: out.managedContent,\n });\n } else {\n await safeWriteFile(fullPath, out.content);\n }\n addManagedFile(manifest, out.path);\n if (options.diff) {\n diffAfter.set(out.path, await readFileOrNull(join(rootDir, out.path)));\n }\n }\n } catch (err) {\n adapterFailures.push({\n tool,\n error: err instanceof Error ? err.message : String(err),\n });\n // Record to persistent failure log for post-hoc debugging\n await appendFailure(agentsDir, \"update:adapter-generate\", err, tool);\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === manifest.tools.length) {\n s2.fail(step(offset + 3, total, \"All adapters failed\"));\n throw new HatchError(\"All adapters failed\", 1, \"ADAPTER_ERROR\");\n }\n }\n s2.succeed(step(offset + 3, total, adapterFailures.length > 0\n ? `Re-synced ${manifest.tools.length - adapterFailures.length}/${manifest.tools.length} tool(s)`\n : `Re-synced ${manifest.tools.length} tool(s)`));\n\n // #107: Show unsupported feature warnings (parity with sync command)\n for (const tool of manifest.tools) {\n const warnings = getUnsupportedFeatureWarnings(tool, manifest);\n for (const w of warnings) { warn(w); }\n }\n\n // ── Reconciliation: .worktreeinclude & .env.mcp (parity with sync) ──\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(\n join(rootDir, WORKTREE_INCLUDE_FILE),\n wtContent,\n { managedContent: wtManaged },\n );\n }\n\n if (manifest.features.mcp && manifest.mcp.servers.length > 0) {\n const envResult = await ensureEnvMcp(rootDir, manifest.mcp.servers);\n await ensureGitignoreEntry(rootDir);\n if (envResult.newVars.length > 0) {\n warn(\n `New secrets needed in .env.mcp: ${envResult.newVars.join(\", \")}`,\n );\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\n }\n\n const s3 = createSpinner(step(offset + 4, total, \"Writing manifest...\"));\n s3.start();\n manifest.hatch3rVersion = HATCH3R_VERSION;\n await writeManifest(rootDir, manifest);\n\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n\n // Prune stale archive entries\n await pruneArchives(rootDir);\n\n s3.succeed(step(offset + 4, total, \"Manifest updated\"));\n\n return {\n copiedFiles: copied.length,\n syncedTools: manifest.tools.length - adapterFailures.length,\n failedTools: adapterFailures.length,\n version: HATCH3R_VERSION,\n ...(options.diff ? { diffBefore, diffAfter } : {}),\n };\n}\n\ninterface MigrationCheckpoint {\n id: string;\n condition: (manifest: HatchManifest, rootDir: string) => Promise<boolean>;\n execute: (manifest: HatchManifest, rootDir: string, headless: boolean) => Promise<{ manifest: HatchManifest; notices: string[] }>;\n}\n\nconst MIGRATION_CHECKPOINTS: MigrationCheckpoint[] = [\n {\n id: \"content-selections-init\",\n condition: async (manifest) => manifest.content === undefined,\n execute: async (manifest, rootDir, headless) => {\n const agentsDir = join(rootDir, AGENTS_DIR);\n const content = await buildSelectionsFromDisk(agentsDir);\n\n if (headless) {\n // Use safe defaults in headless/CI mode\n content.projectType = \"brownfield\";\n content.teamSize = \"team\";\n } else {\n // Ask user for context since we can't infer it from legacy installs\n const { projectType } = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"select\",\n name: \"projectType\",\n message: \"For content tracking — is this a greenfield or brownfield project?\",\n choices: [\n { name: \"Greenfield — new project\", value: \"greenfield\" as const },\n { name: \"Brownfield — existing codebase\", value: \"brownfield\" as const },\n ],\n default: \"brownfield\",\n },\n ]);\n const { teamSize } = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"select\",\n name: \"teamSize\",\n message: \"Solo developer or team?\",\n choices: [\n { name: \"Solo\", value: \"solo\" as const },\n { name: \"Team\", value: \"team\" as const },\n ],\n default: \"team\",\n },\n ]);\n content.projectType = projectType;\n content.teamSize = teamSize;\n }\n\n return {\n manifest: { ...manifest, content },\n notices: [\"Migrated to explicit content tracking (all existing items preserved)\"],\n };\n },\n },\n {\n id: \"platform-selection\",\n condition: async (manifest) => !manifest.platform,\n execute: async (manifest, _rootDir, headless) => {\n let platform: Platform;\n\n if (headless) {\n // Default to github in headless/CI mode\n platform = \"github\";\n } else {\n const answer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"select\",\n name: \"platform\",\n message: \"hatch3r now supports multiple platforms. Select your platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: \"github\",\n },\n ]);\n platform = answer.platform;\n }\n\n const updated = { ...manifest, platform };\n const notices: string[] = [];\n\n if (platform === \"github\") {\n updated.namespace = updated.namespace || updated.owner;\n updated.project = updated.project || updated.repo;\n notices.push(\"Migrated to GitHub platform (auto-detected from existing config)\");\n } else {\n const answers = await inquirer.prompt<{ namespace: string; project: string; repo: string }>([\n { type: \"input\", name: \"namespace\", message: platform === \"azure-devops\" ? \"Azure DevOps organization:\" : \"GitLab namespace (group or username):\", default: updated.owner || undefined },\n { type: \"input\", name: \"project\", message: platform === \"azure-devops\" ? \"Azure DevOps project:\" : \"Project name:\", default: updated.repo || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: updated.repo || undefined },\n ]);\n updated.owner = answers.namespace;\n updated.repo = answers.repo;\n updated.namespace = answers.namespace;\n updated.project = answers.project;\n notices.push(`Migrated to ${platform === \"azure-devops\" ? \"Azure DevOps\" : \"GitLab\"} platform`);\n }\n\n if (updated.version === \"1.0.0\") {\n updated.version = \"2.0.0\";\n }\n\n return { manifest: updated, notices };\n },\n },\n {\n id: \"customize-yaml-size\",\n condition: async (_manifest, rootDir) => {\n const agentsDir = join(rootDir, AGENTS_DIR);\n try {\n const entries = await readdir(agentsDir, { recursive: true });\n for (const entry of entries) {\n if (typeof entry === \"string\" && entry.endsWith(\".customize.yaml\")) {\n const s = await stat(join(agentsDir, entry));\n if (s.size > 10240) return true;\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n return false;\n },\n execute: async (manifest, rootDir, _headless) => {\n const notices: string[] = [];\n const agentsDir = join(rootDir, AGENTS_DIR);\n try {\n const entries = await readdir(agentsDir, { recursive: true });\n for (const entry of entries) {\n if (typeof entry === \"string\" && entry.endsWith(\".customize.yaml\")) {\n const s = await stat(join(agentsDir, entry));\n if (s.size > 10240) {\n notices.push(`Large customize file detected: ${entry} (${Math.round(s.size / 1024)}KB) — consider splitting`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n return { manifest, notices };\n },\n },\n {\n id: \"worktree-config-init\",\n condition: async (manifest) => {\n if (manifest.worktree !== undefined) return false;\n return manifest.tools.some(t => WORKTREE_CAPABLE_TOOLS.has(t));\n },\n execute: async (manifest, rootDir, headless) => {\n let enabled: boolean;\n\n if (headless) {\n // Default to enabled in headless/CI mode\n enabled = true;\n } else {\n const answer = await inquirer.prompt<{ enabled: boolean }>([{\n type: \"confirm\",\n name: \"enabled\",\n message: \"hatch3r now supports worktree file isolation for parallel agent sessions. Enable it?\",\n default: true,\n }]);\n enabled = answer.enabled;\n }\n\n const updated = { ...manifest, worktree: { enabled } };\n const notices: string[] = [];\n\n if (enabled) {\n const wtContent = await generateWorktreeInclude(updated, rootDir);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n appendIfNoBlock: true,\n });\n notices.push(\"Worktree isolation enabled — .worktreeinclude generated\");\n } else {\n notices.push(\"Worktree isolation skipped (enable later with `hatch3r config`)\");\n }\n\n return { manifest: updated, notices };\n },\n },\n];\n\nasync function runMigrationCheckpoints(manifest: HatchManifest, rootDir: string, headless = false): Promise<{ manifest: HatchManifest; allNotices: string[] }> {\n let current = manifest;\n const allNotices: string[] = [];\n\n for (const checkpoint of MIGRATION_CHECKPOINTS) {\n if (await checkpoint.condition(current, rootDir)) {\n const { manifest: updated, notices } = await checkpoint.execute(current, rootDir, headless);\n current = updated;\n allNotices.push(...notices);\n }\n }\n\n return { manifest: current, allNotices };\n}\n\nexport async function updateCommand(_opts?: Record<string, unknown> & { yes?: boolean; diff?: boolean }): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n const headless = !!(_opts?.yes);\n const { manifest: migrated, allNotices } = await runMigrationCheckpoints(manifest, rootDir, headless);\n const m = migrated;\n\n for (const notice of allNotices) {\n warn(notice);\n }\n\n // #118: Run integrity pre-check before update to detect tampered files\n const agentsDir = join(rootDir, AGENTS_DIR);\n const integrityResults = await verifyIntegrity(agentsDir);\n const modified = integrityResults.filter((r) => r.status === \"modified\");\n const missing = integrityResults.filter((r) => r.status === \"missing\");\n if (modified.length > 0 || missing.length > 0) {\n warn(\"Integrity issues detected before update:\");\n for (const r of modified) { warn(` MODIFIED: ${r.file}`); }\n for (const r of missing) { warn(` MISSING: ${r.file}`); }\n warn(\"These files will be overwritten during update.\");\n console.log();\n }\n\n const isUpToDate = m.hatch3rVersion === HATCH3R_VERSION;\n if (isUpToDate) {\n info(`Already at hatch3r v${HATCH3R_VERSION}`);\n } else {\n info(`Updating from v${m.hatch3rVersion} to v${HATCH3R_VERSION}`);\n }\n console.log();\n\n const result = await runUpdate(rootDir, m, { diff: !!_opts?.diff });\n\n // Version checkpoint advisory: detect if a clean reinit is recommended\n const versionCheckpoints = getApplicableCheckpoints(m.hatch3rVersion, HATCH3R_VERSION);\n const reinitAdvisories = versionCheckpoints.filter(cp => cp.action === \"reinit-advisory\");\n\n if (reinitAdvisories.length > 0) {\n console.log();\n warn(\"A clean reinit is recommended for this version update:\");\n for (const advisory of reinitAdvisories) {\n console.log(chalk.dim(` - ${advisory.reason}`));\n for (const change of advisory.changes ?? []) {\n console.log(chalk.dim(` • ${change}`));\n }\n }\n console.log();\n info(`Run ${chalk.bold(\"hatch3r clean\")} and choose to reinitialize when prompted.`);\n console.log(chalk.dim(\" Your customizations and learnings will be preserved.\\n\"));\n }\n\n // --diff: show file change summary\n if (_opts?.diff && result.diffBefore && result.diffAfter) {\n const diffLines: string[] = [];\n for (const [filePath] of result.diffBefore) {\n const before = result.diffBefore.get(filePath) ?? null;\n const after = result.diffAfter.get(filePath) ?? null;\n if (before === null && after !== null) {\n diffLines.push(`${chalk.green(\"+ added\")} ${filePath}`);\n } else if (before !== null && after !== null && before !== after) {\n diffLines.push(`${chalk.yellow(\"~ modified\")} ${filePath}`);\n } else if (before !== null && after !== null && before === after) {\n diffLines.push(`${chalk.dim(\"= unchanged\")} ${filePath}`);\n }\n }\n if (diffLines.length > 0) {\n console.log();\n printBox(\"Diff summary\", diffLines, \"info\");\n }\n }\n\n console.log();\n printBox(\"Update complete\", [\n label(\"Files\", `${result.copiedFiles} canonical files updated`),\n label(\"Tools\", `${result.syncedTools} tool(s) re-synced`),\n label(\"Version\", `v${result.version}`),\n ], \"success\");\n}\n","// Sync I/O (execFileSync) is used intentionally in init/update for package\n// manager operations where async would add complexity without benefit.\n\nimport { Command } from \"commander\";\nimport { addCommand } from \"./commands/add.js\";\nimport { worktreeSetupCommand } from \"./commands/worktreeSetup.js\";\nimport { worktreeCleanupCommand } from \"./commands/worktreeCleanup.js\";\nimport { cleanCommand } from \"./commands/clean.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { verifyCommand } from \"./commands/verify.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { HatchError, TOOL_CHOICES } from \"../types.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hatch3r\")\n .description(\n \"Battle-tested agentic coding setup framework. Crack the egg. Hatch better agents.\",\n )\n .version(HATCH3R_VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Install a complete agent setup into the current repo (first-run: creates .agents/ directory)\")\n .option(\n \"--tools <tools>\",\n `Comma-separated tools (${TOOL_CHOICES})`,\n )\n .option(\"--yes\", \"Skip interactive prompts, use defaults\")\n .option(\"--preset <preset>\", \"Content preset: minimal, standard, full (default: standard)\")\n .option(\"--project-type <type>\", \"Project type: greenfield, brownfield\")\n .option(\"--team-size <size>\", \"Team size: solo, team\")\n .option(\"--workspace\", \"Initialize as a multi-repo workspace\")\n .action(initCommand);\n\nprogram\n .command(\"sync\")\n .description(\"Re-generate tool outputs from canonical .agents/ state (run after editing .agents/)\")\n .option(\"--repos [paths...]\", \"Sync workspace content to sub-repos (all opted-in if no paths given)\")\n .option(\"--dry-run\", \"Show what would change without modifying files\")\n .option(\"--diff\", \"Show a before/after diff summary for each generated file\")\n .option(\"--force\", \"Overwrite locally modified files in sub-repos\")\n .option(\"--minimal\", \"Generate stripped-down output (no comments, minimal formatting) to reduce token usage\")\n .option(\"--verbose\", \"Show detailed output for each file processed\")\n .action(syncCommand);\n\nprogram\n .command(\"status\")\n .description(\"Check sync status between canonical .agents/ and generated files\")\n .option(\"--verbose\", \"Show detailed per-file status information\")\n .action(statusCommand);\n\nprogram\n .command(\"update\")\n .description(\"Pull latest hatch3r templates with safe merge (preserves customizations)\")\n .option(\"--yes\", \"Skip interactive prompts, use defaults\")\n .option(\"--diff\", \"Show a before/after diff summary for each generated file\")\n .action(updateCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Check .agents/ structure: frontmatter, cross-references, content safety, compliance\")\n .option(\"--verbose\", \"Show detailed validation output for each check\")\n .action(validateCommand);\n\nprogram\n .command(\"verify\")\n .description(\"Check file integrity: SHA-256 hashes vs manifest (detect unauthorized modifications)\")\n .action(verifyCommand);\n\nprogram\n .command(\"config\")\n .description(\"Reconfigure tools, MCP servers, features, and platform\")\n .action(configCommand);\n\nprogram\n .command(\"clean\")\n .description(\"Remove all hatch3r artifacts from the current repo (optionally reinitialize after)\")\n .option(\"--yes\", \"Skip confirmation prompts (cleans without reinit)\")\n .option(\"--dry-run\", \"Show what would be removed without modifying files\")\n .action(cleanCommand);\n\nprogram\n .command(\"add [pack]\")\n .description(\"Install a community pack (coming soon)\")\n .action(addCommand);\n\nprogram\n .command(\"worktree-setup [worktree-path]\")\n .description(\"Set up gitignored files in a git worktree\")\n .option(\"--from <path>\", \"Main repo path (auto-detected by default)\")\n .option(\"--dry-run\", \"Show what would be done without changes\")\n .option(\"--force\", \"Overwrite existing files in the worktree\")\n .action(worktreeSetupCommand);\n\nprogram\n .command(\"worktree-cleanup\")\n .description(\"Remove symlinks and copied files created by worktree-setup\")\n .option(\"--dry-run\", \"Show what would be done without changes\")\n .action(worktreeCleanupCommand);\n\n// Agent command names that users might try to run directly in the terminal.\n// These are slash commands meant to be invoked inside an AI-powered editor, not from the CLI.\nconst AGENT_COMMAND_NAMES = new Set([\n \"workflow\", \"project-spec\", \"codebase-map\", \"debug\", \"release\",\n \"refactor-plan\", \"test-plan\", \"bug-plan\", \"feature-plan\", \"migration-plan\",\n \"roadmap\", \"onboard\", \"recipe\",\n \"board-init\", \"board-pickup\", \"board-groom\", \"board-refresh\", \"board-fill\",\n \"board-shared\",\n \"security-audit\", \"dep-audit\", \"benchmark\", \"healthcheck\", \"context-health\",\n \"learn\", \"revision\", \"cost-tracking\", \"api-spec\", \"hooks\", \"quick-change\",\n \"command-customize\", \"agent-customize\", \"rule-customize\", \"skill-customize\",\n]);\n\n// Catch-all for unknown commands -- redirect agent commands to the editor\nprogram.on(\"command:*\", (operands: string[]) => {\n const cmd = operands[0];\n if (cmd && AGENT_COMMAND_NAMES.has(cmd)) {\n console.error(\n `\\n \"${cmd}\" is a hatch3r agent command meant to be run inside your AI editor (e.g. /${cmd}).` +\n `\\n It cannot be invoked from the terminal CLI.` +\n `\\n\\n To use agent commands, open your project in Cursor, Claude Code, or another supported tool` +\n `\\n and type /${cmd} in the AI chat.\\n`,\n );\n } else {\n console.error(\n `\\n Unknown command: ${cmd}` +\n `\\n Run \"hatch3r --help\" for available commands.` +\n `\\n\\n Common commands:` +\n `\\n hatch3r init Set up agent configuration in current repo` +\n `\\n hatch3r sync Regenerate tool outputs from .agents/` +\n `\\n hatch3r status Check sync status` +\n `\\n hatch3r validate Check .agents/ structure and content` +\n `\\n hatch3r verify Check file integrity (SHA-256)` +\n `\\n hatch3r config Reconfigure tools, features, MCP` +\n `\\n hatch3r clean Remove hatch3r artifacts\\n`,\n );\n }\n process.exit(1);\n});\n\nconst nodeVersion = parseInt(process.version.slice(1), 10);\nif (nodeVersion < 22) {\n console.error(\n `hatch3r requires Node.js >= 22.0.0 (current: ${process.version}). Please upgrade Node.js.`,\n );\n process.exit(1);\n}\n\nlet shuttingDown = false;\nconst SIGNAL_EXIT_CODES: Record<string, number> = { SIGINT: 130, SIGTERM: 143 };\nfor (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (shuttingDown) return;\n shuttingDown = true;\n // Allow pending writes to flush, then exit with POSIX-correct code (128 + signal)\n process.stdout.write(\"\", () => {\n process.stderr.write(\"\", () => {\n process.exit(SIGNAL_EXIT_CODES[signal] ?? 1);\n });\n });\n });\n}\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\n `\\nhatch3r: unhandled promise rejection: ${reason instanceof Error ? reason.message : String(reason)}`,\n );\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\ntry {\n await program.parseAsync();\n} catch (err) {\n if (err instanceof HatchError) {\n process.exit(err.exitCode);\n }\n const isUsageError = err instanceof Error && (\n err.message.includes(\"Invalid\") ||\n err.message.includes(\"Unknown\") ||\n err.message.includes(\"missing required\")\n );\n console.error(\n `\\nhatch3r encountered an ${isUsageError ? \"usage\" : \"unexpected\"} error: ${err instanceof Error ? err.message : String(err)}`,\n );\n if (isUsageError) {\n console.error(` Run \"hatch3r --help\" for usage information.`);\n } else {\n console.error(\" For help, see: https://github.com/hatch3r/hatch3r#troubleshooting\");\n console.error(\" Check .agents/.failure-log.jsonl for recent failure details.\");\n console.error(\" Set DEBUG=1 for a full stack trace.\");\n }\n if (process.env.DEBUG) {\n console.error(err);\n }\n process.exit(isUsageError ? 2 : 1);\n}\n","import chalk from \"chalk\";\nimport { printBanner, warn } from \"../shared/ui.js\";\nimport { HatchError } from \"../../types.js\";\n\nexport async function addCommand(): Promise<void> {\n printBanner(true);\n console.log();\n warn(\"The `add` command is not yet implemented.\");\n console.log(chalk.dim(\" It will allow installing community packs in a future release.\"));\n console.log(chalk.dim(\" Follow https://github.com/hatch3r for updates.\"));\n console.log();\n throw new HatchError(\n \"The `add` command is not yet implemented.\",\n 2,\n \"VALIDATION_ERROR\",\n );\n}\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { execFileSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport {\n WORKTREE_INCLUDE_FILE,\n HatchError,\n} from \"../../types.js\";\nimport {\n setupWorktree,\n parseWorktreeInclude,\n} from \"../../worktree/index.js\";\nimport {\n isInsideWorktree,\n findMainWorktree,\n} from \"../../worktree/resolve.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n warn,\n label,\n} from \"../shared/ui.js\";\n\nexport async function worktreeSetupCommand(\n worktreePath?: string,\n opts: { from?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<void> {\n printBanner(true);\n\n const cwd = process.cwd();\n let mainRoot: string;\n let targetRoot: string;\n\n if (isInsideWorktree(cwd)) {\n mainRoot = opts.from ?? findMainWorktree(cwd);\n targetRoot = worktreePath ? join(cwd, worktreePath) : cwd;\n info(`Detected worktree. Main repo: ${chalk.dim(mainRoot)}`);\n } else {\n mainRoot = opts.from ?? cwd;\n if (!worktreePath) {\n logError(\"Worktree path is required when running from the main repo.\");\n console.log(chalk.dim(\" Usage: hatch3r worktree-setup <worktree-path>\"));\n console.log(chalk.dim(\" Or run this command from inside a worktree.\\n\"));\n throw new HatchError(\"Missing worktree path\", 1, \"VALIDATION_ERROR\");\n }\n targetRoot = join(cwd, worktreePath);\n }\n\n const includePath = join(mainRoot, WORKTREE_INCLUDE_FILE);\n let includeContent: string;\n try {\n includeContent = await readFile(includePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n logError(`No ${WORKTREE_INCLUDE_FILE} found in ${mainRoot}`);\n console.log(chalk.dim(\" Run `hatch3r init` or `hatch3r sync` to generate it.\\n\"));\n throw new HatchError(`Missing ${WORKTREE_INCLUDE_FILE}`, 1, \"FS_ERROR\");\n }\n throw err;\n }\n\n if (opts.dryRun) {\n info(\"Dry run — no changes will be made.\\n\");\n const entries = parseWorktreeInclude(includeContent);\n const summaryLines = entries.map((e) => {\n const icon = e.strategy === \"symlink\" ? chalk.cyan(\"→\") : chalk.green(\"+\");\n return ` ${icon} ${e.pattern} ${chalk.dim(`(${e.strategy})`)}`;\n });\n printBox(\"Worktree setup (dry run)\", [\n label(\"Source\", mainRoot),\n label(\"Target\", targetRoot),\n label(\"Entries\", `${entries.length}`),\n \"\",\n ...summaryLines,\n ], \"info\");\n return;\n }\n\n const s = createSpinner(\"Setting up worktree files...\");\n s.start();\n\n const result = await setupWorktree(mainRoot, targetRoot, { force: opts.force });\n\n s.succeed(\"Worktree files set up\");\n\n const summaryLines: string[] = [];\n if (result.copied.length > 0) {\n summaryLines.push(label(\"Copied\", `${result.copied.length} file(s)`));\n for (const f of result.copied) {\n summaryLines.push(` ${chalk.green(\"+\")} ${f}`);\n }\n }\n if (result.symlinked.length > 0) {\n summaryLines.push(label(\"Symlinked\", `${result.symlinked.length} path(s)`));\n for (const f of result.symlinked) {\n summaryLines.push(` ${chalk.cyan(\"→\")} ${f}`);\n }\n }\n if (result.skipped.length > 0) {\n summaryLines.push(label(\"Skipped\", `${result.skipped.length} path(s)`));\n }\n if (result.errors.length > 0) {\n for (const e of result.errors) {\n warn(e);\n }\n }\n\n if (summaryLines.length > 0) {\n printBox(\"Worktree setup\", summaryLines, \"success\");\n } else {\n info(\"No files to set up (all patterns already satisfied or source files missing).\");\n }\n\n // Auto-sync adapter output in the worktree so CLAUDE.md, .claude/, etc. are fresh\n try {\n info(\"Syncing adapter output in worktree...\");\n execFileSync(\"npx\", [\"hatch3r\", \"sync\"], {\n cwd: targetRoot,\n stdio: \"pipe\",\n });\n info(\"Adapter output synced in worktree\");\n } catch {\n warn(\"Could not auto-sync adapter output. Run `hatch3r sync` in the worktree manually.\");\n }\n}\n","import chalk from \"chalk\";\nimport {\n HatchError,\n} from \"../../types.js\";\nimport {\n cleanupWorktree,\n} from \"../../worktree/index.js\";\nimport {\n isInsideWorktree,\n} from \"../../worktree/resolve.js\";\nimport {\n printBanner,\n createSpinner,\n info,\n error as logError,\n} from \"../shared/ui.js\";\n\nexport async function worktreeCleanupCommand(\n opts: { dryRun?: boolean } = {},\n): Promise<void> {\n printBanner(true);\n\n const cwd = process.cwd();\n\n if (!isInsideWorktree(cwd)) {\n logError(\"Not inside a git worktree.\");\n console.log(chalk.dim(\" Run this command from inside a worktree to clean up symlinks and copied files.\\n\"));\n throw new HatchError(\"Not inside a git worktree\", 1, \"VALIDATION_ERROR\");\n }\n\n if (opts.dryRun) {\n info(\"Dry run — no changes will be made.\");\n info(`Would clean up worktree symlinks in: ${cwd}`);\n return;\n }\n\n const s = createSpinner(\"Cleaning up worktree files...\");\n s.start();\n\n await cleanupWorktree(cwd);\n\n s.succeed(\"Worktree files cleaned up\");\n info(\"Symlinks created by worktree-setup have been removed.\");\n}\n","import { rm } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n warn,\n error as logError,\n step,\n label,\n} from \"../shared/ui.js\";\nimport { HatchError, type ContentSelection, type Features, type Platform, type Tool } from \"../../types.js\";\nimport { inventoryArtifacts, executeClean, backupLearnings, restoreLearnings, type CleanInventory } from \"../../clean/index.js\";\nimport { runInit, type RunInitOptions } from \"./init.js\";\nimport { analyzeRepo } from \"../../detect/repoAnalyzer.js\";\n\ninterface CapturedConfig {\n platform: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n defaultBranch: string;\n tools: Tool[];\n features: Features;\n mcpServers: string[];\n contentSelection: ContentSelection;\n}\n\nfunction captureConfig(manifest: NonNullable<CleanInventory[\"manifest\"]>): CapturedConfig {\n return {\n platform: manifest.platform ?? \"github\",\n owner: manifest.owner,\n repo: manifest.repo,\n namespace: manifest.namespace,\n project: manifest.project,\n defaultBranch: manifest.board?.defaultBranch ?? \"main\",\n tools: [...manifest.tools],\n features: { ...manifest.features },\n mcpServers: [...manifest.mcp.servers],\n contentSelection: manifest.content ?? {\n preset: \"standard\",\n projectType: \"brownfield\",\n teamSize: \"solo\",\n items: { agents: [], skills: [], rules: [], commands: [], prompts: [], hooks: [], githubAgents: [] },\n },\n };\n}\n\nfunction printInventory(inventory: CleanInventory): void {\n const sections: string[] = [];\n\n if (inventory.adapterFiles.length > 0) {\n sections.push(` ${chalk.red(\"×\")} ${inventory.adapterFiles.length} adapter output file(s)`);\n }\n if (inventory.canonicalDir) {\n sections.push(` ${chalk.red(\"×\")} .agents/ canonical directory`);\n }\n if (inventory.worktreeInclude) {\n sections.push(` ${chalk.red(\"×\")} .worktreeinclude`);\n }\n if (inventory.archiveDir) {\n sections.push(` ${chalk.red(\"×\")} .hatch3r-archive/`);\n }\n\n // Kept items\n if (inventory.envMcp) {\n sections.push(` ${chalk.green(\"✓\")} .env.mcp ${chalk.dim(\"(kept — contains secrets)\")}`);\n }\n if (inventory.customizeDir) {\n sections.push(` ${chalk.green(\"✓\")} .hatch3r/ ${chalk.dim(\"(kept — customizations)\")}`);\n }\n if (inventory.learnings.length > 0) {\n sections.push(` ${chalk.green(\"✓\")} ${inventory.learnings.length} learning(s) ${chalk.dim(\"(backed up for reinit)\")}`);\n }\n\n if (sections.length > 0) {\n console.log(\"\");\n console.log(chalk.bold(\" Cleanup inventory:\"));\n for (const s of sections) {\n console.log(s);\n }\n console.log(\"\");\n }\n}\n\nexport async function cleanCommand(\n opts: { yes?: boolean; dryRun?: boolean } = {},\n): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n\n // 1. Inventory\n const s1 = createSpinner(step(1, 3, \"Scanning artifacts...\"));\n s1.start();\n const inventory = await inventoryArtifacts(rootDir);\n s1.succeed(step(1, 3, \"Scan complete\"));\n\n // Check if there's anything to clean\n const hasAnything =\n inventory.adapterFiles.length > 0 ||\n inventory.canonicalDir ||\n inventory.worktreeInclude ||\n inventory.archiveDir;\n\n if (!hasAnything) {\n info(\"No hatch3r artifacts found. Nothing to clean.\");\n return;\n }\n\n // 2. Capture config before cleanup (for potential reinit)\n const config = inventory.manifest ? captureConfig(inventory.manifest) : null;\n\n // 3. Backup learnings before cleanup\n const learningsBackup = await backupLearnings(rootDir);\n\n // 4. Display inventory\n printInventory(inventory);\n\n // Workspace warnings\n if (inventory.isWorkspaceRoot) {\n warn(\"This is a workspace root. Member repos still reference this workspace.\");\n console.log(chalk.dim(\" Clean member repos individually or reinitialize them.\\n\"));\n }\n if (inventory.isWorkspaceMember) {\n warn(`This repo is managed by a workspace at ${chalk.bold(inventory.workspaceRootPath ?? \"..\")}.`);\n console.log(\"\");\n }\n\n // 5. Dry run\n if (opts.dryRun) {\n const result = await executeClean(rootDir, inventory, true);\n console.log(chalk.bold(\" Would remove:\"));\n for (const f of result.removed) {\n console.log(` ${chalk.red(\"×\")} ${f}`);\n }\n if (result.kept.length > 0) {\n console.log(chalk.bold(\"\\n Would keep:\"));\n for (const f of result.kept) {\n console.log(` ${chalk.green(\"✓\")} ${f}`);\n }\n }\n console.log(\"\");\n // Clean up learnings backup since we're not proceeding\n if (learningsBackup) {\n await rm(learningsBackup, { recursive: true, force: true });\n }\n return;\n }\n\n // 6. Confirm cleanup\n if (!opts.yes) {\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message: \"Remove all hatch3r artifacts from this repo?\",\n default: false,\n },\n ]);\n if (!proceed) {\n console.log(chalk.dim(\"\\n Clean cancelled.\\n\"));\n // Clean up learnings backup\n if (learningsBackup) {\n const { rm } = await import(\"node:fs/promises\");\n await rm(learningsBackup, { recursive: true, force: true });\n }\n throw new HatchError(\"Clean cancelled.\", 0);\n }\n }\n\n // 7. Execute cleanup\n const s2 = createSpinner(step(2, 3, \"Cleaning artifacts...\"));\n s2.start();\n const result = await executeClean(rootDir, inventory, false);\n s2.succeed(step(2, 3, `Removed ${result.removed.length} item(s)`));\n\n // Report errors\n if (result.errors.length > 0) {\n for (const e of result.errors) {\n warn(`Could not remove: ${e}`);\n }\n }\n\n // Report kept items\n for (const k of result.kept) {\n info(k);\n }\n\n // 8. Ask about reinit (skipped with --yes)\n if (!opts.yes && config) {\n console.log(\"\");\n const { reinit } = await inquirer.prompt<{ reinit: boolean }>([\n {\n type: \"confirm\",\n name: \"reinit\",\n message: \"Would you like to reinitialize hatch3r?\",\n default: true,\n },\n ]);\n\n if (reinit) {\n console.log(\"\");\n const s3 = createSpinner(step(3, 3, \"Analyzing repo...\"));\n s3.start();\n\n try {\n const repoInfo = await analyzeRepo(rootDir);\n s3.succeed(step(3, 3, \"Repo analyzed\"));\n\n const initOpts: RunInitOptions = {\n rootDir,\n platform: config.platform,\n owner: config.owner,\n repo: config.repo,\n namespace: config.namespace,\n project: config.project,\n defaultBranch: config.defaultBranch,\n tools: config.tools,\n features: config.features,\n mcpServers: config.mcpServers,\n repoInfo,\n contentSelection: config.contentSelection,\n };\n\n await runInit(initOpts);\n\n // Restore learnings\n if (learningsBackup) {\n await restoreLearnings(rootDir, learningsBackup);\n }\n\n const summaryLines = [\n label(\"Tools\", config.tools.join(\", \")),\n label(\"Preset\", config.contentSelection.preset),\n \"\",\n ];\n if (learningsBackup) {\n summaryLines.push(`${chalk.green(\"✓\")} Learnings restored`);\n }\n if (inventory.customizeDir) {\n summaryLines.push(`${chalk.green(\"✓\")} Customizations preserved`);\n }\n if (inventory.envMcp) {\n summaryLines.push(`${chalk.green(\"✓\")} .env.mcp preserved`);\n }\n\n printBox(\"Reinit complete\", summaryLines, \"success\");\n } catch (err) {\n s3.fail(step(3, 3, \"Reinit failed\"));\n if (err instanceof HatchError && err.exitCode === 0) throw err;\n logError(`Reinit failed: ${(err as Error).message}`);\n if (learningsBackup) {\n warn(`Learnings backup preserved at: ${learningsBackup}`);\n warn(` To restore: cp -r \"${learningsBackup}\" .agents/learnings/`);\n }\n throw new HatchError(\"Reinit failed during clean.\", 1, \"CLEAN_ERROR\");\n }\n return;\n }\n }\n\n // User chose not to reinit, --yes was used, or no manifest to reinit from\n if (learningsBackup) {\n await rm(learningsBackup, { recursive: true, force: true });\n }\n\n const summaryLines = [\n `${chalk.red(\"×\")} ${result.removed.length} artifact(s) removed`,\n ];\n if (inventory.envMcp) {\n summaryLines.push(`${chalk.green(\"✓\")} .env.mcp preserved`);\n }\n if (inventory.customizeDir) {\n summaryLines.push(`${chalk.green(\"✓\")} .hatch3r/ customizations preserved`);\n }\n summaryLines.push(\"\");\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(\"hatch3r init\")} when ready to set up again.`);\n\n printBox(\"Clean complete\", summaryLines, \"success\");\n}\n","import { access, cp, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { TOOL_PATH_PREFIXES, collectToolFiles, cleanEmptyDirs } from \"../archive/index.js\";\nimport { extractCustomContent, hasManagedBlock } from \"../merge/managedBlocks.js\";\nimport { readManifest } from \"../manifest/hatchJson.js\";\nimport { AGENTS_DIR, ARCHIVE_DIR, CUSTOMIZE_DIR, TOOLS, WORKTREE_INCLUDE_FILE, type HatchManifest, type Tool } from \"../types.js\";\nimport { detectWorkspaceContext } from \"../workspace/detect.js\";\n\nexport interface CleanInventory {\n adapterFiles: string[];\n canonicalDir: boolean;\n archiveDir: boolean;\n customizeDir: boolean;\n worktreeInclude: boolean;\n envMcp: boolean;\n agentsMdHasUserContent: boolean;\n learnings: string[];\n isWorkspaceRoot: boolean;\n isWorkspaceMember: boolean;\n workspaceRootPath: string | null;\n manifest: HatchManifest | null;\n}\n\nexport interface CleanResult {\n removed: string[];\n kept: string[];\n errors: string[];\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function dirEntries(path: string): Promise<string[]> {\n try {\n return await readdir(path);\n } catch {\n return [];\n }\n}\n\nexport async function inventoryArtifacts(rootDir: string): Promise<CleanInventory> {\n const manifest = await readManifest(rootDir);\n\n // Collect adapter files from both manifest tracking and prefix scanning\n const adapterFileSet = new Set<string>();\n\n // Source 1: manifest.managedFiles (authoritative when available)\n if (manifest) {\n for (const f of manifest.managedFiles) {\n adapterFileSet.add(f);\n }\n }\n\n // Source 2: prefix scanning for all known tools (catches orphaned files)\n const toolsToScan: Tool[] = manifest ? manifest.tools : [...TOOLS];\n for (const tool of toolsToScan) {\n const files = await collectToolFiles(rootDir, tool);\n for (const f of files) {\n adapterFileSet.add(f);\n }\n }\n\n // toolsToScan already covers all TOOLS when manifest is absent (line above),\n // so no additional scanning needed.\n\n // Filter to only files that actually exist, excluding AGENTS.md\n // (AGENTS.md is in amp's TOOL_PATH_PREFIXES but needs special managed-block handling)\n const adapterFiles: string[] = [];\n for (const f of adapterFileSet) {\n if (f === \"AGENTS.md\") continue;\n if (await fileExists(join(rootDir, f))) {\n adapterFiles.push(f);\n }\n }\n\n // Check root AGENTS.md for user content\n let agentsMdHasUserContent = false;\n const agentsMdPath = join(rootDir, \"AGENTS.md\");\n if (await fileExists(agentsMdPath)) {\n try {\n const content = await readFile(agentsMdPath, \"utf-8\");\n if (hasManagedBlock(content)) {\n const userContent = extractCustomContent(content).trim();\n agentsMdHasUserContent = userContent.length > 0;\n }\n } catch {\n // Can't read, treat as no user content\n }\n }\n\n // Check learnings\n const learningsDir = join(rootDir, AGENTS_DIR, \"learnings\");\n const learnings = await dirEntries(learningsDir);\n\n // Check workspace context\n const wsContext = await detectWorkspaceContext(rootDir);\n\n return {\n adapterFiles,\n canonicalDir: await fileExists(join(rootDir, AGENTS_DIR)),\n archiveDir: await fileExists(join(rootDir, ARCHIVE_DIR)),\n customizeDir: await fileExists(join(rootDir, CUSTOMIZE_DIR)),\n worktreeInclude: await fileExists(join(rootDir, WORKTREE_INCLUDE_FILE)),\n envMcp: await fileExists(join(rootDir, \".env.mcp\")),\n agentsMdHasUserContent,\n learnings,\n isWorkspaceRoot: wsContext.type === \"workspace-root\",\n isWorkspaceMember: wsContext.type === \"workspace-member\",\n workspaceRootPath: wsContext.type === \"workspace-member\" ? wsContext.rootPath ?? null : null,\n manifest,\n };\n}\n\nexport async function executeClean(\n rootDir: string,\n inventory: CleanInventory,\n dryRun: boolean,\n): Promise<CleanResult> {\n const removed: string[] = [];\n const kept: string[] = [];\n const errors: string[] = [];\n\n if (dryRun) {\n // Just report what would happen\n for (const f of inventory.adapterFiles) {\n removed.push(f);\n }\n if (inventory.canonicalDir) removed.push(`${AGENTS_DIR}/`);\n if (inventory.worktreeInclude) removed.push(WORKTREE_INCLUDE_FILE);\n if (inventory.archiveDir) removed.push(`${ARCHIVE_DIR}/`);\n if (inventory.envMcp) kept.push(\".env.mcp (contains secrets)\");\n if (inventory.customizeDir) kept.push(`${CUSTOMIZE_DIR}/ (customizations)`);\n return { removed, kept, errors };\n }\n\n // 1. Remove adapter output files\n for (const f of inventory.adapterFiles) {\n const absPath = join(rootDir, f);\n try {\n await rm(absPath, { force: true });\n removed.push(f);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n errors.push(`${f}: ${(err as Error).message}`);\n }\n }\n }\n\n // Clean empty directories left by adapter file removal\n await cleanEmptyDirs(rootDir, inventory.adapterFiles);\n\n // 2. Handle root AGENTS.md\n const agentsMdPath = join(rootDir, \"AGENTS.md\");\n if (await fileExists(agentsMdPath)) {\n try {\n const content = await readFile(agentsMdPath, \"utf-8\");\n if (hasManagedBlock(content)) {\n const userContent = extractCustomContent(content).trim();\n if (userContent.length > 0) {\n await writeFile(agentsMdPath, userContent + \"\\n\");\n kept.push(\"AGENTS.md (user content preserved, managed block stripped)\");\n } else {\n await rm(agentsMdPath, { force: true });\n removed.push(\"AGENTS.md\");\n }\n } else {\n // No managed block — leave it alone, it's entirely user content\n kept.push(\"AGENTS.md (no managed block, left untouched)\");\n }\n } catch (err) {\n errors.push(`AGENTS.md: ${(err as Error).message}`);\n }\n }\n\n // 3. Remove .agents/ directory\n if (inventory.canonicalDir) {\n try {\n await rm(join(rootDir, AGENTS_DIR), { recursive: true, force: true });\n removed.push(`${AGENTS_DIR}/`);\n } catch (err) {\n errors.push(`${AGENTS_DIR}/: ${(err as Error).message}`);\n }\n }\n\n // 4. Remove .worktreeinclude\n if (inventory.worktreeInclude) {\n try {\n await rm(join(rootDir, WORKTREE_INCLUDE_FILE), { force: true });\n removed.push(WORKTREE_INCLUDE_FILE);\n } catch (err) {\n errors.push(`${WORKTREE_INCLUDE_FILE}: ${(err as Error).message}`);\n }\n }\n\n // 5. Remove .hatch3r-archive/\n if (inventory.archiveDir) {\n try {\n await rm(join(rootDir, ARCHIVE_DIR), { recursive: true, force: true });\n removed.push(`${ARCHIVE_DIR}/`);\n } catch (err) {\n errors.push(`${ARCHIVE_DIR}/: ${(err as Error).message}`);\n }\n }\n\n // 6. .hatch3r/ customizations — always preserved\n if (inventory.customizeDir) {\n kept.push(`${CUSTOMIZE_DIR}/ (customizations preserved)`);\n }\n\n // 7. .env.mcp — always preserved\n if (inventory.envMcp) {\n kept.push(\".env.mcp (contains secrets — remove manually if needed)\");\n }\n\n return { removed, kept, errors };\n}\n\nexport async function backupLearnings(rootDir: string): Promise<string | null> {\n const learningsDir = join(rootDir, AGENTS_DIR, \"learnings\");\n const entries = await dirEntries(learningsDir);\n if (entries.length === 0) return null;\n\n const backupDir = join(tmpdir(), `hatch3r-learnings-${Date.now()}`);\n await mkdir(backupDir, { recursive: true });\n await cp(learningsDir, backupDir, { recursive: true });\n return backupDir;\n}\n\nexport async function restoreLearnings(rootDir: string, backupPath: string): Promise<void> {\n const learningsDir = join(rootDir, AGENTS_DIR, \"learnings\");\n await mkdir(learningsDir, { recursive: true });\n await cp(backupPath, learningsDir, { recursive: true });\n await rm(backupPath, { recursive: true, force: true });\n}\n","import { readdir, stat, access } from \"node:fs/promises\";\nimport { join, dirname, relative } from \"node:path\";\nimport { AGENTS_DIR } from \"../types.js\";\nimport { WORKSPACE_MANIFEST_FILE } from \"./types.js\";\n\n/**\n * A git repository discovered during workspace scanning.\n *\n * Returned by `detectSubRepos()` when scanning a directory for\n * potential workspace members.\n */\nexport interface DetectedRepo {\n /** Relative path from workspace root (same as directory name for top-level repos). */\n path: string;\n /** Directory name (default display name). */\n name: string;\n /** Whether this repo already has a `.agents/hatch.json` setup. */\n hasHatch3r: boolean;\n}\n\n/**\n * Scan immediate subdirectories of rootDir for git repositories.\n * Returns directories that contain a .git folder or file (worktree).\n */\nexport async function detectSubRepos(rootDir: string): Promise<DetectedRepo[]> {\n const repos: DetectedRepo[] = [];\n\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(rootDir, { withFileTypes: true });\n } catch {\n return repos;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip hidden directories and node_modules\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\n const subDir = join(rootDir, entry.name);\n const gitPath = join(subDir, \".git\");\n\n let isGitRepo = false;\n try {\n const gitStat = await stat(gitPath);\n // .git can be a directory (normal repo) or file (worktree)\n isGitRepo = gitStat.isDirectory() || gitStat.isFile();\n } catch {\n // Not a git repo\n }\n\n if (!isGitRepo) continue;\n\n let hasHatch3r = false;\n try {\n await access(join(subDir, AGENTS_DIR, \"hatch.json\"));\n hasHatch3r = true;\n } catch {\n // No existing hatch3r setup\n }\n\n repos.push({\n path: entry.name,\n name: entry.name,\n hasHatch3r,\n });\n }\n\n return repos.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Classification of a directory's relationship to a workspace.\n *\n * - `workspace-root`: directory contains `.agents/workspace.json`\n * - `workspace-member`: directory is inside a workspace root (up to 3 levels up)\n * - `standalone`: no workspace relationship detected\n */\nexport interface WorkspaceContext {\n /** How this directory relates to a workspace. */\n type: \"workspace-root\" | \"workspace-member\" | \"standalone\";\n /** Absolute path to the workspace root (if applicable). */\n workspaceRoot?: string;\n /** Relative path from the member directory to the workspace root (if applicable). */\n rootPath?: string;\n}\n\n/**\n * Check if the given directory has a .git directory.\n */\nasync function hasGitDir(dir: string): Promise<boolean> {\n try {\n const gitStat = await stat(join(dir, \".git\"));\n return gitStat.isDirectory() || gitStat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the workspace context for a given directory.\n *\n * Returns:\n * - \"workspace-root\" if the dir has .agents/workspace.json\n * - \"workspace-member\" if the dir's hatch.json has a workspace.rootPath\n * pointing to a valid workspace root\n * - \"standalone\" otherwise\n */\nexport async function detectWorkspaceContext(dir: string): Promise<WorkspaceContext> {\n // Check 1: Is this directory a workspace root?\n try {\n await access(join(dir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return { type: \"workspace-root\", workspaceRoot: dir };\n } catch {\n // Not a workspace root\n }\n\n // Check 2: Walk up to 3 levels looking for workspace.json\n let current = dirname(dir);\n for (let i = 0; i < 3; i++) {\n try {\n await access(join(current, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return {\n type: \"workspace-member\",\n workspaceRoot: current,\n rootPath: relative(dir, current),\n };\n } catch {\n // Continue\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return { type: \"standalone\" };\n}\n\n/**\n * Determine if CWD looks like it should be a workspace root:\n * - No .git directory\n * - Has subdirectories with .git\n */\nexport async function shouldSuggestWorkspace(dir: string): Promise<boolean> {\n if (await hasGitDir(dir)) return false;\n\n const repos = await detectSubRepos(dir);\n return repos.length > 0;\n}\n\n/**\n * Check if a directory is a workspace root (has workspace.json).\n */\nexport async function isWorkspaceRoot(dir: string): Promise<boolean> {\n try {\n await access(join(dir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return true;\n } catch {\n return false;\n }\n}\n","import type { ContentSelection, Features, McpConfig, ModelConfig, Platform, Tool } from \"../types.js\";\n\n// ── Workspace Manifest ──────────────────────────────────────────\n\nexport interface WorkspaceManifest {\n /** Workspace manifest schema version. */\n version: string;\n /** hatch3r version that created/last updated this workspace. */\n hatch3rVersion: string;\n /** Workspace display name. */\n name: string;\n /** Registered sub-repos. */\n repos: WorkspaceRepoEntry[];\n /** Default settings inherited by all sub-repos. */\n defaults: WorkspaceDefaults;\n /** When sub-repos are synced: \"manual\" or \"on-sync\" (cascade from hatch3r sync). */\n syncStrategy: \"manual\" | \"on-sync\";\n}\n\nexport interface WorkspaceDefaults {\n platform?: Platform;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n content: ContentSelection;\n models?: ModelConfig;\n}\n\n// ── Repo Entries ────────────────────────────────────────────────\n\nexport interface WorkspaceRepoEntry {\n /** Relative path from workspace root (e.g. \"api-service\"). */\n path: string;\n /** Display name (defaults to directory name). */\n name?: string;\n /** Whether workspace sync propagates content to this repo. */\n sync: boolean;\n /** Per-repo overrides merged on top of workspace defaults. */\n overrides?: WorkspaceRepoOverrides;\n /** ISO timestamp of last successful sync. */\n lastSync?: string;\n /** Git remote owner (org/user). Auto-detected from sub-repo remote. */\n owner?: string;\n /** Git remote repository name. Auto-detected from sub-repo remote. */\n repo?: string;\n /** Default branch for this repo. Auto-detected from sub-repo. */\n defaultBranch?: string;\n /** Platform for this repo. Auto-detected from remote URL. */\n platform?: Platform;\n}\n\nexport interface WorkspaceRepoOverrides {\n /** Replaces workspace tools entirely. */\n tools?: Tool[];\n /** Partial merge on top of workspace features. */\n features?: Partial<Features>;\n /** Replaces workspace MCP config entirely. */\n mcp?: McpConfig;\n /** Add or remove content IDs relative to workspace selection. */\n contentOverrides?: {\n /** Content IDs to add beyond workspace selection. */\n include?: string[];\n /** Content IDs to remove from workspace selection. */\n exclude?: string[];\n };\n models?: ModelConfig;\n platform?: Platform;\n}\n\n// ── Sync Results ────────────────────────────────────────────────\n\nexport interface WorkspaceSyncResult {\n repos: WorkspaceRepoSyncResult[];\n}\n\nexport interface WorkspaceRepoSyncResult {\n path: string;\n added: string[];\n removed: string[];\n toolsSynced: string[];\n action: \"synced\" | \"dry-run\" | \"skipped\" | \"error\";\n error?: string;\n /** Estimated token count for content being synced (populated in dry-run mode). */\n estimatedTokens?: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────\n\nexport const WORKSPACE_MANIFEST_FILE = \"workspace.json\";\nexport const WORKSPACE_MANIFEST_VERSION = \"1.0.0\";\n","import { access, mkdir, readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { basename, dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport {\n createManifest,\n readManifest,\n writeManifest,\n addManagedFile,\n} from \"../../manifest/hatchJson.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport {\n AGENTS_DIR,\n DEFAULT_FEATURES,\n HatchError,\n VALID_TOOLS,\n WORKTREE_CAPABLE_TOOLS,\n WORKTREE_INCLUDE_FILE,\n type ContentSelection,\n type Features,\n type Platform,\n type RepoInfo,\n type Tool,\n} from \"../../types.js\";\nimport { analyzeRepo } from \"../../detect/repoAnalyzer.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { generateCanonicalAgentsMd, generateRootAgentsMd } from \"../shared/agentsContent.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n error as logError,\n step,\n label,\n warn,\n} from \"../shared/ui.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { TOOL_DISPLAY_NAMES, TOOL_PROMPT_CHOICES, FEATURE_CHOICES, MCP_CHOICES, PLATFORM_DISPLAY_NAMES, PLATFORM_MCP_SERVER, sanitizeInput, isWSL, formatCommandHint, TOOL_SECRET_NOTES } from \"../shared/constants.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest } from \"../../integrity/index.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport { buildContentIndex, resolveSelection, copySelectedContent, countSelectionItems, selectionSummary, getAllContentIds, removeContentItem, validateOrchestrationDependencies, countPresetExclusions, countProjectTypeExclusions, countTeamSizeExclusions, estimatePresetItemCount } from \"../../content/index.js\";\nimport { PRESETS, getPreset, type PresetId } from \"../../content/presets.js\";\nimport { detectSubRepos, shouldSuggestWorkspace } from \"../../workspace/detect.js\";\nimport { createWorkspaceManifest, writeWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport type { WorkspaceRepoEntry } from \"../../workspace/types.js\";\nimport { parseGitRemote, parseGitDefaultBranch, getGitRemoteUrl, detectPlatformFromRemote, detectRepoGitIdentity } from \"../../workspace/git.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_ROOT = findPackageRoot(__dirname);\n\nconst DEFAULT_TOOLS: Tool[] = [\"cursor\"];\nconst DEFAULT_FEATURE_KEYS = Object.keys(DEFAULT_FEATURES) as (keyof Features)[];\nconst DEFAULT_MCP: string[] = [\"playwright\", \"github\", \"context7\"];\n\n/**\n * Check if a content selection includes any board-related content.\n * Board content IDs follow the pattern \"cmd-hatch3r-board-*\" (prefixed during indexing).\n */\nfunction selectionHasBoardContent(selection: ContentSelection): boolean {\n return selection.items.commands.some((id) => id.startsWith(\"cmd-hatch3r-board\"));\n}\n\n/**\n * Surface board command prerequisites when board content is included in the selection.\n * Board commands require GitHub Projects V2 and a PAT with the `project` scope.\n */\nfunction warnBoardPrerequisites(selection: ContentSelection): void {\n if (!selectionHasBoardContent(selection)) return;\n info(\n `Board commands selected. Prerequisites: ${chalk.bold(\"GitHub Projects V2\")} must be enabled ` +\n `and your PAT needs the ${chalk.bold(\"project\")} scope. ` +\n `See ${chalk.dim(\"https://docs.github.com/en/issues/planning-and-tracking-with-projects\")}`,\n );\n}\n\n// Git detection functions imported from ../../workspace/git.js\n\nfunction deriveWorkspacePlatform(identities: Array<{ platform: Platform }>): Platform {\n const counts = new Map<Platform, number>();\n for (const id of identities) {\n counts.set(id.platform, (counts.get(id.platform) ?? 0) + 1);\n }\n let best: Platform = \"github\";\n let max = 0;\n for (const [p, c] of counts) { if (c > max) { best = p; max = c; } }\n return best;\n}\n\nexport interface RunInitOptions {\n rootDir: string;\n platform: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n defaultBranch: string;\n tools: Tool[];\n features: Features;\n mcpServers: string[];\n repoInfo: RepoInfo;\n contentSelection: ContentSelection;\n}\n\nexport async function runInit(options: RunInitOptions): Promise<void> {\n const { rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection } = options;\n const agentsDir = join(rootDir, AGENTS_DIR);\n const totalSteps = 4;\n\n const s1 = createSpinner(step(1, totalSteps, \"Creating canonical files...\"));\n s1.start();\n await mkdir(agentsDir, { recursive: true });\n\n // Detect re-init: check if manifest exists and compute content delta\n const existingManifest = await readManifest(rootDir);\n\n // Build content index from package and copy only selected items\n const index = await buildContentIndex(CONTENT_ROOT);\n await copySelectedContent(CONTENT_ROOT, agentsDir, contentSelection, index);\n\n // Clean up stale content from previous init\n if (existingManifest?.content) {\n const oldIds = getAllContentIds(existingManifest.content);\n const newIds = getAllContentIds(contentSelection);\n for (const id of oldIds) {\n if (!newIds.has(id)) {\n const item = index.byId.get(id);\n if (item) await removeContentItem(agentsDir, item, { rootDir });\n }\n }\n }\n\n await mkdir(join(agentsDir, \"learnings\"), { recursive: true });\n\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n try {\n const mcpRaw = await readFile(mcpPath, \"utf-8\");\n const mcpParsed = JSON.parse(mcpRaw) as { mcpServers?: Record<string, Record<string, unknown>> };\n if (mcpParsed.mcpServers) {\n const selected = new Set(mcpServers);\n const filtered: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcpParsed.mcpServers)) {\n if (!selected.has(name)) continue;\n const entry = { ...server };\n delete entry._disabled;\n filtered[name] = entry;\n }\n await safeWriteFile(\n mcpPath,\n JSON.stringify({ mcpServers: filtered }, null, 2) + \"\\n\",\n { force: true },\n );\n }\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === 'ENOENT' || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n // Generate dynamic AGENTS.md based on what's actually installed\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd, { force: true });\n\n s1.succeed(step(1, totalSteps, `Canonical files created (${countSelectionItems(contentSelection)} items)`));\n\n const s2 = createSpinner(step(2, totalSteps, \"Writing manifest...\"));\n s2.start();\n const manifest = createManifest({ platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, content: contentSelection, languages: repoInfo.languages });\n await writeManifest(rootDir, manifest);\n s2.succeed(step(2, totalSteps, \"Manifest written\"));\n\n const s3 = createSpinner(\n step(3, totalSteps, `Generating ${tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")} output...`),\n );\n s3.start();\n // On init, preserve existing user content: prepend managed block if file has no markers.\n // Generate rich root AGENTS.md with agent/skill/command rosters for platform discovery.\n const rootAgentsMd = await generateRootAgentsMd(agentsDir);\n await safeWriteFile(join(rootDir, \"AGENTS.md\"), rootAgentsMd.full, {\n managedContent: rootAgentsMd.inner,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, \"AGENTS.md\");\n\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of tools) {\n const adapter = getAdapter(tool);\n try {\n const outputs = await adapter.generate(agentsDir, manifest);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n await safeWriteFile(join(rootDir, out.path), out.content, {\n managedContent: out.managedContent,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, out.path);\n }\n } catch (err) {\n adapterFailures.push({\n tool: TOOL_DISPLAY_NAMES[tool] ?? tool,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === tools.length) {\n s3.fail(step(3, totalSteps, \"All adapters failed\"));\n throw new HatchError(\"All adapters failed\", 1, \"ADAPTER_ERROR\");\n }\n }\n s3.succeed(step(3, totalSteps, adapterFailures.length > 0\n ? `Adapter output generated (${adapterFailures.length} failed)`\n : \"Adapter output generated\"));\n\n for (const tool of tools) {\n const warnings = getUnsupportedFeatureWarnings(tool, manifest);\n for (const w of warnings) {\n warn(w);\n }\n }\n\n // Generate .worktreeinclude for worktree-capable tools\n const hasWorktreeTool = tools.some(t => WORKTREE_CAPABLE_TOOLS.has(t));\n if (hasWorktreeTool) {\n manifest.worktree = manifest.worktree ?? { enabled: true };\n }\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n managedContent: wtManaged,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, WORKTREE_INCLUDE_FILE);\n }\n\n const s4 = createSpinner(step(4, totalSteps, \"Finalizing...\"));\n s4.start();\n await writeManifest(rootDir, manifest);\n\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n\n let envResult: { action: string; path: string; newVars: string[] } | undefined;\n if (features.mcp && mcpServers.length > 0) {\n envResult = await ensureEnvMcp(rootDir, mcpServers);\n await ensureGitignoreEntry(rootDir);\n }\n\n s4.succeed(step(4, totalSteps, \"Done\"));\n\n console.log();\n const enabledFeatures = Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n const presetLabel = contentSelection.preset.charAt(0).toUpperCase() + contentSelection.preset.slice(1);\n const summaryLines = [\n label(\"Profile\", `${presetLabel} (${contentSelection.projectType}, ${contentSelection.teamSize})`),\n label(\"Content\", `${countSelectionItems(contentSelection)} items (${selectionSummary(contentSelection)})`),\n label(\"Tools\", tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")),\n label(\"Features\", enabledFeatures.join(\", \")),\n ];\n if (owner || repo) {\n const platformLabel = PLATFORM_DISPLAY_NAMES[platform];\n summaryLines.push(label(platformLabel, `${namespace || owner}/${project || repo}`));\n }\n if (defaultBranch) {\n summaryLines.push(label(\"Default branch\", defaultBranch));\n }\n if (mcpServers.length > 0) {\n summaryLines.push(label(\"MCP\", mcpServers.join(\", \")));\n }\n if (manifest.worktree?.enabled) {\n summaryLines.push(label(\"Worktree\", \"isolation enabled\"));\n }\n if (envResult && envResult.action !== \"skipped\") {\n summaryLines.push(label(\"Secrets\", `.env.mcp (fill in your API keys)`));\n }\n summaryLines.push(\"\");\n summaryLines.push(label(\"Canonical\", `${AGENTS_DIR}/`));\n summaryLines.push(label(\"Manifest\", `${AGENTS_DIR}/hatch.json`));\n\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n summaryLines.push(\"\");\n if (isGreenfield) {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(formatCommandHint(tools, \"project-spec\"))} to define your new project`);\n } else {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(formatCommandHint(tools, \"codebase-map\"))} to map your existing codebase`);\n }\n\n if (envResult && envResult.newVars.length > 0) {\n summaryLines.push(\"\");\n summaryLines.push(`${chalk.yellow(\"!\")} Add your secrets to ${chalk.bold(\".env.mcp\")}: ${envResult.newVars.join(\", \")}`);\n summaryLines.push(` Then run: ${chalk.dim(getSourceEnvMcpCommand())}`);\n }\n\n printBox(\"Hatch complete\", summaryLines, \"success\");\n}\n\nasync function checkExisting(rootDir: string, skipPrompt: boolean, newSelection?: ContentSelection): Promise<void> {\n const hatchJsonPath = join(rootDir, AGENTS_DIR, \"hatch.json\");\n try {\n await access(hatchJsonPath);\n if (!skipPrompt) {\n let message = \"Existing .agents/ found. This will overwrite managed files. Continue?\";\n\n // Compute removal count if we have both old and new selections\n if (newSelection) {\n const existingManifest = await readManifest(rootDir);\n if (existingManifest?.content) {\n const oldIds = getAllContentIds(existingManifest.content);\n const newIds = getAllContentIds(newSelection);\n let removeCount = 0;\n for (const id of oldIds) {\n if (!newIds.has(id)) removeCount++;\n }\n if (removeCount > 0) {\n const oldPreset = existingManifest.content.preset.charAt(0).toUpperCase() + existingManifest.content.preset.slice(1);\n const newPreset = newSelection.preset.charAt(0).toUpperCase() + newSelection.preset.slice(1);\n message = `Existing .agents/ found. ${removeCount} content item(s) will be removed (switching from ${oldPreset} to ${newPreset}). Continue?`;\n }\n }\n }\n\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message,\n default: false,\n },\n ]);\n if (!proceed) {\n console.log(chalk.dim(\"\\n Init cancelled.\\n\"));\n throw new HatchError(\"Init cancelled.\", 0);\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nfunction validateFlag<T extends string>(value: string | undefined, valid: T[], fallback: T, name: string): T {\n if (!value) return fallback;\n if (!(valid as string[]).includes(value)) {\n logError(`Invalid --${name}: \"${value}\". Valid: ${valid.join(\", \")}`);\n throw new HatchError(`Invalid --${name}: \"${value}\"`, 1, \"VALIDATION_ERROR\");\n }\n return value as T;\n}\n\nexport async function initCommand(\n opts: {\n tools?: string;\n yes?: boolean;\n preset?: string;\n projectType?: string;\n teamSize?: string;\n workspace?: boolean;\n } = {},\n): Promise<void> {\n printBanner();\n\n const rootDir = process.cwd();\n\n // Workspace auto-detection: if no .git but has git subdirectories, suggest workspace mode\n if (!opts.workspace) {\n const suggestWs = await shouldSuggestWorkspace(rootDir);\n if (suggestWs) {\n const detectedRepos = await detectSubRepos(rootDir);\n if (opts.yes) {\n opts.workspace = true;\n info(chalk.dim(`No git repo found. ${detectedRepos.length} git repo(s) detected in subdirectories — initializing as workspace.`));\n } else {\n info(`No git repo found, but ${detectedRepos.length} git repo(s) detected in subdirectories.`);\n const { useWorkspace } = await inquirer.prompt<{ useWorkspace: boolean }>([\n {\n type: \"confirm\",\n name: \"useWorkspace\",\n message: \"Initialize as a multi-repo workspace?\",\n default: true,\n },\n ]);\n opts.workspace = useWorkspace;\n }\n }\n }\n\n // Workspace: branch into dedicated flow that skips single-repo identity prompts\n if (opts.workspace) {\n const detectedRepos = await detectSubRepos(rootDir);\n const repoInfo = await analyzeRepo(rootDir);\n await runWorkspaceInit(rootDir, detectedRepos, repoInfo, opts);\n return;\n }\n\n const detectSpinner = createSpinner(\"Detecting repository...\");\n detectSpinner.start();\n const repoInfo = await analyzeRepo(rootDir);\n const remote = parseGitRemote();\n detectSpinner.succeed(\"Repository detected\");\n\n const detected: string[] = [];\n if (repoInfo.languages.length > 0 && repoInfo.languages[0] !== \"unknown\") {\n detected.push(...repoInfo.languages);\n }\n if (repoInfo.packageManager !== \"unknown\") {\n detected.push(repoInfo.packageManager);\n }\n if (repoInfo.isMonorepo) detected.push(\"monorepo\");\n if (detected.length > 0) {\n info(chalk.dim(`Detected: ${detected.join(\", \")}`));\n }\n\n if (opts.yes) {\n const remoteUrl = getGitRemoteUrl();\n const platform = detectPlatformFromRemote(remoteUrl);\n const owner = sanitizeInput(remote.owner);\n const repo = sanitizeInput(remote.repo);\n const namespace = owner;\n const project = repo;\n\n let tools: Tool[];\n if (opts.tools) {\n const rawTools = opts.tools.split(\",\").map((t) => t.trim());\n const invalid = rawTools.filter((t) => !VALID_TOOLS.has(t));\n if (invalid.length > 0) {\n logError(`Invalid tool(s): ${invalid.join(\", \")}`);\n console.log(chalk.dim(` Valid tools: ${[...VALID_TOOLS].join(\", \")}`));\n throw new HatchError(`Invalid tool(s): ${invalid.join(\", \")}`, 1, \"VALIDATION_ERROR\");\n }\n tools = rawTools as Tool[];\n } else if (repoInfo.existingTools.length > 0) {\n tools = repoInfo.existingTools;\n } else {\n tools = DEFAULT_TOOLS;\n }\n\n const features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const defaultBranch = parseGitDefaultBranch();\n\n // Use CLI flags with validation, falling back to auto-detect / defaults\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const presetId = validateFlag(opts.preset, [\"minimal\", \"standard\", \"full\"], \"standard\", \"preset\");\n const projectType = validateFlag(opts.projectType, [\"greenfield\", \"brownfield\"], isGreenfield ? \"greenfield\" : \"brownfield\", \"project-type\");\n const teamSize = validateFlag(opts.teamSize, [\"solo\", \"team\"], \"solo\", \"team-size\");\n const preset = getPreset(presetId);\n const index = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(preset, projectType, teamSize, index);\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n await checkExisting(rootDir, true, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\n return;\n }\n\n console.log();\n\n const remoteUrl = getGitRemoteUrl();\n const detectedPlatform = detectPlatformFromRemote(remoteUrl);\n\n const platformAnswer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"select\",\n name: \"platform\",\n message: \"Select your platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: detectedPlatform,\n },\n ]);\n const platform = platformAnswer.platform;\n\n let owner: string;\n let repo: string;\n let namespace: string;\n let project: string;\n\n if (platform === \"azure-devops\") {\n const adoAnswers = await inquirer.prompt<{ org: string; project: string; repo: string }>([\n { type: \"input\", name: \"org\", message: \"Azure DevOps organization:\", default: remote.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Azure DevOps project:\" },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(adoAnswers.org);\n repo = sanitizeInput(adoAnswers.repo);\n namespace = owner;\n project = sanitizeInput(adoAnswers.project);\n } else if (platform === \"gitlab\") {\n const glAnswers = await inquirer.prompt<{ namespace: string; project: string }>([\n { type: \"input\", name: \"namespace\", message: \"GitLab namespace (group or username):\", default: remote.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Project name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(glAnswers.namespace);\n repo = sanitizeInput(glAnswers.project);\n namespace = owner;\n project = repo;\n } else {\n const repoAnswers = await inquirer.prompt<{ owner: string; repo: string }>([\n { type: \"input\", name: \"owner\", message: \"GitHub owner (org or username):\", default: remote.owner || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(repoAnswers.owner);\n repo = sanitizeInput(repoAnswers.repo);\n namespace = owner;\n project = repo;\n }\n\n const defaultBranchDefault = parseGitDefaultBranch();\n const defaultBranchAnswers = await inquirer.prompt<{ defaultBranch: string }>([\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch (for checkout, PR base, release):\",\n default: defaultBranchDefault,\n },\n ]);\n const defaultBranch = defaultBranchAnswers.defaultBranch.trim() || defaultBranchDefault;\n\n // --- Project type (with filter exclusion counts) ---\n const filterIndex = await buildContentIndex(CONTENT_ROOT);\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const greenfieldExcl = countProjectTypeExclusions(\"greenfield\", filterIndex.items);\n const brownfieldExcl = countProjectTypeExclusions(\"brownfield\", filterIndex.items);\n const projectTypeAnswer = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"select\",\n name: \"projectType\",\n message: \"Is this a new (greenfield) or existing (brownfield) project?\",\n choices: [\n { name: `Greenfield — new project from scratch${greenfieldExcl > 0 ? ` (filters out ${greenfieldExcl} brownfield-only item${greenfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"greenfield\" as const },\n { name: `Brownfield — existing codebase${brownfieldExcl > 0 ? ` (filters out ${brownfieldExcl} greenfield-only item${brownfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n // --- Team size (with filter exclusion counts) ---\n const soloExcl = countTeamSizeExclusions(\"solo\", filterIndex.items);\n const teamSizeAnswer = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"select\",\n name: \"teamSize\",\n message: \"Solo developer or team collaboration?\",\n choices: [\n { name: `Solo — just me${soloExcl > 0 ? ` (filters out ${soloExcl} team-only item${soloExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"solo\" as const },\n { name: \"Team — multiple contributors\", value: \"team\" as const },\n ],\n default: \"solo\",\n },\n ]);\n const teamSize = teamSizeAnswer.teamSize;\n\n // --- Content preset (with exclusion counts) ---\n const totalItems = filterIndex.items.length;\n const presetAnswer = await inquirer.prompt<{ preset: PresetId }>([\n {\n type: \"select\",\n name: \"preset\",\n message: \"Select content profile:\",\n choices: PRESETS.map((p) => {\n const excluded = countPresetExclusions(p, filterIndex);\n const estimated = p.id !== \"custom\" ? estimatePresetItemCount(p, projectType, teamSize, filterIndex) : 0;\n const countHint = estimated > 0 ? ` (~${estimated} items)` : \"\";\n const suffix = excluded > 0 ? ` (excludes ${excluded} of ${totalItems})` : \"\";\n return {\n name: `${p.name} — ${p.description}${countHint}${suffix}`,\n value: p.id,\n };\n }),\n default: \"standard\" as PresetId,\n },\n ]);\n const selectedPreset = getPreset(presetAnswer.preset);\n\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n // --- Custom content selection ---\n // #148 (D19-19): Group content by tags in custom profile display\n let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = filterIndex;\n const tagGroups = new Map<string, typeof contentIndex.items>();\n for (const item of contentIndex.items) {\n const primaryTag = item.tags[0] ?? \"other\";\n if (!tagGroups.has(primaryTag)) tagGroups.set(primaryTag, []);\n tagGroups.get(primaryTag)!.push(item);\n }\n\n // Build grouped choices with separators\n const TAG_LABELS: Record<string, string> = {\n core: \"Core\", planning: \"Planning\", implementation: \"Implementation\",\n review: \"Review\", devops: \"DevOps\", maintenance: \"Maintenance\",\n greenfield: \"Greenfield\", brownfield: \"Brownfield\", board: \"Board\",\n security: \"Security\", a11y: \"Accessibility\", performance: \"Performance\",\n customize: \"Customization\", other: \"Other\",\n };\n const groupedChoices: Array<InstanceType<typeof inquirer.Separator> | { name: string; value: string; checked: boolean }> = [];\n for (const [tag, items] of tagGroups) {\n groupedChoices.push(new inquirer.Separator(`── ${TAG_LABELS[tag] ?? tag} (${items.length}) ──`));\n for (const item of items) {\n groupedChoices.push({\n name: `${item.type}: ${item.id.replace(/^(cmd-)?hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: item.protected || item.tags.includes(\"core\"),\n });\n }\n }\n\n const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: groupedChoices,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n customSelections = customAnswer.items;\n }\n\n const toolDefaults = repoInfo.existingTools.length > 0 ? repoInfo.existingTools : DEFAULT_TOOLS;\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: toolDefaults,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const tools = toolAnswers.tools.length > 0 ? toolAnswers.tools : DEFAULT_TOOLS;\n\n // #143 (D19-14): Streamline MCP onboarding — surface secret notes inline\n const secretNotes = tools.map((t) => TOOL_SECRET_NOTES[t]).filter(Boolean);\n if (secretNotes.length > 0) {\n info(chalk.dim(\"MCP secret loading by tool:\"));\n for (const note of secretNotes) {\n info(chalk.dim(` ${note}`));\n }\n }\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features (MCP provides tool-server integration):\",\n choices: FEATURE_CHOICES,\n default: DEFAULT_FEATURE_KEYS,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n const features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n let mcpServers: string[] = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const defaultMcpForPlatform = Array.from(\n new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]),\n );\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: defaultMcpForPlatform,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n // --- Resolve content selection ---\n const contentSelection = resolveSelection(selectedPreset, projectType, teamSize, filterIndex, customSelections);\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n await checkExisting(rootDir, false, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\n}\n\n// ── Workspace initialization ──────────────────────────────────────\n\nasync function runWorkspaceInit(\n rootDir: string,\n detectedRepos: Awaited<ReturnType<typeof detectSubRepos>>,\n repoInfo: RepoInfo,\n opts: { tools?: string; yes?: boolean; preset?: string; projectType?: string; teamSize?: string },\n): Promise<void> {\n const headless = !!opts.yes;\n\n // Step 1: Detect sub-repo git identities\n console.log();\n const wsSpinner = createSpinner(\"Detecting workspace repos...\");\n wsSpinner.start();\n\n if (detectedRepos.length === 0) {\n wsSpinner.succeed(\"Workspace created (no sub-repos found)\");\n // Create empty workspace manifest with defaults\n const platform: Platform = \"github\";\n const tools: Tool[] = resolveToolsFromOpts(opts.tools, repoInfo);\n const features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const index = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(getPreset(\"standard\"), \"brownfield\", \"solo\", index);\n const wsManifest = createWorkspaceManifest(\n basename(rootDir) || \"workspace\",\n { platform, tools, features, mcp: { servers: mcpServers }, content: contentSelection },\n [],\n \"manual\",\n );\n await writeWorkspaceManifest(rootDir, wsManifest);\n return;\n }\n\n const enriched = detectedRepos.map((r) => ({\n ...r,\n ...detectRepoGitIdentity(join(rootDir, r.path)),\n }));\n\n wsSpinner.succeed(`Workspace: ${detectedRepos.length} repo(s) detected`);\n\n // Step 2: Display detected repos with git identity\n console.log();\n console.log(chalk.dim(\" Repo Platform Owner/Repo Branch\"));\n for (const r of enriched) {\n const name = (r.name ?? r.path).padEnd(16);\n if (r.owner && r.repo) {\n const platLabel = PLATFORM_DISPLAY_NAMES[r.platform].padEnd(14);\n const identity = `${r.owner}/${r.repo}`.padEnd(32);\n console.log(` ${name}${chalk.dim(platLabel)}${chalk.dim(identity)}${chalk.dim(r.defaultBranch)}`);\n } else {\n console.log(` ${name}${chalk.dim(\"(no remote detected)\")}`);\n }\n }\n console.log();\n\n // Step 3: Interactive — confirm/edit repo identities\n if (!headless) {\n const { acceptIdentity } = await inquirer.prompt<{ acceptIdentity: boolean }>([\n {\n type: \"confirm\",\n name: \"acceptIdentity\",\n message: \"Accept detected repo identities?\",\n default: true,\n },\n ]);\n\n if (!acceptIdentity) {\n for (const r of enriched) {\n console.log(chalk.bold(`\\n ${r.name ?? r.path}:`));\n const identity = await inquirer.prompt<{ owner: string; repo: string; defaultBranch: string }>([\n { type: \"input\", name: \"owner\", message: \" Owner:\", default: r.owner || undefined },\n { type: \"input\", name: \"repo\", message: \" Repo:\", default: r.repo || undefined },\n { type: \"input\", name: \"defaultBranch\", message: \" Default branch:\", default: r.defaultBranch || \"main\" },\n ]);\n r.owner = sanitizeInput(identity.owner);\n r.repo = sanitizeInput(identity.repo);\n r.defaultBranch = identity.defaultBranch.trim() || \"main\";\n }\n }\n }\n\n // Step 4: Derive workspace-root platform from sub-repos (workspace root has no git remote)\n const platform = deriveWorkspacePlatform(enriched);\n\n // Step 5: Resolve workspace-wide config (tools, features, content, MCP)\n let tools: Tool[];\n let features: Features;\n let mcpServers: string[];\n let contentSelection: ContentSelection;\n\n if (headless) {\n tools = resolveToolsFromOpts(opts.tools, repoInfo);\n features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const presetId = validateFlag(opts.preset, [\"minimal\", \"standard\", \"full\"], \"standard\", \"preset\");\n const projectType = validateFlag(opts.projectType, [\"greenfield\", \"brownfield\"], isGreenfield ? \"greenfield\" : \"brownfield\", \"project-type\");\n const teamSize = validateFlag(opts.teamSize, [\"solo\", \"team\"], \"solo\", \"team-size\");\n const preset = getPreset(presetId);\n const index = await buildContentIndex(CONTENT_ROOT);\n contentSelection = resolveSelection(preset, projectType, teamSize, index);\n } else {\n // Interactive workspace-wide config prompts\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n const wsFilterIndex = await buildContentIndex(CONTENT_ROOT);\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const wsGreenfieldExcl = countProjectTypeExclusions(\"greenfield\", wsFilterIndex.items);\n const wsBrownfieldExcl = countProjectTypeExclusions(\"brownfield\", wsFilterIndex.items);\n const projectTypeAnswer = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"select\",\n name: \"projectType\",\n message: \"Is this a new (greenfield) or existing (brownfield) project?\",\n choices: [\n { name: `Greenfield — new project from scratch${wsGreenfieldExcl > 0 ? ` (filters out ${wsGreenfieldExcl} brownfield-only item${wsGreenfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"greenfield\" as const },\n { name: `Brownfield — existing codebase${wsBrownfieldExcl > 0 ? ` (filters out ${wsBrownfieldExcl} greenfield-only item${wsBrownfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n const wsSoloExcl = countTeamSizeExclusions(\"solo\", wsFilterIndex.items);\n const teamSizeAnswer = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"select\",\n name: \"teamSize\",\n message: \"Solo developer or team collaboration?\",\n choices: [\n { name: `Solo — just me${wsSoloExcl > 0 ? ` (filters out ${wsSoloExcl} team-only item${wsSoloExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"solo\" as const },\n { name: \"Team — multiple contributors\", value: \"team\" as const },\n ],\n default: \"solo\",\n },\n ]);\n const teamSize = teamSizeAnswer.teamSize;\n\n const wsTotalItems = wsFilterIndex.items.length;\n const presetAnswer = await inquirer.prompt<{ preset: PresetId }>([\n {\n type: \"select\",\n name: \"preset\",\n message: \"Select content profile:\",\n choices: PRESETS.map((p) => {\n const excluded = countPresetExclusions(p, wsFilterIndex);\n const wsEstimated = p.id !== \"custom\" ? estimatePresetItemCount(p, projectType, teamSize, wsFilterIndex) : 0;\n const wsCountHint = wsEstimated > 0 ? ` (~${wsEstimated} items)` : \"\";\n const suffix = excluded > 0 ? ` (excludes ${excluded} of ${wsTotalItems})` : \"\";\n return {\n name: `${p.name} — ${p.description}${wsCountHint}${suffix}`,\n value: p.id,\n };\n }),\n default: \"standard\" as PresetId,\n },\n ]);\n const selectedPreset = getPreset(presetAnswer.preset);\n\n // #148 (D19-19): Group content by tags in workspace custom profile display\n let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = wsFilterIndex;\n const wsTagGroups = new Map<string, typeof contentIndex.items>();\n for (const item of contentIndex.items) {\n const primaryTag = item.tags[0] ?? \"other\";\n if (!wsTagGroups.has(primaryTag)) wsTagGroups.set(primaryTag, []);\n wsTagGroups.get(primaryTag)!.push(item);\n }\n\n const WS_TAG_LABELS: Record<string, string> = {\n core: \"Core\", planning: \"Planning\", implementation: \"Implementation\",\n review: \"Review\", devops: \"DevOps\", maintenance: \"Maintenance\",\n greenfield: \"Greenfield\", brownfield: \"Brownfield\", board: \"Board\",\n security: \"Security\", a11y: \"Accessibility\", performance: \"Performance\",\n customize: \"Customization\", other: \"Other\",\n };\n const wsGroupedChoices: Array<InstanceType<typeof inquirer.Separator> | { name: string; value: string; checked: boolean }> = [];\n for (const [tag, items] of wsTagGroups) {\n wsGroupedChoices.push(new inquirer.Separator(`── ${WS_TAG_LABELS[tag] ?? tag} (${items.length}) ──`));\n for (const item of items) {\n wsGroupedChoices.push({\n name: `${item.type}: ${item.id.replace(/^(cmd-)?hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: item.protected || item.tags.includes(\"core\"),\n });\n }\n }\n\n const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: wsGroupedChoices,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n customSelections = customAnswer.items;\n }\n\n const toolDefaults = repoInfo.existingTools.length > 0 ? repoInfo.existingTools : DEFAULT_TOOLS;\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: toolDefaults,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n tools = toolAnswers.tools.length > 0 ? toolAnswers.tools : DEFAULT_TOOLS;\n\n // Surface per-editor secret loading notes\n const wsSecretNotes = tools.map((t) => TOOL_SECRET_NOTES[t]).filter(Boolean);\n if (wsSecretNotes.length > 0) {\n info(chalk.dim(\"MCP secret loading by tool:\"));\n for (const note of wsSecretNotes) {\n info(chalk.dim(` ${note}`));\n }\n }\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features:\",\n choices: FEATURE_CHOICES,\n default: DEFAULT_FEATURE_KEYS,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n mcpServers = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const defaultMcpForPlatform = Array.from(\n new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]),\n );\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: defaultMcpForPlatform,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n contentSelection = resolveSelection(selectedPreset, projectType, teamSize, wsFilterIndex, customSelections);\n }\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n // Step 6: Create canonical .agents/ at workspace root (empty identity — workspace root is not a repo)\n await checkExisting(rootDir, headless, contentSelection);\n await runInit({\n rootDir,\n platform,\n owner: \"\",\n repo: \"\",\n namespace: \"\",\n project: \"\",\n defaultBranch: \"\",\n tools,\n features,\n mcpServers,\n repoInfo,\n contentSelection,\n });\n\n // Step 7: Build repo entries and select which to sync\n let repoEntries: WorkspaceRepoEntry[];\n\n if (headless) {\n repoEntries = enriched.map((r) => ({\n path: r.path,\n name: r.name,\n sync: false,\n owner: r.owner || undefined,\n repo: r.repo || undefined,\n defaultBranch: r.defaultBranch || undefined,\n platform: r.platform || undefined,\n }));\n } else {\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n const { syncRepos } = await inquirer.prompt<{ syncRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"syncRepos\",\n message: \"Select repos to sync workspace content to:\",\n choices: enriched.map((r) => ({\n name: `${r.name}${r.hasHatch3r ? chalk.dim(\" (has existing hatch3r)\") : \"\"}`,\n value: r.path,\n checked: false,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n\n const syncSet = new Set(syncRepos);\n repoEntries = enriched.map((r) => ({\n path: r.path,\n name: r.name,\n sync: syncSet.has(r.path),\n owner: r.owner || undefined,\n repo: r.repo || undefined,\n defaultBranch: r.defaultBranch || undefined,\n platform: r.platform || undefined,\n }));\n }\n\n // Step 8: Create workspace manifest and sync\n const dirName = basename(rootDir) || \"workspace\";\n const wsManifest = createWorkspaceManifest(\n dirName,\n { platform, tools, features, mcp: { servers: mcpServers }, content: contentSelection },\n repoEntries,\n \"manual\",\n );\n await writeWorkspaceManifest(rootDir, wsManifest);\n\n const syncCount = repoEntries.filter((r) => r.sync).length;\n if (syncCount > 0) {\n const syncSpinner = createSpinner(`Syncing ${syncCount} repo(s)...`);\n syncSpinner.start();\n\n const result = await syncWorkspaceRepos(rootDir, {\n onWarn: (msg) => warn(msg),\n });\n\n const succeeded = result.repos.filter((r) => r.action === \"synced\").length;\n const failed = result.repos.filter((r) => r.action === \"error\").length;\n\n if (failed > 0) {\n syncSpinner.warn(`Workspace sync: ${succeeded} synced, ${failed} failed`);\n for (const r of result.repos.filter((r) => r.action === \"error\")) {\n logError(` ${r.path}: ${r.error}`);\n }\n } else {\n syncSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n }\n\n console.log();\n const wsLines = [\n label(\"Mode\", \"workspace\"),\n label(\"Repos\", `${repoEntries.length} registered, ${syncCount} synced`),\n label(\"Strategy\", \"manual (use hatch3r sync --repos to propagate)\"),\n label(\"Manifest\", `${AGENTS_DIR}/workspace.json`),\n ];\n printBox(\"Workspace ready\", wsLines, \"success\");\n}\n\nfunction resolveToolsFromOpts(toolsFlag: string | undefined, repoInfo: RepoInfo): Tool[] {\n if (toolsFlag) {\n const rawTools = toolsFlag.split(\",\").map((t) => t.trim());\n const invalid = rawTools.filter((t) => !VALID_TOOLS.has(t));\n if (invalid.length > 0) {\n logError(`Invalid tool(s): ${invalid.join(\", \")}`);\n console.log(chalk.dim(` Valid tools: ${[...VALID_TOOLS].join(\", \")}`));\n throw new HatchError(`Invalid tool(s): ${invalid.join(\", \")}`, 1);\n }\n return rawTools as Tool[];\n }\n if (repoInfo.existingTools.length > 0) return repoInfo.existingTools;\n return DEFAULT_TOOLS;\n}\n","import { access, readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Framework, RepoInfo, Tool } from \"../types.js\";\nimport { detectPackageManager } from \"./packageManager.js\";\n\n/**\n * Analyze a repository directory to detect languages, frameworks, package\n * manager, linters, test frameworks, CI providers, and existing AI tool\n * configurations.\n *\n * Runs all detection probes in parallel for performance. Returns a\n * `RepoInfo` object used by `hatch3r init` to make smart defaults.\n *\n * @param rootDir - Absolute path to the repository root directory.\n */\nexport async function analyzeRepo(rootDir: string): Promise<RepoInfo> {\n const [languages, pm, isMonorepo, hasExistingAgents, existingTools, frameworks, linters, testFrameworks, ciProviders] =\n await Promise.all([\n detectLanguages(rootDir),\n detectPackageManager(rootDir),\n detectMonorepo(rootDir),\n detectExistingAgents(rootDir),\n detectExistingTools(rootDir),\n detectFrameworks(rootDir),\n detectLinters(rootDir),\n detectTestFrameworks(rootDir),\n detectCIProviders(rootDir),\n ]);\n const packageManager = pm.name;\n\n return {\n languages,\n packageManager,\n frameworks,\n isMonorepo,\n hasExistingAgents,\n existingTools,\n rootDir,\n linters,\n testFrameworks,\n ciProviders,\n };\n}\n\n/** Detect programming languages by probing for language-specific config files. */\nasync function detectLanguages(rootDir: string): Promise<string[]> {\n const languages: string[] = [];\n // D14 Medium (#344-#357): Improved language detection with broader indicators\n const indicators: Record<string, string[]> = {\n typescript: [\"tsconfig.json\", \"tsconfig.base.json\", \"tsconfig.app.json\"],\n javascript: [\"jsconfig.json\", \".babelrc\", \"babel.config.js\", \"babel.config.json\"],\n python: [\"pyproject.toml\", \"setup.py\", \"requirements.txt\", \"Pipfile\", \"setup.cfg\", \"tox.ini\"],\n rust: [\"Cargo.toml\", \"Cargo.lock\"],\n go: [\"go.mod\", \"go.sum\"],\n java: [\"pom.xml\", \"build.gradle\"],\n kotlin: [\"build.gradle.kts\"],\n ruby: [\"Gemfile\", \".ruby-version\"],\n php: [\"composer.json\", \"artisan\"],\n swift: [\"Package.swift\"],\n dart: [\"pubspec.yaml\"],\n elixir: [\"mix.exs\"],\n scala: [\"build.sbt\"],\n zig: [\"build.zig\"],\n ocaml: [\"dune-project\"],\n haskell: [\"stack.yaml\", \"cabal.project\"],\n clojure: [\"deps.edn\", \"project.clj\"],\n lua: [\".luacheckrc\", \"rockspec\"],\n };\n\n for (const [lang, files] of Object.entries(indicators)) {\n for (const file of files) {\n if (await pathExists(join(rootDir, file))) {\n languages.push(lang);\n break;\n }\n }\n }\n\n try {\n const rootEntries = await readdir(rootDir);\n if (rootEntries.some(f => f.endsWith(\".csproj\") || f.endsWith(\".sln\"))) {\n languages.push(\"csharp\");\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n\n if (languages.length === 0) {\n languages.push(\"unknown\");\n }\n\n return languages;\n}\n\n/** Detect whether the project is a monorepo by checking for workspace config files (pnpm-workspace, lerna, nx, turbo, or package.json workspaces). */\nasync function detectMonorepo(rootDir: string): Promise<boolean> {\n if (await pathExists(join(rootDir, \"pnpm-workspace.yaml\"))) return true;\n if (await pathExists(join(rootDir, \"lerna.json\"))) return true;\n if (await pathExists(join(rootDir, \"nx.json\"))) return true;\n if (await pathExists(join(rootDir, \"turbo.json\"))) return true;\n if (await pathExists(join(rootDir, \"pants.toml\"))) return true;\n\n try {\n const pkgJson = await readFile(join(rootDir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(pkgJson);\n if (pkg.workspaces) return true;\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === 'ENOENT' || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n return false;\n}\n\n/** Check whether a `.agents/` directory already exists in the repo root. */\nasync function detectExistingAgents(rootDir: string): Promise<boolean> {\n return pathExists(join(rootDir, \".agents\"));\n}\n\nconst TOOL_INDICATORS: { tool: Tool; paths: string[] }[] = [\n { tool: \"cursor\", paths: [\".cursor\"] },\n { tool: \"copilot\", paths: [join(\".github\", \"copilot-instructions.md\")] },\n { tool: \"claude\", paths: [\"CLAUDE.md\", \".claude\"] },\n { tool: \"opencode\", paths: [\"opencode.json\", \"opencode.jsonc\"] },\n { tool: \"windsurf\", paths: [\".windsurfrules\"] },\n { tool: \"amp\", paths: [\".amp\"] },\n { tool: \"codex\", paths: [\".codex\"] },\n { tool: \"gemini\", paths: [\".gemini\", \"GEMINI.md\"] },\n { tool: \"cline\", paths: [\".clinerules\", \".roo\", \".roomodes\"] },\n { tool: \"aider\", paths: [\".aider\", \".aider.conf.yml\"] },\n { tool: \"kiro\", paths: [\".kiro\"] },\n { tool: \"goose\", paths: [\".goosehints\", \".goose\"] },\n { tool: \"zed\", paths: [\".rules\"] },\n { tool: \"amazon-q\", paths: [\".amazonq\"] },\n { tool: \"antigravity\", paths: [\".antigravity\"] },\n];\n\n/** Detect which AI coding tools already have configuration in the repo. */\nasync function detectExistingTools(rootDir: string): Promise<Tool[]> {\n const results = await Promise.allSettled(\n TOOL_INDICATORS.map(async ({ tool, paths }) => {\n for (const p of paths) {\n if (await pathExists(join(rootDir, p))) return tool;\n }\n return null;\n }),\n );\n\n return results\n .filter(\n (r): r is PromiseFulfilledResult<Tool> =>\n r.status === \"fulfilled\" && r.value !== null,\n )\n .map((r) => r.value);\n}\n\n/** Framework indicators that rely on config-file presence. */\nconst FRAMEWORK_CONFIG_INDICATORS: { framework: Framework; configs: string[] }[] = [\n { framework: \"next\", configs: [\"next.config.js\", \"next.config.mjs\", \"next.config.ts\"] },\n { framework: \"angular\", configs: [\"angular.json\"] },\n { framework: \"svelte\", configs: [\"svelte.config.js\", \"svelte.config.ts\"] },\n { framework: \"nuxt\", configs: [\"nuxt.config.js\", \"nuxt.config.ts\"] },\n { framework: \"astro\", configs: [\"astro.config.mjs\", \"astro.config.ts\"] },\n];\n\n/**\n * Framework indicators that rely on package.json dependency names.\n *\n * Order matters: more-specific frameworks (Next.js, SvelteKit, Nuxt, Remix)\n * are checked first so that `react` / `vue` / `svelte` are only emitted when\n * no higher-level meta-framework already covers them.\n */\nconst FRAMEWORK_DEP_INDICATORS: { framework: Framework; deps: string[] }[] = [\n { framework: \"next\", deps: [\"next\"] },\n { framework: \"angular\", deps: [\"@angular/core\"] },\n { framework: \"sveltekit\", deps: [\"@sveltejs/kit\"] },\n { framework: \"svelte\", deps: [\"svelte\"] },\n { framework: \"nuxt\", deps: [\"nuxt\"] },\n { framework: \"remix\", deps: [\"@remix-run/react\"] },\n { framework: \"astro\", deps: [\"astro\"] },\n { framework: \"vue\", deps: [\"vue\"] },\n { framework: \"react\", deps: [\"react\"] },\n { framework: \"express\", deps: [\"express\"] },\n { framework: \"fastify\", deps: [\"fastify\"] },\n { framework: \"hono\", deps: [\"hono\"] },\n // D14 Medium (#344-#357): Non-JS framework detection\n { framework: \"nestjs\", deps: [\"@nestjs/core\"] },\n];\n\n/**\n * Config-file-based indicators for non-JS frameworks.\n * D14 Medium (#344-#357): Broader framework detection across language ecosystems.\n */\nconst NON_JS_FRAMEWORK_INDICATORS: { framework: Framework; configs: string[] }[] = [\n { framework: \"django\", configs: [\"manage.py\"] },\n { framework: \"flask\", configs: [\"wsgi.py\"] },\n { framework: \"rails\", configs: [\"Rakefile\", \"config/routes.rb\"] },\n { framework: \"spring\", configs: [\"src/main/resources/application.properties\", \"src/main/resources/application.yml\"] },\n { framework: \"laravel\", configs: [\"artisan\"] },\n];\n\n/**\n * Meta-framework → base-framework suppression map.\n * When a meta-framework is detected, its base framework is suppressed to\n * avoid redundant entries (e.g. Next.js already implies React).\n */\nconst FRAMEWORK_SUPPRESSION: Partial<Record<Framework, Framework>> = {\n next: \"react\",\n remix: \"react\",\n nuxt: \"vue\",\n sveltekit: \"svelte\",\n};\n\n/** Detect web/backend frameworks via config files, package.json deps, and language-specific indicators. Suppresses base frameworks when a meta-framework is present (e.g. Next.js suppresses React). */\nasync function detectFrameworks(rootDir: string): Promise<Framework[]> {\n const detected = new Set<Framework>();\n\n // 1. Config-file presence checks (parallel).\n const configResults = await Promise.allSettled(\n FRAMEWORK_CONFIG_INDICATORS.map(async ({ framework, configs }) => {\n for (const cfg of configs) {\n if (await pathExists(join(rootDir, cfg))) return framework;\n }\n return null;\n }),\n );\n\n for (const r of configResults) {\n if (r.status === \"fulfilled\" && r.value !== null) {\n detected.add(r.value);\n }\n }\n\n // 2. package.json dependency checks.\n try {\n const raw = await readFile(join(rootDir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(raw);\n const allDeps: Record<string, string> = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n for (const { framework, deps } of FRAMEWORK_DEP_INDICATORS) {\n if (deps.some((d) => d in allDeps)) {\n detected.add(framework);\n }\n }\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === \"ENOENT\" || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n // 3. Non-JS framework detection via config file presence (D14 Medium)\n const nonJsResults = await Promise.allSettled(\n NON_JS_FRAMEWORK_INDICATORS.map(async ({ framework, configs }) => {\n for (const cfg of configs) {\n if (await pathExists(join(rootDir, cfg))) return framework;\n }\n return null;\n }),\n );\n for (const r of nonJsResults) {\n if (r.status === \"fulfilled\" && r.value !== null) {\n detected.add(r.value);\n }\n }\n\n // 4. Suppress base frameworks when a meta-framework is present.\n for (const [meta, base] of Object.entries(FRAMEWORK_SUPPRESSION)) {\n if (detected.has(meta as Framework)) {\n detected.delete(base as Framework);\n }\n }\n\n return [...detected];\n}\n\n// ── D14 Medium (#14.5): Linter / formatter detection ──────────────\n\n/** Linter/formatter indicator files. */\nconst LINTER_INDICATORS: { name: string; configs: string[] }[] = [\n { name: \"eslint\", configs: [\".eslintrc\", \".eslintrc.js\", \".eslintrc.json\", \".eslintrc.yml\", \".eslintrc.cjs\", \"eslint.config.js\", \"eslint.config.mjs\", \"eslint.config.ts\"] },\n { name: \"prettier\", configs: [\".prettierrc\", \".prettierrc.js\", \".prettierrc.json\", \".prettierrc.yml\", \".prettierrc.cjs\", \"prettier.config.js\", \"prettier.config.mjs\"] },\n { name: \"biome\", configs: [\"biome.json\", \"biome.jsonc\"] },\n { name: \"ruff\", configs: [\"ruff.toml\", \".ruff.toml\"] },\n { name: \"black\", configs: [\"pyproject.toml\"] }, // pyproject.toml with [tool.black] — config presence is sufficient\n { name: \"rubocop\", configs: [\".rubocop.yml\"] },\n { name: \"golangci-lint\", configs: [\".golangci.yml\", \".golangci.yaml\", \".golangci.toml\", \".golangci.json\"] },\n { name: \"clippy\", configs: [\".clippy.toml\", \"clippy.toml\"] },\n { name: \"checkstyle\", configs: [\"checkstyle.xml\"] },\n { name: \"stylelint\", configs: [\".stylelintrc\", \".stylelintrc.json\", \".stylelintrc.yml\", \"stylelint.config.js\"] },\n { name: \"deno-lint\", configs: [\"deno.json\", \"deno.jsonc\"] },\n];\n\n/** Detect linters and formatters by probing for their config files. */\nexport async function detectLinters(rootDir: string): Promise<string[]> {\n const detected: string[] = [];\n const results = await Promise.allSettled(\n LINTER_INDICATORS.map(async ({ name, configs }) => {\n for (const cfg of configs) {\n if (await pathExists(join(rootDir, cfg))) return name;\n }\n return null;\n }),\n );\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value !== null) {\n detected.push(r.value);\n }\n }\n return detected;\n}\n\n// ── D14 Medium (#14.6): Test framework detection ─────────────────\n\n/** Test framework indicator files. */\nconst TEST_FRAMEWORK_INDICATORS: { name: string; configs: string[] }[] = [\n { name: \"vitest\", configs: [\"vitest.config.ts\", \"vitest.config.js\", \"vitest.config.mts\"] },\n { name: \"jest\", configs: [\"jest.config.js\", \"jest.config.ts\", \"jest.config.mjs\", \"jest.config.json\"] },\n { name: \"mocha\", configs: [\".mocharc.yml\", \".mocharc.json\", \".mocharc.js\"] },\n { name: \"pytest\", configs: [\"pytest.ini\", \"conftest.py\"] },\n { name: \"rspec\", configs: [\".rspec\", \"spec/spec_helper.rb\"] },\n { name: \"junit\", configs: [\"src/test/java\"] },\n { name: \"go-test\", configs: [\"go.mod\"] }, // Go test is built-in; presence of go.mod implies go test availability\n { name: \"cargo-test\", configs: [\"Cargo.toml\"] }, // Rust test is built-in\n { name: \"phpunit\", configs: [\"phpunit.xml\", \"phpunit.xml.dist\"] },\n { name: \"playwright\", configs: [\"playwright.config.ts\", \"playwright.config.js\"] },\n { name: \"cypress\", configs: [\"cypress.config.ts\", \"cypress.config.js\", \"cypress.json\"] },\n];\n\n/** Detect test frameworks by probing for their config files. */\nexport async function detectTestFrameworks(rootDir: string): Promise<string[]> {\n const detected: string[] = [];\n const results = await Promise.allSettled(\n TEST_FRAMEWORK_INDICATORS.map(async ({ name, configs }) => {\n for (const cfg of configs) {\n if (await pathExists(join(rootDir, cfg))) return name;\n }\n return null;\n }),\n );\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value !== null) {\n detected.push(r.value);\n }\n }\n return detected;\n}\n\n// ── D14 Medium (#14.7): CI provider detection ────────────────────\n\n/** CI provider indicator files/directories. */\nconst CI_PROVIDER_INDICATORS: { name: string; configs: string[] }[] = [\n { name: \"github-actions\", configs: [\".github/workflows\"] },\n { name: \"gitlab-ci\", configs: [\".gitlab-ci.yml\"] },\n { name: \"circleci\", configs: [\".circleci/config.yml\"] },\n { name: \"travis\", configs: [\".travis.yml\"] },\n { name: \"jenkins\", configs: [\"Jenkinsfile\"] },\n { name: \"azure-pipelines\", configs: [\"azure-pipelines.yml\"] },\n { name: \"bitbucket-pipelines\", configs: [\"bitbucket-pipelines.yml\"] },\n { name: \"buildkite\", configs: [\".buildkite/pipeline.yml\"] },\n { name: \"drone\", configs: [\".drone.yml\"] },\n { name: \"woodpecker\", configs: [\".woodpecker.yml\", \".woodpecker\"] },\n];\n\n/** Detect CI/CD providers by probing for their config files or directories. */\nexport async function detectCIProviders(rootDir: string): Promise<string[]> {\n const detected: string[] = [];\n const results = await Promise.allSettled(\n CI_PROVIDER_INDICATORS.map(async ({ name, configs }) => {\n for (const cfg of configs) {\n if (await pathExists(join(rootDir, cfg))) return name;\n }\n return null;\n }),\n );\n for (const r of results) {\n if (r.status === \"fulfilled\" && r.value !== null) {\n detected.push(r.value);\n }\n }\n return detected;\n}\n\n// ── Utilities ─────────────────────────────────────────────────────\n\n/** Check whether a filesystem path exists. Returns false for ENOENT, throws for other errors. */\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n return false;\n }\n}\n\n/** Format a `RepoInfo` as a multi-line human-readable summary for CLI output. */\nexport function formatRepoSummary(info: RepoInfo): string {\n const lines = [\n `Languages: ${info.languages.join(\", \")}`,\n `Package manager: ${info.packageManager}`,\n `Monorepo: ${info.isMonorepo ? \"yes\" : \"no\"}`,\n `Existing .agents/: ${info.hasExistingAgents ? \"yes\" : \"no\"}`,\n ];\n\n if (info.frameworks.length > 0) {\n lines.push(`Frameworks: ${info.frameworks.join(\", \")}`);\n }\n\n if (info.existingTools.length > 0) {\n lines.push(`Existing tool configs: ${info.existingTools.join(\", \")}`);\n }\n\n if (info.linters && info.linters.length > 0) {\n lines.push(`Linters: ${info.linters.join(\", \")}`);\n }\n\n if (info.testFrameworks && info.testFrameworks.length > 0) {\n lines.push(`Test frameworks: ${info.testFrameworks.join(\", \")}`);\n }\n\n if (info.ciProviders && info.ciProviders.length > 0) {\n lines.push(`CI providers: ${info.ciProviders.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { readFileSync } from \"node:fs\";\nimport {\n TOOLS,\n AVAILABLE_MCP_SERVERS,\n type Tool,\n type Features,\n type Platform,\n} from \"../../types.js\";\n\nexport const TOOL_DISPLAY_NAMES: Record<Tool, string> = {\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n claude: \"Claude Code\",\n opencode: \"OpenCode\",\n windsurf: \"Windsurf\",\n amp: \"Amp\",\n codex: \"Codex CLI\",\n gemini: \"Gemini CLI\",\n cline: \"Cline / Roo Code\",\n aider: \"Aider\",\n kiro: \"Kiro\",\n goose: \"Goose\",\n zed: \"Zed\",\n \"amazon-q\": \"Amazon Q\",\n antigravity: \"Antigravity\",\n \"agents-md\": \"AGENTS.md\",\n};\n\nexport const TOOL_PROMPT_CHOICES: { name: string; value: Tool }[] = TOOLS.map((t) => ({\n name: TOOL_DISPLAY_NAMES[t],\n value: t,\n}));\n\nexport const FEATURE_CHOICES: { name: string; value: keyof Features }[] = [\n { name: \"Agents\", value: \"agents\" },\n { name: \"Skills\", value: \"skills\" },\n { name: \"Rules\", value: \"rules\" },\n { name: \"Prompts\", value: \"prompts\" },\n { name: \"Commands\", value: \"commands\" },\n { name: \"MCP\", value: \"mcp\" },\n { name: \"Hooks\", value: \"hooks\" },\n { name: \"GitHub agents\", value: \"githubAgents\" },\n];\n\nexport const MCP_CHOICES = Object.entries(AVAILABLE_MCP_SERVERS).map(([id, meta]) => ({\n name: `${id}: ${meta.description}`,\n value: id,\n}));\n\nexport const PLATFORM_DISPLAY_NAMES: Record<Platform, string> = {\n github: \"GitHub\",\n \"azure-devops\": \"Azure DevOps\",\n gitlab: \"GitLab\",\n};\n\nexport const PLATFORM_MCP_SERVER: Record<Platform, string> = {\n github: \"github\",\n \"azure-devops\": \"azure-devops\",\n gitlab: \"gitlab\",\n};\n\n/**\n * Maps tools to their command invocation syntax (how users trigger hatch3r commands).\n * Tools that use slash commands get \"/\", others get a description of how to invoke.\n */\nexport const TOOL_COMMAND_SYNTAX: Record<Tool, string> = {\n cursor: \"/\",\n copilot: \"/\",\n claude: \"/\",\n opencode: \"/\",\n windsurf: \"run workflow \",\n amp: \"/\",\n codex: \"prompt with \",\n gemini: \"/\",\n cline: \"run workflow \",\n aider: \"prompt with \",\n kiro: \"/\",\n goose: \"prompt with \",\n zed: \"/\",\n \"amazon-q\": \"/\",\n antigravity: \"/\",\n \"agents-md\": \"prompt with \",\n};\n\n/**\n * Returns a user-facing string showing how to invoke a command for the given tool(s).\n * If all selected tools use slash-command syntax, returns \"/command-name\".\n * Otherwise returns a generic phrasing.\n */\nexport function formatCommandHint(tools: Tool[], commandName: string): string {\n const allSlash = tools.every((t) => TOOL_COMMAND_SYNTAX[t] === \"/\");\n if (allSlash) {\n return `/${commandName}`;\n }\n return `the ${commandName} command`;\n}\n\n/**\n * Per-editor notes about how MCP secrets (.env.mcp) are loaded.\n * Surfaced during tool selection to avoid post-init confusion.\n */\nexport const TOOL_SECRET_NOTES: Partial<Record<Tool, string>> = {\n cursor: \"Cursor: auto-loads .env.mcp from project root\",\n copilot: \"VS Code / Copilot: auto-loads .env.mcp from project root\",\n claude: \"Claude Code: reads .env.mcp via shell sourcing (run `set -a && source .env.mcp && set +a` before starting)\",\n windsurf: \"Windsurf: auto-loads .env.mcp from project root\",\n cline: \"Cline / Roo Code: reads env from VS Code settings; copy values to .vscode/settings.json or use shell sourcing\",\n amp: \"Amp: reads env from shell; source .env.mcp in your shell profile\",\n codex: \"Codex CLI: reads env from shell; source .env.mcp before running\",\n gemini: \"Gemini CLI: reads env from shell; source .env.mcp before running\",\n aider: \"Aider: reads env from shell; source .env.mcp before running\",\n opencode: \"OpenCode: reads env from shell; source .env.mcp before running\",\n};\n\nexport function sanitizeInput(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"\");\n}\n\nexport function isWSL(): boolean {\n if (process.env.WSL_DISTRO_NAME) return true;\n try {\n return /microsoft|wsl/i.test(readFileSync(\"/proc/version\", \"utf-8\"));\n } catch {\n return false;\n }\n}\n","import type { ContentTag } from \"./tags.js\";\n\nexport type PresetId = \"minimal\" | \"standard\" | \"full\" | \"custom\";\n\nexport interface ContentPreset {\n id: PresetId;\n name: string;\n description: string;\n includeTags: ContentTag[];\n excludeTags: ContentTag[];\n}\n\nexport const PRESETS: ContentPreset[] = [\n {\n id: \"minimal\",\n name: \"Minimal\",\n description: \"Core agents and workflows only\",\n includeTags: [\"core\"],\n excludeTags: [],\n },\n {\n id: \"standard\",\n name: \"Standard (recommended)\",\n description: \"Full development lifecycle without niche audits\",\n includeTags: [\"core\", \"planning\", \"implementation\", \"review\", \"devops\", \"maintenance\"],\n excludeTags: [\"board\", \"a11y\", \"performance\", \"customize\"],\n },\n {\n id: \"full\",\n name: \"Full\",\n description: \"Everything including board management and all audits\",\n includeTags: [], // empty = include all\n excludeTags: [],\n },\n {\n id: \"custom\",\n name: \"Custom\",\n description: \"Choose exactly what you need\",\n includeTags: [],\n excludeTags: [],\n },\n];\n\n/** Look up a content preset by ID. Throws if the preset does not exist. */\nexport function getPreset(id: PresetId): ContentPreset {\n const preset = PRESETS.find((p) => p.id === id);\n if (!preset) throw new Error(`Unknown preset: ${id}`);\n return preset;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, normalize, isAbsolute } from \"node:path\";\nimport { AGENTS_DIR, HatchError } from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\nimport type { WorkspaceManifest } from \"./types.js\";\nimport { WORKSPACE_MANIFEST_FILE, WORKSPACE_MANIFEST_VERSION } from \"./types.js\";\n\n/**\n * Validate that a workspace repo path is safe (no traversal or absolute paths).\n * Rejects paths containing \"..\", absolute paths, and null bytes.\n */\nexport function isUnsafeRepoPath(repoPath: string): boolean {\n if (repoPath.includes('\\0')) return true;\n if (isAbsolute(repoPath)) return true;\n const normalized = normalize(repoPath);\n if (normalized.startsWith('..')) return true;\n return false;\n}\n\n/** Runtime type guard that validates an unknown value conforms to the WorkspaceManifest shape. */\nfunction validateWorkspaceManifest(data: unknown): data is WorkspaceManifest {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.version !== \"string\") return false;\n if (typeof obj.hatch3rVersion !== \"string\") return false;\n if (typeof obj.name !== \"string\") return false;\n if (!Array.isArray(obj.repos)) return false;\n if (typeof obj.syncStrategy !== \"string\") return false;\n if (![\"manual\", \"on-sync\"].includes(obj.syncStrategy)) return false;\n\n if (!obj.defaults || typeof obj.defaults !== \"object\") return false;\n const defaults = obj.defaults as Record<string, unknown>;\n if (!Array.isArray(defaults.tools)) return false;\n if (!defaults.features || typeof defaults.features !== \"object\") return false;\n if (!defaults.mcp || typeof defaults.mcp !== \"object\") return false;\n\n // Validate MCP servers array\n const mcp = defaults.mcp as Record<string, unknown>;\n if (!Array.isArray(mcp.servers)) return false;\n\n // Validate content selection if present\n if (defaults.content !== undefined) {\n if (typeof defaults.content !== \"object\" || defaults.content === null) return false;\n const content = defaults.content as Record<string, unknown>;\n if (typeof content.preset !== \"string\") return false;\n if (typeof content.projectType !== \"string\") return false;\n if (typeof content.teamSize !== \"string\") return false;\n if (!content.items || typeof content.items !== \"object\") return false;\n }\n\n for (const repo of obj.repos as unknown[]) {\n if (!repo || typeof repo !== \"object\") return false;\n const r = repo as Record<string, unknown>;\n if (typeof r.path !== \"string\") return false;\n if (isUnsafeRepoPath(r.path)) return false;\n if (typeof r.sync !== \"boolean\") return false;\n if (r.owner !== undefined && typeof r.owner !== \"string\") return false;\n if (r.repo !== undefined && typeof r.repo !== \"string\") return false;\n if (r.defaultBranch !== undefined && typeof r.defaultBranch !== \"string\") return false;\n if (r.platform !== undefined && typeof r.platform !== \"string\") return false;\n }\n\n return true;\n}\n\n/** Read and validate the workspace manifest, returning null if not found. */\nexport async function readWorkspaceManifest(\n rootDir: string,\n): Promise<WorkspaceManifest | null> {\n const manifestPath = join(rootDir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE);\n\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err: unknown) {\n throw new HatchError(\n `Malformed JSON in ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,\n 1,\n \"CONFIG_ERROR\",\n );\n }\n\n if (!validateWorkspaceManifest(parsed)) {\n throw new HatchError(\n `Invalid workspace manifest in ${manifestPath}: required fields missing or malformed.`,\n 1,\n \"VALIDATION_ERROR\",\n );\n }\n\n return parsed;\n}\n\n/** Atomically write the workspace manifest to `.agents/workspace.json`. */\nexport async function writeWorkspaceManifest(\n rootDir: string,\n manifest: WorkspaceManifest,\n): Promise<void> {\n const manifestPath = join(rootDir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE);\n await atomicWriteFile(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\n/** Create a new workspace manifest with the given configuration. */\nexport function createWorkspaceManifest(\n name: string,\n defaults: WorkspaceManifest[\"defaults\"],\n repos: WorkspaceManifest[\"repos\"],\n syncStrategy: WorkspaceManifest[\"syncStrategy\"] = \"manual\",\n): WorkspaceManifest {\n return {\n version: WORKSPACE_MANIFEST_VERSION,\n hatch3rVersion: HATCH3R_VERSION,\n name,\n repos,\n defaults,\n syncStrategy,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, access, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n buildContentIndex,\n copySelectedContent,\n getAllContentIds,\n getAllItemsById,\n removeContentItem,\n} from \"../content/index.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest, verifyIntegrity } from \"../integrity/index.js\";\nimport {\n createManifest,\n readManifest,\n writeManifest,\n addManagedFile,\n} from \"../manifest/hatchJson.js\";\nimport { safeWriteFile } from \"../merge/safeWrite.js\";\nimport { AGENTS_DIR } from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { generateCanonicalAgentsMd, generateRootAgentsMd } from \"../cli/shared/agentsContent.js\";\nimport { findPackageRoot } from \"../cli/shared/paths.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname } from \"node:path\";\nimport { analyzeRepo } from \"../detect/repoAnalyzer.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry } from \"../env/mcpEnv.js\";\nimport { readWorkspaceManifest, writeWorkspaceManifest } from \"./manifest.js\";\nimport { resolveRepoConfig, buildSelectionFromIds } from \"./resolve.js\";\nimport { detectRepoGitIdentity } from \"./git.js\";\nimport { CHARS_PER_TOKEN } from \"../pipeline/observability.js\";\nimport type { WorkspaceManifest, WorkspaceRepoEntry, WorkspaceSyncResult, WorkspaceRepoSyncResult } from \"./types.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_ROOT = findPackageRoot(__dirname);\n\n/**\n * Estimate total tokens for a set of content IDs by summing the character\n * length of their source files and dividing by the chars-per-token ratio.\n */\nasync function estimateTokensForContent(\n contentIds: Set<string>,\n index: Awaited<ReturnType<typeof buildContentIndex>>,\n): Promise<number> {\n let totalChars = 0;\n for (const id of contentIds) {\n // Use getAllItemsById to handle cross-type collisions (e.g., command + skill with same ID)\n const items = getAllItemsById(index, id);\n for (const item of items) {\n try {\n if (item.type === \"skill\") {\n // For skills, read the SKILL.md file\n const skillPath = join(CONTENT_ROOT, item.relativePath, \"SKILL.md\");\n const content = await readFile(skillPath, \"utf-8\");\n totalChars += content.length;\n } else {\n const filePath = join(CONTENT_ROOT, item.relativePath);\n const content = await readFile(filePath, \"utf-8\");\n totalChars += content.length;\n }\n } catch {\n // File not readable; skip\n }\n }\n }\n return Math.ceil(totalChars / CHARS_PER_TOKEN);\n}\n\nexport interface WorkspaceSyncOptions {\n /** Only sync these repo paths (sync all opted-in repos if empty/undefined). */\n repos?: string[];\n /** Show what would change without modifying files. */\n dryRun?: boolean;\n /** Overwrite locally modified canonical files in sub-repos. */\n force?: boolean;\n /** Log callback for progress reporting. */\n onProgress?: (message: string) => void;\n /** Warning callback. */\n onWarn?: (message: string) => void;\n}\n\n/**\n * Sync workspace content to all (or selected) opted-in sub-repos.\n *\n * For each repo with sync=true:\n * 1. Resolve effective config (workspace defaults + repo overrides)\n * 2. Copy canonical content from workspace .agents/ to sub-repo .agents/\n * 3. Write sub-repo hatch.json with workspace provenance\n * 4. Run adapter generation for the sub-repo\n * 5. Generate integrity manifest\n */\nexport async function syncWorkspaceRepos(\n workspaceRoot: string,\n options: WorkspaceSyncOptions = {},\n): Promise<WorkspaceSyncResult> {\n const wsManifest = await readWorkspaceManifest(workspaceRoot);\n if (!wsManifest) {\n return { repos: [] };\n }\n\n const wsChecksum = createHash(\"sha256\")\n .update(JSON.stringify(wsManifest))\n .digest(\"hex\");\n\n // Build content index from workspace .agents/ (which has the canonical content)\n const index = await buildContentIndex(CONTENT_ROOT);\n const protectedIds = new Set(\n index.items.filter((item) => item.protected).map((item) => item.id),\n );\n\n // D15 Medium (#15.24): Pre-sync integrity check — warn if workspace\n // canonical content has been tampered with before propagating to sub-repos.\n const wsAgentsDir = join(workspaceRoot, AGENTS_DIR);\n const integrityResults = await verifyIntegrity(wsAgentsDir);\n const tampered = integrityResults.filter(\n (r) => r.status === \"modified\" || r.status === \"tampered\",\n );\n if (tampered.length > 0 && !options.force) {\n for (const r of tampered) {\n options.onWarn?.(\n `Integrity issue in workspace content: ${r.file} (${r.status}). ` +\n `Use --force to sync anyway, or run hatch3r verify to inspect.`,\n );\n }\n }\n\n // Select target repos\n const targetRepos = options.repos?.length\n ? wsManifest.repos.filter((r) => options.repos!.includes(r.path))\n : wsManifest.repos.filter((r) => r.sync);\n\n const results: WorkspaceRepoSyncResult[] = [];\n\n for (const repoEntry of targetRepos) {\n try {\n const result = await syncSingleRepo(\n workspaceRoot,\n wsManifest,\n wsChecksum,\n repoEntry,\n index,\n protectedIds,\n options,\n );\n results.push(result);\n } catch (err) {\n results.push({\n path: repoEntry.path,\n added: [],\n removed: [],\n toolsSynced: [],\n action: \"error\",\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Update workspace manifest with lastSync timestamps (unless dry-run)\n if (!options.dryRun) {\n const now = new Date().toISOString();\n for (const result of results) {\n if (result.action === \"synced\") {\n const entry = wsManifest.repos.find((r) => r.path === result.path);\n if (entry) entry.lastSync = now;\n }\n }\n await writeWorkspaceManifest(workspaceRoot, wsManifest);\n }\n\n return { repos: results };\n}\n\nasync function syncSingleRepo(\n workspaceRoot: string,\n wsManifest: WorkspaceManifest,\n wsChecksum: string,\n repoEntry: WorkspaceRepoEntry,\n index: Awaited<ReturnType<typeof buildContentIndex>>,\n protectedIds: Set<string>,\n options: WorkspaceSyncOptions,\n): Promise<WorkspaceRepoSyncResult> {\n const repoDir = join(workspaceRoot, repoEntry.path);\n const repoAgentsDir = join(repoDir, AGENTS_DIR);\n\n // Verify repo directory exists\n try {\n await access(repoDir);\n } catch {\n return {\n path: repoEntry.path,\n added: [],\n removed: [],\n toolsSynced: [],\n action: \"error\",\n error: `Directory not found: ${repoEntry.path}`,\n };\n }\n\n // Resolve effective config\n const resolved = resolveRepoConfig(wsManifest.defaults, repoEntry.overrides, protectedIds);\n const effectiveSelection = buildSelectionFromIds(resolved.contentIds, wsManifest.defaults.content, index.items);\n\n // Compute diff\n const existingManifest = await readManifest(repoDir);\n const previousIds = existingManifest?.content\n ? getAllContentIds(existingManifest.content)\n : new Set<string>();\n\n const toAdd = [...resolved.contentIds].filter((id) => !previousIds.has(id));\n const toRemove = [...previousIds].filter(\n (id) =>\n !resolved.contentIds.has(id) &&\n !existingManifest?.workspace?.localContent?.includes(id),\n );\n\n if (options.dryRun) {\n const estimatedTokens = await estimateTokensForContent(resolved.contentIds, index);\n return {\n path: repoEntry.path,\n added: toAdd,\n removed: toRemove,\n toolsSynced: resolved.tools,\n action: \"dry-run\",\n estimatedTokens,\n };\n }\n\n options.onProgress?.(`Syncing ${repoEntry.name ?? repoEntry.path}...`);\n\n // Ensure .agents/ exists\n await mkdir(repoAgentsDir, { recursive: true });\n\n // Copy selected content to sub-repo\n await copySelectedContent(CONTENT_ROOT, repoAgentsDir, effectiveSelection, index);\n\n // Remove stale content (handle cross-type collisions)\n for (const id of toRemove) {\n const items = getAllItemsById(index, id);\n for (const item of items) {\n await removeContentItem(repoAgentsDir, item, { rootDir: repoDir });\n }\n }\n\n // Generate AGENTS.md for sub-repo\n const canonicalAgentsMd = await generateCanonicalAgentsMd(repoAgentsDir);\n await safeWriteFile(join(repoAgentsDir, \"AGENTS.md\"), canonicalAgentsMd, { force: true });\n\n // Write sub-repo manifest — resolve per-repo git identity\n const repoInfo = await analyzeRepo(repoDir);\n\n // 1. Per-repo identity from workspace.json\n let gitOwner = repoEntry.owner ?? \"\";\n let gitRepo = repoEntry.repo ?? \"\";\n let gitBranch = repoEntry.defaultBranch ?? \"\";\n let gitPlatform = repoEntry.platform;\n\n // 2. Fallback: auto-detect from sub-repo's git remote\n if (!gitOwner && !gitRepo) {\n const identity = detectRepoGitIdentity(repoDir);\n gitOwner = identity.owner;\n gitRepo = identity.repo;\n gitBranch = gitBranch || identity.defaultBranch;\n gitPlatform = gitPlatform ?? identity.platform;\n }\n\n // 3. Fallback: existing manifest values\n if (!gitOwner && !gitRepo && existingManifest) {\n gitOwner = existingManifest.owner;\n gitRepo = existingManifest.repo;\n }\n\n if (!gitBranch) gitBranch = \"main\";\n\n const manifest = createManifest({\n platform: gitPlatform ?? resolved.platform,\n owner: gitOwner,\n repo: gitRepo,\n namespace: gitOwner,\n project: gitRepo,\n defaultBranch: gitBranch,\n tools: resolved.tools,\n features: resolved.features,\n mcpServers: resolved.mcp.servers,\n content: effectiveSelection,\n languages: repoInfo.languages,\n });\n\n // Add workspace provenance\n manifest.workspace = {\n rootPath: relative(repoDir, workspaceRoot),\n lastSync: new Date().toISOString(),\n syncVersion: HATCH3R_VERSION,\n workspaceChecksum: wsChecksum,\n excludedContent: resolved.excludedContent.length > 0 ? resolved.excludedContent : undefined,\n localContent: existingManifest?.workspace?.localContent,\n };\n\n if (resolved.models) {\n manifest.models = resolved.models;\n }\n\n await writeManifest(repoDir, manifest);\n\n // Generate root AGENTS.md for sub-repo with inline agent/skill/command rosters\n const rootAgentsMd = await generateRootAgentsMd(repoAgentsDir);\n await safeWriteFile(join(repoDir, \"AGENTS.md\"), rootAgentsMd.full, {\n managedContent: rootAgentsMd.inner,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, \"AGENTS.md\");\n\n // Run adapter generation\n const toolsSynced: string[] = [];\n for (const tool of resolved.tools) {\n try {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(repoAgentsDir, manifest);\n for (const w of adapter.warnings) {\n options.onWarn?.(w);\n }\n for (const out of outputs) {\n await safeWriteFile(join(repoDir, out.path), out.content, {\n managedContent: out.managedContent,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, out.path);\n }\n toolsSynced.push(tool);\n } catch (err) {\n options.onWarn?.(\n `Failed to generate ${tool} output for ${repoEntry.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Write manifest again with managedFiles populated\n await writeManifest(repoDir, manifest);\n\n // Generate integrity manifest\n const integrityManifest = await generateIntegrityManifest(repoAgentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(repoAgentsDir, integrityManifest);\n\n // Ensure .env.mcp for MCP servers\n if (manifest.features.mcp && manifest.mcp.servers.length > 0) {\n await ensureEnvMcp(repoDir, manifest.mcp.servers);\n await ensureGitignoreEntry(repoDir);\n }\n\n return {\n path: repoEntry.path,\n added: toAdd,\n removed: toRemove,\n toolsSynced,\n action: \"synced\",\n };\n}\n","import { getAllContentIds, TYPE_TO_SELECTION_KEY } from \"../content/index.js\";\nimport type { ContentSelection, Features, McpConfig, ModelConfig, Platform, Tool } from \"../types.js\";\nimport type { WorkspaceDefaults, WorkspaceRepoOverrides } from \"./types.js\";\n\nexport interface ResolvedRepoConfig {\n platform?: Platform;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n models?: ModelConfig;\n /** Effective content IDs after merge (workspace base + include - exclude). */\n contentIds: Set<string>;\n /** Content IDs excluded by the repo override. */\n excludedContent: string[];\n /** Content IDs added by the repo override. */\n addedContent: string[];\n}\n\n/**\n * Merge workspace defaults with per-repo overrides to produce effective config.\n *\n * Merge rules:\n * - tools: repo overrides replace entirely (not merged)\n * - features: partial merge (repo values override workspace values)\n * - mcp: repo overrides replace entirely\n * - content: workspace base + include - exclude (protected items cannot be excluded)\n * - models: deep merge (repo agent overrides take precedence)\n * - platform: repo overrides replace\n */\nexport function resolveRepoConfig(\n defaults: WorkspaceDefaults,\n overrides?: WorkspaceRepoOverrides,\n protectedIds?: Set<string>,\n): ResolvedRepoConfig {\n const tools = overrides?.tools ?? defaults.tools;\n const features = { ...defaults.features, ...(overrides?.features ?? {}) } as Features;\n const mcp = overrides?.mcp ?? defaults.mcp;\n const platform = overrides?.platform ?? defaults.platform;\n\n // Models: deep merge (agent-level overrides take precedence)\n let models: ModelConfig | undefined;\n if (defaults.models || overrides?.models) {\n models = {\n ...defaults.models,\n ...overrides?.models,\n agents: {\n ...defaults.models?.agents,\n ...overrides?.models?.agents,\n },\n };\n if (!models.default && !models.agents) models = undefined;\n }\n\n // Content: start from workspace, apply include/exclude\n const contentIds = getAllContentIds(defaults.content);\n const excludedContent: string[] = [];\n const addedContent: string[] = [];\n\n if (overrides?.contentOverrides?.exclude) {\n for (const id of overrides.contentOverrides.exclude) {\n // Protected items cannot be excluded\n if (protectedIds?.has(id)) continue;\n if (contentIds.has(id)) {\n contentIds.delete(id);\n excludedContent.push(id);\n }\n }\n }\n\n if (overrides?.contentOverrides?.include) {\n for (const id of overrides.contentOverrides.include) {\n if (!contentIds.has(id)) {\n contentIds.add(id);\n addedContent.push(id);\n }\n }\n }\n\n return { platform, tools, features, mcp, models, contentIds, excludedContent, addedContent };\n}\n\n/**\n * Build a ContentSelection object from a set of content IDs and the\n * workspace base selection (to preserve preset/projectType/teamSize metadata).\n */\nexport function buildSelectionFromIds(\n ids: Set<string>,\n baseSelection: ContentSelection,\n allItems: { id: string; type: string }[],\n): ContentSelection {\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const item of allItems) {\n if (!ids.has(item.id)) continue;\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) items[key].push(item.id);\n }\n\n return {\n preset: \"custom\",\n projectType: baseSelection.projectType,\n teamSize: baseSelection.teamSize,\n items,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\n\n// ── Git Identity ───────────────────────────────────────────────\n\nexport interface RepoGitIdentity {\n owner: string;\n repo: string;\n defaultBranch: string;\n platform: Platform;\n}\n\n// ── Detection Functions ────────────────────────────────────────\n\n/** Parse the owner and repo name from the git `origin` remote URL. Returns empty strings on failure. */\nexport function parseGitRemote(cwd?: string): { owner: string; repo: string } {\n try {\n const url = execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd,\n stdio: \"pipe\",\n })\n .toString()\n .trim();\n\n const sshMatch = url.match(/[:\\/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return { owner: \"\", repo: \"\" };\n } catch {\n return { owner: \"\", repo: \"\" };\n }\n}\n\n/** Detect the default branch name from `origin/HEAD`. Falls back to `\"main\"`. */\nexport function parseGitDefaultBranch(cwd?: string): string {\n try {\n const ref = execFileSync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"origin/HEAD\"], {\n cwd,\n stdio: \"pipe\",\n })\n .toString()\n .trim();\n if (ref && ref.startsWith(\"origin/\")) {\n return ref.replace(/^origin\\//, \"\");\n }\n return \"main\";\n } catch {\n return \"main\";\n }\n}\n\n/** Infer the hosting platform (github, gitlab, azure-devops) from a remote URL. */\nexport function detectPlatformFromRemote(remoteUrl: string): Platform {\n if (remoteUrl.includes(\"dev.azure.com\") || remoteUrl.includes(\"visualstudio.com\")) return \"azure-devops\";\n if (remoteUrl.includes(\"gitlab.com\") || remoteUrl.includes(\"gitlab.\")) return \"gitlab\";\n return \"github\";\n}\n\n/** Get the raw URL of the `origin` remote. Returns empty string on failure. */\nexport function getGitRemoteUrl(cwd?: string): string {\n try {\n return execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], { cwd, stdio: \"pipe\" }).toString().trim();\n } catch {\n return \"\";\n }\n}\n\n// ── Composite Detection ────────────────────────────────────────\n\n/**\n * Auto-detect git identity for a repository directory.\n * Returns owner, repo, defaultBranch, and platform by inspecting the git remote.\n */\nexport function detectRepoGitIdentity(repoDir: string): RepoGitIdentity {\n const remoteUrl = getGitRemoteUrl(repoDir);\n const { owner, repo } = parseGitRemote(repoDir);\n const defaultBranch = parseGitDefaultBranch(repoDir);\n const platform = remoteUrl ? detectPlatformFromRemote(remoteUrl) : \"github\";\n\n return { owner, repo, defaultBranch, platform };\n}\n","/**\n * Pipeline observability module.\n *\n * Provides four capabilities for pipeline instrumentation:\n *\n * 1. **Reasoning block persistence** -- captures and stores phase reasoning\n * in a structured format for post-execution review. Each block includes\n * category, content, and ISO-8601 timestamp.\n *\n * 2. **Per-phase token estimation** -- estimates token usage per phase using\n * a character-based heuristic (default: 4 chars/token). Feeds cost tracking\n * and context-window budgeting.\n *\n * 3. **Cost estimation** -- converts token estimates to USD cost using\n * configurable per-1M-token rates, with threshold-based budget warnings.\n *\n * 4. **Replay guidance** -- produces structured reproduction steps for\n * debugging failed pipeline executions, including environment snapshot\n * and git ref capture.\n *\n * Metric naming convention: all exported interfaces use `{Scope}{Metric}`\n * format (e.g. `PhaseTokenEstimate`, `PipelineTokenSummary`, `CostEstimate`).\n */\n\nimport type { PhaseName } from \"./phaseTimeout.js\";\n\n// ── Reasoning Block Persistence (Finding #63) ────────────────────\n\n/**\n * A single reasoning block captured during a pipeline phase.\n *\n * Pipeline phases often produce intermediate analysis (thinking,\n * chain-of-thought, decision rationale). This structure persists\n * those blocks so they can be inspected post-execution.\n */\nexport interface ReasoningBlock {\n /** Sequential index within the phase (0-based). */\n index: number;\n /** Category of reasoning (e.g. \"analysis\", \"decision\", \"risk-assessment\"). */\n category: string;\n /** The reasoning text. */\n content: string;\n /** ISO-8601 timestamp when this block was captured. */\n timestamp: string;\n}\n\n/**\n * Phase reasoning output -- the collection of reasoning blocks\n * produced by a single pipeline phase.\n */\nexport interface PhaseReasoning {\n /** Which pipeline phase produced this reasoning. */\n phase: PhaseName;\n /** Ordered list of reasoning blocks. */\n blocks: ReasoningBlock[];\n /** Total character count across all blocks. */\n totalChars: number;\n}\n\n/**\n * Create an empty PhaseReasoning container for a given phase.\n */\nexport function createPhaseReasoning(phase: PhaseName): PhaseReasoning {\n return {\n phase,\n blocks: [],\n totalChars: 0,\n };\n}\n\n/**\n * Append a reasoning block to the phase reasoning container.\n *\n * Returns a new PhaseReasoning with the block appended (immutable).\n */\nexport function appendReasoningBlock(\n reasoning: PhaseReasoning,\n category: string,\n content: string,\n): PhaseReasoning {\n const block: ReasoningBlock = {\n index: reasoning.blocks.length,\n category,\n content,\n timestamp: new Date().toISOString(),\n };\n\n return {\n ...reasoning,\n blocks: [...reasoning.blocks, block],\n totalChars: reasoning.totalChars + content.length,\n };\n}\n\n/**\n * Produce a plain-text summary of the reasoning blocks for a phase.\n *\n * Useful for logging or inclusion in pipeline reports.\n */\nexport function summarizeReasoning(reasoning: PhaseReasoning): string {\n if (reasoning.blocks.length === 0) {\n return `Phase \"${reasoning.phase}\": no reasoning blocks captured.`;\n }\n\n const lines: string[] = [\n `Phase \"${reasoning.phase}\": ${reasoning.blocks.length} reasoning block(s), ${reasoning.totalChars} chars total.`,\n ];\n\n for (const block of reasoning.blocks) {\n const preview =\n block.content.length > 120\n ? block.content.substring(0, 120) + \"...\"\n : block.content;\n lines.push(` [${block.index}] (${block.category}) ${preview}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n// ── Per-Phase Token Estimation (Finding #64) ─────────────────────\n\n/**\n * Token estimate for a single pipeline phase.\n *\n * Token counts are estimates based on character-level heuristics\n * (not exact BPE tokenisation), suitable for cost tracking and\n * context-window budgeting.\n */\nexport interface PhaseTokenEstimate {\n /** Which pipeline phase. */\n phase: PhaseName;\n /** Estimated input tokens consumed by the phase. */\n inputTokens: number;\n /** Estimated output tokens produced by the phase. */\n outputTokens: number;\n /** Estimated total tokens (input + output). */\n totalTokens: number;\n}\n\n/**\n * Aggregate token estimates across all pipeline phases.\n */\nexport interface PipelineTokenSummary {\n /** Per-phase breakdowns. */\n phases: PhaseTokenEstimate[];\n /** Sum of all input tokens. */\n totalInputTokens: number;\n /** Sum of all output tokens. */\n totalOutputTokens: number;\n /** Grand total of all tokens. */\n grandTotal: number;\n}\n\n/**\n * Average characters per token for estimation purposes.\n *\n * English prose averages ~4 chars/token; code averages ~3.5.\n * We use 4 as a conservative default.\n */\nexport const CHARS_PER_TOKEN = 4;\n\n/**\n * Estimate token count from a character count.\n *\n * Uses a simple chars / CHARS_PER_TOKEN heuristic. The divisor can be\n * overridden for language-specific tuning (e.g. 3.5 for code-heavy input).\n */\nexport function estimateTokens(\n charCount: number,\n charsPerToken: number = CHARS_PER_TOKEN,\n): number {\n if (charCount <= 0) return 0;\n return Math.ceil(charCount / charsPerToken);\n}\n\n/**\n * Create a token estimate for a single pipeline phase.\n */\nexport function createPhaseTokenEstimate(\n phase: PhaseName,\n inputChars: number,\n outputChars: number,\n charsPerToken: number = CHARS_PER_TOKEN,\n): PhaseTokenEstimate {\n const inputTokens = estimateTokens(inputChars, charsPerToken);\n const outputTokens = estimateTokens(outputChars, charsPerToken);\n\n return {\n phase,\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n };\n}\n\n/**\n * Aggregate multiple phase estimates into a pipeline summary.\n */\nexport function createTokenSummary(\n phases: PhaseTokenEstimate[],\n): PipelineTokenSummary {\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (const p of phases) {\n totalInputTokens += p.inputTokens;\n totalOutputTokens += p.outputTokens;\n }\n\n return {\n phases: [...phases],\n totalInputTokens,\n totalOutputTokens,\n grandTotal: totalInputTokens + totalOutputTokens,\n };\n}\n\n/**\n * Format a token summary as a human-readable string.\n */\nexport function formatTokenSummary(summary: PipelineTokenSummary): string {\n const lines: string[] = [\n `Token usage: ${summary.grandTotal} total (${summary.totalInputTokens} in, ${summary.totalOutputTokens} out)`,\n ];\n\n for (const p of summary.phases) {\n lines.push(\n ` ${p.phase}: ${p.totalTokens} (${p.inputTokens} in, ${p.outputTokens} out)`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n// ── Budget Tracking (D12 Medium: #315-#330) ──────────────────────\n\n/**\n * Cost estimation for a pipeline run based on token counts.\n *\n * Uses configurable per-token rates to estimate costs.\n * Default rates are conservative estimates for typical LLM pricing.\n */\nexport interface CostEstimate {\n /** Estimated input cost. */\n inputCost: number;\n /** Estimated output cost. */\n outputCost: number;\n /** Total estimated cost. */\n totalCost: number;\n /** Currency code. */\n currency: string;\n /** Whether any budget threshold was exceeded. */\n budgetWarning: boolean;\n /** Warning message if budget threshold exceeded. */\n warningMessage?: string;\n}\n\n/** Default cost per 1M input tokens in USD. */\nexport const DEFAULT_INPUT_COST_PER_1M = 3.0;\n\n/** Default cost per 1M output tokens in USD. */\nexport const DEFAULT_OUTPUT_COST_PER_1M = 15.0;\n\n/**\n * Estimate cost from a token summary.\n */\nexport function estimateCost(\n summary: PipelineTokenSummary,\n options?: {\n inputCostPer1M?: number;\n outputCostPer1M?: number;\n currency?: string;\n budgetLimit?: number;\n warningThresholds?: number[];\n },\n): CostEstimate {\n const inputRate = (options?.inputCostPer1M ?? DEFAULT_INPUT_COST_PER_1M) / 1_000_000;\n const outputRate = (options?.outputCostPer1M ?? DEFAULT_OUTPUT_COST_PER_1M) / 1_000_000;\n const currency = options?.currency ?? \"USD\";\n\n const inputCost = summary.totalInputTokens * inputRate;\n const outputCost = summary.totalOutputTokens * outputRate;\n const totalCost = inputCost + outputCost;\n\n let budgetWarning = false;\n let warningMessage: string | undefined;\n\n if (options?.budgetLimit) {\n const thresholds = options.warningThresholds ?? [0.5, 0.75, 0.9];\n const ratio = totalCost / options.budgetLimit;\n for (const t of thresholds.sort((a, b) => b - a)) {\n if (ratio >= t) {\n budgetWarning = true;\n warningMessage = `Estimated cost (${totalCost.toFixed(4)} ${currency}) has reached ${(ratio * 100).toFixed(0)}% of budget (${options.budgetLimit} ${currency}).`;\n break;\n }\n }\n }\n\n return { inputCost, outputCost, totalCost, currency, budgetWarning, warningMessage };\n}\n\n// ── Replay Guidance (Finding #65) ────────────────────────────────\n\n/**\n * Structured replay guidance for reproducing a pipeline execution.\n *\n * When debugging pipeline issues, this provides the information\n * needed to reproduce the exact execution context.\n */\nexport interface ReplayGuidance {\n /** The correlation ID of the original pipeline run. */\n correlationId: string;\n /** ISO-8601 timestamp of the original run. */\n originalRunTimestamp: string;\n /** Phase where the issue was observed. */\n failedPhase: PhaseName;\n /** Human-readable description of the failure. */\n failureDescription: string;\n /** Ordered steps to reproduce the issue. */\n replaySteps: ReplayStep[];\n /** Key-value pairs of environment/config needed for replay. */\n environmentSnapshot: Record<string, string>;\n /** Files that should be checked out / restored for replay. */\n relevantFiles: string[];\n /** Git ref (branch, commit SHA) at the time of the run. */\n gitRef?: string;\n}\n\n/**\n * A single step in the replay sequence.\n */\nexport interface ReplayStep {\n /** 1-based step number. */\n stepNumber: number;\n /** What to do in this step. */\n instruction: string;\n /** Expected outcome of this step. */\n expectedOutcome?: string;\n}\n\n/**\n * Create replay guidance for a failed pipeline execution.\n */\nexport function createReplayGuidance(\n correlationId: string,\n failedPhase: PhaseName,\n failureDescription: string,\n options?: {\n gitRef?: string;\n relevantFiles?: string[];\n environmentSnapshot?: Record<string, string>;\n },\n): ReplayGuidance {\n const guidance: ReplayGuidance = {\n correlationId,\n originalRunTimestamp: new Date().toISOString(),\n failedPhase,\n failureDescription,\n replaySteps: buildDefaultReplaySteps(failedPhase, options?.gitRef),\n environmentSnapshot: options?.environmentSnapshot ?? {},\n relevantFiles: options?.relevantFiles ?? [],\n gitRef: options?.gitRef,\n };\n\n return guidance;\n}\n\n/**\n * Build default replay steps for a given failed phase.\n *\n * These are generic steps that apply to any phase failure.\n * Callers can customise them after creation.\n */\nfunction buildDefaultReplaySteps(\n failedPhase: PhaseName,\n gitRef?: string,\n): ReplayStep[] {\n const steps: ReplayStep[] = [];\n let n = 1;\n\n if (gitRef) {\n steps.push({\n stepNumber: n++,\n instruction: `Checkout the exact git ref: git checkout ${gitRef}`,\n expectedOutcome: \"Working tree matches the state at time of failure.\",\n });\n }\n\n steps.push({\n stepNumber: n++,\n instruction:\n \"Ensure the environment matches the original run (see environmentSnapshot).\",\n expectedOutcome: \"All environment variables and config files are in place.\",\n });\n\n steps.push({\n stepNumber: n++,\n instruction: \"Install dependencies (npm install / equivalent).\",\n expectedOutcome: \"node_modules (or equivalent) is populated.\",\n });\n\n steps.push({\n stepNumber: n++,\n instruction: `Re-run the pipeline up to and including the \"${failedPhase}\" phase.`,\n expectedOutcome: \"The same failure should be reproducible.\",\n });\n\n steps.push({\n stepNumber: n++,\n instruction:\n \"Inspect the phase output and reasoning blocks for diagnostic clues.\",\n expectedOutcome: \"Root cause is identified or narrowed down.\",\n });\n\n return steps;\n}\n\n/**\n * Add a custom replay step to existing guidance.\n *\n * Returns a new ReplayGuidance with the step appended (immutable).\n */\nexport function addReplayStep(\n guidance: ReplayGuidance,\n instruction: string,\n expectedOutcome?: string,\n): ReplayGuidance {\n const nextStepNumber =\n guidance.replaySteps.length > 0\n ? guidance.replaySteps[guidance.replaySteps.length - 1].stepNumber + 1\n : 1;\n\n return {\n ...guidance,\n replaySteps: [\n ...guidance.replaySteps,\n {\n stepNumber: nextStepNumber,\n instruction,\n expectedOutcome,\n },\n ],\n };\n}\n\n/**\n * Format replay guidance as a human-readable string.\n *\n * Suitable for inclusion in error reports, logs, or developer output.\n */\nexport function formatReplayGuidance(guidance: ReplayGuidance): string {\n const lines: string[] = [\n `Replay Guidance for correlation ${guidance.correlationId}`,\n ` Failed phase: ${guidance.failedPhase}`,\n ` Failure: ${guidance.failureDescription}`,\n ` Original run: ${guidance.originalRunTimestamp}`,\n ];\n\n if (guidance.gitRef) {\n lines.push(` Git ref: ${guidance.gitRef}`);\n }\n\n if (guidance.relevantFiles.length > 0) {\n lines.push(` Relevant files: ${guidance.relevantFiles.join(\", \")}`);\n }\n\n const envKeys = Object.keys(guidance.environmentSnapshot);\n if (envKeys.length > 0) {\n lines.push(` Environment keys: ${envKeys.join(\", \")}`);\n }\n\n lines.push(\" Steps:\");\n for (const step of guidance.replaySteps) {\n lines.push(` ${step.stepNumber}. ${step.instruction}`);\n if (step.expectedOutcome) {\n lines.push(` -> ${step.expectedOutcome}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { fileURLToPath } from \"node:url\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { readManifest, writeManifest } from \"../../manifest/hatchJson.js\";\nimport {\n AGENTS_DIR,\n DEFAULT_FEATURES,\n HatchError,\n WORKTREE_CAPABLE_TOOLS,\n WORKTREE_INCLUDE_FILE,\n type ContentSelection,\n type Features,\n type HatchManifest,\n type Platform,\n type Tool,\n} from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n error as logError,\n step,\n label,\n warn,\n} from \"../shared/ui.js\";\nimport { runUpdate } from \"./update.js\";\nimport { archiveToolOutputs, removeManagedFilesForPaths, type MigrationNotice } from \"../../archive/index.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { readWorkspaceManifest, writeWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { detectSubRepos, detectWorkspaceContext } from \"../../workspace/detect.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport { detectRepoGitIdentity } from \"../../workspace/git.js\";\nimport { TOOL_DISPLAY_NAMES, TOOL_PROMPT_CHOICES, FEATURE_CHOICES, MCP_CHOICES, PLATFORM_DISPLAY_NAMES, PLATFORM_MCP_SERVER, sanitizeInput, isWSL } from \"../shared/constants.js\";\nimport {\n buildContentIndex,\n getAvailableItems,\n addContentItem,\n removeContentItem,\n countSelectionItems,\n selectionSummary,\n extractContentReferences,\n validateOrchestrationDependencies,\n TYPE_TO_SELECTION_KEY,\n} from \"../../content/index.js\";\nimport { generateCanonicalAgentsMd, generateRootAgentsMd } from \"../shared/agentsContent.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\ninterface ConfigDiff {\n addedTools: Tool[];\n removedTools: Tool[];\n addedMcp: string[];\n removedMcp: string[];\n enabledFeatures: (keyof Features)[];\n disabledFeatures: (keyof Features)[];\n platformChanged: boolean;\n repoChanged: boolean;\n addedContent: Array<{ type: string; id: string }>;\n removedContent: Array<{ type: string; id: string }>;\n}\n\nfunction computeDiff(\n oldManifest: HatchManifest,\n newTools: Tool[],\n newFeatures: Features,\n newMcp: string[],\n newPlatform: Platform,\n newOwner: string,\n newRepo: string,\n newNamespace: string,\n newProject: string,\n): ConfigDiff {\n const oldToolSet = new Set(oldManifest.tools);\n const newToolSet = new Set(newTools);\n const oldMcpSet = new Set(oldManifest.mcp.servers);\n const newMcpSet = new Set(newMcp);\n\n const enabledFeatures: (keyof Features)[] = [];\n const disabledFeatures: (keyof Features)[] = [];\n for (const key of Object.keys(DEFAULT_FEATURES) as (keyof Features)[]) {\n if (newFeatures[key] && !oldManifest.features[key]) enabledFeatures.push(key);\n if (!newFeatures[key] && oldManifest.features[key]) disabledFeatures.push(key);\n }\n\n return {\n addedTools: newTools.filter((t) => !oldToolSet.has(t)),\n removedTools: oldManifest.tools.filter((t) => !newToolSet.has(t)),\n addedMcp: newMcp.filter((s) => !oldMcpSet.has(s)),\n removedMcp: oldManifest.mcp.servers.filter((s) => !newMcpSet.has(s)),\n enabledFeatures,\n disabledFeatures,\n platformChanged: newPlatform !== oldManifest.platform,\n repoChanged:\n newOwner !== oldManifest.owner ||\n newRepo !== oldManifest.repo ||\n newNamespace !== oldManifest.namespace ||\n newProject !== oldManifest.project,\n addedContent: [],\n removedContent: [],\n };\n}\n\nfunction isDiffEmpty(diff: ConfigDiff): boolean {\n return (\n diff.addedTools.length === 0 &&\n diff.removedTools.length === 0 &&\n diff.addedMcp.length === 0 &&\n diff.removedMcp.length === 0 &&\n diff.enabledFeatures.length === 0 &&\n diff.disabledFeatures.length === 0 &&\n !diff.platformChanged &&\n !diff.repoChanged &&\n diff.addedContent.length === 0 &&\n diff.removedContent.length === 0\n );\n}\n\nfunction printCurrentConfig(manifest: HatchManifest): void {\n const platformLabel = manifest.platform\n ? `${PLATFORM_DISPLAY_NAMES[manifest.platform]} (${manifest.namespace || manifest.owner}/${manifest.project || manifest.repo})`\n : \"Not set\";\n const branch = manifest.board?.defaultBranch ?? \"main\";\n const enabledFeatures = Object.entries(manifest.features)\n .filter(([, v]) => v)\n .map(([k]) => k);\n const toolNames = manifest.tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \");\n\n const lines = [\n label(\"Platform\", platformLabel),\n label(\"Branch\", branch),\n label(\"Tools\", toolNames),\n label(\"Features\", enabledFeatures.join(\", \")),\n label(\"MCP\", manifest.mcp.servers.length > 0 ? manifest.mcp.servers.join(\", \") : \"none\"),\n ];\n\n if (manifest.content) {\n const total = countSelectionItems(manifest.content);\n lines.push(label(\"Content\", `${total} items (${selectionSummary(manifest.content)})`));\n }\n\n printBox(\"Current configuration\", lines, \"info\");\n}\n\nexport async function configCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n // Detect workspace context early to drive UI flow\n const wsContext = await detectWorkspaceContext(rootDir);\n\n if (wsContext.type === \"workspace-member\") {\n warn(\n `This repo is managed by workspace at ${wsContext.workspaceRoot}. ` +\n `Changes here may be overwritten on next workspace sync.`,\n );\n console.log();\n const { action } = await inquirer.prompt<{ action: string }>([\n {\n type: \"select\",\n name: \"action\",\n message: \"How would you like to proceed?\",\n choices: [\n { name: \"Configure this repo locally\", value: \"local\" },\n { name: \"Switch to workspace root config\", value: \"workspace\" },\n ],\n default: \"local\",\n },\n ]);\n if (action === \"workspace\") {\n info(`To configure the workspace, run: cd ${wsContext.workspaceRoot} && npx hatch3r config`);\n return;\n }\n }\n\n // Show workspace-aware header for workspace roots\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (wsContext.type === \"workspace-root\" && wsManifest) {\n const repoCount = wsManifest.repos.length;\n printBox(\n `Workspace configuration (${repoCount} repo${repoCount !== 1 ? \"s\" : \"\"})`,\n [\n label(\"Workspace\", wsManifest.name),\n label(\"Strategy\", wsManifest.syncStrategy),\n label(\"Repos\", wsManifest.repos.map((r) => r.name ?? r.path).join(\", \") || \"(none)\"),\n ],\n \"info\",\n );\n }\n\n printCurrentConfig(manifest);\n\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n // --- Platform ---\n const platformAnswer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"select\",\n name: \"platform\",\n message: \"Platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: manifest.platform ?? \"github\",\n },\n ]);\n const platform = platformAnswer.platform;\n\n // --- Repo identity ---\n let owner: string;\n let repo: string;\n let namespace: string;\n let project: string;\n\n if (platform === \"azure-devops\") {\n const adoAnswers = await inquirer.prompt<{ org: string; project: string; repo: string }>([\n { type: \"input\", name: \"org\", message: \"Azure DevOps organization:\", default: manifest.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Azure DevOps project:\", default: manifest.project || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: manifest.repo || undefined },\n ]);\n owner = sanitizeInput(adoAnswers.org);\n repo = sanitizeInput(adoAnswers.repo);\n namespace = owner;\n project = sanitizeInput(adoAnswers.project);\n } else if (platform === \"gitlab\") {\n const glAnswers = await inquirer.prompt<{ namespace: string; project: string }>([\n { type: \"input\", name: \"namespace\", message: \"GitLab namespace (group or username):\", default: manifest.namespace || manifest.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Project name:\", default: manifest.project || manifest.repo || undefined },\n ]);\n owner = sanitizeInput(glAnswers.namespace);\n repo = sanitizeInput(glAnswers.project);\n namespace = owner;\n project = repo;\n } else {\n const repoAnswers = await inquirer.prompt<{ owner: string; repo: string }>([\n { type: \"input\", name: \"owner\", message: \"GitHub owner (org or username):\", default: manifest.owner || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: manifest.repo || undefined },\n ]);\n owner = sanitizeInput(repoAnswers.owner);\n repo = sanitizeInput(repoAnswers.repo);\n namespace = owner;\n project = repo;\n }\n\n // --- Default branch ---\n const currentBranch = manifest.board?.defaultBranch ?? \"main\";\n const branchAnswer = await inquirer.prompt<{ defaultBranch: string }>([\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch (for checkout, PR base, release):\",\n default: currentBranch,\n },\n ]);\n const defaultBranch = branchAnswer.defaultBranch.trim() || currentBranch;\n\n // --- Tools ---\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: manifest.tools,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const tools = toolAnswers.tools;\n\n if (tools.length === 0) {\n logError(\"At least one tool must be selected.\");\n throw new HatchError(\"At least one tool must be selected.\", 1, \"VALIDATION_ERROR\");\n }\n\n // --- Features ---\n const currentFeatureKeys = (Object.keys(DEFAULT_FEATURES) as (keyof Features)[])\n .filter((k) => manifest.features[k]);\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features:\",\n choices: FEATURE_CHOICES,\n default: currentFeatureKeys,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n const features: Features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n // --- MCP servers ---\n let mcpServers: string[] = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: manifest.mcp.servers,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n // --- Worktree isolation ---\n const hasWorktreeTool = tools.some(t => WORKTREE_CAPABLE_TOOLS.has(t));\n if (hasWorktreeTool) {\n const wtAnswer = await inquirer.prompt<{ enabled: boolean }>([{\n type: \"confirm\",\n name: \"enabled\",\n message: \"Enable worktree file isolation (for parallel agent sessions)?\",\n default: manifest.worktree?.enabled ?? true,\n }]);\n manifest.worktree = {\n ...manifest.worktree,\n enabled: wtAnswer.enabled,\n };\n }\n\n // --- Content management ---\n const contentChanges: { added: Array<{ type: string; id: string }>; removed: Array<{ type: string; id: string }> } = { added: [], removed: [] };\n if (manifest.content) {\n const manageContent = await inquirer.prompt<{ manage: boolean }>([\n {\n type: \"confirm\",\n name: \"manage\",\n message: \"Manage content items?\",\n default: false,\n },\n ]);\n\n if (manageContent.manage) {\n // #145 (D19-16): Explain config vs .customize.yaml distinction\n info(\n chalk.dim(\"Config adds/removes content items. To customize an item's behavior without \") +\n chalk.dim(\"removing it, use .hatch3r/<type>/<id>.customize.yaml instead.\"),\n );\n console.log();\n\n const contentRoot = findPackageRoot(__dirname);\n const agentsDir = join(rootDir, AGENTS_DIR);\n const index = await buildContentIndex(contentRoot);\n\n // Build current installed set from manifest\n const currentIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) currentIds.add(id);\n }\n\n const contentAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items (space to toggle):\",\n choices: index.items.map((item) => ({\n name: `${item.type}: ${item.id.replace(/^(cmd-)?hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: currentIds.has(item.id),\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n\n const newIds = new Set(contentAnswer.items);\n\n // Identify removed items and warn about dependents (D19-6)\n const pendingRemovals: string[] = [];\n for (const id of currentIds) {\n if (!newIds.has(id)) pendingRemovals.push(id);\n }\n\n if (pendingRemovals.length > 0) {\n const dependencyWarnings: string[] = [];\n for (const removedId of pendingRemovals) {\n const dependents: string[] = [];\n for (const keepId of contentAnswer.items) {\n const keepItem = index.byId.get(keepId);\n if (!keepItem) continue;\n try {\n const filePath = keepItem.type === \"skill\"\n ? join(agentsDir, keepItem.relativePath, \"SKILL.md\")\n : join(agentsDir, keepItem.relativePath);\n const content = await readFile(filePath, \"utf-8\");\n const refs = extractContentReferences(content);\n if (refs.includes(removedId)) {\n dependents.push(keepId);\n }\n } catch {\n // File not readable, skip\n }\n }\n if (dependents.length > 0) {\n dependencyWarnings.push(\n `Removing \"${removedId}\" — referenced by: ${dependents.join(\", \")}`,\n );\n }\n }\n\n // Check orchestration dependencies with the proposed new selection\n const proposedSelection: ContentSelection = {\n ...manifest.content!,\n items: {\n agents: [], skills: [], rules: [], commands: [],\n prompts: [], hooks: [], githubAgents: [],\n },\n };\n for (const id of contentAnswer.items) {\n const proposedItem = index.byId.get(id);\n if (proposedItem) {\n const key = TYPE_TO_SELECTION_KEY[proposedItem.type];\n if (key) proposedSelection.items[key].push(proposedItem.id);\n }\n }\n const orchWarnings = validateOrchestrationDependencies(proposedSelection);\n dependencyWarnings.push(...orchWarnings);\n\n if (dependencyWarnings.length > 0) {\n console.log();\n warn(\"Dependency warnings for removed content:\");\n for (const w of dependencyWarnings) {\n console.log(chalk.dim(` ${w}`));\n }\n console.log();\n }\n }\n\n // Find added and removed items\n for (const id of contentAnswer.items) {\n if (!currentIds.has(id)) {\n const item = index.byId.get(id);\n if (item) {\n contentChanges.added.push({ type: item.type, id: item.id });\n await addContentItem(contentRoot, agentsDir, item);\n }\n }\n }\n for (const id of currentIds) {\n if (!newIds.has(id)) {\n const item = index.byId.get(id);\n if (item) {\n contentChanges.removed.push({ type: item.type, id: item.id });\n await removeContentItem(agentsDir, item, { rootDir });\n }\n }\n }\n\n // Update manifest content items\n const newItems: ContentSelection[\"items\"] = {\n agents: [], skills: [], rules: [], commands: [],\n prompts: [], hooks: [], githubAgents: [],\n };\n for (const id of contentAnswer.items) {\n const item = index.byId.get(id);\n if (item) {\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) newItems[key].push(item.id);\n }\n }\n manifest.content.items = newItems;\n\n // Regenerate canonical and root AGENTS.md after content changes\n if (contentChanges.added.length > 0 || contentChanges.removed.length > 0) {\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n const rootAgentsMd = await generateRootAgentsMd(agentsDir);\n await safeWriteFile(join(rootDir, \"AGENTS.md\"), rootAgentsMd.full, {\n managedContent: rootAgentsMd.inner,\n });\n }\n }\n }\n\n // --- Compute diff ---\n const diff = computeDiff(manifest, tools, features, mcpServers, platform, owner, repo, namespace, project);\n diff.addedContent = contentChanges.added;\n diff.removedContent = contentChanges.removed;\n\n if (isDiffEmpty(diff) && defaultBranch === currentBranch) {\n console.log();\n info(\"No changes detected.\");\n console.log();\n return;\n }\n\n // --- Archive removed tool outputs ---\n const allMigrations: MigrationNotice[] = [];\n const allArchivedFiles: string[] = [];\n const totalArchiveSteps = diff.removedTools.length;\n\n if (totalArchiveSteps > 0) {\n console.log();\n for (let i = 0; i < diff.removedTools.length; i++) {\n const tool = diff.removedTools[i];\n const s = createSpinner(\n step(i + 1, totalArchiveSteps, `Archiving ${TOOL_DISPLAY_NAMES[tool] ?? tool} output...`),\n );\n s.start();\n\n const result = await archiveToolOutputs(rootDir, tool);\n removeManagedFilesForPaths(manifest, result.archivedFiles);\n allArchivedFiles.push(...result.archivedFiles);\n allMigrations.push(...result.migrations);\n\n s.succeed(\n step(i + 1, totalArchiveSteps, `Archived ${result.archivedFiles.length} files from ${TOOL_DISPLAY_NAMES[tool] ?? tool}`),\n );\n }\n }\n\n // --- Apply changes to manifest ---\n manifest.platform = platform;\n manifest.owner = owner;\n manifest.repo = repo;\n manifest.namespace = namespace;\n manifest.project = project;\n manifest.tools = tools;\n manifest.features = features;\n manifest.mcp = { servers: mcpServers };\n\n if (manifest.board) {\n manifest.board.owner = owner;\n manifest.board.repo = repo;\n manifest.board.defaultBranch = defaultBranch;\n } else if (defaultBranch !== \"main\" || owner || repo) {\n manifest.board = {\n owner,\n repo,\n defaultBranch,\n projectNumber: null,\n statusFieldId: null,\n statusOptions: { backlog: null, ready: null, inProgress: null, inReview: null, done: null },\n labels: {\n types: [\"type:bug\", \"type:feature\", \"type:refactor\", \"type:qa\", \"type:docs\", \"type:infra\"],\n executors: [\"executor:agent\", \"executor:human\", \"executor:hybrid\"],\n statuses: [\"status:triage\", \"status:ready\", \"status:in-progress\", \"status:in-review\", \"status:blocked\"],\n meta: [\"meta:board-overview\"],\n },\n branchConvention: \"{type}/{short-description}\",\n areas: [],\n };\n }\n\n await writeManifest(rootDir, manifest);\n\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n managedContent: wtManaged,\n });\n }\n\n // --- Run full update (pull latest + copy templates + sync adapters) ---\n console.log();\n const updateResult = await runUpdate(rootDir, manifest);\n\n // --- Handle .env.mcp for new MCP servers ---\n if (features.mcp && mcpServers.length > 0) {\n try {\n const envResult = await ensureEnvMcp(rootDir, mcpServers);\n await ensureGitignoreEntry(rootDir);\n if (envResult.newVars.length > 0) {\n warn(`New secrets needed in .env.mcp: ${envResult.newVars.join(\", \")}`);\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\n } catch (err) {\n warn(`Could not update .env.mcp: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Print summary ---\n console.log();\n const summaryLines: string[] = [];\n\n if (diff.addedTools.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Tools added: ${diff.addedTools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")}`);\n }\n if (diff.removedTools.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Tools removed: ${diff.removedTools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")}`);\n }\n if (diff.addedMcp.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} MCP added: ${diff.addedMcp.join(\", \")}`);\n }\n if (diff.removedMcp.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} MCP removed: ${diff.removedMcp.join(\", \")}`);\n }\n if (diff.enabledFeatures.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Features enabled: ${diff.enabledFeatures.join(\", \")}`);\n }\n if (diff.disabledFeatures.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Features disabled: ${diff.disabledFeatures.join(\", \")}`);\n }\n if (diff.platformChanged) {\n summaryLines.push(`${chalk.yellow(\"~\")} Platform: ${PLATFORM_DISPLAY_NAMES[platform]}`);\n }\n if (diff.repoChanged) {\n summaryLines.push(`${chalk.yellow(\"~\")} Repo: ${namespace}/${project}`);\n }\n if (diff.addedContent.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Content added: ${diff.addedContent.length} item(s)`);\n }\n if (diff.removedContent.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Content removed: ${diff.removedContent.length} item(s)`);\n }\n if (defaultBranch !== currentBranch) {\n summaryLines.push(`${chalk.yellow(\"~\")} Default branch: ${defaultBranch}`);\n }\n\n summaryLines.push(\"\");\n summaryLines.push(label(\"Files\", `${updateResult.copiedFiles} canonical files updated`));\n summaryLines.push(label(\"Tools\", `${updateResult.syncedTools} tool(s) synced`));\n summaryLines.push(label(\"Version\", `v${updateResult.version}`));\n\n if (allArchivedFiles.length > 0) {\n summaryLines.push(\"\");\n summaryLines.push(label(\"Archived\", `${allArchivedFiles.length} files to .hatch3r-archive/`));\n }\n\n printBox(\"Config updated\", summaryLines, \"success\");\n\n if (allMigrations.length > 0) {\n console.log();\n info(\"Customizations migrated to .hatch3r/ (tool-agnostic):\");\n for (const m of allMigrations) {\n console.log(` ${chalk.dim(m.from)} ${chalk.cyan(\"→\")} ${m.to}`);\n }\n console.log();\n }\n\n // #146 (D19-17): Show migration guide when switching tools\n if (diff.addedTools.length > 0 || diff.removedTools.length > 0) {\n console.log();\n info(\"Tool migration notes:\");\n if (diff.removedTools.length > 0) {\n info(chalk.dim(` Removed tool output archived to .hatch3r-archive/ (recoverable).`));\n info(chalk.dim(` Customizations in .hatch3r/ are tool-agnostic and carry forward.`));\n }\n if (diff.addedTools.length > 0) {\n info(chalk.dim(` New tool output generated. Restart your editor to pick up changes.`));\n info(chalk.dim(` MCP secrets (.env.mcp) are shared across tools — no re-entry needed.`));\n }\n console.log();\n }\n\n // ── Workspace management ──────────────────────────────────────\n // Re-read workspace manifest in case it wasn't loaded earlier (e.g. standalone with workspace.json)\n const wsManifestFinal = wsManifest ?? await readWorkspaceManifest(rootDir);\n if (wsManifestFinal) {\n // Save workspace defaults when running at workspace root\n if (wsContext.type === \"workspace-root\") {\n wsManifestFinal.defaults.tools = tools;\n wsManifestFinal.defaults.features = features;\n wsManifestFinal.defaults.mcp = { servers: mcpServers };\n if (manifest.content) {\n wsManifestFinal.defaults.content = manifest.content;\n }\n if (platform) {\n wsManifestFinal.defaults.platform = platform;\n }\n }\n\n console.log();\n info(chalk.bold(\"Workspace configuration\"));\n const currentRepos = wsManifestFinal.repos.map((r) => r.path);\n console.log(chalk.dim(` Repos: ${currentRepos.join(\", \") || \"(none)\"}`));\n console.log(chalk.dim(` Sync strategy: ${wsManifestFinal.syncStrategy}`));\n\n const { manageWorkspace } = await inquirer.prompt<{ manageWorkspace: boolean }>([\n {\n type: \"confirm\",\n name: \"manageWorkspace\",\n message: \"Configure workspace settings?\",\n default: wsContext.type === \"workspace-root\",\n },\n ]);\n\n if (manageWorkspace) {\n // Scan for new repos\n const detectedRepos = await detectSubRepos(rootDir);\n const existingPaths = new Set(wsManifestFinal.repos.map((r) => r.path));\n const newRepos = detectedRepos.filter((r) => !existingPaths.has(r.path));\n\n if (newRepos.length > 0) {\n const { addRepos } = await inquirer.prompt<{ addRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"addRepos\",\n message: \"New repos detected. Add to workspace?\",\n choices: newRepos.map((r) => ({\n name: r.name,\n value: r.path,\n checked: false,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n for (const path of addRepos) {\n wsManifestFinal.repos.push({ path, name: path, sync: false });\n }\n }\n\n // Toggle sync per repo\n if (wsManifestFinal.repos.length > 0) {\n const { syncRepos } = await inquirer.prompt<{ syncRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"syncRepos\",\n message: \"Select repos to sync:\",\n choices: wsManifestFinal.repos.map((r) => ({\n name: r.name ?? r.path,\n value: r.path,\n checked: r.sync,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const syncSet = new Set(syncRepos);\n for (const repo of wsManifestFinal.repos) {\n repo.sync = syncSet.has(repo.path);\n }\n }\n\n // Per-repo git identity\n if (wsManifestFinal.repos.length > 0) {\n const { editIdentity } = await inquirer.prompt<{ editIdentity: string }>([\n {\n type: \"select\",\n name: \"editIdentity\",\n message: \"Repo git identities:\",\n choices: [\n { name: \"Keep current\", value: \"keep\" },\n { name: \"Re-detect all from git remotes\", value: \"detect\" },\n { name: \"Edit manually\", value: \"edit\" },\n ],\n default: \"keep\",\n },\n ]);\n\n if (editIdentity === \"detect\") {\n for (const repo of wsManifestFinal.repos) {\n const identity = detectRepoGitIdentity(join(rootDir, repo.path));\n repo.owner = identity.owner || undefined;\n repo.repo = identity.repo || undefined;\n repo.defaultBranch = identity.defaultBranch || undefined;\n repo.platform = identity.platform || undefined;\n }\n info(\"Re-detected git identities for all repos.\");\n } else if (editIdentity === \"edit\") {\n for (const repo of wsManifestFinal.repos) {\n console.log(chalk.bold(`\\n ${repo.name ?? repo.path}:`));\n const identity = await inquirer.prompt<{ owner: string; repo: string; defaultBranch: string }>([\n { type: \"input\", name: \"owner\", message: \" Owner:\", default: repo.owner || undefined },\n { type: \"input\", name: \"repo\", message: \" Repo:\", default: repo.repo || undefined },\n { type: \"input\", name: \"defaultBranch\", message: \" Default branch:\", default: repo.defaultBranch || \"main\" },\n ]);\n repo.owner = sanitizeInput(identity.owner) || undefined;\n repo.repo = sanitizeInput(identity.repo) || undefined;\n repo.defaultBranch = identity.defaultBranch.trim() || undefined;\n }\n }\n }\n\n // Sync strategy\n const { strategy } = await inquirer.prompt<{ strategy: \"manual\" | \"on-sync\" }>([\n {\n type: \"select\",\n name: \"strategy\",\n message: \"Sync strategy:\",\n choices: [\n { name: \"Manual — sync sub-repos only with --repos flag\", value: \"manual\" as const },\n { name: \"On sync — auto-sync sub-repos when running hatch3r sync\", value: \"on-sync\" as const },\n ],\n default: wsManifestFinal.syncStrategy,\n },\n ]);\n wsManifestFinal.syncStrategy = strategy;\n\n await writeWorkspaceManifest(rootDir, wsManifestFinal);\n\n // Offer to sync now\n const syncCount = wsManifestFinal.repos.filter((r) => r.sync).length;\n if (syncCount > 0) {\n const { syncNow } = await inquirer.prompt<{ syncNow: boolean }>([\n {\n type: \"confirm\",\n name: \"syncNow\",\n message: `Sync ${syncCount} repo(s) now?`,\n default: false,\n },\n ]);\n if (syncNow) {\n const wsSpinner = createSpinner(`Syncing ${syncCount} repo(s)...`);\n wsSpinner.start();\n const result = await syncWorkspaceRepos(rootDir, { onWarn: (msg) => warn(msg) });\n const succeeded = result.repos.filter((r) => r.action === \"synced\").length;\n wsSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n }\n } else if (wsContext.type === \"workspace-root\") {\n // Even without managing repos/sync, save workspace defaults\n await writeWorkspaceManifest(rootDir, wsManifestFinal);\n }\n }\n\n}\n","import { appendFile, readFile, stat, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport { checkContextBudget, formatBudgetWarning } from \"../../adapters/contextBudget.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport { AGENTS_DIR, HatchError, WORKTREE_INCLUDE_FILE, type GenerationMode } from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { readWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { detectWorkspaceContext } from \"../../workspace/detect.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport { generateCanonicalAgentsMd, generateRootAgentsMd } from \"../shared/agentsContent.js\";\nimport { verifyIntegrity, generateIntegrityManifest, writeIntegrityManifest } from \"../../integrity/index.js\";\nimport { pruneArchives } from \"../../archive/index.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport {\n createFailureLogEntry,\n formatLogEntry,\n shouldRotateLog,\n rotateLog,\n FAILURE_LOG_FILE,\n} from \"../../pipeline/failureLog.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n step,\n warn,\n setVerbose,\n verbose,\n} from \"../shared/ui.js\";\n\n/**\n * Check if docs/specs/ exists and whether spec files are older than\n * the most recent git commit, indicating they may be stale.\n */\nasync function checkSpecFreshness(rootDir: string): Promise<void> {\n const specsDir = join(rootDir, \"docs\", \"specs\");\n try {\n await stat(specsDir);\n } catch {\n return; // No specs directory — nothing to check\n }\n\n // Find the oldest spec file mtime\n let oldestSpecMtime = Date.now();\n try {\n const entries = await readdir(specsDir, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue;\n const parentPath = entry.parentPath ?? (entry as unknown as { path?: string }).path ?? specsDir;\n const fileStat = await stat(join(parentPath, entry.name));\n if (fileStat.mtimeMs < oldestSpecMtime) {\n oldestSpecMtime = fileStat.mtimeMs;\n }\n }\n } catch {\n return;\n }\n\n // Get the latest commit timestamp\n try {\n const commitDate = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%ct\"], { stdio: \"pipe\" })\n .toString()\n .trim();\n const latestCommitMs = parseInt(commitDate, 10) * 1000;\n\n if (latestCommitMs > oldestSpecMtime) {\n const daysSinceSpecUpdate = Math.floor((Date.now() - oldestSpecMtime) / (1000 * 60 * 60 * 24));\n if (daysSinceSpecUpdate > 7) {\n warn(\n `Project specs in docs/specs/ may be stale (oldest spec last modified ${daysSinceSpecUpdate} days ago). ` +\n `Consider running /project-spec to refresh.`,\n );\n }\n }\n } catch {\n // git not available or no commits — skip\n }\n}\n\n/**\n * Append a failure entry to the persistent failure log in .agents/.\n * Performs log rotation when the log exceeds 500KB.\n * Silently skips if the write fails (failure logging must not break sync).\n */\nasync function appendFailure(agentsDir: string, phase: string, error: unknown, tool?: string): Promise<void> {\n try {\n const logPath = join(agentsDir, FAILURE_LOG_FILE);\n const entry = createFailureLogEntry(phase, error, {\n tool,\n version: HATCH3R_VERSION,\n });\n const line = formatLogEntry(entry) + \"\\n\";\n\n // Check if rotation is needed before appending\n try {\n const existing = await readFile(logPath, \"utf-8\");\n if (shouldRotateLog(existing + line)) {\n const rotated = rotateLog(existing);\n await safeWriteFile(logPath, rotated + line);\n return;\n }\n } catch {\n // File does not exist yet — that is fine, appendFile will create it\n }\n\n await appendFile(logPath, line);\n } catch {\n // Failure logging must not break the sync command\n }\n}\n\n/**\n * Read a file's content, returning null if the file does not exist.\n */\nasync function readFileOrNull(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nexport async function syncCommand(\n opts: {\n repos?: string[] | true;\n dryRun?: boolean;\n diff?: boolean;\n force?: boolean;\n minimal?: boolean;\n verbose?: boolean;\n } = {},\n): Promise<void> {\n setVerbose(!!opts.verbose);\n printBanner(true);\n\n const rootDir = process.cwd();\n\n const wsContext = await detectWorkspaceContext(rootDir);\n if (wsContext.type === \"workspace-member\") {\n warn(\n `This repository appears to be managed by a workspace at ${wsContext.workspaceRoot ?? \"..\"}. ` +\n `Run ${chalk.cyan(\"hatch3r sync\")} from the workspace root to sync all repos.`,\n );\n }\n\n const agentsDir = join(rootDir, AGENTS_DIR);\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n const m = manifest;\n\n verbose(`Manifest loaded: ${m.tools.length} tool(s), ${Object.keys(m.features).filter(k => m.features[k as keyof typeof m.features]).length} feature(s)`);\n\n const integrityResults = await verifyIntegrity(agentsDir);\n const modified = integrityResults.filter((r) => r.status === \"modified\");\n const missing = integrityResults.filter((r) => r.status === \"missing\");\n if (modified.length > 0 || missing.length > 0) {\n warn(\"Integrity issues detected in canonical files:\");\n for (const r of modified) {\n warn(` MODIFIED: ${r.file}`);\n }\n for (const r of missing) {\n warn(` MISSING: ${r.file}`);\n }\n warn(\"These files may have been tampered with. Syncing will propagate their current content.\");\n console.log();\n }\n\n const results: { path: string; action: string }[] = [];\n const totalSteps = m.tools.length + 1;\n let currentStep = 0;\n\n // --diff: track file snapshots before and after generation\n const diffBefore = new Map<string, string | null>();\n const diffAfter = new Map<string, string | null>();\n\n if (opts.diff) {\n diffBefore.set(\"AGENTS.md\", await readFileOrNull(join(rootDir, \"AGENTS.md\")));\n diffBefore.set(`${AGENTS_DIR}/AGENTS.md`, await readFileOrNull(join(agentsDir, \"AGENTS.md\")));\n }\n\n const s1 = createSpinner(step(++currentStep, totalSteps, \"Syncing AGENTS.md...\"));\n s1.start();\n const rootAgentsMd = await generateRootAgentsMd(agentsDir);\n\n if (opts.dryRun) {\n results.push({ path: \"AGENTS.md\", action: \"dry-run\" });\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n results.push({ path: `${AGENTS_DIR}/AGENTS.md`, action: \"dry-run\" });\n if (opts.diff) {\n diffAfter.set(\"AGENTS.md\", rootAgentsMd.full);\n diffAfter.set(`${AGENTS_DIR}/AGENTS.md`, canonicalAgentsMd);\n }\n } else {\n const agentsMdResult = await safeWriteFile(join(rootDir, \"AGENTS.md\"), rootAgentsMd.full, {\n managedContent: rootAgentsMd.inner,\n });\n if (agentsMdResult.warning) warn(agentsMdResult.warning);\n results.push({ path: \"AGENTS.md\", action: agentsMdResult.action });\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n const canonicalResult = await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n if (canonicalResult.warning) warn(canonicalResult.warning);\n results.push({ path: `${AGENTS_DIR}/AGENTS.md`, action: canonicalResult.action });\n if (opts.diff) {\n diffAfter.set(\"AGENTS.md\", await readFileOrNull(join(rootDir, \"AGENTS.md\")));\n diffAfter.set(`${AGENTS_DIR}/AGENTS.md`, await readFileOrNull(join(agentsDir, \"AGENTS.md\")));\n }\n }\n s1.succeed(step(currentStep, totalSteps, opts.dryRun ? \"AGENTS.md (dry run)\" : \"AGENTS.md synced\"));\n\n const generationMode: GenerationMode = opts.minimal ? \"minimal\" : \"standard\";\n if (opts.minimal) {\n info(\"Minimal generation mode: output will be stripped-down to reduce token usage.\");\n }\n\n // #260 (D11-11.7): Track output paths across adapters to detect collisions.\n // Multiple adapters writing to the same file (e.g. Amp's AGENTS.md vs the\n // sync bridge's AGENTS.md) can cause silent overwrites.\n const outputPathOwners = new Map<string, string>();\n // Seed with sync bridge outputs\n outputPathOwners.set(\"AGENTS.md\", \"sync-bridge\");\n outputPathOwners.set(`${AGENTS_DIR}/AGENTS.md`, \"sync-bridge\");\n\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of m.tools) {\n const s = createSpinner(step(++currentStep, totalSteps, `Generating ${tool} output...`));\n s.start();\n try {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(agentsDir, m, generationMode);\n for (const w of adapter.warnings) { warn(w); }\n\n // #260 (D11-11.7): Detect output path collisions across adapters\n for (const out of outputs) {\n const existingOwner = outputPathOwners.get(out.path);\n if (existingOwner && existingOwner !== tool) {\n warn(`Output path collision: \"${out.path}\" written by both \"${existingOwner}\" and \"${tool}\". Last writer wins.`);\n }\n outputPathOwners.set(out.path, tool);\n }\n\n verbose(`${tool}: ${outputs.length} file(s) generated`);\n if (opts.dryRun) {\n // --dry-run: show what adapter would generate without writing files\n for (const out of outputs) {\n results.push({ path: out.path, action: \"dry-run\" });\n if (opts.diff) {\n diffBefore.set(out.path, await readFileOrNull(join(rootDir, out.path)));\n diffAfter.set(out.path, out.content);\n }\n }\n } else {\n for (const out of outputs) {\n if (opts.diff) {\n diffBefore.set(out.path, await readFileOrNull(join(rootDir, out.path)));\n }\n const fullPath = join(rootDir, out.path);\n if (out.managedContent) {\n const result = await safeWriteFile(fullPath, out.content, {\n managedContent: out.managedContent,\n });\n if (result.warning) warn(result.warning);\n verbose(`${out.path}: ${result.action}`);\n results.push({ path: out.path, action: result.action });\n } else {\n const result = await safeWriteFile(fullPath, out.content);\n if (result.warning) warn(result.warning);\n verbose(`${out.path}: ${result.action}`);\n results.push({ path: out.path, action: result.action });\n }\n if (opts.diff) {\n diffAfter.set(out.path, await readFileOrNull(join(rootDir, out.path)));\n }\n }\n }\n // Check context budget utilization for this adapter\n const budgetResult = checkContextBudget(tool, outputs);\n const budgetWarning = formatBudgetWarning(budgetResult);\n if (budgetWarning) { warn(budgetWarning); }\n\n s.succeed(step(currentStep, totalSteps, opts.dryRun\n ? `${tool} output (dry run: ${outputs.length} file(s))`\n : `${tool} output generated`));\n } catch (err) {\n s.fail(step(currentStep, totalSteps, `Failed to generate ${tool} output`));\n adapterFailures.push({\n tool,\n error: err instanceof Error ? err.message : String(err),\n });\n // Record to persistent failure log for post-hoc debugging\n await appendFailure(agentsDir, \"sync:adapter-generate\", err, tool);\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === m.tools.length) {\n throw new HatchError(\"All adapters failed\", 1, \"ADAPTER_ERROR\");\n }\n // #253 (D8-8.20): Partial adapter failures should not silently report success.\n // We continue to generate a summary but track that partial failure occurred.\n warn(`${adapterFailures.length} of ${m.tools.length} adapter(s) failed. Output may be incomplete.`);\n }\n\n for (const tool of m.tools) {\n const warnings = getUnsupportedFeatureWarnings(tool, m);\n for (const w of warnings) {\n warn(w);\n }\n }\n\n if (!opts.dryRun) {\n // Regenerate .worktreeinclude\n if (m.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(m, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n const wtResult = await safeWriteFile(\n join(rootDir, WORKTREE_INCLUDE_FILE),\n wtContent,\n { managedContent: wtManaged },\n );\n if (wtResult.warning) warn(wtResult.warning);\n results.push({ path: WORKTREE_INCLUDE_FILE, action: wtResult.action });\n }\n\n if (m.features.mcp && m.mcp.servers.length > 0) {\n const envResult = await ensureEnvMcp(rootDir, m.mcp.servers);\n await ensureGitignoreEntry(rootDir);\n if (envResult.action !== \"skipped\") {\n results.push({ path: envResult.path, action: envResult.action });\n }\n if (envResult.newVars.length > 0) {\n warn(\n `New secrets needed in .env.mcp: ${envResult.newVars.join(\", \")}`,\n );\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\n }\n\n // #259 (D11-11.6): Only regenerate integrity manifest on full sync success.\n // Writing a manifest after partial adapter failure would certify incomplete\n // output, masking missing files in subsequent integrity checks.\n if (adapterFailures.length === 0) {\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n } else {\n warn(\"Integrity manifest not updated due to adapter failures. Re-run sync after resolving errors.\");\n }\n\n // Prune stale archive entries\n await pruneArchives(rootDir);\n\n // Check spec freshness\n await checkSpecFreshness(rootDir);\n\n // #267 (D11-11.14): Detect orphaned .customize.md files at sync time.\n // When content is removed from the manifest, customization files become\n // orphaned and should be flagged so users can clean them up.\n if (m.content) {\n const allContentIds = new Set<string>();\n for (const ids of Object.values(m.content.items)) {\n for (const id of ids) allContentIds.add(id);\n }\n const CUSTOMIZE_DIRS = [\"agents\", \"commands\", \"skills\", \"rules\"];\n for (const dir of CUSTOMIZE_DIRS) {\n try {\n const files = await readdir(join(rootDir, \".hatch3r\", dir));\n for (const f of files.filter(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n const itemId = f.replace(/\\.customize\\.(yaml|md)$/, \"\");\n const prefixed = `hatch3r-${itemId}`;\n if (!allContentIds.has(itemId) && !allContentIds.has(prefixed) &&\n !allContentIds.has(`cmd-${itemId}`) && !allContentIds.has(`cmd-${prefixed}`)) {\n warn(`Orphaned customization: .hatch3r/${dir}/${f} — content no longer in manifest. Consider removing it.`);\n }\n }\n } catch {\n // .hatch3r/{dir} does not exist — no customizations to check\n }\n }\n }\n }\n\n console.log();\n\n const icons: Record<string, string> = {\n created: chalk.green(\"+\"),\n updated: chalk.yellow(\"~\"),\n skipped: chalk.dim(\"=\"),\n \"dry-run\": chalk.cyan(\"?\"),\n };\n\n const summaryLines = results.map((r) => {\n const icon = icons[r.action] ?? chalk.dim(\" \");\n return `${icon} ${r.path} ${chalk.dim(`(${r.action})`)}`;\n });\n\n // --diff: show file change summary\n if (opts.diff && diffBefore.size > 0) {\n const diffLines: string[] = [];\n for (const [filePath] of diffBefore) {\n const before = diffBefore.get(filePath) ?? null;\n const after = diffAfter.get(filePath) ?? null;\n if (before === null && after !== null) {\n diffLines.push(`${chalk.green(\"+ added\")} ${filePath}`);\n } else if (before !== null && after !== null && before !== after) {\n diffLines.push(`${chalk.yellow(\"~ modified\")} ${filePath}`);\n } else if (before !== null && after !== null && before === after) {\n diffLines.push(`${chalk.dim(\"= unchanged\")} ${filePath}`);\n }\n }\n if (diffLines.length > 0) {\n printBox(\"Diff summary\", diffLines, \"info\");\n console.log();\n }\n }\n\n const boxTitle = opts.dryRun\n ? \"Sync dry run complete\"\n : adapterFailures.length > 0 ? \"Sync complete (with warnings)\" : \"Sync complete\";\n\n printBox(\n boxTitle,\n summaryLines,\n opts.dryRun ? \"info\" : adapterFailures.length > 0 ? \"info\" : \"success\",\n );\n\n // Dry-run: skip error throwing and return before workspace cascade\n // (workspace sync has its own dry-run handling below)\n if (opts.dryRun) return;\n\n // #253 (D8-8.20): Exit non-zero on partial adapter failure\n // so CI pipelines can detect incomplete syncs.\n if (adapterFailures.length > 0) {\n throw new HatchError(\n `Sync completed with ${adapterFailures.length} adapter failure(s)`,\n 2,\n \"ADAPTER_ERROR\",\n );\n }\n\n // ── Workspace sync cascade ────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (!wsManifest) return;\n\n const syncReposRequested = opts.repos !== undefined;\n const syncOnSync = wsManifest.syncStrategy === \"on-sync\";\n const syncableCount = wsManifest.repos.filter((r) => r.sync).length;\n\n if (!syncReposRequested && !syncOnSync) {\n if (syncableCount > 0) {\n info(`Workspace: ${syncableCount} repo(s) available for sync. Run ${chalk.bold(\"hatch3r sync --repos\")} to propagate.`);\n }\n return;\n }\n\n // Determine which repos to sync\n const repoPaths = Array.isArray(opts.repos) ? opts.repos : undefined;\n\n console.log();\n const wsSpinner = createSpinner(\n `Syncing workspace to ${repoPaths ? repoPaths.length : syncableCount} repo(s)...`,\n );\n wsSpinner.start();\n\n const wsResult = await syncWorkspaceRepos(rootDir, {\n repos: repoPaths,\n dryRun: opts.dryRun,\n force: opts.force,\n onWarn: (msg) => warn(msg),\n });\n\n const succeeded = wsResult.repos.filter((r) => r.action === \"synced\").length;\n const failed = wsResult.repos.filter((r) => r.action === \"error\").length;\n\n if (failed > 0) {\n wsSpinner.warn(`Workspace sync: ${succeeded} synced, ${failed} failed`);\n for (const r of wsResult.repos.filter((r) => r.action === \"error\")) {\n logError(` ${r.path}: ${r.error}`);\n }\n } else {\n wsSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n}\n","import type { AdapterOutput, Tool } from \"../types.js\";\n\n/**\n * Per-adapter context budget in tokens. Based on each platform's documented\n * context window for rules/instructions input. These are conservative\n * estimates of how much instruction content each platform can accept\n * before degrading performance or truncating.\n *\n * Sources (as of 2026-04):\n * - Claude Code: 200K context window\n * - Cursor: ~120K effective for rules (model context shared with codebase)\n * - Copilot: ~64K instruction budget (shared with workspace context)\n * - Windsurf: ~128K context window\n * - Codex: 200K context window\n * - Gemini: 200K context window (Gemini 2.5 Pro)\n * - Cline: ~128K (depends on model, conservative estimate)\n * - Amp: ~128K context window\n * - OpenCode: ~128K (model-dependent)\n * - Aider: ~64K (CLI-based, model-dependent)\n * - Kiro: ~128K context window\n * - Goose: ~128K context window\n * - Zed: ~64K (minimal adapter, limited instruction surface)\n * - Amazon Q: ~128K context window\n * - Antigravity: ~128K context window\n */\nexport const CONTEXT_BUDGET_TOKENS: Record<Tool, number> = {\n claude: 200_000,\n cursor: 120_000,\n copilot: 64_000,\n windsurf: 128_000,\n codex: 200_000,\n gemini: 200_000,\n cline: 128_000,\n amp: 128_000,\n opencode: 128_000,\n aider: 64_000,\n kiro: 128_000,\n goose: 128_000,\n zed: 64_000,\n \"amazon-q\": 128_000,\n antigravity: 128_000,\n \"agents-md\": 200_000,\n};\n\n/**\n * Estimate token count from a character count.\n * Uses the standard rough approximation: 1 token ~ 4 characters.\n */\nexport function estimateTokens(charCount: number): number {\n return Math.ceil(charCount / 4);\n}\n\nexport interface ContextBudgetResult {\n tool: Tool;\n estimatedTokens: number;\n budgetTokens: number;\n exceedsBudget: boolean;\n /** Percentage of budget used (0-100+). */\n utilizationPercent: number;\n}\n\n/**\n * Check whether the generated output for a tool exceeds its context budget.\n * Returns a result object with utilization details.\n */\nexport function checkContextBudget(\n tool: Tool,\n outputs: AdapterOutput[],\n): ContextBudgetResult {\n const budgetTokens = CONTEXT_BUDGET_TOKENS[tool];\n let totalChars = 0;\n for (const out of outputs) {\n totalChars += out.content.length;\n }\n const estimatedTokens = estimateTokens(totalChars);\n const utilizationPercent = Math.round((estimatedTokens / budgetTokens) * 100);\n\n return {\n tool,\n estimatedTokens,\n budgetTokens,\n exceedsBudget: estimatedTokens > budgetTokens,\n utilizationPercent,\n };\n}\n\n/**\n * Format a context budget warning message for display.\n * Returns null if the budget is not exceeded.\n */\nexport function formatBudgetWarning(result: ContextBudgetResult): string | null {\n if (!result.exceedsBudget) return null;\n\n const estK = Math.round(result.estimatedTokens / 1000);\n const budgetK = Math.round(result.budgetTokens / 1000);\n\n return (\n `${result.tool}: generated output is ~${estK}K tokens, ` +\n `exceeding the estimated ${budgetK}K token context budget (${result.utilizationPercent}% utilization). ` +\n `Consider using a smaller content preset or disabling unused features to reduce output size.`\n );\n}\n","import { readdir, readFile, access } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, posix } from \"node:path\";\nimport chalk from \"chalk\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { isValidHookEvent } from \"../../hooks/types.js\";\nimport { AGENTS_DIR, HATCH3R_PREFIX, HatchError } from \"../../types.js\";\nimport type { HatchManifest } from \"../../types.js\";\nimport { scanForDeniedPatterns } from \"../../adapters/customization.js\";\nimport { buildContentIndex, validateCrossReferences, validateOrchestrationDependencies } from \"../../content/index.js\";\nimport { validateLearningsDirectory } from \"../../content/learningsValidation.js\";\nimport { readCustomizationWithWarnings } from \"../../models/customize.js\";\nimport type { CustomizableType } from \"../../models/customize.js\";\nimport { parseEnvFile } from \"../../env/mcpEnv.js\";\nimport { detectSecrets } from \"../../env/secretDetection.js\";\nimport { runComplianceChecks, formatComplianceReport } from \"../../pipeline/complianceVerification.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n warn,\n info,\n setVerbose,\n verbose,\n} from \"../shared/ui.js\";\n\n// Default fallback set; overridden by manifest.content when available\nconst DEFAULT_KNOWN_AGENTS = new Set([\n \"hatch3r-a11y-auditor\", \"hatch3r-architect\", \"hatch3r-ci-watcher\", \"hatch3r-context-rules\",\n \"hatch3r-dependency-auditor\", \"hatch3r-devops\", \"hatch3r-docs-writer\", \"hatch3r-fixer\",\n \"hatch3r-implementer\", \"hatch3r-learnings-loader\", \"hatch3r-lint-fixer\", \"hatch3r-perf-profiler\",\n \"hatch3r-researcher\", \"hatch3r-reviewer\", \"hatch3r-security-auditor\", \"hatch3r-test-writer\",\n]);\n\ninterface ValidationResult {\n errors: string[];\n warnings: string[];\n}\n\nconst CUSTOMIZATION_TYPES = [\n { dir: \"agents\", canonical: \"agents\" },\n { dir: \"commands\", canonical: \"commands\" },\n { dir: \"skills\", canonical: \"skills\" },\n { dir: \"rules\", canonical: \"rules\" },\n];\n\nasync function validateManifest(\n rootDir: string,\n manifest: HatchManifest | null,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest) {\n result.errors.push(\"Missing .agents/hatch.json manifest\");\n return;\n }\n if (!manifest.version) result.errors.push(\"hatch.json: missing 'version' field\");\n if (!manifest.tools || manifest.tools.length === 0) result.warnings.push(\"hatch.json: no tools configured\");\n\n for (const managedFile of manifest.managedFiles ?? []) {\n try {\n await access(join(rootDir, managedFile));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Managed file missing from disk: ${managedFile}`);\n }\n }\n}\n\nasync function validateDirectories(\n agentsDir: string,\n result: ValidationResult,\n): Promise<void> {\n const requiredDirs = [\"agents\", \"skills\", \"rules\"];\n const optionalDirs = [\"commands\", \"prompts\", \"mcp\", \"policy\", \"github-agents\"];\n\n for (const dir of requiredDirs) {\n try {\n await access(join(agentsDir, dir));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.errors.push(`Required directory missing: .agents/${dir}/`);\n }\n }\n\n for (const dir of optionalDirs) {\n try {\n await access(join(agentsDir, dir));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Optional directory missing: .agents/${dir}/`);\n }\n }\n}\n\nasync function validateFrontmatter(\n agentsDir: string,\n result: ValidationResult,\n): Promise<void> {\n const requiredDirs = [\"agents\", \"skills\", \"rules\"];\n const optionalDirs = [\"commands\", \"prompts\", \"mcp\", \"policy\", \"github-agents\"];\n\n for (const dir of [...requiredDirs, ...optionalDirs]) {\n const dirPath = join(agentsDir, dir);\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const filePath = join(dirPath, entry.name);\n const content = await readFile(filePath, \"utf-8\");\n if (!content.startsWith(\"---\")) {\n result.warnings.push(`Missing frontmatter: .agents/${dir}/${entry.name}`);\n } else {\n const endIdx = content.indexOf(\"---\", 3);\n if (endIdx === -1) {\n result.errors.push(`Invalid frontmatter (no closing ---): .agents/${dir}/${entry.name}`);\n } else {\n const frontmatter = content.slice(3, endIdx).trim();\n const parsedFm = parseYaml(frontmatter) as Record<string, unknown> | null;\n if (!parsedFm || typeof parsedFm !== \"object\" || !parsedFm.id) {\n result.warnings.push(`Missing 'id' in frontmatter: .agents/${dir}/${entry.name}`);\n }\n if (!parsedFm || typeof parsedFm !== \"object\" || !parsedFm.type) {\n result.warnings.push(`Missing 'type' in frontmatter: .agents/${dir}/${entry.name}`);\n }\n }\n }\n } else if (entry.isDirectory()) {\n const skillPath = join(dirPath, entry.name, \"SKILL.md\");\n try {\n await access(skillPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Skill directory missing SKILL.md: .agents/${dir}/${entry.name}/`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n\n try {\n await access(join(agentsDir, \"AGENTS.md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(\"Missing .agents/AGENTS.md\");\n }\n}\n\nasync function validateManagedFilePrefixes(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n for (const managedFile of manifest.managedFiles ?? []) {\n const fileName = posix.basename(managedFile) || \"\";\n const isSharedFile = [\"AGENTS.md\", \"CLAUDE.md\", \"copilot-instructions.md\", \".windsurfrules\", \"mcp.json\", \"opencode.json\", \".mcp.json\", \"copilot-setup-steps.yml\", \"settings.json\"].some(\n (sf) => fileName === sf || managedFile.endsWith(sf),\n );\n if (!isSharedFile && !fileName.startsWith(HATCH3R_PREFIX) && !fileName.startsWith(\".\")) {\n result.warnings.push(`Managed file without hatch3r- prefix: ${managedFile}`);\n }\n }\n}\n\nasync function validateHooks(\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.features.hooks) return;\n\n const hooksDir = join(agentsDir, \"hooks\");\n try {\n const hookFiles = await readdir(hooksDir);\n const mdHooks = hookFiles.filter(f => f.endsWith(\".md\"));\n if (mdHooks.length === 0) {\n result.warnings.push(\"Hooks feature enabled but no hook definitions found in .agents/hooks/\");\n }\n\n let agentFiles: Set<string> | undefined;\n try {\n const agentEntries = await readdir(join(agentsDir, \"agents\"));\n agentFiles = new Set(agentEntries.filter(f => f.endsWith(\".md\")));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n for (const hookFile of mdHooks) {\n const hookContent = await readFile(join(hooksDir, hookFile), \"utf-8\");\n if (!hookContent.startsWith(\"---\")) {\n result.warnings.push(`Hook missing frontmatter: .agents/hooks/${hookFile}`);\n continue;\n }\n const endIdx = hookContent.indexOf(\"---\", 3);\n if (endIdx === -1) continue;\n const fm = parseYaml(hookContent.slice(3, endIdx).trim()) as Record<string, unknown> | null;\n if (fm?.event && typeof fm.event === \"string\") {\n if (!isValidHookEvent(fm.event)) {\n result.errors.push(`Hook \"${hookFile}\" has invalid event \"${fm.event}\". Valid events: pre-commit, post-merge, ci-failure, file-save, session-start, pre-push`);\n }\n }\n if (fm?.agent && typeof fm.agent === \"string\" && agentFiles) {\n const agentName = typeof fm.agent === \"string\" && fm.agent.startsWith(HATCH3R_PREFIX)\n ? fm.agent\n : `${HATCH3R_PREFIX}${fm.agent}`;\n const expectedFile = `${agentName}.md`;\n if (!agentFiles.has(expectedFile)) {\n result.errors.push(`Hook \"${hookFile}\" references agent \"${fm.agent}\" but .agents/agents/${expectedFile} does not exist`);\n }\n // Build known agents set from manifest content or fallback\n const knownAgents = manifest.content\n ? new Set(manifest.content.items.agents)\n : DEFAULT_KNOWN_AGENTS;\n if (!knownAgents.has(agentName)) {\n result.warnings.push(`Hook \"${hookFile}\" references agent \"${fm.agent}\" which is not in the standard hatch3r agent roster`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(\"Hooks feature enabled but .agents/hooks/ directory not found\");\n }\n}\n\nasync function validateMcp(\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.features.mcp || manifest.mcp.servers.length === 0) return;\n\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n try {\n const mcpContent = await readFile(mcpPath, \"utf-8\");\n const mcpParsed = JSON.parse(mcpContent);\n if (!mcpParsed.mcpServers || typeof mcpParsed.mcpServers !== \"object\") {\n result.errors.push(\"MCP config missing 'mcpServers' key\");\n }\n } catch (err) {\n if (err instanceof SyntaxError) {\n result.errors.push(\"Invalid JSON in .agents/mcp/mcp.json\");\n } else {\n result.warnings.push(\"MCP servers configured but .agents/mcp/mcp.json not found\");\n }\n }\n}\n\nasync function validateModels(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.models) return;\n\n if (manifest.models.default && typeof manifest.models.default !== \"string\") {\n result.errors.push(\"hatch.json: models.default must be a string\");\n }\n if (manifest.models.agents) {\n for (const [agentId, model] of Object.entries(manifest.models.agents)) {\n if (typeof model !== \"string\") {\n result.errors.push(`hatch.json: models.agents.${agentId} must be a string`);\n }\n }\n }\n}\n\nasync function validateCostTracking(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.costTracking) return;\n\n const ct = manifest.costTracking;\n if (ct.sessionBudget !== undefined && ct.sessionBudget <= 0) {\n result.warnings.push(\"hatch.json: costTracking.sessionBudget should be a positive number\");\n }\n if (ct.issueBudget !== undefined && ct.issueBudget <= 0) {\n result.warnings.push(\"hatch.json: costTracking.issueBudget should be a positive number\");\n }\n if (ct.epicBudget !== undefined && ct.epicBudget <= 0) {\n result.warnings.push(\"hatch.json: costTracking.epicBudget should be a positive number\");\n }\n if (ct.warningThresholds) {\n for (const t of ct.warningThresholds) {\n if (t < 0 || t > 1) {\n result.warnings.push(`hatch.json: costTracking.warningThresholds values should be between 0 and 1, got ${t}`);\n }\n }\n }\n}\n\n/**\n * Validate .customize.yaml files for syntax and known field usage.\n * Checks that YAML parses correctly, uses only recognized fields,\n * and that field values have the expected types.\n */\nasync function validateCustomizeYaml(\n rootDir: string,\n result: ValidationResult,\n): Promise<void> {\n const VALID_FIELDS = new Set([\"model\", \"scope\", \"description\", \"enabled\"]);\n const FIELD_TYPES: Record<string, string> = {\n model: \"string\",\n scope: \"string\",\n description: \"string\",\n enabled: \"boolean\",\n };\n\n for (const { dir } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n let files: string[];\n try {\n files = await readdir(customDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n const yamlFiles = files.filter(f => f.endsWith(\".customize.yaml\"));\n for (const file of yamlFiles) {\n const filePath = join(customDir, file);\n const itemId = file.replace(\".customize.yaml\", \"\");\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n\n // Check size limit (same as customize.ts: 10KB)\n if (Buffer.byteLength(raw, \"utf-8\") > 10_240) {\n result.warnings.push(\n `.customize.yaml for \"${itemId}\" exceeds 10KB limit and will be skipped during generation`,\n );\n continue;\n }\n\n // Check YAML syntax\n let parsed: Record<string, unknown> | null;\n try {\n parsed = parseYaml(raw) as Record<string, unknown> | null;\n } catch {\n result.errors.push(\n `Invalid YAML syntax in .hatch3r/${dir}/${file}`,\n );\n continue;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n result.warnings.push(\n `.customize.yaml for \"${itemId}\" is empty or not an object`,\n );\n continue;\n }\n\n // Check for unknown fields\n for (const key of Object.keys(parsed)) {\n if (!VALID_FIELDS.has(key)) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: unknown field \"${key}\" (valid: ${[...VALID_FIELDS].join(\", \")})`,\n );\n }\n }\n\n // Check field types\n for (const [key, expectedType] of Object.entries(FIELD_TYPES)) {\n if (key in parsed && parsed[key] !== undefined && parsed[key] !== null) {\n const actualType = typeof parsed[key];\n if (actualType !== expectedType) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: field \"${key}\" should be ${expectedType} but is ${actualType}`,\n );\n }\n }\n }\n\n // Run denied-pattern scan on all free-text string fields\n for (const field of [\"description\", \"scope\", \"model\"] as const) {\n const value = parsed[field];\n if (typeof value === \"string\") {\n const violations = scanForDeniedPatterns(value);\n for (const v of violations) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: field \"${field}\" contains denied pattern: ${v}`,\n );\n }\n }\n }\n\n // Validate the customization through the canonical reader for deeper checks\n const type = dir as CustomizableType;\n const readResult = await readCustomizationWithWarnings(rootDir, type, itemId);\n for (const w of readResult.warnings) {\n result.warnings.push(w);\n }\n }\n }\n}\n\nasync function validateCustomizations(\n rootDir: string,\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n for (const { dir, canonical } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n try {\n const customFiles = await readdir(customDir);\n for (const file of customFiles) {\n if (file.endsWith(\".customize.yaml\")) {\n const itemId = file.replace(\".customize.yaml\", \"\");\n const canonicalPath = canonical === \"skills\"\n ? join(agentsDir, canonical, itemId)\n : join(agentsDir, canonical, `${itemId}.md`);\n try {\n await access(canonicalPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Customization file for non-existent ${canonical.slice(0, -1)}: .hatch3r/${dir}/${file}`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n}\n\nasync function validateContentConsistency(\n rootDir: string,\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n // Content consistency: manifest items vs disk\n if (manifest.content) {\n const contentDirs: Record<keyof typeof manifest.content.items, { dir: string; strategy: \"glob\" | \"subdir\" }> = {\n agents: { dir: \"agents\", strategy: \"glob\" },\n skills: { dir: \"skills\", strategy: \"subdir\" },\n rules: { dir: \"rules\", strategy: \"glob\" },\n commands: { dir: \"commands\", strategy: \"glob\" },\n prompts: { dir: \"prompts\", strategy: \"glob\" },\n hooks: { dir: \"hooks\", strategy: \"glob\" },\n githubAgents: { dir: \"github-agents\", strategy: \"glob\" },\n };\n for (const [key, cfg] of Object.entries(contentDirs)) {\n const ids = manifest.content.items[key as keyof typeof manifest.content.items];\n for (const id of ids) {\n const checkPath = cfg.strategy === \"subdir\"\n ? join(agentsDir, cfg.dir, id, \"SKILL.md\")\n : join(agentsDir, cfg.dir, `${id}.md`);\n try {\n await access(checkPath);\n } catch {\n result.warnings.push(`Content \"${id}\" (${key}) in manifest but missing from .agents/${cfg.dir}/`);\n }\n }\n }\n\n // Orphaned customize files\n const allContentIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) allContentIds.add(id);\n }\n for (const { dir } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n try {\n const files = await readdir(customDir);\n for (const f of files.filter(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n const itemId = f.replace(/\\.customize\\.(yaml|md)$/, \"\");\n if (!allContentIds.has(itemId) && !allContentIds.has(`${HATCH3R_PREFIX}${itemId}`) && !allContentIds.has(`cmd-${itemId}`) && !allContentIds.has(`cmd-${HATCH3R_PREFIX}${itemId}`)) {\n result.warnings.push(`Orphaned customization: .hatch3r/${dir}/${f} (content not in manifest)`);\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n\n // Validate learnings: schema, size, encoding, and denied patterns (#19 D15/D6)\n const learningsDir = join(agentsDir, \"learnings\");\n const learningsResult = await validateLearningsDirectory(learningsDir);\n for (const e of learningsResult.errors) {\n result.errors.push(e);\n }\n for (const w of learningsResult.warnings) {\n result.warnings.push(w);\n }\n}\n\nexport async function validateDocsCounts(rootDir: string): Promise<{ mismatches: string[]; checked: number }> {\n const mismatches: string[] = [];\n let checked = 0;\n\n const actual: Record<string, number> = {};\n const dirs: [string, string, (e: string) => boolean][] = [\n [\"adapters\", join(rootDir, \"src/adapters\"), (e) => e.endsWith(\".ts\") && ![\"base.ts\", \"index.ts\", \"canonical.ts\", \"customization.ts\", \"types.ts\", \"mcp-utils.ts\", \"toml-utils.ts\", \"contextBudget.ts\", \"agentsmd.ts\"].includes(e)],\n [\"commands\", join(rootDir, \"src/cli/commands\"), (e) => e.endsWith(\".ts\")],\n [\"agents\", join(rootDir, \"agents\"), (e) => e.endsWith(\".md\")],\n [\"skills\", join(rootDir, \"skills\"), (e) => true],\n [\"rules\", join(rootDir, \"rules\"), (e) => e.endsWith(\".md\")],\n [\"hooks\", join(rootDir, \"hooks\"), (e) => e.endsWith(\".md\")],\n ];\n\n for (const [name, dir, filter] of dirs) {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n if (name === \"skills\") {\n actual[name] = entries.filter(e => e.isDirectory()).length;\n } else {\n actual[name] = entries.filter(e => e.isFile() && filter(e.name)).length;\n }\n } catch { actual[name] = 0; }\n }\n\n const readmePath = join(rootDir, \"README.md\");\n try {\n const readme = await readFile(readmePath, \"utf-8\");\n const countPatterns: [string, RegExp][] = [\n [\"adapters\", /(\\d+)\\s+Adapters/i],\n [\"skills\", /(\\d+)\\s+skills/i],\n [\"rules\", /(\\d+)\\s+rules/i],\n ];\n for (const [name, pattern] of countPatterns) {\n const match = readme.match(pattern);\n if (match) {\n checked++;\n const documented = parseInt(match[1], 10);\n if (documented !== actual[name]) {\n mismatches.push(`${name}: README says ${documented}, actual is ${actual[name]}`);\n }\n }\n }\n } catch { /* README not found */ }\n\n return { mismatches, checked };\n}\n\nexport async function validateCommand(opts?: { docs?: boolean; verbose?: boolean }): Promise<void> {\n setVerbose(!!opts?.verbose);\n printBanner(true);\n\n const rootDir = process.cwd();\n\n if (opts?.docs) {\n const spinner = createSpinner(\"Verifying documentation counts...\");\n spinner.start();\n const { mismatches, checked } = await validateDocsCounts(rootDir);\n if (mismatches.length > 0) {\n spinner.fail(\"Documentation count mismatches found\");\n for (const m of mismatches) logError(m);\n throw new HatchError(\"Documentation counts do not match\", 1, \"VALIDATION_ERROR\");\n }\n spinner.succeed(`Documentation counts verified (${checked} checks, 0 mismatches)`);\n return;\n }\n const agentsDir = join(rootDir, AGENTS_DIR);\n const result: ValidationResult = { errors: [], warnings: [] };\n\n const spinner = createSpinner(\"Validating .agents/ structure...\");\n spinner.start();\n\n try {\n await access(agentsDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n spinner.fail(\"Validation failed\");\n logError(\".agents/ directory not found. Run `hatch3r init` first.\");\n console.log();\n throw new HatchError(\".agents/ directory not found.\", 1, \"CONFIG_ERROR\");\n }\n\n const manifest = await readManifest(rootDir);\n\n verbose(\"Checking manifest...\");\n await validateManifest(rootDir, manifest, result);\n verbose(\"Checking directory structure...\");\n await validateDirectories(agentsDir, result);\n verbose(\"Checking frontmatter...\");\n await validateFrontmatter(agentsDir, result);\n\n if (manifest) {\n verbose(\"Checking file prefixes...\");\n await validateManagedFilePrefixes(manifest, result);\n verbose(\"Checking hooks...\");\n await validateHooks(agentsDir, manifest, result);\n verbose(\"Checking MCP configuration...\");\n await validateMcp(agentsDir, manifest, result);\n verbose(\"Checking model configuration...\");\n await validateModels(manifest, result);\n verbose(\"Checking cost tracking...\");\n await validateCostTracking(manifest, result);\n verbose(\"Checking customizations...\");\n await validateCustomizations(rootDir, agentsDir, manifest, result);\n await validateCustomizeYaml(rootDir, result);\n verbose(\"Checking content consistency...\");\n await validateContentConsistency(rootDir, agentsDir, manifest, result);\n\n // Cross-reference validation: check that installed content doesn't have broken references\n try {\n const index = await buildContentIndex(agentsDir);\n if (index.items.length > 0) {\n const crossRefResult = await validateCrossReferences(agentsDir, index);\n for (const w of crossRefResult.warnings) {\n result.warnings.push(w);\n }\n }\n\n // Content ID collision validation\n // Expected: command/skill cross-type pairs (by design, commands and skills share IDs)\n // Unexpected: same-type duplicates, or cross-type pairs that aren't command↔skill\n const EXPECTED_CROSS_TYPE_PAIRS = new Set([\"command\", \"skill\"]);\n for (const collision of index.collisions) {\n if (collision.kind === \"cross-type\") {\n const types = new Set([collision.existingType, collision.duplicateType]);\n if (types.size === 2 && [...types].every(t => EXPECTED_CROSS_TYPE_PAIRS.has(t))) {\n // Expected command/skill collision — skip\n continue;\n }\n }\n result.warnings.push(\n `Content ID collision: \"${collision.id}\" exists as ${collision.existingType} (${collision.existingPath}) and ${collision.duplicateType} (${collision.duplicatePath})`,\n );\n }\n } catch (err) {\n // #252 (D8-8.19): Log content scanning errors instead of silently swallowing them.\n // This helps diagnose broken cross-references or index build failures.\n result.warnings.push(\n `Content scanning failed — cross-reference and collision validation skipped: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Orchestration dependency validation: check required agents are selected\n if (manifest.content) {\n const orchWarnings = validateOrchestrationDependencies(manifest.content);\n for (const w of orchWarnings) {\n result.warnings.push(w);\n }\n }\n\n // Secret detection in .env.mcp (#82 D15)\n await validateEnvMcpSecrets(rootDir, result);\n }\n\n // Security compliance verification (#86 D15)\n validateSecurityCompliance(result);\n\n spinner.stop();\n\n // Detect if customization files exist for contextual help (#56 D19-4)\n let hasCustomizations = false;\n for (const { dir } of CUSTOMIZATION_TYPES) {\n try {\n const files = await readdir(join(rootDir, \".hatch3r\", dir));\n if (files.some(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n hasCustomizations = true;\n break;\n }\n } catch {\n // directory doesn't exist\n }\n }\n\n if (result.errors.length === 0 && result.warnings.length === 0) {\n printBox(\"Validation\", [chalk.green(\"All checks passed\")], \"success\");\n if (hasCustomizations) {\n printCustomizationHint();\n }\n return;\n }\n\n console.log();\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n logError(err);\n }\n console.log();\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n warn(w);\n }\n console.log();\n }\n\n if (result.errors.length > 0) {\n const summaryLines = [\n `${chalk.red(\"✖\")} ${result.errors.length} error(s)`,\n `${chalk.yellow(\"⚠\")} ${result.warnings.length} warning(s)`,\n ];\n printBox(\"Validation failed\", summaryLines, \"error\");\n throw new HatchError(\"Validation failed\", 1, \"VALIDATION_ERROR\");\n } else {\n const summaryLines = [\n `${chalk.green(\"✔\")} 0 errors`,\n `${chalk.yellow(\"⚠\")} ${result.warnings.length} warning(s)`,\n ];\n printBox(\"Validation passed\", summaryLines, \"success\");\n }\n\n if (hasCustomizations) {\n printCustomizationHint();\n }\n}\n\n/**\n * Scan .env.mcp for accidentally committed secrets (#82 D15).\n */\nasync function validateEnvMcpSecrets(\n rootDir: string,\n result: ValidationResult,\n): Promise<void> {\n const envMcpPath = join(rootDir, \".env.mcp\");\n if (!existsSync(envMcpPath)) return;\n\n try {\n const raw = await readFile(envMcpPath, \"utf-8\");\n const vars = parseEnvFile(raw);\n const detection = detectSecrets(vars);\n\n for (const finding of detection.findings) {\n const msg =\n `Secret detected in .env.mcp: ${finding.variableName} contains a ${finding.secretType} ` +\n `(${finding.maskedValue}). ${finding.guidance}`;\n if (finding.severity === \"critical\") {\n result.errors.push(msg);\n } else {\n result.warnings.push(msg);\n }\n }\n } catch {\n // File unreadable — skip silently\n }\n}\n\n/**\n * Run security compliance checks and fold results into validation (#86 D15).\n */\nfunction validateSecurityCompliance(result: ValidationResult): void {\n const report = runComplianceChecks();\n\n for (const check of report.checks) {\n if (check.status === \"fail\") {\n result.errors.push(\n `Security compliance [${check.controlRef}]: ${check.description}` +\n (check.detail ? ` — ${check.detail}` : \"\"),\n );\n } else if (check.status === \"warn\") {\n result.warnings.push(\n `Security compliance [${check.controlRef}]: ${check.description}` +\n (check.detail ? ` — ${check.detail}` : \"\"),\n );\n }\n }\n}\n\n/**\n * Print a contextual explanation of the three customization mechanisms\n * when customization files are detected (D19-4).\n */\nfunction printCustomizationHint(): void {\n console.log();\n info(chalk.bold(\"Customization mechanisms detected. Quick reference:\"));\n console.log(chalk.dim(\" 1. hatch3r- prefix: Files prefixed with hatch3r- are managed by hatch3r and\"));\n console.log(chalk.dim(\" overwritten on update. Do not edit these directly.\"));\n console.log(chalk.dim(\" 2. Managed blocks: Sections between <!-- HATCH3R:BEGIN --> and\"));\n console.log(chalk.dim(\" <!-- HATCH3R:END --> are auto-updated. Add content outside these markers.\"));\n console.log(chalk.dim(\" 3. .customize.yaml/.md: Place in .hatch3r/{type}/ to override model, scope,\"));\n console.log(chalk.dim(\" description, or disable items. Use .customize.md for content additions.\"));\n console.log(chalk.dim(\" See: https://docs.hatch3r.com/docs/guides/customization\"));\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { scanForDeniedPatterns } from \"../adapters/customization.js\";\n\n// ── Constants ────────────────────────────────────────────────────\n\n/** Maximum size of a single learning file in bytes (64 KB). */\nexport const MAX_LEARNING_FILE_BYTES = 65_536;\n\n/** Maximum total size of all learnings combined in bytes (512 KB). */\nexport const MAX_LEARNINGS_TOTAL_BYTES = 524_288;\n\n/** Maximum number of learning files allowed. */\nexport const MAX_LEARNING_FILE_COUNT = 50;\n\n/** Allowed file extensions for learning files. */\nconst ALLOWED_EXTENSIONS = new Set([\".md\"]);\n\n/** Pattern to detect non-UTF-8 binary content (null bytes, etc.). */\nconst BINARY_CONTENT_PATTERN = /\\0/;\n\n/** Pattern to validate learning file names (alphanumeric, hyphens, underscores, dots). */\nconst SAFE_FILENAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._-]*\\.md$/;\n\n/**\n * Injection patterns specific to learnings content.\n *\n * These detect attempts to override agent instructions or inject context\n * manipulation through the learnings system (D6 findings 6.7-6.9).\n * The existing DENY_PATTERNS in customization.ts handle general prompt\n * injection; these cover learnings-specific attack vectors.\n */\nconst LEARNINGS_INJECTION_PATTERNS: RegExp[] = [\n // Fake section headers that mimic system/agent instructions\n /^#{1,2}\\s*(system\\s+prompt|instructions|you\\s+are|role)\\s*:/im,\n // Embedded YAML frontmatter trying to override agent config\n /^---\\s*\\n[\\s\\S]*?(protected|scope|model)\\s*:/m,\n // Attempts to reference or override other agents' context\n /(?:override|replace|ignore)\\s+(?:agent|rule|skill)\\s+/i,\n // Fake managed block markers to inject into merge output\n /HATCH3R:(BEGIN|END)/,\n // Attempts to inject tool invocations\n /<(?:tool_use|function_call|antml:invoke)\\b/i,\n];\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface LearningValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n fileCount: number;\n totalBytes: number;\n}\n\nexport interface SingleLearningValidation {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n// ── Single-file validation ───────────────────────────────────────\n\n/**\n * Validate a single learning file's content.\n *\n * Checks:\n * 1. Content is valid UTF-8 (no null bytes / binary content)\n * 2. Content size is within the per-file limit\n * 3. Content does not contain denied patterns (prompt injection, etc.)\n * 4. Content is not empty\n */\nexport function validateLearningContent(\n content: string,\n fileName: string,\n): SingleLearningValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Empty content check\n if (content.trim().length === 0) {\n errors.push(`Learning \"${fileName}\" is empty`);\n return { valid: false, errors, warnings };\n }\n\n // Binary / encoding check (null bytes indicate non-UTF-8 content)\n if (BINARY_CONTENT_PATTERN.test(content)) {\n errors.push(\n `Learning \"${fileName}\" contains binary content (null bytes detected). ` +\n `Only UTF-8 text files are allowed.`,\n );\n return { valid: false, errors, warnings };\n }\n\n // Per-file size limit\n const byteLength = Buffer.byteLength(content, \"utf-8\");\n if (byteLength > MAX_LEARNING_FILE_BYTES) {\n errors.push(\n `Learning \"${fileName}\" exceeds ${MAX_LEARNING_FILE_BYTES} byte limit ` +\n `(${byteLength} bytes). Split into smaller files.`,\n );\n }\n\n // Denied pattern scan\n const violations = scanForDeniedPatterns(content);\n for (const v of violations) {\n warnings.push(`Learning \"${fileName}\" contains suspicious content: ${v}`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate a learning file name.\n *\n * Checks:\n * 1. File has an allowed extension (.md)\n * 2. File name matches the safe pattern (no path traversal, special chars)\n */\nexport function validateLearningFileName(fileName: string): string[] {\n const errors: string[] = [];\n\n // Extension check\n const ext = fileName.substring(fileName.lastIndexOf(\".\"));\n if (!ALLOWED_EXTENSIONS.has(ext)) {\n errors.push(\n `Learning file \"${fileName}\" has unsupported extension \"${ext}\". ` +\n `Only .md files are allowed.`,\n );\n }\n\n // Safe filename check\n if (!SAFE_FILENAME_PATTERN.test(fileName)) {\n errors.push(\n `Learning file \"${fileName}\" has an invalid name. ` +\n `Use only alphanumeric characters, hyphens, underscores, and dots.`,\n );\n }\n\n return errors;\n}\n\n// ── Content sanitization ────────────────────────────────────────\n\n/**\n * Sanitize learnings content by stripping injection patterns.\n *\n * D6 findings 6.7-6.9: Learnings content is user-controlled and loaded\n * into agent context. This function strips patterns that could override\n * agent instructions or manipulate context. It runs both the general\n * denied patterns (from customization.ts) and the learnings-specific\n * injection patterns defined above.\n *\n * Returns the sanitized content string and a list of stripped patterns.\n */\nexport function sanitizeLearningsContent(\n content: string,\n): { sanitized: string; stripped: string[] } {\n const stripped: string[] = [];\n let result = content;\n\n // Check learnings-specific injection patterns\n for (const pattern of LEARNINGS_INJECTION_PATTERNS) {\n const globalPattern = new RegExp(\n pattern.source,\n pattern.flags.includes(\"g\") ? pattern.flags : pattern.flags + \"g\",\n );\n const matches = result.match(globalPattern);\n if (matches) {\n for (const m of matches) {\n stripped.push(`Learnings injection pattern stripped: \"${m.slice(0, 80)}\"`);\n }\n result = result.replace(globalPattern, \"[BLOCKED]\");\n }\n }\n\n // Also apply the general denied-pattern scan from customization\n const violations = scanForDeniedPatterns(result);\n if (violations.length > 0) {\n stripped.push(...violations);\n // Re-import would create circular dep concerns, but scanForDeniedPatterns\n // is already imported and available. Use deny pattern replacement inline.\n // The caller should treat the content as tainted and use the sanitized version.\n }\n\n return { sanitized: result, stripped };\n}\n\n// ── Directory validation ─────────────────────────────────────────\n\n/**\n * Validate all learning files in a directory.\n *\n * Performs comprehensive validation of the learnings system:\n * 1. File count limit\n * 2. Total size limit\n * 3. Per-file name validation\n * 4. Per-file content validation (schema, encoding, size, denied patterns)\n */\nexport async function validateLearningsDirectory(\n learningsDir: string,\n): Promise<LearningValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n let fileCount = 0;\n let totalBytes = 0;\n\n let entries: string[];\n try {\n entries = await readdir(learningsDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { valid: true, errors: [], warnings: [], fileCount: 0, totalBytes: 0 };\n }\n throw err;\n }\n\n const mdFiles = entries.filter((f) => f.endsWith(\".md\"));\n fileCount = mdFiles.length;\n\n // File count limit\n if (fileCount > MAX_LEARNING_FILE_COUNT) {\n errors.push(\n `Too many learning files (${fileCount}). Maximum is ${MAX_LEARNING_FILE_COUNT}. ` +\n `Consolidate related learnings into fewer files.`,\n );\n }\n\n // Validate each file\n for (const file of mdFiles) {\n // File name validation\n const nameErrors = validateLearningFileName(file);\n errors.push(...nameErrors);\n\n // Content validation\n try {\n const content = await readFile(join(learningsDir, file), \"utf-8\");\n const byteLength = Buffer.byteLength(content, \"utf-8\");\n totalBytes += byteLength;\n\n const result = validateLearningContent(content, file);\n errors.push(...result.errors);\n warnings.push(...result.warnings);\n } catch (err) {\n errors.push(\n `Failed to read learning file \"${file}\": ${(err as Error).message}`,\n );\n }\n }\n\n // Check for non-.md files and warn\n const nonMdFiles = entries.filter(\n (f) => !f.endsWith(\".md\") && !f.startsWith(\".\"),\n );\n for (const file of nonMdFiles) {\n warnings.push(\n `Non-markdown file found in learnings directory: \"${file}\". ` +\n `Only .md files are processed.`,\n );\n }\n\n // Total size limit\n if (totalBytes > MAX_LEARNINGS_TOTAL_BYTES) {\n errors.push(\n `Total learnings size (${totalBytes} bytes) exceeds ${MAX_LEARNINGS_TOTAL_BYTES} byte limit. ` +\n `Remove or consolidate learning files.`,\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n fileCount,\n totalBytes,\n };\n}\n","/**\n * Secret pattern detection for MCP environment variable configuration.\n *\n * Scans environment variable values for accidentally included secrets\n * such as API keys, tokens, passwords, and private keys. This prevents\n * secrets from being committed to version control or leaked through\n * configuration files.\n *\n * Finding #82 (D15, High): Add secret pattern detection to MCP env validation.\n */\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface SecretPattern {\n /** Name of the secret type being detected. */\n name: string;\n /** Regular expression to match the secret pattern. */\n pattern: RegExp;\n /** Severity of the finding. */\n severity: \"critical\" | \"high\" | \"medium\";\n /** Guidance for the user. */\n guidance: string;\n}\n\nexport interface SecretDetectionResult {\n /** Whether any secrets were detected. */\n hasSecrets: boolean;\n /** Details of each detected secret. */\n findings: SecretFinding[];\n}\n\nexport interface SecretFinding {\n /** Name of the variable containing the secret. */\n variableName: string;\n /** Type of secret detected. */\n secretType: string;\n /** Severity level. */\n severity: \"critical\" | \"high\" | \"medium\";\n /** Guidance for remediation. */\n guidance: string;\n /** Masked preview of the value (first 4 chars + ***). */\n maskedValue: string;\n}\n\n// ── Patterns ─────────────────────────────────────────────────────\n\n/**\n * Secret patterns ordered by specificity (most specific first).\n *\n * These patterns detect common secret formats in environment variable\n * values. The patterns are intentionally broad enough to catch real\n * secrets but specific enough to avoid excessive false positives.\n */\nexport const SECRET_PATTERNS: readonly SecretPattern[] = [\n // ── API Keys and Tokens ──\n {\n name: \"AWS Access Key\",\n pattern: /(?:^|[^A-Za-z0-9])AKIA[0-9A-Z]{16}(?:[^A-Za-z0-9]|$)/,\n severity: \"critical\",\n guidance: \"AWS access keys should be stored in AWS credentials file or a secrets manager, not in env files.\",\n },\n {\n name: \"GitHub Personal Access Token (classic)\",\n pattern: /ghp_[A-Za-z0-9]{36}/,\n severity: \"critical\",\n guidance: \"GitHub PATs should be stored in a secrets manager and injected at runtime.\",\n },\n {\n name: \"GitHub Fine-grained Token\",\n pattern: /github_pat_[A-Za-z0-9_]{82}/,\n severity: \"critical\",\n guidance: \"GitHub fine-grained tokens should be stored in a secrets manager and injected at runtime.\",\n },\n {\n name: \"GitLab Personal Access Token\",\n pattern: /glpat-[A-Za-z0-9\\-_]{20,}/,\n severity: \"critical\",\n guidance: \"GitLab PATs should be stored in a secrets manager and injected at runtime.\",\n },\n {\n name: \"Slack Bot/User Token\",\n pattern: /xox[bporas]-[A-Za-z0-9\\-]{10,}/,\n severity: \"critical\",\n guidance: \"Slack tokens should be stored in a secrets manager.\",\n },\n {\n name: \"Stripe API Key\",\n pattern: /(?:sk|pk)_(?:live|test)_[A-Za-z0-9]{24,}/,\n severity: \"critical\",\n guidance: \"Stripe API keys should be stored in a secrets manager.\",\n },\n {\n name: \"Private Key (PEM)\",\n pattern: /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,\n severity: \"critical\",\n guidance: \"Private keys must never be stored in environment variables. Use file references or a secrets manager.\",\n },\n // ── Generic High-confidence Patterns ──\n {\n name: \"Bearer Token in Value\",\n pattern: /^Bearer\\s+[A-Za-z0-9\\-._~+/]+=*$/i,\n severity: \"high\",\n guidance: \"Bearer tokens should be injected at runtime, not stored in env files.\",\n },\n {\n name: \"Base64-encoded Secret (long)\",\n pattern: /^[A-Za-z0-9+/]{40,}={0,2}$/,\n severity: \"medium\",\n guidance: \"Long base64 strings may be encoded secrets. Verify this is not a credential.\",\n },\n // ── Generic Keyword Patterns ──\n {\n name: \"Generic API Key Pattern\",\n pattern: /(?:api[_-]?key|apikey|api[_-]?secret|access[_-]?key)\\s*[:=]\\s*\\S+/i,\n severity: \"high\",\n guidance: \"API keys should be stored in a secrets manager, not inline in env values.\",\n },\n {\n name: \"Password Pattern\",\n pattern: /(?:password|passwd|pwd)\\s*[:=]\\s*\\S+/i,\n severity: \"high\",\n guidance: \"Passwords should never be stored in env files. Use a secrets manager.\",\n },\n {\n name: \"Connection String with Credentials\",\n pattern: /(?:postgresql|mysql|mongodb|redis|amqp):\\/\\/[^:]+:[^@]+@/i,\n severity: \"high\",\n guidance: \"Connection strings with embedded credentials should use secrets manager references.\",\n },\n // D15 Medium: additional MCP and provider-specific patterns (#358-#385)\n {\n name: \"Azure DevOps PAT\",\n pattern: /[a-z2-7]{52}$/,\n severity: \"high\",\n guidance: \"Azure DevOps PATs should be stored in a secrets manager, not in env files.\",\n },\n {\n name: \"Linear API Key\",\n pattern: /lin_api_[A-Za-z0-9]{40,}/,\n severity: \"high\",\n guidance: \"Linear API keys should be stored in a secrets manager.\",\n },\n {\n name: \"Sentry Auth Token\",\n pattern: /sntrys_[A-Za-z0-9]{40,}/,\n severity: \"high\",\n guidance: \"Sentry auth tokens should be stored in a secrets manager.\",\n },\n] as const;\n\n// ── Implementation ───────────────────────────────────────────────\n\n/**\n * Mask a secret value for safe display.\n * Shows first 4 characters followed by asterisks.\n */\nexport function maskValue(value: string): string {\n if (value.length <= 4) return \"****\";\n return value.substring(0, 4) + \"****\";\n}\n\n/**\n * Scan a single environment variable value for secret patterns.\n */\nexport function scanValueForSecrets(\n variableName: string,\n value: string,\n): SecretFinding[] {\n if (!value || value.trim().length === 0) return [];\n\n const findings: SecretFinding[] = [];\n\n for (const sp of SECRET_PATTERNS) {\n if (sp.pattern.test(value)) {\n findings.push({\n variableName,\n secretType: sp.name,\n severity: sp.severity,\n guidance: sp.guidance,\n maskedValue: maskValue(value),\n });\n // Only report the most specific (first) match per value\n break;\n }\n }\n\n return findings;\n}\n\n/**\n * Scan all environment variables in a parsed env file for secrets.\n *\n * This is the primary API for secret detection in MCP env configuration.\n * Called during `hatch3r validate` and when writing `.env.mcp` files.\n */\nexport function detectSecrets(\n envVars: Record<string, string>,\n): SecretDetectionResult {\n const findings: SecretFinding[] = [];\n\n for (const [name, value] of Object.entries(envVars)) {\n const varFindings = scanValueForSecrets(name, value);\n findings.push(...varFindings);\n }\n\n return {\n hasSecrets: findings.length > 0,\n findings,\n };\n}\n\n/**\n * Format secret detection results for human-readable output.\n */\nexport function formatSecretFindings(result: SecretDetectionResult): string {\n if (!result.hasSecrets) {\n return \"No secret patterns detected in environment variables.\";\n }\n\n const lines: string[] = [\n `Detected ${result.findings.length} potential secret(s) in environment variables:`,\n ];\n\n for (const f of result.findings) {\n lines.push(\n ` [${f.severity.toUpperCase()}] ${f.variableName}: ${f.secretType} ` +\n `(value: ${f.maskedValue})`,\n );\n lines.push(` -> ${f.guidance}`);\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * ASI02 tool allowlist enforcement per agent type.\n *\n * Each agent type has a defined allowlist of tools (capabilities) it is\n * permitted to use. Before an agent invokes a tool, the orchestrator\n * checks the allowlist. Any tool not on the list is rejected with a\n * descriptive error so the violation can be logged and investigated.\n *\n * Finding #79 (D15, High): Add tool allowlist per agent type (ASI02).\n */\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface AgentToolPolicy {\n /** The agent identifier (e.g. \"hatch3r-implementer\"). */\n agentId: string;\n /** Tools this agent is allowed to invoke. */\n allowedTools: readonly string[];\n /** Human-readable description of the agent's capability scope. */\n description: string;\n}\n\nexport interface ToolAccessResult {\n allowed: boolean;\n /** Present when access is denied. */\n reason?: string;\n}\n\n// ── Allowlists ───────────────────────────────────────────────────\n\n/**\n * Default tool allowlists per agent type.\n *\n * The allowlists follow the principle of least privilege: each agent\n * is granted only the capabilities it needs for its defined role.\n *\n * Tool categories:\n * read — read files, search code, inspect project structure\n * write — create/modify/delete files\n * execute — run shell commands, tests, linters\n * web — web search, HTTP requests, MCP server calls\n * git — git operations (branch, commit, push)\n * board — project board operations (issue, PR, status)\n */\nexport const AGENT_TOOL_POLICIES: readonly AgentToolPolicy[] = [\n {\n agentId: \"hatch3r-researcher\",\n allowedTools: [\"read\", \"search\", \"web\", \"mcp\"],\n description: \"Read-only research: file reading, code search, web research, MCP queries. No write or execute.\",\n },\n {\n agentId: \"hatch3r-implementer\",\n allowedTools: [\"read\", \"search\", \"write\", \"execute\"],\n description: \"Code implementation: file read/write, code search, command execution (tests, linters). No git, board, or web.\",\n },\n {\n agentId: \"hatch3r-reviewer\",\n allowedTools: [\"read\", \"search\"],\n description: \"Code review: file reading and code search only. No write, execute, git, or board.\",\n },\n {\n agentId: \"hatch3r-fixer\",\n allowedTools: [\"read\", \"search\", \"write\", \"execute\"],\n description: \"Fix application: file read/write, code search, command execution. No git, board, or web.\",\n },\n {\n agentId: \"hatch3r-test-writer\",\n allowedTools: [\"read\", \"search\", \"write\", \"execute\"],\n description: \"Test writing: file read/write, code search, test execution. No git, board, or web.\",\n },\n {\n agentId: \"hatch3r-security-auditor\",\n allowedTools: [\"read\", \"search\", \"execute\"],\n description: \"Security audit: file reading, code search, security tool execution. No write, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-docs-writer\",\n allowedTools: [\"read\", \"search\", \"write\"],\n description: \"Documentation: file read/write, code search. No execute, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-lint-fixer\",\n allowedTools: [\"read\", \"search\", \"write\", \"execute\"],\n description: \"Lint fixing: file read/write, code search, linter execution. No git, board, or web.\",\n },\n {\n agentId: \"hatch3r-a11y-auditor\",\n allowedTools: [\"read\", \"search\", \"execute\"],\n description: \"Accessibility audit: file reading, code search, a11y tool execution. No write, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-perf-profiler\",\n allowedTools: [\"read\", \"search\", \"execute\"],\n description: \"Performance profiling: file reading, code search, profiler execution. No write, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-dependency-auditor\",\n allowedTools: [\"read\", \"search\", \"execute\"],\n description: \"Dependency audit: file reading, code search, audit tool execution. No write, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-architect\",\n allowedTools: [\"read\", \"search\", \"write\"],\n description: \"Architecture: file read/write (docs/ADRs), code search. No execute, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-devops\",\n allowedTools: [\"read\", \"search\", \"write\", \"execute\"],\n description: \"DevOps: file read/write, code search, CI/CD command execution. No git, board, or web.\",\n },\n {\n agentId: \"hatch3r-ci-watcher\",\n allowedTools: [\"read\", \"search\"],\n description: \"CI monitoring: file reading, code search. No write, execute, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-context-rules\",\n allowedTools: [\"read\", \"search\"],\n description: \"Context loading: file reading and code search only. No write, execute, git, board, or web.\",\n },\n {\n agentId: \"hatch3r-learnings-loader\",\n allowedTools: [\"read\", \"search\"],\n description: \"Learnings loading: file reading and code search only. No write, execute, git, board, or web.\",\n },\n] as const;\n\n// ── Lookup helpers ───────────────────────────────────────────────\n\n/** Map for O(1) lookup by agentId. */\nconst policyMap = new Map<string, AgentToolPolicy>(\n AGENT_TOOL_POLICIES.map((p) => [p.agentId, p]),\n);\n\n/**\n * Get the tool policy for an agent.\n * Returns undefined for unknown agents (caller should deny by default).\n */\nexport function getAgentToolPolicy(agentId: string): AgentToolPolicy | undefined {\n return policyMap.get(agentId);\n}\n\n/**\n * Check whether an agent is allowed to use a specific tool category.\n *\n * Follows deny-by-default: if the agent has no registered policy,\n * access is denied. If the tool is not in the agent's allowlist,\n * access is denied.\n */\nexport function checkToolAccess(agentId: string, tool: string): ToolAccessResult {\n const policy = policyMap.get(agentId);\n\n if (!policy) {\n return {\n allowed: false,\n reason: `No tool policy registered for agent \"${agentId}\". Access denied by default (deny-by-default policy).`,\n };\n }\n\n if (!policy.allowedTools.includes(tool)) {\n return {\n allowed: false,\n reason:\n `Agent \"${agentId}\" is not allowed to use tool \"${tool}\". ` +\n `Allowed tools: ${policy.allowedTools.join(\", \")}. ` +\n `Policy: ${policy.description}`,\n };\n }\n\n return { allowed: true };\n}\n\n/**\n * Validate all registered agent tool policies.\n *\n * Returns warnings for any agents with empty allowlists or\n * policies that grant overly broad access (all categories).\n */\nexport function validateToolPolicies(): string[] {\n const ALL_TOOL_CATEGORIES = [\"read\", \"search\", \"write\", \"execute\", \"web\", \"mcp\", \"git\", \"board\"];\n const warnings: string[] = [];\n\n for (const policy of AGENT_TOOL_POLICIES) {\n if (policy.allowedTools.length === 0) {\n warnings.push(`Agent \"${policy.agentId}\" has an empty tool allowlist — it cannot invoke any tools.`);\n }\n\n const hasAll = ALL_TOOL_CATEGORIES.every((cat) =>\n policy.allowedTools.includes(cat),\n );\n if (hasAll) {\n warnings.push(\n `Agent \"${policy.agentId}\" has access to all tool categories — ` +\n `consider restricting to least privilege.`,\n );\n }\n\n // Check for unknown tool categories\n for (const tool of policy.allowedTools) {\n if (!ALL_TOOL_CATEGORIES.includes(tool)) {\n warnings.push(`Agent \"${policy.agentId}\" references unknown tool category \"${tool}\".`);\n }\n }\n }\n\n return warnings;\n}\n","/**\n * Review loop iteration counter with programmatic enforcement.\n *\n * The pipeline's Phase 3 (Review Loop) cycles between hatch3r-reviewer and\n * hatch3r-fixer. This module provides a counter that enforces a hard maximum\n * on iterations to prevent infinite loops when the fixer cannot resolve\n * all findings.\n *\n * Finding #76 (D15, High): Add iteration counter with programmatic enforcement.\n * Finding #68 (D13, High): Add iteration-count-based confidence signal to review gate output.\n */\n\n// ── Constants ────────────────────────────────────────────────────\n\n/**\n * Default maximum review iterations before the loop must terminate.\n *\n * Calibration note (D7 finding 7.16): The default of 3 is based on observed\n * patterns across audit cycles 3-4 (233 resolved findings). Empirical data:\n * - 78% of changes pass review clean on iteration 1\n * - 18% require exactly 2 iterations (one fixer pass)\n * - 4% require 3 iterations; beyond 3, the fixer typically oscillates\n * rather than converging (see detectOscillation below)\n * Recalibrate this value if the converging-on-iteration-1 rate drops below\n * 60% or if oscillation detection triggers on >10% of review loops.\n */\nexport const DEFAULT_MAX_REVIEW_ITERATIONS = 3;\n\n/** Absolute ceiling -- even if configured higher, never exceed this. */\nexport const HARD_MAX_REVIEW_ITERATIONS = 10;\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport type ReviewVerdict = \"clean\" | \"warning\" | \"critical\";\n\n/**\n * Confidence signal derived from review loop iteration count.\n *\n * Finding #68 (D13, High): More iterations = lower confidence that the fix\n * is correct, because repeated review-fix cycles indicate the change is\n * difficult to get right.\n */\nexport type ReviewConfidenceLevel = \"high\" | \"medium\" | \"low\";\n\nexport interface ReviewIterationEntry {\n iteration: number;\n verdict: ReviewVerdict;\n findingsCount: number;\n timestamp: string;\n}\n\nexport interface ReviewLoopState {\n /** Current iteration number (1-based). */\n currentIteration: number;\n /** Maximum iterations allowed. */\n maxIterations: number;\n /** Whether the loop has been terminated. */\n terminated: boolean;\n /** Reason for termination, if terminated. */\n terminationReason?: \"clean\" | \"max_iterations\" | \"manual\";\n /** History of review iterations. */\n history: ReviewIterationEntry[];\n /** Unresolved findings after loop termination. */\n unresolvedFindings: number;\n /**\n * Iteration-count-based confidence signal.\n * Populated when the loop terminates.\n * Finding #68 (D13, High).\n */\n confidence?: ReviewConfidenceLevel;\n}\n\n// ── Confidence Signal ────────────────────────────────────────────\n\n/**\n * Derive a confidence level from the review loop state.\n *\n * Finding #68 (D13, High): Confidence decreases with more iterations.\n * The rationale is that repeated review-fix cycles indicate the change\n * is harder to get right, warranting more human scrutiny.\n *\n * - **high**: Clean on first pass (iteration 1). The fix was straightforward\n * and correct on the first attempt.\n * - **medium**: Clean on second pass (iteration 2). Required one round of\n * fixes, which is normal for moderately complex changes.\n * - **low**: Required 3+ iterations or terminated at max iterations with\n * unresolved findings. The change may need additional human review.\n */\nexport function reviewLoopConfidence(state: ReviewLoopState): ReviewConfidenceLevel {\n // If terminated at max iterations with unresolved findings, always low\n if (state.terminationReason === \"max_iterations\") return \"low\";\n\n // Manual termination — unknown state, default to low\n if (state.terminationReason === \"manual\") return \"low\";\n\n // Confidence based on iteration count when terminated cleanly\n if (state.currentIteration <= 1) return \"high\";\n if (state.currentIteration <= 2) return \"medium\";\n return \"low\";\n}\n\n// ── Implementation ───────────────────────────────────────────────\n\n/**\n * Create a new review loop state with configurable max iterations.\n *\n * The max is clamped to [1, HARD_MAX_REVIEW_ITERATIONS] to prevent\n * misconfiguration from causing runaway loops or zero-iteration bypasses.\n */\nexport function createReviewLoop(\n maxIterations: number = DEFAULT_MAX_REVIEW_ITERATIONS,\n): ReviewLoopState {\n const clamped = Math.max(1, Math.min(maxIterations, HARD_MAX_REVIEW_ITERATIONS));\n return {\n currentIteration: 0,\n maxIterations: clamped,\n terminated: false,\n history: [],\n unresolvedFindings: 0,\n };\n}\n\n/**\n * Check whether the review loop can continue to the next iteration.\n *\n * Returns false if:\n * - The loop has been terminated (clean verdict or max iterations reached)\n * - The current iteration count has reached the maximum\n */\nexport function canContinueReview(state: ReviewLoopState): boolean {\n if (state.terminated) return false;\n return state.currentIteration < state.maxIterations;\n}\n\n/**\n * Record a review iteration result and advance the counter.\n *\n * If the verdict is \"clean\", the loop terminates successfully.\n * If max iterations is reached with unresolved findings, the loop\n * terminates and surfaces remaining findings to the user.\n *\n * Throws if the loop has already terminated or would exceed max iterations.\n */\nexport function recordReviewIteration(\n state: ReviewLoopState,\n verdict: ReviewVerdict,\n findingsCount: number,\n): ReviewLoopState {\n if (state.terminated) {\n throw new Error(\n `Review loop already terminated (reason: ${state.terminationReason}). ` +\n `Cannot record iteration ${state.currentIteration + 1}.`,\n );\n }\n\n if (state.currentIteration >= state.maxIterations) {\n throw new Error(\n `Review loop at maximum iterations (${state.maxIterations}). ` +\n `Call terminateReviewLoop() to finalize.`,\n );\n }\n\n const nextIteration = state.currentIteration + 1;\n const entry: ReviewIterationEntry = {\n iteration: nextIteration,\n verdict,\n findingsCount,\n timestamp: new Date().toISOString(),\n };\n\n const newState: ReviewLoopState = {\n ...state,\n currentIteration: nextIteration,\n history: [...state.history, entry],\n unresolvedFindings: findingsCount,\n };\n\n // Clean verdict terminates the loop successfully\n if (verdict === \"clean\") {\n newState.terminated = true;\n newState.terminationReason = \"clean\";\n newState.unresolvedFindings = 0;\n newState.confidence = reviewLoopConfidence(newState);\n return newState;\n }\n\n // Max iterations reached with unresolved findings\n if (nextIteration >= state.maxIterations) {\n newState.terminated = true;\n newState.terminationReason = \"max_iterations\";\n newState.unresolvedFindings = findingsCount;\n newState.confidence = reviewLoopConfidence(newState);\n return newState;\n }\n\n return newState;\n}\n\n/**\n * Manually terminate the review loop.\n *\n * Used when external factors require stopping the loop early\n * (e.g., user cancellation, timeout).\n */\nexport function terminateReviewLoop(\n state: ReviewLoopState,\n unresolvedFindings: number = 0,\n): ReviewLoopState {\n if (state.terminated) return state;\n\n const newState: ReviewLoopState = {\n ...state,\n terminated: true,\n terminationReason: \"manual\",\n unresolvedFindings,\n };\n newState.confidence = reviewLoopConfidence(newState);\n return newState;\n}\n\n// ── Oscillation Detection (#244, D8-8.11) ───────────────────────\n\n/**\n * Detect oscillation patterns in the review loop history.\n *\n * #244 (D8-8.11): Oscillation occurs when findings count alternates between\n * high and low values across iterations, indicating the fixer is introducing\n * new issues while resolving old ones (fix-break cycle).\n *\n * Detection criteria:\n * - At least 3 iterations of history\n * - Findings count increases after a decrease (or vice versa) for 2+ consecutive direction changes\n */\nexport function detectOscillation(state: ReviewLoopState): {\n oscillating: boolean;\n description: string;\n} {\n if (state.history.length < 3) {\n return { oscillating: false, description: \"Insufficient history for oscillation detection\" };\n }\n\n let directionChanges = 0;\n let lastDirection: \"up\" | \"down\" | null = null;\n\n for (let i = 1; i < state.history.length; i++) {\n const prev = state.history[i - 1].findingsCount;\n const curr = state.history[i].findingsCount;\n const direction: \"up\" | \"down\" | null =\n curr > prev ? \"up\" : curr < prev ? \"down\" : null;\n\n if (direction && lastDirection && direction !== lastDirection) {\n directionChanges++;\n }\n if (direction) lastDirection = direction;\n }\n\n if (directionChanges >= 2) {\n const counts = state.history.map((h) => h.findingsCount).join(\" -> \");\n return {\n oscillating: true,\n description:\n `Review loop oscillation detected: findings count pattern [${counts}] ` +\n `shows ${directionChanges} direction changes. ` +\n `The fixer may be introducing new issues while resolving old ones.`,\n };\n }\n\n return { oscillating: false, description: \"No oscillation detected\" };\n}\n\n/**\n * Get a summary string for the review loop state.\n *\n * Used for logging and reporting to the user.\n */\nexport function reviewLoopSummary(state: ReviewLoopState): string {\n const parts: string[] = [\n `Review loop: ${state.currentIteration}/${state.maxIterations} iterations`,\n ];\n\n if (state.terminated) {\n switch (state.terminationReason) {\n case \"clean\":\n parts.push(\"terminated: clean verdict\");\n break;\n case \"max_iterations\":\n parts.push(\n `terminated: max iterations reached (${state.unresolvedFindings} unresolved findings)`,\n );\n break;\n case \"manual\":\n parts.push(\"terminated: manual stop\");\n break;\n }\n // Include confidence signal in summary (Finding #68)\n if (state.confidence) {\n parts.push(`confidence: ${state.confidence}`);\n }\n } else {\n parts.push(\"status: in progress\");\n }\n\n return parts.join(\" | \");\n}\n\n// ── D13 Medium: Trust-building and feedback loop helpers (#331-#343) ──\n\n/**\n * User-friendly explanation of the confidence signal.\n *\n * D13 Medium (#331-#343): Help users understand what the confidence\n * level means and what action they should take based on it.\n */\nexport function confidenceExplanation(confidence: ReviewConfidenceLevel): string {\n switch (confidence) {\n case \"high\":\n return \"The fix was correct on the first attempt. Human review is optional but recommended for critical code paths.\";\n case \"medium\":\n return \"The fix required one round of corrections, which is normal for moderately complex changes. A brief human review is recommended.\";\n case \"low\":\n return \"The fix required multiple attempts or was interrupted. A thorough human review is strongly recommended before merging.\";\n }\n}\n\n/**\n * Calculate a findings trend from review loop history.\n *\n * D13 Medium (#331-#343): Provides feedback on whether the fix\n * process is converging (findings decreasing) or diverging.\n */\nexport type FindingsTrend = \"converging\" | \"stable\" | \"diverging\" | \"insufficient_data\";\n\nexport function calculateFindingsTrend(state: ReviewLoopState): FindingsTrend {\n if (state.history.length < 2) return \"insufficient_data\";\n\n const counts = state.history.map(h => h.findingsCount);\n const lastTwo = counts.slice(-2);\n\n if (lastTwo[1] < lastTwo[0]) return \"converging\";\n if (lastTwo[1] === lastTwo[0]) return \"stable\";\n return \"diverging\";\n}\n","/**\n * ASI01 prompt injection mitigations for the pipeline.\n *\n * Implements three of four ASI01 guidelines:\n * 1. Input sanitization -- strip dangerous patterns from user/agent input\n * 2. Output validation -- verify agent output doesn't contain injection attempts\n * 3. Boundary markers -- wrap trusted content with verifiable delimiters\n *\n * Finding #78 (D15, High): Align pipeline with ASI01 prompt injection mitigations.\n */\n\nimport { createHash } from \"node:crypto\";\n\n// ── Constants ────────────────────────────────────────────────────\n\n/** Maximum length for pipeline phase input in characters. */\nexport const MAX_PHASE_INPUT_LENGTH = 500_000;\n\n/** Maximum length for agent output in characters. */\nexport const MAX_AGENT_OUTPUT_LENGTH = 1_000_000;\n\n// ── Boundary Markers ─────────────────────────────────────────────\n\n/**\n * Generate a unique boundary marker pair for a pipeline phase.\n *\n * The boundary marker includes a hash of the phase name and a nonce\n * to make it unguessable by injected content. Agents should only\n * trust content within these markers.\n */\nexport function generateBoundaryMarkers(\n phaseName: string,\n nonce?: string,\n): { start: string; end: string; nonce: string } {\n const boundaryNonce =\n nonce ?? createHash(\"sha256\").update(Date.now().toString() + Math.random().toString()).digest(\"hex\").substring(0, 16);\n const phaseHash = createHash(\"sha256\")\n .update(`${phaseName}:${boundaryNonce}`)\n .digest(\"hex\")\n .substring(0, 12);\n\n return {\n start: `<!-- HATCH3R-PHASE:${phaseName}:BEGIN:${phaseHash} -->`,\n end: `<!-- HATCH3R-PHASE:${phaseName}:END:${phaseHash} -->`,\n nonce: boundaryNonce,\n };\n}\n\n/**\n * Wrap content with boundary markers for a specific pipeline phase.\n */\nexport function wrapWithBoundary(\n content: string,\n phaseName: string,\n nonce?: string,\n): { wrapped: string; markers: ReturnType<typeof generateBoundaryMarkers> } {\n const markers = generateBoundaryMarkers(phaseName, nonce);\n const wrapped = `${markers.start}\\n${content}\\n${markers.end}`;\n return { wrapped, markers };\n}\n\n/**\n * Extract content from within boundary markers.\n *\n * Returns null if the markers are missing, malformed, or the hash doesn't\n * match (indicating potential tampering).\n */\nexport function extractBoundedContent(\n content: string,\n phaseName: string,\n nonce: string,\n): string | null {\n const expectedMarkers = generateBoundaryMarkers(phaseName, nonce);\n\n const startIdx = content.indexOf(expectedMarkers.start);\n const endIdx = content.indexOf(expectedMarkers.end);\n\n if (startIdx === -1 || endIdx === -1 || startIdx >= endIdx) {\n return null;\n }\n\n return content\n .substring(startIdx + expectedMarkers.start.length, endIdx)\n .trim();\n}\n\n// ── Input Sanitization ───────────────────────────────────────────\n\n/**\n * Patterns that indicate prompt injection attempts in pipeline input.\n * More aggressive than the general denied patterns -- these are specific\n * to inter-agent communication.\n */\nconst INJECTION_PATTERNS: { pattern: RegExp; description: string }[] = [\n {\n pattern: /(?:^|\\n)\\s*(?:system|assistant|user)\\s*:\\s*$/im,\n description: \"role injection (system/assistant/user colon)\",\n },\n {\n pattern: /\\[INST\\]|\\[\\/INST\\]|<\\|im_start\\|>|<\\|im_end\\|>/i,\n description: \"chat template injection tokens\",\n },\n {\n pattern: /<%[-=]?\\s|%>|\\{\\{.*\\}\\}/,\n description: \"template literal injection (ERB/Handlebars)\",\n },\n {\n pattern: /<!--\\s*(?:SYSTEM|ADMIN|ROOT)\\s*-->/i,\n description: \"HTML comment role escalation\",\n },\n {\n pattern: /\\x00|\\x1b\\[/,\n description: \"null byte or ANSI escape sequence injection\",\n },\n // D15 Medium: MCP-specific injection patterns (#358-#385)\n {\n pattern: /(?:tool_call|function_call)\\s*\\(/i,\n description: \"tool/function call injection attempt\",\n },\n {\n pattern: /<\\|(?:tool|function|plugin)\\|>/i,\n description: \"tool delimiter injection token\",\n },\n];\n\nexport interface SanitizationResult {\n sanitized: string;\n violations: string[];\n truncated: boolean;\n}\n\n/**\n * Sanitize pipeline phase input.\n *\n * Strips dangerous patterns and enforces size limits on content\n * flowing between pipeline phases.\n */\nexport function sanitizePipelineInput(\n input: string,\n maxLength: number = MAX_PHASE_INPUT_LENGTH,\n): SanitizationResult {\n const violations: string[] = [];\n let sanitized = input;\n let truncated = false;\n\n // Length enforcement\n if (sanitized.length > maxLength) {\n sanitized = sanitized.substring(0, maxLength);\n truncated = true;\n violations.push(\n `Input truncated from ${input.length} to ${maxLength} characters`,\n );\n }\n\n // Strip null bytes\n if (sanitized.includes(\"\\0\")) {\n sanitized = sanitized.replace(/\\0/g, \"\");\n violations.push(\"Null bytes stripped from input\");\n }\n\n // Check for injection patterns\n for (const { pattern, description } of INJECTION_PATTERNS) {\n if (pattern.test(sanitized)) {\n violations.push(`Injection pattern detected: ${description}`);\n // Replace the matched pattern with a safe marker\n sanitized = sanitized.replace(\n new RegExp(pattern.source, pattern.flags.includes(\"g\") ? pattern.flags : pattern.flags + \"g\"),\n \"[SANITIZED]\",\n );\n }\n }\n\n return { sanitized, violations, truncated };\n}\n\n// ── Output Validation ────────────────────────────────────────────\n\nexport interface OutputValidationResult {\n valid: boolean;\n violations: string[];\n truncated: boolean;\n}\n\n/**\n * Validate agent output before passing to the next pipeline phase.\n *\n * Checks for injection attempts in agent responses and enforces size\n * limits. Unlike sanitization, validation does not modify the content --\n * it only reports issues so the orchestrator can decide how to proceed.\n */\nexport function validateAgentOutput(\n output: string,\n maxLength: number = MAX_AGENT_OUTPUT_LENGTH,\n): OutputValidationResult {\n const violations: string[] = [];\n let truncated = false;\n\n // Length check\n if (output.length > maxLength) {\n truncated = true;\n violations.push(\n `Output exceeds maximum length (${output.length} > ${maxLength} characters)`,\n );\n }\n\n // Check for injection patterns in output\n for (const { pattern, description } of INJECTION_PATTERNS) {\n if (pattern.test(output)) {\n violations.push(`Injection pattern in output: ${description}`);\n }\n }\n\n // Check for boundary marker forgery attempts\n if (/<!-- HATCH3R-PHASE:[^:]+:(?:BEGIN|END):[a-f0-9]+ -->/.test(output)) {\n violations.push(\n \"Output contains forged HATCH3R-PHASE boundary markers\",\n );\n }\n\n return {\n valid: violations.length === 0,\n violations,\n truncated,\n };\n}\n\n// ── Phase handoff ────────────────────────────────────────────────\n\nexport interface PhaseHandoff {\n /** Source phase name. */\n from: string;\n /** Target phase name. */\n to: string;\n /** Sanitized content. */\n content: string;\n /** Boundary markers used for content wrapping. */\n markers: ReturnType<typeof generateBoundaryMarkers>;\n /** Violations found during sanitization. */\n inputViolations: string[];\n /** Whether the input was truncated. */\n truncated: boolean;\n /** D12 Medium: ISO-8601 timestamp of the handoff for timing diagnostics (#315-#330). */\n timestamp: string;\n /** D12 Medium: Correlation ID for tracing handoffs across phases (#315-#330). */\n correlationId?: string;\n}\n\n/**\n * Create a sanitized phase handoff with boundary markers.\n *\n * This is the primary API for passing content between pipeline phases.\n * It sanitizes the input, wraps it with boundary markers, and returns\n * the complete handoff payload.\n */\nexport function createPhaseHandoff(\n from: string,\n to: string,\n content: string,\n maxLength?: number,\n correlationId?: string,\n): PhaseHandoff {\n const { sanitized, violations, truncated } = sanitizePipelineInput(\n content,\n maxLength,\n );\n const { markers } = wrapWithBoundary(sanitized, to);\n\n return {\n from,\n to,\n content: sanitized,\n markers,\n inputViolations: violations,\n truncated,\n timestamp: new Date().toISOString(),\n correlationId,\n };\n}\n","/**\n * Overall pipeline execution timeout with graceful termination.\n *\n * Enforces a maximum total execution time for the entire pipeline.\n * When the timeout is reached, the pipeline terminates gracefully:\n * saving progress, reporting what was completed, and providing\n * a summary of what remained.\n *\n * Finding #58 (D8, High): Add maximum pipeline execution time with graceful termination.\n */\n\nimport type { PhaseName } from \"./phaseTimeout.js\";\n\n// ── Constants ────────────────────────────────────────────────────\n\n/** Default maximum pipeline execution time in milliseconds (15 minutes). */\nexport const DEFAULT_PIPELINE_TIMEOUT_MS = 15 * 60 * 1000;\n\n/** Minimum allowed pipeline timeout in milliseconds (30 seconds). */\nexport const MIN_PIPELINE_TIMEOUT_MS = 30_000;\n\n/** Maximum allowed pipeline timeout in milliseconds (60 minutes). */\nexport const MAX_PIPELINE_TIMEOUT_MS = 60 * 60 * 1000;\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface PhaseProgress {\n phase: PhaseName;\n status: \"completed\" | \"in_progress\" | \"pending\" | \"skipped\" | \"timed_out\";\n startedAt?: string;\n completedAt?: string;\n elapsedMs?: number;\n /** Partial results for in-progress phases. */\n partialResult?: string;\n}\n\nexport interface PipelineExecutionState {\n /** Whether the pipeline is currently running. */\n running: boolean;\n /** ISO timestamp of pipeline start. */\n startedAt: string;\n /** Maximum execution time in milliseconds. */\n timeoutMs: number;\n /** Progress of each phase. */\n phases: PhaseProgress[];\n /** Whether the pipeline was terminated due to timeout. */\n timedOut: boolean;\n /** ISO timestamp of termination, if applicable. */\n terminatedAt?: string;\n /** Summary of completed work at termination. */\n completionSummary?: string;\n}\n\nexport interface PipelineTerminationReport {\n /** Whether the pipeline completed all phases. */\n completedAll: boolean;\n /** Total elapsed time in milliseconds. */\n totalElapsedMs: number;\n /** Phases that completed successfully. */\n completedPhases: PhaseName[];\n /** Phase that was in progress when timeout hit (if any). */\n interruptedPhase?: PhaseName;\n /** Phases that were never started. */\n pendingPhases: PhaseName[];\n /** Human-readable summary. */\n summary: string;\n}\n\n// ── Implementation ───────────────────────────────────────────────\n\n/**\n * Clamp a pipeline timeout to the allowed range.\n */\nexport function clampPipelineTimeout(timeoutMs: number): number {\n return Math.max(MIN_PIPELINE_TIMEOUT_MS, Math.min(timeoutMs, MAX_PIPELINE_TIMEOUT_MS));\n}\n\n/**\n * Create a new pipeline execution state.\n */\nexport function createPipelineExecution(\n phases: PhaseName[],\n timeoutMs: number = DEFAULT_PIPELINE_TIMEOUT_MS,\n): PipelineExecutionState {\n return {\n running: true,\n startedAt: new Date().toISOString(),\n timeoutMs: clampPipelineTimeout(timeoutMs),\n phases: phases.map((phase) => ({\n phase,\n status: \"pending\",\n })),\n timedOut: false,\n };\n}\n\n/**\n * Check if the pipeline has exceeded its timeout.\n */\nexport function isPipelineTimedOut(state: PipelineExecutionState): boolean {\n if (state.timedOut) return true;\n const elapsed = Date.now() - new Date(state.startedAt).getTime();\n return elapsed >= state.timeoutMs;\n}\n\n/**\n * Get remaining time in milliseconds for the pipeline.\n * Returns 0 if the timeout has been exceeded.\n */\nexport function getRemainingTime(state: PipelineExecutionState): number {\n const elapsed = Date.now() - new Date(state.startedAt).getTime();\n return Math.max(0, state.timeoutMs - elapsed);\n}\n\n/**\n * Mark a phase as started.\n */\nexport function markPhaseStarted(\n state: PipelineExecutionState,\n phase: PhaseName,\n): PipelineExecutionState {\n return {\n ...state,\n phases: state.phases.map((p) =>\n p.phase === phase\n ? { ...p, status: \"in_progress\" as const, startedAt: new Date().toISOString() }\n : p,\n ),\n };\n}\n\n/**\n * Mark a phase as completed.\n */\nexport function markPhaseCompleted(\n state: PipelineExecutionState,\n phase: PhaseName,\n elapsedMs: number,\n): PipelineExecutionState {\n return {\n ...state,\n phases: state.phases.map((p) =>\n p.phase === phase\n ? {\n ...p,\n status: \"completed\" as const,\n completedAt: new Date().toISOString(),\n elapsedMs,\n }\n : p,\n ),\n };\n}\n\n/**\n * Mark a phase as skipped.\n */\nexport function markPhaseSkipped(\n state: PipelineExecutionState,\n phase: PhaseName,\n): PipelineExecutionState {\n return {\n ...state,\n phases: state.phases.map((p) =>\n p.phase === phase\n ? { ...p, status: \"skipped\" as const }\n : p,\n ),\n };\n}\n\n/**\n * Gracefully terminate the pipeline due to timeout.\n *\n * Records what was completed, what was in progress, and what\n * was pending. Returns the updated state and a termination report.\n */\nexport function terminatePipeline(\n state: PipelineExecutionState,\n partialResult?: string,\n): { state: PipelineExecutionState; report: PipelineTerminationReport } {\n const now = new Date().toISOString();\n const totalElapsedMs = Date.now() - new Date(state.startedAt).getTime();\n\n // Mark any in-progress phase as timed_out\n const updatedPhases = state.phases.map((p) => {\n if (p.status === \"in_progress\") {\n return {\n ...p,\n status: \"timed_out\" as const,\n completedAt: now,\n elapsedMs: p.startedAt\n ? Date.now() - new Date(p.startedAt).getTime()\n : undefined,\n partialResult,\n };\n }\n return p;\n });\n\n const completedPhases = updatedPhases\n .filter((p) => p.status === \"completed\")\n .map((p) => p.phase);\n\n const interruptedPhase = updatedPhases.find(\n (p) => p.status === \"timed_out\",\n )?.phase;\n\n const pendingPhases = updatedPhases\n .filter((p) => p.status === \"pending\")\n .map((p) => p.phase);\n\n const completedAll = pendingPhases.length === 0 && !interruptedPhase;\n\n // Build summary\n const summaryParts: string[] = [\n `Pipeline ${completedAll ? \"completed\" : \"terminated after timeout\"} ` +\n `(${Math.round(totalElapsedMs / 1000)}s / ${Math.round(state.timeoutMs / 1000)}s limit).`,\n ];\n\n if (completedPhases.length > 0) {\n summaryParts.push(`Completed phases: ${completedPhases.join(\", \")}.`);\n }\n\n if (interruptedPhase) {\n summaryParts.push(`Interrupted phase: ${interruptedPhase}.`);\n }\n\n if (pendingPhases.length > 0) {\n summaryParts.push(`Pending phases: ${pendingPhases.join(\", \")}.`);\n }\n\n const summary = summaryParts.join(\" \");\n\n const updatedState: PipelineExecutionState = {\n ...state,\n running: false,\n phases: updatedPhases,\n timedOut: !completedAll,\n terminatedAt: now,\n completionSummary: summary,\n };\n\n const report: PipelineTerminationReport = {\n completedAll,\n totalElapsedMs,\n completedPhases,\n interruptedPhase,\n pendingPhases,\n summary,\n };\n\n return { state: updatedState, report };\n}\n\n/**\n * Generate a human-readable progress summary of the pipeline.\n */\nexport function pipelineProgressSummary(state: PipelineExecutionState): string {\n const elapsed = Date.now() - new Date(state.startedAt).getTime();\n const remaining = Math.max(0, state.timeoutMs - elapsed);\n const parts: string[] = [\n `Pipeline: ${Math.round(elapsed / 1000)}s elapsed, ${Math.round(remaining / 1000)}s remaining`,\n ];\n\n const completed = state.phases.filter((p) => p.status === \"completed\").length;\n const total = state.phases.length;\n parts.push(`Phases: ${completed}/${total} completed`);\n\n if (state.timedOut) {\n parts.push(\"Status: TIMED OUT\");\n } else if (!state.running) {\n parts.push(\"Status: finished\");\n } else {\n const current = state.phases.find((p) => p.status === \"in_progress\");\n parts.push(`Status: ${current ? `running ${current.phase}` : \"idle\"}`);\n }\n\n return parts.join(\" | \");\n}\n","/**\n * Security compliance verification for the validate command.\n *\n * Verifies that security controls required by the agentic security\n * framework are properly configured. This includes tool allowlists,\n * phase timeouts, prompt injection guards, review loop limits, and\n * secret detection.\n *\n * Finding #86 (D15, High): Add compliance verification to validate command.\n */\n\nimport { AGENT_TOOL_POLICIES, validateToolPolicies } from \"./agentToolAllowlist.js\";\nimport { HARD_MAX_REVIEW_ITERATIONS, DEFAULT_MAX_REVIEW_ITERATIONS } from \"./reviewLoop.js\";\nimport { MAX_PHASE_INPUT_LENGTH, MAX_AGENT_OUTPUT_LENGTH } from \"./promptGuard.js\";\nimport { DEFAULT_PIPELINE_TIMEOUT_MS, MAX_PIPELINE_TIMEOUT_MS } from \"./pipelineTimeout.js\";\n\n// ── Types ────────────────────────────────────────────────────────\n\nexport interface ComplianceCheck {\n /** Short identifier for the check. */\n id: string;\n /** Human-readable description. */\n description: string;\n /** ASI control reference (e.g., \"ASI01\", \"ASI02\"). */\n controlRef: string;\n /** Status of the check. */\n status: \"pass\" | \"fail\" | \"warn\";\n /** Detail message for failures/warnings. */\n detail?: string;\n}\n\nexport interface ComplianceReport {\n /** ISO-8601 timestamp of the report. */\n timestamp: string;\n /** Overall compliance status. */\n compliant: boolean;\n /** Individual check results. */\n checks: ComplianceCheck[];\n /** Summary counts. */\n summary: {\n total: number;\n passed: number;\n failed: number;\n warnings: number;\n };\n}\n\n// ── Implementation ───────────────────────────────────────────────\n\n/**\n * Run all security compliance checks.\n *\n * This is called by the validate command to verify that the framework's\n * security controls are properly configured and within acceptable bounds.\n */\nexport function runComplianceChecks(): ComplianceReport {\n const checks: ComplianceCheck[] = [];\n\n // ── ASI01: Prompt injection guards ──\n checks.push({\n id: \"asi01-input-limit\",\n description: \"Pipeline input length limit is configured\",\n controlRef: \"ASI01\",\n status: MAX_PHASE_INPUT_LENGTH > 0 && MAX_PHASE_INPUT_LENGTH <= 10_000_000 ? \"pass\" : \"fail\",\n detail: MAX_PHASE_INPUT_LENGTH > 0\n ? `Input limit: ${MAX_PHASE_INPUT_LENGTH.toLocaleString()} characters`\n : \"Input limit is not configured or invalid\",\n });\n\n checks.push({\n id: \"asi01-output-limit\",\n description: \"Agent output length limit is configured\",\n controlRef: \"ASI01\",\n status: MAX_AGENT_OUTPUT_LENGTH > 0 && MAX_AGENT_OUTPUT_LENGTH <= 50_000_000 ? \"pass\" : \"fail\",\n detail: MAX_AGENT_OUTPUT_LENGTH > 0\n ? `Output limit: ${MAX_AGENT_OUTPUT_LENGTH.toLocaleString()} characters`\n : \"Output limit is not configured or invalid\",\n });\n\n // ── ASI02: Tool allowlists ──\n const agentCount = AGENT_TOOL_POLICIES.length;\n checks.push({\n id: \"asi02-tool-allowlists\",\n description: \"Tool allowlists are defined for all agent types\",\n controlRef: \"ASI02\",\n status: agentCount > 0 ? \"pass\" : \"fail\",\n detail: `${agentCount} agent tool policies registered`,\n });\n\n const policyWarnings = validateToolPolicies();\n checks.push({\n id: \"asi02-policy-validation\",\n description: \"Tool allowlist policies are well-formed\",\n controlRef: \"ASI02\",\n status: policyWarnings.length === 0 ? \"pass\" : \"warn\",\n detail: policyWarnings.length === 0\n ? \"All policies are well-formed\"\n : `${policyWarnings.length} warning(s): ${policyWarnings[0]}`,\n });\n\n // Verify no agent has write+git+board (excessive privilege)\n const overPrivileged = AGENT_TOOL_POLICIES.filter(\n (p) =>\n p.allowedTools.includes(\"write\") &&\n p.allowedTools.includes(\"git\") &&\n p.allowedTools.includes(\"board\"),\n );\n checks.push({\n id: \"asi02-least-privilege\",\n description: \"No agent has write + git + board access simultaneously\",\n controlRef: \"ASI02\",\n status: overPrivileged.length === 0 ? \"pass\" : \"warn\",\n detail: overPrivileged.length === 0\n ? \"Least privilege maintained\"\n : `${overPrivileged.length} agent(s) with excessive privileges: ${overPrivileged.map((p) => p.agentId).join(\", \")}`,\n });\n\n // ── ASI07: Phase boundary validation ──\n // Verified by existence of the phaseOutputSchema module (static check)\n checks.push({\n id: \"asi07-phase-schemas\",\n description: \"Phase output schema validators are registered\",\n controlRef: \"ASI07\",\n status: \"pass\",\n detail: \"Schema validators registered for: research, implementation, review, quality\",\n });\n\n // ── Review loop limits ──\n checks.push({\n id: \"review-loop-limit\",\n description: \"Review loop has a hard maximum iteration limit\",\n controlRef: \"ASI-LOOP\",\n status: HARD_MAX_REVIEW_ITERATIONS > 0 && HARD_MAX_REVIEW_ITERATIONS <= 20 ? \"pass\" : \"warn\",\n detail: `Hard max: ${HARD_MAX_REVIEW_ITERATIONS}, default: ${DEFAULT_MAX_REVIEW_ITERATIONS}`,\n });\n\n // ── Pipeline timeout ──\n checks.push({\n id: \"pipeline-timeout\",\n description: \"Pipeline execution timeout is configured\",\n controlRef: \"ASI-TIMEOUT\",\n status: DEFAULT_PIPELINE_TIMEOUT_MS > 0 ? \"pass\" : \"fail\",\n detail: `Default: ${Math.round(DEFAULT_PIPELINE_TIMEOUT_MS / 1000)}s, max: ${Math.round(MAX_PIPELINE_TIMEOUT_MS / 1000)}s`,\n });\n\n // ── Diff-hash verification ──\n checks.push({\n id: \"diff-hash-verify\",\n description: \"Diff-hash verification is available for fixer handoffs\",\n controlRef: \"ASI-INTEGRITY\",\n status: \"pass\",\n detail: \"SHA-256 diff hashing with disk verification enabled\",\n });\n\n // ── D17 Medium (#406-#414): Content safety deny patterns ──\n checks.push({\n id: \"content-safety-patterns\",\n description: \"Content safety deny patterns are configured\",\n controlRef: \"ASI-CONTENT\",\n status: \"pass\",\n detail: \"Deny patterns cover prompt injection, code execution, exfiltration, and credential exposure\",\n });\n\n // ── D15 Medium (#358-#385): MCP input boundary validation ──\n checks.push({\n id: \"mcp-input-boundary\",\n description: \"MCP server input boundaries are enforced\",\n controlRef: \"ASI-MCP\",\n status: \"pass\",\n detail: \"MCP-specific injection patterns and tool delimiter detection enabled\",\n });\n\n // ── D15 Medium (#15.22, #15.44): MCP integrity and timeout ──\n checks.push({\n id: \"mcp-integrity-coverage\",\n description: \"MCP configuration files are covered by integrity manifests\",\n controlRef: \"ASI-MCP\",\n status: \"pass\",\n detail: \"Integrity scans include mcp/ directory (.json files). MCP timeout configurable per-server (default: 30s, max: 5m)\",\n });\n\n // ── D15 Medium (#15.23): Content signing limitation ──\n checks.push({\n id: \"integrity-signing-status\",\n description: \"Integrity manifest signing status\",\n controlRef: \"ASI-INTEGRITY\",\n status: \"warn\",\n detail: \"Content-addressed integrity (SHA-256) detects modifications but does not prevent re-generation by an attacker with write access. No HMAC signing is currently applied — see SECURITY.md for trust model details\",\n });\n\n // ── Summarize ──\n const passed = checks.filter((c) => c.status === \"pass\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warnings = checks.filter((c) => c.status === \"warn\").length;\n\n return {\n timestamp: new Date().toISOString(),\n compliant: failed === 0,\n checks,\n summary: {\n total: checks.length,\n passed,\n failed,\n warnings,\n },\n };\n}\n\n/**\n * Format a compliance report for human-readable display.\n */\nexport function formatComplianceReport(report: ComplianceReport): string[] {\n const lines: string[] = [];\n\n for (const check of report.checks) {\n const icon =\n check.status === \"pass\" ? \"PASS\" :\n check.status === \"fail\" ? \"FAIL\" :\n \"WARN\";\n const detail = check.detail ? ` — ${check.detail}` : \"\";\n lines.push(` [${icon}] [${check.controlRef}] ${check.description}${detail}`);\n }\n\n lines.push(\"\");\n lines.push(\n `Security compliance: ${report.summary.passed} passed, ` +\n `${report.summary.failed} failed, ${report.summary.warnings} warnings`,\n );\n\n if (!report.compliant) {\n lines.push(\"STATUS: NON-COMPLIANT — address failed checks before deploying pipeline.\");\n }\n\n return lines;\n}\n","import { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { AGENTS_DIR, HatchError } from \"../../types.js\";\nimport { readIntegrityManifest, verifyIntegrity } from \"../../integrity/index.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n warn,\n} from \"../shared/ui.js\";\n\n/**\n * Options for the verify command.\n *\n * Finding #61 (D8, High): Add --fix flag for self-healing loop.\n */\nexport interface VerifyOptions {\n /** When true, attempt to auto-fix integrity issues by running hatch3r update. */\n fix?: boolean;\n /** Maximum number of verify->fix cycles (default: 2, max: 5). */\n maxFixAttempts?: number;\n}\n\n/**\n * Run a single integrity verification pass.\n * Returns true if integrity check passed, false if issues were found.\n * Throws HatchError only if manifest is missing or results are empty.\n */\nasync function runVerifyPass(agentsDir: string): Promise<{\n passed: boolean;\n counts: Record<string, number>;\n hasModifiedOrMissing: boolean;\n hasTampered: boolean;\n}> {\n const results = await verifyIntegrity(agentsDir);\n\n if (results.length === 0) {\n return { passed: true, counts: { pass: 0 }, hasModifiedOrMissing: false, hasTampered: false };\n }\n\n const icons: Record<string, string> = {\n pass: chalk.green(\"\\u2714\"),\n modified: chalk.yellow(\"\\u2716\"),\n missing: chalk.red(\"\\u2716\"),\n new: chalk.cyan(\"+\"),\n tampered: chalk.red(\"\\u26A0\"),\n };\n\n const labels: Record<string, string> = {\n pass: chalk.green(\"PASS\"),\n modified: chalk.yellow(\"MODIFIED\"),\n missing: chalk.red(\"MISSING\"),\n new: chalk.cyan(\"NEW\"),\n tampered: chalk.red(\"TAMPERED\"),\n };\n\n console.log();\n for (const r of results) {\n const icon = icons[r.status] ?? \" \";\n const lbl = labels[r.status] ?? r.status;\n console.log(` ${icon} ${lbl.padEnd(18)} ${r.file}`);\n }\n console.log();\n\n const counts: Record<string, number> = { pass: 0, modified: 0, missing: 0, new: 0, tampered: 0 };\n for (const r of results) {\n counts[r.status] = (counts[r.status] ?? 0) + 1;\n }\n\n const hasModifiedOrMissing = (counts.modified ?? 0) > 0 || (counts.missing ?? 0) > 0;\n const hasTampered = (counts.tampered ?? 0) > 0;\n const passed = !hasModifiedOrMissing && !hasTampered;\n\n return { passed, counts, hasModifiedOrMissing, hasTampered };\n}\n\nfunction printSummary(counts: Record<string, number>, title: string, style: \"success\" | \"error\"): void {\n const summaryLines: string[] = [];\n if ((counts.pass ?? 0) > 0) summaryLines.push(`${chalk.green(\"\\u2714\")} Passed: ${counts.pass}`);\n if ((counts.modified ?? 0) > 0) summaryLines.push(`${chalk.yellow(\"\\u2716\")} Modified: ${counts.modified}`);\n if ((counts.missing ?? 0) > 0) summaryLines.push(`${chalk.red(\"\\u2716\")} Missing: ${counts.missing}`);\n if ((counts.new ?? 0) > 0) summaryLines.push(`${chalk.cyan(\"+\")} New: ${counts.new}`);\n if ((counts.tampered ?? 0) > 0) summaryLines.push(`${chalk.red(\"\\u26A0\")} Tampered: ${counts.tampered}`);\n printBox(title, summaryLines, style);\n}\n\n/** Maximum allowed fix attempts to prevent infinite loops. */\nconst MAX_FIX_ATTEMPTS = 5;\n\nexport async function verifyCommand(options: VerifyOptions = {}): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n\n const spinner = createSpinner(\"Verifying file integrity...\");\n spinner.start();\n\n const manifest = await readIntegrityManifest(agentsDir);\n if (!manifest) {\n spinner.fail(\"No integrity manifest found\");\n logError(\"Missing .agents/.integrity.json \\u2014 run `hatch3r init` or `hatch3r update` to generate it.\");\n console.log();\n throw new HatchError(\"Missing .agents/.integrity.json\", 1, \"INTEGRITY_ERROR\");\n }\n\n spinner.stop();\n\n // First verification pass\n let result = await runVerifyPass(agentsDir);\n\n if (result.passed) {\n if (result.counts.pass === 0) {\n printBox(\"Integrity\", [chalk.dim(\"No files to verify\")], \"info\");\n } else {\n printSummary(result.counts, \"Integrity check passed\", \"success\");\n }\n return;\n }\n\n // If --fix is not set, report failure and exit\n if (!options.fix) {\n printSummary(result.counts, \"Integrity check failed\", \"error\");\n if (result.hasTampered) {\n logError(\"Integrity manifest has been tampered with. Re-run `hatch3r update` to regenerate it.\");\n }\n if ((result.counts.modified ?? 0) > 0) {\n info(`Modified files may have been tampered with. Run ${chalk.bold(\"hatch3r update\")} to restore originals.`);\n }\n console.log();\n throw new HatchError(\"Integrity check failed\", 1, \"INTEGRITY_ERROR\");\n }\n\n // --fix self-healing loop: verify -> fix -> verify\n const maxAttempts = Math.min(\n Math.max(1, options.maxFixAttempts ?? 2),\n MAX_FIX_ATTEMPTS,\n );\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n info(`\\nFix attempt ${attempt}/${maxAttempts}: running hatch3r update to repair...`);\n\n const fixSpinner = createSpinner(`Fix attempt ${attempt}: updating canonical files...`);\n fixSpinner.start();\n\n try {\n // Dynamically import to avoid circular dependency\n const { runUpdate } = await import(\"./update.js\");\n const { readManifest } = await import(\"../../manifest/hatchJson.js\");\n\n const hatchManifest = await readManifest(rootDir);\n if (!hatchManifest) {\n fixSpinner.fail(\"Cannot auto-fix: no hatch.json manifest found\");\n throw new HatchError(\"Cannot auto-fix: no hatch.json manifest\", 1, \"CONFIG_ERROR\");\n }\n\n await runUpdate(rootDir, hatchManifest);\n fixSpinner.succeed(`Fix attempt ${attempt}: update completed`);\n } catch (err) {\n fixSpinner.fail(`Fix attempt ${attempt}: update failed`);\n if (err instanceof HatchError) throw err;\n throw new HatchError(\n `Auto-fix failed: ${err instanceof Error ? err.message : String(err)}`,\n 1,\n \"UNKNOWN_ERROR\",\n );\n }\n\n // Re-verify after fix\n const reVerifySpinner = createSpinner(`Re-verifying after fix attempt ${attempt}...`);\n reVerifySpinner.start();\n result = await runVerifyPass(agentsDir);\n reVerifySpinner.stop();\n\n if (result.passed) {\n printSummary(result.counts, `Integrity restored (fixed in ${attempt} attempt${attempt > 1 ? \"s\" : \"\"})`, \"success\");\n return;\n }\n\n warn(`Fix attempt ${attempt} did not resolve all issues.`);\n }\n\n // Exhausted all attempts\n printSummary(result.counts, `Integrity check failed after ${maxAttempts} fix attempt(s)`, \"error\");\n console.log();\n throw new HatchError(\n `Integrity check failed after ${maxAttempts} fix attempt(s)`,\n 1,\n \"INTEGRITY_ERROR\",\n );\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter } from \"../../adapters/index.js\";\nimport { AGENTS_DIR, HatchError } from \"../../types.js\";\nimport { extractManagedBlock } from \"../../merge/managedBlocks.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n setVerbose,\n verbose,\n} from \"../shared/ui.js\";\nimport { readWorkspaceManifest } from \"../../workspace/manifest.js\";\n\n/** Recursively sum the byte size of all files under a directory. */\nasync function dirCharCount(dir: string): Promise<number> {\n let total = 0;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n total += await dirCharCount(fullPath);\n } else if (entry.isFile()) {\n const info = await stat(fullPath);\n total += info.size;\n }\n }\n return total;\n}\n\nexport async function statusCommand(opts?: { verbose?: boolean }): Promise<void> {\n setVerbose(!!opts?.verbose);\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n const spinner = createSpinner(\"Checking sync status...\");\n spinner.start();\n\n const stats = { synced: 0, drifted: 0, missing: 0 };\n const fileLines: string[] = [];\n\n verbose(`Checking ${manifest.tools.length} tool(s): ${manifest.tools.join(\", \")}`);\n for (const tool of manifest.tools) {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(agentsDir, manifest);\n verbose(`${tool}: ${outputs.length} output file(s) to check`);\n\n fileLines.push(chalk.bold(`${tool}:`));\n\n for (const out of outputs) {\n const destPath = join(rootDir, out.path);\n try {\n const existing = await readFile(destPath, \"utf-8\");\n const existingBlock = extractManagedBlock(existing);\n const expectedBlock = out.managedContent ?? extractManagedBlock(out.content);\n if (existingBlock !== null && expectedBlock !== null ? existingBlock === expectedBlock : existing === out.content) {\n fileLines.push(` ${chalk.green(\"=\")} ${out.path}`);\n stats.synced++;\n } else {\n fileLines.push(` ${chalk.yellow(\"~\")} ${out.path} ${chalk.dim(\"(drifted)\")}`);\n stats.drifted++;\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n fileLines.push(` ${chalk.red(\"+\")} ${out.path} ${chalk.dim(\"(missing)\")}`);\n stats.missing++;\n }\n }\n }\n\n spinner.stop();\n console.log();\n\n for (const line of fileLines) {\n console.log(` ${line}`);\n }\n console.log();\n\n const summaryLines = [\n `${chalk.green(\"=\")} In sync: ${stats.synced}`,\n ];\n if (stats.drifted > 0) {\n summaryLines.push(`${chalk.yellow(\"~\")} Drifted: ${stats.drifted}`);\n }\n if (stats.missing > 0) {\n summaryLines.push(`${chalk.red(\"+\")} Missing: ${stats.missing}`);\n }\n\n // Estimate canonical token count from .agents/ directory size\n const totalChars = await dirCharCount(agentsDir);\n const estimatedTokens = Math.round(totalChars / 4);\n const formattedTokens = estimatedTokens.toLocaleString(\"en-US\");\n summaryLines.push(`${chalk.dim(\"~\")} Estimated canonical tokens: ~${formattedTokens}`);\n\n const style = stats.drifted > 0 || stats.missing > 0 ? \"info\" as const : \"success\" as const;\n printBox(\"Status\", summaryLines, style);\n\n if (stats.drifted > 0 || stats.missing > 0) {\n info(`Run ${chalk.bold(\"hatch3r sync\")} to regenerate drifted/missing files.`);\n console.log();\n }\n\n // ── Workspace topology ──────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (wsManifest && wsManifest.repos.length > 0) {\n const wsLines: string[] = [];\n for (const repo of wsManifest.repos) {\n const icon = repo.sync ? chalk.green(\"\\u2713\") : chalk.dim(\"\\u25CB\");\n let detail: string;\n if (!repo.sync) {\n detail = chalk.dim(\"sync disabled\");\n } else if (repo.lastSync) {\n const elapsed = Math.max(0, Date.now() - new Date(repo.lastSync).getTime());\n const hours = Math.floor(elapsed / (1000 * 60 * 60));\n const timeAgo = hours < 1 ? \"just now\" : hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n detail = `synced ${timeAgo}`;\n } else {\n detail = chalk.yellow(\"never synced\");\n }\n const identity = repo.owner && repo.repo\n ? chalk.dim(`${repo.owner}/${repo.repo}`)\n : \"\";\n const branch = repo.defaultBranch\n ? chalk.dim(`[${repo.defaultBranch}]`)\n : \"\";\n const identityPart = identity || branch ? ` ${identity} ${branch}` : \"\";\n wsLines.push(`${icon} ${repo.name ?? repo.path}${identityPart} ${chalk.dim(`(${detail})`)}`);\n }\n printBox(`Workspace: ${wsManifest.name} (${wsManifest.repos.length} repos)`, wsLines, \"info\");\n }\n\n // Show workspace membership info if this repo is managed by a workspace\n if (manifest.workspace) {\n const wsInfo = [\n `Managed by workspace at ${chalk.bold(manifest.workspace.rootPath)}`,\n `Last synced: ${manifest.workspace.lastSync ? new Date(manifest.workspace.lastSync).toLocaleString() : \"never\"}`,\n ];\n printBox(\"Workspace member\", wsInfo, \"info\");\n }\n}\n"],"mappings":"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","names":["output","stat","join","dirname","stat","readFile","join","resolve","MAX_CUSTOMIZE_MD_BYTES","readFile","mkdir","unlink","copyFile","dirname","randomBytes","access","mkdir","open","readFile","stat","dirname","join","fileExists","readFile","join","init_resolve","readFile","readdir","lstat","join","parseYaml","readdir","readFile","join","readFile","join","init_types","readdir","readFile","join","parseYaml","init_types","dirname","init_resolve","init_resolve","init_resolve","init_resolve","init_resolve","access","join","init_resolve","init_resolve","init_resolve","label","readFile","join","existsSync","dirname","join","readFile","readdir","join","readFile","readdir","writeFile","cp","mkdir","rm","join","dirname","label","dirEntries","f","cp","error","cp","mkdir","readFile","readdir","stat","execFileSync","fileURLToPath","dirname","join","chalk","inquirer","error","__dirname","chalk","join","readFile","execFileSync","chalk","summaryLines","chalk","rm","chalk","inquirer","access","cp","mkdir","readdir","readFile","rm","writeFile","join","tmpdir","readdir","stat","access","join","dirname","relative","readdir","join","stat","access","dirname","relative","fileExists","access","readdir","join","readFile","rm","writeFile","tmpdir","mkdir","cp","access","mkdir","readFile","fileURLToPath","basename","dirname","join","chalk","access","readFile","readdir","join","readFileSync","readFile","join","normalize","isAbsolute","isAbsolute","normalize","join","readFile","createHash","mkdir","access","readFile","join","relative","dirname","execFileSync","dirname","join","readFile","createHash","access","mkdir","relative","__dirname","dirname","fileURLToPath","CONTENT_ROOT","chalk","join","mkdir","readFile","access","repoInfo","remoteUrl","platform","owner","repo","namespace","project","tools","features","mcpServers","defaultBranch","projectType","teamSize","contentSelection","orchWarnings","wsManifest","basename","r","chalk","result","rm","inquirer","summaryLines","fileURLToPath","readFile","dirname","join","chalk","inquirer","__dirname","dirname","fileURLToPath","chalk","inquirer","join","readFile","repo","appendFile","readFile","stat","readdir","join","execFileSync","chalk","join","stat","readdir","execFileSync","appendFailure","error","readFile","appendFile","readFileOrNull","chalk","f","r","init_types","readdir","readFile","access","existsSync","join","posix","chalk","parseYaml","readFile","readdir","join","readdir","readFile","join","createHash","validateManifest","access","join","readdir","readFile","parseYaml","posix","f","spinner","chalk","existsSync","join","chalk","runUpdate","readManifest","readFile","readdir","stat","join","chalk","readdir","join","info","stat","chalk","readFile"]}
|