hatch3r 1.0.0 → 1.2.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.
Files changed (144) hide show
  1. package/README.md +93 -322
  2. package/agents/hatch3r-a11y-auditor.md +24 -6
  3. package/agents/hatch3r-architect.md +20 -1
  4. package/agents/hatch3r-ci-watcher.md +31 -8
  5. package/agents/hatch3r-context-rules.md +14 -2
  6. package/agents/hatch3r-dependency-auditor.md +21 -5
  7. package/agents/hatch3r-devops.md +37 -6
  8. package/agents/hatch3r-docs-writer.md +19 -3
  9. package/agents/hatch3r-fixer.md +171 -0
  10. package/agents/hatch3r-implementer.md +84 -11
  11. package/agents/hatch3r-learnings-loader.md +69 -13
  12. package/agents/hatch3r-lint-fixer.md +19 -14
  13. package/agents/hatch3r-perf-profiler.md +18 -1
  14. package/agents/hatch3r-researcher.md +440 -5
  15. package/agents/hatch3r-reviewer.md +97 -5
  16. package/agents/hatch3r-security-auditor.md +23 -5
  17. package/agents/hatch3r-test-writer.md +21 -10
  18. package/checks/README.md +49 -0
  19. package/checks/code-quality.md +49 -0
  20. package/checks/performance.md +58 -0
  21. package/checks/security.md +58 -0
  22. package/checks/testing.md +53 -0
  23. package/commands/board/pickup-azure-devops.md +81 -0
  24. package/commands/board/pickup-delegation-multi.md +197 -0
  25. package/commands/board/pickup-delegation.md +100 -0
  26. package/commands/board/pickup-github.md +82 -0
  27. package/commands/board/pickup-gitlab.md +81 -0
  28. package/commands/board/pickup-modes.md +143 -0
  29. package/commands/board/pickup-post-impl.md +120 -0
  30. package/commands/board/shared-azure-devops.md +149 -0
  31. package/commands/board/shared-board-overview.md +215 -0
  32. package/commands/board/shared-github.md +169 -0
  33. package/commands/board/shared-gitlab.md +142 -0
  34. package/commands/hatch3r-agent-customize.md +40 -2
  35. package/commands/hatch3r-api-spec.md +294 -32
  36. package/commands/hatch3r-benchmark.md +386 -32
  37. package/commands/hatch3r-board-fill.md +161 -25
  38. package/commands/hatch3r-board-groom.md +595 -0
  39. package/commands/hatch3r-board-init.md +203 -46
  40. package/commands/hatch3r-board-pickup.md +79 -457
  41. package/commands/hatch3r-board-refresh.md +98 -27
  42. package/commands/hatch3r-board-shared.md +87 -238
  43. package/commands/hatch3r-bug-plan.md +16 -3
  44. package/commands/hatch3r-codebase-map.md +43 -10
  45. package/commands/hatch3r-command-customize.md +6 -0
  46. package/commands/hatch3r-context-health.md +5 -0
  47. package/commands/hatch3r-cost-tracking.md +5 -0
  48. package/commands/hatch3r-debug.md +426 -0
  49. package/commands/hatch3r-dep-audit.md +7 -1
  50. package/commands/hatch3r-feature-plan.md +74 -12
  51. package/commands/hatch3r-healthcheck.md +17 -1
  52. package/commands/hatch3r-hooks.md +16 -10
  53. package/commands/hatch3r-learn.md +15 -9
  54. package/commands/hatch3r-migration-plan.md +333 -33
  55. package/commands/hatch3r-onboard.md +327 -38
  56. package/commands/hatch3r-project-spec.md +46 -10
  57. package/commands/hatch3r-quick-change.md +336 -0
  58. package/commands/hatch3r-recipe.md +6 -0
  59. package/commands/hatch3r-refactor-plan.md +29 -13
  60. package/commands/hatch3r-release.md +13 -3
  61. package/commands/hatch3r-revision.md +395 -0
  62. package/commands/hatch3r-roadmap.md +18 -3
  63. package/commands/hatch3r-rule-customize.md +6 -0
  64. package/commands/hatch3r-security-audit.md +17 -1
  65. package/commands/hatch3r-skill-customize.md +6 -0
  66. package/commands/hatch3r-test-plan.md +532 -0
  67. package/commands/hatch3r-workflow.md +113 -38
  68. package/dist/cli/index.js +5184 -2593
  69. package/dist/cli/index.js.map +1 -0
  70. package/github-agents/hatch3r-docs-agent.md +1 -0
  71. package/github-agents/hatch3r-lint-agent.md +1 -0
  72. package/github-agents/hatch3r-security-agent.md +1 -0
  73. package/github-agents/hatch3r-test-agent.md +1 -0
  74. package/hooks/hatch3r-ci-failure.md +30 -0
  75. package/hooks/hatch3r-file-save.md +22 -0
  76. package/hooks/hatch3r-post-merge.md +23 -0
  77. package/hooks/hatch3r-pre-commit.md +23 -0
  78. package/hooks/hatch3r-pre-push.md +22 -0
  79. package/hooks/hatch3r-session-start.md +22 -0
  80. package/mcp/mcp.json +22 -3
  81. package/package.json +4 -7
  82. package/prompts/hatch3r-bug-triage.md +1 -0
  83. package/prompts/hatch3r-code-review.md +1 -0
  84. package/prompts/hatch3r-pr-description.md +1 -0
  85. package/rules/hatch3r-accessibility-standards.md +1 -0
  86. package/rules/hatch3r-agent-orchestration.md +326 -53
  87. package/rules/hatch3r-agent-orchestration.mdc +225 -0
  88. package/rules/hatch3r-api-design.md +4 -1
  89. package/rules/hatch3r-browser-verification.md +33 -1
  90. package/rules/hatch3r-browser-verification.mdc +29 -0
  91. package/rules/hatch3r-ci-cd.md +5 -1
  92. package/rules/hatch3r-ci-cd.mdc +4 -1
  93. package/rules/hatch3r-code-standards.md +18 -0
  94. package/rules/hatch3r-code-standards.mdc +10 -1
  95. package/rules/hatch3r-component-conventions.md +4 -1
  96. package/rules/hatch3r-data-classification.md +1 -0
  97. package/rules/hatch3r-deep-context.md +94 -0
  98. package/rules/hatch3r-deep-context.mdc +69 -0
  99. package/rules/hatch3r-dependency-management.md +13 -0
  100. package/rules/hatch3r-feature-flags.md +4 -1
  101. package/rules/hatch3r-git-conventions.md +1 -0
  102. package/rules/hatch3r-i18n.md +4 -1
  103. package/rules/hatch3r-learning-consult.md +4 -2
  104. package/rules/hatch3r-learning-consult.mdc +3 -2
  105. package/rules/hatch3r-migrations.md +12 -0
  106. package/rules/hatch3r-observability.md +293 -1
  107. package/rules/hatch3r-performance-budgets.md +5 -2
  108. package/rules/hatch3r-performance-budgets.mdc +1 -1
  109. package/rules/hatch3r-secrets-management.md +11 -3
  110. package/rules/hatch3r-secrets-management.mdc +10 -3
  111. package/rules/hatch3r-security-patterns.md +23 -3
  112. package/rules/hatch3r-security-patterns.mdc +8 -2
  113. package/rules/hatch3r-testing.md +1 -0
  114. package/rules/hatch3r-theming.md +4 -1
  115. package/rules/hatch3r-tooling-hierarchy.md +42 -15
  116. package/rules/hatch3r-tooling-hierarchy.mdc +27 -4
  117. package/skills/hatch3r-a11y-audit/SKILL.md +1 -0
  118. package/skills/hatch3r-agent-customize/SKILL.md +3 -0
  119. package/skills/hatch3r-api-spec/SKILL.md +1 -0
  120. package/skills/hatch3r-architecture-review/SKILL.md +6 -2
  121. package/skills/hatch3r-bug-fix/SKILL.md +4 -1
  122. package/skills/hatch3r-ci-pipeline/SKILL.md +1 -0
  123. package/skills/hatch3r-command-customize/SKILL.md +1 -0
  124. package/skills/hatch3r-context-health/SKILL.md +2 -1
  125. package/skills/hatch3r-cost-tracking/SKILL.md +1 -0
  126. package/skills/hatch3r-dep-audit/SKILL.md +6 -2
  127. package/skills/hatch3r-feature/SKILL.md +9 -2
  128. package/skills/hatch3r-gh-agentic-workflows/SKILL.md +130 -21
  129. package/skills/hatch3r-incident-response/SKILL.md +11 -5
  130. package/skills/hatch3r-issue-workflow/SKILL.md +12 -7
  131. package/skills/hatch3r-logical-refactor/SKILL.md +1 -0
  132. package/skills/hatch3r-migration/SKILL.md +1 -0
  133. package/skills/hatch3r-perf-audit/SKILL.md +2 -1
  134. package/skills/hatch3r-pr-creation/SKILL.md +20 -10
  135. package/skills/hatch3r-qa-validation/SKILL.md +2 -1
  136. package/skills/hatch3r-recipe/SKILL.md +1 -0
  137. package/skills/hatch3r-refactor/SKILL.md +7 -1
  138. package/skills/hatch3r-release/SKILL.md +15 -11
  139. package/skills/hatch3r-rule-customize/SKILL.md +1 -0
  140. package/skills/hatch3r-skill-customize/SKILL.md +1 -0
  141. package/skills/hatch3r-visual-refactor/SKILL.md +1 -0
  142. package/dist/cli/hooks-ZOTFDEA3.js +0 -59
  143. package/rules/hatch3r-error-handling.md +0 -17
  144. package/rules/hatch3r-error-handling.mdc +0 -15
