hatch3r 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -1
- package/agents/hatch3r-a11y-auditor.md +7 -14
- package/agents/hatch3r-architect.md +7 -14
- package/agents/hatch3r-ci-watcher.md +7 -13
- package/agents/hatch3r-context-rules.md +5 -10
- package/agents/hatch3r-dependency-auditor.md +10 -19
- package/agents/hatch3r-devops.md +7 -16
- package/agents/hatch3r-docs-writer.md +7 -14
- package/agents/hatch3r-fixer.md +2 -8
- package/agents/hatch3r-implementer.md +2 -8
- package/agents/hatch3r-learnings-loader.md +150 -21
- package/agents/hatch3r-lint-fixer.md +7 -12
- package/agents/hatch3r-perf-profiler.md +7 -14
- package/agents/hatch3r-researcher.md +7 -14
- package/agents/hatch3r-reviewer.md +7 -13
- package/agents/hatch3r-security-auditor.md +7 -15
- package/agents/hatch3r-test-writer.md +7 -14
- package/agents/modes/architecture.md +44 -0
- package/agents/modes/boundary-analysis.md +45 -0
- package/agents/modes/codebase-impact.md +81 -0
- package/agents/modes/complexity-risk.md +40 -0
- package/agents/modes/coverage-analysis.md +44 -0
- package/agents/modes/current-state.md +52 -0
- package/agents/modes/feature-design.md +39 -0
- package/agents/modes/impact-analysis.md +45 -0
- package/agents/modes/library-docs.md +31 -0
- package/agents/modes/migration-path.md +55 -0
- package/agents/modes/prior-art.md +31 -0
- package/agents/modes/refactoring-strategy.md +55 -0
- package/agents/modes/regression.md +45 -0
- package/agents/modes/requirements-elicitation.md +68 -0
- package/agents/modes/risk-assessment.md +41 -0
- package/agents/modes/risk-prioritization.md +43 -0
- package/agents/modes/root-cause.md +39 -0
- package/agents/modes/similar-implementation.md +70 -0
- package/agents/modes/symptom-trace.md +39 -0
- package/agents/modes/test-pattern.md +61 -0
- package/agents/shared/external-knowledge.md +32 -0
- package/agents/shared/quality-charter.md +78 -0
- package/commands/board/pickup-azure-devops.md +4 -0
- package/commands/board/pickup-delegation-multi.md +3 -0
- package/commands/board/pickup-delegation.md +3 -0
- package/commands/board/pickup-github.md +4 -0
- package/commands/board/pickup-gitlab.md +4 -0
- package/commands/board/pickup-post-impl.md +8 -1
- package/commands/board/shared-azure-devops.md +13 -3
- package/commands/board/shared-github.md +1 -0
- package/commands/board/shared-gitlab.md +9 -2
- package/commands/hatch3r-agent-customize.md +5 -1
- package/commands/hatch3r-board-groom.md +55 -2
- package/commands/hatch3r-board-init.md +5 -2
- package/commands/hatch3r-board-shared.md +62 -2
- package/commands/hatch3r-command-customize.md +4 -0
- package/commands/hatch3r-context-health.md +22 -2
- package/commands/hatch3r-cost-tracking.md +14 -0
- package/commands/hatch3r-hooks.md +1 -1
- package/commands/hatch3r-learn.md +68 -2
- package/commands/hatch3r-quick-change.md +29 -3
- package/commands/hatch3r-revision.md +136 -16
- package/commands/hatch3r-rule-customize.md +4 -0
- package/commands/hatch3r-skill-customize.md +4 -0
- package/commands/hatch3r-workflow.md +10 -1
- package/dist/cli/index.js +2528 -640
- package/dist/cli/index.js.map +1 -1
- package/package.json +12 -9
- package/rules/hatch3r-agent-orchestration-detail.md +159 -0
- package/rules/hatch3r-agent-orchestration-detail.mdc +156 -0
- package/rules/hatch3r-agent-orchestration.md +91 -318
- package/rules/hatch3r-agent-orchestration.mdc +127 -149
- package/rules/hatch3r-code-standards.mdc +10 -2
- package/rules/hatch3r-component-conventions.mdc +0 -1
- package/rules/hatch3r-deep-context.mdc +30 -8
- package/rules/hatch3r-dependency-management.mdc +17 -5
- package/rules/hatch3r-i18n.mdc +0 -1
- package/rules/hatch3r-migrations.mdc +12 -1
- package/rules/hatch3r-observability.mdc +289 -0
- package/rules/hatch3r-security-patterns.mdc +11 -0
- package/rules/hatch3r-testing.mdc +1 -1
- package/rules/hatch3r-theming.mdc +0 -1
- package/rules/hatch3r-tooling-hierarchy.mdc +18 -4
- package/skills/hatch3r-agent-customize/SKILL.md +4 -72
- package/skills/hatch3r-command-customize/SKILL.md +4 -62
- package/skills/hatch3r-customize/SKILL.md +117 -0
- package/skills/hatch3r-dep-audit/SKILL.md +1 -1
- package/skills/hatch3r-rule-customize/SKILL.md +4 -65
- package/skills/hatch3r-skill-customize/SKILL.md +4 -62
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/add.ts","../../src/cli/shared/ui.ts","../../src/version.ts","../../src/cli/commands/worktreeSetup.ts","../../src/types.ts","../../src/worktree/index.ts","../../src/worktree/resolve.ts","../../src/cli/commands/config.ts","../../src/manifest/hatchJson.ts","../../src/merge/safeWrite.ts","../../src/merge/managedBlocks.ts","../../src/models/customize.ts","../../src/adapters/customization.ts","../../src/env/mcpEnv.ts","../../src/cli/commands/update.ts","../../src/adapters/base.ts","../../src/models/aliases.ts","../../src/models/resolve.ts","../../src/cli/shared/agentsContent.ts","../../src/adapters/canonical.ts","../../src/adapters/mcp-utils.ts","../../src/hooks/index.ts","../../src/hooks/types.ts","../../src/adapters/aider.ts","../../src/adapters/amazonq.ts","../../src/adapters/amp.ts","../../src/adapters/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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/add.ts","../../src/cli/shared/ui.ts","../../src/version.ts","../../src/cli/commands/worktreeSetup.ts","../../src/types.ts","../../src/worktree/index.ts","../../src/worktree/resolve.ts","../../src/cli/commands/config.ts","../../src/manifest/hatchJson.ts","../../src/merge/safeWrite.ts","../../src/merge/managedBlocks.ts","../../src/models/customize.ts","../../src/adapters/customization.ts","../../src/env/mcpEnv.ts","../../src/cli/commands/update.ts","../../src/adapters/base.ts","../../src/models/aliases.ts","../../src/models/resolve.ts","../../src/cli/shared/agentsContent.ts","../../src/adapters/canonical.ts","../../src/adapters/mcp-utils.ts","../../src/hooks/index.ts","../../src/hooks/types.ts","../../src/adapters/aider.ts","../../src/adapters/amazonq.ts","../../src/adapters/amp.ts","../../src/adapters/antigravity.ts","../../src/adapters/claude.ts","../../src/adapters/cline.ts","../../src/adapters/toml-utils.ts","../../src/adapters/codex.ts","../../src/detect/packageManager.ts","../../src/adapters/copilot.ts","../../src/adapters/cursor.ts","../../src/adapters/gemini.ts","../../src/adapters/goose.ts","../../src/adapters/kiro.ts","../../src/adapters/opencode.ts","../../src/adapters/windsurf.ts","../../src/adapters/zed.ts","../../src/adapters/index.ts","../../src/cli/shared/paths.ts","../../src/integrity/index.ts","../../src/archive/index.ts","../../src/content/index.ts","../../src/workspace/manifest.ts","../../src/workspace/types.ts","../../src/workspace/detect.ts","../../src/workspace/sync.ts","../../src/detect/repoAnalyzer.ts","../../src/workspace/resolve.ts","../../src/workspace/git.ts","../../src/cli/shared/constants.ts","../../src/cli/commands/init.ts","../../src/content/presets.ts","../../src/cli/commands/sync.ts","../../src/cli/commands/validate.ts","../../src/cli/commands/verify.ts","../../src/cli/commands/status.ts"],"sourcesContent":["// Sync I/O (execFileSync) is used intentionally in init/update for package\n// manager operations where async would add complexity without benefit.\n\nimport { Command } from \"commander\";\nimport { addCommand } from \"./commands/add.js\";\nimport { worktreeSetupCommand } from \"./commands/worktreeSetup.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { updateCommand } from \"./commands/update.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { verifyCommand } from \"./commands/verify.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { HatchError, TOOL_CHOICES } from \"../types.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"hatch3r\")\n .description(\n \"Battle-tested agentic coding setup framework. Crack the egg. Hatch better agents.\",\n )\n .version(HATCH3R_VERSION);\n\nprogram\n .command(\"init\")\n .description(\"Install a complete agent setup into the current repo\")\n .option(\n \"--tools <tools>\",\n `Comma-separated tools (${TOOL_CHOICES})`,\n )\n .option(\"--yes\", \"Skip interactive prompts, use defaults\")\n .option(\"--preset <preset>\", \"Content preset: minimal, standard, full\")\n .option(\"--project-type <type>\", \"Project type: greenfield, brownfield\")\n .option(\"--team-size <size>\", \"Team size: solo, team\")\n .option(\"--workspace\", \"Initialize as a multi-repo workspace\")\n .action(initCommand);\n\nprogram\n .command(\"sync\")\n .description(\"Re-generate tool outputs from canonical .agents/ state\")\n .option(\"--repos [paths...]\", \"Sync workspace content to sub-repos (all opted-in if no paths given)\")\n .option(\"--dry-run\", \"Show what would change without modifying files\")\n .option(\"--force\", \"Overwrite locally modified files in sub-repos\")\n .option(\"--minimal\", \"Generate stripped-down output (no comments, minimal formatting) to reduce token usage\")\n .action(syncCommand);\n\nprogram\n .command(\"status\")\n .description(\"Check sync status between canonical .agents/ and generated files\")\n .action(statusCommand);\n\nprogram\n .command(\"update\")\n .description(\"Pull latest hatch3r templates with safe merge\")\n .option(\"--yes\", \"Skip interactive prompts, use defaults\")\n .action(updateCommand);\n\nprogram\n .command(\"validate\")\n .description(\"Validate the canonical .agents/ structure\")\n .action(validateCommand);\n\nprogram\n .command(\"verify\")\n .description(\"Verify integrity of canonical agent files\")\n .action(verifyCommand);\n\nprogram\n .command(\"config\")\n .description(\"Reconfigure tools, MCP servers, features, and platform\")\n .action(configCommand);\n\nprogram\n .command(\"add [pack]\")\n .description(\"Install a community pack (coming soon)\")\n .action(addCommand);\n\nprogram\n .command(\"worktree-setup [worktree-path]\")\n .description(\"Set up gitignored files in a git worktree\")\n .option(\"--from <path>\", \"Main repo path (auto-detected by default)\")\n .option(\"--dry-run\", \"Show what would be done without changes\")\n .option(\"--force\", \"Overwrite existing files in the worktree\")\n .action(worktreeSetupCommand);\n\n// Agent command names that users might try to run directly in the terminal.\n// These are slash commands meant to be invoked inside an AI-powered editor, not from the CLI.\nconst AGENT_COMMAND_NAMES = new Set([\n \"review\", \"workflow\", \"project-spec\", \"codebase-map\", \"debug\", \"release\",\n \"refactor-plan\", \"test-plan\", \"bug-plan\", \"roadmap\", \"onboard\", \"recipe\",\n \"board-init\", \"board-pickup\", \"board-groom\", \"board-refresh\",\n \"security-audit\", \"dep-audit\", \"benchmark\", \"healthcheck\", \"context-health\",\n \"learn\", \"revision\", \"cost-tracking\", \"api-spec\", \"hooks\", \"quick-change\",\n \"command-customize\",\n]);\n\n// Catch-all for unknown commands -- redirect agent commands to the editor\nprogram.on(\"command:*\", (operands: string[]) => {\n const cmd = operands[0];\n if (cmd && AGENT_COMMAND_NAMES.has(cmd)) {\n console.error(\n `\\n \"${cmd}\" is a hatch3r agent command meant to be run inside your AI editor (e.g. /${cmd}).` +\n `\\n It cannot be invoked from the terminal CLI.` +\n `\\n\\n To use agent commands, open your project in Cursor, Claude Code, or another supported tool` +\n `\\n and type /${cmd} in the AI chat.\\n`,\n );\n } else {\n console.error(\n `\\n Unknown command: ${cmd}` +\n `\\n Run \"hatch3r --help\" for available commands.\\n`,\n );\n }\n process.exit(1);\n});\n\nconst nodeVersion = parseInt(process.version.slice(1), 10);\nif (nodeVersion < 22) {\n console.error(\n `hatch3r requires Node.js >= 22.0.0 (current: ${process.version}). Please upgrade Node.js.`,\n );\n process.exit(1);\n}\n\nlet shuttingDown = false;\nfor (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n if (shuttingDown) return;\n shuttingDown = true;\n // Allow pending writes to flush\n process.stdout.write(\"\", () => {\n process.stderr.write(\"\", () => {\n process.exit(0);\n });\n });\n });\n}\n\nprocess.on(\"unhandledRejection\", (reason) => {\n console.error(\n `\\nhatch3r: unhandled promise rejection: ${reason instanceof Error ? reason.message : String(reason)}`,\n );\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\ntry {\n await program.parseAsync();\n} catch (err) {\n if (err instanceof HatchError) {\n process.exit(err.exitCode);\n }\n const isUsageError = err instanceof Error && (\n err.message.includes(\"Invalid\") ||\n err.message.includes(\"Unknown\") ||\n err.message.includes(\"missing required\")\n );\n console.error(\n `\\nhatch3r encountered an ${isUsageError ? \"usage\" : \"unexpected\"} error: ${err instanceof Error ? err.message : String(err)}`,\n );\n console.error(\" For help, see: https://hatch3r.dev/docs/troubleshooting\");\n if (process.env.DEBUG) {\n console.error(err);\n }\n process.exit(isUsageError ? 2 : 1);\n}\n","import chalk from \"chalk\";\nimport { printBanner } from \"../shared/ui.js\";\n\nexport async function addCommand(): Promise<void> {\n printBanner(true);\n console.log();\n console.log(chalk.yellow(\" Coming soon!\"));\n console.log(chalk.dim(\" The `add` command will allow installing community packs.\"));\n console.log(chalk.dim(\" Follow https://github.com/hatch3r for updates.\"));\n console.log();\n}\n","import chalk from \"chalk\";\nimport ora, { type Ora } from \"ora\";\nimport boxen from \"boxen\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\n\nconst CYAN = chalk.hex(\"#06b6d4\");\nconst DIM_CYAN = chalk.hex(\"#67e8f9\");\n\nconst SHADOW_CHARS = new Set(\"╔═╗╚╝║\");\n\nfunction gradient(\n text: string,\n from: [number, number, number],\n to: [number, number, number],\n): string {\n const chars = [...text];\n const len = chars.filter((c) => c !== \" \").length;\n let idx = 0;\n return chars\n .map((c) => {\n if (c === \" \") return c;\n const t = len > 1 ? idx / (len - 1) : 0;\n idx++;\n const r = Math.round(from[0] + (to[0] - from[0]) * t);\n const g = Math.round(from[1] + (to[1] - from[1]) * t);\n const b = Math.round(from[2] + (to[2] - from[2]) * t);\n if (SHADOW_CHARS.has(c)) {\n const DIM = 0.55;\n return chalk.rgb(\n Math.round(r * DIM),\n Math.round(g * DIM),\n Math.round(b * DIM),\n )(c);\n }\n return chalk.rgb(r, g, b).bold(c);\n })\n .join(\"\");\n}\n\n// ANSI Shadow style — 6-row glyphs with 3D depth via block + box-drawing chars\nconst LOGO = [\n \"██╗ ██╗ █████╗ ████████╗ ██████╗██╗ ██╗██████╗ ██████╗ \",\n \"██║ ██║██╔══██╗╚══██╔══╝██╔════╝██║ ██║╚════██╗██╔══██╗\",\n \"███████║███████║ ██║ ██║ ███████║ █████╔╝██████╔╝\",\n \"██╔══██║██╔══██║ ██║ ██║ ██╔══██║ ╚═══██╗██╔══██╗\",\n \"██║ ██║██║ ██║ ██║ ╚██████╗██║ ██║██████╔╝██║ ██║\",\n \"╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝\",\n].map((row) => gradient(row, [6, 182, 212], [20, 184, 166]));\n\nfunction buildBanner(): string[] {\n const lines: string[] = [\"\"];\n for (const row of LOGO) {\n lines.push(` ${row}`);\n }\n lines.push(` ${DIM_CYAN(\"Crack the egg. Hatch better agents.\")}`);\n lines.push(` ${chalk.dim(`v${HATCH3R_VERSION}`)}`);\n lines.push(\"\");\n return lines;\n}\n\nconst BANNER_LINES = buildBanner();\n\nexport function printBanner(compact = false): void {\n if (compact) {\n console.log(\n `\\n ${CYAN.bold(\"hatch3r\")} ${chalk.dim(`v${HATCH3R_VERSION}`)}\\n`,\n );\n return;\n }\n for (const line of BANNER_LINES) {\n console.log(line);\n }\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: \"cyan\",\n spinner: \"dots\",\n indent: 2,\n });\n}\n\nexport function printBox(\n title: string,\n lines: string[],\n style: \"success\" | \"info\" | \"error\" = \"info\",\n): void {\n const colors = {\n success: \"#10b981\" as const,\n info: \"#06b6d4\" as const,\n error: \"#ef4444\" as const,\n };\n const content = lines.join(\"\\n\");\n console.log(\n boxen(content, {\n title,\n titleAlignment: \"left\",\n padding: { top: 0, bottom: 0, left: 1, right: 1 },\n margin: { top: 0, bottom: 1, left: 1, right: 0 },\n borderColor: colors[style],\n borderStyle: \"round\",\n dimBorder: style === \"info\",\n }),\n );\n}\n\nexport function error(msg: string): void {\n console.log(` ${chalk.red(\"✖\")} ${msg}`);\n}\n\nexport function warn(msg: string): void {\n console.log(` ${chalk.yellow(\"⚠\")} ${msg}`);\n}\n\nexport function info(msg: string): void {\n console.log(` ${CYAN(\"ℹ\")} ${msg}`);\n}\n\nexport function step(n: number, total: number, msg: string): string {\n return `${chalk.dim(`[${n}/${total}]`)} ${msg}`;\n}\n\nexport function label(name: string, value: string): string {\n return `${chalk.dim(name.padEnd(12))} ${value}`;\n}\n","declare const __VERSION__: string;\nexport const HATCH3R_VERSION = __VERSION__;\n","import { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { execFileSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport {\n WORKTREE_INCLUDE_FILE,\n HatchError,\n} from \"../../types.js\";\nimport {\n setupWorktree,\n parseWorktreeInclude,\n} from \"../../worktree/index.js\";\nimport {\n isInsideWorktree,\n findMainWorktree,\n} from \"../../worktree/resolve.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n warn,\n label,\n} from \"../shared/ui.js\";\n\nexport async function worktreeSetupCommand(\n worktreePath?: string,\n opts: { from?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<void> {\n printBanner(true);\n\n const cwd = process.cwd();\n let mainRoot: string;\n let targetRoot: string;\n\n if (isInsideWorktree(cwd)) {\n mainRoot = opts.from ?? findMainWorktree(cwd);\n targetRoot = worktreePath ? join(cwd, worktreePath) : cwd;\n info(`Detected worktree. Main repo: ${chalk.dim(mainRoot)}`);\n } else {\n mainRoot = opts.from ?? cwd;\n if (!worktreePath) {\n logError(\"Worktree path is required when running from the main repo.\");\n console.log(chalk.dim(\" Usage: hatch3r worktree-setup <worktree-path>\"));\n console.log(chalk.dim(\" Or run this command from inside a worktree.\\n\"));\n throw new HatchError(\"Missing worktree path\", 1, \"VALIDATION_ERROR\");\n }\n targetRoot = join(cwd, worktreePath);\n }\n\n const includePath = join(mainRoot, WORKTREE_INCLUDE_FILE);\n let includeContent: string;\n try {\n includeContent = await readFile(includePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n logError(`No ${WORKTREE_INCLUDE_FILE} found in ${mainRoot}`);\n console.log(chalk.dim(\" Run `hatch3r init` or `hatch3r sync` to generate it.\\n\"));\n throw new HatchError(`Missing ${WORKTREE_INCLUDE_FILE}`, 1, \"FS_ERROR\");\n }\n throw err;\n }\n\n if (opts.dryRun) {\n info(\"Dry run — no changes will be made.\\n\");\n const entries = parseWorktreeInclude(includeContent);\n const summaryLines = entries.map((e) => {\n const icon = e.strategy === \"symlink\" ? chalk.cyan(\"→\") : chalk.green(\"+\");\n return ` ${icon} ${e.pattern} ${chalk.dim(`(${e.strategy})`)}`;\n });\n printBox(\"Worktree setup (dry run)\", [\n label(\"Source\", mainRoot),\n label(\"Target\", targetRoot),\n label(\"Entries\", `${entries.length}`),\n \"\",\n ...summaryLines,\n ], \"info\");\n return;\n }\n\n const s = createSpinner(\"Setting up worktree files...\");\n s.start();\n\n const result = await setupWorktree(mainRoot, targetRoot);\n\n s.succeed(\"Worktree files set up\");\n\n const summaryLines: string[] = [];\n if (result.copied.length > 0) {\n summaryLines.push(label(\"Copied\", `${result.copied.length} file(s)`));\n for (const f of result.copied) {\n summaryLines.push(` ${chalk.green(\"+\")} ${f}`);\n }\n }\n if (result.symlinked.length > 0) {\n summaryLines.push(label(\"Symlinked\", `${result.symlinked.length} path(s)`));\n for (const f of result.symlinked) {\n summaryLines.push(` ${chalk.cyan(\"→\")} ${f}`);\n }\n }\n if (result.skipped.length > 0) {\n summaryLines.push(label(\"Skipped\", `${result.skipped.length} path(s)`));\n }\n if (result.errors.length > 0) {\n for (const e of result.errors) {\n warn(e);\n }\n }\n\n if (summaryLines.length > 0) {\n printBox(\"Worktree setup\", summaryLines, \"success\");\n } else {\n info(\"No files to set up (all patterns already satisfied or source files missing).\");\n }\n\n // Auto-sync adapter output in the worktree so CLAUDE.md, .claude/, etc. are fresh\n try {\n info(\"Syncing adapter output in worktree...\");\n execFileSync(\"npx\", [\"hatch3r\", \"sync\", \"--yes\"], {\n cwd: targetRoot,\n stdio: \"pipe\",\n });\n info(\"Adapter output synced in worktree\");\n } catch {\n warn(\"Could not auto-sync adapter output. Run `hatch3r sync` in the worktree manually.\");\n }\n}\n","export type Platform = \"github\" | \"azure-devops\" | \"gitlab\";\n\nexport interface ModelConfig {\n default?: string;\n agents?: Record<string, string>;\n}\n\nexport interface ClaudeConfig {\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n teammateMode?: \"auto\" | \"in-process\" | \"tmux\" | \"tool-using\" | \"full-trust\" | \"manual-approval\";\n agentTeams?: boolean | \"ga\";\n}\n\n/** Controls how adapter output is generated (verbosity), not what content is selected. */\nexport type GenerationMode = \"standard\" | \"minimal\";\n\nexport interface HatchManifest {\n version: string;\n hatch3rVersion: string;\n platform?: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n board?: BoardConfig;\n repos?: RepoEntry[];\n packages?: PackageEntry[];\n hooks?: HooksConfig;\n models?: ModelConfig;\n claude?: ClaudeConfig;\n /** Content selection from init. undefined = legacy \"full\" (backward compat). */\n content?: ContentSelection;\n /** Detected project languages from repo analysis. */\n languages?: string[];\n /** Git worktree file-isolation settings. */\n worktree?: WorktreeConfig;\n /** Tracks project specs generated by /project-spec or /api-spec commands. */\n specs?: {\n paths: string[];\n lastGenerated?: string;\n };\n /** Present when this repo is managed by a workspace. */\n workspace?: {\n /** Relative path from this repo back to workspace root. */\n rootPath: string;\n /** ISO timestamp of last workspace sync. */\n lastSync: string;\n /** hatch3r version used for last sync. */\n syncVersion: string;\n /** SHA-256 of workspace.json at time of sync. */\n workspaceChecksum: string;\n /** Content IDs explicitly excluded by this repo. */\n excludedContent?: string[];\n /** Content IDs added locally (not from workspace). */\n localContent?: string[];\n };\n managedFiles: string[];\n}\n\nexport interface WorktreeConfig {\n enabled: boolean;\n /** Additional user-specified gitignore patterns to include. */\n extraPatterns?: string[];\n /** Strategy for node_modules: \"symlink\" (default) or \"skip\". */\n nodeModules?: \"symlink\" | \"skip\";\n}\n\nexport const TOOLS = [\"cursor\", \"copilot\", \"claude\", \"opencode\", \"windsurf\", \"amp\", \"codex\", \"gemini\", \"cline\", \"aider\", \"kiro\", \"goose\", \"zed\", \"amazon-q\", \"antigravity\"] as const;\nexport type Tool = (typeof TOOLS)[number];\nexport const VALID_TOOLS = new Set<string>(TOOLS);\nexport const TOOL_CHOICES = TOOLS.join(\", \");\n\nexport interface BoardConfig {\n owner: string;\n repo: string;\n /** Default branch for checkout, PR base, and release. Fallback: \"main\". */\n defaultBranch?: string;\n projectNumber: number | null;\n statusFieldId: number | null;\n statusOptions: {\n backlog: string | null;\n ready: string | null;\n inProgress: string | null;\n inReview: string | null;\n done: string | null;\n };\n labels: {\n types: string[];\n executors: string[];\n statuses: string[];\n meta: string[];\n };\n branchConvention: string;\n areas: string[];\n}\n\nexport interface RepoEntry {\n owner: string;\n repo: string;\n name?: string;\n}\n\nexport interface PackageEntry {\n name: string;\n path: string;\n}\n\nexport interface Features {\n agents: boolean;\n skills: boolean;\n rules: boolean;\n prompts: boolean;\n commands: boolean;\n mcp: boolean;\n githubAgents: boolean;\n hooks: boolean;\n}\n\nexport interface McpConfig {\n servers: string[];\n}\n\nexport interface HooksConfig {\n enabled: boolean;\n}\n\nexport interface CanonicalFile {\n id: string;\n type: \"rule\" | \"agent\" | \"skill\" | \"command\" | \"prompt\" | \"github-agent\" | \"hook\";\n description: string;\n scope?: string;\n model?: string;\n protected?: boolean;\n /** Agent runs with restricted write permissions (Cursor v2.5+ subagents). */\n readonly?: boolean;\n /** Agent runs in background without blocking the parent (Cursor v2.5+ async subagents). */\n background?: boolean;\n tags?: string[];\n content: string;\n rawContent: string;\n sourcePath: string;\n}\n\nexport interface CanonicalMetadata {\n id: string;\n type: string;\n description: string;\n name?: string;\n scope?: string;\n model?: string;\n agent?: string;\n event?: string;\n globs?: string;\n protected?: boolean;\n alwaysApply?: boolean;\n /** Agent runs with restricted write permissions (Cursor v2.5+ subagents). */\n readonly?: boolean;\n /** Agent runs in background without blocking the parent (Cursor v2.5+ async subagents). */\n background?: boolean;\n tags?: string[];\n}\n\nexport interface ContentSelection {\n preset: \"minimal\" | \"standard\" | \"full\" | \"custom\";\n projectType: \"greenfield\" | \"brownfield\";\n teamSize: \"solo\" | \"team\";\n /** Explicit list of selected content IDs (without hatch3r- prefix).\n * Populated for all presets — the resolved result of preset + context filters. */\n items: {\n agents: string[];\n skills: string[];\n rules: string[];\n commands: string[];\n prompts: string[];\n hooks: string[];\n githubAgents: string[];\n };\n}\n\nexport interface AdapterOutput {\n path: string;\n content: string;\n /** Inner content for the managed block (used for merge on update). */\n managedContent?: string;\n action: \"create\" | \"update\" | \"skip\";\n}\n\nexport interface MergeResult {\n path: string;\n action: \"created\" | \"updated\" | \"skipped\";\n warning?: string;\n}\n\nexport type Framework =\n | \"next\"\n | \"angular\"\n | \"vue\"\n | \"svelte\"\n | \"sveltekit\"\n | \"remix\"\n | \"astro\"\n | \"nuxt\"\n | \"react\"\n | \"express\"\n | \"fastify\"\n | \"hono\";\n\nexport interface RepoInfo {\n languages: string[];\n packageManager: \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" | \"unknown\";\n frameworks: Framework[];\n isMonorepo: boolean;\n hasExistingAgents: boolean;\n existingTools: Tool[];\n rootDir: string;\n}\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\n/** Structured error codes for programmatic error handling (e.g., CI scripts). */\nexport type HatchErrorCode =\n | \"VALIDATION_ERROR\"\n | \"CONFIG_ERROR\"\n | \"FS_ERROR\"\n | \"INTEGRITY_ERROR\"\n | \"ADAPTER_ERROR\"\n | \"NETWORK_ERROR\"\n | \"UNKNOWN_ERROR\";\n\nexport class HatchError extends Error {\n constructor(\n message: string,\n public readonly exitCode: number = 1,\n public readonly errorCode: HatchErrorCode = \"UNKNOWN_ERROR\",\n ) {\n super(message);\n this.name = \"HatchError\";\n }\n}\n\nexport function sanitizeId(id: string): string {\n return id.replace(/[^a-zA-Z0-9._-]/g, \"\");\n}\n\n/** Returns id with exactly one hatch3r- prefix (strips existing prefix before adding). */\nexport function toPrefixedId(id: string, prefix = HATCH3R_PREFIX): string {\n const base = id.replace(new RegExp(`^${prefix.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`), \"\");\n return `${prefix}${base}`;\n}\nexport const MANIFEST_FILE = \"hatch.json\";\nexport const WORKTREE_INCLUDE_FILE = \".worktreeinclude\";\n\nexport const DEFAULT_FEATURES: Features = {\n agents: true,\n skills: true,\n rules: true,\n prompts: true,\n commands: true,\n mcp: true,\n githubAgents: true,\n hooks: true,\n};\n\nexport interface McpServerMeta {\n description: string;\n requiresEnv?: string[];\n}\n\nexport const ENV_VAR_HELP: Record<string, { comment: string; url: string }> = {\n GITHUB_PAT: {\n comment: \"GitHub MCP server — Classic PAT: repo, read:org, project. Fine-grained: Contents(RW), Issues(RW), Pull Requests(RW), Projects(RW)\",\n url: \"https://github.com/settings/tokens/new\",\n },\n AZURE_DEVOPS_PAT: {\n comment: \"Azure DevOps Personal Access Token (Work Items, Code, Build RW)\",\n url: \"https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate\",\n },\n AZURE_DEVOPS_ORG: {\n comment: \"Azure DevOps organization name\",\n url: \"https://dev.azure.com/\",\n },\n GITLAB_TOKEN: {\n comment: \"GitLab Personal Access Token (api scope)\",\n url: \"https://gitlab.com/-/user_settings/personal_access_tokens\",\n },\n BRAVE_API_KEY: {\n comment: \"Brave Search (free: 2,000 queries/month)\",\n url: \"https://brave.com/search/api/\",\n },\n SENTRY_AUTH_TOKEN: {\n comment: \"Sentry error tracking\",\n url: \"https://sentry.io/settings/account/api/auth-tokens/\",\n },\n POSTGRES_URL: {\n comment: \"PostgreSQL connection string (e.g. postgresql://user:pass@host:5432/db)\",\n url: \"\",\n },\n LINEAR_API_KEY: {\n comment: \"Linear issue tracking\",\n url: \"https://linear.app/settings/api\",\n },\n};\n\nexport const AVAILABLE_MCP_SERVERS: Record<string, McpServerMeta> = {\n github: {\n description:\n \"GitHub repository management, code review, issues, PRs, and project boards\",\n requiresEnv: [\"GITHUB_PAT\"],\n },\n \"azure-devops\": {\n description:\n \"Azure DevOps work items, repos, pipelines, and boards\",\n requiresEnv: [\"AZURE_DEVOPS_PAT\", \"AZURE_DEVOPS_ORG\"],\n },\n gitlab: {\n description:\n \"GitLab issues, merge requests, pipelines, and project management\",\n requiresEnv: [\"GITLAB_TOKEN\"],\n },\n context7: {\n description:\n \"Up-to-date, version-specific library documentation for LLMs\",\n },\n filesystem: {\n description: \"File management and code editing operations\",\n },\n playwright: {\n description: \"Browser automation, web testing, and UI interaction\",\n },\n \"brave-search\": {\n description:\n \"Web research, fact-checking, and current information retrieval\",\n requiresEnv: [\"BRAVE_API_KEY\"],\n },\n sentry: {\n description:\n \"Error tracking and performance monitoring (enable and configure with your Sentry auth token)\",\n requiresEnv: [\"SENTRY_AUTH_TOKEN\"],\n },\n postgres: {\n description:\n \"PostgreSQL database queries and schema inspection (enable and configure with your connection string)\",\n requiresEnv: [\"POSTGRES_URL\"],\n },\n linear: {\n description:\n \"Linear issue tracking and project management (enable and configure with your Linear API key)\",\n requiresEnv: [\"LINEAR_API_KEY\"],\n },\n};\n","import { readFile, mkdir, copyFile, symlink, lstat, unlink } from \"node:fs/promises\";\nimport { join, relative, dirname } from \"node:path\";\nimport {\n MANAGED_BLOCK_START,\n MANAGED_BLOCK_END,\n WORKTREE_INCLUDE_FILE,\n type HatchManifest,\n} from \"../types.js\";\nimport type { WorktreeEntry, WorktreeSetupResult } from \"./types.js\";\nimport { resolvePatterns, findMainWorktree } from \"./resolve.js\";\n\n// ─── Adapter worktree patterns ───────────────────────────────────────────────\n\n/**\n * Per-tool adapter output patterns that should be present in worktrees.\n * All use \"copy\" strategy so worktrees can run `hatch3r sync` independently\n * without cross-worktree contamination via symlinks.\n *\n * Including patterns for files that are tracked by git is harmless —\n * `resolvePatterns` uses `git ls-files --others --ignored` which only matches\n * untracked+gitignored files, so tracked patterns are a no-op safety net.\n */\nexport const ADAPTER_WORKTREE_PATTERNS: Record<\n string,\n { pattern: string; strategy: \"copy\" | \"symlink\"; reason: string }[]\n> = {\n claude: [\n { pattern: \"CLAUDE.md\", strategy: \"copy\", reason: \"Claude main instructions\" },\n { pattern: \".claude/\", strategy: \"copy\", reason: \"Claude adapter output (settings, rules, agents, skills, commands)\" },\n { pattern: \".mcp.json\", strategy: \"copy\", reason: \"MCP server config\" },\n ],\n gemini: [\n { pattern: \"GEMINI.md\", strategy: \"copy\", reason: \"Gemini main instructions\" },\n { pattern: \".gemini/\", strategy: \"copy\", reason: \"Gemini adapter output (settings, commands, skills)\" },\n ],\n cursor: [\n { pattern: \".cursor/\", strategy: \"copy\", reason: \"Cursor adapter output (rules, agents, skills, commands, MCP)\" },\n ],\n copilot: [\n { pattern: \".github/copilot-instructions.md\", strategy: \"copy\", reason: \"Copilot instructions\" },\n { pattern: \".github/instructions/\", strategy: \"copy\", reason: \"Copilot scoped instructions\" },\n { pattern: \".github/agents/\", strategy: \"copy\", reason: \"Copilot agents\" },\n { pattern: \".github/prompts/\", strategy: \"copy\", reason: \"Copilot prompts\" },\n { pattern: \".github/copilot/\", strategy: \"copy\", reason: \"Copilot commands and agents\" },\n { pattern: \".github/skills/\", strategy: \"copy\", reason: \"Copilot skills\" },\n { pattern: \".vscode/mcp.json\", strategy: \"copy\", reason: \"VS Code MCP config\" },\n ],\n windsurf: [\n { pattern: \".windsurfrules\", strategy: \"copy\", reason: \"Windsurf main instructions\" },\n { pattern: \".windsurf/\", strategy: \"copy\", reason: \"Windsurf adapter output (rules, skills, workflows, MCP)\" },\n ],\n cline: [\n { pattern: \".roomodes\", strategy: \"copy\", reason: \"Roo Code custom modes\" },\n { pattern: \".roo/\", strategy: \"copy\", reason: \"Roo Code rules and MCP\" },\n { pattern: \".cline/\", strategy: \"copy\", reason: \"Cline skills\" },\n { pattern: \".clinerules/\", strategy: \"copy\", reason: \"Cline workflows\" },\n ],\n amp: [\n { pattern: \".amp/\", strategy: \"copy\", reason: \"Amp adapter output (agents, settings, skills)\" },\n ],\n codex: [\n { pattern: \".codex/\", strategy: \"copy\", reason: \"Codex adapter output (config, skills)\" },\n ],\n opencode: [\n { pattern: \"opencode.json\", strategy: \"copy\", reason: \"OpenCode config\" },\n { pattern: \".opencode/\", strategy: \"copy\", reason: \"OpenCode adapter output (agents, skills, commands)\" },\n ],\n kiro: [\n { pattern: \".kiro/\", strategy: \"copy\", reason: \"Kiro adapter output (steering, settings)\" },\n ],\n aider: [\n { pattern: \"CONVENTIONS.md\", strategy: \"copy\", reason: \"Aider conventions\" },\n { pattern: \".aider.conf.yml\", strategy: \"copy\", reason: \"Aider config\" },\n { pattern: \".aider/\", strategy: \"copy\", reason: \"Aider skills\" },\n ],\n goose: [\n { pattern: \".goosehints\", strategy: \"copy\", reason: \"Goose instructions\" },\n { pattern: \".goose/\", strategy: \"copy\", reason: \"Goose MCP config\" },\n ],\n zed: [\n { pattern: \".rules\", strategy: \"copy\", reason: \"Zed rules\" },\n ],\n \"amazon-q\": [\n { pattern: \".amazonq/\", strategy: \"copy\", reason: \"Amazon Q adapter output (rules, settings)\" },\n ],\n antigravity: [\n { pattern: \".antigravity/\", strategy: \"copy\", reason: \"Antigravity adapter output (rules, skills, settings)\" },\n ],\n};\n\n// ─── Generate ────────────────────────────────────────────────────────────────\n\n/**\n * Builds the `.worktreeinclude` file content with managed blocks.\n * Each entry is annotated with a strategy suffix (`# hatch3r:symlink` or\n * implicit copy) so that `parseWorktreeInclude` can reconstruct the plan.\n */\nexport async function generateWorktreeInclude(\n manifest: HatchManifest,\n rootDir: string,\n): Promise<string> {\n const lines: string[] = [];\n const entries: { pattern: string; strategy: \"copy\" | \"symlink\"; reason: string }[] = [];\n\n // Always include env files (copy — they contain secrets)\n entries.push({ pattern: \".env\", strategy: \"copy\", reason: \"environment variables\" });\n entries.push({ pattern: \".env.*\", strategy: \"copy\", reason: \"environment variables (includes .env.mcp)\" });\n\n // .agents/ — always include (no-op if tracked by git)\n entries.push({ pattern: \".agents/\", strategy: \"symlink\", reason: \"shared agent definitions\" });\n entries.push({\n pattern: \".agents/learnings/\",\n strategy: \"copy\",\n reason: \"per-worktree learnings (diverge across branches)\",\n });\n\n // AGENTS.md — public agent documentation\n entries.push({ pattern: \"AGENTS.md\", strategy: \"copy\", reason: \"public agent documentation\" });\n\n // docs/specs/ — project specifications (read by agents during implementation and review)\n entries.push({ pattern: \"docs/specs/\", strategy: \"copy\", reason: \"project specifications for agent context\" });\n\n // Tool-specific adapter output patterns\n for (const tool of manifest.tools) {\n const toolPatterns = ADAPTER_WORKTREE_PATTERNS[tool];\n if (toolPatterns) {\n entries.push(...toolPatterns);\n }\n }\n\n // node_modules\n if (manifest.worktree?.nodeModules !== \"skip\") {\n entries.push({\n pattern: \"node_modules/\",\n strategy: \"symlink\",\n reason: \"shared dependencies (saves disk space)\",\n });\n }\n\n // Extra user-specified patterns\n if (manifest.worktree?.extraPatterns) {\n for (const p of manifest.worktree.extraPatterns) {\n entries.push({ pattern: p, strategy: \"copy\", reason: \"user-specified\" });\n }\n }\n\n // Build file content\n lines.push(\"# hatch3r worktree include file\");\n lines.push(\"# Defines which gitignored files should be present in worktrees.\");\n lines.push(\"# Lines with '# hatch3r:symlink' are symlinked; others are copied.\");\n lines.push(\"\");\n lines.push(MANAGED_BLOCK_START);\n\n for (const entry of entries) {\n lines.push(`# ${entry.reason}`);\n if (entry.strategy === \"symlink\") {\n lines.push(`${entry.pattern} # hatch3r:symlink`);\n } else {\n lines.push(entry.pattern);\n }\n }\n\n lines.push(MANAGED_BLOCK_END);\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n// ─── Parse ───────────────────────────────────────────────────────────────────\n\n/**\n * Parses a `.worktreeinclude` file into structured entries.\n * - Skips blank lines and comment-only lines.\n * - Detects `# hatch3r:symlink` suffix to determine strategy.\n */\nexport function parseWorktreeInclude(content: string): WorktreeEntry[] {\n const entries: WorktreeEntry[] = [];\n const lines = content.split(\"\\n\");\n\n let lastComment = \"\";\n\n for (const raw of lines) {\n const line = raw.trim();\n\n // Skip empty lines\n if (!line) {\n lastComment = \"\";\n continue;\n }\n\n // Track comments as potential reasons for the next entry\n if (line.startsWith(\"#\") && !line.includes(\"hatch3r:\")) {\n // Skip managed block markers\n if (line === MANAGED_BLOCK_START || line === MANAGED_BLOCK_END) {\n continue;\n }\n lastComment = line.slice(1).trim();\n continue;\n }\n\n // Also skip raw managed block markers (they don't start with #)\n if (line === MANAGED_BLOCK_START || line === MANAGED_BLOCK_END) {\n continue;\n }\n\n // Parse entry line\n const symlinkSuffix = \"# hatch3r:symlink\";\n const isSymlink = line.includes(symlinkSuffix);\n const pattern = line\n .replace(symlinkSuffix, \"\")\n .trim();\n\n if (pattern) {\n entries.push({\n pattern,\n strategy: isSymlink ? \"symlink\" : \"copy\",\n reason: lastComment || undefined,\n });\n }\n\n lastComment = \"\";\n }\n\n return entries;\n}\n\n// ─── Setup ───────────────────────────────────────────────────────────────────\n\n/**\n * Sets up a worktree by reading `.worktreeinclude` from the main root,\n * resolving patterns against the working tree, and copying or symlinking\n * each matched file into the worktree root.\n */\nexport async function setupWorktree(\n mainRoot: string,\n worktreeRoot: string,\n): Promise<WorktreeSetupResult> {\n const result: WorktreeSetupResult = {\n copied: [],\n symlinked: [],\n skipped: [],\n errors: [],\n };\n\n const includePath = join(mainRoot, WORKTREE_INCLUDE_FILE);\n let content: string;\n try {\n content = await readFile(includePath, \"utf-8\");\n } catch {\n result.errors.push(`Could not read ${WORKTREE_INCLUDE_FILE} from ${mainRoot}`);\n return result;\n }\n\n const entries = parseWorktreeInclude(content);\n if (entries.length === 0) return result;\n\n const patterns: string[] = [];\n for (const entry of entries) {\n patterns.push(entry.pattern);\n }\n\n // Resolve patterns to actual files\n const resolvedPaths = await resolvePatterns(mainRoot, patterns);\n\n for (const relPath of resolvedPaths) {\n const srcPath = join(mainRoot, relPath);\n const destPath = join(worktreeRoot, relPath);\n\n // Determine strategy: find the most specific matching pattern\n let strategy: \"copy\" | \"symlink\" = \"copy\";\n for (const entry of entries) {\n const pat = entry.pattern.replace(/\\/$/, \"\");\n if (relPath === pat || relPath.startsWith(pat + \"/\") || relPath === entry.pattern) {\n strategy = entry.strategy;\n // Don't break — later entries can override (e.g., .agents/learnings/ overrides .agents/)\n }\n }\n\n try {\n // Skip if destination already exists (idempotent re-run)\n let destExists = false;\n try {\n await lstat(destPath);\n destExists = true;\n } catch {\n // Doesn't exist — proceed\n }\n if (destExists) {\n result.skipped.push(relPath);\n continue;\n }\n\n await mkdir(dirname(destPath), { recursive: true });\n\n if (strategy === \"symlink\") {\n const relTarget = relative(dirname(destPath), srcPath);\n try {\n await symlink(relTarget, destPath);\n result.symlinked.push(relPath);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"EPERM\") {\n // Fall back to copy on permission errors (e.g., Windows without dev mode)\n await copyFile(srcPath, destPath);\n result.copied.push(relPath);\n } else if (code === \"EEXIST\") {\n result.skipped.push(relPath);\n } else {\n throw err;\n }\n }\n } else {\n await copyFile(srcPath, destPath);\n result.copied.push(relPath);\n }\n } catch (err) {\n result.errors.push(`${relPath}: ${(err as Error).message}`);\n }\n }\n\n return result;\n}\n\n// ─── Cleanup ─────────────────────────────────────────────────────────────────\n\n/**\n * Removes symlinks that were created by `setupWorktree`.\n * Reads the `.worktreeinclude` from the worktree root (it may have been\n * symlinked or copied in), falling back to the main worktree if not found.\n */\nexport async function cleanupWorktree(worktreeRoot: string): Promise<void> {\n let content: string | null = null;\n\n // Try reading from the worktree itself first\n const localPath = join(worktreeRoot, WORKTREE_INCLUDE_FILE);\n try {\n content = await readFile(localPath, \"utf-8\");\n } catch {\n // Not found locally — try the main worktree\n try {\n const mainRoot = findMainWorktree(worktreeRoot);\n content = await readFile(join(mainRoot, WORKTREE_INCLUDE_FILE), \"utf-8\");\n } catch {\n // Can't find include file anywhere — nothing to clean up\n return;\n }\n }\n\n if (!content) return;\n\n const entries = parseWorktreeInclude(content);\n\n for (const entry of entries) {\n if (entry.strategy !== \"symlink\") continue;\n\n const targetPath = join(worktreeRoot, entry.pattern.replace(/\\/$/, \"\"));\n try {\n const stat = await lstat(targetPath);\n if (stat.isSymbolicLink()) {\n await unlink(targetPath);\n }\n } catch {\n // Path doesn't exist or can't be stat'd — skip\n }\n }\n}\n\n// ─── Managed content ─────────────────────────────────────────────────────────\n\n/**\n * Extracts the inner content between `MANAGED_BLOCK_START` and\n * `MANAGED_BLOCK_END` markers. Used by `safeWriteFile` for merge operations.\n */\nexport function extractManagedContent(fullContent: string): string {\n const startIdx = fullContent.indexOf(MANAGED_BLOCK_START);\n const endIdx = fullContent.indexOf(MANAGED_BLOCK_END);\n\n if (startIdx === -1 || endIdx === -1) {\n return \"\";\n }\n\n return fullContent\n .substring(startIdx + MANAGED_BLOCK_START.length, endIdx)\n .trim();\n}\n","import { execFileSync } from \"node:child_process\";\nimport { statSync, readFileSync, writeFileSync, unlinkSync } from \"node:fs\";\nimport { join, resolve, dirname } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { randomBytes } from \"node:crypto\";\n\n/**\n * Writes the given gitignore-style patterns to a temp file, then runs\n * `git ls-files --others --ignored --exclude-from=<tmpfile>` to resolve\n * them against the working tree. Returns the matched file paths.\n */\nexport async function resolvePatterns(\n rootDir: string,\n patterns: string[],\n): Promise<string[]> {\n if (patterns.length === 0) return [];\n\n const tmpFile = join(\n tmpdir(),\n `hatch3r-worktree-${randomBytes(4).toString(\"hex\")}`,\n );\n\n try {\n writeFileSync(tmpFile, patterns.join(\"\\n\") + \"\\n\", \"utf-8\");\n\n const output = execFileSync(\n \"git\",\n [\"ls-files\", \"--others\", \"--ignored\", `--exclude-from=${tmpFile}`],\n { cwd: rootDir, encoding: \"utf-8\", maxBuffer: 10 * 1024 * 1024 },\n );\n\n return output\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean);\n } catch (err) {\n console.error(`[hatch3r] worktree pattern resolution failed: ${(err as Error).message}`);\n return [];\n } finally {\n try {\n unlinkSync(tmpFile);\n } catch {\n // Temp file may already be gone\n }\n }\n}\n\n/**\n * Checks whether the given directory is inside a git worktree (as opposed to\n * the main repo). In a worktree, `.git` is a *file* containing `gitdir: ...`\n * rather than a directory.\n */\nexport function isInsideWorktree(dir: string): boolean {\n try {\n const stat = statSync(join(dir, \".git\"));\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Given a worktree directory, reads the `.git` file, parses the `gitdir:`\n * pointer, and traverses up to find the main repo root.\n *\n * The gitdir typically points to `.git/worktrees/<name>`, so we go up 3\n * levels to reach the main repo root.\n *\n * @throws if the `.git` file can't be read or parsed.\n */\nexport function findMainWorktree(worktreeDir: string): string {\n const gitFilePath = join(worktreeDir, \".git\");\n const content = readFileSync(gitFilePath, \"utf-8\").trim();\n\n const match = content.match(/^gitdir:\\s*(.+)$/m);\n if (!match) {\n throw new Error(\n `Unable to parse .git file in ${worktreeDir}: expected \"gitdir: <path>\"`,\n );\n }\n\n // gitdir points to <main-repo>/.git/worktrees/<name>\n // Resolve relative paths against the worktree directory, then go up 3 levels.\n const rawGitdir = match[1].trim();\n const absGitdir = resolve(worktreeDir, rawGitdir);\n\n // Traverse: .git/worktrees/<name> → .git/worktrees → .git → repo root\n const mainRoot = dirname(dirname(dirname(absGitdir)));\n return mainRoot;\n}\n\n/**\n * Checks whether a path is gitignored in the given repository root.\n * Runs `git check-ignore -q <path>` — exit code 0 means ignored.\n */\nexport function isGitIgnored(rootDir: string, filePath: string): boolean {\n try {\n execFileSync(\"git\", [\"check-ignore\", \"-q\", filePath], {\n cwd: rootDir,\n stdio: \"ignore\",\n });\n return true;\n } catch {\n return false;\n }\n}\n","import { fileURLToPath } from \"node:url\";\nimport { readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { readManifest, writeManifest } from \"../../manifest/hatchJson.js\";\nimport {\n AGENTS_DIR,\n DEFAULT_FEATURES,\n HatchError,\n WORKTREE_INCLUDE_FILE,\n type ContentSelection,\n type Features,\n type HatchManifest,\n type Platform,\n type Tool,\n} from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n error as logError,\n step,\n label,\n warn,\n} from \"../shared/ui.js\";\nimport { runUpdate } from \"./update.js\";\nimport { archiveToolOutputs, removeManagedFilesForPaths, type MigrationNotice } from \"../../archive/index.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { readWorkspaceManifest, writeWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { detectSubRepos } from \"../../workspace/detect.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport { detectRepoGitIdentity } from \"../../workspace/git.js\";\nimport { TOOL_DISPLAY_NAMES, TOOL_PROMPT_CHOICES, FEATURE_CHOICES, MCP_CHOICES, PLATFORM_DISPLAY_NAMES, PLATFORM_MCP_SERVER, sanitizeInput, isWSL } from \"../shared/constants.js\";\nimport {\n buildContentIndex,\n getAvailableItems,\n addContentItem,\n removeContentItem,\n countSelectionItems,\n selectionSummary,\n extractContentReferences,\n validateOrchestrationDependencies,\n TYPE_TO_SELECTION_KEY,\n} from \"../../content/index.js\";\nimport { generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\ninterface ConfigDiff {\n addedTools: Tool[];\n removedTools: Tool[];\n addedMcp: string[];\n removedMcp: string[];\n enabledFeatures: (keyof Features)[];\n disabledFeatures: (keyof Features)[];\n platformChanged: boolean;\n repoChanged: boolean;\n addedContent: Array<{ type: string; id: string }>;\n removedContent: Array<{ type: string; id: string }>;\n}\n\nfunction computeDiff(\n oldManifest: HatchManifest,\n newTools: Tool[],\n newFeatures: Features,\n newMcp: string[],\n newPlatform: Platform,\n newOwner: string,\n newRepo: string,\n newNamespace: string,\n newProject: string,\n): ConfigDiff {\n const oldToolSet = new Set(oldManifest.tools);\n const newToolSet = new Set(newTools);\n const oldMcpSet = new Set(oldManifest.mcp.servers);\n const newMcpSet = new Set(newMcp);\n\n const enabledFeatures: (keyof Features)[] = [];\n const disabledFeatures: (keyof Features)[] = [];\n for (const key of Object.keys(DEFAULT_FEATURES) as (keyof Features)[]) {\n if (newFeatures[key] && !oldManifest.features[key]) enabledFeatures.push(key);\n if (!newFeatures[key] && oldManifest.features[key]) disabledFeatures.push(key);\n }\n\n return {\n addedTools: newTools.filter((t) => !oldToolSet.has(t)),\n removedTools: oldManifest.tools.filter((t) => !newToolSet.has(t)),\n addedMcp: newMcp.filter((s) => !oldMcpSet.has(s)),\n removedMcp: oldManifest.mcp.servers.filter((s) => !newMcpSet.has(s)),\n enabledFeatures,\n disabledFeatures,\n platformChanged: newPlatform !== oldManifest.platform,\n repoChanged:\n newOwner !== oldManifest.owner ||\n newRepo !== oldManifest.repo ||\n newNamespace !== oldManifest.namespace ||\n newProject !== oldManifest.project,\n addedContent: [],\n removedContent: [],\n };\n}\n\nfunction isDiffEmpty(diff: ConfigDiff): boolean {\n return (\n diff.addedTools.length === 0 &&\n diff.removedTools.length === 0 &&\n diff.addedMcp.length === 0 &&\n diff.removedMcp.length === 0 &&\n diff.enabledFeatures.length === 0 &&\n diff.disabledFeatures.length === 0 &&\n !diff.platformChanged &&\n !diff.repoChanged &&\n diff.addedContent.length === 0 &&\n diff.removedContent.length === 0\n );\n}\n\nfunction printCurrentConfig(manifest: HatchManifest): void {\n const platformLabel = manifest.platform\n ? `${PLATFORM_DISPLAY_NAMES[manifest.platform]} (${manifest.namespace || manifest.owner}/${manifest.project || manifest.repo})`\n : \"Not set\";\n const branch = manifest.board?.defaultBranch ?? \"main\";\n const enabledFeatures = Object.entries(manifest.features)\n .filter(([, v]) => v)\n .map(([k]) => k);\n const toolNames = manifest.tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \");\n\n const lines = [\n label(\"Platform\", platformLabel),\n label(\"Branch\", branch),\n label(\"Tools\", toolNames),\n label(\"Features\", enabledFeatures.join(\", \")),\n label(\"MCP\", manifest.mcp.servers.length > 0 ? manifest.mcp.servers.join(\", \") : \"none\"),\n ];\n\n if (manifest.content) {\n const total = countSelectionItems(manifest.content);\n lines.push(label(\"Content\", `${total} items (${selectionSummary(manifest.content)})`));\n }\n\n printBox(\"Current configuration\", lines, \"info\");\n}\n\nexport async function configCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n // Warn early if this repo is managed by a workspace\n if (manifest.workspace) {\n warn(\n `This repo is managed by workspace at ${manifest.workspace.rootPath}. ` +\n `Changes here may be overwritten on next workspace sync.`,\n );\n console.log();\n }\n\n printCurrentConfig(manifest);\n\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n // --- Platform ---\n const platformAnswer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"list\",\n name: \"platform\",\n message: \"Platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: manifest.platform ?? \"github\",\n },\n ]);\n const platform = platformAnswer.platform;\n\n // --- Repo identity ---\n let owner: string;\n let repo: string;\n let namespace: string;\n let project: string;\n\n if (platform === \"azure-devops\") {\n const adoAnswers = await inquirer.prompt<{ org: string; project: string; repo: string }>([\n { type: \"input\", name: \"org\", message: \"Azure DevOps organization:\", default: manifest.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Azure DevOps project:\", default: manifest.project || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: manifest.repo || undefined },\n ]);\n owner = sanitizeInput(adoAnswers.org);\n repo = sanitizeInput(adoAnswers.repo);\n namespace = owner;\n project = sanitizeInput(adoAnswers.project);\n } else if (platform === \"gitlab\") {\n const glAnswers = await inquirer.prompt<{ namespace: string; project: string }>([\n { type: \"input\", name: \"namespace\", message: \"GitLab namespace (group or username):\", default: manifest.namespace || manifest.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Project name:\", default: manifest.project || manifest.repo || undefined },\n ]);\n owner = sanitizeInput(glAnswers.namespace);\n repo = sanitizeInput(glAnswers.project);\n namespace = owner;\n project = repo;\n } else {\n const repoAnswers = await inquirer.prompt<{ owner: string; repo: string }>([\n { type: \"input\", name: \"owner\", message: \"GitHub owner (org or username):\", default: manifest.owner || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: manifest.repo || undefined },\n ]);\n owner = sanitizeInput(repoAnswers.owner);\n repo = sanitizeInput(repoAnswers.repo);\n namespace = owner;\n project = repo;\n }\n\n // --- Default branch ---\n const currentBranch = manifest.board?.defaultBranch ?? \"main\";\n const branchAnswer = await inquirer.prompt<{ defaultBranch: string }>([\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch (for checkout, PR base, release):\",\n default: currentBranch,\n },\n ]);\n const defaultBranch = branchAnswer.defaultBranch.trim() || currentBranch;\n\n // --- Tools ---\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: manifest.tools,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const tools = toolAnswers.tools;\n\n if (tools.length === 0) {\n logError(\"At least one tool must be selected.\");\n throw new HatchError(\"At least one tool must be selected.\", 1, \"VALIDATION_ERROR\");\n }\n\n // --- Features ---\n const currentFeatureKeys = (Object.keys(DEFAULT_FEATURES) as (keyof Features)[])\n .filter((k) => manifest.features[k]);\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features:\",\n choices: FEATURE_CHOICES,\n default: currentFeatureKeys,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n const features: Features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n // --- MCP servers ---\n let mcpServers: string[] = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: manifest.mcp.servers,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n // --- Worktree isolation ---\n const worktreeCapableTools = new Set([\"claude\"]);\n const hasWorktreeTool = tools.some(t => worktreeCapableTools.has(t));\n if (hasWorktreeTool) {\n const wtAnswer = await inquirer.prompt<{ enabled: boolean }>([{\n type: \"confirm\",\n name: \"enabled\",\n message: \"Enable worktree file isolation (for parallel agent sessions)?\",\n default: manifest.worktree?.enabled ?? true,\n }]);\n manifest.worktree = {\n ...manifest.worktree,\n enabled: wtAnswer.enabled,\n };\n }\n\n // --- Content management ---\n const contentChanges: { added: Array<{ type: string; id: string }>; removed: Array<{ type: string; id: string }> } = { added: [], removed: [] };\n if (manifest.content) {\n const manageContent = await inquirer.prompt<{ manage: boolean }>([\n {\n type: \"confirm\",\n name: \"manage\",\n message: \"Manage content items?\",\n default: false,\n },\n ]);\n\n if (manageContent.manage) {\n // #145 (D19-16): Explain config vs .customize.yaml distinction\n info(\n chalk.dim(\"Config adds/removes content items. To customize an item's behavior without \") +\n chalk.dim(\"removing it, use .hatch3r/<type>/<id>.customize.yaml instead.\"),\n );\n console.log();\n\n const contentRoot = findPackageRoot(__dirname);\n const agentsDir = join(rootDir, AGENTS_DIR);\n const index = await buildContentIndex(contentRoot);\n\n // Build current installed set from manifest\n const currentIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) currentIds.add(id);\n }\n\n const contentAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items (space to toggle):\",\n choices: index.items.map((item) => ({\n name: `${item.type}: ${item.id.replace(/^hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: currentIds.has(item.id),\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n\n const newIds = new Set(contentAnswer.items);\n\n // Identify removed items and warn about dependents (D19-6)\n const pendingRemovals: string[] = [];\n for (const id of currentIds) {\n if (!newIds.has(id)) pendingRemovals.push(id);\n }\n\n if (pendingRemovals.length > 0) {\n const dependencyWarnings: string[] = [];\n for (const removedId of pendingRemovals) {\n const dependents: string[] = [];\n for (const keepId of contentAnswer.items) {\n const keepItem = index.byId.get(keepId);\n if (!keepItem) continue;\n try {\n const filePath = keepItem.type === \"skill\"\n ? join(agentsDir, keepItem.relativePath, \"SKILL.md\")\n : join(agentsDir, keepItem.relativePath);\n const content = await readFile(filePath, \"utf-8\");\n const refs = extractContentReferences(content);\n if (refs.includes(removedId)) {\n dependents.push(keepId);\n }\n } catch {\n // File not readable, skip\n }\n }\n if (dependents.length > 0) {\n dependencyWarnings.push(\n `Removing \"${removedId}\" — referenced by: ${dependents.join(\", \")}`,\n );\n }\n }\n\n // Check orchestration dependencies with the proposed new selection\n const proposedSelection: ContentSelection = {\n ...manifest.content!,\n items: {\n agents: [], skills: [], rules: [], commands: [],\n prompts: [], hooks: [], githubAgents: [],\n },\n };\n for (const id of contentAnswer.items) {\n const proposedItem = index.byId.get(id);\n if (proposedItem) {\n const key = TYPE_TO_SELECTION_KEY[proposedItem.type];\n if (key) proposedSelection.items[key].push(proposedItem.id);\n }\n }\n const orchWarnings = validateOrchestrationDependencies(proposedSelection);\n dependencyWarnings.push(...orchWarnings);\n\n if (dependencyWarnings.length > 0) {\n console.log();\n warn(\"Dependency warnings for removed content:\");\n for (const w of dependencyWarnings) {\n console.log(chalk.dim(` ${w}`));\n }\n console.log();\n }\n }\n\n // Find added and removed items\n for (const id of contentAnswer.items) {\n if (!currentIds.has(id)) {\n const item = index.byId.get(id);\n if (item) {\n contentChanges.added.push({ type: item.type, id: item.id });\n await addContentItem(contentRoot, agentsDir, item);\n }\n }\n }\n for (const id of currentIds) {\n if (!newIds.has(id)) {\n const item = index.byId.get(id);\n if (item) {\n contentChanges.removed.push({ type: item.type, id: item.id });\n await removeContentItem(agentsDir, item, { rootDir });\n }\n }\n }\n\n // Update manifest content items\n const newItems: ContentSelection[\"items\"] = {\n agents: [], skills: [], rules: [], commands: [],\n prompts: [], hooks: [], githubAgents: [],\n };\n for (const id of contentAnswer.items) {\n const item = index.byId.get(id);\n if (item) {\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) newItems[key].push(item.id);\n }\n }\n manifest.content.items = newItems;\n\n // Regenerate canonical AGENTS.md after content changes\n if (contentChanges.added.length > 0 || contentChanges.removed.length > 0) {\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n }\n }\n }\n\n // --- Compute diff ---\n const diff = computeDiff(manifest, tools, features, mcpServers, platform, owner, repo, namespace, project);\n diff.addedContent = contentChanges.added;\n diff.removedContent = contentChanges.removed;\n\n if (isDiffEmpty(diff) && defaultBranch === currentBranch) {\n console.log();\n info(\"No changes detected.\");\n console.log();\n return;\n }\n\n // --- Archive removed tool outputs ---\n const allMigrations: MigrationNotice[] = [];\n const allArchivedFiles: string[] = [];\n const totalArchiveSteps = diff.removedTools.length;\n\n if (totalArchiveSteps > 0) {\n console.log();\n for (let i = 0; i < diff.removedTools.length; i++) {\n const tool = diff.removedTools[i];\n const s = createSpinner(\n step(i + 1, totalArchiveSteps, `Archiving ${TOOL_DISPLAY_NAMES[tool] ?? tool} output...`),\n );\n s.start();\n\n const result = await archiveToolOutputs(rootDir, tool);\n removeManagedFilesForPaths(manifest, result.archivedFiles);\n allArchivedFiles.push(...result.archivedFiles);\n allMigrations.push(...result.migrations);\n\n s.succeed(\n step(i + 1, totalArchiveSteps, `Archived ${result.archivedFiles.length} files from ${TOOL_DISPLAY_NAMES[tool] ?? tool}`),\n );\n }\n }\n\n // --- Apply changes to manifest ---\n manifest.platform = platform;\n manifest.owner = owner;\n manifest.repo = repo;\n manifest.namespace = namespace;\n manifest.project = project;\n manifest.tools = tools;\n manifest.features = features;\n manifest.mcp = { servers: mcpServers };\n\n if (manifest.board) {\n manifest.board.owner = owner;\n manifest.board.repo = repo;\n manifest.board.defaultBranch = defaultBranch;\n } else if (defaultBranch !== \"main\" || owner || repo) {\n manifest.board = {\n owner,\n repo,\n defaultBranch,\n projectNumber: null,\n statusFieldId: null,\n statusOptions: { backlog: null, ready: null, inProgress: null, inReview: null, done: null },\n labels: {\n types: [\"type:bug\", \"type:feature\", \"type:refactor\", \"type:qa\", \"type:docs\", \"type:infra\"],\n executors: [\"executor:agent\", \"executor:human\", \"executor:hybrid\"],\n statuses: [\"status:triage\", \"status:ready\", \"status:in-progress\", \"status:in-review\", \"status:blocked\"],\n meta: [\"meta:board-overview\"],\n },\n branchConvention: \"{type}/{short-description}\",\n areas: [],\n };\n }\n\n await writeManifest(rootDir, manifest);\n\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n managedContent: wtManaged,\n });\n }\n\n // --- Run full update (pull latest + copy templates + sync adapters) ---\n console.log();\n const updateResult = await runUpdate(rootDir, manifest);\n\n // --- Handle .env.mcp for new MCP servers ---\n if (features.mcp && mcpServers.length > 0) {\n try {\n const envResult = await ensureEnvMcp(rootDir, mcpServers);\n await ensureGitignoreEntry(rootDir);\n if (envResult.newVars.length > 0) {\n warn(`New secrets needed in .env.mcp: ${envResult.newVars.join(\", \")}`);\n info(`Run this, then start or restart your editor: ${getSourceEnvMcpCommand()}`);\n }\n } catch (err) {\n warn(`Could not update .env.mcp: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- Print summary ---\n console.log();\n const summaryLines: string[] = [];\n\n if (diff.addedTools.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Tools added: ${diff.addedTools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")}`);\n }\n if (diff.removedTools.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Tools removed: ${diff.removedTools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")}`);\n }\n if (diff.addedMcp.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} MCP added: ${diff.addedMcp.join(\", \")}`);\n }\n if (diff.removedMcp.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} MCP removed: ${diff.removedMcp.join(\", \")}`);\n }\n if (diff.enabledFeatures.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Features enabled: ${diff.enabledFeatures.join(\", \")}`);\n }\n if (diff.disabledFeatures.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Features disabled: ${diff.disabledFeatures.join(\", \")}`);\n }\n if (diff.platformChanged) {\n summaryLines.push(`${chalk.yellow(\"~\")} Platform: ${PLATFORM_DISPLAY_NAMES[platform]}`);\n }\n if (diff.repoChanged) {\n summaryLines.push(`${chalk.yellow(\"~\")} Repo: ${namespace}/${project}`);\n }\n if (diff.addedContent.length > 0) {\n summaryLines.push(`${chalk.green(\"+\")} Content added: ${diff.addedContent.length} item(s)`);\n }\n if (diff.removedContent.length > 0) {\n summaryLines.push(`${chalk.red(\"-\")} Content removed: ${diff.removedContent.length} item(s)`);\n }\n if (defaultBranch !== currentBranch) {\n summaryLines.push(`${chalk.yellow(\"~\")} Default branch: ${defaultBranch}`);\n }\n\n summaryLines.push(\"\");\n summaryLines.push(label(\"Files\", `${updateResult.copiedFiles} canonical files updated`));\n summaryLines.push(label(\"Tools\", `${updateResult.syncedTools} tool(s) synced`));\n summaryLines.push(label(\"Version\", `v${updateResult.version}`));\n\n if (allArchivedFiles.length > 0) {\n summaryLines.push(\"\");\n summaryLines.push(label(\"Archived\", `${allArchivedFiles.length} files to .hatch3r-archive/`));\n }\n\n printBox(\"Config updated\", summaryLines, \"success\");\n\n if (allMigrations.length > 0) {\n console.log();\n info(\"Customizations migrated to .hatch3r/ (tool-agnostic):\");\n for (const m of allMigrations) {\n console.log(` ${chalk.dim(m.from)} ${chalk.cyan(\"→\")} ${m.to}`);\n }\n console.log();\n }\n\n // #146 (D19-17): Show migration guide when switching tools\n if (diff.addedTools.length > 0 || diff.removedTools.length > 0) {\n console.log();\n info(\"Tool migration notes:\");\n if (diff.removedTools.length > 0) {\n info(chalk.dim(` Removed tool output archived to .hatch3r-archive/ (recoverable).`));\n info(chalk.dim(` Customizations in .hatch3r/ are tool-agnostic and carry forward.`));\n }\n if (diff.addedTools.length > 0) {\n info(chalk.dim(` New tool output generated. Restart your editor to pick up changes.`));\n info(chalk.dim(` MCP secrets (.env.mcp) are shared across tools — no re-entry needed.`));\n }\n console.log();\n }\n\n // ── Workspace management ──────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (wsManifest) {\n console.log();\n info(chalk.bold(\"Workspace configuration\"));\n const currentRepos = wsManifest.repos.map((r) => r.path);\n console.log(chalk.dim(` Repos: ${currentRepos.join(\", \") || \"(none)\"}`));\n console.log(chalk.dim(` Sync strategy: ${wsManifest.syncStrategy}`));\n\n const { manageWorkspace } = await inquirer.prompt<{ manageWorkspace: boolean }>([\n {\n type: \"confirm\",\n name: \"manageWorkspace\",\n message: \"Configure workspace settings?\",\n default: false,\n },\n ]);\n\n if (manageWorkspace) {\n // Scan for new repos\n const detectedRepos = await detectSubRepos(rootDir);\n const existingPaths = new Set(wsManifest.repos.map((r) => r.path));\n const newRepos = detectedRepos.filter((r) => !existingPaths.has(r.path));\n\n if (newRepos.length > 0) {\n const { addRepos } = await inquirer.prompt<{ addRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"addRepos\",\n message: \"New repos detected. Add to workspace?\",\n choices: newRepos.map((r) => ({\n name: r.name,\n value: r.path,\n checked: false,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n for (const path of addRepos) {\n wsManifest.repos.push({ path, name: path, sync: false });\n }\n }\n\n // Toggle sync per repo\n if (wsManifest.repos.length > 0) {\n const { syncRepos } = await inquirer.prompt<{ syncRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"syncRepos\",\n message: \"Select repos to sync:\",\n choices: wsManifest.repos.map((r) => ({\n name: r.name ?? r.path,\n value: r.path,\n checked: r.sync,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const syncSet = new Set(syncRepos);\n for (const repo of wsManifest.repos) {\n repo.sync = syncSet.has(repo.path);\n }\n }\n\n // Per-repo git identity\n if (wsManifest.repos.length > 0) {\n const { editIdentity } = await inquirer.prompt<{ editIdentity: string }>([\n {\n type: \"list\",\n name: \"editIdentity\",\n message: \"Repo git identities:\",\n choices: [\n { name: \"Keep current\", value: \"keep\" },\n { name: \"Re-detect all from git remotes\", value: \"detect\" },\n { name: \"Edit manually\", value: \"edit\" },\n ],\n default: \"keep\",\n },\n ]);\n\n if (editIdentity === \"detect\") {\n for (const repo of wsManifest.repos) {\n const identity = detectRepoGitIdentity(join(rootDir, repo.path));\n repo.owner = identity.owner || undefined;\n repo.repo = identity.repo || undefined;\n repo.defaultBranch = identity.defaultBranch || undefined;\n repo.platform = identity.platform || undefined;\n }\n info(\"Re-detected git identities for all repos.\");\n } else if (editIdentity === \"edit\") {\n for (const repo of wsManifest.repos) {\n console.log(chalk.bold(`\\n ${repo.name ?? repo.path}:`));\n const identity = await inquirer.prompt<{ owner: string; repo: string; defaultBranch: string }>([\n { type: \"input\", name: \"owner\", message: \" Owner:\", default: repo.owner || undefined },\n { type: \"input\", name: \"repo\", message: \" Repo:\", default: repo.repo || undefined },\n { type: \"input\", name: \"defaultBranch\", message: \" Default branch:\", default: repo.defaultBranch || \"main\" },\n ]);\n repo.owner = sanitizeInput(identity.owner) || undefined;\n repo.repo = sanitizeInput(identity.repo) || undefined;\n repo.defaultBranch = identity.defaultBranch.trim() || undefined;\n }\n }\n }\n\n // Sync strategy\n const { strategy } = await inquirer.prompt<{ strategy: \"manual\" | \"on-sync\" }>([\n {\n type: \"list\",\n name: \"strategy\",\n message: \"Sync strategy:\",\n choices: [\n { name: \"Manual — sync sub-repos only with --repos flag\", value: \"manual\" as const },\n { name: \"On sync — auto-sync sub-repos when running hatch3r sync\", value: \"on-sync\" as const },\n ],\n default: wsManifest.syncStrategy,\n },\n ]);\n wsManifest.syncStrategy = strategy;\n\n await writeWorkspaceManifest(rootDir, wsManifest);\n\n // Offer to sync now\n const syncCount = wsManifest.repos.filter((r) => r.sync).length;\n if (syncCount > 0) {\n const { syncNow } = await inquirer.prompt<{ syncNow: boolean }>([\n {\n type: \"confirm\",\n name: \"syncNow\",\n message: `Sync ${syncCount} repo(s) now?`,\n default: false,\n },\n ]);\n if (syncNow) {\n const wsSpinner = createSpinner(`Syncing ${syncCount} repo(s)...`);\n wsSpinner.start();\n const result = await syncWorkspaceRepos(rootDir, { onWarn: (msg) => warn(msg) });\n const succeeded = result.repos.filter((r) => r.action === \"synced\").length;\n wsSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n }\n }\n }\n\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n AGENTS_DIR,\n MANIFEST_FILE,\n DEFAULT_FEATURES,\n type BoardConfig,\n type ContentSelection,\n type HatchManifest,\n type Platform,\n type Tool,\n} from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\nfunction createMinimalBoardConfig(owner: string, repo: string, defaultBranch: string): BoardConfig {\n return {\n owner,\n repo,\n defaultBranch,\n projectNumber: null,\n statusFieldId: null,\n statusOptions: {\n backlog: null,\n ready: null,\n inProgress: null,\n inReview: null,\n done: null,\n },\n labels: {\n types: [\"type:bug\", \"type:feature\", \"type:refactor\", \"type:qa\", \"type:docs\", \"type:infra\"],\n executors: [\"executor:agent\", \"executor:human\", \"executor:hybrid\"],\n statuses: [\"status:triage\", \"status:ready\", \"status:in-progress\", \"status:in-review\", \"status:blocked\"],\n meta: [\"meta:board-overview\"],\n },\n branchConvention: \"{type}/{short-description}\",\n areas: [],\n };\n}\n\nexport function createManifest(options: {\n platform?: Platform;\n owner?: string;\n repo?: string;\n namespace?: string;\n project?: string;\n defaultBranch?: string;\n tools: Tool[];\n features?: Partial<HatchManifest[\"features\"]>;\n mcpServers?: string[];\n content?: ContentSelection;\n languages?: string[];\n}): HatchManifest {\n const platform = options.platform ?? \"github\";\n const owner = options.owner ?? \"\";\n const repo = options.repo ?? \"\";\n const namespace = options.namespace ?? owner;\n const project = options.project ?? repo;\n const manifest: HatchManifest = {\n version: \"2.0.0\",\n hatch3rVersion: HATCH3R_VERSION,\n platform,\n owner,\n repo,\n namespace,\n project,\n tools: options.tools,\n features: { ...DEFAULT_FEATURES, ...options.features },\n mcp: { servers: options.mcpServers ?? [] },\n managedFiles: [],\n };\n if (options.content) {\n manifest.content = options.content;\n }\n if (options.languages && options.languages.length > 0 && options.languages[0] !== \"unknown\") {\n manifest.languages = options.languages;\n }\n if (options.defaultBranch) {\n manifest.board = createMinimalBoardConfig(owner, repo, options.defaultBranch);\n }\n const worktreeCapableTools = new Set([\"claude\"]);\n if (options.tools.some(t => worktreeCapableTools.has(t))) {\n manifest.worktree = { enabled: true };\n }\n return manifest;\n}\n\nexport function migrateManifest(raw: Record<string, unknown>): Record<string, unknown> {\n const migrated = { ...raw };\n\n if (!migrated.namespace && typeof migrated.owner === \"string\") {\n migrated.namespace = migrated.owner;\n }\n if (!migrated.namespace) {\n migrated.namespace = \"\";\n }\n\n if (!migrated.project && typeof migrated.repo === \"string\") {\n migrated.project = migrated.repo;\n }\n if (!migrated.project) {\n migrated.project = \"\";\n }\n\n if (migrated.version === \"1.0.0\") {\n migrated.version = \"2.0.0\";\n }\n\n return migrated;\n}\n\nfunction validateManifest(data: unknown): data is HatchManifest {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n typeof obj.version !== \"string\" ||\n typeof obj.hatch3rVersion !== \"string\" ||\n (obj.platform !== undefined && typeof obj.platform !== \"string\") ||\n !Array.isArray(obj.tools) ||\n obj.features === null ||\n typeof obj.features !== \"object\" ||\n obj.mcp === null ||\n typeof obj.mcp !== \"object\" ||\n !Array.isArray(obj.managedFiles)\n ) {\n return false;\n }\n\n if (obj.content !== undefined) {\n if (typeof obj.content !== \"object\" || obj.content === null) return false;\n const content = obj.content as Record<string, unknown>;\n if (typeof content.preset !== \"string\") return false;\n if (typeof content.projectType !== \"string\") return false;\n if (typeof content.teamSize !== \"string\") return false;\n if (!content.items || typeof content.items !== \"object\") return false;\n const items = content.items as Record<string, unknown>;\n const requiredKeys = [\"agents\", \"skills\", \"rules\", \"commands\", \"prompts\", \"hooks\", \"githubAgents\"];\n for (const key of requiredKeys) {\n if (!Array.isArray(items[key])) return false;\n if (!(items[key] as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n if (obj.worktree !== undefined) {\n if (typeof obj.worktree !== \"object\" || obj.worktree === null) return false;\n const wt = obj.worktree as Record<string, unknown>;\n if (typeof wt.enabled !== \"boolean\") return false;\n }\n\n if (obj.specs !== undefined) {\n if (typeof obj.specs !== \"object\" || obj.specs === null) return false;\n const specs = obj.specs as Record<string, unknown>;\n if (!Array.isArray(specs.paths)) return false;\n if (!(specs.paths as unknown[]).every((v) => typeof v === \"string\")) return false;\n if (specs.lastGenerated !== undefined && typeof specs.lastGenerated !== \"string\") return false;\n }\n\n if (obj.workspace !== undefined) {\n if (typeof obj.workspace !== \"object\" || obj.workspace === null) return false;\n const ws = obj.workspace as Record<string, unknown>;\n if (typeof ws.rootPath !== \"string\") return false;\n if (typeof ws.lastSync !== \"string\") return false;\n if (typeof ws.syncVersion !== \"string\") return false;\n if (typeof ws.workspaceChecksum !== \"string\") return false;\n if (ws.excludedContent !== undefined) {\n if (!Array.isArray(ws.excludedContent)) return false;\n if (!(ws.excludedContent as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n if (ws.localContent !== undefined) {\n if (!Array.isArray(ws.localContent)) return false;\n if (!(ws.localContent as unknown[]).every((v) => typeof v === \"string\")) return false;\n }\n }\n\n return true;\n}\n\nexport async function readManifest(\n rootDir: string,\n): Promise<HatchManifest | null> {\n const manifestPath = join(rootDir, AGENTS_DIR, MANIFEST_FILE);\n\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err: unknown) {\n throw new Error(\n `Malformed JSON in ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const migrated = migrateManifest(parsed as Record<string, unknown>);\n\n if (!validateManifest(migrated)) {\n throw new Error(\n `Invalid manifest in ${manifestPath}: required fields missing or malformed. Run hatch3r init to regenerate.`,\n );\n }\n return migrated;\n}\n\nexport async function writeManifest(\n rootDir: string,\n manifest: HatchManifest,\n): Promise<void> {\n const manifestPath = join(rootDir, AGENTS_DIR, MANIFEST_FILE);\n await atomicWriteFile(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nexport function addManagedFile(\n manifest: HatchManifest,\n filePath: string,\n): void {\n if (!manifest.managedFiles.includes(filePath)) {\n manifest.managedFiles.push(filePath);\n }\n}\n\nexport function removeManagedFile(\n manifest: HatchManifest,\n filePath: string,\n): void {\n manifest.managedFiles = manifest.managedFiles.filter((f) => f !== filePath);\n}\n","import {\n readFile,\n writeFile,\n mkdir,\n access,\n rename,\n unlink,\n open,\n copyFile,\n} from \"node:fs/promises\";\nimport { dirname, basename } from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { HATCH3R_PREFIX, type MergeResult } from \"../types.js\";\nimport { insertManagedBlock, hasManagedBlock, extractCustomContent } from \"./managedBlocks.js\";\nimport { scanForDeniedPatterns } from \"../adapters/customization.js\";\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return false;\n }\n}\n\n/**\n * Write a file atomically via tmp+rename with fsync.\n *\n * **Concurrency note:** This function does not use file locking. Running\n * multiple hatch3r processes against the same directory concurrently is\n * unsupported and may produce corrupted output. If you need to sync from\n * multiple terminals, run them sequentially.\n */\nexport async function atomicWriteFile(filePath: string, content: string): Promise<void> {\n const tmpPath = filePath + \".tmp.\" + randomBytes(4).toString(\"hex\");\n try {\n await writeFile(tmpPath, content, \"utf-8\");\n const fh = await open(tmpPath, \"r\");\n try {\n await fh.datasync();\n } catch (err) {\n // Windows rejects fdatasync on read-only handles (EPERM).\n // The atomic rename provides the safety guarantee; datasync is best-effort.\n if ((err as NodeJS.ErrnoException).code !== \"EPERM\") throw err;\n } finally {\n await fh.close();\n }\n try {\n await rename(tmpPath, filePath);\n } catch (err) {\n // Retry once for Windows AV locks (EBUSY/EPERM)\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"EBUSY\" || code === \"EPERM\") {\n await new Promise((r) => setTimeout(r, 100));\n await rename(tmpPath, filePath);\n } else {\n throw err;\n }\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ENOSPC\") {\n throw new Error(\n `Not enough disk space to write ${filePath}. Free up space and re-run the command.`,\n );\n }\n throw err;\n } finally {\n try {\n await unlink(tmpPath);\n } catch {\n // Temp file already renamed or doesn't exist\n }\n }\n}\n\n/**\n * Safely write or merge a file, preserving user content outside managed blocks.\n *\n * **Concurrency note:** This function relies on {@link atomicWriteFile} which\n * does not acquire file locks. Running multiple hatch3r processes (e.g. two\n * terminal tabs running `hatch3r sync`) against the same target directory at\n * the same time is unsupported. To avoid conflicts, run sync operations\n * sequentially. Workspace sync already processes repos one at a time\n * internally, so a single `hatch3r sync --repos` invocation is safe.\n */\nexport async function safeWriteFile(\n filePath: string,\n content: string,\n options: {\n managedContent?: string;\n /** When true, prepend managed block to existing content if file has no markers (init flow). */\n appendIfNoBlock?: boolean;\n /** When true, always write through regardless of filename prefix. */\n force?: boolean;\n } = {},\n): Promise<MergeResult> {\n await mkdir(dirname(filePath), { recursive: true });\n\n const exists = await fileExists(filePath);\n\n if (!exists) {\n await atomicWriteFile(filePath, content);\n return { path: filePath, action: \"created\" };\n }\n\n const existingContent = await readFile(filePath, \"utf-8\");\n\n if (options.managedContent) {\n if (!hasManagedBlock(existingContent)) {\n if (options.appendIfNoBlock) {\n const prepended = [content.trim(), \"\", existingContent.trimStart()].join(\"\\n\");\n await atomicWriteFile(filePath, prepended);\n return { path: filePath, action: \"updated\" };\n }\n // #144 (D19-15): Improved recovery guidance — avoid suggesting init --force\n return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: managed block markers (HATCH3R:BEGIN/END) missing. To fix: restore the markers around hatch3r content, or move your custom content and re-run hatch3r update.`,\n };\n }\n const customContent = extractCustomContent(existingContent);\n const deniedFindings = customContent ? scanForDeniedPatterns(customContent) : [];\n let merged: string;\n try {\n merged = insertManagedBlock(existingContent, options.managedContent);\n } catch {\n // Managed block is corrupted (duplicate markers, wrong order, etc.).\n // Create a .bak backup before overwriting so user content is not lost.\n const bakPath = filePath + \".bak\";\n await copyFile(filePath, bakPath);\n await atomicWriteFile(filePath, content);\n return {\n path: filePath,\n action: \"updated\",\n warning: `Auto-repaired corrupted managed block in ${filePath} (backup saved to ${bakPath})`,\n };\n }\n await atomicWriteFile(filePath, merged);\n const result: MergeResult = { path: filePath, action: \"updated\" };\n if (deniedFindings.length > 0) {\n result.warning = `Content outside managed block in ${filePath} contains suspicious patterns: ${deniedFindings.join(\"; \")}`;\n }\n return result;\n }\n\n const fileName = basename(filePath) ?? \"\";\n const isManagedFile = fileName.startsWith(HATCH3R_PREFIX);\n\n if (isManagedFile || options.force) {\n await atomicWriteFile(filePath, content);\n return { path: filePath, action: \"updated\" };\n }\n\n // #144 (D19-15): Improved recovery guidance — avoid suggesting init --force\n return {\n path: filePath,\n action: \"skipped\",\n warning: `Skipped ${filePath}: managed block markers (HATCH3R:BEGIN/END) missing. To fix: restore the markers around hatch3r content, or move your custom content and re-run hatch3r update.`,\n };\n}\n\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 // Prompt injection indicators\n /ignore\\s+(all\\s+)?previous\\s+instructions/i,\n /disregard\\s+(all\\s+)?(previous|prior|above)/i,\n /you\\s+are\\s+now\\s+(?:a|an|the)\\s/i,\n /new\\s+instructions\\s*:/i,\n /system\\s+prompt\\s*:/i,\n /forget\\s+(all\\s+)?(previous|prior|above)\\s+(instructions|rules|context)/i,\n /act\\s+as\\s+(?:a|an)\\s+(?:unrestricted|unfiltered|jailbroken)/i,\n /do\\s+not\\s+follow\\s+(?:any|the|your)\\s+(?:previous|prior|above|original)\\s/i,\n];\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 { pruneArchives } from \"../../archive/index.js\";\nimport { buildSelectionsFromDisk } from \"../../content/index.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_DIRS = [\"agents\", \"commands\", \"rules\", \"skills\", \"prompts\", \"github-agents\", \"mcp\", \"hooks\"];\nconst ALWAYS_COPY_FILES = new Set([\"mcp.json\"]);\n\nasync function copyHatch3rFiles(\n srcDir: string,\n destDir: string,\n insideHatch3rDir = false,\n selectedIds?: Set<string>,\n): Promise<string[]> {\n const copied: string[] = [];\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(srcDir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name);\n const destPath = join(destDir, entry.name);\n\n if (entry.isDirectory()) {\n // If we have selectedIds and this is a skill dir, check if the skill is selected\n if (selectedIds && entry.name.startsWith(HATCH3R_PREFIX)) {\n if (!selectedIds.has(entry.name)) continue;\n }\n await mkdir(destPath, { recursive: true });\n const subCopied = await copyHatch3rFiles(\n srcPath,\n destPath,\n insideHatch3rDir || !entry.name.startsWith(HATCH3R_PREFIX),\n selectedIds,\n );\n copied.push(...subCopied.map((p) => join(entry.name, p)));\n } else if (entry.name.startsWith(HATCH3R_PREFIX) || insideHatch3rDir || ALWAYS_COPY_FILES.has(entry.name)) {\n // If we have selectedIds, check if this file's base ID is selected\n if (selectedIds && entry.name.startsWith(HATCH3R_PREFIX)) {\n const baseId = entry.name.replace(/\\.(md|mdc)$/, \"\");\n if (!selectedIds.has(baseId)) continue;\n }\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n copied.push(entry.name);\n }\n }\n\n return copied;\n}\n\nexport interface UpdateResult {\n copiedFiles: number;\n syncedTools: number;\n failedTools: number;\n version: string;\n}\n\nexport async function runUpdate(\n rootDir: string,\n manifest: HatchManifest,\n options: { stepOffset?: number; totalSteps?: number } = {},\n): Promise<UpdateResult> {\n const offset = options.stepOffset ?? 0;\n const total = options.totalSteps ?? 4;\n const agentsDir = join(rootDir, AGENTS_DIR);\n\n let contentRoot = findPackageRoot(__dirname);\n\n const pm = await detectPackageManager(rootDir);\n const s0 = createSpinner(step(offset + 1, total, \"Updating package...\"));\n s0.start();\n try {\n const cmd = process.platform === \"win32\" && pm.name !== \"bun\"\n ? `${pm.updateCmd}.cmd`\n : pm.updateCmd;\n execFileSync(cmd, pm.updateArgs, { stdio: \"pipe\", timeout: 30_000, killSignal: \"SIGTERM\" });\n contentRoot = findPackageRoot(__dirname);\n } catch (err) {\n const isTimeout = err && typeof err === \"object\" && (\"killed\" in err || \"signal\" in err);\n const msg = isTimeout\n ? \"Package update timed out after 30s. Check network connectivity and retry.\"\n : (err instanceof Error ? err.message : String(err));\n s0.fail(step(offset + 1, total, \"Failed to update package\"));\n logError(msg);\n throw new HatchError(msg, 1, isTimeout ? \"NETWORK_ERROR\" : \"UNKNOWN_ERROR\");\n }\n s0.succeed(step(offset + 1, total, \"Package updated\"));\n\n const s1 = createSpinner(step(offset + 2, total, \"Updating canonical files...\"));\n s1.start();\n\n // Build a set of selected IDs if manifest has content selections\n let selectedIds: Set<string> | undefined;\n if (manifest.content) {\n selectedIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) selectedIds.add(id);\n }\n }\n\n const copied: string[] = [];\n for (const dir of CONTENT_DIRS) {\n const srcDir = join(contentRoot, dir);\n try {\n const dirCopied = await copyHatch3rFiles(srcDir, join(agentsDir, dir), false, selectedIds);\n copied.push(...dirCopied.map((p) => join(dir, p)));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n\n // Generate dynamic AGENTS.md based on what's on disk\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n 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, \"ADAPTER_ERROR\");\n }\n }\n s2.succeed(step(offset + 3, total, adapterFailures.length > 0\n ? `Re-synced ${manifest.tools.length - adapterFailures.length}/${manifest.tools.length} tool(s)`\n : `Re-synced ${manifest.tools.length} tool(s)`));\n\n const s3 = createSpinner(step(offset + 4, total, \"Writing manifest...\"));\n s3.start();\n manifest.hatch3rVersion = HATCH3R_VERSION;\n await writeManifest(rootDir, manifest);\n\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n\n // Prune stale archive entries\n await pruneArchives(rootDir);\n\n s3.succeed(step(offset + 4, total, \"Manifest updated\"));\n\n return {\n copiedFiles: copied.length,\n syncedTools: manifest.tools.length - adapterFailures.length,\n failedTools: adapterFailures.length,\n version: HATCH3R_VERSION,\n };\n}\n\ninterface MigrationCheckpoint {\n id: string;\n condition: (manifest: HatchManifest, rootDir: string) => Promise<boolean>;\n execute: (manifest: HatchManifest, rootDir: string, headless: boolean) => Promise<{ manifest: HatchManifest; notices: string[] }>;\n}\n\nconst MIGRATION_CHECKPOINTS: MigrationCheckpoint[] = [\n {\n id: \"content-selections-init\",\n condition: async (manifest) => manifest.content === undefined,\n execute: async (manifest, rootDir, headless) => {\n const agentsDir = join(rootDir, AGENTS_DIR);\n const content = await buildSelectionsFromDisk(agentsDir);\n\n if (headless) {\n // Use safe defaults in headless/CI mode\n content.projectType = \"brownfield\";\n content.teamSize = \"team\";\n } else {\n // Ask user for context since we can't infer it from legacy installs\n const { projectType } = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"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\n return {\n manifest: { ...manifest, content },\n notices: [\"Migrated to explicit content tracking (all existing items preserved)\"],\n };\n },\n },\n {\n id: \"platform-selection\",\n condition: async (manifest) => !manifest.platform,\n execute: async (manifest, _rootDir, headless) => {\n let platform: Platform;\n\n if (headless) {\n // Default to github in headless/CI mode\n platform = \"github\";\n } else {\n const answer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"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 platform = answer.platform;\n }\n\n const updated = { ...manifest, platform };\n const notices: string[] = [];\n\n if (platform === \"github\") {\n updated.namespace = updated.namespace || updated.owner;\n updated.project = updated.project || updated.repo;\n notices.push(\"Migrated to GitHub platform (auto-detected from existing config)\");\n } else {\n const answers = await inquirer.prompt<{ namespace: string; project: string; repo: string }>([\n { type: \"input\", name: \"namespace\", message: platform === \"azure-devops\" ? \"Azure DevOps organization:\" : \"GitLab namespace (group or username):\", default: updated.owner || undefined },\n { type: \"input\", name: \"project\", message: platform === \"azure-devops\" ? \"Azure DevOps project:\" : \"Project name:\", default: updated.repo || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: updated.repo || undefined },\n ]);\n updated.owner = answers.namespace;\n updated.repo = answers.repo;\n updated.namespace = answers.namespace;\n updated.project = answers.project;\n notices.push(`Migrated to ${platform === \"azure-devops\" ? \"Azure DevOps\" : \"GitLab\"} platform`);\n }\n\n if (updated.version === \"1.0.0\") {\n updated.version = \"2.0.0\";\n }\n\n return { manifest: updated, notices };\n },\n },\n {\n id: \"customize-yaml-size\",\n condition: async (_manifest, rootDir) => {\n const agentsDir = join(rootDir, AGENTS_DIR);\n try {\n const entries = await readdir(agentsDir, { recursive: true });\n for (const entry of entries) {\n if (typeof entry === \"string\" && entry.endsWith(\".customize.yaml\")) {\n const s = await stat(join(agentsDir, entry));\n if (s.size > 10240) return true;\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n return false;\n },\n execute: async (manifest, rootDir, _headless) => {\n const notices: string[] = [];\n const agentsDir = join(rootDir, AGENTS_DIR);\n try {\n const entries = await readdir(agentsDir, { recursive: true });\n for (const entry of entries) {\n if (typeof entry === \"string\" && entry.endsWith(\".customize.yaml\")) {\n const s = await stat(join(agentsDir, entry));\n if (s.size > 10240) {\n notices.push(`Large customize file detected: ${entry} (${Math.round(s.size / 1024)}KB) — consider splitting`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n return { manifest, notices };\n },\n },\n {\n id: \"worktree-config-init\",\n condition: async (manifest) => {\n if (manifest.worktree !== undefined) return false;\n const worktreeCapableTools = new Set([\"claude\"]);\n return manifest.tools.some(t => worktreeCapableTools.has(t));\n },\n execute: async (manifest, rootDir, headless) => {\n let enabled: boolean;\n\n if (headless) {\n // Default to enabled in headless/CI mode\n enabled = true;\n } else {\n const answer = await inquirer.prompt<{ enabled: boolean }>([{\n type: \"confirm\",\n name: \"enabled\",\n message: \"hatch3r now supports worktree file isolation for parallel agent sessions. Enable it?\",\n default: true,\n }]);\n enabled = answer.enabled;\n }\n\n const updated = { ...manifest, worktree: { enabled } };\n const notices: string[] = [];\n\n if (enabled) {\n const wtContent = await generateWorktreeInclude(updated, rootDir);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n appendIfNoBlock: true,\n });\n notices.push(\"Worktree isolation enabled — .worktreeinclude generated\");\n } else {\n notices.push(\"Worktree isolation skipped (enable later with `hatch3r config`)\");\n }\n\n return { manifest: updated, notices };\n },\n },\n];\n\nasync function runMigrationCheckpoints(manifest: HatchManifest, rootDir: string, headless = false): Promise<{ manifest: HatchManifest; allNotices: string[] }> {\n let current = manifest;\n const allNotices: string[] = [];\n\n for (const checkpoint of MIGRATION_CHECKPOINTS) {\n if (await checkpoint.condition(current, rootDir)) {\n const { manifest: updated, notices } = await checkpoint.execute(current, rootDir, headless);\n current = updated;\n allNotices.push(...notices);\n }\n }\n\n return { manifest: current, allNotices };\n}\n\nexport async function updateCommand(_opts?: Record<string, unknown> & { yes?: boolean }): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n const headless = !!(_opts?.yes);\n const { manifest: migrated, allNotices } = await runMigrationCheckpoints(manifest, rootDir, headless);\n const m = migrated;\n\n for (const notice of allNotices) {\n warn(notice);\n }\n\n const isUpToDate = m.hatch3rVersion === HATCH3R_VERSION;\n if (isUpToDate) {\n info(`Already at hatch3r v${HATCH3R_VERSION}`);\n } else {\n info(`Updating from v${m.hatch3rVersion} to v${HATCH3R_VERSION}`);\n }\n console.log();\n\n const result = await runUpdate(rootDir, m);\n\n console.log();\n printBox(\"Update complete\", [\n label(\"Files\", `${result.copiedFiles} canonical files updated`),\n label(\"Tools\", `${result.syncedTools} tool(s) re-synced`),\n label(\"Version\", `v${result.version}`),\n ], \"success\");\n}\n","import { dirname } from \"node:path\";\nimport type {\n AdapterOutput,\n Features,\n GenerationMode,\n HatchManifest,\n} from \"../types.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization, applyCustomizationRaw } from \"./customization.js\";\nimport { readMcpConfig, type McpServerEntry } from \"./mcp-utils.js\";\nimport { readHookDefinitions } from \"../hooks/index.js\";\n\nexport interface Adapter {\n name: string;\n warnings: string[];\n generate(agentsDir: string, manifest: HatchManifest, generationMode?: GenerationMode): Promise<AdapterOutput[]>;\n getOutputPaths(agentsDir: string, manifest: HatchManifest): Promise<string[]>;\n}\n\nexport function output(\n path: string,\n content: string,\n managedContent?: string,\n): AdapterOutput {\n return { path, content, managedContent, action: \"create\" };\n}\n\nexport interface AdapterContext {\n agentsDir: string;\n manifest: HatchManifest;\n features: Features;\n projectRoot: string;\n /** Generation verbosity mode. \"minimal\" strips comments, descriptions, and reduces formatting. */\n generationMode: GenerationMode;\n}\n\nexport interface ModelFormat {\n text: string;\n after?: boolean;\n}\n\nexport type CleanMcpEntry = Omit<McpServerEntry, \"_disabled\" | \"_description\">;\n\nfunction defaultModelFormat(model: string): ModelFormat {\n return { text: `**Recommended model:** \\`${model}\\`` };\n}\n\nexport abstract class BaseAdapter implements Adapter {\n abstract readonly name: string;\n warnings: string[] = [];\n\n /**\n * Generate adapter output files from canonical content.\n *\n * Output structure contract -- each AdapterOutput returned MUST satisfy:\n * - `path` must be a valid relative path (no absolute paths, no leading `/`)\n * - `path` must not traverse upward (no `..` segments)\n * - `content` must be non-empty (zero-length content indicates a generation bug)\n * - `managedContent`, if present, must be a substring of `content` (it represents\n * the hatch3r-managed portion within the full file content)\n *\n * Adapters that violate these invariants will produce broken output files or\n * corrupt user content during the merge phase.\n */\n async generate(agentsDir: string, manifest: HatchManifest, generationMode: GenerationMode = \"standard\"): Promise<AdapterOutput[]> {\n this.warnings = [];\n return this.doGenerate({\n agentsDir,\n manifest,\n features: manifest.features,\n projectRoot: dirname(agentsDir),\n generationMode,\n });\n }\n\n /**\n * Returns the list of output file paths this adapter would produce.\n * Override in subclasses for a lightweight implementation that avoids\n * full content generation when only paths are needed.\n */\n async getOutputPaths(agentsDir: string, manifest: HatchManifest): Promise<string[]> {\n const outputs = await this.generate(agentsDir, manifest);\n return outputs.map((o) => o.path);\n }\n\n protected abstract doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]>;\n\n protected async bridgeHeader(ctx: AdapterContext, agentsPath = \"/.agents/AGENTS.md\"): Promise<string[]> {\n const orchestration = await generateBridgeOrchestration(ctx.agentsDir);\n if (this.isMinimal(ctx)) {\n return [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n `Instructions: \\`${agentsPath}\\``,\n \"\",\n this.stripMinimal(orchestration),\n \"\",\n ];\n }\n return [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n `Full canonical agent instructions are at \\`${agentsPath}\\`.`,\n \"\",\n orchestration,\n \"\",\n ];\n }\n\n protected async inlineRules(ctx: AdapterContext): Promise<string[]> {\n if (!ctx.features.rules) return [];\n const lines: string[] = [];\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const minimal = this.isMinimal(ctx);\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n if (minimal) {\n lines.push(`## ${rule.id}`, \"\", this.stripMinimal(content), \"\");\n } else {\n lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\n }\n }\n return lines;\n }\n\n protected async inlineAgents(\n ctx: AdapterContext,\n formatModel?: (model: string) => ModelFormat,\n ): Promise<string[]> {\n if (!ctx.features.agents) return [];\n const lines: string[] = [];\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n const minimal = this.isMinimal(ctx);\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const fmt = model ? (formatModel ?? defaultModelFormat)(model) : undefined;\n lines.push(`## Agent: ${agent.id}`);\n if (fmt && !fmt.after) lines.push(fmt.text);\n if (minimal) {\n lines.push(\"\", this.stripMinimal(content));\n } else {\n lines.push(\"\", desc, \"\", content);\n }\n if (fmt?.after) lines.push(\"\", fmt.text);\n lines.push(\"\");\n }\n return lines;\n }\n\n protected async processSkillsRaw(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.skills) return [];\n const results: AdapterOutput[] = [];\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n results.push(output(pathFn(skill.id), wrapInManagedBlock(content), content));\n }\n return results;\n }\n\n protected async processSkillsWithFm(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.skills) return [];\n const results: AdapterOutput[] = [];\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? skill.description;\n const fm = `---\\nname: ${skill.id}\\ndescription: ${desc}\\n---`;\n results.push(output(pathFn(skill.id), `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n return results;\n }\n\n protected async processCommandsRaw(\n ctx: AdapterContext,\n pathFn: (id: string) => string,\n ): Promise<AdapterOutput[]> {\n if (!ctx.features.commands) return [];\n const results: AdapterOutput[] = [];\n const commands = await readCanonicalFiles(ctx.agentsDir, \"commands\");\n for (const cmd of commands) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, cmd);\n this.warnings.push(...warnings);\n if (skip) continue;\n results.push(output(pathFn(cmd.id), wrapInManagedBlock(content), content));\n }\n return results;\n }\n\n protected async readFilteredMcp(\n ctx: AdapterContext,\n ): Promise<Record<string, CleanMcpEntry> | null> {\n if (!ctx.features.mcp || ctx.manifest.mcp.servers.length === 0) return null;\n const { servers: mcpServers, warnings } = await readMcpConfig(ctx.agentsDir);\n this.warnings.push(...warnings);\n if (Object.keys(mcpServers).length === 0) return null;\n const selectedSet = new Set(ctx.manifest.mcp.servers);\n const filtered: Record<string, CleanMcpEntry> = {};\n for (const [name, entry] of Object.entries(mcpServers)) {\n if (entry._disabled) continue;\n if (!selectedSet.has(name)) continue;\n const { _disabled, _description, ...clean } = entry;\n filtered[name] = clean;\n }\n return Object.keys(filtered).length > 0 ? filtered : null;\n }\n\n protected buildStdMcpEntries(\n filtered: Record<string, CleanMcpEntry>,\n ): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(filtered)) {\n if (server.command) {\n result[name] = {\n command: server.command,\n args: server.args || [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n } else if (server.url) {\n result[name] = { url: server.url };\n }\n }\n return result;\n }\n\n protected async readHooks(ctx: AdapterContext) {\n if (!ctx.features.hooks) return [];\n return readHookDefinitions(ctx.agentsDir);\n }\n\n /** Returns true when the adapter is running in minimal generation mode. */\n protected isMinimal(ctx: AdapterContext): boolean {\n return ctx.generationMode === \"minimal\";\n }\n\n /**\n * Strip verbose content for minimal generation mode.\n * Removes markdown comments, collapses excessive blank lines,\n * strips decorative formatting, and trims descriptions.\n */\n protected stripMinimal(content: string): string {\n let result = content;\n // Remove HTML comments\n result = result.replace(/<!--[\\s\\S]*?-->/g, \"\");\n // Remove lines that are only horizontal rules\n result = result.replace(/^[-*_]{3,}\\s*$/gm, \"\");\n // Collapse 3+ consecutive blank lines to a single blank line\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n // Trim leading/trailing whitespace\n result = result.trim();\n return result;\n }\n}\n","export const MODEL_ALIASES: Record<string, string> = {\n \"opus\": \"claude-opus-4-6\",\n \"sonnet\": \"claude-sonnet-4-6\",\n \"haiku\": \"claude-haiku-4-5\",\n \"codex\": \"gpt-5.3-codex\",\n \"codex-prev\": \"gpt-5.2-codex\",\n \"codex-mini\": \"gpt-5.1-codex-mini\",\n \"codex-spark\": \"gpt-5.3-codex-spark\",\n \"gemini-pro\": \"gemini-3.1-pro\",\n \"gemini-flash\": \"gemini-3-flash\",\n \"gemini-stable\": \"gemini-2.5-pro\",\n};\n\nexport function resolveModelAlias(input: string): string {\n return MODEL_ALIASES[input] ?? input;\n}\n","import type { CanonicalFile, HatchManifest } from \"../types.js\";\nimport type { AgentCustomization } from \"./customize.js\";\nimport { resolveModelAlias } from \"./aliases.js\";\n\nexport function resolveAgentModel(\n agentId: string,\n agent: CanonicalFile,\n manifest: HatchManifest,\n customize?: AgentCustomization,\n): string | undefined {\n const raw =\n customize?.model\n ?? manifest.models?.agents?.[agentId]\n ?? agent.model\n ?? manifest.models?.default;\n return raw ? resolveModelAlias(raw) : undefined;\n}\n\nconst PROVIDER_PREFIXES: [RegExp, string][] = [\n [/^claude-/, \"anthropic\"],\n [/^gpt-|^codex-/, \"openai\"],\n [/^gemini-/, \"google\"],\n];\n\nexport function withProviderPrefix(modelId: string): string {\n for (const [pattern, provider] of PROVIDER_PREFIXES) {\n if (pattern.test(modelId)) return `${provider}/${modelId}`;\n }\n return modelId;\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { wrapInManagedBlock } from \"../../merge/managedBlocks.js\";\nimport { parseFrontmatter } from \"../../adapters/canonical.js\";\n\n/**\n * Shared orchestration content inlined into adapter bridge files (CLAUDE.md, GEMINI.md,\n * .windsurfrules, .amp/AGENTS.md, .github/copilot-instructions.md, .cursor/rules/hatch3r-bridge.mdc).\n * Includes mandatory behaviors, agent quick reference, and canonical structure.\n * Ensures every platform receives inline orchestration guidance instead of relying solely\n * on \"read /.agents/AGENTS.md\" references.\n */\n/** Static bridge orchestration (no skill index). Used as fallback. */\nexport const BRIDGE_ORCHESTRATION = `## Sub-Agent Pipeline (mandatory, no exceptions)\n\nAll tasks use this four-phase pipeline. Never implement inline; always delegate.\n\n**Phase 1 — Research:** Spawn \\`hatch3r-researcher\\`. Skip only for trivial edits. Score complexity per \\`hatch3r-deep-context\\` and add tier modes.\n**Phase 2 — Implement:** Spawn \\`hatch3r-implementer\\` (one per task). Pass research context.\n**Phase 3 — Review Loop:** \\`hatch3r-reviewer\\` → if Critical/Warning: \\`hatch3r-fixer\\` → re-review → repeat (max 3). After clean verdict: one confirmation pass (regressions, acceptance criteria). Remaining findings after max iterations → surface to user.\n**Phase 4 — Final Quality** (after clean review): \\`hatch3r-test-writer\\` + \\`hatch3r-security-auditor\\` (always), \\`hatch3r-docs-writer\\` (evaluate), then conditional: lint-fixer, a11y-auditor, perf-profiler, dependency-auditor.\n\n## Mandatory Behaviors\n\n1. **Load skill** from \\`/.agents/skills/\\` matching task type before implementation.\n2. **Task tool** (\\`subagent_type: \"generalPurpose\"\\`) for all delegations. Max parallelism.\n3. **Propagate rules**: include \\`scope: always\\` directives in subagent prompts.\n4. **Consult learnings**: check \\`/.agents/learnings/\\` before implementation.\n5. **Consult specs**: if \\`docs/specs/\\` exists, read relevant specifications before implementation and cross-reference during review.\n\n## Agent Quick Reference\n\n| Agent | When |\n|-------|------|\n| \\`hatch3r-researcher\\` | Always before impl (skip trivial edits) |\n| \\`hatch3r-implementer\\` | Always — one per task |\n| \\`hatch3r-reviewer\\` | Always (Phase 3 loop) |\n| \\`hatch3r-fixer\\` | Critical/Warning findings (Phase 3) |\n| \\`hatch3r-test-writer\\` | Always for code changes (Phase 4) |\n| \\`hatch3r-security-auditor\\` | Always for code changes (Phase 4) |\n| \\`hatch3r-docs-writer\\` | Evaluate; spawn if doc impact (Phase 4) |\n| \\`hatch3r-lint-fixer\\` | Lint/type errors after impl |\n| \\`hatch3r-a11y-auditor\\` | UI/accessibility changes |\n| \\`hatch3r-architect\\` | Architectural decisions, API design |\n| \\`hatch3r-perf-profiler\\` | Performance-sensitive changes |\n| \\`hatch3r-dependency-auditor\\` | Dependency changes |\n| \\`hatch3r-ci-watcher\\` | CI failures |\n| \\`hatch3r-devops\\` | Infra, deployment, CI/CD changes |\n\nFull protocol: \\`hatch3r-agent-orchestration\\` rule in \\`/.agents/rules/\\`.\n\n## Canonical Structure\n\n- Rules: \\`/.agents/rules/\\` — Agents: \\`/.agents/agents/\\` — Skills: \\`/.agents/skills/\\`\n- Commands: \\`/.agents/commands/\\` — MCP: \\`/.agents/mcp/mcp.json\\` — Policy: \\`/.agents/policy/\\`\n\nDo not edit \\`hatch3r-\\` prefixed files — managed by hatch3r, overwritten on update.\n\n## Getting Started (staged introduction)\n\nNew to hatch3r? Start here and expand as you go:\n\n**Day 1 — Core workflow:** Use the 4-phase pipeline above for any task. Start by invoking \\`hatch3r-researcher\\` for context, then \\`hatch3r-implementer\\` for changes.\n**Week 1 — Skills & commands:** Load skills from \\`/.agents/skills/\\` matching your task type. Try \\`/hatch3r-feature\\` or \\`/hatch3r-bug-fix\\` commands.\n**Week 2 — Board & team:** If using project management, run \\`/hatch3r-board-init\\` to set up your board. Use \\`/hatch3r-board-pickup\\` for structured delivery.\n**Ongoing — Customization:** Override agent behavior via \\`.hatch3r/{type}/{id}.customize.yaml\\`. Add project learnings to \\`/.agents/learnings/\\`.`;\n\n/**\n * Generate bridge orchestration with an inline skill dispatch table.\n * Falls back to the static BRIDGE_ORCHESTRATION if agentsDir is unavailable.\n */\nexport async function generateBridgeOrchestration(agentsDir: string): Promise<string> {\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length === 0) return BRIDGE_ORCHESTRATION;\n\n const skillTable = [\n \"\\n## Skill Dispatch Table\\n\",\n \"Load the matching skill before implementation. Full content in `/.agents/skills/{id}/SKILL.md`.\\n\",\n \"| Task Type | Skill | Description |\",\n \"|-----------|-------|-------------|\",\n ];\n for (const skill of skills) {\n skillTable.push(`| — | \\`${skill.id}\\` | ${skill.description.slice(0, 80)} |`);\n }\n\n // Insert skill table after the Agent Quick Reference table\n const insertPoint = \"Do not edit `hatch3r-` prefixed files\";\n const idx = BRIDGE_ORCHESTRATION.indexOf(insertPoint);\n if (idx === -1) return BRIDGE_ORCHESTRATION;\n\n return (\n BRIDGE_ORCHESTRATION.slice(0, idx) +\n skillTable.join(\"\\n\") +\n \"\\n\\n\" +\n BRIDGE_ORCHESTRATION.slice(idx)\n );\n}\n\nexport const AGENTS_MD_INNER = [\n \"# Project Agent Instructions\",\n \"\",\n \"This project uses hatch3r for agentic coding setup.\",\n \"Full canonical instructions are at `/.agents/AGENTS.md`.\",\n \"\",\n \"## Quick Reference\",\n \"\",\n \"- Rules: `/.agents/rules/`\",\n \"- Agents: `/.agents/agents/`\",\n \"- Skills: `/.agents/skills/`\",\n \"- Commands: `/.agents/commands/`\",\n].join(\"\\n\");\n\nexport const AGENTS_MD_FULL = `${wrapInManagedBlock(AGENTS_MD_INNER)}\\n`;\n\n// ── Dynamic AGENTS.md generation ──────────────────────────────\n\n/**\n * Generate canonical AGENTS.md content based on what's actually installed on disk.\n * Reads agent, skill, and command files from the .agents/ directory.\n */\nexport async function generateCanonicalAgentsMd(agentsDir: string): Promise<string> {\n const sections: string[] = [];\n\n sections.push(`# hatch3r — Canonical Agent Instructions\n\nThis file is the canonical reference for all agent orchestration in this project. It is auto-generated by hatch3r and should not be manually edited.\n\n## Universal Sub-Agent Pipeline\n\nEvery task — board-pickup, workflow command, plain chat, single-task, or multi-task — MUST use this four-phase sub-agent pipeline. There are NO exceptions. Never implement code inline; always delegate to sub-agents.\n\n**Phase 1 — Research:** Spawn \\`hatch3r-researcher\\` for context gathering before implementation. Skip only for trivial single-line edits.\n\n**Phase 2 — Implement:** Spawn \\`hatch3r-implementer\\` for ALL code changes. One dedicated implementer per task.\n\n**Phase 3 — Review Loop:** Spawn \\`hatch3r-reviewer\\`, then \\`hatch3r-fixer\\` for Critical/Warning findings, re-review, repeat until clean (max 3 iterations).\n\n**Phase 4 — Final Quality** (runs ONLY after review loop is clean): Spawn applicable specialists in parallel.\n\n## Orchestration Protocol\n\n1. **Load the matching skill** from \\`/.agents/skills/\\` based on task type before implementation.\n2. **Score task complexity** per the \\`hatch3r-deep-context\\` rule.\n3. **Spawn a researcher subagent** (\\`hatch3r-researcher\\`) for context gathering.\n4. **Spawn an implementer subagent** (\\`hatch3r-implementer\\`) for code changes.\n5. **Run the review loop** (Phase 3).\n6. **Spawn final quality subagents** (Phase 4).\n7. **Propagate rules** to all subagent prompts.\n8. **Consult learnings** from \\`/.agents/learnings/\\`.`);\n\n // Build agent roster from what's on disk\n const agents = await readDirFiles(join(agentsDir, \"agents\"));\n if (agents.length > 0) {\n sections.push(\"\\n## Agent Roster\\n\");\n sections.push(\"| Agent | Purpose |\");\n sections.push(\"|-------|---------|\");\n for (const agent of agents) {\n const { metadata } = parseFrontmatter(agent.content);\n const id = metadata.id || metadata.name || agent.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n // Build skill dispatch table with inline checklists from what's on disk\n const skills = await readSkillDirs(join(agentsDir, \"skills\"));\n if (skills.length > 0) {\n sections.push(\"\\n## Available Skills\\n\");\n sections.push(\"| Skill | Description |\");\n sections.push(\"|-------|-------------|\");\n for (const skill of skills) {\n sections.push(`| \\`${skill.id}\\` | ${skill.description.slice(0, 100)} |`);\n }\n\n // Inline condensed skill checklists so agents don't need a separate file read\n const skillsWithChecklists = skills.filter((s) => s.checklist);\n if (skillsWithChecklists.length > 0) {\n sections.push(\"\\n## Skill Quick Reference\\n\");\n sections.push(\"When loading a skill, follow its checklist steps below. Full skill content is in `/.agents/skills/{id}/SKILL.md`.\\n\");\n for (const skill of skillsWithChecklists) {\n sections.push(`### \\`${skill.id}\\`\\n`);\n sections.push(skill.checklist!);\n sections.push(\"\");\n }\n }\n }\n\n // Build command list from what's on disk\n const commands = await readDirFiles(join(agentsDir, \"commands\"));\n if (commands.length > 0) {\n sections.push(\"\\n## Available Commands\\n\");\n sections.push(\"| Command | Description |\");\n sections.push(\"|---------|-------------|\");\n for (const cmd of commands) {\n const { metadata } = parseFrontmatter(cmd.content);\n const id = metadata.id || metadata.name || cmd.name.replace(/\\.md$/, \"\");\n const desc = metadata.description ?? \"\";\n sections.push(`| \\`${id}\\` | ${desc.slice(0, 100)} |`);\n }\n }\n\n sections.push(`\n## Directory Structure\n\n- \\`/.agents/rules/\\` — Rules (source of truth for all tool-specific rules)\n- \\`/.agents/agents/\\` — Agent definitions\n- \\`/.agents/skills/\\` — Skill workflows\n- \\`/.agents/commands/\\` — Executable commands\n- \\`/.agents/mcp/\\` — MCP server configuration\n- \\`/.agents/policy/\\` — Guardrails and deny lists\n- \\`/.agents/learnings/\\` — Project learnings (pitfalls, patterns, decisions)\n`);\n\n return sections.join(\"\\n\");\n}\n\n// ── Helpers ──────────────────────────────────────────────────\n\ninterface DirFile {\n name: string;\n content: string;\n}\n\nasync function readDirFiles(dir: string): Promise<DirFile[]> {\n try {\n const entries = await readdir(dir);\n const mdFiles = entries.filter((f) => f.endsWith(\".md\")).sort();\n return Promise.all(\n mdFiles.map(async (name) => ({\n name,\n content: await readFile(join(dir, name), \"utf-8\"),\n })),\n );\n } catch {\n return [];\n }\n}\n\n/**\n * Extract a condensed checklist from skill content by pulling numbered lists\n * and heading structure (max ~20 lines per skill to keep token count manageable).\n */\nfunction extractSkillChecklist(content: string): string | undefined {\n const lines = content.split(\"\\n\");\n const checklist: string[] = [];\n let inSteps = false;\n\n for (const line of lines) {\n // Start capturing at headings containing \"steps\", \"protocol\", \"workflow\", \"checklist\", or numbered procedure\n if (/^#{1,3}\\s+.*(step|protocol|workflow|checklist|procedure|implementation)/i.test(line)) {\n inSteps = true;\n continue;\n }\n // Stop at the next major heading that isn't a sub-step\n if (inSteps && /^#{1,2}\\s+/.test(line) && !/step|phase/i.test(line)) {\n break;\n }\n if (inSteps && (line.match(/^\\d+\\.\\s/) || line.match(/^-\\s/) || line.match(/^\\s+\\d+\\.\\s/) || line.match(/^\\s+-\\s/))) {\n checklist.push(line);\n if (checklist.length >= 20) break;\n }\n }\n\n return checklist.length > 0 ? checklist.join(\"\\n\") : undefined;\n}\n\nasync function readSkillDirs(dir: string): Promise<{ id: string; description: string; checklist?: string }[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n const skills: { id: string; description: string; checklist?: string }[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n try {\n const raw = await readFile(join(dir, entry.name, \"SKILL.md\"), \"utf-8\");\n const { metadata, content } = parseFrontmatter(raw);\n skills.push({\n id: metadata.id || metadata.name || entry.name,\n description: metadata.description ?? \"\",\n checklist: extractSkillChecklist(content),\n });\n } catch {\n // skip\n }\n }\n return skills.sort((a, b) => a.id.localeCompare(b.id));\n } catch {\n return [];\n }\n}\n","import { readFile, readdir, lstat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { CanonicalFile, CanonicalMetadata } from \"../types.js\";\n\nconst FRONTMATTER_REGEX = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n([\\s\\S]*))?$/;\n\nexport function parseFrontmatter(rawContent: string): {\n metadata: CanonicalMetadata;\n content: string;\n} {\n const match = rawContent.match(FRONTMATTER_REGEX);\n if (!match) {\n return {\n metadata: { id: \"\", type: \"rule\", description: \"\" },\n content: rawContent,\n };\n }\n\n const [, frontmatterStr, content = \"\"] = match;\n const parsed = parseYaml(frontmatterStr ?? \"\") as Record<string, unknown> | null;\n const metadata: CanonicalMetadata = {\n id: \"\",\n type: \"rule\",\n description: \"\",\n };\n\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.id === \"string\") metadata.id = parsed.id;\n if (typeof parsed.type === \"string\") metadata.type = parsed.type;\n if (typeof parsed.description === \"string\") metadata.description = parsed.description;\n if (typeof parsed.name === \"string\") metadata.name = parsed.name;\n if (typeof parsed.scope === \"string\") metadata.scope = parsed.scope;\n if (typeof parsed.model === \"string\") metadata.model = parsed.model;\n if (typeof parsed.agent === \"string\") metadata.agent = parsed.agent;\n if (typeof parsed.event === \"string\") metadata.event = parsed.event;\n if (typeof parsed.globs === \"string\") metadata.globs = parsed.globs;\n if (typeof parsed.protected === \"boolean\") metadata.protected = parsed.protected;\n if (typeof parsed.alwaysApply === \"boolean\") metadata.alwaysApply = parsed.alwaysApply;\n if (typeof parsed.readonly === \"boolean\") metadata.readonly = parsed.readonly;\n if (typeof parsed.background === \"boolean\") metadata.background = parsed.background;\n if (Array.isArray(parsed.tags)) metadata.tags = parsed.tags.filter((t: unknown) => typeof t === \"string\");\n }\n\n if (!metadata.id && metadata.name) {\n metadata.id = metadata.name;\n }\n metadata.type = metadata.type ?? \"rule\";\n metadata.description = metadata.description ?? \"\";\n\n return { metadata, content: content ?? \"\" };\n}\n\nexport type CanonicalType =\n | \"rules\"\n | \"agents\"\n | \"skills\"\n | \"commands\"\n | \"prompts\"\n | \"github-agents\";\n\ninterface ReaderConfig {\n type: CanonicalFile[\"type\"];\n dir: string;\n strategy: \"glob\" | \"subdirectory\";\n}\n\nconst READER_CONFIGS: Record<CanonicalType, ReaderConfig> = {\n rules: { type: \"rule\", dir: \"rules\", strategy: \"glob\" },\n agents: { type: \"agent\", dir: \"agents\", strategy: \"glob\" },\n skills: { type: \"skill\", dir: \"skills\", strategy: \"subdirectory\" },\n commands: { type: \"command\", dir: \"commands\", strategy: \"glob\" },\n prompts: { type: \"prompt\", dir: \"prompts\", strategy: \"glob\" },\n \"github-agents\": { type: \"github-agent\", dir: \"github-agents\", strategy: \"glob\" },\n};\n\nasync function readGlobMd(baseDir: string, fileType: CanonicalFile[\"type\"]): Promise<CanonicalFile[]> {\n let entries: string[];\n try {\n const all = await readdir(baseDir, { recursive: true });\n entries = all.filter((f) => f.endsWith(\".md\")).sort();\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const results = await Promise.all(\n entries.map(async (relPath) => {\n const fullPath = join(baseDir, relPath);\n 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 })).sort((a, b) => a.name.localeCompare(b.name));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const entries = await Promise.all(\n dirents\n .filter((d) => d.isDirectory())\n .map(async (dir) => {\n const skillPath = join(baseDir, dir.name, \"SKILL.md\");\n try {\n const skillStats = await lstat(skillPath);\n if (skillStats.isSymbolicLink()) {\n return null;\n }\n const rawContent = await readFile(skillPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(rawContent);\n const id = metadata.name ?? metadata.id ?? dir.name;\n return {\n id,\n type: \"skill\" as const,\n description: metadata.description ?? \"\",\n protected: metadata.protected,\n tags: metadata.tags,\n content,\n rawContent,\n sourcePath: skillPath,\n };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return null;\n }\n }),\n );\n\n return entries.filter((e): e is NonNullable<typeof e> => e !== null);\n}\n\nexport async function readCanonicalFiles(\n agentsDir: string,\n type: CanonicalType,\n): Promise<CanonicalFile[]> {\n const config = READER_CONFIGS[type];\n const baseDir = join(agentsDir, config.dir);\n return config.strategy === \"subdirectory\"\n ? readSkillSubdirs(baseDir)\n : readGlobMd(baseDir, config.type);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface McpServerEntry {\n command?: string;\n args?: string[];\n url?: string;\n env?: Record<string, string>;\n _description?: string;\n _disabled?: boolean;\n}\n\nconst ALLOWED_COMMANDS = new Set([\n \"npx\",\n \"node\",\n \"uvx\",\n \"docker\",\n \"python\",\n \"python3\",\n \"pip\",\n \"pip3\",\n \"deno\",\n \"bun\",\n \"uv\",\n \"go\",\n \"cargo\",\n]);\n\nconst ALLOWED_URL_SCHEMES = new Set([\"http:\", \"https:\"]);\n\nexport function validateMcpEntry(\n name: string,\n entry: McpServerEntry,\n): string[] {\n const warnings: string[] = [];\n\n if (entry.command) {\n const baseCommand =\n entry.command.split(\"/\").pop()?.split(\"\\\\\").pop() ?? entry.command;\n if (!ALLOWED_COMMANDS.has(baseCommand)) {\n warnings.push(\n `MCP server \"${name}\" uses unrecognized command \"${entry.command}\". ` +\n `Expected one of: ${[...ALLOWED_COMMANDS].join(\", \")}`,\n );\n }\n }\n\n if (entry.url) {\n try {\n const parsed = new URL(entry.url);\n if (!ALLOWED_URL_SCHEMES.has(parsed.protocol)) {\n warnings.push(\n `MCP server \"${name}\" uses unsupported URL scheme \"${parsed.protocol}\". ` +\n `Allowed: ${[...ALLOWED_URL_SCHEMES].join(\", \")}`,\n );\n }\n } catch {\n warnings.push(\n `MCP server \"${name}\" has invalid URL: \"${entry.url}\"`,\n );\n }\n }\n\n if (!entry.command && !entry.url) {\n warnings.push(\n `MCP server \"${name}\" has neither command nor url configured`,\n );\n }\n\n if (entry.args) {\n const SHELL_METACHAR = /[|;&`$()]/;\n for (const arg of entry.args) {\n if (SHELL_METACHAR.test(arg)) {\n warnings.push(\n `MCP server \"${name}\" arg contains shell metacharacters: \"${arg}\". ` +\n `This may indicate a command injection risk.`,\n );\n }\n }\n\n const hasAutoYes = entry.args.some((a) => a === \"-y\" || a === \"--yes\");\n if (hasAutoYes) {\n const pkgArg = entry.args.find(\n (a) => !a.startsWith(\"-\") && a !== entry.command,\n );\n if (pkgArg && !pkgArg.startsWith(\"@\")) {\n warnings.push(\n `MCP server \"${name}\" uses npx -y with unscoped package \"${pkgArg}\". ` +\n `Unscoped packages are susceptible to typosquatting. Consider using a scoped package (@org/pkg).`,\n );\n }\n }\n }\n\n return warnings;\n}\n\n// Server names must contain only alphanumeric characters, hyphens, and underscores.\n// Names with other special characters are rejected to prevent path traversal,\n// injection, or config key manipulation.\nconst VALID_SERVER_NAME = /^[a-zA-Z0-9_-]+$/;\n\nexport function validateServerName(name: string): string | null {\n if (!VALID_SERVER_NAME.test(name)) {\n return (\n `MCP server name \"${name}\" contains invalid characters. ` +\n `Only alphanumeric characters, hyphens, and underscores are allowed.`\n );\n }\n return null;\n}\n\nfunction validateMcpConfig(\n parsed: unknown,\n): parsed is { mcpServers: Record<string, McpServerEntry> } {\n if (typeof parsed !== \"object\" || parsed === null) return false;\n const obj = parsed as Record<string, unknown>;\n return typeof obj.mcpServers === \"object\" && obj.mcpServers !== null;\n}\n\nexport interface McpConfigResult {\n servers: Record<string, McpServerEntry>;\n warnings: string[];\n}\n\nexport async function readMcpConfig(\n agentsDir: string,\n): Promise<McpConfigResult> {\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n const warnings: string[] = [];\n try {\n const mcpRaw = await readFile(mcpPath, \"utf-8\");\n const parsed: unknown = JSON.parse(mcpRaw);\n if (validateMcpConfig(parsed)) {\n const validServers: Record<string, McpServerEntry> = {};\n for (const [name, entry] of Object.entries(parsed.mcpServers)) {\n const nameWarning = validateServerName(name);\n if (nameWarning) {\n warnings.push(nameWarning);\n continue;\n }\n warnings.push(...validateMcpEntry(name, entry));\n validServers[name] = entry;\n }\n return { servers: validServers, warnings };\n }\n return { servers: {}, warnings };\n } catch (err) {\n warnings.push(`Could not read MCP config: ${err instanceof Error ? err.message : String(err)}`);\n return { servers: {}, warnings };\n }\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { HookDefinition } from \"./types.js\";\nimport { isValidHookEvent } from \"./types.js\";\n\nexport async function readHookDefinitions(\n agentsDir: string,\n): Promise<HookDefinition[]> {\n const hooksDir = join(agentsDir, \"hooks\");\n\n let entries: string[];\n try {\n const dirEntries = await readdir(hooksDir);\n entries = dirEntries.filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return [];\n }\n\n const hooks: HookDefinition[] = [];\n\n for (const entry of entries) {\n const content = await readFile(join(hooksDir, entry), \"utf-8\");\n const hook = parseHookFrontmatter(content);\n if (hook) {\n hooks.push(hook);\n }\n }\n\n return hooks;\n}\n\nfunction parseHookFrontmatter(content: string): HookDefinition | null {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/);\n if (!match) return null;\n\n const parsed = parseYaml(match[1]) as Record<string, unknown> | null;\n if (!parsed || typeof parsed !== \"object\") return null;\n\n if (!parsed.id || !parsed.event || !parsed.agent) return null;\n\n const eventStr = String(parsed.event);\n if (!isValidHookEvent(eventStr)) return null;\n\n const hook: HookDefinition = {\n id: String(parsed.id),\n event: eventStr,\n agent: String(parsed.agent),\n description: parsed.description ? String(parsed.description) : \"\",\n };\n\n const condition: HookDefinition[\"condition\"] = {};\n let hasCondition = false;\n\n if (parsed.globs) {\n condition.globs = Array.isArray(parsed.globs)\n ? parsed.globs.map(String)\n : String(parsed.globs).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n if (parsed.labels) {\n condition.labels = Array.isArray(parsed.labels)\n ? parsed.labels.map(String)\n : String(parsed.labels).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n if (parsed.branches) {\n condition.branches = Array.isArray(parsed.branches)\n ? parsed.branches.map(String)\n : String(parsed.branches).split(\",\").map((s: string) => s.trim());\n hasCondition = true;\n }\n\n if (hasCondition) {\n hook.condition = condition;\n }\n\n return hook;\n}\n","export type HookEvent =\n | \"pre-commit\"\n | \"post-merge\"\n | \"ci-failure\"\n | \"file-save\"\n | \"session-start\"\n | \"pre-push\"\n | \"worktree-create\"\n | \"worktree-remove\";\n\nexport const VALID_HOOK_EVENTS = new Set<HookEvent>([\n \"pre-commit\",\n \"post-merge\",\n \"ci-failure\",\n \"file-save\",\n \"session-start\",\n \"pre-push\",\n \"worktree-create\",\n \"worktree-remove\",\n]);\n\nexport function isValidHookEvent(event: string): event is HookEvent {\n return VALID_HOOK_EVENTS.has(event as HookEvent);\n}\n\nexport interface HookDefinition {\n id: string;\n event: HookEvent;\n agent: string;\n description: string;\n condition?: HookCondition;\n}\n\nexport interface HookCondition {\n globs?: string[];\n labels?: string[];\n branches?: string[];\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class AiderAdapter extends BaseAdapter {\n readonly name = \"aider\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n\n const results: AdapterOutput[] = [\n output(\"CONVENTIONS.md\", wrapInManagedBlock(inner), inner),\n ];\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.aider/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n // Note: Aider config is output as YAML (.aider.conf.yml). If TOML output is\n // ever added for Aider, all string values must be properly escaped using\n // escapeTomlString() from toml-utils.ts to handle backslashes, quotes, and\n // control characters correctly.\n results.push(output(\".aider.conf.yml\", [\n \"# Managed by hatch3r — do not edit manually\",\n \"read:\",\n \" - CONVENTIONS.md\",\n \" - .agents/AGENTS.md\",\n \"auto-lint: true\",\n \"\",\n ].join(\"\\n\")));\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class AmazonQAdapter extends BaseAdapter {\n readonly name = \"amazon-q\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".amazonq/rules/hatch3r-agents.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.amazonq/rules/hatch3r-skill-${id}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".amazonq/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 { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class AmpAdapter extends BaseAdapter {\n readonly name = \"amp\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx, (m) => ({\n text: `**Recommended model:** \\`${m}\\`. Use Smart mode for Opus, Rush for Haiku, Deep for Codex.`,\n })),\n ].join(\"\\n\");\n results.push(output(\"AGENTS.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.agents/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".amp/settings.json\", JSON.stringify({ \"amp.mcpServers\": entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\n// Antigravity adapter — generates configuration for Google Antigravity IDE.\n// Antigravity reads project rules from `.antigravity/rules.md` and skills\n// from `.antigravity/skills/`. MCP servers are configured in\n// `.antigravity/settings.json`. The adapter also generates a bridge file\n// referencing the canonical `.agents/AGENTS.md`.\nexport class AntigravityAdapter extends BaseAdapter {\n readonly name = \"antigravity\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx, \".agents/AGENTS.md\"),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n results.push(output(\".antigravity/rules.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.antigravity/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".antigravity/settings.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookDefinition, HookEvent } from \"../hooks/types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nconst AGENT_TEAMS_SECTION = [\n \"## Agent Teams\",\n \"\",\n \"This project uses hatch3r's 4-phase sub-agent pipeline (Research -> Implement -> Review -> Quality)\",\n \"which maps directly to Claude Code Agent Teams. Each phase becomes a teammate role.\",\n \"\",\n \"### Enabling Agent Teams\",\n \"\",\n \"Agent Teams is enabled via `.claude/settings.json`. The env var `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`\",\n \"is set automatically by hatch3r. Once enabled, request a team in the prompt:\",\n \"\",\n \"```\",\n 'Create an agent team for this task. Use the hatch3r 4-phase pipeline.',\n \"```\",\n \"\",\n \"### Teammate Display Modes\",\n \"\",\n \"Agent Teams supports two display modes configured via `teammateMode` in `.claude/settings.json`:\",\n \"\",\n '- `\"auto\"` (default): uses split panes if inside tmux, in-process otherwise.',\n '- `\"in-process\"`: all teammates run inside your main terminal. Use Shift+Down to cycle.',\n '- `\"tmux\"`: each teammate gets its own pane. Requires tmux or iTerm2.',\n \"\",\n \"### Pipeline-to-Team Mapping\",\n \"\",\n \"| Phase | Teammate Role | hatch3r Agents | Delegation Notes |\",\n \"|-------|--------------|----------------|------------------|\",\n \"| **1 — Research** | `researcher` | `hatch3r-researcher`, `hatch3r-learnings-loader` | Read-only; shares findings via task list |\",\n \"| **2 — Implement** | `implementer` | `hatch3r-implementer` | Require plan approval for complex tasks |\",\n \"| **3 — Review** | `reviewer` | `hatch3r-reviewer`, `hatch3r-fixer` | Review loop: reviewer finds issues, fixer resolves them |\",\n \"| **4 — Quality** | `quality-*` (parallel) | `hatch3r-test-writer`, `hatch3r-security-auditor`, `hatch3r-docs-writer`, `hatch3r-lint-fixer`, `hatch3r-a11y-auditor`, `hatch3r-perf-profiler`, `hatch3r-dependency-auditor` | Spawn in parallel; each owns distinct files |\",\n \"\",\n \"### Spawn Prompt Template\",\n \"\",\n \"When creating a team, use explicit file boundaries and role assignments:\",\n \"\",\n \"```\",\n \"Create an agent team with these roles:\",\n \"1. researcher — gather context from src/ and docs/. Read-only, no code changes.\",\n \" Share findings via the task list.\",\n \"2. implementer — implement changes in {target directories}.\",\n \" Require plan approval before making changes.\",\n \"3. reviewer — review the implementer's changes for correctness, style, and security.\",\n \" Post findings to the task list.\",\n \"4. test-writer — write tests for the implemented changes in {test directories}.\",\n \"5. security-auditor — audit changes for security vulnerabilities. Read-only.\",\n \"```\",\n \"\",\n \"### Delegation Rules\",\n \"\",\n \"- **Researcher before implementer**: Block implementer tasks on researcher completion.\",\n \" The lead should not approve the implementer's plan until researcher findings are posted.\",\n \"- **Reviewer in loop**: After implementation, the reviewer teammate inspects changes.\",\n \" If critical issues are found, message the implementer directly to fix them.\",\n \"- **Quality in parallel**: Once review is clean, spawn quality teammates simultaneously.\",\n \" Each quality teammate owns a distinct concern (tests, security, docs) to avoid conflicts.\",\n \"- **Plan approval**: Require plan approval for the implementer teammate to ensure\",\n \" the implementation approach aligns with researcher findings before any code is written.\",\n \"\",\n \"### Quality Gate Hooks\",\n \"\",\n \"The `TaskCompleted` and `TeammateIdle` hooks in `.claude/settings.json` enforce the pipeline:\",\n \"\",\n \"- `TaskCompleted` validates that completed tasks meet review criteria before marking done.\",\n \"- `TeammateIdle` checks whether idle teammates can pick up pending quality-phase tasks.\",\n \"\",\n \"### Important Notes\",\n \"\",\n \"- Teammates read this `CLAUDE.md` automatically — all hatch3r instructions apply to every teammate.\",\n \"- Teammates do **not** inherit conversation history; include full task context in spawn prompts.\",\n \"- Assign explicit file boundaries to avoid edit conflicts between teammates.\",\n \"- Use the `hatch3r-agent-team` command (`/hatch3r-agent-team`) for guided team creation.\",\n];\n\n/** Minimal version of Agent Teams section -- essential mapping only, no prose. */\nconst AGENT_TEAMS_SECTION_MINIMAL = [\n \"## Agent Teams\",\n \"\",\n \"Pipeline maps to Claude Code Agent Teams. Enable via `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`.\",\n \"\",\n \"| Phase | Role | Agents |\",\n \"|-------|------|--------|\",\n \"| Research | `researcher` | `hatch3r-researcher` |\",\n \"| Implement | `implementer` | `hatch3r-implementer` |\",\n \"| Review | `reviewer` | `hatch3r-reviewer`, `hatch3r-fixer` |\",\n \"| Quality | `quality-*` | `hatch3r-test-writer`, `hatch3r-security-auditor`, + conditional |\",\n \"\",\n \"Use `/hatch3r-agent-team` for guided team creation.\",\n];\n\nconst AGENT_TEAM_COMMAND = `# hatch3r Agent Team\n\nCreate a Claude Code Agent Team that follows the hatch3r 4-phase pipeline.\n\n## Usage\n\nDescribe the task when invoking this command. The team will be structured according\nto the hatch3r pipeline: Research → Implement → Review → Quality.\n\n## Team Structure\n\nSet up an Agent Team with these roles based on the task described above:\n\n### Phase 1 — Research (read-only)\n\nSpawn a \\`researcher\\` teammate:\n- Read the codebase to understand context, patterns, and conventions\n- Identify affected files and blast radius\n- Share findings via the shared task list\n- Do NOT modify any files\n\n### Phase 2 — Implement (requires plan approval)\n\nSpawn an \\`implementer\\` teammate after the researcher completes:\n- Review the researcher's findings from the task list before planning\n- Create a plan and submit for approval before writing code\n- Implement changes within the assigned file boundaries\n- Mark implementation tasks complete when done\n\n### Phase 3 — Review\n\nSpawn a \\`reviewer\\` teammate after implementation:\n- Review all changes made by the implementer\n- Post findings (Critical/Warning/Info) to the task list\n- If Critical or Warning findings exist, message the implementer to fix\n- Re-review after fixes; repeat up to 3 iterations\n\n### Phase 4 — Quality (parallel)\n\nAfter review is clean, spawn quality teammates in parallel:\n- \\`test-writer\\` — write/update tests for the changes\n- \\`security-auditor\\` — audit for security vulnerabilities (read-only)\n- \\`docs-writer\\` — update documentation if APIs or behavior changed\n\nEach quality teammate owns distinct files to avoid conflicts.\n\n## Task Dependencies\n\n- implementer depends on researcher\n- reviewer depends on implementer\n- quality teammates depend on reviewer (clean review)\n\n## Important\n\n- Teammate display mode is configured in \\`.claude/settings.json\\` via \\`teammateMode\\` (\\`auto\\`, \\`in-process\\`, or \\`tmux\\`)\n- Override for a single session: \\`claude --teammate-mode in-process\\`\n- Each teammate reads CLAUDE.md and inherits project rules automatically\n- Assign explicit file/directory boundaries to each teammate\n- The lead coordinates; it should NOT implement code itself (use delegate mode)\n`;\n\n// Claude Code hooks use an event+matcher pattern, not direct git hook names.\n// Each hook fires on a Claude event (e.g. PreToolUse, PostToolUse, SessionStart)\n// paired with a tool matcher regex that scopes when the hook triggers.\n//\n// Mapping from hatch3r canonical hook events to Claude Code hook semantics:\n// pre-commit -> PreToolUse + matcher \"Bash\" (intercept before shell commands)\n// post-merge -> PostToolUse + matcher \"Bash\" (react after shell commands)\n// ci-failure -> SubagentStart + matcher \"Bash\" (trigger on sub-agent launch)\n// file-save -> PostToolUse + matcher \"Write\" (react after file writes)\n// session-start -> SessionStart + matcher \".*\" (fire on every session start)\n// pre-push -> PreToolUse + matcher \"Bash\" (intercept before shell commands)\nfunction mapToClaudeEvent(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"PreToolUse\",\n \"post-merge\": \"PostToolUse\",\n \"ci-failure\": \"SubagentStart\",\n \"file-save\": \"PostToolUse\",\n \"session-start\": \"SessionStart\",\n \"pre-push\": \"PreToolUse\",\n \"worktree-create\": \"PostToolUse\",\n \"worktree-remove\": \"PreToolUse\",\n };\n return mapping[event] || event;\n}\n\nfunction getClaudeToolMatcher(hook: HookDefinition): string {\n const eventToolMap: Record<HookEvent, string> = {\n \"pre-commit\": \"Bash\",\n \"post-merge\": \"Bash\",\n \"file-save\": \"Write\",\n \"session-start\": \".*\",\n \"pre-push\": \"Bash\",\n \"ci-failure\": \"Bash\",\n \"worktree-create\": \"Bash\",\n \"worktree-remove\": \"Bash\",\n };\n return eventToolMap[hook.event] || \".*\";\n}\n\nfunction transformEnvVarsForClaude(value: unknown): unknown {\n if (typeof value === \"string\") {\n return value.replace(/\\$\\{env:([^}]+)\\}/g, \"${$1}\");\n }\n if (Array.isArray(value)) {\n return value.map(transformEnvVarsForClaude);\n }\n if (typeof value === \"object\" && value !== null) {\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value)) {\n result[k] = transformEnvVarsForClaude(v);\n }\n return result;\n }\n return value;\n}\n\nexport class ClaudeAdapter extends BaseAdapter {\n readonly name = \"claude\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n const minimal = this.isMinimal(ctx);\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const teamsSection = minimal ? AGENT_TEAMS_SECTION_MINIMAL : AGENT_TEAMS_SECTION;\n const innerParts = minimal\n ? [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Instructions: `.agents/AGENTS.md`. Rules: `.claude/rules/`. Agents: `.claude/agents/`.\",\n \"\",\n this.stripMinimal(bridgeOrchestration),\n \"\",\n ...teamsSection,\n \"\",\n ]\n : [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Full canonical agent instructions are at `.agents/AGENTS.md`.\",\n \"Rules are managed in `.claude/rules/` and agents in `.claude/agents/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...teamsSection,\n \"\",\n \"## Personal Settings\",\n \"\",\n \"Create `CLAUDE.local.md` for personal settings (not committed to git).\",\n \"Claude Code reads this file for user-specific preferences.\",\n \"\",\n \"## Getting Started with Claude Code\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.claude/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use `/hatch3r-feature` or `/hatch3r-bug-fix` commands for guided workflows.\",\n \"**Then:** Delegate to agents in `.claude/agents/` — use Agent Teams for parallel execution.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ];\n const innerContent = innerParts.join(\"\\n\");\n results.push(output(\"CLAUDE.md\", wrapInManagedBlock(innerContent), innerContent));\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const body = minimal\n ? `# ${rule.id}\\n\\n${this.stripMinimal(content)}`\n : `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.claude/rules/${toPrefixedId(rule.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const fm = `---\\ndescription: ${desc}\\n---`;\n if (minimal) {\n const modelNote = model ? `\\nModel: \\`${model}\\`` : \"\";\n const body = `${this.stripMinimal(content)}${modelNote}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n } else {\n const modelGuidance = model\n ? `\\n\\n## Recommended Model\\n\\nPreferred: \\`${model}\\`. Set via \\`/model ${model}\\` or env \\`CLAUDE_CODE_SUBAGENT_MODEL=${model}\\`.`\n : \"\";\n const body = `${content}${modelGuidance}`;\n results.push(output(`.claude/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n }\n\n const defaultAllow = [\"Read\", \"Edit\", \"MultiEdit\", \"Write\", \"Grep\", \"Glob\", \"LS\", \"TodoRead\", \"TodoWrite\"];\n const claudeConfig = ctx.manifest.claude;\n\n // Agent Teams GA compatibility: use \"auto\" as default teammateMode.\n // Legacy values (\"tool-using\", \"full-trust\", \"manual-approval\") are still\n // accepted for backward compatibility but \"auto\" is the GA default.\n const teammateMode = claudeConfig?.teammateMode ?? \"auto\";\n\n const settingsObj: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n permissions: {\n allow: claudeConfig?.permissions?.allow ?? defaultAllow,\n deny: claudeConfig?.permissions?.deny ?? [],\n },\n teammateMode,\n };\n\n const hooksConfig: Record<string, Array<{ matcher: string; hooks: Array<{ type: string; command: string }> }>> = {};\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const claudeEvent = mapToClaudeEvent(hook.event);\n if (!hooksConfig[claudeEvent]) hooksConfig[claudeEvent] = [];\n hooksConfig[claudeEvent].push({\n matcher: getClaudeToolMatcher(hook),\n hooks: [{ type: \"command\", command: `echo \"HATCH3R_HOOK_ACTIVATED: Spawn the ${hook.agent} agent now. Follow the ${hook.agent} agent protocol in .claude/agents/${toPrefixedId(hook.agent)}.md. Event: ${hook.event}. Hook ID: ${hook.id}.\"` }],\n });\n }\n\n hooksConfig.TaskCompleted = [{\n matcher: \".*\",\n hooks: [{ type: \"command\", command: \"echo \\\"HATCH3R_QUALITY_GATE: Before marking this task complete, verify: (1) Phase 3 review loop passed with 0 Critical + 0 Warning, (2) Phase 4 specialists ran (hatch3r-test-writer + hatch3r-security-auditor at minimum), (3) all acceptance criteria met. If any check fails, do NOT mark complete — spawn the appropriate agent to address the gap.\\\"\" }],\n }];\n hooksConfig.TeammateIdle = [{\n matcher: \".*\",\n hooks: [{ type: \"command\", command: \"echo \\\"HATCH3R_PIPELINE_CHECK: Idle teammate detected. Check for pending Phase 4 quality tasks: hatch3r-test-writer, hatch3r-security-auditor, hatch3r-docs-writer, hatch3r-lint-fixer, hatch3r-a11y-auditor. If any are pending and within this teammate's scope, pick up the next task.\\\"\" }],\n }];\n\n // Worktree file isolation: detect `git worktree add` and sync gitignored files\n if (ctx.manifest.worktree?.enabled) {\n if (!hooksConfig.PostToolUse) hooksConfig.PostToolUse = [];\n hooksConfig.PostToolUse.push({\n matcher: \"Bash\",\n hooks: [{\n type: \"command\",\n command: 'bash -c \\'CMD=\"${TOOL_INPUT:-}\"; if echo \"$CMD\" | grep -q \"git worktree add\"; then ARGS=\"${CMD#*git worktree add}\"; WTDIR=\"\"; SKIP=false; for w in $ARGS; do if $SKIP; then SKIP=false; continue; fi; case \"$w\" in -b|-B|--reason) SKIP=true;; -*) ;; *) WTDIR=\"$w\"; break;; esac; done; [ -n \"$WTDIR\" ] && npx hatch3r worktree-setup \"$WTDIR\" || true; fi\\'',\n }],\n });\n }\n\n settingsObj.hooks = hooksConfig;\n\n // Agent Teams: when agentTeams is \"ga\", omit the experimental env var\n // (the feature is natively available). Otherwise, set the experimental flag\n // to enable Agent Teams unless explicitly disabled (agentTeams === false).\n const agentTeamsSetting = ctx.manifest.claude?.agentTeams;\n if (agentTeamsSetting === \"ga\") {\n // GA mode: no experimental flag needed, Agent Teams is natively available.\n // Only set env if there are other env vars to include.\n } else if (agentTeamsSetting !== false) {\n settingsObj.env = { CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: \"1\" };\n }\n results.push(output(\".claude/settings.json\", JSON.stringify(settingsObj, null, 2)));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.claude/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.claude/commands/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp) {\n const claudeMcp: Record<string, unknown> = {};\n for (const [name, entry] of Object.entries(mcp)) {\n const type = entry.command ? \"stdio\" : entry.url ? \"http\" : undefined;\n const withType = type ? { type, ...entry } : { ...entry };\n claudeMcp[name] = transformEnvVarsForClaude(withType);\n }\n results.push(output(\".mcp.json\", JSON.stringify({ mcpServers: claudeMcp }, null, 2)));\n }\n\n results.push(output(\".claude/commands/hatch3r-agent-team.md\", wrapInManagedBlock(AGENT_TEAM_COMMAND), AGENT_TEAM_COMMAND));\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\ninterface ClineCustomMode {\n slug: string;\n name: string;\n roleDefinition: string;\n groups: string[];\n customInstructions?: string;\n whenToUse?: string;\n}\n\nexport class ClineAdapter extends BaseAdapter {\n readonly name = \"cline\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const customModes: ClineCustomMode[] = [];\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const slug = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const modelGuidance = model\n ? `\\n\\nRecommended model: ${model}. Select this model in the Roo Code model dropdown when using this mode.`\n : \"\";\n customModes.push({\n slug,\n name: agent.id,\n roleDefinition: content + modelGuidance,\n groups: [\"read\", \"edit\", \"browser\", \"command\", \"mcp\"],\n whenToUse: overrides.description ?? agent.description,\n });\n }\n }\n if (customModes.length > 0) {\n results.push(output(\".roomodes\", JSON.stringify({\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n customModes,\n }, null, 2)));\n }\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.cline/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.roo/rules/${toPrefixedId(rule.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n const hooks = await this.readHooks(ctx);\n for (const hook of hooks) {\n const globs = hook.condition?.globs || [];\n const body = [\n `# Hook: ${hook.id}`,\n \"\",\n `**Event:** ${hook.event}`,\n `**Agent:** ${hook.agent}`,\n \"\",\n hook.description,\n \"\",\n `HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered${globs.length > 0 ? ` for files matching ${globs.join(\", \")}` : \"\"}, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`,\n ].join(\"\\n\");\n results.push(output(`.roo/rules/${toPrefixedId(`hook-${hook.id}`)}.md`, wrapInManagedBlock(body), body));\n }\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.clinerules/workflows/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const rooMcp: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcp)) {\n if (server.command) {\n rooMcp[name] = {\n command: server.command,\n args: server.args || [],\n ...(server.env && Object.keys(server.env).length > 0 ? { env: server.env } : {}),\n };\n } else if (server.url) {\n rooMcp[name] = { url: server.url, transport: \"streamable-http\" };\n }\n }\n if (Object.keys(rooMcp).length > 0) {\n results.push(output(\".roo/mcp.json\", JSON.stringify({ mcpServers: rooMcp }, null, 2)));\n }\n }\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const bridgeBody = [\n \"# Hatch3r Bridge\",\n \"\",\n \"This project uses hatch3r for agentic coding setup.\",\n \"Canonical agent instructions live at `/.agents/AGENTS.md`.\",\n \"Rules and skills are managed in `.roo/rules/` and `.cline/skills/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n \"## Getting Started with Roo Code\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.roo/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use workflow commands in `.clinerules/workflows/` for guided task execution.\",\n \"**Then:** Switch to custom modes (defined in `.roomodes`) for specialized agent behaviors.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n ].join(\"\\n\");\n results.push(output(\".roo/rules/hatch3r-bridge.md\", wrapInManagedBlock(bridgeBody), bridgeBody));\n\n return results;\n }\n}\n","export function escapeTomlString(s: string): string {\n return s\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\t/g, \"\\\\t\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\");\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { escapeTomlString } from \"./toml-utils.js\";\n\n// Codex adapter — generates configuration for OpenAI Codex CLI.\n// Codex reads project config from the `.codex/` directory and uses\n// `.agents/AGENTS.md` as the primary model instructions file (set via\n// model_instructions_file in .codex/config.toml). Agent-specific\n// instructions are referenced from `.agents/agents/<id>.md`.\nexport class CodexAdapter extends BaseAdapter {\n readonly name = \"codex\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const configLines: string[] = [\n \"# Codex project configuration (managed by hatch3r)\",\n \"#\",\n \"# Do not manually edit — run `npx hatch3r sync` to regenerate.\",\n \"\",\n 'model_instructions_file = \".agents/AGENTS.md\"',\n \"\",\n ];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n const enabledRules = [];\n for (const rule of rules) {\n const { skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n enabledRules.push({ ...rule, description: desc });\n }\n if (enabledRules.length > 0) {\n configLines.push(\"# Additional instruction files (rules)\");\n for (const rule of enabledRules) {\n configLines.push(`# rule: ${rule.id} — ${rule.description}`);\n }\n configLines.push(\"\");\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n configLines.push(`[agents.${agentId}]`);\n configLines.push(`model_instructions_file = \"${escapeTomlString(`.agents/agents/${agent.id}.md`)}\"`);\n if (model) configLines.push(`model = \"${escapeTomlString(model)}\"`);\n configLines.push(\"\");\n }\n }\n\n const mcpFiltered = await this.readFilteredMcp(ctx);\n if (mcpFiltered) {\n for (const [name, server] of Object.entries(mcpFiltered)) {\n configLines.push(`[mcp_servers.${name}]`);\n if (server.command) {\n configLines.push(`command = \"${escapeTomlString(server.command)}\"`);\n if (server.args && server.args.length > 0) {\n const argsStr = server.args.map((a) => `\"${escapeTomlString(a)}\"`).join(\", \");\n configLines.push(`args = [${argsStr}]`);\n }\n } else if (server.url) {\n configLines.push(`url = \"${escapeTomlString(server.url)}\"`);\n }\n if (server.env) {\n for (const [k, v] of Object.entries(server.env)) {\n configLines.push(`env.${k} = \"${escapeTomlString(v)}\"`);\n }\n }\n configLines.push(\"\");\n }\n }\n\n results.push(output(\".codex/config.toml\", configLines.join(\"\\n\")));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.codex/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n return results;\n }\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport type PackageManagerName = \"bun\" | \"pnpm\" | \"yarn\" | \"npm\";\n\nexport interface PackageManagerInfo {\n name: PackageManagerName;\n installCmd: string;\n installArgs: string[];\n updateCmd: string;\n updateArgs: string[];\n}\n\nconst LOCK_FILE_MAP: Array<{ file: string; name: PackageManagerName }> = [\n { file: \"bun.lockb\", name: \"bun\" },\n { file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n { file: \"yarn.lock\", name: \"yarn\" },\n];\n\nconst PM_INFO: Record<PackageManagerName, Omit<PackageManagerInfo, \"name\">> = {\n bun: { installCmd: \"bun\", installArgs: [\"install\"], updateCmd: \"bun\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n pnpm: { installCmd: \"pnpm\", installArgs: [\"install\"], updateCmd: \"pnpm\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n yarn: { installCmd: \"yarn\", installArgs: [\"install\"], updateCmd: \"yarn\", updateArgs: [\"add\", \"hatch3r@latest\"] },\n npm: { installCmd: \"npm\", installArgs: [\"install\"], updateCmd: \"npm\", updateArgs: [\"install\", \"hatch3r@latest\"] },\n};\n\nexport async function detectPackageManager(rootDir: string): Promise<PackageManagerInfo> {\n for (const { file, name } of LOCK_FILE_MAP) {\n try {\n await access(join(rootDir, file));\n return { name, ...PM_INFO[name] };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n return { name: \"npm\", ...PM_INFO.npm };\n}\n","import type {\n AdapterOutput,\n CanonicalFile,\n} from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { detectPackageManager } from \"../detect/packageManager.js\";\n\nexport class CopilotAdapter extends BaseAdapter {\n readonly name = \"copilot\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const alwaysRules: { rule: CanonicalFile; content: string }[] = [];\n const scopedRules: { rule: CanonicalFile; content: string; scope: string }[] = [];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n if (scope && scope !== \"always\") {\n scopedRules.push({ rule: { ...rule, description: overrides.description ?? rule.description }, content, scope });\n } else {\n alwaysRules.push({ rule: { ...rule, description: overrides.description ?? rule.description }, content });\n }\n }\n }\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const innerContent = [\n \"\",\n \"# Hatch3r Project Instructions\",\n \"\",\n \"Full canonical agent instructions are at `/.agents/AGENTS.md`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n \"## Hatch3r Rules\",\n \"\",\n ...alwaysRules.map(\n (r) => `### ${r.rule.id}\\n\\n${r.rule.description}\\n\\n${r.content}`,\n ),\n \"\",\n \"## Getting Started with Copilot\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Instructions in `.github/instructions/` scope rules to specific file patterns. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use prompts in `.github/prompts/` and commands in `.github/copilot/commands/` for guided workflows.\",\n \"**Then:** Delegate to agents in `.github/agents/` for specialized tasks.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ].join(\"\\n\");\n results.push(output(\".github/copilot-instructions.md\", wrapInManagedBlock(innerContent), innerContent));\n\n const pm = await detectPackageManager(ctx.projectRoot);\n const install = [pm.installCmd, ...pm.installArgs].join(\" \");\n const build = `${pm.installCmd} run build`;\n const copilotSetupSteps = `name: \"Copilot Setup Steps\"\non: [push]\njobs:\n setup:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - name: Install dependencies\n run: ${install}\n - name: Build\n run: ${build}\n`;\n results.push(output(\".github/workflows/copilot-setup-steps.yml\", copilotSetupSteps));\n\n for (const { rule, content, scope } of scopedRules) {\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n const applyTo = globs.join(\", \");\n const fm = `---\\napplyTo: \"${applyTo}\"\\n---`;\n const body = `# ${rule.id}\\n\\n${rule.description}\\n\\n${content}`;\n results.push(\n output(\n `.github/instructions/${toPrefixedId(rule.id)}.instructions.md`,\n `${fm}\\n\\n${wrapInManagedBlock(body)}`,\n body,\n ),\n );\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`name: ${agent.id}`, `description: ${desc}`];\n if (model) lines.push(`model: ${model}`);\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(output(`.github/agents/${toPrefixedId(agent.id)}.agent.md`, `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n }\n\n if (ctx.features.prompts) {\n const prompts = await readCanonicalFiles(ctx.agentsDir, \"prompts\");\n for (const prompt of prompts) {\n const body = prompt.rawContent;\n results.push(output(`.github/prompts/${toPrefixedId(prompt.id)}.prompt.md`, wrapInManagedBlock(body), body));\n }\n }\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.github/copilot/commands/${toPrefixedId(id)}.prompt.md`),\n );\n\n if (ctx.features.githubAgents) {\n const ghAgents = await readCanonicalFiles(ctx.agentsDir, \"github-agents\");\n for (const agent of ghAgents) {\n const body = agent.rawContent;\n results.push(output(`.github/copilot/agents/${toPrefixedId(agent.id)}.md`, wrapInManagedBlock(body), body));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.github/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const vscodeServers: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcp)) {\n const entry: Record<string, unknown> = {};\n if (server.command) entry.command = server.command;\n if (server.args) entry.args = server.args;\n if (server.url) entry.url = server.url;\n if (server.env) entry.env = server.env;\n if (server.command && server.env && Object.keys(server.env).length > 0) {\n entry.env = server.env;\n }\n vscodeServers[name] = entry;\n }\n results.push(output(\".vscode/mcp.json\", JSON.stringify({ servers: vscodeServers }, null, 2) + \"\\n\"));\n }\n\n return results;\n }\n}\n","import type {\n AdapterOutput,\n CanonicalFile,\n} from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { resolveAgentModel } from \"../models/resolve.js\";\nimport { applyCustomization } from \"./customization.js\";\n\n/**\n * The Cursor adapter generates .mdc files from .md canonical files by adding\n * Cursor-specific frontmatter (description, globs/alwaysApply) and wrapping\n * content in managed blocks. Rules get `alwaysApply: true` or `globs: [...]`\n * based on their scope. Agents get `name`, `description`, `model`, `readonly`,\n * and `is_background` frontmatter fields.\n */\nfunction cursorRuleFrontmatter(rule: CanonicalFile, scopeOverride?: string): string {\n const scope = scopeOverride ?? rule.scope;\n const lines: string[] = [`description: ${rule.description}`];\n if (scope === \"always\") {\n lines.push(\"alwaysApply: true\");\n } else if (scope) {\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n lines.push(`globs: [${globs.map((g) => `\"${g}\"`).join(\", \")}]`);\n } else {\n lines.push(\"alwaysApply: false\");\n }\n return `---\\n${lines.join(\"\\n\")}\\n---`;\n}\n\nfunction mdcOutput(path: string, frontmatter: string, body: string): AdapterOutput {\n return output(path, `${frontmatter}\\n\\n${wrapInManagedBlock(body)}`, body);\n}\n\nexport class CursorAdapter extends BaseAdapter {\n readonly name = \"cursor\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? rule.description;\n const ruleWithDesc = { ...rule, description: desc };\n const baseName = `${toPrefixedId(rule.id)}.mdc`;\n results.push(mdcOutput(`.cursor/rules/${baseName}`, cursorRuleFrontmatter(ruleWithDesc, overrides.scope), content));\n }\n }\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`name: ${agent.id}`, `description: ${desc}`];\n if (model) lines.push(`model: ${model}`);\n if (agent.readonly) lines.push(\"readonly: true\");\n if (agent.background) lines.push(\"is_background: true\");\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(mdcOutput(`.cursor/agents/${toPrefixedId(agent.id)}.md`, fm, content));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.cursor/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.cursor/commands/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp) {\n results.push(output(\".cursor/mcp.json\", JSON.stringify({ mcpServers: mcp }, null, 2)));\n }\n\n const hookResults = await this.readHooks(ctx);\n for (const hook of hookResults) {\n const globs = hook.condition?.globs || [];\n const globLine =\n globs.length > 0\n ? `globs: [${globs.map((g: string) => `\"${g}\"`).join(\", \")}]`\n : \"alwaysApply: false\";\n const fm = `---\\ndescription: \"Hook: ${hook.description}\"\\n${globLine}\\n---`;\n const body = `# Hook: ${hook.id}\\n\\n**Event:** ${hook.event}\\n**Agent:** ${hook.agent}\\n\\n${hook.description}\\n\\nHATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered${globs.length > 0 ? ` for files matching ${globs.join(\", \")}` : \"\"}, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`;\n results.push(mdcOutput(`.cursor/rules/${toPrefixedId(`hook-${hook.id}`)}.mdc`, fm, body));\n }\n\n const bridgeFm = `---\ndescription: Bridge to canonical agent instructions and mandatory orchestration directives\nalwaysApply: true\n---`;\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const bridgeBody = `# Hatch3r Bridge\n\nThis project uses hatch3r for agentic coding setup.\nCanonical agent instructions live at \\`/.agents/AGENTS.md\\`.\n\n${bridgeOrchestration}\n\n## Cursor Subagent Configuration (v2.5+)\n\nCursor supports up to 4 subagents running in parallel. Custom subagents in \\`.cursor/agents/\\` support these frontmatter fields:\n- \\`model\\`: \\`fast\\`, \\`inherit\\`, or a specific model ID\n- \\`readonly\\`: \\`true\\` to restrict write permissions (verification/audit agents)\n- \\`background\\`: \\`true\\` to run without blocking the parent agent\n\nWhen delegating to hatch3r agents, explicitly request \"up to 4 in parallel\" for maximum throughput.\nBackground subagents write output to \\`~/.cursor/subagents/\\` for later inspection.\n\n## Cursor v2.6 Capabilities\n\nCursor v2.6 added MCP Apps (interactive UIs in agent chats) and Team Marketplaces for plugins.\nIf this project includes MCP servers that expose UI components, they will render inline as MCP Apps.\nPlugin configurations in \\`.cursor/mcp.json\\` are compatible with Team Marketplace distribution.\n\n## Getting Started with Cursor\n\nNew to this project's agent setup? Progress through these stages:\n\n**Start here:** Rules in \\`.cursor/rules/\\` are loaded automatically. The orchestration bridge above guides your workflow.\n**Next:** Use \\`/hatch3r-feature\\` or \\`/hatch3r-bug-fix\\` commands in Cursor chat for guided workflows.\n**Then:** Delegate to agents in \\`.cursor/agents/\\` — Cursor supports up to 4 subagents in parallel.\n**Later:** Customize agent behavior via \\`.hatch3r/{type}/{id}.customize.yaml\\` without editing managed files.`;\n results.push(mdcOutput(\".cursor/rules/hatch3r-bridge.mdc\", bridgeFm, bridgeBody));\n\n if (ctx.manifest.tools.includes(\"cursor\")) {\n const envConfig = {\n instructions: [\"Read /.agents/AGENTS.md for project instructions\"],\n mcpServers: {},\n };\n results.push(output(\".cursor/environment.json\", JSON.stringify(envConfig, null, 2) + \"\\n\"));\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\nimport { escapeTomlString } from \"./toml-utils.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nfunction mapToGeminiEvent(event: HookEvent): string {\n const mapping: Record<HookEvent, string> = {\n \"pre-commit\": \"BeforeTool\",\n \"post-merge\": \"AfterTool\",\n \"ci-failure\": \"AfterAgent\",\n \"file-save\": \"AfterTool\",\n \"session-start\": \"SessionStart\",\n \"pre-push\": \"BeforeTool\",\n \"worktree-create\": \"AfterTool\",\n \"worktree-remove\": \"BeforeTool\",\n };\n return mapping[event] || event;\n}\n\nexport class GeminiAdapter extends BaseAdapter {\n readonly name = \"gemini\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const inner = [\n ...await this.bridgeHeader(ctx, \".agents/AGENTS.md\"),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx, (m) => ({\n text: `**Recommended model:** \\`${m}\\`. Set via \\`gemini --model ${m}\\` or select in Google AI Studio.`,\n after: true,\n })),\n ].join(\"\\n\");\n results.push(output(\"GEMINI.md\", wrapInManagedBlock(inner), inner));\n\n const settings: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n context: { fileName: [\"GEMINI.md\", \"AGENTS.md\"] },\n };\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n settings.mcpServers = entries;\n }\n }\n\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n const hooksObj: Record<string, Array<{ matcher: string; hooks: Array<{ type: string; command: string }> }>> = {};\n for (const hook of hooks) {\n const geminiEvent = mapToGeminiEvent(hook.event);\n if (!hooksObj[geminiEvent]) hooksObj[geminiEvent] = [];\n const matcher = hook.condition?.globs?.join(\"|\") || \".*\";\n hooksObj[geminiEvent].push({\n matcher,\n hooks: [{ type: \"command\", command: `echo \"HATCH3R_HOOK_ACTIVATED: Spawn the ${hook.agent} agent now. Follow the ${hook.agent} agent protocol in .gemini/agents/${toPrefixedId(hook.agent)}.md. Event: ${hook.event}. Hook ID: ${hook.id}.\"` }],\n });\n }\n settings.hooks = hooksObj;\n }\n\n results.push(output(\".gemini/settings.json\", JSON.stringify(settings, null, 2)));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.gemini/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n if (ctx.features.commands) {\n const commands = await readCanonicalFiles(ctx.agentsDir, \"commands\");\n for (const cmd of commands) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, cmd);\n this.warnings.push(...warnings);\n if (skip) continue;\n const desc = overrides.description ?? cmd.description;\n const toml = [\n `description = \"${escapeTomlString(desc)}\"`,\n `prompt = \"${escapeTomlString(content)}\"`,\n ].join(\"\\n\");\n results.push(output(`.gemini/commands/${toPrefixedId(cmd.id)}.toml`, toml));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput, CanonicalFile } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext, type CleanMcpEntry } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization, applyCustomizationRaw } from \"./customization.js\";\nimport { stringify as yamlStringify } from \"yaml\";\n\n// Goose profile structure — represents a `.goose/profiles/{name}.yaml` file.\n// Goose reads profiles to configure agent behavior, extensions, and recipes.\ninterface GooseProfile {\n name: string;\n description: string;\n instructions: string;\n extensions?: GooseExtension[];\n recipes?: GooseRecipeRef[];\n /** ACP (Agent Communication Protocol) compatibility metadata. */\n acp?: GooseAcpConfig;\n}\n\ninterface GooseExtension {\n name: string;\n type: \"builtin\" | \"mcp\";\n config?: Record<string, unknown>;\n}\n\ninterface GooseRecipeRef {\n name: string;\n description: string;\n /** Steps map to hatch3r agent phases. */\n steps: GooseRecipeStep[];\n}\n\ninterface GooseRecipeStep {\n instruction: string;\n /** Optional agent reference — maps to a hatch3r canonical agent. */\n agent?: string;\n}\n\ninterface GooseAcpConfig {\n enabled: boolean;\n /** ACP protocol version supported by this configuration. */\n version: string;\n /** Agent capabilities advertised via ACP discovery. */\n capabilities: string[];\n}\n\nexport class GooseAdapter extends BaseAdapter {\n readonly name = \"goose\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const lines = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ];\n\n if (ctx.features.skills) {\n const skills = await readCanonicalFiles(ctx.agentsDir, \"skills\");\n for (const skill of skills) {\n const { content, skip, warnings } = await applyCustomizationRaw(ctx.projectRoot, skill);\n this.warnings.push(...warnings);\n if (skip) continue;\n lines.push(`## Skill: ${toPrefixedId(skill.id)}`, \"\", content, \"\");\n }\n }\n\n const inner = lines.join(\"\\n\");\n const results: AdapterOutput[] = [output(\".goosehints\", wrapInManagedBlock(inner), inner)];\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n const gooseMcp: Record<string, unknown> = {};\n for (const [name, entry] of Object.entries(entries)) {\n gooseMcp[name] = entry;\n }\n results.push(output(\".goose/mcp.json\", JSON.stringify(gooseMcp, null, 2)));\n }\n }\n\n // Generate Goose profile with recipe interoperability and ACP compatibility.\n const agents = ctx.features.agents\n ? await readCanonicalFiles(ctx.agentsDir, \"agents\")\n : [];\n const profile = await this.buildProfile(ctx, agents, mcp);\n const profileYaml = yamlStringify(profile);\n results.push(output(\".goose/profiles/hatch3r.yaml\", profileYaml));\n\n return results;\n }\n\n /** Build a Goose profile that maps hatch3r content to Goose's recipe system. */\n private async buildProfile(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n mcp: Record<string, CleanMcpEntry> | null,\n ): Promise<GooseProfile> {\n const extensions = this.buildExtensions(mcp);\n const recipe = await this.buildRecipe(ctx, agents);\n const capabilities = this.deriveAcpCapabilities(ctx, agents);\n\n return {\n name: \"hatch3r\",\n description: `hatch3r-managed Goose profile for ${ctx.manifest.project || ctx.manifest.repo}. Provides agent pipeline, recipe interoperability, and ACP compatibility.`,\n instructions: `Follow the canonical agent instructions at .agents/AGENTS.md. Use the hatch3r 4-phase pipeline: Research, Implement, Review, Quality.`,\n ...(extensions.length > 0 ? { extensions } : {}),\n recipes: [recipe],\n acp: {\n enabled: true,\n version: \"0.2\",\n capabilities,\n },\n };\n }\n\n /** Map MCP servers to Goose extensions. */\n private buildExtensions(\n mcp: Record<string, CleanMcpEntry> | null,\n ): GooseExtension[] {\n if (!mcp) return [];\n const extensions: GooseExtension[] = [];\n for (const [name, entry] of Object.entries(mcp)) {\n if (entry.command) {\n extensions.push({\n name,\n type: \"mcp\",\n config: {\n command: entry.command,\n args: entry.args || [],\n ...(entry.env && Object.keys(entry.env).length > 0 ? { env: entry.env } : {}),\n },\n });\n } else if (entry.url) {\n extensions.push({\n name,\n type: \"mcp\",\n config: { url: entry.url },\n });\n }\n }\n return extensions;\n }\n\n /** Build a Goose recipe from hatch3r's agent pipeline. */\n private async buildRecipe(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n ): Promise<GooseRecipeRef> {\n const steps: GooseRecipeStep[] = [];\n\n // Map hatch3r's 4-phase pipeline to Goose recipe steps.\n // Each step references a canonical agent when available.\n const phaseMap: Array<{ phase: string; agentPattern: string; fallback: string }> = [\n { phase: \"Research\", agentPattern: \"researcher\", fallback: \"Gather context from the codebase. Identify affected files, patterns, and conventions. Do not modify any files.\" },\n { phase: \"Implement\", agentPattern: \"implementer\", fallback: \"Implement the requested changes following project conventions. Require plan approval before making changes.\" },\n { phase: \"Review\", agentPattern: \"reviewer\", fallback: \"Review all changes for correctness, style, security, and adherence to project rules. Report findings as Critical/Warning/Info.\" },\n { phase: \"Quality\", agentPattern: \"test-writer\", fallback: \"Write or update tests for the implemented changes. Run the test suite and verify all tests pass.\" },\n ];\n\n for (const { phase, agentPattern, fallback } of phaseMap) {\n const matchingAgent = agents.find((a) =>\n a.id.includes(agentPattern),\n );\n if (matchingAgent) {\n const { skip, warnings } = await applyCustomization(ctx.projectRoot, matchingAgent);\n this.warnings.push(...warnings);\n if (!skip) {\n // Use the agent description as the step instruction,\n // or fall back to the default, truncated for recipe brevity.\n const instruction = matchingAgent.description || fallback;\n steps.push({\n instruction: `[${phase}] ${instruction}`,\n agent: toPrefixedId(matchingAgent.id),\n });\n continue;\n }\n }\n steps.push({ instruction: `[${phase}] ${fallback}` });\n }\n\n return {\n name: \"hatch3r-pipeline\",\n description: \"hatch3r 4-phase development pipeline: Research, Implement, Review, Quality.\",\n steps,\n };\n }\n\n /** Derive ACP capability advertisements from project configuration. */\n private deriveAcpCapabilities(\n ctx: AdapterContext,\n agents: CanonicalFile[],\n ): string[] {\n const capabilities: string[] = [\n \"code-generation\",\n \"code-review\",\n ];\n\n if (agents.some((a) => a.id.includes(\"test\"))) {\n capabilities.push(\"test-generation\");\n }\n if (agents.some((a) => a.id.includes(\"security\"))) {\n capabilities.push(\"security-audit\");\n }\n if (agents.some((a) => a.id.includes(\"docs\"))) {\n capabilities.push(\"documentation\");\n }\n if (ctx.features.mcp) {\n capabilities.push(\"tool-use\");\n }\n\n return capabilities;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport type { HookEvent } from \"../hooks/types.js\";\n\nfunction steeringFrontmatter(globs?: string): string {\n if (!globs) return \"\";\n return `---\\ninclusion: fileMatch\\nfileMatchPattern: \"${globs}\"\\n---\\n\\n`;\n}\n\nexport class KiroAdapter extends BaseAdapter {\n readonly name = \"kiro\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n const lines = [...await this.bridgeHeader(ctx)];\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n const desc = overrides.description ?? rule.description;\n\n if (scope && scope !== \"always\") {\n const globs = scope.includes(\"*\") ? scope : `${scope}/**`;\n const fm = steeringFrontmatter(globs);\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.kiro/steering/hatch3r-rule-${rule.id}.md`, `${fm}${wrapInManagedBlock(body)}`, body));\n } else {\n lines.push(`## ${rule.id}`, \"\", desc, \"\", content, \"\");\n }\n }\n }\n\n lines.push(...await this.inlineAgents(ctx));\n const inner = lines.join(\"\\n\");\n results.push(output(\".kiro/steering/hatch3r-agents.md\", wrapInManagedBlock(inner), inner));\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.kiro/steering/hatch3r-skill-${id}.md`),\n );\n\n const hooks = await this.readHooks(ctx);\n if (hooks.length > 0) {\n const hookLines: string[] = [\"# Hatch3r Hooks\", \"\"];\n for (const hook of hooks) {\n hookLines.push(`## ${hook.id}`, \"\");\n hookLines.push(`**Event:** ${hook.event}`);\n hookLines.push(`**Agent:** ${hook.agent}`);\n hookLines.push(`**Description:** ${hook.description}`);\n if (hook.condition?.globs) {\n hookLines.push(`**Globs:** ${hook.condition.globs.join(\", \")}`);\n }\n hookLines.push(\"\");\n hookLines.push(`HATCH3R_HOOK_ACTIVATED: When this hook's event (${hook.event}) is triggered, you MUST spawn the ${hook.agent} agent now. Read and follow the ${hook.agent} agent protocol in \\`.agents/agents/${toPrefixedId(hook.agent)}.md\\`.`);\n hookLines.push(\"\");\n }\n const hookContent = hookLines.join(\"\\n\");\n results.push(output(\".kiro/steering/hatch3r-hooks.md\", wrapInManagedBlock(hookContent), hookContent));\n }\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".kiro/settings/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2)));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { resolveAgentModel, withProviderPrefix } from \"../models/resolve.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\n\nexport class OpenCodeAdapter extends BaseAdapter {\n readonly name = \"opencode\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const instructions: string[] = [\".agents/AGENTS.md\"];\n if (ctx.features.rules) instructions.push(\".agents/rules/*.md\");\n if (ctx.features.agents) instructions.push(\".agents/agents/*.md\");\n if (ctx.features.skills) instructions.push(\".agents/skills/*/SKILL.md\");\n if (ctx.features.commands) instructions.push(\".agents/commands/*.md\");\n\n const opencodeConfig: Record<string, unknown> = {\n _hatch3r: {\n version: HATCH3R_VERSION,\n managed: true,\n },\n $schema: \"https://opencode.ai/config.json\",\n instructions,\n };\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const mcpObj: Record<string, unknown> = {};\n for (const [name, server] of Object.entries(mcp)) {\n if (server.command) {\n const cmd = [server.command, ...(server.args || [])];\n mcpObj[name] = {\n type: \"local\",\n command: cmd,\n enabled: true,\n ...(server.env && Object.keys(server.env).length > 0 ? { environment: server.env } : {}),\n };\n } else if (server.url) {\n mcpObj[name] = { type: \"remote\", url: server.url, enabled: true };\n }\n }\n if (Object.keys(mcpObj).length > 0) {\n opencodeConfig.mcp = mcpObj;\n }\n }\n\n results.push(output(\"opencode.json\", JSON.stringify(opencodeConfig, null, 2)));\n\n if (ctx.features.agents) {\n const agents = await readCanonicalFiles(ctx.agentsDir, \"agents\");\n for (const agent of agents) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, agent);\n this.warnings.push(...warnings);\n if (skip) continue;\n const agentId = toPrefixedId(agent.id);\n const model = resolveAgentModel(agent.id, agent, ctx.manifest, overrides);\n const desc = overrides.description ?? agent.description;\n const lines = [`description: ${desc}`];\n if (model) lines.push(`model: ${withProviderPrefix(model)}`);\n const fm = `---\\n${lines.join(\"\\n\")}\\n---`;\n results.push(output(`.opencode/agents/${agentId}.md`, `${fm}\\n\\n${wrapInManagedBlock(content)}`, content));\n }\n }\n\n results.push(\n ...await this.processSkillsRaw(ctx, (id) => `.opencode/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.opencode/commands/${toPrefixedId(id)}.md`),\n );\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { toPrefixedId } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { generateBridgeOrchestration } from \"../cli/shared/agentsContent.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\nimport { readCanonicalFiles } from \"./canonical.js\";\nimport { applyCustomization } from \"./customization.js\";\n\nfunction isGlobPattern(scope: string): boolean {\n return scope.includes(\"*\") || scope.includes(\"?\") || scope.includes(\"[\");\n}\n\nfunction ruleTrigger(scope: string | undefined): \"always_on\" | \"glob\" | \"model_decision\" {\n if (!scope) return \"model_decision\";\n if (scope === \"always\") return \"always_on\";\n return \"glob\";\n}\n\nexport class WindsurfAdapter extends BaseAdapter {\n readonly name = \"windsurf\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const results: AdapterOutput[] = [];\n\n const bridgeOrchestration = await generateBridgeOrchestration(ctx.agentsDir);\n const windsurfInner = [\n \"\",\n \"# Hatch3r Agent Instructions\",\n \"\",\n \"Full canonical agent instructions are at `/.agents/AGENTS.md`.\",\n \"Rules and skills are managed in `.windsurf/rules/` and `.windsurf/skills/`.\",\n \"\",\n bridgeOrchestration,\n \"\",\n ...await this.inlineAgents(ctx),\n \"\",\n \"## Getting Started with Windsurf\",\n \"\",\n \"New to this project's agent setup? Progress through these stages:\",\n \"\",\n \"**Start here:** Rules in `.windsurf/rules/` are loaded automatically. The orchestration bridge above guides your workflow.\",\n \"**Next:** Use commands in `.windsurf/workflows/` for guided workflows (e.g., feature development, bug fixes).\",\n \"**Then:** Use parallel Cascade sessions for independent tasks to maximize throughput.\",\n \"**Later:** Customize agent behavior via `.hatch3r/{type}/{id}.customize.yaml` without editing managed files.\",\n \"\",\n ].join(\"\\n\");\n results.push(output(\".windsurfrules\", wrapInManagedBlock(windsurfInner), windsurfInner));\n\n if (ctx.features.rules) {\n const rules = await readCanonicalFiles(ctx.agentsDir, \"rules\");\n for (const rule of rules) {\n const { content, skip, overrides, warnings } = await applyCustomization(ctx.projectRoot, rule);\n this.warnings.push(...warnings);\n if (skip) continue;\n const scope = overrides.scope ?? rule.scope;\n const trigger = ruleTrigger(scope);\n const globScope = (trigger === \"glob\" && scope)\n ? (isGlobPattern(scope) ? scope : `${scope}/**`)\n : undefined;\n const fm = `---\\ntrigger: ${trigger}${globScope ? `\\nglobs: \"${globScope}\"` : \"\"}\\n---`;\n const desc = overrides.description ?? rule.description;\n const body = `# ${rule.id}\\n\\n${desc}\\n\\n${content}`;\n results.push(output(`.windsurf/rules/${toPrefixedId(rule.id)}.md`, `${fm}\\n\\n${wrapInManagedBlock(body)}`, body));\n }\n }\n\n results.push(\n ...await this.processSkillsWithFm(ctx, (id) => `.windsurf/skills/${toPrefixedId(id)}/SKILL.md`),\n );\n\n results.push(\n ...await this.processCommandsRaw(ctx, (id) => `.windsurf/workflows/${toPrefixedId(id)}.md`),\n );\n\n const mcp = await this.readFilteredMcp(ctx);\n if (mcp && Object.keys(mcp).length > 0) {\n const entries = this.buildStdMcpEntries(mcp);\n if (Object.keys(entries).length > 0) {\n results.push(output(\".windsurf/mcp.json\", JSON.stringify({ mcpServers: entries }, null, 2) + \"\\n\"));\n }\n }\n\n return results;\n }\n}\n","import type { AdapterOutput } from \"../types.js\";\nimport { wrapInManagedBlock } from \"../merge/managedBlocks.js\";\nimport { BaseAdapter, output, type AdapterContext } from \"./base.js\";\n\nexport class ZedAdapter extends BaseAdapter {\n readonly name = \"zed\";\n\n protected async doGenerate(ctx: AdapterContext): Promise<AdapterOutput[]> {\n const inner = [\n ...await this.bridgeHeader(ctx),\n ...await this.inlineRules(ctx),\n ...await this.inlineAgents(ctx),\n ].join(\"\\n\");\n return [output(\".rules\", wrapInManagedBlock(inner), inner)];\n }\n}\n","import type { HatchManifest, Tool } from \"../types.js\";\nimport type { Adapter } from \"./base.js\";\nimport { AiderAdapter } from \"./aider.js\";\nimport { AmazonQAdapter } from \"./amazonq.js\";\nimport { AmpAdapter } from \"./amp.js\";\nimport { AntigravityAdapter } from \"./antigravity.js\";\nimport { ClaudeAdapter } from \"./claude.js\";\nimport { ClineAdapter } from \"./cline.js\";\nimport { CodexAdapter } from \"./codex.js\";\nimport { CopilotAdapter } from \"./copilot.js\";\nimport { CursorAdapter } from \"./cursor.js\";\nimport { GeminiAdapter } from \"./gemini.js\";\nimport { GooseAdapter } from \"./goose.js\";\nimport { KiroAdapter } from \"./kiro.js\";\nimport { OpenCodeAdapter } from \"./opencode.js\";\nimport { WindsurfAdapter } from \"./windsurf.js\";\nimport { ZedAdapter } from \"./zed.js\";\n\nconst adapters: Record<Tool, Adapter> = {\n cursor: new CursorAdapter(),\n copilot: new CopilotAdapter(),\n claude: new ClaudeAdapter(),\n opencode: new OpenCodeAdapter(),\n windsurf: new WindsurfAdapter(),\n amp: new AmpAdapter(),\n codex: new CodexAdapter(),\n gemini: new GeminiAdapter(),\n cline: new ClineAdapter(),\n aider: new AiderAdapter(),\n kiro: new KiroAdapter(),\n goose: new GooseAdapter(),\n zed: new ZedAdapter(),\n \"amazon-q\": new AmazonQAdapter(),\n antigravity: new AntigravityAdapter(),\n};\n\nexport function getAdapter(tool: Tool): Adapter {\n const adapter = adapters[tool];\n if (!adapter) {\n throw new Error(`Unknown tool: ${tool}`);\n }\n return adapter;\n}\n\ninterface AdapterCapability {\n agents: boolean;\n skills: boolean;\n rules: boolean;\n hooks: boolean;\n mcp: boolean;\n commands: boolean;\n prompts: boolean;\n githubAgents: boolean;\n}\n\n// Adapter capability matrix — last updated for hatch3r v1.2.0.\n// Review this matrix when adding new adapters, removing adapters, or when\n// an existing tool gains/loses support for a feature (e.g. a tool ships\n// native hook support). Each row must match the adapter's doGenerate() output.\nconst ADAPTER_CAPABILITIES: Record<Tool, AdapterCapability> = {\n cursor: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n claude: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n gemini: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n cline: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: true, prompts: false, githubAgents: false },\n codex: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n \"amazon-q\": { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n copilot: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: true, githubAgents: true },\n opencode: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: false, githubAgents: false },\n windsurf: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: true, prompts: false, githubAgents: false },\n amp: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n kiro: { agents: true, skills: true, rules: true, hooks: true, mcp: true, commands: false, prompts: false, githubAgents: false },\n aider: { agents: true, skills: true, rules: true, hooks: false, mcp: false, commands: false, prompts: false, githubAgents: false },\n goose: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n zed: { agents: true, skills: false, rules: true, hooks: false, mcp: false, commands: false, prompts: false, githubAgents: false },\n antigravity: { agents: true, skills: true, rules: true, hooks: false, mcp: true, commands: false, prompts: false, githubAgents: false },\n};\n\nexport function getUnsupportedFeatureWarnings(tool: string, manifest: HatchManifest): string[] {\n const caps = ADAPTER_CAPABILITIES[tool as Tool];\n if (!caps) return [];\n\n const warnings: string[] = [];\n const featureLabels: Array<{ key: keyof AdapterCapability; label: string }> = [\n { key: \"agents\", label: \"agents\" },\n { key: \"skills\", label: \"skills\" },\n { key: \"rules\", label: \"rules\" },\n { key: \"hooks\", label: \"hooks\" },\n { key: \"mcp\", label: \"MCP\" },\n { key: \"commands\", label: \"commands\" },\n { key: \"prompts\", label: \"prompts\" },\n { key: \"githubAgents\", label: \"GitHub agents\" },\n ];\n\n for (const { key, label } of featureLabels) {\n if (manifest.features[key] && !caps[key]) {\n warnings.push(`${tool}: ${label} are enabled but not supported by this adapter`);\n }\n }\n return warnings;\n}\n\nexport { AiderAdapter } from \"./aider.js\";\nexport { AmazonQAdapter } from \"./amazonq.js\";\nexport { AmpAdapter } from \"./amp.js\";\nexport { AntigravityAdapter } from \"./antigravity.js\";\nexport { ClaudeAdapter } from \"./claude.js\";\nexport { ClineAdapter } from \"./cline.js\";\nexport { CodexAdapter } from \"./codex.js\";\nexport { CopilotAdapter } from \"./copilot.js\";\nexport { CursorAdapter } from \"./cursor.js\";\nexport { GeminiAdapter } from \"./gemini.js\";\nexport { GooseAdapter } from \"./goose.js\";\nexport { KiroAdapter } from \"./kiro.js\";\nexport { OpenCodeAdapter } from \"./opencode.js\";\nexport { WindsurfAdapter } from \"./windsurf.js\";\nexport { ZedAdapter } from \"./zed.js\";\nexport type { Adapter } from \"./base.js\";\nexport { readCanonicalFiles } from \"./canonical.js\";\nexport type { CanonicalType } from \"./canonical.js\";\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nexport function findPackageRoot(startDir: string): string {\n let dir = startDir;\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return startDir;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join, posix } from \"node:path\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\n\n/**\n * Integrity manifest for hatch3r canonical files.\n *\n * **Guarantees:**\n * - Detects unauthorized modifications to hatch3r-managed files (agents, rules, skills, commands, hooks, prompts).\n * - Detects missing or newly added files relative to the last `hatch3r init` or `hatch3r update`.\n * - Manifest-level checksum detects tampering with the integrity file itself.\n *\n * **Limitations:**\n * - Content-addressed only: detects WHAT changed, not WHO or WHEN.\n * - No signing: an attacker with write access can regenerate a valid manifest.\n * - Symlinks are excluded from scanning to prevent symlink-based bypass.\n * - Only scans `.md`, `.mdc`, and `.json` files in designated directories.\n */\nexport interface IntegrityManifest {\n version: number;\n generated: string;\n hatchVersion: string;\n files: Record<string, string>;\n checksum: string;\n}\n\nexport interface VerifyResult {\n file: string;\n status: \"pass\" | \"modified\" | \"missing\" | \"new\" | \"tampered\";\n expected?: string;\n actual?: string;\n}\n\nconst INTEGRITY_FILE = \".integrity.json\";\nconst SCANNED_DIRS = [\"agents\", \"commands\", \"rules\", \"skills\", \"hooks\", \"prompts\", \"github-agents\", \"mcp\"];\n\nfunction sha256(content: string): string {\n return `sha256:${createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\")}`;\n}\n\nasync function collectFiles(dir: string, base: string): Promise<string[]> {\n const files: string[] = [];\n let entries: { name: string; isDirectory: () => boolean; isFile: () => boolean; isSymbolicLink: () => boolean }[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return files;\n throw err;\n }\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = join(dir, entry.name);\n const relPath = posix.join(base, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await collectFiles(fullPath, relPath)));\n } else if (entry.isFile() && (entry.name.endsWith(\".md\") || entry.name.endsWith(\".mdc\") || entry.name.endsWith(\".json\"))) {\n files.push(relPath);\n }\n }\n return files;\n}\n\nexport async function generateIntegrityManifest(\n agentsDir: string,\n hatchVersion: string,\n): Promise<IntegrityManifest> {\n const files: Record<string, string> = {};\n\n for (const dir of SCANNED_DIRS) {\n const dirPath = join(agentsDir, dir);\n const mdFiles = await collectFiles(dirPath, dir);\n for (const relPath of mdFiles) {\n const content = await readFile(join(agentsDir, relPath), \"utf-8\");\n files[relPath] = sha256(content);\n }\n }\n\n const checksum = createHash(\"sha256\")\n .update(JSON.stringify(files))\n .digest(\"hex\");\n\n return {\n version: 1,\n generated: new Date().toISOString(),\n hatchVersion,\n files,\n checksum,\n };\n}\n\nexport async function writeIntegrityManifest(\n agentsDir: string,\n manifest: IntegrityManifest,\n): Promise<void> {\n const filePath = join(agentsDir, INTEGRITY_FILE);\n await atomicWriteFile(filePath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nfunction validateIntegrityManifest(data: unknown): data is IntegrityManifest {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data as Record<string, unknown>;\n if (typeof obj.version !== \"number\") return false;\n if (typeof obj.generated !== \"string\") return false;\n if (typeof obj.hatchVersion !== \"string\") return false;\n if (typeof obj.files !== \"object\" || obj.files === null) return false;\n for (const val of Object.values(obj.files as Record<string, unknown>)) {\n if (typeof val !== \"string\") return false;\n }\n if (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 const expected = createHash(\"sha256\")\n .update(JSON.stringify(manifest.files))\n .digest(\"hex\");\n if (manifest.checksum !== expected) {\n results.push({ file: INTEGRITY_FILE, status: \"tampered\" });\n return results;\n }\n const manifestFiles = new Set(Object.keys(manifest.files));\n\n for (const [filePath, expectedHash] of Object.entries(manifest.files)) {\n const fullPath = join(agentsDir, filePath);\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const actualHash = sha256(content);\n if (actualHash === expectedHash) {\n results.push({ file: filePath, status: \"pass\" });\n } else {\n results.push({\n file: filePath,\n status: \"modified\",\n expected: expectedHash,\n actual: actualHash,\n });\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n results.push({\n file: filePath,\n status: \"missing\",\n expected: expectedHash,\n });\n } else {\n throw err;\n }\n }\n }\n\n for (const dir of SCANNED_DIRS) {\n const dirPath = join(agentsDir, dir);\n const onDisk = await collectFiles(dirPath, dir);\n for (const filePath of onDisk) {\n if (!manifestFiles.has(filePath)) {\n const content = await readFile(join(agentsDir, filePath), \"utf-8\");\n results.push({\n file: filePath,\n status: \"new\",\n actual: sha256(content),\n });\n }\n }\n }\n\n results.sort((a, b) => a.file.localeCompare(b.file));\n return results;\n}\n","import { access, cp, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join, sep } from \"node:path\";\nimport type { HatchManifest, Tool } from \"../types.js\";\nimport { HATCH3R_PREFIX, sanitizeId } from \"../types.js\";\nimport { extractCustomContent, hasManagedBlock } from \"../merge/managedBlocks.js\";\nimport type { CustomizableType } from \"../models/customize.js\";\n\nfunction toPosixPath(p: string): string {\n return sep === \"\\\\\" ? p.replaceAll(\"\\\\\", \"/\") : p;\n}\n\nconst ARCHIVE_DIR = \".hatch3r-archive\";\n\nexport interface MigrationNotice {\n from: string;\n to: string;\n type: string;\n id: string;\n}\n\ninterface ParsedOutputPath {\n type: CustomizableType;\n id: string;\n}\n\nconst TOOL_PATH_PREFIXES: Record<Tool, string[]> = {\n cursor: [\".cursor/\"],\n claude: [\".claude/\", \"CLAUDE.md\", \".mcp.json\"],\n copilot: [\".github/copilot-instructions.md\", \".github/workflows/copilot-setup-steps.yml\", \".vscode/mcp.json\"],\n windsurf: [\".windsurf/\", \".windsurfrules\"],\n amp: [\".amp/\"],\n codex: [\".codex/\"],\n gemini: [\".gemini/\", \"GEMINI.md\"],\n cline: [\".roo/\", \".roomodes\"],\n aider: [\"CONVENTIONS.md\", \".aider.conf.yml\"],\n kiro: [\".kiro/\"],\n opencode: [\"opencode.json\"],\n goose: [\".goosehints\"],\n zed: [\".rules\"],\n \"amazon-q\": [\".amazonq/\"],\n antigravity: [\".antigravity/\"],\n};\n\nconst PATH_PATTERNS: Array<{ pattern: RegExp; type: CustomizableType }> = [\n { pattern: /\\/rules\\/([^/]+)\\.(mdc|md)$/, type: \"rules\" },\n { pattern: /\\/agents\\/([^/]+)\\.md$/, type: \"agents\" },\n { pattern: /\\/skills\\/([^/]+)\\/SKILL\\.md$/, type: \"skills\" },\n { pattern: /\\/commands\\/([^/]+)\\.md$/, type: \"commands\" },\n];\n\nfunction parseOutputPath(filePath: string): ParsedOutputPath | null {\n for (const { pattern, type } of PATH_PATTERNS) {\n const match = filePath.match(pattern);\n if (match) {\n let id = match[1];\n if (id.startsWith(HATCH3R_PREFIX)) {\n id = id.slice(HATCH3R_PREFIX.length);\n }\n id = sanitizeId(id);\n if (id.length > 0) return { type, id };\n }\n }\n return null;\n}\n\nfunction stripFrontmatter(content: string): string {\n const trimmed = content.trimStart();\n if (trimmed.startsWith(\"---\")) {\n const endIdx = trimmed.indexOf(\"\\n---\", 3);\n if (endIdx !== -1) {\n return trimmed.slice(endIdx + 4).trim();\n }\n }\n return content.trim();\n}\n\nfunction fileMatchesTool(filePath: string, tool: Tool): boolean {\n const prefixes = TOOL_PATH_PREFIXES[tool];\n if (!prefixes) return false;\n return prefixes.some((prefix) =>\n prefix.endsWith(\"/\") ? filePath.startsWith(prefix) : filePath === prefix,\n );\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function collectToolFiles(rootDir: string, tool: Tool): Promise<string[]> {\n const prefixes = TOOL_PATH_PREFIXES[tool];\n if (!prefixes) return [];\n\n const files: string[] = [];\n\n for (const prefix of prefixes) {\n const absPath = join(rootDir, prefix);\n if (prefix.endsWith(\"/\")) {\n try {\n const entries = await readdir(absPath, { recursive: true, withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile()) {\n const parent = entry.parentPath ?? (entry as unknown as { path: string }).path ?? absPath;\n const relPath = toPosixPath(join(prefix, parent.slice(absPath.length), entry.name));\n files.push(relPath);\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else if (await fileExists(absPath)) {\n files.push(prefix);\n }\n }\n\n return files;\n}\n\nexport async function archiveToolOutputs(\n rootDir: string,\n tool: Tool,\n): Promise<{ archivedFiles: string[]; migrations: MigrationNotice[] }> {\n const filesToArchive = await collectToolFiles(rootDir, tool);\n if (filesToArchive.length === 0) {\n return { archivedFiles: [], migrations: [] };\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const archiveBase = join(rootDir, ARCHIVE_DIR, tool, timestamp);\n\n const archivedFiles: string[] = [];\n const migrations: MigrationNotice[] = [];\n\n for (const relPath of filesToArchive) {\n const absPath = join(rootDir, relPath);\n if (!(await fileExists(absPath))) continue;\n\n let content: string;\n try {\n content = await readFile(absPath, \"utf-8\");\n } catch {\n continue;\n }\n\n if (hasManagedBlock(content)) {\n const customContent = stripFrontmatter(extractCustomContent(content));\n if (customContent.length > 0) {\n const parsed = parseOutputPath(relPath);\n if (parsed) {\n const customizePath = join(rootDir, \".hatch3r\", parsed.type, `${parsed.id}.customize.md`);\n if (!(await fileExists(customizePath))) {\n await mkdir(dirname(customizePath), { recursive: true });\n await writeFile(customizePath, customContent + \"\\n\", \"utf-8\");\n migrations.push({\n from: relPath,\n to: `.hatch3r/${parsed.type}/${parsed.id}.customize.md`,\n type: parsed.type,\n id: parsed.id,\n });\n }\n }\n }\n }\n\n const archiveDest = join(archiveBase, relPath);\n await mkdir(dirname(archiveDest), { recursive: true });\n await cp(absPath, archiveDest);\n // Verify the copy succeeded before removing the original\n const srcStat = await stat(absPath);\n const destStat = await stat(archiveDest);\n if (destStat.size !== srcStat.size) {\n throw new Error(`Archive copy size mismatch for ${relPath}: source=${srcStat.size}, dest=${destStat.size}`);\n }\n await rm(absPath);\n archivedFiles.push(relPath);\n }\n\n await cleanEmptyDirs(rootDir, filesToArchive);\n\n return { archivedFiles, migrations };\n}\n\nasync function cleanEmptyDirs(rootDir: string, paths: string[]): Promise<void> {\n const dirs = new Set<string>();\n for (const p of paths) {\n let dir = dirname(join(rootDir, p));\n while (dir !== rootDir && dir.length > rootDir.length) {\n dirs.add(dir);\n dir = dirname(dir);\n }\n }\n\n const sorted = [...dirs].sort((a, b) => b.length - a.length);\n for (const dir of sorted) {\n try {\n const entries = await readdir(dir);\n if (entries.length === 0) {\n await rm(dir, { recursive: true });\n }\n } catch {\n // directory may not exist or already removed\n }\n }\n}\n\nexport function removeManagedFilesForPaths(\n manifest: HatchManifest,\n paths: string[],\n): void {\n const pathSet = new Set(paths);\n manifest.managedFiles = manifest.managedFiles.filter((f) => !pathSet.has(f));\n}\n\nexport function getManagedFilesForTool(\n manifest: HatchManifest,\n tool: Tool,\n): string[] {\n return manifest.managedFiles.filter((f) => fileMatchesTool(f, tool));\n}\n\nconst MAX_ARCHIVE_ENTRIES = 5;\n\n/**\n * Prune old archive entries, keeping only the most recent MAX_ARCHIVE_ENTRIES per tool.\n */\nexport async function pruneArchives(rootDir: string): Promise<string[]> {\n const archiveRoot = join(rootDir, ARCHIVE_DIR);\n const pruned: string[] = [];\n\n let toolDirs: string[];\n try {\n toolDirs = await readdir(archiveRoot);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n for (const toolDir of toolDirs) {\n const toolPath = join(archiveRoot, toolDir);\n let entries: string[];\n try {\n const s = await stat(toolPath);\n if (!s.isDirectory()) continue;\n entries = await readdir(toolPath);\n } catch {\n continue;\n }\n\n // Sort descending (newest first) — timestamps are ISO-formatted\n entries.sort((a, b) => b.localeCompare(a));\n\n for (const entry of entries.slice(MAX_ARCHIVE_ENTRIES)) {\n const entryPath = join(toolPath, entry);\n await rm(entryPath, { recursive: true, force: true });\n pruned.push(`${toolDir}/${entry}`);\n }\n }\n\n return pruned;\n}\n","import { readFile, readdir, writeFile, cp, mkdir, rm } from \"node:fs/promises\";\nimport { join, dirname, normalize, isAbsolute } from \"node:path\";\nimport { parseFrontmatter } from \"../adapters/canonical.js\";\nimport { HatchError } from \"../types.js\";\nimport type { ContentSelection } from \"../types.js\";\nimport type { ContentPreset } from \"./presets.js\";\n\nexport function assertSafePath(relativePath: string, label: string): void {\n // Strip null bytes before validation — prevents null byte injection bypasses\n const sanitized = relativePath.replace(/\\0/g, '');\n const normalized = normalize(sanitized);\n if (normalized.startsWith('..') || isAbsolute(normalized)) {\n throw new HatchError(`Unsafe path detected in ${label}: ${relativePath}`, 1, \"FS_ERROR\");\n }\n if (sanitized !== relativePath) {\n throw new HatchError(`Unsafe path detected in ${label}: ${relativePath}`, 1, \"FS_ERROR\");\n }\n}\n\n// ── Content Cross-References ───────────────────────────────────\n\n/**\n * Extract hatch3r content IDs referenced in markdown content.\n * Looks for backtick-quoted `hatch3r-{name}` patterns.\n */\nexport function extractContentReferences(content: string): string[] {\n const refs = new Set<string>();\n const pattern = /`(hatch3r-[a-z0-9-]+)`/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n refs.add(match[1]);\n }\n return [...refs];\n}\n\nexport interface CrossReferenceResult {\n warnings: string[];\n}\n\n/**\n * Validate cross-references between content items.\n * Parses markdown bodies for references to other content IDs and verifies\n * all referenced IDs exist in the index.\n */\nexport async function validateCrossReferences(\n contentRoot: string,\n index: ContentIndex,\n): Promise<CrossReferenceResult> {\n const warnings: string[] = [];\n const allIds = new Set(index.items.map((item) => item.id));\n\n for (const item of index.items) {\n let content: string;\n try {\n const filePath =\n item.type === \"skill\"\n ? join(contentRoot, item.relativePath, \"SKILL.md\")\n : join(contentRoot, `${item.relativePath}`);\n content = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n\n const refs = extractContentReferences(content);\n for (const ref of refs) {\n if (ref === item.id) continue; // self-reference is fine\n if (!allIds.has(ref)) {\n warnings.push(\n `${item.type} \"${item.id}\" references \"${ref}\" which does not exist in the content index`,\n );\n }\n }\n }\n\n return { warnings };\n}\n\n// Agents required by the orchestration pipeline (\"Always\" in Agent Roster)\nconst ORCHESTRATION_REQUIRED_AGENTS = [\n \"hatch3r-researcher\",\n \"hatch3r-implementer\",\n \"hatch3r-reviewer\",\n \"hatch3r-test-writer\",\n \"hatch3r-security-auditor\",\n];\n\n/**\n * Validate that a content selection includes all agents required by the\n * orchestration pipeline. Returns warnings for missing agents.\n */\nexport function validateOrchestrationDependencies(\n selection: ContentSelection,\n): string[] {\n const warnings: string[] = [];\n const selectedAgents = new Set(selection.items.agents);\n\n // Check if orchestration rule is selected\n const hasOrchestration = selection.items.rules.includes(\"hatch3r-agent-orchestration\");\n if (!hasOrchestration) return warnings;\n\n for (const agentId of ORCHESTRATION_REQUIRED_AGENTS) {\n if (!selectedAgents.has(agentId)) {\n warnings.push(\n `Orchestration pipeline requires agent \"${agentId}\" but it is not in the content selection. ` +\n `The 4-phase pipeline (Research → Implement → Review → Quality) will be incomplete.`,\n );\n }\n }\n\n return warnings;\n}\n\n// ── Types ──────────────────────────────────────────────────────\n\nexport interface CatalogItem {\n id: string;\n type: \"agent\" | \"skill\" | \"rule\" | \"command\" | \"prompt\" | \"hook\" | \"github-agent\";\n description: string;\n tags: string[];\n protected?: boolean;\n /** For glob-strategy: relative path from content root (e.g. \"agents/hatch3r-implementer.md\") */\n relativePath: string;\n /** For rules: companion .mdc file path, if it exists */\n companionPath?: string;\n}\n\nexport interface ContentCollision {\n id: string;\n kind: \"cross-type\" | \"same-type\";\n existingType: CatalogItem[\"type\"];\n existingPath: string;\n duplicateType: CatalogItem[\"type\"];\n duplicatePath: string;\n}\n\nexport interface ContentIndex {\n items: CatalogItem[];\n byType: Record<string, CatalogItem[]>;\n byId: Map<string, CatalogItem>;\n /**\n * Collision-safe lookup: `\"type:id\"` → CatalogItem.\n * Use this when the content type is known to avoid cross-type ID shadows.\n * Key format: `\"agent:hatch3r-implementer\"`, `\"skill:hatch3r-recipe\"`, etc.\n */\n byTypeAndId: Map<string, CatalogItem>;\n /** Structured records of ID collisions detected during indexing. */\n collisions: ContentCollision[];\n}\n\n/**\n * Build a composite key for the `byTypeAndId` map.\n */\nexport function typeIdKey(type: CatalogItem[\"type\"], id: string): string {\n return `${type}:${id}`;\n}\n\n/**\n * Get all items matching an ID, across all content types.\n * Unlike `byId.get()` which returns only the last-indexed item for a colliding ID,\n * this returns every item that shares the given ID (typically 1, but 2+ when\n * a command and skill share the same name).\n */\nexport function getAllItemsById(index: ContentIndex, id: string): CatalogItem[] {\n return index.items.filter((item) => item.id === id);\n}\n\n// ── Content type configs ───────────────────────────────────────\n\ninterface ContentTypeConfig {\n dir: string;\n type: CatalogItem[\"type\"];\n strategy: \"glob\" | \"subdirectory\";\n}\n\nconst CONTENT_TYPE_CONFIGS: ContentTypeConfig[] = [\n { dir: \"agents\", type: \"agent\", strategy: \"glob\" },\n { dir: \"commands\", type: \"command\", strategy: \"glob\" },\n { dir: \"rules\", type: \"rule\", strategy: \"glob\" },\n { dir: \"skills\", type: \"skill\", strategy: \"subdirectory\" },\n { dir: \"prompts\", type: \"prompt\", strategy: \"glob\" },\n { dir: \"hooks\", type: \"hook\", strategy: \"glob\" },\n { dir: \"github-agents\", type: \"github-agent\", strategy: \"glob\" },\n];\n\n// ── Build content index ────────────────────────────────────────\n\n/**\n * Scan package content dirs, parse frontmatter, return indexed catalog.\n */\nexport async function buildContentIndex(contentRoot: string): Promise<ContentIndex> {\n const items: CatalogItem[] = [];\n\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(contentRoot, config.dir);\n\n if (config.strategy === \"subdirectory\") {\n // Skills: each subdirectory has a SKILL.md\n let dirents: { name: string; isDirectory: () => boolean }[];\n try {\n dirents = (await readdir(dirPath, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const dirent of dirents) {\n if (!dirent.isDirectory()) continue;\n const skillPath = join(dirPath, dirent.name, \"SKILL.md\");\n try {\n const raw = await readFile(skillPath, \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const 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\")).sort();\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n for (const file of entries) {\n const filePath = join(dirPath, file);\n const raw = await readFile(filePath, \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n const id = metadata.id || metadata.name || file.replace(/\\.md$/, \"\");\n\n const item: CatalogItem = {\n id,\n type: config.type,\n description: metadata.description ?? \"\",\n tags: metadata.tags ?? [],\n protected: metadata.protected,\n relativePath: join(config.dir, file),\n };\n\n // For rules, check for companion .mdc file\n if (config.type === \"rule\") {\n const mdcFile = file.replace(/\\.md$/, \".mdc\");\n try {\n await readFile(join(dirPath, mdcFile), \"utf-8\");\n item.companionPath = join(config.dir, mdcFile);\n } catch {\n // No companion file\n }\n }\n\n items.push(item);\n }\n }\n }\n\n // Build indexes\n const byType: Record<string, CatalogItem[]> = {};\n const byId = new Map<string, CatalogItem>();\n const byTypeAndId = new Map<string, CatalogItem>();\n const collisions: ContentCollision[] = [];\n\n for (const item of items) {\n if (!byType[item.type]) byType[item.type] = [];\n byType[item.type].push(item);\n\n // Collision-safe type-qualified lookup (never shadows)\n byTypeAndId.set(typeIdKey(item.type, item.id), item);\n\n const existing = byId.get(item.id);\n if (existing) {\n const kind: ContentCollision[\"kind\"] = existing.type !== item.type ? \"cross-type\" : \"same-type\";\n collisions.push({\n id: item.id,\n kind,\n existingType: existing.type,\n existingPath: existing.relativePath,\n duplicateType: item.type,\n duplicatePath: item.relativePath,\n });\n if (kind === \"cross-type\") {\n console.warn(\n `[hatch3r] Content ID collision: \"${item.id}\" exists as both ${existing.type} (${existing.relativePath}) and ${item.type} (${item.relativePath}). Use index.byTypeAndId for collision-safe lookup.`,\n );\n } else {\n console.warn(\n `[hatch3r] Duplicate content ID: \"${item.id}\" found in ${existing.relativePath} and ${item.relativePath}. The later entry will shadow the earlier one in ID lookups.`,\n );\n }\n }\n byId.set(item.id, item);\n }\n\n return { items, byType, byId, byTypeAndId, collisions };\n}\n\n// ── Shared type-to-key mapping ──────────────────────────────────\n\nexport const TYPE_TO_SELECTION_KEY: Record<string, keyof ContentSelection[\"items\"]> = {\n agent: \"agents\",\n skill: \"skills\",\n rule: \"rules\",\n command: \"commands\",\n prompt: \"prompts\",\n hook: \"hooks\",\n \"github-agent\": \"githubAgents\",\n};\n\n// ── Selection resolution ───────────────────────────────────────\n\n/**\n * Apply preset + context filters to determine which IDs to include.\n *\n * Filtering logic:\n * 1. Start with all items from the index\n * 2. If preset has includeTags, keep only items matching ANY of those tags\n * 3. If preset has excludeTags, remove items matching ANY of those tags\n * 4. If projectType is \"greenfield\", remove items tagged ONLY with \"brownfield\"\n * 5. If projectType is \"brownfield\", remove items tagged ONLY with \"greenfield\"\n * 6. If teamSize is \"solo\", remove items whose ONLY tags are \"team\" / \"board\"\n * 7. Items with protected: true are always included\n * 8. For \"custom\" preset, use customSelections as explicit ID list\n */\nexport function resolveSelection(\n preset: ContentPreset,\n projectType: \"greenfield\" | \"brownfield\",\n teamSize: \"solo\" | \"team\",\n index: ContentIndex,\n customSelections?: string[],\n): ContentSelection {\n let selected: CatalogItem[];\n\n if (preset.id === \"custom\" && customSelections) {\n // For custom, use explicit ID list\n const customSet = new Set(customSelections);\n selected = index.items.filter(\n (item) => customSet.has(item.id) || item.protected,\n );\n } else {\n selected = [...index.items];\n\n // Apply includeTags filter (if non-empty, keep only items matching ANY tag)\n if (preset.includeTags.length > 0) {\n const includeSet = new Set<string>(preset.includeTags);\n selected = selected.filter(\n (item) =>\n item.protected ||\n item.tags.length === 0 || // items without tags pass through\n item.tags.some((t) => includeSet.has(t)),\n );\n }\n\n // Apply excludeTags filter\n if (preset.excludeTags.length > 0) {\n const excludeSet = new Set<string>(preset.excludeTags);\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.every((t) => excludeSet.has(t)),\n );\n }\n\n // Context filtering: project type\n if (projectType === \"greenfield\") {\n // Remove items tagged ONLY with \"brownfield\"\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.includes(\"brownfield\") ||\n item.tags.some((t) => t !== \"brownfield\" && t !== \"team\" && t !== \"solo\"),\n );\n } else {\n // Remove items tagged ONLY with \"greenfield\"\n selected = selected.filter(\n (item) =>\n item.protected ||\n !item.tags.includes(\"greenfield\") ||\n item.tags.some((t) => t !== \"greenfield\" && t !== \"team\" && t !== \"solo\"),\n );\n }\n\n // Context filtering: team size\n if (teamSize === \"solo\") {\n // Remove items whose tags are exclusively team/board (no other workflow/domain tags)\n selected = selected.filter((item) => {\n if (item.protected) return true;\n if (!item.tags.includes(\"team\") && !item.tags.includes(\"board\")) return true;\n // Has team/board tag — keep if it has other non-context tags too\n return item.tags.some(\n (t) => t !== \"team\" && t !== \"board\" && t !== \"solo\" && t !== \"greenfield\" && t !== \"brownfield\",\n );\n });\n }\n }\n\n // Build the selection items grouped by type\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const item of selected) {\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) items[key].push(item.id);\n }\n\n return {\n preset: preset.id,\n projectType,\n teamSize,\n items,\n };\n}\n\n// ── Exclusion counting ─────────────────────────────────────────\n\n/**\n * Count how many items a preset would exclude relative to the full item set.\n */\nexport function countPresetExclusions(\n preset: ContentPreset,\n index: ContentIndex,\n): number {\n if (preset.id === \"custom\") return 0;\n if (preset.id === \"full\") return 0;\n\n let count = 0;\n for (const item of index.items) {\n if (item.protected) continue;\n // includeTags filter\n if (preset.includeTags.length > 0) {\n const includeSet = new Set<string>(preset.includeTags);\n if (item.tags.length > 0 && !item.tags.some((t) => includeSet.has(t))) {\n count++;\n continue;\n }\n }\n // excludeTags filter\n if (preset.excludeTags.length > 0) {\n const excludeSet = new Set<string>(preset.excludeTags);\n if (item.tags.every((t) => excludeSet.has(t))) {\n count++;\n }\n }\n }\n return count;\n}\n\n/**\n * Count how many items the project type filter would remove from a pre-filtered set.\n */\nexport function countProjectTypeExclusions(\n projectType: \"greenfield\" | \"brownfield\",\n items: CatalogItem[],\n): number {\n const opposite = projectType === \"greenfield\" ? \"brownfield\" : \"greenfield\";\n let count = 0;\n for (const item of items) {\n if (item.protected) continue;\n if (\n item.tags.includes(opposite) &&\n !item.tags.some((t) => t !== opposite && t !== \"team\" && t !== \"solo\")\n ) {\n count++;\n }\n }\n return count;\n}\n\n/**\n * Count how many items the team size filter would remove from a pre-filtered set.\n */\nexport function countTeamSizeExclusions(\n teamSize: \"solo\" | \"team\",\n items: CatalogItem[],\n): number {\n if (teamSize !== \"solo\") return 0;\n let count = 0;\n for (const item of items) {\n if (item.protected) continue;\n if (!item.tags.includes(\"team\") && !item.tags.includes(\"board\")) continue;\n const hasOther = item.tags.some(\n (t) => t !== \"team\" && t !== \"board\" && t !== \"solo\" && t !== \"greenfield\" && t !== \"brownfield\",\n );\n if (!hasOther) count++;\n }\n return count;\n}\n\n// ── Copy selected content ──────────────────────────────────────\n\n/**\n * Copy only selected content files from package to .agents/.\n * Returns list of relative paths copied.\n */\nexport async function copySelectedContent(\n contentRoot: string,\n agentsDir: string,\n selection: ContentSelection,\n index: ContentIndex,\n): Promise<string[]> {\n const copied: string[] = [];\n\n // Collect all selected IDs\n const selectedIds = new Set<string>();\n for (const ids of Object.values(selection.items)) {\n for (const id of ids) selectedIds.add(id);\n }\n\n for (const item of index.items) {\n if (!selectedIds.has(item.id)) continue;\n\n assertSafePath(item.relativePath, \"copySelectedContent\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"copySelectedContent companion\");\n }\n\n const srcPath = join(contentRoot, item.relativePath);\n const destPath = join(agentsDir, item.relativePath);\n\n if (item.type === \"skill\") {\n // Copy entire skill subdirectory\n await mkdir(destPath, { recursive: true });\n await cp(srcPath, destPath, { recursive: true, force: true });\n copied.push(item.relativePath);\n } else {\n // Copy individual .md file\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n copied.push(item.relativePath);\n\n // Copy companion .mdc file if it exists (rules)\n if (item.companionPath) {\n const mdcSrc = join(contentRoot, item.companionPath);\n const mdcDest = join(agentsDir, item.companionPath);\n try {\n await cp(mdcSrc, mdcDest, { force: true });\n copied.push(item.companionPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n }\n\n // Always copy support subdirectories (non-hatch3r-prefixed dirs inside glob-strategy content types)\n // These are shared/companion files referenced by agents and commands (e.g. agents/shared/, agents/modes/, commands/board/)\n for (const config of CONTENT_TYPE_CONFIGS) {\n if (config.strategy !== \"glob\") continue;\n try {\n const dirEntries = await readdir(join(contentRoot, config.dir), { withFileTypes: true });\n for (const entry of dirEntries) {\n if (!entry.isDirectory() || entry.name.startsWith(\"hatch3r-\")) continue;\n const subSrc = join(contentRoot, config.dir, entry.name);\n const subDest = join(agentsDir, config.dir, entry.name);\n await mkdir(subDest, { recursive: true });\n await cp(subSrc, subDest, { recursive: true, force: true });\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n\n // Always copy checks/ (referenced by agents, small)\n try {\n const checksSrc = join(contentRoot, \"checks\");\n const checksDest = join(agentsDir, \"checks\");\n await mkdir(checksDest, { recursive: true });\n await cp(checksSrc, checksDest, { recursive: true, force: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n // Always copy mcp/ (handled separately by init for filtering)\n try {\n const mcpSrc = join(contentRoot, \"mcp\");\n const mcpDest = join(agentsDir, \"mcp\");\n await mkdir(mcpDest, { recursive: true });\n await cp(mcpSrc, mcpDest, { recursive: true, force: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n return copied;\n}\n\n// ── Available items ────────────────────────────────────────────\n\n/**\n * Get items available in package but not currently installed on disk.\n */\nexport async function getAvailableItems(\n contentRoot: string,\n agentsDir: string,\n index: ContentIndex,\n): Promise<CatalogItem[]> {\n const installed = new Set<string>();\n\n // Scan what's on disk\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(agentsDir, config.dir);\n\n if (config.strategy === \"subdirectory\") {\n try {\n const dirents = await readdir(dirPath, { withFileTypes: true });\n for (const d of dirents) {\n if (d.isDirectory()) {\n try {\n const raw = await readFile(join(dirPath, d.name, \"SKILL.md\"), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n installed.add(metadata.id || metadata.name || d.name);\n } catch {\n // skip\n }\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else {\n try {\n const files = await readdir(dirPath);\n for (const f of files.filter((f) => f.endsWith(\".md\"))) {\n const raw = await readFile(join(dirPath, f), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n installed.add(metadata.id || metadata.name || f.replace(/\\.md$/, \"\"));\n }\n } catch {\n // directory doesn't exist\n }\n }\n }\n\n return index.items.filter((item) => !installed.has(item.id));\n}\n\n// ── Build selections from disk ─────────────────────────────────\n\n/**\n * Scan .agents/ to build a ContentSelection from what's on disk.\n * Used for legacy migration — converts \"everything installed\" to explicit tracking.\n */\nexport async function buildSelectionsFromDisk(\n agentsDir: string,\n): Promise<ContentSelection> {\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const config of CONTENT_TYPE_CONFIGS) {\n const dirPath = join(agentsDir, config.dir);\n const key = TYPE_TO_SELECTION_KEY[config.type];\n if (!key) continue;\n\n if (config.strategy === \"subdirectory\") {\n try {\n const dirents = await readdir(dirPath, { withFileTypes: true });\n for (const d of dirents) {\n if (!d.isDirectory()) continue;\n try {\n const raw = await readFile(join(dirPath, d.name, \"SKILL.md\"), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n items[key].push(metadata.id || metadata.name || d.name);\n } catch {\n // skip\n }\n }\n } catch {\n // directory doesn't exist\n }\n } else {\n try {\n const files = await readdir(dirPath);\n for (const f of files.filter((f) => f.endsWith(\".md\"))) {\n const raw = await readFile(join(dirPath, f), \"utf-8\");\n const { metadata } = parseFrontmatter(raw);\n items[key].push(metadata.id || metadata.name || f.replace(/\\.md$/, \"\"));\n }\n } catch {\n // directory doesn't exist\n }\n }\n }\n\n return {\n preset: \"full\",\n projectType: \"brownfield\",\n teamSize: \"team\",\n items,\n };\n}\n\n// ── Content item add/remove ────────────────────────────────────\n\n/**\n * Add a single content item from the package to .agents/.\n */\nexport async function addContentItem(\n contentRoot: string,\n agentsDir: string,\n item: CatalogItem,\n): Promise<void> {\n assertSafePath(item.relativePath, \"addContentItem\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"addContentItem companion\");\n }\n\n const srcPath = join(contentRoot, item.relativePath);\n const destPath = join(agentsDir, item.relativePath);\n\n try {\n if (item.type === \"skill\") {\n await mkdir(destPath, { recursive: true });\n await cp(srcPath, destPath, { recursive: true, force: true });\n } else {\n await mkdir(dirname(destPath), { recursive: true });\n await cp(srcPath, destPath, { force: true });\n\n if (item.companionPath) {\n try {\n await cp(\n join(contentRoot, item.companionPath),\n join(agentsDir, item.companionPath),\n { force: true },\n );\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new HatchError(\n `Content \"${item.id}\" (${item.type}) not found in package at ${item.relativePath}. ` +\n `It may have been renamed or removed in this hatch3r version.`,\n 1,\n \"FS_ERROR\",\n );\n }\n throw err;\n }\n}\n\n/**\n * Remove a single content item from .agents/ and optionally clean up customization files.\n */\nexport async function removeContentItem(\n agentsDir: string,\n item: CatalogItem,\n options?: { rootDir?: string },\n): Promise<void> {\n assertSafePath(item.relativePath, \"removeContentItem\");\n if (item.companionPath) {\n assertSafePath(item.companionPath, \"removeContentItem companion\");\n }\n\n const destPath = join(agentsDir, item.relativePath);\n\n if (item.type === \"skill\") {\n await rm(destPath, { recursive: true, force: true });\n } else {\n await rm(destPath, { force: true });\n\n if (item.companionPath) {\n await rm(join(agentsDir, item.companionPath), { force: true });\n }\n }\n\n // Clean up customize files if rootDir provided\n if (options?.rootDir) {\n const typeToDir: Record<string, string> = {\n agent: \"agents\",\n skill: \"skills\",\n rule: \"rules\",\n command: \"commands\",\n };\n const customDir = typeToDir[item.type];\n if (customDir) {\n const yamlPath = join(options.rootDir, \".hatch3r\", customDir, `${item.id}.customize.yaml`);\n const mdPath = join(options.rootDir, \".hatch3r\", customDir, `${item.id}.customize.md`);\n await rm(yamlPath, { force: true });\n await rm(mdPath, { force: true });\n }\n }\n}\n\n/**\n * Get all content IDs from a ContentSelection as a flat Set.\n */\nexport function getAllContentIds(selection: ContentSelection): Set<string> {\n const ids = new Set<string>();\n for (const arr of Object.values(selection.items)) {\n for (const id of arr) ids.add(id);\n }\n return ids;\n}\n\n/**\n * Estimate the item count a preset would yield for a given project type and team size.\n * Used to show expected item counts in the profile selector prompt (#147 D19-18).\n */\nexport function estimatePresetItemCount(\n preset: ContentPreset,\n projectType: \"greenfield\" | \"brownfield\",\n teamSize: \"solo\" | \"team\",\n index: ContentIndex,\n): number {\n const selection = resolveSelection(preset, projectType, teamSize, index);\n return Object.values(selection.items).reduce((sum, arr) => sum + arr.length, 0);\n}\n\n/**\n * Get total count of selected items.\n */\nexport function countSelectionItems(selection: ContentSelection): number {\n return Object.values(selection.items).reduce((sum, arr) => sum + arr.length, 0);\n}\n\n/**\n * Get a summary string of selection items by type.\n */\nexport function selectionSummary(selection: ContentSelection): string {\n const parts: string[] = [];\n const { items } = selection;\n if (items.agents.length > 0) parts.push(`${items.agents.length} agents`);\n if (items.skills.length > 0) parts.push(`${items.skills.length} skills`);\n if (items.rules.length > 0) parts.push(`${items.rules.length} rules`);\n if (items.commands.length > 0) parts.push(`${items.commands.length} commands`);\n if (items.prompts.length > 0) parts.push(`${items.prompts.length} prompts`);\n if (items.hooks.length > 0) parts.push(`${items.hooks.length} hooks`);\n if (items.githubAgents.length > 0) parts.push(`${items.githubAgents.length} github-agents`);\n return parts.join(\", \");\n}\n\n// ── MDC companion generation ───────────────────────────────────\n\n/**\n * Generate Cursor-native frontmatter from canonical rule metadata.\n * Maps `scope` to `alwaysApply` / `globs` as the Cursor adapter does.\n */\nfunction cursorCompanionFrontmatter(description: string, scope?: string): string {\n const lines: string[] = [`description: ${description}`];\n if (scope === \"always\") {\n lines.push(\"alwaysApply: true\");\n } else if (scope && scope !== \"conditional\") {\n // Treat non-\"always\", non-\"conditional\" scope values as glob patterns\n const globs = scope.includes(\",\")\n ? scope.split(\",\").map((g) => g.trim())\n : [scope];\n lines.push(`globs: [${globs.map((g) => `\"${g}\"`).join(\", \")}]`);\n } else {\n lines.push(\"alwaysApply: false\");\n }\n return `---\\n${lines.join(\"\\n\")}\\n---`;\n}\n\n/**\n * Generate .mdc companion files for all .md rule files in a directory.\n * Each .mdc file contains Cursor-native frontmatter (description, alwaysApply/globs)\n * and the full body content from the source .md file.\n *\n * Returns the list of .mdc file paths that were written.\n */\nexport async function generateMdcCompanions(rulesDir: string): Promise<string[]> {\n let entries: string[];\n try {\n entries = (await readdir(rulesDir)).filter((f) => f.endsWith(\".md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw err;\n }\n\n const written: string[] = [];\n for (const mdFile of entries) {\n const mdPath = join(rulesDir, mdFile);\n const raw = await readFile(mdPath, \"utf-8\");\n const { metadata, content } = parseFrontmatter(raw);\n const description = metadata.description || \"\";\n const scope = metadata.scope;\n const frontmatter = cursorCompanionFrontmatter(description, scope);\n const mdcContent = `${frontmatter}\\n${content}`;\n const mdcFile = mdFile.replace(/\\.md$/, \".mdc\");\n const mdcPath = join(rulesDir, mdcFile);\n await writeFile(mdcPath, mdcContent, \"utf-8\");\n written.push(mdcPath);\n }\n return written;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, normalize, isAbsolute } from \"node:path\";\nimport { AGENTS_DIR, HatchError } from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { atomicWriteFile } from \"../merge/safeWrite.js\";\nimport type { WorkspaceManifest } from \"./types.js\";\nimport { WORKSPACE_MANIFEST_FILE, WORKSPACE_MANIFEST_VERSION } from \"./types.js\";\n\n/**\n * Validate that a workspace repo path is safe (no traversal or absolute paths).\n * Rejects paths containing \"..\", absolute paths, and null bytes.\n */\nexport function isUnsafeRepoPath(repoPath: string): boolean {\n if (repoPath.includes('\\0')) return true;\n if (isAbsolute(repoPath)) return true;\n const normalized = normalize(repoPath);\n if (normalized.startsWith('..')) return true;\n return false;\n}\n\nfunction validateWorkspaceManifest(data: unknown): data is WorkspaceManifest {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.version !== \"string\") return false;\n if (typeof obj.hatch3rVersion !== \"string\") return false;\n if (typeof obj.name !== \"string\") return false;\n if (!Array.isArray(obj.repos)) return false;\n if (typeof obj.syncStrategy !== \"string\") return false;\n if (![\"manual\", \"on-sync\"].includes(obj.syncStrategy)) return false;\n\n if (!obj.defaults || typeof obj.defaults !== \"object\") return false;\n const defaults = obj.defaults as Record<string, unknown>;\n if (!Array.isArray(defaults.tools)) return false;\n if (!defaults.features || typeof defaults.features !== \"object\") return false;\n if (!defaults.mcp || typeof defaults.mcp !== \"object\") return false;\n\n // Validate MCP servers array\n const mcp = defaults.mcp as Record<string, unknown>;\n if (!Array.isArray(mcp.servers)) return false;\n\n // Validate content selection if present\n if (defaults.content !== undefined) {\n if (typeof defaults.content !== \"object\" || defaults.content === null) return false;\n const content = defaults.content as Record<string, unknown>;\n if (typeof content.preset !== \"string\") return false;\n if (typeof content.projectType !== \"string\") return false;\n if (typeof content.teamSize !== \"string\") return false;\n if (!content.items || typeof content.items !== \"object\") return false;\n }\n\n for (const repo of obj.repos as unknown[]) {\n if (!repo || typeof repo !== \"object\") return false;\n const r = repo as Record<string, unknown>;\n if (typeof r.path !== \"string\") return false;\n if (isUnsafeRepoPath(r.path)) return false;\n if (typeof r.sync !== \"boolean\") return false;\n if (r.owner !== undefined && typeof r.owner !== \"string\") return false;\n if (r.repo !== undefined && typeof r.repo !== \"string\") return false;\n if (r.defaultBranch !== undefined && typeof r.defaultBranch !== \"string\") return false;\n if (r.platform !== undefined && typeof r.platform !== \"string\") return false;\n }\n\n return true;\n}\n\nexport async function readWorkspaceManifest(\n rootDir: string,\n): Promise<WorkspaceManifest | null> {\n const manifestPath = join(rootDir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE);\n\n let raw: string;\n try {\n raw = await readFile(manifestPath, \"utf-8\");\n } catch (err: unknown) {\n if (err instanceof Error && \"code\" in err && (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err: unknown) {\n throw new HatchError(\n `Malformed JSON in ${manifestPath}: ${err instanceof Error ? err.message : String(err)}`,\n 1,\n \"CONFIG_ERROR\",\n );\n }\n\n if (!validateWorkspaceManifest(parsed)) {\n throw new HatchError(\n `Invalid workspace manifest in ${manifestPath}: required fields missing or malformed.`,\n 1,\n \"VALIDATION_ERROR\",\n );\n }\n\n return parsed;\n}\n\nexport async function writeWorkspaceManifest(\n rootDir: string,\n manifest: WorkspaceManifest,\n): Promise<void> {\n const manifestPath = join(rootDir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE);\n await atomicWriteFile(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n}\n\nexport function createWorkspaceManifest(\n name: string,\n defaults: WorkspaceManifest[\"defaults\"],\n repos: WorkspaceManifest[\"repos\"],\n syncStrategy: WorkspaceManifest[\"syncStrategy\"] = \"manual\",\n): WorkspaceManifest {\n return {\n version: WORKSPACE_MANIFEST_VERSION,\n hatch3rVersion: HATCH3R_VERSION,\n name,\n repos,\n defaults,\n syncStrategy,\n };\n}\n","import type { ContentSelection, Features, McpConfig, ModelConfig, Platform, Tool } from \"../types.js\";\n\n// ── Workspace Manifest ──────────────────────────────────────────\n\nexport interface WorkspaceManifest {\n /** Workspace manifest schema version. */\n version: string;\n /** hatch3r version that created/last updated this workspace. */\n hatch3rVersion: string;\n /** Workspace display name. */\n name: string;\n /** Registered sub-repos. */\n repos: WorkspaceRepoEntry[];\n /** Default settings inherited by all sub-repos. */\n defaults: WorkspaceDefaults;\n /** When sub-repos are synced: \"manual\" or \"on-sync\" (cascade from hatch3r sync). */\n syncStrategy: \"manual\" | \"on-sync\";\n}\n\nexport interface WorkspaceDefaults {\n platform?: Platform;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n content: ContentSelection;\n models?: ModelConfig;\n}\n\n// ── Repo Entries ────────────────────────────────────────────────\n\nexport interface WorkspaceRepoEntry {\n /** Relative path from workspace root (e.g. \"api-service\"). */\n path: string;\n /** Display name (defaults to directory name). */\n name?: string;\n /** Whether workspace sync propagates content to this repo. */\n sync: boolean;\n /** Per-repo overrides merged on top of workspace defaults. */\n overrides?: WorkspaceRepoOverrides;\n /** ISO timestamp of last successful sync. */\n lastSync?: string;\n /** Git remote owner (org/user). Auto-detected from sub-repo remote. */\n owner?: string;\n /** Git remote repository name. Auto-detected from sub-repo remote. */\n repo?: string;\n /** Default branch for this repo. Auto-detected from sub-repo. */\n defaultBranch?: string;\n /** Platform for this repo. Auto-detected from remote URL. */\n platform?: Platform;\n}\n\nexport interface WorkspaceRepoOverrides {\n /** Replaces workspace tools entirely. */\n tools?: Tool[];\n /** Partial merge on top of workspace features. */\n features?: Partial<Features>;\n /** Replaces workspace MCP config entirely. */\n mcp?: McpConfig;\n /** Add or remove content IDs relative to workspace selection. */\n contentOverrides?: {\n /** Content IDs to add beyond workspace selection. */\n include?: string[];\n /** Content IDs to remove from workspace selection. */\n exclude?: string[];\n };\n models?: ModelConfig;\n platform?: Platform;\n}\n\n// ── Sync Results ────────────────────────────────────────────────\n\nexport interface WorkspaceSyncResult {\n repos: WorkspaceRepoSyncResult[];\n}\n\nexport interface WorkspaceRepoSyncResult {\n path: string;\n added: string[];\n removed: string[];\n toolsSynced: string[];\n action: \"synced\" | \"dry-run\" | \"skipped\" | \"error\";\n error?: string;\n /** Estimated token count for content being synced (populated in dry-run mode). */\n estimatedTokens?: number;\n}\n\n// ── Constants ───────────────────────────────────────────────────\n\nexport const WORKSPACE_MANIFEST_FILE = \"workspace.json\";\nexport const WORKSPACE_MANIFEST_VERSION = \"1.0.0\";\n","import { readdir, stat, access } from \"node:fs/promises\";\nimport { join, dirname, relative } from \"node:path\";\nimport { AGENTS_DIR } from \"../types.js\";\nimport { WORKSPACE_MANIFEST_FILE } from \"./types.js\";\n\nexport interface DetectedRepo {\n /** Relative path from workspace root. */\n path: string;\n /** Directory name (default display name). */\n name: string;\n /** Whether this repo already has a hatch3r setup. */\n hasHatch3r: boolean;\n}\n\n/**\n * Scan immediate subdirectories of rootDir for git repositories.\n * Returns directories that contain a .git folder or file (worktree).\n */\nexport async function detectSubRepos(rootDir: string): Promise<DetectedRepo[]> {\n const repos: DetectedRepo[] = [];\n\n let entries: { name: string; isDirectory: () => boolean }[];\n try {\n entries = await readdir(rootDir, { withFileTypes: true });\n } catch {\n return repos;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n // Skip hidden directories and node_modules\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n\n const subDir = join(rootDir, entry.name);\n const gitPath = join(subDir, \".git\");\n\n let isGitRepo = false;\n try {\n const gitStat = await stat(gitPath);\n // .git can be a directory (normal repo) or file (worktree)\n isGitRepo = gitStat.isDirectory() || gitStat.isFile();\n } catch {\n // Not a git repo\n }\n\n if (!isGitRepo) continue;\n\n let hasHatch3r = false;\n try {\n await access(join(subDir, AGENTS_DIR, \"hatch.json\"));\n hasHatch3r = true;\n } catch {\n // No existing hatch3r setup\n }\n\n repos.push({\n path: entry.name,\n name: entry.name,\n hasHatch3r,\n });\n }\n\n return repos.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport interface WorkspaceContext {\n type: \"workspace-root\" | \"workspace-member\" | \"standalone\";\n workspaceRoot?: string;\n rootPath?: string;\n}\n\n/**\n * Check if the given directory has a .git directory.\n */\nasync function hasGitDir(dir: string): Promise<boolean> {\n try {\n const gitStat = await stat(join(dir, \".git\"));\n return gitStat.isDirectory() || gitStat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the workspace context for a given directory.\n *\n * Returns:\n * - \"workspace-root\" if the dir has .agents/workspace.json\n * - \"workspace-member\" if the dir's hatch.json has a workspace.rootPath\n * pointing to a valid workspace root\n * - \"standalone\" otherwise\n */\nexport async function detectWorkspaceContext(dir: string): Promise<WorkspaceContext> {\n // Check 1: Is this directory a workspace root?\n try {\n await access(join(dir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return { type: \"workspace-root\", workspaceRoot: dir };\n } catch {\n // Not a workspace root\n }\n\n // Check 2: Walk up to 3 levels looking for workspace.json\n let current = dirname(dir);\n for (let i = 0; i < 3; i++) {\n try {\n await access(join(current, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return {\n type: \"workspace-member\",\n workspaceRoot: current,\n rootPath: relative(dir, current),\n };\n } catch {\n // Continue\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return { type: \"standalone\" };\n}\n\n/**\n * Determine if CWD looks like it should be a workspace root:\n * - No .git directory\n * - Has subdirectories with .git\n */\nexport async function shouldSuggestWorkspace(dir: string): Promise<boolean> {\n if (await hasGitDir(dir)) return false;\n\n const repos = await detectSubRepos(dir);\n return repos.length > 0;\n}\n\n/**\n * Check if a directory is a workspace root (has workspace.json).\n */\nexport async function isWorkspaceRoot(dir: string): Promise<boolean> {\n try {\n await access(join(dir, AGENTS_DIR, WORKSPACE_MANIFEST_FILE));\n return true;\n } catch {\n return false;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, access, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n buildContentIndex,\n copySelectedContent,\n getAllContentIds,\n getAllItemsById,\n removeContentItem,\n} from \"../content/index.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest } from \"../integrity/index.js\";\nimport {\n createManifest,\n readManifest,\n writeManifest,\n addManagedFile,\n} from \"../manifest/hatchJson.js\";\nimport { safeWriteFile } from \"../merge/safeWrite.js\";\nimport { AGENTS_DIR } from \"../types.js\";\nimport { HATCH3R_VERSION } from \"../version.js\";\nimport { AGENTS_MD_INNER, AGENTS_MD_FULL, generateCanonicalAgentsMd } from \"../cli/shared/agentsContent.js\";\nimport { findPackageRoot } from \"../cli/shared/paths.js\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname } from \"node:path\";\nimport { analyzeRepo } from \"../detect/repoAnalyzer.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry } from \"../env/mcpEnv.js\";\nimport { readWorkspaceManifest, writeWorkspaceManifest } from \"./manifest.js\";\nimport { resolveRepoConfig, buildSelectionFromIds } from \"./resolve.js\";\nimport { detectRepoGitIdentity } from \"./git.js\";\nimport type { WorkspaceManifest, WorkspaceRepoEntry, WorkspaceSyncResult, WorkspaceRepoSyncResult } from \"./types.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_ROOT = findPackageRoot(__dirname);\n\n/** Estimate token count from character count (~4 chars per token). */\nconst CHARS_PER_TOKEN = 4;\n\n/**\n * Estimate total tokens for a set of content IDs by summing the character\n * length of their source files and dividing by the chars-per-token ratio.\n */\nasync function estimateTokensForContent(\n contentIds: Set<string>,\n index: Awaited<ReturnType<typeof buildContentIndex>>,\n): Promise<number> {\n let totalChars = 0;\n for (const id of contentIds) {\n // Use getAllItemsById to handle cross-type collisions (e.g., command + skill with same ID)\n const items = getAllItemsById(index, id);\n for (const item of items) {\n try {\n if (item.type === \"skill\") {\n // For skills, read the SKILL.md file\n const skillPath = join(CONTENT_ROOT, item.relativePath, \"SKILL.md\");\n const content = await readFile(skillPath, \"utf-8\");\n totalChars += content.length;\n } else {\n const filePath = join(CONTENT_ROOT, item.relativePath);\n const content = await readFile(filePath, \"utf-8\");\n totalChars += content.length;\n }\n } catch {\n // File not readable; skip\n }\n }\n }\n return Math.ceil(totalChars / CHARS_PER_TOKEN);\n}\n\nexport interface WorkspaceSyncOptions {\n /** Only sync these repo paths (sync all opted-in repos if empty/undefined). */\n repos?: string[];\n /** Show what would change without modifying files. */\n dryRun?: boolean;\n /** Overwrite locally modified canonical files in sub-repos. */\n force?: boolean;\n /** Log callback for progress reporting. */\n onProgress?: (message: string) => void;\n /** Warning callback. */\n onWarn?: (message: string) => void;\n}\n\n/**\n * Sync workspace content to all (or selected) opted-in sub-repos.\n *\n * For each repo with sync=true:\n * 1. Resolve effective config (workspace defaults + repo overrides)\n * 2. Copy canonical content from workspace .agents/ to sub-repo .agents/\n * 3. Write sub-repo hatch.json with workspace provenance\n * 4. Run adapter generation for the sub-repo\n * 5. Generate integrity manifest\n */\nexport async function syncWorkspaceRepos(\n workspaceRoot: string,\n options: WorkspaceSyncOptions = {},\n): Promise<WorkspaceSyncResult> {\n const wsManifest = await readWorkspaceManifest(workspaceRoot);\n if (!wsManifest) {\n return { repos: [] };\n }\n\n const wsChecksum = createHash(\"sha256\")\n .update(JSON.stringify(wsManifest))\n .digest(\"hex\");\n\n // Build content index from workspace .agents/ (which has the canonical content)\n const index = await buildContentIndex(CONTENT_ROOT);\n const protectedIds = new Set(\n index.items.filter((item) => item.protected).map((item) => item.id),\n );\n\n // Select target repos\n const targetRepos = options.repos?.length\n ? wsManifest.repos.filter((r) => options.repos!.includes(r.path))\n : wsManifest.repos.filter((r) => r.sync);\n\n const results: WorkspaceRepoSyncResult[] = [];\n\n for (const repoEntry of targetRepos) {\n try {\n const result = await syncSingleRepo(\n workspaceRoot,\n wsManifest,\n wsChecksum,\n repoEntry,\n index,\n protectedIds,\n options,\n );\n results.push(result);\n } catch (err) {\n results.push({\n path: repoEntry.path,\n added: [],\n removed: [],\n toolsSynced: [],\n action: \"error\",\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Update workspace manifest with lastSync timestamps (unless dry-run)\n if (!options.dryRun) {\n const now = new Date().toISOString();\n for (const result of results) {\n if (result.action === \"synced\") {\n const entry = wsManifest.repos.find((r) => r.path === result.path);\n if (entry) entry.lastSync = now;\n }\n }\n await writeWorkspaceManifest(workspaceRoot, wsManifest);\n }\n\n return { repos: results };\n}\n\nasync function syncSingleRepo(\n workspaceRoot: string,\n wsManifest: WorkspaceManifest,\n wsChecksum: string,\n repoEntry: WorkspaceRepoEntry,\n index: Awaited<ReturnType<typeof buildContentIndex>>,\n protectedIds: Set<string>,\n options: WorkspaceSyncOptions,\n): Promise<WorkspaceRepoSyncResult> {\n const repoDir = join(workspaceRoot, repoEntry.path);\n const repoAgentsDir = join(repoDir, AGENTS_DIR);\n\n // Verify repo directory exists\n try {\n await access(repoDir);\n } catch {\n return {\n path: repoEntry.path,\n added: [],\n removed: [],\n toolsSynced: [],\n action: \"error\",\n error: `Directory not found: ${repoEntry.path}`,\n };\n }\n\n // Resolve effective config\n const resolved = resolveRepoConfig(wsManifest.defaults, repoEntry.overrides, protectedIds);\n const effectiveSelection = buildSelectionFromIds(resolved.contentIds, wsManifest.defaults.content, index.items);\n\n // Compute diff\n const existingManifest = await readManifest(repoDir);\n const previousIds = existingManifest?.content\n ? getAllContentIds(existingManifest.content)\n : new Set<string>();\n\n const toAdd = [...resolved.contentIds].filter((id) => !previousIds.has(id));\n const toRemove = [...previousIds].filter(\n (id) =>\n !resolved.contentIds.has(id) &&\n !existingManifest?.workspace?.localContent?.includes(id),\n );\n\n if (options.dryRun) {\n const estimatedTokens = await estimateTokensForContent(resolved.contentIds, index);\n return {\n path: repoEntry.path,\n added: toAdd,\n removed: toRemove,\n toolsSynced: resolved.tools,\n action: \"dry-run\",\n estimatedTokens,\n };\n }\n\n options.onProgress?.(`Syncing ${repoEntry.name ?? repoEntry.path}...`);\n\n // Ensure .agents/ exists\n await mkdir(repoAgentsDir, { recursive: true });\n\n // Copy selected content to sub-repo\n await copySelectedContent(CONTENT_ROOT, repoAgentsDir, effectiveSelection, index);\n\n // Remove stale content (handle cross-type collisions)\n for (const id of toRemove) {\n const items = getAllItemsById(index, id);\n for (const item of items) {\n await removeContentItem(repoAgentsDir, item, { rootDir: repoDir });\n }\n }\n\n // Generate AGENTS.md for sub-repo\n const canonicalAgentsMd = await generateCanonicalAgentsMd(repoAgentsDir);\n await safeWriteFile(join(repoAgentsDir, \"AGENTS.md\"), canonicalAgentsMd, { force: true });\n\n // Write sub-repo manifest — resolve per-repo git identity\n const repoInfo = await analyzeRepo(repoDir);\n\n // 1. Per-repo identity from workspace.json\n let gitOwner = repoEntry.owner ?? \"\";\n let gitRepo = repoEntry.repo ?? \"\";\n let gitBranch = repoEntry.defaultBranch ?? \"\";\n let gitPlatform = repoEntry.platform;\n\n // 2. Fallback: auto-detect from sub-repo's git remote\n if (!gitOwner && !gitRepo) {\n const identity = detectRepoGitIdentity(repoDir);\n gitOwner = identity.owner;\n gitRepo = identity.repo;\n gitBranch = gitBranch || identity.defaultBranch;\n gitPlatform = gitPlatform ?? identity.platform;\n }\n\n // 3. Fallback: existing manifest values\n if (!gitOwner && !gitRepo && existingManifest) {\n gitOwner = existingManifest.owner;\n gitRepo = existingManifest.repo;\n }\n\n if (!gitBranch) gitBranch = \"main\";\n\n const manifest = createManifest({\n platform: gitPlatform ?? resolved.platform,\n owner: gitOwner,\n repo: gitRepo,\n namespace: gitOwner,\n project: gitRepo,\n defaultBranch: gitBranch,\n tools: resolved.tools,\n features: resolved.features,\n mcpServers: resolved.mcp.servers,\n content: effectiveSelection,\n languages: repoInfo.languages,\n });\n\n // Add workspace provenance\n manifest.workspace = {\n rootPath: relative(repoDir, workspaceRoot),\n lastSync: new Date().toISOString(),\n syncVersion: HATCH3R_VERSION,\n workspaceChecksum: wsChecksum,\n excludedContent: resolved.excludedContent.length > 0 ? resolved.excludedContent : undefined,\n localContent: existingManifest?.workspace?.localContent,\n };\n\n if (resolved.models) {\n manifest.models = resolved.models;\n }\n\n await writeManifest(repoDir, manifest);\n\n // Generate root AGENTS.md for sub-repo\n await safeWriteFile(join(repoDir, \"AGENTS.md\"), AGENTS_MD_FULL, {\n managedContent: AGENTS_MD_INNER,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, \"AGENTS.md\");\n\n // Run adapter generation\n const toolsSynced: string[] = [];\n for (const tool of resolved.tools) {\n try {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(repoAgentsDir, manifest);\n for (const w of adapter.warnings) {\n options.onWarn?.(w);\n }\n for (const out of outputs) {\n await safeWriteFile(join(repoDir, out.path), out.content, {\n managedContent: out.managedContent,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, out.path);\n }\n toolsSynced.push(tool);\n } catch (err) {\n options.onWarn?.(\n `Failed to generate ${tool} output for ${repoEntry.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n // Write manifest again with managedFiles populated\n await writeManifest(repoDir, manifest);\n\n // Generate integrity manifest\n const integrityManifest = await generateIntegrityManifest(repoAgentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(repoAgentsDir, integrityManifest);\n\n // Ensure .env.mcp for MCP servers\n if (manifest.features.mcp && manifest.mcp.servers.length > 0) {\n await ensureEnvMcp(repoDir, manifest.mcp.servers);\n await ensureGitignoreEntry(repoDir);\n }\n\n return {\n path: repoEntry.path,\n added: toAdd,\n removed: toRemove,\n toolsSynced,\n action: \"synced\",\n };\n}\n","import { access, readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Framework, 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, frameworks] =\n await Promise.all([\n detectLanguages(rootDir),\n detectPackageManager(rootDir),\n detectMonorepo(rootDir),\n detectExistingAgents(rootDir),\n detectExistingTools(rootDir),\n detectFrameworks(rootDir),\n ]);\n const packageManager = pm.name;\n\n return {\n languages,\n packageManager,\n frameworks,\n isMonorepo,\n hasExistingAgents,\n existingTools,\n rootDir,\n };\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\n/** Framework indicators that rely on config-file presence. */\nconst FRAMEWORK_CONFIG_INDICATORS: { framework: Framework; configs: string[] }[] = [\n { framework: \"next\", configs: [\"next.config.js\", \"next.config.mjs\", \"next.config.ts\"] },\n { framework: \"angular\", configs: [\"angular.json\"] },\n { framework: \"svelte\", configs: [\"svelte.config.js\", \"svelte.config.ts\"] },\n { framework: \"nuxt\", configs: [\"nuxt.config.js\", \"nuxt.config.ts\"] },\n { framework: \"astro\", configs: [\"astro.config.mjs\", \"astro.config.ts\"] },\n];\n\n/**\n * Framework indicators that rely on package.json dependency names.\n *\n * Order matters: more-specific frameworks (Next.js, SvelteKit, Nuxt, Remix)\n * are checked first so that `react` / `vue` / `svelte` are only emitted when\n * no higher-level meta-framework already covers them.\n */\nconst FRAMEWORK_DEP_INDICATORS: { framework: Framework; deps: string[] }[] = [\n { framework: \"next\", deps: [\"next\"] },\n { framework: \"angular\", deps: [\"@angular/core\"] },\n { framework: \"sveltekit\", deps: [\"@sveltejs/kit\"] },\n { framework: \"svelte\", deps: [\"svelte\"] },\n { framework: \"nuxt\", deps: [\"nuxt\"] },\n { framework: \"remix\", deps: [\"@remix-run/react\"] },\n { framework: \"astro\", deps: [\"astro\"] },\n { framework: \"vue\", deps: [\"vue\"] },\n { framework: \"react\", deps: [\"react\"] },\n { framework: \"express\", deps: [\"express\"] },\n { framework: \"fastify\", deps: [\"fastify\"] },\n { framework: \"hono\", deps: [\"hono\"] },\n];\n\n/**\n * Meta-framework → base-framework suppression map.\n * When a meta-framework is detected, its base framework is suppressed to\n * avoid redundant entries (e.g. Next.js already implies React).\n */\nconst FRAMEWORK_SUPPRESSION: Partial<Record<Framework, Framework>> = {\n next: \"react\",\n remix: \"react\",\n nuxt: \"vue\",\n sveltekit: \"svelte\",\n};\n\nasync function detectFrameworks(rootDir: string): Promise<Framework[]> {\n const detected = new Set<Framework>();\n\n // 1. Config-file presence checks (parallel).\n const configResults = await Promise.allSettled(\n FRAMEWORK_CONFIG_INDICATORS.map(async ({ framework, configs }) => {\n for (const cfg of configs) {\n if (await pathExists(join(rootDir, cfg))) return framework;\n }\n return null;\n }),\n );\n\n for (const r of configResults) {\n if (r.status === \"fulfilled\" && r.value !== null) {\n detected.add(r.value);\n }\n }\n\n // 2. package.json dependency checks.\n try {\n const raw = await readFile(join(rootDir, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(raw);\n const allDeps: Record<string, string> = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n for (const { framework, deps } of FRAMEWORK_DEP_INDICATORS) {\n if (deps.some((d) => d in allDeps)) {\n detected.add(framework);\n }\n }\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === \"ENOENT\" || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n // 3. Suppress base frameworks when a meta-framework is present.\n for (const [meta, base] of Object.entries(FRAMEWORK_SUPPRESSION)) {\n if (detected.has(meta as Framework)) {\n detected.delete(base as Framework);\n }\n }\n\n return [...detected];\n}\n\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.frameworks.length > 0) {\n lines.push(`Frameworks: ${info.frameworks.join(\", \")}`);\n }\n\n if (info.existingTools.length > 0) {\n lines.push(`Existing tool configs: ${info.existingTools.join(\", \")}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import { getAllContentIds, TYPE_TO_SELECTION_KEY } from \"../content/index.js\";\nimport type { ContentSelection, Features, McpConfig, ModelConfig, Platform, Tool } from \"../types.js\";\nimport type { WorkspaceDefaults, WorkspaceRepoOverrides } from \"./types.js\";\n\nexport interface ResolvedRepoConfig {\n platform?: Platform;\n tools: Tool[];\n features: Features;\n mcp: McpConfig;\n models?: ModelConfig;\n /** Effective content IDs after merge (workspace base + include - exclude). */\n contentIds: Set<string>;\n /** Content IDs excluded by the repo override. */\n excludedContent: string[];\n /** Content IDs added by the repo override. */\n addedContent: string[];\n}\n\n/**\n * Merge workspace defaults with per-repo overrides to produce effective config.\n *\n * Merge rules:\n * - tools: repo overrides replace entirely (not merged)\n * - features: partial merge (repo values override workspace values)\n * - mcp: repo overrides replace entirely\n * - content: workspace base + include - exclude (protected items cannot be excluded)\n * - models: deep merge (repo agent overrides take precedence)\n * - platform: repo overrides replace\n */\nexport function resolveRepoConfig(\n defaults: WorkspaceDefaults,\n overrides?: WorkspaceRepoOverrides,\n protectedIds?: Set<string>,\n): ResolvedRepoConfig {\n const tools = overrides?.tools ?? defaults.tools;\n const features = { ...defaults.features, ...(overrides?.features ?? {}) } as Features;\n const mcp = overrides?.mcp ?? defaults.mcp;\n const platform = overrides?.platform ?? defaults.platform;\n\n // Models: deep merge (agent-level overrides take precedence)\n let models: ModelConfig | undefined;\n if (defaults.models || overrides?.models) {\n models = {\n ...defaults.models,\n ...overrides?.models,\n agents: {\n ...defaults.models?.agents,\n ...overrides?.models?.agents,\n },\n };\n if (!models.default && !models.agents) models = undefined;\n }\n\n // Content: start from workspace, apply include/exclude\n const contentIds = getAllContentIds(defaults.content);\n const excludedContent: string[] = [];\n const addedContent: string[] = [];\n\n if (overrides?.contentOverrides?.exclude) {\n for (const id of overrides.contentOverrides.exclude) {\n // Protected items cannot be excluded\n if (protectedIds?.has(id)) continue;\n if (contentIds.has(id)) {\n contentIds.delete(id);\n excludedContent.push(id);\n }\n }\n }\n\n if (overrides?.contentOverrides?.include) {\n for (const id of overrides.contentOverrides.include) {\n if (!contentIds.has(id)) {\n contentIds.add(id);\n addedContent.push(id);\n }\n }\n }\n\n return { platform, tools, features, mcp, models, contentIds, excludedContent, addedContent };\n}\n\n/**\n * Build a ContentSelection object from a set of content IDs and the\n * workspace base selection (to preserve preset/projectType/teamSize metadata).\n */\nexport function buildSelectionFromIds(\n ids: Set<string>,\n baseSelection: ContentSelection,\n allItems: { id: string; type: string }[],\n): ContentSelection {\n const items: ContentSelection[\"items\"] = {\n agents: [],\n skills: [],\n rules: [],\n commands: [],\n prompts: [],\n hooks: [],\n githubAgents: [],\n };\n\n for (const item of allItems) {\n if (!ids.has(item.id)) continue;\n const key = TYPE_TO_SELECTION_KEY[item.type];\n if (key) items[key].push(item.id);\n }\n\n return {\n preset: \"custom\",\n projectType: baseSelection.projectType,\n teamSize: baseSelection.teamSize,\n items,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\n\n// ── Git Identity ───────────────────────────────────────────────\n\nexport interface RepoGitIdentity {\n owner: string;\n repo: string;\n defaultBranch: string;\n platform: Platform;\n}\n\n// ── Detection Functions ────────────────────────────────────────\n\nexport function parseGitRemote(cwd?: string): { owner: string; repo: string } {\n try {\n const url = execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd,\n stdio: \"pipe\",\n })\n .toString()\n .trim();\n\n const sshMatch = url.match(/[:\\/]([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return { owner: \"\", repo: \"\" };\n } catch {\n return { owner: \"\", repo: \"\" };\n }\n}\n\nexport function parseGitDefaultBranch(cwd?: string): string {\n try {\n const ref = execFileSync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"origin/HEAD\"], {\n cwd,\n stdio: \"pipe\",\n })\n .toString()\n .trim();\n if (ref && ref.startsWith(\"origin/\")) {\n return ref.replace(/^origin\\//, \"\");\n }\n return \"main\";\n } catch {\n return \"main\";\n }\n}\n\nexport function detectPlatformFromRemote(remoteUrl: string): Platform {\n if (remoteUrl.includes(\"dev.azure.com\") || remoteUrl.includes(\"visualstudio.com\")) return \"azure-devops\";\n if (remoteUrl.includes(\"gitlab.com\") || remoteUrl.includes(\"gitlab.\")) return \"gitlab\";\n return \"github\";\n}\n\nexport function getGitRemoteUrl(cwd?: string): string {\n try {\n return execFileSync(\"git\", [\"remote\", \"get-url\", \"origin\"], { cwd, stdio: \"pipe\" }).toString().trim();\n } catch {\n return \"\";\n }\n}\n\n// ── Composite Detection ────────────────────────────────────────\n\n/**\n * Auto-detect git identity for a repository directory.\n * Returns owner, repo, defaultBranch, and platform by inspecting the git remote.\n */\nexport function detectRepoGitIdentity(repoDir: string): RepoGitIdentity {\n const remoteUrl = getGitRemoteUrl(repoDir);\n const { owner, repo } = parseGitRemote(repoDir);\n const defaultBranch = parseGitDefaultBranch(repoDir);\n const platform = remoteUrl ? detectPlatformFromRemote(remoteUrl) : \"github\";\n\n return { owner, repo, defaultBranch, platform };\n}\n","import { readFileSync } from \"node:fs\";\nimport {\n TOOLS,\n AVAILABLE_MCP_SERVERS,\n type Tool,\n type Features,\n type Platform,\n} from \"../../types.js\";\n\nexport const TOOL_DISPLAY_NAMES: Record<Tool, string> = {\n cursor: \"Cursor\",\n copilot: \"GitHub Copilot\",\n claude: \"Claude Code\",\n opencode: \"OpenCode\",\n windsurf: \"Windsurf\",\n amp: \"Amp\",\n codex: \"Codex CLI\",\n gemini: \"Gemini CLI\",\n cline: \"Cline / Roo Code\",\n aider: \"Aider\",\n kiro: \"Kiro\",\n goose: \"Goose\",\n zed: \"Zed\",\n \"amazon-q\": \"Amazon Q\",\n antigravity: \"Antigravity\",\n};\n\nexport const TOOL_PROMPT_CHOICES: { name: string; value: Tool }[] = TOOLS.map((t) => ({\n name: TOOL_DISPLAY_NAMES[t],\n value: t,\n}));\n\nexport const FEATURE_CHOICES: { name: string; value: keyof Features }[] = [\n { name: \"Agents\", value: \"agents\" },\n { name: \"Skills\", value: \"skills\" },\n { name: \"Rules\", value: \"rules\" },\n { name: \"Prompts\", value: \"prompts\" },\n { name: \"Commands\", value: \"commands\" },\n { name: \"MCP\", value: \"mcp\" },\n { name: \"Hooks\", value: \"hooks\" },\n { name: \"GitHub agents\", value: \"githubAgents\" },\n];\n\nexport const MCP_CHOICES = Object.entries(AVAILABLE_MCP_SERVERS).map(([id, meta]) => ({\n name: `${id}: ${meta.description}`,\n value: id,\n}));\n\nexport const PLATFORM_DISPLAY_NAMES: Record<Platform, string> = {\n github: \"GitHub\",\n \"azure-devops\": \"Azure DevOps\",\n gitlab: \"GitLab\",\n};\n\nexport const PLATFORM_MCP_SERVER: Record<Platform, string> = {\n github: \"github\",\n \"azure-devops\": \"azure-devops\",\n gitlab: \"gitlab\",\n};\n\n/**\n * Maps tools to their command invocation syntax (how users trigger hatch3r commands).\n * Tools that use slash commands get \"/\", others get a description of how to invoke.\n */\nexport const TOOL_COMMAND_SYNTAX: Record<Tool, string> = {\n cursor: \"/\",\n copilot: \"/\",\n claude: \"/\",\n opencode: \"/\",\n windsurf: \"run workflow \",\n amp: \"/\",\n codex: \"prompt with \",\n gemini: \"/\",\n cline: \"run workflow \",\n aider: \"prompt with \",\n kiro: \"/\",\n goose: \"prompt with \",\n zed: \"/\",\n \"amazon-q\": \"/\",\n antigravity: \"/\",\n};\n\n/**\n * Returns a user-facing string showing how to invoke a command for the given tool(s).\n * If all selected tools use slash-command syntax, returns \"/command-name\".\n * Otherwise returns a generic phrasing.\n */\nexport function formatCommandHint(tools: Tool[], commandName: string): string {\n const allSlash = tools.every((t) => TOOL_COMMAND_SYNTAX[t] === \"/\");\n if (allSlash) {\n return `/${commandName}`;\n }\n return `the ${commandName} command`;\n}\n\n/**\n * Per-editor notes about how MCP secrets (.env.mcp) are loaded.\n * Surfaced during tool selection to avoid post-init confusion.\n */\nexport const TOOL_SECRET_NOTES: Partial<Record<Tool, string>> = {\n cursor: \"Cursor: auto-loads .env.mcp from project root\",\n copilot: \"VS Code / Copilot: auto-loads .env.mcp from project root\",\n claude: \"Claude Code: reads .env.mcp via shell sourcing (run `set -a && source .env.mcp && set +a` before starting)\",\n windsurf: \"Windsurf: auto-loads .env.mcp from project root\",\n cline: \"Cline / Roo Code: reads env from VS Code settings; copy values to .vscode/settings.json or use shell sourcing\",\n amp: \"Amp: reads env from shell; source .env.mcp in your shell profile\",\n codex: \"Codex CLI: reads env from shell; source .env.mcp before running\",\n gemini: \"Gemini CLI: reads env from shell; source .env.mcp before running\",\n aider: \"Aider: reads env from shell; source .env.mcp before running\",\n opencode: \"OpenCode: reads env from shell; source .env.mcp before running\",\n};\n\nexport function sanitizeInput(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"\");\n}\n\nexport function isWSL(): boolean {\n if (process.env.WSL_DISTRO_NAME) return true;\n try {\n return /microsoft|wsl/i.test(readFileSync(\"/proc/version\", \"utf-8\"));\n } catch {\n return false;\n }\n}\n","import { access, mkdir, readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { basename, dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport {\n createManifest,\n readManifest,\n writeManifest,\n addManagedFile,\n} from \"../../manifest/hatchJson.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport {\n AGENTS_DIR,\n DEFAULT_FEATURES,\n HatchError,\n VALID_TOOLS,\n WORKTREE_INCLUDE_FILE,\n type ContentSelection,\n type Features,\n type Platform,\n type RepoInfo,\n type Tool,\n} from \"../../types.js\";\nimport { analyzeRepo } from \"../../detect/repoAnalyzer.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { AGENTS_MD_INNER, AGENTS_MD_FULL, generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n info,\n error as logError,\n step,\n label,\n warn,\n} from \"../shared/ui.js\";\nimport { findPackageRoot } from \"../shared/paths.js\";\nimport { TOOL_DISPLAY_NAMES, TOOL_PROMPT_CHOICES, FEATURE_CHOICES, MCP_CHOICES, PLATFORM_DISPLAY_NAMES, PLATFORM_MCP_SERVER, sanitizeInput, isWSL, formatCommandHint, TOOL_SECRET_NOTES } from \"../shared/constants.js\";\nimport { generateIntegrityManifest, writeIntegrityManifest } from \"../../integrity/index.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport { buildContentIndex, resolveSelection, copySelectedContent, countSelectionItems, selectionSummary, getAllContentIds, removeContentItem, validateOrchestrationDependencies, countPresetExclusions, countProjectTypeExclusions, countTeamSizeExclusions, estimatePresetItemCount } from \"../../content/index.js\";\nimport { PRESETS, getPreset, type PresetId } from \"../../content/presets.js\";\nimport { detectSubRepos, shouldSuggestWorkspace } from \"../../workspace/detect.js\";\nimport { createWorkspaceManifest, writeWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport type { WorkspaceRepoEntry } from \"../../workspace/types.js\";\nimport { parseGitRemote, parseGitDefaultBranch, getGitRemoteUrl, detectPlatformFromRemote, detectRepoGitIdentity } from \"../../workspace/git.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst CONTENT_ROOT = findPackageRoot(__dirname);\n\nconst DEFAULT_TOOLS: Tool[] = [\"cursor\"];\nconst DEFAULT_FEATURE_KEYS = Object.keys(DEFAULT_FEATURES) as (keyof Features)[];\nconst DEFAULT_MCP: string[] = [\"playwright\", \"github\", \"context7\"];\n\n/**\n * Check if a content selection includes any board-related content.\n * Board content IDs follow the pattern \"hatch3r-board-*\".\n */\nfunction selectionHasBoardContent(selection: ContentSelection): boolean {\n return selection.items.commands.some((id) => id.startsWith(\"hatch3r-board\"));\n}\n\n/**\n * Surface board command prerequisites when board content is included in the selection.\n * Board commands require GitHub Projects V2 and a PAT with the `project` scope.\n */\nfunction warnBoardPrerequisites(selection: ContentSelection): void {\n if (!selectionHasBoardContent(selection)) return;\n info(\n `Board commands selected. Prerequisites: ${chalk.bold(\"GitHub Projects V2\")} must be enabled ` +\n `and your PAT needs the ${chalk.bold(\"project\")} scope. ` +\n `See ${chalk.dim(\"https://docs.github.com/en/issues/planning-and-tracking-with-projects\")}`,\n );\n}\n\n// Git detection functions imported from ../../workspace/git.js\n\nfunction deriveWorkspacePlatform(identities: Array<{ platform: Platform }>): Platform {\n const counts = new Map<Platform, number>();\n for (const id of identities) {\n counts.set(id.platform, (counts.get(id.platform) ?? 0) + 1);\n }\n let best: Platform = \"github\";\n let max = 0;\n for (const [p, c] of counts) { if (c > max) { best = p; max = c; } }\n return best;\n}\n\ninterface RunInitOptions {\n rootDir: string;\n platform: Platform;\n owner: string;\n repo: string;\n namespace: string;\n project: string;\n defaultBranch: string;\n tools: Tool[];\n features: Features;\n mcpServers: string[];\n repoInfo: RepoInfo;\n contentSelection: ContentSelection;\n}\n\nasync function runInit(options: RunInitOptions): Promise<void> {\n const { rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection } = options;\n const agentsDir = join(rootDir, AGENTS_DIR);\n const totalSteps = 4;\n\n const s1 = createSpinner(step(1, totalSteps, \"Creating canonical files...\"));\n s1.start();\n await mkdir(agentsDir, { recursive: true });\n\n // Detect re-init: check if manifest exists and compute content delta\n const existingManifest = await readManifest(rootDir);\n\n // Build content index from package and copy only selected items\n const index = await buildContentIndex(CONTENT_ROOT);\n await copySelectedContent(CONTENT_ROOT, agentsDir, contentSelection, index);\n\n // Clean up stale content from previous init\n if (existingManifest?.content) {\n const oldIds = getAllContentIds(existingManifest.content);\n const newIds = getAllContentIds(contentSelection);\n for (const id of oldIds) {\n if (!newIds.has(id)) {\n const item = index.byId.get(id);\n if (item) await removeContentItem(agentsDir, item, { rootDir });\n }\n }\n }\n\n await mkdir(join(agentsDir, \"learnings\"), { recursive: true });\n\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n try {\n const mcpRaw = await readFile(mcpPath, \"utf-8\");\n const mcpParsed = JSON.parse(mcpRaw) as { mcpServers?: Record<string, Record<string, unknown>> };\n if (mcpParsed.mcpServers) {\n const selected = new Set(mcpServers);\n const filtered: Record<string, Record<string, unknown>> = {};\n for (const [name, server] of Object.entries(mcpParsed.mcpServers)) {\n if (!selected.has(name)) continue;\n const entry = { ...server };\n delete entry._disabled;\n filtered[name] = entry;\n }\n await safeWriteFile(\n mcpPath,\n JSON.stringify({ mcpServers: filtered }, null, 2) + \"\\n\",\n { force: true },\n );\n }\n } catch (err) {\n const isExpected = (err as NodeJS.ErrnoException).code === 'ENOENT' || err instanceof SyntaxError;\n if (!isExpected) throw err;\n }\n\n // Generate dynamic AGENTS.md based on what's actually installed\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd, { force: true });\n\n s1.succeed(step(1, totalSteps, `Canonical files created (${countSelectionItems(contentSelection)} items)`));\n\n const s2 = createSpinner(step(2, totalSteps, \"Writing manifest...\"));\n s2.start();\n const manifest = createManifest({ platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, content: contentSelection, languages: repoInfo.languages });\n await writeManifest(rootDir, manifest);\n s2.succeed(step(2, totalSteps, \"Manifest written\"));\n\n const s3 = createSpinner(\n step(3, totalSteps, `Generating ${tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")} output...`),\n );\n s3.start();\n // On init, preserve existing user content: prepend managed block if file has no markers.\n await safeWriteFile(join(rootDir, \"AGENTS.md\"), AGENTS_MD_FULL, {\n managedContent: AGENTS_MD_INNER,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, \"AGENTS.md\");\n\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of tools) {\n const adapter = getAdapter(tool);\n try {\n const outputs = await adapter.generate(agentsDir, manifest);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n await safeWriteFile(join(rootDir, out.path), out.content, {\n managedContent: out.managedContent,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, out.path);\n }\n } catch (err) {\n adapterFailures.push({\n tool: TOOL_DISPLAY_NAMES[tool] ?? tool,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === tools.length) {\n s3.fail(step(3, totalSteps, \"All adapters failed\"));\n throw new HatchError(\"All adapters failed\", 1, \"ADAPTER_ERROR\");\n }\n }\n s3.succeed(step(3, totalSteps, adapterFailures.length > 0\n ? `Adapter output generated (${adapterFailures.length} failed)`\n : \"Adapter output generated\"));\n\n for (const tool of tools) {\n const warnings = getUnsupportedFeatureWarnings(tool, manifest);\n for (const w of warnings) {\n warn(w);\n }\n }\n\n // Generate .worktreeinclude for worktree-capable tools\n const worktreeCapableTools = new Set([\"claude\"]);\n const hasWorktreeTool = tools.some(t => worktreeCapableTools.has(t));\n if (hasWorktreeTool) {\n manifest.worktree = manifest.worktree ?? { enabled: true };\n }\n if (manifest.worktree?.enabled) {\n const wtContent = await generateWorktreeInclude(manifest, rootDir);\n const wtManaged = extractManagedContent(wtContent);\n await safeWriteFile(join(rootDir, WORKTREE_INCLUDE_FILE), wtContent, {\n managedContent: wtManaged,\n appendIfNoBlock: true,\n });\n addManagedFile(manifest, WORKTREE_INCLUDE_FILE);\n }\n\n const s4 = createSpinner(step(4, totalSteps, \"Finalizing...\"));\n s4.start();\n await writeManifest(rootDir, manifest);\n\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n\n let envResult: { action: string; path: string; newVars: string[] } | undefined;\n if (features.mcp && mcpServers.length > 0) {\n envResult = await ensureEnvMcp(rootDir, mcpServers);\n await ensureGitignoreEntry(rootDir);\n }\n\n s4.succeed(step(4, totalSteps, \"Done\"));\n\n console.log();\n const enabledFeatures = Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n const presetLabel = contentSelection.preset.charAt(0).toUpperCase() + contentSelection.preset.slice(1);\n const summaryLines = [\n label(\"Profile\", `${presetLabel} (${contentSelection.projectType}, ${contentSelection.teamSize})`),\n label(\"Content\", `${countSelectionItems(contentSelection)} items (${selectionSummary(contentSelection)})`),\n label(\"Tools\", tools.map((t) => TOOL_DISPLAY_NAMES[t] ?? t).join(\", \")),\n label(\"Features\", enabledFeatures.join(\", \")),\n ];\n if (owner || repo) {\n const platformLabel = PLATFORM_DISPLAY_NAMES[platform];\n summaryLines.push(label(platformLabel, `${namespace || owner}/${project || repo}`));\n }\n if (defaultBranch) {\n summaryLines.push(label(\"Default branch\", defaultBranch));\n }\n if (mcpServers.length > 0) {\n summaryLines.push(label(\"MCP\", mcpServers.join(\", \")));\n }\n if (manifest.worktree?.enabled) {\n summaryLines.push(label(\"Worktree\", \"isolation enabled\"));\n }\n if (envResult && envResult.action !== \"skipped\") {\n summaryLines.push(label(\"Secrets\", `.env.mcp (fill in your API keys)`));\n }\n summaryLines.push(\"\");\n summaryLines.push(label(\"Canonical\", `${AGENTS_DIR}/`));\n summaryLines.push(label(\"Manifest\", `${AGENTS_DIR}/hatch.json`));\n\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n summaryLines.push(\"\");\n if (isGreenfield) {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(formatCommandHint(tools, \"project-spec\"))} to define your new project`);\n } else {\n summaryLines.push(`${chalk.cyan(\"→\")} Run ${chalk.bold(formatCommandHint(tools, \"codebase-map\"))} to map your existing codebase`);\n }\n\n if (envResult && envResult.newVars.length > 0) {\n summaryLines.push(\"\");\n summaryLines.push(`${chalk.yellow(\"!\")} Add your secrets to ${chalk.bold(\".env.mcp\")}: ${envResult.newVars.join(\", \")}`);\n summaryLines.push(` Then run: ${chalk.dim(getSourceEnvMcpCommand())}`);\n }\n\n printBox(\"Hatch complete\", summaryLines, \"success\");\n}\n\nasync function checkExisting(rootDir: string, skipPrompt: boolean, newSelection?: ContentSelection): Promise<void> {\n const hatchJsonPath = join(rootDir, AGENTS_DIR, \"hatch.json\");\n try {\n await access(hatchJsonPath);\n if (!skipPrompt) {\n let message = \"Existing .agents/ found. This will overwrite managed files. Continue?\";\n\n // Compute removal count if we have both old and new selections\n if (newSelection) {\n const existingManifest = await readManifest(rootDir);\n if (existingManifest?.content) {\n const oldIds = getAllContentIds(existingManifest.content);\n const newIds = getAllContentIds(newSelection);\n let removeCount = 0;\n for (const id of oldIds) {\n if (!newIds.has(id)) removeCount++;\n }\n if (removeCount > 0) {\n const oldPreset = existingManifest.content.preset.charAt(0).toUpperCase() + existingManifest.content.preset.slice(1);\n const newPreset = newSelection.preset.charAt(0).toUpperCase() + newSelection.preset.slice(1);\n message = `Existing .agents/ found. ${removeCount} content item(s) will be removed (switching from ${oldPreset} to ${newPreset}). Continue?`;\n }\n }\n }\n\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message,\n default: false,\n },\n ]);\n if (!proceed) {\n console.log(chalk.dim(\"\\n Init cancelled.\\n\"));\n throw new HatchError(\"Init cancelled.\", 0);\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nfunction validateFlag<T extends string>(value: string | undefined, valid: T[], fallback: T, name: string): T {\n if (!value) return fallback;\n if (!(valid as string[]).includes(value)) {\n logError(`Invalid --${name}: \"${value}\". Valid: ${valid.join(\", \")}`);\n throw new HatchError(`Invalid --${name}: \"${value}\"`, 1, \"VALIDATION_ERROR\");\n }\n return value as T;\n}\n\nexport async function initCommand(\n opts: {\n tools?: string;\n yes?: boolean;\n preset?: string;\n projectType?: string;\n teamSize?: string;\n workspace?: boolean;\n } = {},\n): Promise<void> {\n printBanner();\n\n const rootDir = process.cwd();\n\n // Workspace auto-detection: if no .git but has git subdirectories, suggest workspace mode\n if (!opts.workspace) {\n const suggestWs = await shouldSuggestWorkspace(rootDir);\n if (suggestWs) {\n const detectedRepos = await detectSubRepos(rootDir);\n if (opts.yes) {\n opts.workspace = true;\n info(chalk.dim(`No git repo found. ${detectedRepos.length} git repo(s) detected in subdirectories — initializing as workspace.`));\n } else {\n info(`No git repo found, but ${detectedRepos.length} git repo(s) detected in subdirectories.`);\n const { useWorkspace } = await inquirer.prompt<{ useWorkspace: boolean }>([\n {\n type: \"confirm\",\n name: \"useWorkspace\",\n message: \"Initialize as a multi-repo workspace?\",\n default: true,\n },\n ]);\n opts.workspace = useWorkspace;\n }\n }\n }\n\n // Workspace: branch into dedicated flow that skips single-repo identity prompts\n if (opts.workspace) {\n const detectedRepos = await detectSubRepos(rootDir);\n const repoInfo = await analyzeRepo(rootDir);\n await runWorkspaceInit(rootDir, detectedRepos, repoInfo, opts);\n return;\n }\n\n const detectSpinner = createSpinner(\"Detecting repository...\");\n detectSpinner.start();\n const repoInfo = await analyzeRepo(rootDir);\n const remote = parseGitRemote();\n detectSpinner.succeed(\"Repository detected\");\n\n const detected: string[] = [];\n if (repoInfo.languages.length > 0 && repoInfo.languages[0] !== \"unknown\") {\n detected.push(...repoInfo.languages);\n }\n if (repoInfo.packageManager !== \"unknown\") {\n detected.push(repoInfo.packageManager);\n }\n if (repoInfo.isMonorepo) detected.push(\"monorepo\");\n if (detected.length > 0) {\n info(chalk.dim(`Detected: ${detected.join(\", \")}`));\n }\n\n if (opts.yes) {\n const remoteUrl = getGitRemoteUrl();\n const platform = detectPlatformFromRemote(remoteUrl);\n const owner = sanitizeInput(remote.owner);\n const repo = sanitizeInput(remote.repo);\n const namespace = owner;\n const project = repo;\n\n let tools: Tool[];\n if (opts.tools) {\n const rawTools = opts.tools.split(\",\").map((t) => t.trim());\n const invalid = rawTools.filter((t) => !VALID_TOOLS.has(t));\n if (invalid.length > 0) {\n logError(`Invalid tool(s): ${invalid.join(\", \")}`);\n console.log(chalk.dim(` Valid tools: ${[...VALID_TOOLS].join(\", \")}`));\n throw new HatchError(`Invalid tool(s): ${invalid.join(\", \")}`, 1, \"VALIDATION_ERROR\");\n }\n tools = rawTools as Tool[];\n } else if (repoInfo.existingTools.length > 0) {\n tools = repoInfo.existingTools;\n } else {\n tools = DEFAULT_TOOLS;\n }\n\n const features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const defaultBranch = parseGitDefaultBranch();\n\n // Use CLI flags with validation, falling back to auto-detect / defaults\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const presetId = validateFlag(opts.preset, [\"minimal\", \"standard\", \"full\"], \"standard\", \"preset\");\n const projectType = validateFlag(opts.projectType, [\"greenfield\", \"brownfield\"], isGreenfield ? \"greenfield\" : \"brownfield\", \"project-type\");\n const teamSize = validateFlag(opts.teamSize, [\"solo\", \"team\"], \"solo\", \"team-size\");\n const preset = getPreset(presetId);\n const index = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(preset, projectType, teamSize, index);\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n await checkExisting(rootDir, true, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\n return;\n }\n\n console.log();\n\n const remoteUrl = getGitRemoteUrl();\n const detectedPlatform = detectPlatformFromRemote(remoteUrl);\n\n const platformAnswer = await inquirer.prompt<{ platform: Platform }>([\n {\n type: \"list\",\n name: \"platform\",\n message: \"Select your platform:\",\n choices: [\n { name: \"GitHub\", value: \"github\" as Platform },\n { name: \"Azure DevOps\", value: \"azure-devops\" as Platform },\n { name: \"GitLab\", value: \"gitlab\" as Platform },\n ],\n default: detectedPlatform,\n },\n ]);\n const platform = platformAnswer.platform;\n\n let owner: string;\n let repo: string;\n let namespace: string;\n let project: string;\n\n if (platform === \"azure-devops\") {\n const adoAnswers = await inquirer.prompt<{ org: string; project: string; repo: string }>([\n { type: \"input\", name: \"org\", message: \"Azure DevOps organization:\", default: remote.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Azure DevOps project:\" },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(adoAnswers.org);\n repo = sanitizeInput(adoAnswers.repo);\n namespace = owner;\n project = sanitizeInput(adoAnswers.project);\n } else if (platform === \"gitlab\") {\n const glAnswers = await inquirer.prompt<{ namespace: string; project: string }>([\n { type: \"input\", name: \"namespace\", message: \"GitLab namespace (group or username):\", default: remote.owner || undefined },\n { type: \"input\", name: \"project\", message: \"Project name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(glAnswers.namespace);\n repo = sanitizeInput(glAnswers.project);\n namespace = owner;\n project = repo;\n } else {\n const repoAnswers = await inquirer.prompt<{ owner: string; repo: string }>([\n { type: \"input\", name: \"owner\", message: \"GitHub owner (org or username):\", default: remote.owner || undefined },\n { type: \"input\", name: \"repo\", message: \"Repository name:\", default: remote.repo || undefined },\n ]);\n owner = sanitizeInput(repoAnswers.owner);\n repo = sanitizeInput(repoAnswers.repo);\n namespace = owner;\n project = repo;\n }\n\n const defaultBranchDefault = parseGitDefaultBranch();\n const defaultBranchAnswers = await inquirer.prompt<{ defaultBranch: string }>([\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch (for checkout, PR base, release):\",\n default: defaultBranchDefault,\n },\n ]);\n const defaultBranch = defaultBranchAnswers.defaultBranch.trim() || defaultBranchDefault;\n\n // --- Project type (with filter exclusion counts) ---\n const filterIndex = await buildContentIndex(CONTENT_ROOT);\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const greenfieldExcl = countProjectTypeExclusions(\"greenfield\", filterIndex.items);\n const brownfieldExcl = countProjectTypeExclusions(\"brownfield\", filterIndex.items);\n const projectTypeAnswer = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"list\",\n name: \"projectType\",\n message: \"Is this a new (greenfield) or existing (brownfield) project?\",\n choices: [\n { name: `Greenfield — new project from scratch${greenfieldExcl > 0 ? ` (filters out ${greenfieldExcl} brownfield-only item${greenfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"greenfield\" as const },\n { name: `Brownfield — existing codebase${brownfieldExcl > 0 ? ` (filters out ${brownfieldExcl} greenfield-only item${brownfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n // --- Team size (with filter exclusion counts) ---\n const soloExcl = countTeamSizeExclusions(\"solo\", filterIndex.items);\n const teamSizeAnswer = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"list\",\n name: \"teamSize\",\n message: \"Solo developer or team collaboration?\",\n choices: [\n { name: `Solo — just me${soloExcl > 0 ? ` (filters out ${soloExcl} team-only item${soloExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"solo\" as const },\n { name: \"Team — multiple contributors\", value: \"team\" as const },\n ],\n default: \"solo\",\n },\n ]);\n const teamSize = teamSizeAnswer.teamSize;\n\n // --- Content preset (with exclusion counts) ---\n const totalItems = filterIndex.items.length;\n const presetAnswer = await inquirer.prompt<{ preset: PresetId }>([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Select content profile:\",\n choices: PRESETS.map((p) => {\n const excluded = countPresetExclusions(p, filterIndex);\n const estimated = p.id !== \"custom\" ? estimatePresetItemCount(p, projectType, teamSize, filterIndex) : 0;\n const countHint = estimated > 0 ? ` (~${estimated} items)` : \"\";\n const suffix = excluded > 0 ? ` (excludes ${excluded} of ${totalItems})` : \"\";\n return {\n name: `${p.name} — ${p.description}${countHint}${suffix}`,\n value: p.id,\n };\n }),\n default: \"standard\" as PresetId,\n },\n ]);\n const selectedPreset = getPreset(presetAnswer.preset);\n\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n // --- Custom content selection ---\n // #148 (D19-19): Group content by tags in custom profile display\n let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = filterIndex;\n const tagGroups = new Map<string, typeof contentIndex.items>();\n for (const item of contentIndex.items) {\n const primaryTag = item.tags[0] ?? \"other\";\n if (!tagGroups.has(primaryTag)) tagGroups.set(primaryTag, []);\n tagGroups.get(primaryTag)!.push(item);\n }\n\n // Build grouped choices with separators\n const TAG_LABELS: Record<string, string> = {\n core: \"Core\", planning: \"Planning\", implementation: \"Implementation\",\n review: \"Review\", devops: \"DevOps\", maintenance: \"Maintenance\",\n greenfield: \"Greenfield\", brownfield: \"Brownfield\", board: \"Board\",\n security: \"Security\", a11y: \"Accessibility\", performance: \"Performance\",\n customize: \"Customization\", other: \"Other\",\n };\n const groupedChoices: Array<InstanceType<typeof inquirer.Separator> | { name: string; value: string; checked: boolean }> = [];\n for (const [tag, items] of tagGroups) {\n groupedChoices.push(new inquirer.Separator(`── ${TAG_LABELS[tag] ?? tag} (${items.length}) ──`));\n for (const item of items) {\n groupedChoices.push({\n name: `${item.type}: ${item.id.replace(/^hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: item.protected || item.tags.includes(\"core\"),\n });\n }\n }\n\n const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: groupedChoices,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n customSelections = customAnswer.items;\n }\n\n const toolDefaults = repoInfo.existingTools.length > 0 ? repoInfo.existingTools : DEFAULT_TOOLS;\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: toolDefaults,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const tools = toolAnswers.tools.length > 0 ? toolAnswers.tools : DEFAULT_TOOLS;\n\n // #143 (D19-14): Streamline MCP onboarding — surface secret notes inline\n const secretNotes = tools.map((t) => TOOL_SECRET_NOTES[t]).filter(Boolean);\n if (secretNotes.length > 0) {\n info(chalk.dim(\"MCP secret loading by tool:\"));\n for (const note of secretNotes) {\n info(chalk.dim(` ${note}`));\n }\n }\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features (MCP provides tool-server integration):\",\n choices: FEATURE_CHOICES,\n default: DEFAULT_FEATURE_KEYS,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n const features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n let mcpServers: string[] = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const defaultMcpForPlatform = Array.from(\n new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]),\n );\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: defaultMcpForPlatform,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n // --- Resolve content selection ---\n const contentSelection = resolveSelection(selectedPreset, projectType, teamSize, filterIndex, customSelections);\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n await checkExisting(rootDir, false, contentSelection);\n await runInit({ rootDir, platform, owner, repo, namespace, project, defaultBranch, tools, features, mcpServers, repoInfo, contentSelection });\n}\n\n// ── Workspace initialization ──────────────────────────────────────\n\nasync function runWorkspaceInit(\n rootDir: string,\n detectedRepos: Awaited<ReturnType<typeof detectSubRepos>>,\n repoInfo: RepoInfo,\n opts: { tools?: string; yes?: boolean; preset?: string; projectType?: string; teamSize?: string },\n): Promise<void> {\n const headless = !!opts.yes;\n\n // Step 1: Detect sub-repo git identities\n console.log();\n const wsSpinner = createSpinner(\"Detecting workspace repos...\");\n wsSpinner.start();\n\n if (detectedRepos.length === 0) {\n wsSpinner.succeed(\"Workspace created (no sub-repos found)\");\n // Create empty workspace manifest with defaults\n const platform: Platform = \"github\";\n const tools: Tool[] = resolveToolsFromOpts(opts.tools, repoInfo);\n const features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const index = await buildContentIndex(CONTENT_ROOT);\n const contentSelection = resolveSelection(getPreset(\"standard\"), \"brownfield\", \"solo\", index);\n const wsManifest = createWorkspaceManifest(\n basename(rootDir) || \"workspace\",\n { platform, tools, features, mcp: { servers: mcpServers }, content: contentSelection },\n [],\n \"manual\",\n );\n await writeWorkspaceManifest(rootDir, wsManifest);\n return;\n }\n\n const enriched = detectedRepos.map((r) => ({\n ...r,\n ...detectRepoGitIdentity(join(rootDir, r.path)),\n }));\n\n wsSpinner.succeed(`Workspace: ${detectedRepos.length} repo(s) detected`);\n\n // Step 2: Display detected repos with git identity\n console.log();\n console.log(chalk.dim(\" Repo Platform Owner/Repo Branch\"));\n for (const r of enriched) {\n const name = (r.name ?? r.path).padEnd(16);\n if (r.owner && r.repo) {\n const platLabel = PLATFORM_DISPLAY_NAMES[r.platform].padEnd(14);\n const identity = `${r.owner}/${r.repo}`.padEnd(32);\n console.log(` ${name}${chalk.dim(platLabel)}${chalk.dim(identity)}${chalk.dim(r.defaultBranch)}`);\n } else {\n console.log(` ${name}${chalk.dim(\"(no remote detected)\")}`);\n }\n }\n console.log();\n\n // Step 3: Interactive — confirm/edit repo identities\n if (!headless) {\n const { acceptIdentity } = await inquirer.prompt<{ acceptIdentity: boolean }>([\n {\n type: \"confirm\",\n name: \"acceptIdentity\",\n message: \"Accept detected repo identities?\",\n default: true,\n },\n ]);\n\n if (!acceptIdentity) {\n for (const r of enriched) {\n console.log(chalk.bold(`\\n ${r.name ?? r.path}:`));\n const identity = await inquirer.prompt<{ owner: string; repo: string; defaultBranch: string }>([\n { type: \"input\", name: \"owner\", message: \" Owner:\", default: r.owner || undefined },\n { type: \"input\", name: \"repo\", message: \" Repo:\", default: r.repo || undefined },\n { type: \"input\", name: \"defaultBranch\", message: \" Default branch:\", default: r.defaultBranch || \"main\" },\n ]);\n r.owner = sanitizeInput(identity.owner);\n r.repo = sanitizeInput(identity.repo);\n r.defaultBranch = identity.defaultBranch.trim() || \"main\";\n }\n }\n }\n\n // Step 4: Derive workspace-root platform from sub-repos (workspace root has no git remote)\n const platform = deriveWorkspacePlatform(enriched);\n\n // Step 5: Resolve workspace-wide config (tools, features, content, MCP)\n let tools: Tool[];\n let features: Features;\n let mcpServers: string[];\n let contentSelection: ContentSelection;\n\n if (headless) {\n tools = resolveToolsFromOpts(opts.tools, repoInfo);\n features = { ...DEFAULT_FEATURES };\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n mcpServers = features.mcp\n ? Array.from(new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]))\n : [];\n const isGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const presetId = validateFlag(opts.preset, [\"minimal\", \"standard\", \"full\"], \"standard\", \"preset\");\n const projectType = validateFlag(opts.projectType, [\"greenfield\", \"brownfield\"], isGreenfield ? \"greenfield\" : \"brownfield\", \"project-type\");\n const teamSize = validateFlag(opts.teamSize, [\"solo\", \"team\"], \"solo\", \"team-size\");\n const preset = getPreset(presetId);\n const index = await buildContentIndex(CONTENT_ROOT);\n contentSelection = resolveSelection(preset, projectType, teamSize, index);\n } else {\n // Interactive workspace-wide config prompts\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n const wsFilterIndex = await buildContentIndex(CONTENT_ROOT);\n const isAutoGreenfield =\n repoInfo.languages.length === 1 &&\n repoInfo.languages[0] === \"unknown\" &&\n repoInfo.existingTools.length === 0 &&\n !repoInfo.hasExistingAgents;\n const wsGreenfieldExcl = countProjectTypeExclusions(\"greenfield\", wsFilterIndex.items);\n const wsBrownfieldExcl = countProjectTypeExclusions(\"brownfield\", wsFilterIndex.items);\n const projectTypeAnswer = await inquirer.prompt<{ projectType: \"greenfield\" | \"brownfield\" }>([\n {\n type: \"list\",\n name: \"projectType\",\n message: \"Is this a new (greenfield) or existing (brownfield) project?\",\n choices: [\n { name: `Greenfield — new project from scratch${wsGreenfieldExcl > 0 ? ` (filters out ${wsGreenfieldExcl} brownfield-only item${wsGreenfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"greenfield\" as const },\n { name: `Brownfield — existing codebase${wsBrownfieldExcl > 0 ? ` (filters out ${wsBrownfieldExcl} greenfield-only item${wsBrownfieldExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"brownfield\" as const },\n ],\n default: isAutoGreenfield ? \"greenfield\" : \"brownfield\",\n },\n ]);\n const projectType = projectTypeAnswer.projectType;\n\n const wsSoloExcl = countTeamSizeExclusions(\"solo\", wsFilterIndex.items);\n const teamSizeAnswer = await inquirer.prompt<{ teamSize: \"solo\" | \"team\" }>([\n {\n type: \"list\",\n name: \"teamSize\",\n message: \"Solo developer or team collaboration?\",\n choices: [\n { name: `Solo — just me${wsSoloExcl > 0 ? ` (filters out ${wsSoloExcl} team-only item${wsSoloExcl === 1 ? \"\" : \"s\"})` : \"\"}`, value: \"solo\" as const },\n { name: \"Team — multiple contributors\", value: \"team\" as const },\n ],\n default: \"solo\",\n },\n ]);\n const teamSize = teamSizeAnswer.teamSize;\n\n const wsTotalItems = wsFilterIndex.items.length;\n const presetAnswer = await inquirer.prompt<{ preset: PresetId }>([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Select content profile:\",\n choices: PRESETS.map((p) => {\n const excluded = countPresetExclusions(p, wsFilterIndex);\n const wsEstimated = p.id !== \"custom\" ? estimatePresetItemCount(p, projectType, teamSize, wsFilterIndex) : 0;\n const wsCountHint = wsEstimated > 0 ? ` (~${wsEstimated} items)` : \"\";\n const suffix = excluded > 0 ? ` (excludes ${excluded} of ${wsTotalItems})` : \"\";\n return {\n name: `${p.name} — ${p.description}${wsCountHint}${suffix}`,\n value: p.id,\n };\n }),\n default: \"standard\" as PresetId,\n },\n ]);\n const selectedPreset = getPreset(presetAnswer.preset);\n\n // #148 (D19-19): Group content by tags in workspace custom profile display\n let customSelections: string[] | undefined;\n if (selectedPreset.id === \"custom\") {\n const contentIndex = wsFilterIndex;\n const wsTagGroups = new Map<string, typeof contentIndex.items>();\n for (const item of contentIndex.items) {\n const primaryTag = item.tags[0] ?? \"other\";\n if (!wsTagGroups.has(primaryTag)) wsTagGroups.set(primaryTag, []);\n wsTagGroups.get(primaryTag)!.push(item);\n }\n\n const WS_TAG_LABELS: Record<string, string> = {\n core: \"Core\", planning: \"Planning\", implementation: \"Implementation\",\n review: \"Review\", devops: \"DevOps\", maintenance: \"Maintenance\",\n greenfield: \"Greenfield\", brownfield: \"Brownfield\", board: \"Board\",\n security: \"Security\", a11y: \"Accessibility\", performance: \"Performance\",\n customize: \"Customization\", other: \"Other\",\n };\n const wsGroupedChoices: Array<InstanceType<typeof inquirer.Separator> | { name: string; value: string; checked: boolean }> = [];\n for (const [tag, items] of wsTagGroups) {\n wsGroupedChoices.push(new inquirer.Separator(`── ${WS_TAG_LABELS[tag] ?? tag} (${items.length}) ──`));\n for (const item of items) {\n wsGroupedChoices.push({\n name: `${item.type}: ${item.id.replace(/^hatch3r-/, \"\")} — ${item.description.slice(0, 60)}`,\n value: item.id,\n checked: item.protected || item.tags.includes(\"core\"),\n });\n }\n }\n\n const customAnswer = await inquirer.prompt<{ items: string[] }>([\n {\n type: \"checkbox\",\n name: \"items\",\n message: \"Select content items:\",\n choices: wsGroupedChoices,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n customSelections = customAnswer.items;\n }\n\n const toolDefaults = repoInfo.existingTools.length > 0 ? repoInfo.existingTools : DEFAULT_TOOLS;\n const toolAnswers = await inquirer.prompt<{ tools: Tool[] }>([\n {\n type: \"checkbox\",\n name: \"tools\",\n message: \"Select tools to configure:\",\n choices: TOOL_PROMPT_CHOICES,\n default: toolDefaults,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n tools = toolAnswers.tools.length > 0 ? toolAnswers.tools : DEFAULT_TOOLS;\n\n // Surface per-editor secret loading notes\n const wsSecretNotes = tools.map((t) => TOOL_SECRET_NOTES[t]).filter(Boolean);\n if (wsSecretNotes.length > 0) {\n info(chalk.dim(\"MCP secret loading by tool:\"));\n for (const note of wsSecretNotes) {\n info(chalk.dim(` ${note}`));\n }\n }\n\n const featureAnswers = await inquirer.prompt<{ features: (keyof Features)[] }>([\n {\n type: \"checkbox\",\n name: \"features\",\n message: \"Select features:\",\n choices: FEATURE_CHOICES,\n default: DEFAULT_FEATURE_KEYS,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n const selectedFeatures = featureAnswers.features;\n features = { ...DEFAULT_FEATURES };\n for (const k of Object.keys(features) as (keyof Features)[]) {\n features[k] = selectedFeatures.includes(k);\n }\n\n mcpServers = [];\n if (features.mcp) {\n const platformMcp = PLATFORM_MCP_SERVER[platform];\n const defaultMcpForPlatform = Array.from(\n new Set([platformMcp, ...DEFAULT_MCP.filter((s) => s !== \"github\")]),\n );\n const mcpAnswers = await inquirer.prompt<{ mcp: string[] }>([\n {\n type: \"checkbox\",\n name: \"mcp\",\n message: \"Select MCP servers:\",\n choices: MCP_CHOICES,\n default: defaultMcpForPlatform,\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n mcpServers = mcpAnswers.mcp ?? [];\n if (!mcpServers.includes(platformMcp)) {\n mcpServers.unshift(platformMcp);\n }\n }\n\n contentSelection = resolveSelection(selectedPreset, projectType, teamSize, wsFilterIndex, customSelections);\n }\n\n // Warn if orchestration-critical agents are missing from selection\n const orchWarnings = validateOrchestrationDependencies(contentSelection);\n for (const w of orchWarnings) { warn(w); }\n\n warnBoardPrerequisites(contentSelection);\n\n // Step 6: Create canonical .agents/ at workspace root (empty identity — workspace root is not a repo)\n await checkExisting(rootDir, headless, contentSelection);\n await runInit({\n rootDir,\n platform,\n owner: \"\",\n repo: \"\",\n namespace: \"\",\n project: \"\",\n defaultBranch: \"\",\n tools,\n features,\n mcpServers,\n repoInfo,\n contentSelection,\n });\n\n // Step 7: Build repo entries and select which to sync\n let repoEntries: WorkspaceRepoEntry[];\n\n if (headless) {\n repoEntries = enriched.map((r) => ({\n path: r.path,\n name: r.name,\n sync: false,\n owner: r.owner || undefined,\n repo: r.repo || undefined,\n defaultBranch: r.defaultBranch || undefined,\n platform: r.platform || undefined,\n }));\n } else {\n const wslTheme = isWSL()\n ? { icon: { checked: chalk.green(\"[x]\"), unchecked: \"[ ]\", cursor: \">\" } }\n : undefined;\n\n const { syncRepos } = await inquirer.prompt<{ syncRepos: string[] }>([\n {\n type: \"checkbox\",\n name: \"syncRepos\",\n message: \"Select repos to sync workspace content to:\",\n choices: enriched.map((r) => ({\n name: `${r.name}${r.hasHatch3r ? chalk.dim(\" (has existing hatch3r)\") : \"\"}`,\n value: r.path,\n checked: false,\n })),\n ...(wslTheme && { theme: wslTheme }),\n },\n ]);\n\n const syncSet = new Set(syncRepos);\n repoEntries = enriched.map((r) => ({\n path: r.path,\n name: r.name,\n sync: syncSet.has(r.path),\n owner: r.owner || undefined,\n repo: r.repo || undefined,\n defaultBranch: r.defaultBranch || undefined,\n platform: r.platform || undefined,\n }));\n }\n\n // Step 8: Create workspace manifest and sync\n const dirName = basename(rootDir) || \"workspace\";\n const wsManifest = createWorkspaceManifest(\n dirName,\n { platform, tools, features, mcp: { servers: mcpServers }, content: contentSelection },\n repoEntries,\n \"manual\",\n );\n await writeWorkspaceManifest(rootDir, wsManifest);\n\n const syncCount = repoEntries.filter((r) => r.sync).length;\n if (syncCount > 0) {\n const syncSpinner = createSpinner(`Syncing ${syncCount} repo(s)...`);\n syncSpinner.start();\n\n const result = await syncWorkspaceRepos(rootDir, {\n onWarn: (msg) => warn(msg),\n });\n\n const succeeded = result.repos.filter((r) => r.action === \"synced\").length;\n const failed = result.repos.filter((r) => r.action === \"error\").length;\n\n if (failed > 0) {\n syncSpinner.warn(`Workspace sync: ${succeeded} synced, ${failed} failed`);\n for (const r of result.repos.filter((r) => r.action === \"error\")) {\n logError(` ${r.path}: ${r.error}`);\n }\n } else {\n syncSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n }\n\n console.log();\n const wsLines = [\n label(\"Mode\", \"workspace\"),\n label(\"Repos\", `${repoEntries.length} registered, ${syncCount} synced`),\n label(\"Strategy\", \"manual (use hatch3r sync --repos to propagate)\"),\n label(\"Manifest\", `${AGENTS_DIR}/workspace.json`),\n ];\n printBox(\"Workspace ready\", wsLines, \"success\");\n}\n\nfunction resolveToolsFromOpts(toolsFlag: string | undefined, repoInfo: RepoInfo): Tool[] {\n if (toolsFlag) {\n const rawTools = toolsFlag.split(\",\").map((t) => t.trim());\n const invalid = rawTools.filter((t) => !VALID_TOOLS.has(t));\n if (invalid.length > 0) {\n logError(`Invalid tool(s): ${invalid.join(\", \")}`);\n console.log(chalk.dim(` Valid tools: ${[...VALID_TOOLS].join(\", \")}`));\n throw new HatchError(`Invalid tool(s): ${invalid.join(\", \")}`, 1);\n }\n return rawTools as Tool[];\n }\n if (repoInfo.existingTools.length > 0) return repoInfo.existingTools;\n return DEFAULT_TOOLS;\n}\n","import type { ContentTag } from \"./tags.js\";\n\nexport type PresetId = \"minimal\" | \"standard\" | \"full\" | \"custom\";\n\nexport interface ContentPreset {\n id: PresetId;\n name: string;\n description: string;\n includeTags: ContentTag[];\n excludeTags: ContentTag[];\n}\n\nexport const PRESETS: ContentPreset[] = [\n {\n id: \"minimal\",\n name: \"Minimal\",\n description: \"Core agents and workflows only\",\n includeTags: [\"core\"],\n excludeTags: [],\n },\n {\n id: \"standard\",\n name: \"Standard (recommended)\",\n description: \"Full development lifecycle without niche audits\",\n includeTags: [\"core\", \"planning\", \"implementation\", \"review\", \"devops\", \"maintenance\"],\n excludeTags: [\"board\", \"a11y\", \"performance\", \"customize\"],\n },\n {\n id: \"full\",\n name: \"Full\",\n description: \"Everything including board management and all audits\",\n includeTags: [], // empty = include all\n excludeTags: [],\n },\n {\n id: \"custom\",\n name: \"Custom\",\n description: \"Choose exactly what you need\",\n includeTags: [],\n excludeTags: [],\n },\n];\n\nexport function getPreset(id: PresetId): ContentPreset {\n const preset = PRESETS.find((p) => p.id === id);\n if (!preset) throw new Error(`Unknown preset: ${id}`);\n return preset;\n}\n","import { stat, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport chalk from \"chalk\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter, getUnsupportedFeatureWarnings } from \"../../adapters/index.js\";\nimport { safeWriteFile } from \"../../merge/safeWrite.js\";\nimport { generateWorktreeInclude, extractManagedContent } from \"../../worktree/index.js\";\nimport { AGENTS_DIR, HatchError, WORKTREE_INCLUDE_FILE, type GenerationMode } from \"../../types.js\";\nimport { ensureEnvMcp, ensureGitignoreEntry, getSourceEnvMcpCommand } from \"../../env/mcpEnv.js\";\nimport { readWorkspaceManifest } from \"../../workspace/manifest.js\";\nimport { syncWorkspaceRepos } from \"../../workspace/sync.js\";\nimport { AGENTS_MD_INNER, AGENTS_MD_FULL, generateCanonicalAgentsMd } from \"../shared/agentsContent.js\";\nimport { verifyIntegrity, generateIntegrityManifest, writeIntegrityManifest } from \"../../integrity/index.js\";\nimport { pruneArchives } from \"../../archive/index.js\";\nimport { HATCH3R_VERSION } from \"../../version.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n step,\n warn,\n} from \"../shared/ui.js\";\n\n/**\n * Check if docs/specs/ exists and whether spec files are older than\n * the most recent git commit, indicating they may be stale.\n */\nasync function checkSpecFreshness(rootDir: string): Promise<void> {\n const specsDir = join(rootDir, \"docs\", \"specs\");\n try {\n await stat(specsDir);\n } catch {\n return; // No specs directory — nothing to check\n }\n\n // Find the oldest spec file mtime\n let oldestSpecMtime = Date.now();\n try {\n const entries = await readdir(specsDir, { withFileTypes: true, recursive: true });\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue;\n const parentPath = entry.parentPath ?? (entry as unknown as { path?: string }).path ?? specsDir;\n const fileStat = await stat(join(parentPath, entry.name));\n if (fileStat.mtimeMs < oldestSpecMtime) {\n oldestSpecMtime = fileStat.mtimeMs;\n }\n }\n } catch {\n return;\n }\n\n // Get the latest commit timestamp\n try {\n const commitDate = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%ct\"], { stdio: \"pipe\" })\n .toString()\n .trim();\n const latestCommitMs = parseInt(commitDate, 10) * 1000;\n\n if (latestCommitMs > oldestSpecMtime) {\n const daysSinceSpecUpdate = Math.floor((Date.now() - oldestSpecMtime) / (1000 * 60 * 60 * 24));\n if (daysSinceSpecUpdate > 7) {\n warn(\n `Project specs in docs/specs/ may be stale (oldest spec last modified ${daysSinceSpecUpdate} days ago). ` +\n `Consider running /project-spec to refresh.`,\n );\n }\n }\n } catch {\n // git not available or no commits — skip\n }\n}\n\nexport async function syncCommand(\n opts: {\n repos?: string[] | true;\n dryRun?: boolean;\n force?: boolean;\n minimal?: boolean;\n } = {},\n): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n const m = manifest;\n\n const integrityResults = await verifyIntegrity(agentsDir);\n const modified = integrityResults.filter((r) => r.status === \"modified\");\n const missing = integrityResults.filter((r) => r.status === \"missing\");\n if (modified.length > 0 || missing.length > 0) {\n warn(\"Integrity issues detected in canonical files:\");\n for (const r of modified) {\n warn(` MODIFIED: ${r.file}`);\n }\n for (const r of missing) {\n warn(` MISSING: ${r.file}`);\n }\n warn(\"These files may have been tampered with. Syncing will propagate their current content.\");\n console.log();\n }\n\n const results: { path: string; action: string }[] = [];\n const totalSteps = m.tools.length + 1;\n let currentStep = 0;\n\n const s1 = createSpinner(step(++currentStep, totalSteps, \"Syncing AGENTS.md...\"));\n s1.start();\n const agentsMdResult = await safeWriteFile(join(rootDir, \"AGENTS.md\"), AGENTS_MD_FULL, {\n managedContent: AGENTS_MD_INNER,\n });\n if (agentsMdResult.warning) warn(agentsMdResult.warning);\n results.push({ path: \"AGENTS.md\", action: agentsMdResult.action });\n const canonicalAgentsMd = await generateCanonicalAgentsMd(agentsDir);\n const canonicalResult = await safeWriteFile(join(agentsDir, \"AGENTS.md\"), canonicalAgentsMd);\n if (canonicalResult.warning) warn(canonicalResult.warning);\n results.push({ path: `${AGENTS_DIR}/AGENTS.md`, action: canonicalResult.action });\n s1.succeed(step(currentStep, totalSteps, \"AGENTS.md synced\"));\n\n const generationMode: GenerationMode = opts.minimal ? \"minimal\" : \"standard\";\n if (opts.minimal) {\n info(\"Minimal generation mode: output will be stripped-down to reduce token usage.\");\n }\n\n const adapterFailures: { tool: string; error: string }[] = [];\n for (const tool of m.tools) {\n const s = createSpinner(step(++currentStep, totalSteps, `Generating ${tool} output...`));\n s.start();\n try {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(agentsDir, m, generationMode);\n for (const w of adapter.warnings) { warn(w); }\n for (const out of outputs) {\n const fullPath = join(rootDir, out.path);\n if (out.managedContent) {\n const result = await safeWriteFile(fullPath, out.content, {\n managedContent: out.managedContent,\n });\n if (result.warning) warn(result.warning);\n results.push({ path: out.path, action: result.action });\n } else {\n const result = await safeWriteFile(fullPath, out.content);\n if (result.warning) warn(result.warning);\n results.push({ path: out.path, action: result.action });\n }\n }\n s.succeed(step(currentStep, totalSteps, `${tool} output generated`));\n } catch (err) {\n s.fail(step(currentStep, totalSteps, `Failed to generate ${tool} output`));\n adapterFailures.push({\n tool,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n if (adapterFailures.length > 0) {\n for (const f of adapterFailures) {\n logError(`Failed to generate ${f.tool}: ${f.error}`);\n }\n if (adapterFailures.length === m.tools.length) {\n throw new HatchError(\"All adapters failed\", 1, \"ADAPTER_ERROR\");\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 // Regenerate integrity manifest so checksums match newly generated files\n const integrityManifest = await generateIntegrityManifest(agentsDir, HATCH3R_VERSION);\n await writeIntegrityManifest(agentsDir, integrityManifest);\n\n // Prune stale archive entries\n await pruneArchives(rootDir);\n\n // Check spec freshness\n await checkSpecFreshness(rootDir);\n\n console.log();\n\n const icons: Record<string, string> = {\n created: chalk.green(\"+\"),\n updated: chalk.yellow(\"~\"),\n skipped: chalk.dim(\"=\"),\n };\n\n const summaryLines = results.map((r) => {\n const icon = icons[r.action] ?? chalk.dim(\" \");\n return `${icon} ${r.path} ${chalk.dim(`(${r.action})`)}`;\n });\n\n printBox(\"Sync complete\", summaryLines, \"success\");\n\n // ── Workspace sync cascade ────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (!wsManifest) return;\n\n const syncReposRequested = opts.repos !== undefined;\n const syncOnSync = wsManifest.syncStrategy === \"on-sync\";\n const syncableCount = wsManifest.repos.filter((r) => r.sync).length;\n\n if (!syncReposRequested && !syncOnSync) {\n if (syncableCount > 0) {\n info(`Workspace: ${syncableCount} repo(s) available for sync. Run ${chalk.bold(\"hatch3r sync --repos\")} to propagate.`);\n }\n return;\n }\n\n // Determine which repos to sync\n const repoPaths = Array.isArray(opts.repos) ? opts.repos : undefined;\n\n console.log();\n const wsSpinner = createSpinner(\n opts.dryRun\n ? \"Workspace sync (dry run)...\"\n : `Syncing workspace to ${repoPaths ? repoPaths.length : syncableCount} repo(s)...`,\n );\n wsSpinner.start();\n\n const wsResult = await syncWorkspaceRepos(rootDir, {\n repos: repoPaths,\n dryRun: opts.dryRun,\n force: opts.force,\n onWarn: (msg) => warn(msg),\n });\n\n if (opts.dryRun) {\n wsSpinner.succeed(\"Workspace sync (dry run)\");\n for (const r of wsResult.repos) {\n const changes = [];\n if (r.added.length > 0) changes.push(`+${r.added.length} content`);\n if (r.removed.length > 0) changes.push(`-${r.removed.length} content`);\n if (r.toolsSynced.length > 0) changes.push(`${r.toolsSynced.length} tools`);\n info(` ${r.path}: ${changes.length > 0 ? changes.join(\", \") : \"up to date\"}`);\n }\n return;\n }\n\n const succeeded = wsResult.repos.filter((r) => r.action === \"synced\").length;\n const failed = wsResult.repos.filter((r) => r.action === \"error\").length;\n\n if (failed > 0) {\n wsSpinner.warn(`Workspace sync: ${succeeded} synced, ${failed} failed`);\n for (const r of wsResult.repos.filter((r) => r.action === \"error\")) {\n logError(` ${r.path}: ${r.error}`);\n }\n } else {\n wsSpinner.succeed(`Workspace sync: ${succeeded} repo(s) synced`);\n }\n}\n","import { readdir, readFile, access } from \"node:fs/promises\";\nimport { join, posix } from \"node:path\";\nimport chalk from \"chalk\";\nimport { parse as parseYaml } from \"yaml\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { isValidHookEvent } from \"../../hooks/types.js\";\nimport { AGENTS_DIR, HATCH3R_PREFIX, HatchError } from \"../../types.js\";\nimport type { HatchManifest } from \"../../types.js\";\nimport { scanForDeniedPatterns } from \"../../adapters/customization.js\";\nimport { buildContentIndex, validateCrossReferences, validateOrchestrationDependencies } from \"../../content/index.js\";\nimport { readCustomizationWithWarnings } from \"../../models/customize.js\";\nimport type { CustomizableType } from \"../../models/customize.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n warn,\n info,\n} from \"../shared/ui.js\";\n\n// Default fallback set; overridden by manifest.content when available\nconst DEFAULT_KNOWN_AGENTS = new Set([\n \"hatch3r-a11y-auditor\", \"hatch3r-architect\", \"hatch3r-ci-watcher\", \"hatch3r-context-rules\",\n \"hatch3r-dependency-auditor\", \"hatch3r-devops\", \"hatch3r-docs-writer\", \"hatch3r-fixer\",\n \"hatch3r-implementer\", \"hatch3r-learnings-loader\", \"hatch3r-lint-fixer\", \"hatch3r-perf-profiler\",\n \"hatch3r-researcher\", \"hatch3r-reviewer\", \"hatch3r-security-auditor\", \"hatch3r-test-writer\",\n]);\n\ninterface ValidationResult {\n errors: string[];\n warnings: string[];\n}\n\nconst CUSTOMIZATION_TYPES = [\n { dir: \"agents\", canonical: \"agents\" },\n { dir: \"commands\", canonical: \"commands\" },\n { dir: \"skills\", canonical: \"skills\" },\n { dir: \"rules\", canonical: \"rules\" },\n];\n\nasync function validateManifest(\n rootDir: string,\n manifest: HatchManifest | null,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest) {\n result.errors.push(\"Missing .agents/hatch.json manifest\");\n return;\n }\n if (!manifest.version) result.errors.push(\"hatch.json: missing 'version' field\");\n if (!manifest.tools || manifest.tools.length === 0) result.warnings.push(\"hatch.json: no tools configured\");\n\n for (const managedFile of manifest.managedFiles ?? []) {\n try {\n await access(join(rootDir, managedFile));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Managed file missing from disk: ${managedFile}`);\n }\n }\n}\n\nasync function validateDirectories(\n agentsDir: string,\n result: ValidationResult,\n): Promise<void> {\n const requiredDirs = [\"agents\", \"skills\", \"rules\"];\n const optionalDirs = [\"commands\", \"prompts\", \"mcp\", \"policy\", \"github-agents\"];\n\n for (const dir of requiredDirs) {\n try {\n await access(join(agentsDir, dir));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.errors.push(`Required directory missing: .agents/${dir}/`);\n }\n }\n\n for (const dir of optionalDirs) {\n try {\n await access(join(agentsDir, dir));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Optional directory missing: .agents/${dir}/`);\n }\n }\n}\n\nasync function validateFrontmatter(\n agentsDir: string,\n result: ValidationResult,\n): Promise<void> {\n const requiredDirs = [\"agents\", \"skills\", \"rules\"];\n const optionalDirs = [\"commands\", \"prompts\", \"mcp\", \"policy\", \"github-agents\"];\n\n for (const dir of [...requiredDirs, ...optionalDirs]) {\n const dirPath = join(agentsDir, dir);\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".md\")) {\n const filePath = join(dirPath, entry.name);\n const content = await readFile(filePath, \"utf-8\");\n if (!content.startsWith(\"---\")) {\n result.warnings.push(`Missing frontmatter: .agents/${dir}/${entry.name}`);\n } else {\n const endIdx = content.indexOf(\"---\", 3);\n if (endIdx === -1) {\n result.errors.push(`Invalid frontmatter (no closing ---): .agents/${dir}/${entry.name}`);\n } else {\n const frontmatter = content.slice(3, endIdx).trim();\n const parsedFm = parseYaml(frontmatter) as Record<string, unknown> | null;\n if (!parsedFm || typeof parsedFm !== \"object\" || !parsedFm.id) {\n result.warnings.push(`Missing 'id' in frontmatter: .agents/${dir}/${entry.name}`);\n }\n if (!parsedFm || typeof parsedFm !== \"object\" || !parsedFm.type) {\n result.warnings.push(`Missing 'type' in frontmatter: .agents/${dir}/${entry.name}`);\n }\n }\n }\n } else if (entry.isDirectory()) {\n const skillPath = join(dirPath, entry.name, \"SKILL.md\");\n try {\n await access(skillPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Skill directory missing SKILL.md: .agents/${dir}/${entry.name}/`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n\n try {\n await access(join(agentsDir, \"AGENTS.md\"));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(\"Missing .agents/AGENTS.md\");\n }\n}\n\nasync function validateManagedFilePrefixes(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n for (const managedFile of manifest.managedFiles ?? []) {\n const fileName = posix.basename(managedFile) || \"\";\n const isSharedFile = [\"AGENTS.md\", \"CLAUDE.md\", \"copilot-instructions.md\", \".windsurfrules\", \"mcp.json\", \"opencode.json\", \".mcp.json\", \"copilot-setup-steps.yml\", \"settings.json\"].some(\n (sf) => fileName === sf || managedFile.endsWith(sf),\n );\n if (!isSharedFile && !fileName.startsWith(HATCH3R_PREFIX) && !fileName.startsWith(\".\")) {\n result.warnings.push(`Managed file without hatch3r- prefix: ${managedFile}`);\n }\n }\n}\n\nasync function validateHooks(\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.features.hooks) return;\n\n const hooksDir = join(agentsDir, \"hooks\");\n try {\n const hookFiles = await readdir(hooksDir);\n const mdHooks = hookFiles.filter(f => f.endsWith(\".md\"));\n if (mdHooks.length === 0) {\n result.warnings.push(\"Hooks feature enabled but no hook definitions found in .agents/hooks/\");\n }\n\n let agentFiles: Set<string> | undefined;\n try {\n const agentEntries = await readdir(join(agentsDir, \"agents\"));\n agentFiles = new Set(agentEntries.filter(f => f.endsWith(\".md\")));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n for (const hookFile of mdHooks) {\n const hookContent = await readFile(join(hooksDir, hookFile), \"utf-8\");\n if (!hookContent.startsWith(\"---\")) {\n result.warnings.push(`Hook missing frontmatter: .agents/hooks/${hookFile}`);\n continue;\n }\n const endIdx = hookContent.indexOf(\"---\", 3);\n if (endIdx === -1) continue;\n const fm = parseYaml(hookContent.slice(3, endIdx).trim()) as Record<string, unknown> | null;\n if (fm?.event && typeof fm.event === \"string\") {\n if (!isValidHookEvent(fm.event)) {\n result.errors.push(`Hook \"${hookFile}\" has invalid event \"${fm.event}\". Valid events: pre-commit, post-merge, ci-failure, file-save, session-start, pre-push`);\n }\n }\n if (fm?.agent && typeof fm.agent === \"string\" && agentFiles) {\n const agentName = typeof fm.agent === \"string\" && fm.agent.startsWith(HATCH3R_PREFIX)\n ? fm.agent\n : `${HATCH3R_PREFIX}${fm.agent}`;\n const expectedFile = `${agentName}.md`;\n if (!agentFiles.has(expectedFile)) {\n result.errors.push(`Hook \"${hookFile}\" references agent \"${fm.agent}\" but .agents/agents/${expectedFile} does not exist`);\n }\n // Build known agents set from manifest content or fallback\n const knownAgents = manifest.content\n ? new Set(manifest.content.items.agents)\n : DEFAULT_KNOWN_AGENTS;\n if (!knownAgents.has(agentName)) {\n result.warnings.push(`Hook \"${hookFile}\" references agent \"${fm.agent}\" which is not in the standard hatch3r agent roster`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(\"Hooks feature enabled but .agents/hooks/ directory not found\");\n }\n}\n\nasync function validateMcp(\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.features.mcp || manifest.mcp.servers.length === 0) return;\n\n const mcpPath = join(agentsDir, \"mcp\", \"mcp.json\");\n try {\n const mcpContent = await readFile(mcpPath, \"utf-8\");\n const mcpParsed = JSON.parse(mcpContent);\n if (!mcpParsed.mcpServers || typeof mcpParsed.mcpServers !== \"object\") {\n result.errors.push(\"MCP config missing 'mcpServers' key\");\n }\n } catch (err) {\n if (err instanceof SyntaxError) {\n result.errors.push(\"Invalid JSON in .agents/mcp/mcp.json\");\n } else {\n result.warnings.push(\"MCP servers configured but .agents/mcp/mcp.json not found\");\n }\n }\n}\n\nasync function validateModels(\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n if (!manifest.models) return;\n\n if (manifest.models.default && typeof manifest.models.default !== \"string\") {\n result.errors.push(\"hatch.json: models.default must be a string\");\n }\n if (manifest.models.agents) {\n for (const [agentId, model] of Object.entries(manifest.models.agents)) {\n if (typeof model !== \"string\") {\n result.errors.push(`hatch.json: models.agents.${agentId} must be a string`);\n }\n }\n }\n}\n\n/**\n * Validate .customize.yaml files for syntax and known field usage.\n * Checks that YAML parses correctly, uses only recognized fields,\n * and that field values have the expected types.\n */\nasync function validateCustomizeYaml(\n rootDir: string,\n result: ValidationResult,\n): Promise<void> {\n const VALID_FIELDS = new Set([\"model\", \"scope\", \"description\", \"enabled\"]);\n const FIELD_TYPES: Record<string, string> = {\n model: \"string\",\n scope: \"string\",\n description: \"string\",\n enabled: \"boolean\",\n };\n\n for (const { dir } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n let files: string[];\n try {\n files = await readdir(customDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n throw err;\n }\n\n const yamlFiles = files.filter(f => f.endsWith(\".customize.yaml\"));\n for (const file of yamlFiles) {\n const filePath = join(customDir, file);\n const itemId = file.replace(\".customize.yaml\", \"\");\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n continue;\n }\n\n // Check size limit (same as customize.ts: 10KB)\n if (Buffer.byteLength(raw, \"utf-8\") > 10_240) {\n result.warnings.push(\n `.customize.yaml for \"${itemId}\" exceeds 10KB limit and will be skipped during generation`,\n );\n continue;\n }\n\n // Check YAML syntax\n let parsed: Record<string, unknown> | null;\n try {\n parsed = parseYaml(raw) as Record<string, unknown> | null;\n } catch {\n result.errors.push(\n `Invalid YAML syntax in .hatch3r/${dir}/${file}`,\n );\n continue;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n result.warnings.push(\n `.customize.yaml for \"${itemId}\" is empty or not an object`,\n );\n continue;\n }\n\n // Check for unknown fields\n for (const key of Object.keys(parsed)) {\n if (!VALID_FIELDS.has(key)) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: unknown field \"${key}\" (valid: ${[...VALID_FIELDS].join(\", \")})`,\n );\n }\n }\n\n // Check field types\n for (const [key, expectedType] of Object.entries(FIELD_TYPES)) {\n if (key in parsed && parsed[key] !== undefined && parsed[key] !== null) {\n const actualType = typeof parsed[key];\n if (actualType !== expectedType) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: field \"${key}\" should be ${expectedType} but is ${actualType}`,\n );\n }\n }\n }\n\n // Run denied-pattern scan on string fields\n for (const field of [\"description\", \"scope\"] as const) {\n const value = parsed[field];\n if (typeof value === \"string\") {\n const violations = scanForDeniedPatterns(value);\n for (const v of violations) {\n result.warnings.push(\n `.hatch3r/${dir}/${file}: field \"${field}\" contains denied pattern: ${v}`,\n );\n }\n }\n }\n\n // Validate the customization through the canonical reader for deeper checks\n const type = dir as CustomizableType;\n const readResult = await readCustomizationWithWarnings(rootDir, type, itemId);\n for (const w of readResult.warnings) {\n result.warnings.push(w);\n }\n }\n }\n}\n\nasync function validateCustomizations(\n rootDir: string,\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n for (const { dir, canonical } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n try {\n const customFiles = await readdir(customDir);\n for (const file of customFiles) {\n if (file.endsWith(\".customize.yaml\")) {\n const itemId = file.replace(\".customize.yaml\", \"\");\n const canonicalPath = canonical === \"skills\"\n ? join(agentsDir, canonical, itemId)\n : join(agentsDir, canonical, `${itemId}.md`);\n try {\n await access(canonicalPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n result.warnings.push(`Customization file for non-existent ${canonical.slice(0, -1)}: .hatch3r/${dir}/${file}`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n}\n\nasync function validateContentConsistency(\n rootDir: string,\n agentsDir: string,\n manifest: HatchManifest,\n result: ValidationResult,\n): Promise<void> {\n // Content consistency: manifest items vs disk\n if (manifest.content) {\n const contentDirs: Record<keyof typeof manifest.content.items, { dir: string; strategy: \"glob\" | \"subdir\" }> = {\n agents: { dir: \"agents\", strategy: \"glob\" },\n skills: { dir: \"skills\", strategy: \"subdir\" },\n rules: { dir: \"rules\", strategy: \"glob\" },\n commands: { dir: \"commands\", strategy: \"glob\" },\n prompts: { dir: \"prompts\", strategy: \"glob\" },\n hooks: { dir: \"hooks\", strategy: \"glob\" },\n githubAgents: { dir: \"github-agents\", strategy: \"glob\" },\n };\n for (const [key, cfg] of Object.entries(contentDirs)) {\n const ids = manifest.content.items[key as keyof typeof manifest.content.items];\n for (const id of ids) {\n const checkPath = cfg.strategy === \"subdir\"\n ? join(agentsDir, cfg.dir, id, \"SKILL.md\")\n : join(agentsDir, cfg.dir, `${id}.md`);\n try {\n await access(checkPath);\n } catch {\n result.warnings.push(`Content \"${id}\" (${key}) in manifest but missing from .agents/${cfg.dir}/`);\n }\n }\n }\n\n // Orphaned customize files\n const allContentIds = new Set<string>();\n for (const ids of Object.values(manifest.content.items)) {\n for (const id of ids) allContentIds.add(id);\n }\n for (const { dir } of CUSTOMIZATION_TYPES) {\n const customDir = join(rootDir, \".hatch3r\", dir);\n try {\n const files = await readdir(customDir);\n for (const f of files.filter(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n const itemId = f.replace(/\\.customize\\.(yaml|md)$/, \"\");\n if (!allContentIds.has(itemId) && !allContentIds.has(`${HATCH3R_PREFIX}${itemId}`)) {\n result.warnings.push(`Orphaned customization: .hatch3r/${dir}/${f} (content not in manifest)`);\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n }\n }\n\n // Validate learnings for denied patterns\n const learningsDir = join(agentsDir, \"learnings\");\n try {\n const learningFiles = await readdir(learningsDir);\n const mdFiles = learningFiles.filter(f => f.endsWith(\".md\"));\n for (const file of mdFiles) {\n const content = await readFile(join(learningsDir, file), \"utf-8\");\n const violations = scanForDeniedPatterns(content);\n if (violations.length > 0) {\n for (const v of violations) {\n result.warnings.push(`Learning file \"${file}\" contains suspicious content: ${v}`);\n }\n }\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n}\n\nexport async function validateCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const result: ValidationResult = { errors: [], warnings: [] };\n\n const spinner = createSpinner(\"Validating .agents/ structure...\");\n spinner.start();\n\n try {\n await access(agentsDir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n spinner.fail(\"Validation failed\");\n logError(\".agents/ directory not found. Run `hatch3r init` first.\");\n console.log();\n throw new HatchError(\".agents/ directory not found.\", 1, \"CONFIG_ERROR\");\n }\n\n const manifest = await readManifest(rootDir);\n\n await validateManifest(rootDir, manifest, result);\n await validateDirectories(agentsDir, result);\n await validateFrontmatter(agentsDir, result);\n\n if (manifest) {\n await validateManagedFilePrefixes(manifest, result);\n await validateHooks(agentsDir, manifest, result);\n await validateMcp(agentsDir, manifest, result);\n await validateModels(manifest, result);\n await validateCustomizations(rootDir, agentsDir, manifest, result);\n await validateCustomizeYaml(rootDir, result);\n await validateContentConsistency(rootDir, agentsDir, manifest, result);\n\n // Cross-reference validation: check that installed content doesn't have broken references\n try {\n const index = await buildContentIndex(agentsDir);\n if (index.items.length > 0) {\n const crossRefResult = await validateCrossReferences(agentsDir, index);\n for (const w of crossRefResult.warnings) {\n result.warnings.push(w);\n }\n }\n\n // Content ID collision validation\n // Expected: command/skill cross-type pairs (by design, commands and skills share IDs)\n // Unexpected: same-type duplicates, or cross-type pairs that aren't command↔skill\n const EXPECTED_CROSS_TYPE_PAIRS = new Set([\"command\", \"skill\"]);\n for (const collision of index.collisions) {\n if (collision.kind === \"cross-type\") {\n const types = new Set([collision.existingType, collision.duplicateType]);\n if (types.size === 2 && [...types].every(t => EXPECTED_CROSS_TYPE_PAIRS.has(t))) {\n // Expected command/skill collision — skip\n continue;\n }\n }\n result.warnings.push(\n `Content ID collision: \"${collision.id}\" exists as ${collision.existingType} (${collision.existingPath}) and ${collision.duplicateType} (${collision.duplicatePath})`,\n );\n }\n } catch {\n // Content scanning failed — skip cross-ref and collision validation\n }\n\n // Orchestration dependency validation: check required agents are selected\n if (manifest.content) {\n const orchWarnings = validateOrchestrationDependencies(manifest.content);\n for (const w of orchWarnings) {\n result.warnings.push(w);\n }\n }\n }\n\n spinner.stop();\n\n // Detect if customization files exist for contextual help (#56 D19-4)\n let hasCustomizations = false;\n for (const { dir } of CUSTOMIZATION_TYPES) {\n try {\n const files = await readdir(join(rootDir, \".hatch3r\", dir));\n if (files.some(f => f.endsWith(\".customize.yaml\") || f.endsWith(\".customize.md\"))) {\n hasCustomizations = true;\n break;\n }\n } catch {\n // directory doesn't exist\n }\n }\n\n if (result.errors.length === 0 && result.warnings.length === 0) {\n printBox(\"Validation\", [chalk.green(\"All checks passed\")], \"success\");\n if (hasCustomizations) {\n printCustomizationHint();\n }\n return;\n }\n\n console.log();\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n logError(err);\n }\n console.log();\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n warn(w);\n }\n console.log();\n }\n\n if (result.errors.length > 0) {\n const summaryLines = [\n `${chalk.red(\"✖\")} ${result.errors.length} error(s)`,\n `${chalk.yellow(\"⚠\")} ${result.warnings.length} warning(s)`,\n ];\n printBox(\"Validation failed\", summaryLines, \"error\");\n throw new HatchError(\"Validation failed\", 1, \"VALIDATION_ERROR\");\n } else {\n const summaryLines = [\n `${chalk.green(\"✔\")} 0 errors`,\n `${chalk.yellow(\"⚠\")} ${result.warnings.length} warning(s)`,\n ];\n printBox(\"Validation passed\", summaryLines, \"success\");\n }\n\n if (hasCustomizations) {\n printCustomizationHint();\n }\n}\n\n/**\n * Print a contextual explanation of the three customization mechanisms\n * when customization files are detected (D19-4).\n */\nfunction printCustomizationHint(): void {\n console.log();\n info(chalk.bold(\"Customization mechanisms detected. Quick reference:\"));\n console.log(chalk.dim(\" 1. hatch3r- prefix: Files prefixed with hatch3r- are managed by hatch3r and\"));\n console.log(chalk.dim(\" overwritten on update. Do not edit these directly.\"));\n console.log(chalk.dim(\" 2. Managed blocks: Sections between <!-- MANAGED-BLOCK:BEGIN --> and\"));\n console.log(chalk.dim(\" <!-- MANAGED-BLOCK:END --> are auto-updated. Add content outside these markers.\"));\n console.log(chalk.dim(\" 3. .customize.yaml/.md: Place in .hatch3r/{type}/ to override model, scope,\"));\n console.log(chalk.dim(\" description, or disable items. Use .customize.md for content additions.\"));\n console.log(chalk.dim(\" See: https://docs.hatch3r.com/docs/guides/customization\"));\n}\n","import { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { AGENTS_DIR, HatchError } from \"../../types.js\";\nimport { readIntegrityManifest, verifyIntegrity } from \"../../integrity/index.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n} from \"../shared/ui.js\";\n\nexport async function verifyCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n\n const spinner = createSpinner(\"Verifying file integrity...\");\n spinner.start();\n\n const manifest = await readIntegrityManifest(agentsDir);\n if (!manifest) {\n spinner.fail(\"No integrity manifest found\");\n logError(\"Missing .agents/.integrity.json — run `hatch3r init` or `hatch3r update` to generate it.\");\n console.log();\n throw new HatchError(\"Missing .agents/.integrity.json\", 1, \"INTEGRITY_ERROR\");\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, \"INTEGRITY_ERROR\");\n } else {\n printBox(\"Integrity check passed\", summaryLines, \"success\");\n }\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { readManifest } from \"../../manifest/hatchJson.js\";\nimport { getAdapter } from \"../../adapters/index.js\";\nimport { AGENTS_DIR, HatchError } from \"../../types.js\";\nimport { extractManagedBlock } from \"../../merge/managedBlocks.js\";\nimport {\n printBanner,\n createSpinner,\n printBox,\n error as logError,\n info,\n} from \"../shared/ui.js\";\nimport { readWorkspaceManifest } from \"../../workspace/manifest.js\";\n\n/** Recursively sum the byte size of all files under a directory. */\nasync function dirCharCount(dir: string): Promise<number> {\n let total = 0;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n total += await dirCharCount(fullPath);\n } else if (entry.isFile()) {\n const info = await stat(fullPath);\n total += info.size;\n }\n }\n return total;\n}\n\nexport async function statusCommand(): Promise<void> {\n printBanner(true);\n\n const rootDir = process.cwd();\n const agentsDir = join(rootDir, AGENTS_DIR);\n const manifest = await readManifest(rootDir);\n\n if (!manifest) {\n logError(\"No .agents/hatch.json found.\");\n console.log(chalk.dim(\" Run `npx hatch3r init` to set up your project first.\\n\"));\n throw new HatchError(\"No .agents/hatch.json found.\", 1, \"CONFIG_ERROR\");\n }\n\n const spinner = createSpinner(\"Checking sync status...\");\n spinner.start();\n\n const stats = { synced: 0, drifted: 0, missing: 0 };\n const fileLines: string[] = [];\n\n for (const tool of manifest.tools) {\n const adapter = getAdapter(tool);\n const outputs = await adapter.generate(agentsDir, manifest);\n\n fileLines.push(chalk.bold(`${tool}:`));\n\n for (const out of outputs) {\n const destPath = join(rootDir, out.path);\n try {\n const existing = await readFile(destPath, \"utf-8\");\n const existingBlock = extractManagedBlock(existing);\n const expectedBlock = out.managedContent ?? extractManagedBlock(out.content);\n if (existingBlock !== null && expectedBlock !== null ? existingBlock === expectedBlock : existing === out.content) {\n fileLines.push(` ${chalk.green(\"=\")} ${out.path}`);\n stats.synced++;\n } else {\n fileLines.push(` ${chalk.yellow(\"~\")} ${out.path} ${chalk.dim(\"(drifted)\")}`);\n stats.drifted++;\n }\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n fileLines.push(` ${chalk.red(\"+\")} ${out.path} ${chalk.dim(\"(missing)\")}`);\n stats.missing++;\n }\n }\n }\n\n spinner.stop();\n console.log();\n\n for (const line of fileLines) {\n console.log(` ${line}`);\n }\n console.log();\n\n const summaryLines = [\n `${chalk.green(\"=\")} In sync: ${stats.synced}`,\n ];\n if (stats.drifted > 0) {\n summaryLines.push(`${chalk.yellow(\"~\")} Drifted: ${stats.drifted}`);\n }\n if (stats.missing > 0) {\n summaryLines.push(`${chalk.red(\"+\")} Missing: ${stats.missing}`);\n }\n\n // Estimate canonical token count from .agents/ directory size\n const totalChars = await dirCharCount(agentsDir);\n const estimatedTokens = Math.round(totalChars / 4);\n const formattedTokens = estimatedTokens.toLocaleString(\"en-US\");\n summaryLines.push(`${chalk.dim(\"~\")} Estimated canonical tokens: ~${formattedTokens}`);\n\n const style = stats.drifted > 0 || stats.missing > 0 ? \"info\" as const : \"success\" as const;\n printBox(\"Status\", summaryLines, style);\n\n if (stats.drifted > 0 || stats.missing > 0) {\n info(`Run ${chalk.bold(\"hatch3r sync\")} to regenerate drifted/missing files.`);\n console.log();\n }\n\n // ── Workspace topology ──────────────────────────────────────\n const wsManifest = await readWorkspaceManifest(rootDir);\n if (wsManifest && wsManifest.repos.length > 0) {\n const wsLines: string[] = [];\n for (const repo of wsManifest.repos) {\n const icon = repo.sync ? chalk.green(\"\\u2713\") : chalk.dim(\"\\u25CB\");\n let detail: string;\n if (!repo.sync) {\n detail = chalk.dim(\"sync disabled\");\n } else if (repo.lastSync) {\n const elapsed = Math.max(0, Date.now() - new Date(repo.lastSync).getTime());\n const hours = Math.floor(elapsed / (1000 * 60 * 60));\n const timeAgo = hours < 1 ? \"just now\" : hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n detail = `synced ${timeAgo}`;\n } else {\n detail = chalk.yellow(\"never synced\");\n }\n const identity = repo.owner && repo.repo\n ? chalk.dim(`${repo.owner}/${repo.repo}`)\n : \"\";\n const branch = repo.defaultBranch\n ? chalk.dim(`[${repo.defaultBranch}]`)\n : \"\";\n const identityPart = identity || branch ? ` ${identity} ${branch}` : \"\";\n wsLines.push(`${icon} ${repo.name ?? repo.path}${identityPart} ${chalk.dim(`(${detail})`)}`);\n }\n printBox(`Workspace: ${wsManifest.name} (${wsManifest.repos.length} repos)`, wsLines, \"info\");\n }\n\n // Show workspace membership info if this repo is managed by a workspace\n if (manifest.workspace) {\n const wsInfo = [\n `Managed by workspace at ${chalk.bold(manifest.workspace.rootPath)}`,\n `Last synced: ${manifest.workspace.lastSync ? new Date(manifest.workspace.lastSync).toLocaleString() : \"never\"}`,\n ];\n printBox(\"Workspace member\", wsInfo, \"info\");\n }\n}\n"],"mappings":"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","names":["chalk","chalk","join","readFile","execFileSync","chalk","join","dirname","output","stat","join","dirname","join","chalk","readFile","summaryLines","execFileSync","fileURLToPath","readFile","dirname","join","chalk","inquirer","readFile","join","readFile","mkdir","unlink","copyFile","dirname","randomBytes","readFile","join","resolve","join","resolve","readFile","randomBytes","unlink","mkdir","dirname","readFile","copyFile","join","readFile","readFile","writeFile","join","join","readFile","writeFile","cp","mkdir","readdir","stat","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","access","mkdir","readFile","readdir","writeFile","dirname","join","fileExists","access","join","readdir","readFile","mkdir","dirname","writeFile","join","readdir","readFile","readdir","writeFile","cp","mkdir","rm","join","dirname","label","join","readFile","readdir","mkdir","cp","dirname","join","readdir","readFile","f","mkdir","cp","dirname","rm","dirname","readdir","join","mkdir","cp","execFileSync","stat","chalk","readFile","join","normalize","isAbsolute","isAbsolute","normalize","join","readFile","readdir","stat","access","join","dirname","relative","readdir","join","stat","access","createHash","mkdir","access","readFile","join","relative","fileURLToPath","dirname","access","readFile","readdir","join","join","readdir","readFile","access","execFileSync","__dirname","dirname","fileURLToPath","join","readFile","createHash","access","mkdir","relative","readFileSync","readFileSync","__dirname","dirname","fileURLToPath","chalk","inquirer","join","readFile","repo","access","mkdir","readFile","fileURLToPath","basename","dirname","join","chalk","inquirer","__dirname","dirname","fileURLToPath","CONTENT_ROOT","chalk","join","mkdir","readFile","access","inquirer","repoInfo","remoteUrl","platform","owner","repo","namespace","project","tools","features","mcpServers","defaultBranch","projectType","teamSize","contentSelection","orchWarnings","wsManifest","basename","r","stat","readdir","join","execFileSync","chalk","join","stat","readdir","execFileSync","chalk","r","readdir","readFile","access","join","posix","chalk","parseYaml","validateManifest","access","join","readdir","readFile","parseYaml","posix","f","chalk","join","chalk","join","chalk","readFile","readdir","stat","join","chalk","readdir","join","info","stat","chalk","readFile"]}
|