@@ -0,0 +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/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/cli/shared/constants.ts","../../src/cli/commands/init.ts","../../src/detect/repoAnalyzer.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 .action(initCommand);\n\nprogram\n .command(\"sync\")\n .description(\"Re-generate tool outputs from canonical .agents/ state\")\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\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?: \"tool-using\" | \"full-trust\" | \"manual-approval\";\n agentTeams?: 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 /** 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 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\"] 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};\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 { 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 { 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 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 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 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 // 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","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 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\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 } finally {\n try {\n await unlink(tmpPath);\n } catch {\n // Temp file already renamed or doesn't exist\n }\n }\n}\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 return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: existing file without managed block. Run hatch3r init --force to overwrite.`,\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 return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: existing file without managed block. Run hatch3r init --force to overwrite.`,\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 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 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): 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}\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): Promise<AdapterOutput[]> {\n this.warnings = [];\n return this.doGenerate({\n agentsDir,\n manifest,\n features: manifest.features,\n projectRoot: dirname(agentsDir),\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(agentsDir: string, agentsPath = \"/.agents/AGENTS.md\"): Promise<string[]> {\n const orchestration = await generateBridgeOrchestration(agentsDir);\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 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 lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\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 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 lines.push(\"\", desc, \"\", content);\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","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/**\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.agentsDir),\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.agentsDir),\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.agentsDir),\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 { 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 (Experimental)\",\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 experimental. Enable by setting `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` in your\",\n \"environment or in `.claude/settings.json` under `env`. 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 \"### 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\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- Use \\`--teammate-mode tmux\\` or \\`--teammate-mode in-process\\` based on your terminal\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\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 \"Rules are managed in `.claude/rules/` and agents in `.claude/agents/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...AGENT_TEAMS_SECTION,\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 ].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 = `# ${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 modelGuidance = model\n ? `\\n\\n## Recommended Model\\n\\nPreferred: \\`${model}\\`. Set via \\`/model ${model}\\` or env \\`CLAUDE_CODE_SUBAGENT_MODEL=${model}\\`.`\n : \"\";\n const desc = overrides.description ?? agent.description;\n const fm = `---\\ndescription: ${desc}\\n---`;\n const body = `${content}${modelGuidance}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n\n const defaultAllow = [\"Read\", \"Edit\", \"MultiEdit\", \"Write\", \"Grep\", \"Glob\", \"LS\", \"TodoRead\", \"TodoWrite\"];\n const claudeConfig = ctx.manifest.claude;\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: claudeConfig?.teammateMode ?? \"tool-using\",\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 if (ctx.manifest.claude?.agentTeams !== 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 ].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 ].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 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.agentsDir, \".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 } 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 { applyCustomizationRaw } from \"./customization.js\";\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.agentsDir),\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 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\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.agentsDir)];\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 ].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.agentsDir),\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 { 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};\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};\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 { 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 const normalized = normalize(relativePath);\n if (normalized.startsWith('..') || isAbsolute(normalized)) {\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 ContentIndex {\n items: CatalogItem[];\n byType: Record<string, CatalogItem[]>;\n byId: Map<string, CatalogItem>;\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\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 && existing.type !== item.type) {\n console.warn(\n `[hatch3r] Content ID collision: \"${item.id}\" exists as both ${existing.type} and ${item.type}. The ${item.type} entry will shadow the ${existing.type} entry in ID lookups.`,\n );\n }\n byId.set(item.id, item);\n }\n\n return { items, byType, byId };\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// ── 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 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 * 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};\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 { 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};\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\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 { dirname, join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\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 } 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 } from \"../../content/index.js\";\nimport { PRESETS, getPreset, type PresetId } from \"../../content/presets.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\nfunction parseGitRemote(): { owner: string; repo: string } {\n try {\n const url = execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], {\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 (err) {\n const e = err as NodeJS.ErrnoException & { status?: number };\n if (e.code === \"ENOENT\") return { owner: \"\", repo: \"\" };\n if (e.status === 128) return { owner: \"\", repo: \"\" };\n throw err;\n }\n}\n\nfunction parseGitDefaultBranch(): string {\n try {\n const ref = execFileSync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"origin/HEAD\"], {\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 (err) {\n const e = err as NodeJS.ErrnoException & { status?: number };\n if (e.code === \"ENOENT\") return \"main\";\n if (e.status === 128) return \"main\";\n throw err;\n }\n}\n\nfunction 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\nfunction getGitRemoteUrl(): string {\n try {\n return execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], { stdio: \"pipe\" }).toString().trim();\n } catch {\n return \"\";\n }\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(\"/project-spec\")} to define your new project`);\n } else {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(\"/codebase-map\")} to map your existing codebase`);\n }\n\n printBox(\"Hatch complete\", summaryLines, \"success\");\n\n if (envResult && envResult.newVars.length > 0) {\n warn(\n `Add your secrets to .env.mcp: ${envResult.newVars.join(\", \")}`,\n );\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\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 } = {},\n): Promise<void> {\n printBanner();\n\n const rootDir = process.cwd();\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 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 ---\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\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\", value: \"greenfield\" as const },\n { name: \"Brownfield — existing codebase\", value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n // --- Team size ---\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\", 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 ---\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 name: `${p.name} — ${p.description}`,\n value: p.id,\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 let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = await buildContentIndex(CONTENT_ROOT);\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 const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: contentIndex.items.map((item) => ({\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 ...(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 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 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 contentIndex = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(selectedPreset, projectType, teamSize, contentIndex, 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 await checkExisting(rootDir, false, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\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 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 } from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.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(): 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 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);\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","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 {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n warn,\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 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 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 if (result.errors.length === 0 && result.warnings.length === 0) {\n printBox(\"Validation\", [chalk.green(\"All checks passed\")], \"success\");\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","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\";\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"],"mappings":"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","names":["chalk","chalk","join","readFile","execFileSync","chalk","join","dirname","output","stat","join","dirname","join","chalk","readFile","summaryLines","execFileSync","fileURLToPath","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","readFileSync","readFileSync","__dirname","dirname","fileURLToPath","chalk","inquirer","join","access","mkdir","readFile","fileURLToPath","dirname","join","execFileSync","chalk","inquirer","access","readFile","readdir","join","join","readdir","readFile","access","__dirname","dirname","fileURLToPath","execFileSync","join","mkdir","readFile","chalk","access","inquirer","remoteUrl","platform","owner","repo","namespace","project","tools","features","mcpServers","defaultBranch","projectType","teamSize","contentSelection","orchWarnings","contentIndex","stat","readdir","join","execFileSync","chalk","join","stat","readdir","execFileSync","chalk","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"]}