agemon 0.1.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +732 -28
  2. package/assets/skills/architecture/agemon-architecture/LICENSE +21 -0
  3. package/assets/skills/architecture/agemon-architecture/NOTICE.md +9 -0
  4. package/assets/skills/architecture/agemon-architecture/SKILL.md +275 -0
  5. package/assets/skills/code-quality/agemon-clean-code/LICENSE +21 -0
  6. package/assets/skills/code-quality/agemon-clean-code/NOTICE.md +9 -0
  7. package/assets/skills/code-quality/agemon-clean-code/SKILL.md +78 -0
  8. package/assets/skills/code-quality/agemon-house-rules/SKILL.md +103 -0
  9. package/assets/skills/commit/agemon-commit/SKILL.md +87 -0
  10. package/assets/skills/design/agemon-design/LICENSE +21 -0
  11. package/assets/skills/design/agemon-design/NOTICE.md +9 -0
  12. package/assets/skills/design/agemon-design/SKILL.md +391 -0
  13. package/assets/skills/design/agemon-design/references/accessibility.md +182 -0
  14. package/assets/skills/design/agemon-design/references/agents.md +63 -0
  15. package/assets/skills/design/agemon-design/references/ai-chat.md +158 -0
  16. package/assets/skills/design/agemon-design/references/brief.md +186 -0
  17. package/assets/skills/design/agemon-design/references/color.md +216 -0
  18. package/assets/skills/design/agemon-design/references/components.md +91 -0
  19. package/assets/skills/design/agemon-design/references/copy.md +300 -0
  20. package/assets/skills/design/agemon-design/references/craft-intent.md +160 -0
  21. package/assets/skills/design/agemon-design/references/dashboard.md +131 -0
  22. package/assets/skills/design/agemon-design/references/dataviz.md +197 -0
  23. package/assets/skills/design/agemon-design/references/finish-bar.md +243 -0
  24. package/assets/skills/design/agemon-design/references/forms.md +192 -0
  25. package/assets/skills/design/agemon-design/references/heuristics.md +403 -0
  26. package/assets/skills/design/agemon-design/references/inspiration.md +287 -0
  27. package/assets/skills/design/agemon-design/references/layout.md +236 -0
  28. package/assets/skills/design/agemon-design/references/loops.md +155 -0
  29. package/assets/skills/design/agemon-design/references/metadata.md +98 -0
  30. package/assets/skills/design/agemon-design/references/modern-css.md +448 -0
  31. package/assets/skills/design/agemon-design/references/motion.md +434 -0
  32. package/assets/skills/design/agemon-design/references/personas.md +206 -0
  33. package/assets/skills/design/agemon-design/references/principles-catalog.md +299 -0
  34. package/assets/skills/design/agemon-design/references/recipe-auth.md +88 -0
  35. package/assets/skills/design/agemon-design/references/recipe-dashboard.md +130 -0
  36. package/assets/skills/design/agemon-design/references/recipe-landing.md +122 -0
  37. package/assets/skills/design/agemon-design/references/responsive.md +168 -0
  38. package/assets/skills/design/agemon-design/references/review.md +340 -0
  39. package/assets/skills/design/agemon-design/references/sound.md +150 -0
  40. package/assets/skills/design/agemon-design/references/spec.md +123 -0
  41. package/assets/skills/design/agemon-design/references/stack.md +522 -0
  42. package/assets/skills/design/agemon-design/references/state-design.md +188 -0
  43. package/assets/skills/design/agemon-design/references/themes.md +229 -0
  44. package/assets/skills/design/agemon-design/references/tokens.md +350 -0
  45. package/assets/skills/design/agemon-design/references/typography.md +246 -0
  46. package/assets/skills/design/agemon-design-dashboard/LICENSE +21 -0
  47. package/assets/skills/design/agemon-design-dashboard/NOTICE.md +9 -0
  48. package/assets/skills/design/agemon-design-dashboard/SKILL.md +113 -0
  49. package/assets/skills/design/agemon-design-editorial/LICENSE +21 -0
  50. package/assets/skills/design/agemon-design-editorial/NOTICE.md +9 -0
  51. package/assets/skills/design/agemon-design-editorial/SKILL.md +98 -0
  52. package/assets/skills/design/agemon-design-minimal/LICENSE +21 -0
  53. package/assets/skills/design/agemon-design-minimal/NOTICE.md +9 -0
  54. package/assets/skills/design/agemon-design-minimal/SKILL.md +97 -0
  55. package/assets/skills/geo-seo/geo/LICENSE +21 -0
  56. package/assets/skills/geo-seo/geo/NOTICE.md +18 -0
  57. package/assets/skills/geo-seo/geo/SKILL.md +145 -0
  58. package/assets/skills/geo-seo/geo-audit/LICENSE +21 -0
  59. package/assets/skills/geo-seo/geo-audit/NOTICE.md +17 -0
  60. package/assets/skills/geo-seo/geo-audit/SKILL.md +371 -0
  61. package/assets/skills/geo-seo/geo-audit/references/ai-visibility.md +233 -0
  62. package/assets/skills/geo-seo/geo-audit/references/content.md +329 -0
  63. package/assets/skills/geo-seo/geo-audit/references/platform-analysis.md +294 -0
  64. package/assets/skills/geo-seo/geo-audit/references/schema.md +383 -0
  65. package/assets/skills/geo-seo/geo-audit/references/technical.md +368 -0
  66. package/assets/skills/geo-seo/geo-brand-mentions/LICENSE +21 -0
  67. package/assets/skills/geo-seo/geo-brand-mentions/NOTICE.md +15 -0
  68. package/assets/skills/geo-seo/geo-brand-mentions/SKILL.md +459 -0
  69. package/assets/skills/geo-seo/geo-citability/LICENSE +21 -0
  70. package/assets/skills/geo-seo/geo-citability/NOTICE.md +14 -0
  71. package/assets/skills/geo-seo/geo-citability/SKILL.md +320 -0
  72. package/assets/skills/geo-seo/geo-content/LICENSE +21 -0
  73. package/assets/skills/geo-seo/geo-content/NOTICE.md +14 -0
  74. package/assets/skills/geo-seo/geo-content/SKILL.md +352 -0
  75. package/assets/skills/geo-seo/geo-crawlers/LICENSE +21 -0
  76. package/assets/skills/geo-seo/geo-crawlers/NOTICE.md +15 -0
  77. package/assets/skills/geo-seo/geo-crawlers/SKILL.md +388 -0
  78. package/assets/skills/geo-seo/geo-llmstxt/LICENSE +21 -0
  79. package/assets/skills/geo-seo/geo-llmstxt/NOTICE.md +14 -0
  80. package/assets/skills/geo-seo/geo-llmstxt/SKILL.md +433 -0
  81. package/assets/skills/geo-seo/geo-platform-optimizer/LICENSE +21 -0
  82. package/assets/skills/geo-seo/geo-platform-optimizer/NOTICE.md +14 -0
  83. package/assets/skills/geo-seo/geo-platform-optimizer/SKILL.md +282 -0
  84. package/assets/skills/geo-seo/geo-report/LICENSE +21 -0
  85. package/assets/skills/geo-seo/geo-report/NOTICE.md +14 -0
  86. package/assets/skills/geo-seo/geo-report/SKILL.md +406 -0
  87. package/assets/skills/geo-seo/geo-report-pdf/LICENSE +21 -0
  88. package/assets/skills/geo-seo/geo-report-pdf/NOTICE.md +20 -0
  89. package/assets/skills/geo-seo/geo-report-pdf/SKILL.md +153 -0
  90. package/assets/skills/geo-seo/geo-report-pdf/templates/geo-report-template.html +548 -0
  91. package/assets/skills/geo-seo/geo-schema/LICENSE +21 -0
  92. package/assets/skills/geo-seo/geo-schema/NOTICE.md +16 -0
  93. package/assets/skills/geo-seo/geo-schema/SKILL.md +396 -0
  94. package/assets/skills/geo-seo/geo-technical/LICENSE +21 -0
  95. package/assets/skills/geo-seo/geo-technical/NOTICE.md +15 -0
  96. package/assets/skills/geo-seo/geo-technical/SKILL.md +566 -0
  97. package/assets/skills/performance/agemon-performance/NOTICE.md +1 -0
  98. package/assets/skills/performance/agemon-performance/SKILL.md +76 -0
  99. package/assets/skills/security/agemon-security/LICENSE +21 -0
  100. package/assets/skills/security/agemon-security/NOTICE.md +8 -0
  101. package/assets/skills/security/agemon-security/SKILL.md +356 -0
  102. package/assets/skills/self-review/agemon-review-intake/LICENSE +21 -0
  103. package/assets/skills/self-review/agemon-review-intake/NOTICE.md +9 -0
  104. package/assets/skills/self-review/agemon-review-intake/SKILL.md +205 -0
  105. package/assets/skills/self-review/agemon-review-request/LICENSE +21 -0
  106. package/assets/skills/self-review/agemon-review-request/NOTICE.md +9 -0
  107. package/assets/skills/self-review/agemon-review-request/SKILL.md +104 -0
  108. package/assets/skills/self-review/agemon-review-request/code-reviewer.md +188 -0
  109. package/assets/skills/self-review/agemon-root-cause/LICENSE +21 -0
  110. package/assets/skills/self-review/agemon-root-cause/NOTICE.md +10 -0
  111. package/assets/skills/self-review/agemon-root-cause/SKILL.md +283 -0
  112. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting-example.ts +158 -0
  113. package/assets/skills/self-review/agemon-root-cause/condition-based-waiting.md +115 -0
  114. package/assets/skills/self-review/agemon-root-cause/defense-in-depth.md +122 -0
  115. package/assets/skills/self-review/agemon-root-cause/find-polluter.sh +72 -0
  116. package/assets/skills/self-review/agemon-root-cause/root-cause-tracing.md +169 -0
  117. package/assets/skills/self-review/agemon-root-cause/test-academic.md +14 -0
  118. package/assets/skills/self-review/agemon-root-cause/test-pressure-1.md +58 -0
  119. package/assets/skills/self-review/agemon-root-cause/test-pressure-2.md +68 -0
  120. package/assets/skills/self-review/agemon-root-cause/test-pressure-3.md +69 -0
  121. package/assets/skills/self-review/agemon-verify-before-done/LICENSE +21 -0
  122. package/assets/skills/self-review/agemon-verify-before-done/NOTICE.md +9 -0
  123. package/assets/skills/self-review/agemon-verify-before-done/SKILL.md +120 -0
  124. package/assets/skills/team-lead/agemon-plan-rfc/SKILL.md +317 -0
  125. package/assets/skills/team-lead/prd-generator/SKILL.md +437 -0
  126. package/assets/skills/team-lead/skill-headofit-audit/SKILL.md +72 -0
  127. package/assets/skills/team-lead/skill-incident-rca/SKILL.md +66 -0
  128. package/assets/skills/team-lead/skill-meeting-lifecycle/SKILL.md +63 -0
  129. package/assets/skills/team-lead/skill-obsidian-vault-sync/SKILL.md +69 -0
  130. package/assets/skills/team-lead/skill-prd-decomposer/SKILL.md +71 -0
  131. package/assets/skills/team-lead/skill-sec-check/SKILL.md +70 -0
  132. package/assets/skills/team-lead/skill-task-extractor/SKILL.md +79 -0
  133. package/assets/skills/team-lead/skill-tech-spike/SKILL.md +57 -0
  134. package/assets/skills/team-lead/skill-techlead-reviewer/SKILL.md +81 -0
  135. package/assets/tools/code-review-graph-constraints.txt +1418 -0
  136. package/assets/tools/package-lock.json +111 -0
  137. package/assets/tools/package.json +6 -0
  138. package/dist/chunk-5LATHJYU.js +4026 -0
  139. package/dist/chunk-5LATHJYU.js.map +1 -0
  140. package/dist/fake-subprocess-2BETWZVZ.js +666 -0
  141. package/dist/fake-subprocess-2BETWZVZ.js.map +1 -0
  142. package/dist/index.js +21101 -1956
  143. package/dist/index.js.map +1 -1
  144. package/package.json +30 -17
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/platform/detect.ts","../src/platform/service-manager/fake.ts","../src/platform/service-manager/linux.ts","../src/platform/service-manager/index.ts","../src/core/state-manifest.ts","../src/core/subprocess-runner.ts","../src/core/context.ts","../src/core/dev-mode.ts","../src/core/orchestrator.ts","../src/plugins/cli-tool/catalog.ts","../src/plugins/cli-tool/index.ts","../src/plugins/crg/index.ts","../src/plugins/daemon/index.ts","../src/plugins/master-prompt/index.ts","../src/plugins/patcher-checkpoint.ts","../src/patchers/markdown-block.ts","../src/plugins/skills/index.ts","../src/plugins/skills/catalog.ts","../src/plugins/test-plugin.ts","../src/plugins/workflow-scaffolder/index.ts","../src/plugins/workflow-scaffolder/catalog.ts","../src/plugins/index.ts","../src/ui/banner.ts","../src/ui/theme.ts","../src/ui/spinner.ts"],"sourcesContent":["import { fileURLToPath } from \"node:url\";\nimport { Command, CommanderError } from \"commander\";\nimport { createContext } from \"../core/context.js\";\nimport { assertFakeBackendsAreDevOnly } from \"../core/dev-mode.js\";\nimport { installPlugins, uninstallPlugins } from \"../core/orchestrator.js\";\nimport { getRegisteredPlugins } from \"../plugins/index.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { createStepSpinner } from \"../ui/spinner.js\";\nimport { theme } from \"../ui/theme.js\";\n\nconst VERSION = \"0.1.0\";\nconst DESCRIPTION =\n \"Bootstraps and reverses an AI coding agent's working environment in a repo.\";\n\ninterface CliOptions {\n dryRun?: boolean;\n yes?: boolean;\n only?: string;\n skipDaemon?: boolean;\n}\n\nasync function runInstall(options: CliOptions): Promise<void> {\n const spinner = createStepSpinner();\n const plugins = getRegisteredPlugins().filter(\n (plugin) => !(options.skipDaemon && plugin.id === \"daemon\"),\n );\n const context = await createContext({\n dryRun: Boolean(options.dryRun),\n yes: Boolean(options.yes),\n ui: spinner,\n });\n\n await installPlugins(context, plugins, { only: options.only });\n}\n\nasync function runNuke(options: CliOptions): Promise<void> {\n const spinner = createStepSpinner();\n const plugins = getRegisteredPlugins();\n const context = await createContext({\n dryRun: Boolean(options.dryRun),\n yes: Boolean(options.yes),\n ui: spinner,\n });\n\n await uninstallPlugins(context, plugins, { only: options.only });\n}\n\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"agemon\")\n .description(DESCRIPTION)\n .version(VERSION)\n .option(\"--dry-run\", \"narrate actions without making changes\")\n .option(\"--yes\", \"skip confirmation prompts\")\n .option(\"--skip-daemon\", \"skip daemon registration\")\n .option(\"--only <plugins>\", \"comma-separated list of plugin ids to run\")\n .option(\"--no-color\", \"disable colored output\")\n .option(\"-v, --verbose\", \"show raw subprocess output beneath each step\")\n .option(\"-q, --quiet\", \"print only the final summary\")\n .addHelpText(\"beforeAll\", () => `${renderBanner(\"agemon\", DESCRIPTION)}\\n`)\n .hook(\"preAction\", (thisCommand) => {\n if (thisCommand.opts().color === false) {\n process.env.NO_COLOR = \"1\";\n }\n })\n .action((options: CliOptions) => runInstall(options));\n\n program\n .command(\"nuke\")\n .description(\"Reverse agemon-managed changes\")\n .option(\"--dry-run\", \"narrate actions without making changes\")\n .option(\"--yes\", \"skip confirmation prompts\")\n .option(\"--only <plugins>\", \"comma-separated list of plugin ids to run\")\n .action((options: CliOptions) => runNuke(options));\n\n program.exitOverride();\n\n return program;\n}\n\nexport async function runCli(argv: string[]): Promise<number> {\n const program = createProgram();\n\n try {\n assertFakeBackendsAreDevOnly();\n await program.parseAsync(argv, { from: \"user\" });\n return 0;\n } catch (error) {\n if (error instanceof CommanderError) {\n return error.exitCode;\n }\n console.error(\n theme.error(error instanceof Error ? error.message : String(error)),\n );\n return 1;\n }\n}\n\nconst isDirectlyExecuted =\n process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];\nif (isDirectlyExecuted) {\n process.exitCode = await runCli(process.argv.slice(2));\n}\n","import { constants } from \"node:fs\";\nimport { access, readFile } from \"node:fs/promises\";\nimport { delimiter, join } from \"node:path\";\n\nexport const REQUIRED_BINARIES = [\n \"python3\",\n \"pip\",\n \"pipx\",\n \"uv\",\n \"crg\",\n] as const;\n\nexport type RequiredBinary = (typeof REQUIRED_BINARIES)[number];\n\nexport interface BinaryDetectionResult {\n name: RequiredBinary;\n present: boolean;\n path?: string;\n}\n\nexport interface PlatformDetectionResult {\n os: \"ubuntu\";\n osReleasePath: string;\n binaries: Record<RequiredBinary, BinaryDetectionResult>;\n}\n\nexport interface DetectPlatformInput {\n osReleasePath?: string;\n pathEnv?: string;\n}\n\nexport class UnsupportedPlatformError extends Error {\n constructor(osId: string, osReleasePath: string) {\n super(\n `agemon v1 supports Ubuntu only. Detected '${osId}' in ${osReleasePath}. Windows and macOS support are planned for v2.`,\n );\n }\n}\n\nfunction normalizeOsReleaseValue(value: string): string {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('\"') && trimmedValue.endsWith('\"')) ||\n (trimmedValue.startsWith(\"'\") && trimmedValue.endsWith(\"'\"))\n ) {\n return trimmedValue.slice(1, -1);\n }\n return trimmedValue;\n}\n\nfunction parseOsReleaseId(osReleaseContents: string): string {\n const lines = osReleaseContents.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine.length === 0 || trimmedLine.startsWith(\"#\")) {\n continue;\n }\n\n const separatorIndex = trimmedLine.indexOf(\"=\");\n if (separatorIndex === -1) {\n continue;\n }\n\n const key = trimmedLine.slice(0, separatorIndex).trim();\n if (key !== \"ID\") {\n continue;\n }\n\n return normalizeOsReleaseValue(\n trimmedLine.slice(separatorIndex + 1),\n ).toLowerCase();\n }\n\n return \"unknown\";\n}\n\nasync function findBinaryPath(\n binaryName: RequiredBinary,\n pathEnv: string,\n): Promise<string | undefined> {\n for (const pathEntry of pathEnv.split(delimiter)) {\n if (!pathEntry) {\n continue;\n }\n\n const binaryPath = join(pathEntry, binaryName);\n try {\n await access(binaryPath, constants.X_OK);\n return binaryPath;\n } catch {}\n }\n\n return undefined;\n}\n\nasync function detectBinaries(\n pathEnv: string,\n): Promise<Record<RequiredBinary, BinaryDetectionResult>> {\n const binaryResults = await Promise.all(\n REQUIRED_BINARIES.map(async (binaryName) => {\n const binaryPath = await findBinaryPath(binaryName, pathEnv);\n return {\n name: binaryName,\n present: binaryPath !== undefined,\n path: binaryPath,\n } satisfies BinaryDetectionResult;\n }),\n );\n\n return Object.fromEntries(\n binaryResults.map((binaryResult) => [binaryResult.name, binaryResult]),\n ) as Record<RequiredBinary, BinaryDetectionResult>;\n}\n\nfunction resolveOsReleasePath(input: DetectPlatformInput): string {\n return (\n input.osReleasePath ??\n process.env.AGEMON_OS_RELEASE_PATH ??\n \"/etc/os-release\"\n );\n}\n\nexport async function detectPlatform(\n input: DetectPlatformInput = {},\n): Promise<PlatformDetectionResult> {\n const osReleasePath = resolveOsReleasePath(input);\n const osReleaseContents = await readFile(osReleasePath, \"utf8\");\n const osId = parseOsReleaseId(osReleaseContents);\n\n if (osId !== \"ubuntu\") {\n throw new UnsupportedPlatformError(osId, osReleasePath);\n }\n\n return {\n os: \"ubuntu\",\n osReleasePath,\n binaries: await detectBinaries(input.pathEnv ?? process.env.PATH ?? \"\"),\n };\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n RegisterAutostartInput,\n RegisterAutostartResult,\n ServiceManager,\n ServiceStatus,\n UnregisterAutostartInput,\n} from \"./index.js\";\n\ninterface CreateFakeServiceManagerInput {\n homeDir?: string;\n user?: string;\n}\n\ninterface FakeServiceState {\n unitName: string;\n unitContents: string;\n user: string;\n active: boolean;\n lingerEnabledByAgemon: boolean;\n}\n\nfunction resolveHomeDir(homeDir?: string): string {\n return homeDir ?? process.env.HOME ?? homedir();\n}\n\nfunction resolveUser(user?: string): string {\n return user ?? process.env.USER ?? \"unknown-user\";\n}\n\nfunction markerPath(homeDir: string, unitName: string): string {\n return join(homeDir, \".agemon\", \"fake-services\", `${unitName}.json`);\n}\n\nasync function readMarker(\n homeDir: string,\n unitName: string,\n): Promise<FakeServiceState | null> {\n try {\n const markerContents = await readFile(\n markerPath(homeDir, unitName),\n \"utf8\",\n );\n return JSON.parse(markerContents) as FakeServiceState;\n } catch {\n return null;\n }\n}\n\nexport function createFakeServiceManager(\n input: CreateFakeServiceManagerInput,\n): ServiceManager {\n const homeDir = resolveHomeDir(input.homeDir);\n const user = resolveUser(input.user);\n\n const isActive = async (unitName: string): Promise<ServiceStatus> => {\n const marker = await readMarker(homeDir, unitName);\n return { active: marker?.active === true };\n };\n\n const registerAutostart = async (\n registration: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult> => {\n const destinationPath = markerPath(homeDir, registration.unitName);\n await mkdir(join(homeDir, \".agemon\", \"fake-services\"), { recursive: true });\n const state: FakeServiceState = {\n unitName: registration.unitName,\n unitContents: registration.unitContents,\n user,\n active: true,\n lingerEnabledByAgemon: true,\n };\n await writeFile(\n destinationPath,\n `${JSON.stringify(state, null, 2)}\\n`,\n \"utf8\",\n );\n\n return {\n unitPath: destinationPath,\n lingerEnabledByAgemon: state.lingerEnabledByAgemon,\n };\n };\n\n const unregisterAutostart = async (\n registration: UnregisterAutostartInput,\n ): Promise<void> => {\n await rm(markerPath(homeDir, registration.unitName), { force: true });\n };\n\n return {\n isActive,\n registerAutostart,\n unregisterAutostart,\n };\n}\n","import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport type {\n RegisterAutostartInput,\n RegisterAutostartResult,\n RunCommand,\n ServiceManager,\n ServiceStatus,\n UnregisterAutostartInput,\n} from \"./index.js\";\n\ninterface CreateLinuxServiceManagerInput {\n run: RunCommand;\n homeDir?: string;\n user?: string;\n}\n\nconst SYSTEM_COMMAND_TIMEOUT_MS = 20_000;\n\nfunction resolveHomeDir(homeDir?: string): string {\n return homeDir ?? process.env.HOME ?? homedir();\n}\n\nfunction resolveUser(user?: string): string {\n const resolvedUser = user ?? process.env.USER;\n if (!resolvedUser) {\n try {\n const fallbackUser = process.env.LOGNAME ?? process.env.USERNAME;\n if (fallbackUser) {\n return fallbackUser;\n }\n } catch {}\n throw new Error(\n \"Unable to resolve current user for loginctl commands. Set USER, LOGNAME, or pass an explicit user.\",\n );\n }\n return resolvedUser;\n}\n\nfunction resolveUnitPath(homeDir: string, unitName: string): string {\n return join(homeDir, \".config\", \"systemd\", \"user\", unitName);\n}\n\nfunction isMissingUnitError(stderr: string): boolean {\n const normalized = stderr.toLowerCase();\n return (\n normalized.includes(\"not loaded\") ||\n normalized.includes(\"no such file\") ||\n normalized.includes(\"not found\")\n );\n}\n\nasync function assertSucceeded(\n run: RunCommand,\n command: string,\n args: string[],\n failureMessage: string,\n): Promise<{ stdout: string; stderr: string }> {\n const result = await run(command, args, {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n });\n if (result.code !== 0) {\n throw new Error(result.stderr || failureMessage);\n }\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nexport function createLinuxServiceManager(\n input: CreateLinuxServiceManagerInput,\n): ServiceManager {\n const homeDir = resolveHomeDir(input.homeDir);\n const user = resolveUser(input.user);\n\n const isActive = async (unitName: string): Promise<ServiceStatus> => {\n const result = await input.run(\n \"systemctl\",\n [\"--user\", \"is-active\", unitName],\n {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n },\n );\n return { active: result.code === 0 };\n };\n\n const registerAutostart = async (\n registration: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult> => {\n const unitPath = resolveUnitPath(homeDir, registration.unitName);\n await mkdir(dirname(unitPath), { recursive: true });\n await writeFile(unitPath, registration.unitContents, \"utf8\");\n\n const lingerStatus = await assertSucceeded(\n input.run,\n \"loginctl\",\n [\"show-user\", user, \"--property=Linger\", \"--value\"],\n \"Unable to read linger status.\",\n );\n const lingerWasOn = lingerStatus.stdout.trim() === \"yes\";\n\n if (!lingerWasOn) {\n await assertSucceeded(\n input.run,\n \"loginctl\",\n [\"enable-linger\", user],\n \"Unable to enable linger for current user.\",\n );\n }\n\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"daemon-reload\"],\n \"Unable to reload systemd user units.\",\n );\n\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"enable\", \"--now\", registration.unitName],\n \"Unable to enable/start the daemon unit.\",\n );\n\n return {\n unitPath,\n lingerEnabledByAgemon: !lingerWasOn,\n };\n };\n\n const unregisterAutostart = async (\n registration: UnregisterAutostartInput,\n ): Promise<void> => {\n const disableResult = await input.run(\n \"systemctl\",\n [\"--user\", \"disable\", \"--now\", registration.unitName],\n {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n },\n );\n if (\n disableResult.code !== 0 &&\n !isMissingUnitError(disableResult.stderr || \"\")\n ) {\n throw new Error(\n disableResult.stderr ||\n \"Unable to disable/stop the daemon unit during uninstall.\",\n );\n }\n\n const unitPath = resolveUnitPath(homeDir, registration.unitName);\n await rm(unitPath, { force: true });\n\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"daemon-reload\"],\n \"Unable to reload systemd user units.\",\n );\n\n if (registration.disableLinger) {\n await assertSucceeded(\n input.run,\n \"loginctl\",\n [\"disable-linger\", user],\n \"Unable to disable linger for current user.\",\n );\n }\n };\n\n return {\n isActive,\n registerAutostart,\n unregisterAutostart,\n };\n}\n","import { createFakeServiceManager } from \"./fake.js\";\nimport { createLinuxServiceManager } from \"./linux.js\";\n\nexport interface RunCommandResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface RunCommandOptions {\n timeoutMs?: number;\n killSignal?: NodeJS.Signals;\n}\n\nexport type RunCommand = (\n command: string,\n args: string[],\n options?: RunCommandOptions,\n) => Promise<RunCommandResult>;\n\nexport interface ServiceStatus {\n active: boolean;\n}\n\nexport interface RegisterAutostartInput {\n unitName: string;\n unitContents: string;\n}\n\nexport interface RegisterAutostartResult {\n unitPath: string;\n lingerEnabledByAgemon: boolean;\n}\n\nexport interface UnregisterAutostartInput {\n unitName: string;\n disableLinger: boolean;\n}\n\nexport interface ServiceManager {\n isActive(unitName: string): Promise<ServiceStatus>;\n registerAutostart(\n input: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult>;\n unregisterAutostart(input: UnregisterAutostartInput): Promise<void>;\n}\n\nexport interface CreateServiceManagerInput {\n os: \"ubuntu\";\n run: RunCommand;\n homeDir?: string;\n user?: string;\n}\n\nexport function createServiceManager(\n input: CreateServiceManagerInput,\n): ServiceManager {\n if (process.env.AGEMON_FAKE_SERVICES === \"1\") {\n return createFakeServiceManager({\n homeDir: input.homeDir,\n user: input.user,\n });\n }\n\n return createLinuxServiceManager({\n run: input.run,\n homeDir: input.homeDir,\n user: input.user,\n });\n}\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nconst MANIFEST_RELATIVE_PATH = \".agemon/state.json\";\n\nexport interface ManifestAction {\n id: string;\n plugin: string;\n type: string;\n target: string;\n preExisting: boolean;\n createdAt: string;\n}\n\nexport interface StateManifestData {\n version: 1;\n createdAt: string;\n updatedAt: string;\n os: \"linux\";\n actions: ManifestAction[];\n}\n\nexport interface RecordManifestActionInput {\n plugin: string;\n type: string;\n target: string;\n preExisting: boolean;\n}\n\nfunction createDefaultState(now: string): StateManifestData {\n return {\n version: 1,\n createdAt: now,\n updatedAt: now,\n os: \"linux\",\n actions: [],\n };\n}\n\nfunction isManifestAction(value: unknown): value is ManifestAction {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const typed = value as Partial<ManifestAction>;\n return (\n typeof typed.id === \"string\" &&\n typeof typed.plugin === \"string\" &&\n typeof typed.type === \"string\" &&\n typeof typed.target === \"string\" &&\n typeof typed.preExisting === \"boolean\" &&\n typeof typed.createdAt === \"string\"\n );\n}\n\nfunction isStateManifestData(value: unknown): value is StateManifestData {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const typed = value as Partial<StateManifestData>;\n return (\n typed.version === 1 &&\n typed.os === \"linux\" &&\n typeof typed.createdAt === \"string\" &&\n typeof typed.updatedAt === \"string\" &&\n Array.isArray(typed.actions) &&\n typed.actions.every((action) => isManifestAction(action))\n );\n}\n\nexport class StateManifest {\n private constructor(\n private readonly manifestPath: string,\n private state: StateManifestData,\n ) {}\n\n static async load(cwd: string): Promise<StateManifest> {\n const manifestPath = join(cwd, MANIFEST_RELATIVE_PATH);\n const now = new Date().toISOString();\n\n try {\n const contents = await readFile(manifestPath, \"utf8\");\n const parsed = JSON.parse(contents) as unknown;\n if (!isStateManifestData(parsed)) {\n throw new Error(\"State manifest has an invalid schema\");\n }\n return new StateManifest(manifestPath, parsed);\n } catch (error) {\n const errno = error as NodeJS.ErrnoException;\n if (errno.code === \"ENOENT\") {\n return new StateManifest(manifestPath, createDefaultState(now));\n }\n throw new Error(\n `Unable to load manifest at ${manifestPath}: ${String(error)}`,\n );\n }\n }\n\n getActions(): ManifestAction[] {\n return [...this.state.actions];\n }\n\n hasActions(): boolean {\n return this.state.actions.length > 0;\n }\n\n hasActionForPlugin(plugin: string): boolean {\n return this.state.actions.some((action) => action.plugin === plugin);\n }\n\n async recordAction(\n input: RecordManifestActionInput,\n ): Promise<ManifestAction> {\n const action: ManifestAction = {\n id: randomUUID(),\n plugin: input.plugin,\n type: input.type,\n target: input.target,\n preExisting: input.preExisting,\n createdAt: new Date().toISOString(),\n };\n this.state.actions.push(action);\n await this.persist();\n return action;\n }\n\n async removeActionsForPlugin(plugin: string): Promise<void> {\n const nextActions = this.state.actions.filter(\n (action) => action.plugin !== plugin,\n );\n if (nextActions.length === this.state.actions.length) {\n return;\n }\n this.state.actions = nextActions;\n await this.persist();\n }\n\n async pruneIfEmpty(): Promise<void> {\n if (this.state.actions.length > 0) {\n return;\n }\n\n const manifestDir = dirname(this.manifestPath);\n await rm(this.manifestPath, { force: true });\n try {\n await rm(manifestDir, { recursive: false });\n } catch {\n return;\n }\n }\n\n private async persist(): Promise<void> {\n const now = new Date().toISOString();\n this.state.updatedAt = now;\n\n const payload = `${JSON.stringify(this.state, null, 2)}\\n`;\n const manifestDir = dirname(this.manifestPath);\n const tempPath = `${this.manifestPath}.tmp-${process.pid}-${Date.now()}`;\n\n await mkdir(manifestDir, { recursive: true });\n await writeFile(tempPath, payload, \"utf8\");\n await rename(tempPath, this.manifestPath);\n }\n}\n","import { spawn } from \"node:child_process\";\n\nexport interface SubprocessResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface RunSubprocessOptions {\n timeoutMs?: number;\n killSignal?: NodeJS.Signals;\n}\n\nfunction formatCommand(command: string, args: string[]): string {\n return [command, ...args].join(\" \");\n}\n\nlet fakeCrgInstalledState: boolean | null = null;\nlet fakeInstalledSkillNames: Set<string> | null = null;\nlet fakeInstalledGlobalNpmPackageNames: Set<string> | null = null;\nlet fakeStateSignature: string | null = null;\n\nfunction buildFakeStateSignature(): string {\n return [\n process.env.AGEMON_FAKE_PREINSTALLED_CRG ?? \"\",\n process.env.AGEMON_FAKE_PREINSTALLED_SKILLS ?? \"\",\n process.env.AGEMON_FAKE_PREINSTALLED_NPM_PACKAGES ?? \"\",\n ].join(\"||\");\n}\n\nfunction initializeFakeStateIfNeeded(): void {\n const currentStateSignature = buildFakeStateSignature();\n if (\n fakeCrgInstalledState !== null &&\n fakeStateSignature === currentStateSignature\n ) {\n return;\n }\n fakeStateSignature = currentStateSignature;\n\n fakeCrgInstalledState = process.env.AGEMON_FAKE_PREINSTALLED_CRG === \"1\";\n\n const preinstalledSkills = process.env.AGEMON_FAKE_PREINSTALLED_SKILLS?.split(\n \",\",\n )\n .map((skillName) => skillName.trim())\n .filter((skillName) => skillName.length > 0);\n fakeInstalledSkillNames = new Set(preinstalledSkills ?? []);\n\n const preinstalledGlobalNpmPackages =\n process.env.AGEMON_FAKE_PREINSTALLED_NPM_PACKAGES?.split(\",\")\n .map((packageName) => packageName.trim())\n .filter((packageName) => packageName.length > 0);\n fakeInstalledGlobalNpmPackageNames = new Set(\n preinstalledGlobalNpmPackages ?? [],\n );\n}\n\nfunction readOptionValue(\n args: string[],\n optionName: string,\n): string | undefined {\n const optionIndex = args.indexOf(optionName);\n if (optionIndex < 0) {\n return undefined;\n }\n\n return args[optionIndex + 1];\n}\n\nfunction buildFakeSkillsList(): SubprocessResult {\n const skills = Array.from(fakeInstalledSkillNames ?? []).map((name) => ({\n name,\n path: `/fake/.claude/skills/${name}`,\n scope: \"project\",\n agents: [\"Claude Code\"],\n }));\n\n return {\n code: 0,\n stdout: `${JSON.stringify(skills, null, 2)}\\n`,\n stderr: \"\",\n };\n}\n\nfunction buildFakeSkillsAdd(args: string[]): SubprocessResult {\n const packageSource = args[2];\n if (!packageSource) {\n return {\n code: 1,\n stdout: \"\",\n stderr: \"skills add requires a package source\",\n };\n }\n\n const skillName = readOptionValue(args, \"--skill\") ?? packageSource;\n fakeInstalledSkillNames?.add(skillName);\n\n return {\n code: 0,\n stdout: `installed skill ${skillName} from ${packageSource}\\n`,\n stderr: \"\",\n };\n}\n\nfunction buildFakeSkillsRemove(args: string[]): SubprocessResult {\n const skillNames = args\n .slice(2)\n .filter((arg) => arg.length > 0 && !arg.startsWith(\"-\"));\n\n for (const skillName of skillNames) {\n fakeInstalledSkillNames?.delete(skillName);\n }\n\n return {\n code: 0,\n stdout: `removed ${skillNames.length} skill(s)\\n`,\n stderr: \"\",\n };\n}\n\nfunction buildFakeNpxResponse(args: string[]): SubprocessResult | undefined {\n if (args[0] !== \"skills\") {\n return undefined;\n }\n\n const subcommand = args[1];\n if (subcommand === \"list\" || subcommand === \"ls\") {\n return buildFakeSkillsList();\n }\n\n if (subcommand === \"add\") {\n return buildFakeSkillsAdd(args);\n }\n\n if (subcommand === \"remove\" || subcommand === \"rm\") {\n return buildFakeSkillsRemove(args);\n }\n\n return {\n code: 0,\n stdout: `[fake subprocess] npx ${args.join(\" \")}\\n`,\n stderr: \"\",\n };\n}\n\nfunction buildFakeCrgResponse(args: string[]): SubprocessResult {\n if (!fakeCrgInstalledState) {\n return {\n code: 1,\n stdout: \"\",\n stderr: \"code-review-graph: command not found\",\n };\n }\n\n if (args[0] === \"status\") {\n return {\n code: 0,\n stdout: \"Files: 1\\nNodes: 1\\nEdges: 1\\n\",\n stderr: \"\",\n };\n }\n\n if (args[0] === \"build\") {\n return {\n code: 0,\n stdout: \"Graph build complete\\n\",\n stderr: \"\",\n };\n }\n\n return {\n code: 0,\n stdout: \"code-review-graph 0.0.0-fake\\n\",\n stderr: \"\",\n };\n}\n\nfunction buildFakePipxResponse(args: string[]): SubprocessResult | undefined {\n if (\n args[0] === \"run\" &&\n args[1] === \"--spec\" &&\n args[2] === \"code-review-graph\" &&\n args[3] === \"code-review-graph\"\n ) {\n return buildFakeCrgResponse(args.slice(4));\n }\n\n const [operation, packageName] = args;\n if (packageName !== \"code-review-graph\") {\n return undefined;\n }\n\n if (operation === \"install\") {\n fakeCrgInstalledState = true;\n return {\n code: 0,\n stdout: \"installed package code-review-graph\\n\",\n stderr: \"\",\n };\n }\n\n if (operation === \"uninstall\") {\n fakeCrgInstalledState = false;\n return {\n code: 0,\n stdout: \"uninstalled package code-review-graph\\n\",\n stderr: \"\",\n };\n }\n\n return undefined;\n}\n\nfunction parseGlobalNpmPackageNames(args: string[]): string[] {\n const packageNames: string[] = [];\n\n for (let index = 1; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg || arg.startsWith(\"-\")) {\n continue;\n }\n packageNames.push(arg);\n }\n\n return packageNames;\n}\n\nfunction buildFakeNpmResponse(args: string[]): SubprocessResult | undefined {\n const operation = args[0];\n if (!operation) {\n return undefined;\n }\n\n const hasGlobalFlag = args.includes(\"-g\") || args.includes(\"--global\");\n if (!hasGlobalFlag) {\n return {\n code: 0,\n stdout: `[fake subprocess] npm ${args.join(\" \")}\\n`,\n stderr: \"\",\n };\n }\n\n const packageNames = parseGlobalNpmPackageNames(args);\n\n if (operation === \"install\") {\n for (const packageName of packageNames) {\n fakeInstalledGlobalNpmPackageNames?.add(packageName);\n }\n return {\n code: 0,\n stdout: `installed ${packageNames.length} package(s) globally\\n`,\n stderr: \"\",\n };\n }\n\n if (operation === \"uninstall\") {\n for (const packageName of packageNames) {\n fakeInstalledGlobalNpmPackageNames?.delete(packageName);\n }\n return {\n code: 0,\n stdout: `removed ${packageNames.length} package(s) globally\\n`,\n stderr: \"\",\n };\n }\n\n return {\n code: 0,\n stdout: `[fake subprocess] npm ${args.join(\" \")}\\n`,\n stderr: \"\",\n };\n}\n\nfunction buildFakeAgnixResponse(args: string[]): SubprocessResult {\n if (!fakeInstalledGlobalNpmPackageNames?.has(\"agnix\")) {\n return {\n code: 1,\n stdout: \"\",\n stderr: \"agnix: command not found\",\n };\n }\n\n if (args[0] === \"--version\") {\n return {\n code: 0,\n stdout: \"agnix 0.0.0-fake\\n\",\n stderr: \"\",\n };\n }\n\n if (args[0] === \"lint\") {\n return {\n code: 0,\n stdout: \"agnix lint passed\\n\",\n stderr: \"\",\n };\n }\n\n return {\n code: 0,\n stdout: `[fake subprocess] agnix ${args.join(\" \")}\\n`,\n stderr: \"\",\n };\n}\n\nexport async function runSubprocess(\n command: string,\n args: string[],\n options: RunSubprocessOptions = {},\n): Promise<SubprocessResult> {\n if (process.env.AGEMON_FAKE_SUBPROCESS === \"1\") {\n initializeFakeStateIfNeeded();\n\n if (command === \"pipx\") {\n const pipxResponse = buildFakePipxResponse(args);\n if (pipxResponse) {\n return pipxResponse;\n }\n }\n\n if (command === \"npx\") {\n const npxResponse = buildFakeNpxResponse(args);\n if (npxResponse) {\n return npxResponse;\n }\n }\n\n if (command === \"npm\") {\n const npmResponse = buildFakeNpmResponse(args);\n if (npmResponse) {\n return npmResponse;\n }\n }\n\n if (command === \"code-review-graph\") {\n return buildFakeCrgResponse(args);\n }\n\n if (command === \"agnix\") {\n return buildFakeAgnixResponse(args);\n }\n\n return {\n code: 0,\n stdout: `[fake subprocess] ${formatCommand(command, args)}\\n`,\n stderr: \"\",\n };\n }\n\n return await new Promise<SubprocessResult>((resolve) => {\n let settled = false;\n let timeoutHandle: NodeJS.Timeout | undefined;\n let hardKillHandle: NodeJS.Timeout | undefined;\n let timedOut = false;\n const finalize = (result: SubprocessResult): void => {\n if (settled) {\n return;\n }\n settled = true;\n if (timeoutHandle) {\n clearTimeout(timeoutHandle);\n }\n if (hardKillHandle) {\n clearTimeout(hardKillHandle);\n }\n resolve(result);\n };\n\n const childProcess = spawn(command, args, {\n cwd: process.cwd(),\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n if (options.timeoutMs && options.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n const signal = options.killSignal ?? \"SIGTERM\";\n const terminated = childProcess.kill(signal);\n if (!terminated) {\n finalize({\n code: 124,\n stdout,\n stderr: `${stderr}\\nCommand timed out after ${options.timeoutMs}ms and could not be signaled with ${signal}.`,\n });\n return;\n }\n\n hardKillHandle = setTimeout(() => {\n if (!settled) {\n childProcess.kill(\"SIGKILL\");\n }\n }, 2_000);\n }, options.timeoutMs);\n }\n\n let stdout = \"\";\n let stderr = \"\";\n\n childProcess.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += Buffer.from(chunk).toString(\"utf8\");\n });\n\n childProcess.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += Buffer.from(chunk).toString(\"utf8\");\n });\n\n childProcess.on(\"error\", (error: Error) => {\n const errorMessage = stderr\n ? `${stderr}\\nprocess spawn error: ${error.message}`\n : `process spawn error: ${error.message}`;\n finalize({\n code: 1,\n stdout,\n stderr: errorMessage,\n });\n });\n\n childProcess.on(\n \"close\",\n (code: number | null, signal: NodeJS.Signals | null) => {\n if (timedOut) {\n const timeoutMessage = `Command timed out after ${options.timeoutMs}ms.`;\n const timeoutStderr = stderr\n ? `${stderr}\\n${timeoutMessage}`\n : timeoutMessage;\n finalize({\n code: 124,\n stdout,\n stderr: timeoutStderr,\n });\n return;\n }\n\n if (signal) {\n finalize({\n code: 1,\n stdout,\n stderr: `${stderr}Process terminated by signal: ${signal}`,\n });\n return;\n }\n\n finalize({\n code: code ?? 1,\n stdout,\n stderr,\n });\n },\n );\n });\n}\n","import { detectPlatform, REQUIRED_BINARIES } from \"../platform/detect.js\";\nimport type { ServiceManager } from \"../platform/service-manager/index.js\";\nimport { createServiceManager } from \"../platform/service-manager/index.js\";\nimport type { StepSpinner } from \"../ui/spinner.js\";\nimport { StateManifest } from \"./state-manifest.js\";\nimport {\n type RunSubprocessOptions,\n runSubprocess,\n type SubprocessResult,\n} from \"./subprocess-runner.js\";\n\nexport type { SubprocessResult } from \"./subprocess-runner.js\";\n\nexport interface BinaryAvailability {\n name: string;\n present: boolean;\n path?: string;\n}\n\nexport interface Context {\n cwd: string;\n os: \"ubuntu\";\n binaries: BinaryAvailability[];\n dryRun: boolean;\n yes: boolean;\n log: Pick<Console, \"log\" | \"error\">;\n ui: StepSpinner;\n run: (\n command: string,\n args: string[],\n options?: RunSubprocessOptions,\n ) => Promise<SubprocessResult>;\n manifest: StateManifest;\n serviceManager: ServiceManager;\n}\n\nexport interface CreateContextInput {\n dryRun: boolean;\n yes: boolean;\n ui: StepSpinner;\n}\n\nexport async function createContext(\n input: CreateContextInput,\n): Promise<Context> {\n const platform = await detectPlatform({\n osReleasePath: process.env.AGEMON_OS_RELEASE_PATH,\n });\n\n for (const binaryName of REQUIRED_BINARIES) {\n const binary = platform.binaries[binaryName];\n const status = binary.present\n ? `present (${binary.path ?? \"resolved via PATH\"})`\n : \"missing\";\n input.ui.info(`Binary check: ${binaryName} ${status}`);\n }\n\n return {\n cwd: process.cwd(),\n os: platform.os,\n binaries: REQUIRED_BINARIES.map((name) => platform.binaries[name]),\n dryRun: input.dryRun,\n yes: input.yes,\n log: console,\n ui: input.ui,\n run: runSubprocess,\n manifest: await StateManifest.load(process.cwd()),\n serviceManager: createServiceManager({\n os: platform.os,\n run: runSubprocess,\n homeDir: process.env.HOME,\n user: process.env.USER,\n }),\n };\n}\n","const FAKE_BACKEND_ENV_VARS = [\n \"AGEMON_FAKE_SUBPROCESS\",\n \"AGEMON_FAKE_SERVICES\",\n] as const;\n\n/**\n * `AGEMON_FAKE_SUBPROCESS`/`AGEMON_FAKE_SERVICES` (see docs/plan.md §2.4) swap in fake\n * backends for the sandbox harness. Belt-and-suspenders against ever shipping a build\n * where they're silently on: they may only be set alongside `AGEMON_DEV`, which only\n * `scripts/sandbox.ts` and `npm run dev` set.\n */\nexport function assertFakeBackendsAreDevOnly(): void {\n const activeFakeVars = FAKE_BACKEND_ENV_VARS.filter(\n (name) => process.env[name] === \"1\",\n );\n if (activeFakeVars.length > 0 && process.env.AGEMON_DEV !== \"1\") {\n throw new Error(\n `${activeFakeVars.join(\", \")} must never be set outside the sandbox harness — refusing to start.`,\n );\n }\n}\n","import type { AgemonPlugin } from \"../plugins/types.js\";\nimport type { Context } from \"./context.js\";\n\nexport interface OrchestratorOptions {\n only?: string;\n}\n\nfunction parseOnlyPluginIds(only?: string): string[] {\n if (!only) return [];\n return only\n .split(\",\")\n .map((id) => id.trim())\n .filter((id) => id.length > 0);\n}\n\nfunction resolvePluginOrder(\n allPlugins: AgemonPlugin[],\n onlyIds: string[],\n): AgemonPlugin[] {\n const pluginById = new Map(allPlugins.map((plugin) => [plugin.id, plugin]));\n const unresolvedOnlyIds = onlyIds.filter((id) => !pluginById.has(id));\n if (unresolvedOnlyIds.length > 0) {\n throw new Error(`Unknown plugin id(s): ${unresolvedOnlyIds.join(\", \")}`);\n }\n\n const selected =\n onlyIds.length === 0\n ? [...allPlugins]\n : allPlugins.filter((plugin) => onlyIds.includes(plugin.id));\n\n const temporary = new Set<string>();\n const permanent = new Set<string>();\n const ordered: AgemonPlugin[] = [];\n\n const visit = (plugin: AgemonPlugin): void => {\n if (permanent.has(plugin.id)) {\n return;\n }\n if (temporary.has(plugin.id)) {\n throw new Error(`Circular dependency detected at plugin '${plugin.id}'.`);\n }\n\n temporary.add(plugin.id);\n for (const dependencyId of plugin.dependsOn ?? []) {\n const dependencyPlugin = pluginById.get(dependencyId);\n if (!dependencyPlugin) {\n throw new Error(\n `Plugin '${plugin.id}' depends on missing plugin '${dependencyId}'.`,\n );\n }\n visit(dependencyPlugin);\n }\n temporary.delete(plugin.id);\n permanent.add(plugin.id);\n ordered.push(plugin);\n };\n\n for (const plugin of selected) {\n visit(plugin);\n }\n\n return ordered;\n}\n\nfunction buildVerificationMessage(pluginId: string, detail?: string): string {\n if (!detail) return `Installed ${pluginId}`;\n return `Installed ${pluginId} (${detail})`;\n}\n\nexport async function installPlugins(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: OrchestratorOptions,\n): Promise<void> {\n const onlyIds = parseOnlyPluginIds(options.only);\n const plugins = resolvePluginOrder(allPlugins, onlyIds);\n\n if (plugins.length === 0) {\n ctx.ui.info(\"Nothing to do — no plugins selected.\");\n return;\n }\n\n for (const plugin of plugins) {\n ctx.ui.start(`Installing ${plugin.id}`);\n const presence = await plugin.detect(ctx);\n\n if (presence.present) {\n ctx.ui.succeed(`Already installed ${plugin.id}`);\n continue;\n }\n\n await plugin.install(ctx);\n const verification = await plugin.verify(ctx);\n if (!verification.ok) {\n ctx.ui.fail(`Verification failed for ${plugin.id}`);\n throw new Error(\n verification.detail ?? `Verification failed for plugin '${plugin.id}'.`,\n );\n }\n\n ctx.ui.succeed(buildVerificationMessage(plugin.id, verification.detail));\n }\n}\n\nexport async function uninstallPlugins(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: OrchestratorOptions,\n): Promise<void> {\n const onlyIds = parseOnlyPluginIds(options.only);\n const plugins = resolvePluginOrder(allPlugins, onlyIds).reverse();\n\n if (plugins.length === 0) {\n ctx.ui.info(\"Nothing to do — no plugins selected.\");\n return;\n }\n\n for (const plugin of plugins) {\n ctx.ui.start(`Uninstalling ${plugin.id}`);\n await plugin.uninstall(ctx);\n ctx.ui.succeed(`Uninstalled ${plugin.id}`);\n }\n\n await ctx.manifest.pruneIfEmpty();\n}\n","export interface CliToolBundleEntry {\n id: string;\n packageName: string;\n binaryName: string;\n}\n\nexport const CLI_TOOL_BUNDLE: CliToolBundleEntry[] = [\n {\n id: \"agnix\",\n packageName: \"agnix\",\n binaryName: \"agnix\",\n },\n];\n","import type { Context } from \"../../core/context.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n} from \"../types.js\";\nimport { CLI_TOOL_BUNDLE, type CliToolBundleEntry } from \"./catalog.js\";\n\nconst PLUGIN_ID = \"cli-tool\";\n\nconst ACTION_TYPE_INSTALLED_CLI_TOOL = \"installed-cli-tool\";\nconst ACTION_TYPE_PREEXISTING_CLI_TOOL = \"preexisting-cli-tool\";\n\nconst VERSION_CHECK_TIMEOUT_MS = 20_000;\nconst INSTALL_TIMEOUT_MS = 180_000;\nconst UNINSTALL_TIMEOUT_MS = 60_000;\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction hasManagedInstallRecord(ctx: Context, toolId: string): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_CLI_TOOL &&\n action.target === toolId &&\n action.preExisting === false,\n );\n}\n\nfunction hasPreexistingRecord(ctx: Context, toolId: string): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_PREEXISTING_CLI_TOOL &&\n action.target === toolId &&\n action.preExisting === true,\n );\n}\n\nfunction hasAnyRecordForTool(ctx: Context, toolId: string): boolean {\n return (\n hasManagedInstallRecord(ctx, toolId) || hasPreexistingRecord(ctx, toolId)\n );\n}\n\nasync function isToolBinaryAvailable(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<boolean> {\n const result = await ctx.run(entry.binaryName, [\"--version\"], {\n timeoutMs: VERSION_CHECK_TIMEOUT_MS,\n });\n return result.code === 0;\n}\n\nasync function detectCliTools(ctx: Context): Promise<PluginPresence> {\n const bundleAvailability = await Promise.all(\n CLI_TOOL_BUNDLE.map(async (entry) => ({\n entry,\n available: await isToolBinaryAvailable(ctx, entry),\n })),\n );\n\n if (bundleAvailability.some((tool) => !tool.available)) {\n return { present: false, preExisting: false };\n }\n\n const allManaged = CLI_TOOL_BUNDLE.every((entry) =>\n hasManagedInstallRecord(ctx, entry.id),\n );\n if (allManaged) {\n return { present: true, preExisting: false };\n }\n\n if (!ctx.dryRun) {\n for (const { entry } of bundleAvailability) {\n if (hasAnyRecordForTool(ctx, entry.id)) {\n continue;\n }\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_CLI_TOOL,\n target: entry.id,\n preExisting: true,\n });\n }\n }\n\n return { present: true, preExisting: true };\n}\n\nasync function installCliTools(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n for (const entry of CLI_TOOL_BUNDLE) {\n ctx.ui.info(`Would install ${entry.packageName} globally via npm`);\n }\n return;\n }\n\n for (const entry of CLI_TOOL_BUNDLE) {\n const toolIsAvailable = await isToolBinaryAvailable(ctx, entry);\n if (toolIsAvailable) {\n if (!hasAnyRecordForTool(ctx, entry.id)) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_CLI_TOOL,\n target: entry.id,\n preExisting: true,\n });\n }\n continue;\n }\n\n const installResult = await ctx.run(\n \"npm\",\n [\"install\", \"--global\", entry.packageName],\n {\n timeoutMs: INSTALL_TIMEOUT_MS,\n },\n );\n if (installResult.code !== 0) {\n throw new Error(\n installResult.stderr ||\n `npm global install failed for ${entry.packageName}`,\n );\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_INSTALLED_CLI_TOOL,\n target: entry.id,\n preExisting: false,\n });\n }\n}\n\nasync function verifyCliTools(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const missingToolIds: string[] = [];\n for (const entry of CLI_TOOL_BUNDLE) {\n const toolIsAvailable = await isToolBinaryAvailable(ctx, entry);\n if (!toolIsAvailable) {\n missingToolIds.push(entry.id);\n }\n }\n\n if (missingToolIds.length > 0) {\n return {\n ok: false,\n detail: `Missing CLI tool(s): ${missingToolIds.join(\", \")}`,\n };\n }\n\n return {\n ok: true,\n detail: `${CLI_TOOL_BUNDLE.length} CLI tool bundle entries present`,\n };\n}\n\nasync function uninstallCliTools(ctx: Context): Promise<void> {\n const managedActions = getPluginActions(ctx).filter(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_CLI_TOOL &&\n action.preExisting === false,\n );\n\n if (ctx.dryRun) {\n if (managedActions.length === 0) {\n ctx.ui.info(\"Would keep pre-existing CLI tools untouched\");\n return;\n }\n for (const action of managedActions) {\n const bundleEntry = CLI_TOOL_BUNDLE.find(\n (entry) => entry.id === action.target,\n );\n const packageName = bundleEntry?.packageName ?? action.target;\n ctx.ui.info(`Would uninstall global npm package ${packageName}`);\n }\n return;\n }\n\n for (const action of managedActions) {\n const bundleEntry = CLI_TOOL_BUNDLE.find(\n (entry) => entry.id === action.target,\n );\n const packageName = bundleEntry?.packageName ?? action.target;\n\n const uninstallResult = await ctx.run(\n \"npm\",\n [\"uninstall\", \"--global\", packageName],\n {\n timeoutMs: UNINSTALL_TIMEOUT_MS,\n },\n );\n if (uninstallResult.code !== 0) {\n throw new Error(\n uninstallResult.stderr ||\n `npm global uninstall failed for ${packageName}`,\n );\n }\n }\n\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n}\n\nexport const cliToolPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n detect: detectCliTools,\n install: installCliTools,\n verify: verifyCliTools,\n uninstall: uninstallCliTools,\n};\n","import type { Context } from \"../../core/context.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n} from \"../types.js\";\n\nconst PLUGIN_ID = \"crg\";\nconst PACKAGE_NAME = \"code-review-graph\";\nconst PIPX_RUN_PREFIX = [\"run\", \"--spec\", PACKAGE_NAME, \"code-review-graph\"];\n\nconst VERSION_CHECK_TIMEOUT_MS = 20_000;\nconst INSTALL_TIMEOUT_MS = 180_000;\nconst BUILD_TIMEOUT_MS = 300_000;\nconst STATUS_TIMEOUT_MS = 30_000;\nconst UNINSTALL_TIMEOUT_MS = 120_000;\n\nconst ACTION_TYPE_INSTALLED_BINARY = \"installed-binary\";\nconst ACTION_TYPE_PREEXISTING_BINARY = \"preexisting-binary\";\nconst ACTION_TYPE_GRAPH_BUILT = \"graph-built\";\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction hasManagedInstall(ctx: Context): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_BINARY &&\n action.preExisting === false,\n );\n}\n\nfunction hasPreexistingRecord(ctx: Context): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_PREEXISTING_BINARY &&\n action.preExisting === true,\n );\n}\n\nasync function detectCrgPresence(ctx: Context): Promise<PluginPresence> {\n const versionCheck = await ctx.run(\"code-review-graph\", [\"--version\"], {\n timeoutMs: VERSION_CHECK_TIMEOUT_MS,\n });\n const commandIsAvailable = versionCheck.code === 0;\n\n if (!commandIsAvailable) {\n return { present: false, preExisting: false };\n }\n\n if (hasManagedInstall(ctx)) {\n return { present: true, preExisting: false };\n }\n\n if (!hasPreexistingRecord(ctx) && !ctx.dryRun) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_BINARY,\n target: PACKAGE_NAME,\n preExisting: true,\n });\n }\n\n return { present: true, preExisting: true };\n}\n\nasync function installCrg(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(`Would install ${PACKAGE_NAME} via pipx`);\n ctx.ui.info(\"Would build graph for current repository\");\n return;\n }\n\n const installResult = await ctx.run(\"pipx\", [\"install\", PACKAGE_NAME], {\n timeoutMs: INSTALL_TIMEOUT_MS,\n });\n if (installResult.code !== 0) {\n throw new Error(\n installResult.stderr || `pipx install failed for ${PACKAGE_NAME}`,\n );\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_INSTALLED_BINARY,\n target: `${PACKAGE_NAME} (pipx)`,\n preExisting: false,\n });\n\n const buildResult = await ctx.run(\"pipx\", [...PIPX_RUN_PREFIX, \"build\"], {\n timeoutMs: BUILD_TIMEOUT_MS,\n });\n if (buildResult.code !== 0) {\n throw new Error(buildResult.stderr || \"code-review-graph build failed\");\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_GRAPH_BUILT,\n target: \".code-review-graph\",\n preExisting: false,\n });\n}\n\nasync function verifyCrg(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const statusResult = await ctx.run(\"pipx\", [...PIPX_RUN_PREFIX, \"status\"], {\n timeoutMs: STATUS_TIMEOUT_MS,\n });\n if (statusResult.code !== 0) {\n return {\n ok: false,\n detail: statusResult.stderr || \"code-review-graph status failed\",\n };\n }\n\n return { ok: true, detail: \"status command passed\" };\n}\n\nasync function uninstallCrg(ctx: Context): Promise<void> {\n const managedInstall = hasManagedInstall(ctx);\n\n if (ctx.dryRun) {\n if (managedInstall) {\n ctx.ui.info(`Would uninstall ${PACKAGE_NAME} from pipx`);\n } else {\n ctx.ui.info(`Would keep pre-existing ${PACKAGE_NAME} install`);\n }\n return;\n }\n\n if (managedInstall) {\n const uninstallResult = await ctx.run(\"pipx\", [\"uninstall\", PACKAGE_NAME], {\n timeoutMs: UNINSTALL_TIMEOUT_MS,\n });\n if (uninstallResult.code !== 0) {\n throw new Error(\n uninstallResult.stderr || `pipx uninstall failed for ${PACKAGE_NAME}`,\n );\n }\n }\n\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n}\n\nexport const crgPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n detect: detectCrgPresence,\n install: installCrg,\n verify: verifyCrg,\n uninstall: uninstallCrg,\n};\n","import type { Context } from \"../../core/context.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n} from \"../types.js\";\n\nconst PLUGIN_ID = \"daemon\";\nconst UNIT_NAME = \"agemon-crg-daemon.service\";\n\nconst ACTION_TYPE_REGISTERED_SERVICE = \"registered-service\";\nconst ACTION_TYPE_PREEXISTING_SERVICE = \"preexisting-service\";\nconst ACTION_TYPE_ENABLED_LINGER = \"enabled-linger\";\n\ntype HardeningProfile = \"strict\" | \"compat\";\n\nfunction readHardeningProfileFromEnv(): HardeningProfile {\n return process.env.AGEMON_DAEMON_HARDENING === \"compat\" ? \"compat\" : \"strict\";\n}\n\nfunction getHardeningDirectives(profile: HardeningProfile): string[] {\n if (profile === \"compat\") {\n return [\"NoNewPrivileges=yes\", \"RestrictSUIDSGID=yes\"];\n }\n\n return [\n \"NoNewPrivileges=yes\",\n \"RestrictSUIDSGID=yes\",\n \"ProtectSystem=full\",\n \"ProtectHome=read-only\",\n \"PrivateTmp=yes\",\n ];\n}\n\nfunction buildUnitContents(cwd: string, profile: HardeningProfile): string {\n return [\n \"[Unit]\",\n \"Description=agemon code-review-graph daemon\",\n \"After=network-online.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `WorkingDirectory=${cwd}`,\n \"ExecStart=crg-daemon start\",\n ...getHardeningDirectives(profile),\n \"Restart=always\",\n \"RestartSec=3\",\n \"\",\n \"[Install]\",\n \"WantedBy=default.target\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction hasManagedServiceRegistration(ctx: Context): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_REGISTERED_SERVICE &&\n action.preExisting === false,\n );\n}\n\nfunction hasPreexistingServiceRecord(ctx: Context): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_PREEXISTING_SERVICE &&\n action.preExisting === true,\n );\n}\n\nfunction enabledLingerByAgemon(ctx: Context): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_ENABLED_LINGER &&\n action.preExisting === false,\n );\n}\n\nasync function detectDaemon(ctx: Context): Promise<PluginPresence> {\n const status = await ctx.serviceManager.isActive(UNIT_NAME);\n if (!status.active) {\n return { present: false, preExisting: false };\n }\n\n if (hasManagedServiceRegistration(ctx)) {\n return { present: true, preExisting: false };\n }\n\n if (!hasPreexistingServiceRecord(ctx) && !ctx.dryRun) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_SERVICE,\n target: UNIT_NAME,\n preExisting: true,\n });\n }\n\n return { present: true, preExisting: true };\n}\n\nasync function installDaemon(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(`Would register user service ${UNIT_NAME}`);\n ctx.ui.info(\"Would enable user linger when not already enabled\");\n return;\n }\n\n const configuredProfile = readHardeningProfileFromEnv();\n const registration = await (async () => {\n try {\n return await ctx.serviceManager.registerAutostart({\n unitName: UNIT_NAME,\n unitContents: buildUnitContents(ctx.cwd, configuredProfile),\n });\n } catch (error) {\n if (configuredProfile !== \"strict\") {\n throw error;\n }\n\n ctx.ui.info(\n \"Strict daemon hardening failed; retrying with compatibility hardening.\",\n );\n return await ctx.serviceManager.registerAutostart({\n unitName: UNIT_NAME,\n unitContents: buildUnitContents(ctx.cwd, \"compat\"),\n });\n }\n })();\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_REGISTERED_SERVICE,\n target: registration.unitPath,\n preExisting: false,\n });\n\n if (registration.lingerEnabledByAgemon) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_ENABLED_LINGER,\n target: process.env.USER ?? \"current-user\",\n preExisting: false,\n });\n }\n}\n\nasync function verifyDaemon(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const status = await ctx.serviceManager.isActive(UNIT_NAME);\n if (!status.active) {\n return { ok: false, detail: \"user service is not active\" };\n }\n\n return { ok: true, detail: \"service active\" };\n}\n\nasync function uninstallDaemon(ctx: Context): Promise<void> {\n const managedService = hasManagedServiceRegistration(ctx);\n\n if (ctx.dryRun) {\n if (managedService) {\n ctx.ui.info(`Would unregister user service ${UNIT_NAME}`);\n if (enabledLingerByAgemon(ctx)) {\n ctx.ui.info(\"Would disable user linger because agemon enabled it\");\n }\n } else {\n ctx.ui.info(`Would keep pre-existing user service ${UNIT_NAME}`);\n }\n return;\n }\n\n if (managedService) {\n await ctx.serviceManager.unregisterAutostart({\n unitName: UNIT_NAME,\n disableLinger: enabledLingerByAgemon(ctx),\n });\n }\n\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n}\n\nexport const daemonPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n dependsOn: [\"crg\"],\n detect: detectDaemon,\n install: installDaemon,\n verify: verifyDaemon,\n uninstall: uninstallDaemon,\n};\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n} from \"../types.js\";\n\nconst PLUGIN_ID = \"master-prompt\";\nconst ACTION_TYPE_MANAGED_RULE_FILE = \"managed-rule-file\";\nconst ACTION_TYPE_PREEXISTING_RULE_FILE = \"preexisting-rule-file\";\nconst BACKUP_DIRECTORY = \".agemon/backups/master-prompt\";\n\ninterface RuleFileDefinition {\n target: string;\n contents: string;\n}\n\nfunction buildPointerFileContents(\n toolName: string,\n targetFileName: string,\n): string {\n return [\n \"<!-- AI agent rules pointer -->\",\n \"# AI Agent Rules\",\n \"\",\n \"The canonical rules for this repo live in AGENTS.md — read that file in full before\",\n \"making any changes here. This file exists only because \" +\n `${toolName} looks for \\`${targetFileName}\\` specifically; it intentionally does not restate the rules.`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction buildAgentsFileContents(): string {\n return [\n \"# AI Agent Rules\",\n \"\",\n \"This is the canonical, repo-wide rule set for every AI coding agent in this repository.\",\n \"`CLAUDE.md`, `.cursorrules`, `.windsurfrules`, and `GEMINI.md` are pointer files that\",\n \"exist only because their tools look for those exact filenames.\",\n \"\",\n \"## Standard Task Lifecycle\",\n \"\",\n \"1. Discover existing tools, skills, and patterns before writing new code.\",\n \"2. Plan the smallest complete change before implementation.\",\n \"3. Verify assumptions with tests or reproducible checks.\",\n \"4. Implement with clear naming, modular boundaries, and zero dead code.\",\n \"5. Re-verify after changes and record out-of-scope findings in improvements.md.\",\n \"\",\n \"## Core Directives\",\n \"\",\n \"- Keep code simple and task-scoped: no speculative abstractions.\",\n \"- Reuse existing project utilities instead of duplicating logic.\",\n \"- Preserve user-authored content outside agemon-managed files.\",\n \"- Prioritize safe and reversible changes.\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getRuleFileDefinitions(): RuleFileDefinition[] {\n return [\n {\n target: \"AGENTS.md\",\n contents: buildAgentsFileContents(),\n },\n {\n target: \"CLAUDE.md\",\n contents: buildPointerFileContents(\"Claude Code\", \"CLAUDE.md\"),\n },\n {\n target: \"GEMINI.md\",\n contents: buildPointerFileContents(\"Gemini CLI\", \"GEMINI.md\"),\n },\n {\n target: \".cursorrules\",\n contents: buildPointerFileContents(\"Cursor\", \".cursorrules\"),\n },\n {\n target: \".windsurfrules\",\n contents: buildPointerFileContents(\"Windsurf\", \".windsurfrules\"),\n },\n ];\n}\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction hasActionForTarget(ctx: Context, target: string): boolean {\n return getPluginActions(ctx).some((action) => action.target === target);\n}\n\nfunction getManagedActions(ctx: Context) {\n return getPluginActions(ctx).filter(\n (action) => action.type === ACTION_TYPE_MANAGED_RULE_FILE,\n );\n}\n\nfunction encodeTargetAsBackupFileName(target: string): string {\n return target.replace(/[^a-zA-Z0-9._-]/gu, \"_\");\n}\n\nfunction buildBackupPath(cwd: string, target: string): string {\n return join(\n cwd,\n BACKUP_DIRECTORY,\n `${encodeTargetAsBackupFileName(target)}.bak`,\n );\n}\n\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return null;\n }\n}\n\nfunction allRuleFilesMatch(ctx: Context): Promise<boolean>[] {\n return getRuleFileDefinitions().map(async (definition) => {\n const targetPath = join(ctx.cwd, definition.target);\n const currentContents = await readFileIfExists(targetPath);\n return currentContents === definition.contents;\n });\n}\n\nasync function detectMasterPrompt(ctx: Context): Promise<PluginPresence> {\n const matchResults = await Promise.all(allRuleFilesMatch(ctx));\n const allMatch = matchResults.every((matches) => matches);\n\n if (!allMatch) {\n return { present: false, preExisting: false };\n }\n\n if (!ctx.dryRun) {\n for (const definition of getRuleFileDefinitions()) {\n if (hasActionForTarget(ctx, definition.target)) {\n continue;\n }\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_RULE_FILE,\n target: definition.target,\n preExisting: true,\n });\n }\n }\n\n const allManaged = getRuleFileDefinitions().every((definition) =>\n getManagedActions(ctx).some(\n (action) => action.target === definition.target,\n ),\n );\n\n return { present: true, preExisting: !allManaged };\n}\n\nasync function backupOriginalFileIfNeeded(\n cwd: string,\n target: string,\n existingContents: string,\n): Promise<void> {\n const backupPath = buildBackupPath(cwd, target);\n await mkdir(dirname(backupPath), { recursive: true });\n await writeFile(backupPath, existingContents, \"utf8\");\n}\n\nasync function installMasterPrompt(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n for (const definition of getRuleFileDefinitions()) {\n ctx.ui.info(`Would consolidate rule file ${definition.target}`);\n }\n return;\n }\n\n for (const definition of getRuleFileDefinitions()) {\n const targetPath = join(ctx.cwd, definition.target);\n const existingContents = await readFileIfExists(targetPath);\n\n if (existingContents === definition.contents) {\n if (!hasActionForTarget(ctx, definition.target)) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_RULE_FILE,\n target: definition.target,\n preExisting: true,\n });\n }\n continue;\n }\n\n if (existingContents !== null) {\n await backupOriginalFileIfNeeded(\n ctx.cwd,\n definition.target,\n existingContents,\n );\n }\n\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(targetPath, definition.contents, \"utf8\");\n\n if (!hasActionForTarget(ctx, definition.target)) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_MANAGED_RULE_FILE,\n target: definition.target,\n preExisting: existingContents !== null,\n });\n }\n }\n}\n\nasync function verifyMasterPrompt(\n ctx: Context,\n): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const missingOrMismatchedTargets: string[] = [];\n for (const definition of getRuleFileDefinitions()) {\n const targetPath = join(ctx.cwd, definition.target);\n const currentContents = await readFileIfExists(targetPath);\n if (currentContents !== definition.contents) {\n missingOrMismatchedTargets.push(definition.target);\n }\n }\n\n if (missingOrMismatchedTargets.length > 0) {\n return {\n ok: false,\n detail: `Missing or mismatched rule file(s): ${missingOrMismatchedTargets.join(\", \")}`,\n };\n }\n\n return {\n ok: true,\n detail: `${getRuleFileDefinitions().length} consolidated rule files present`,\n };\n}\n\nasync function uninstallMasterPrompt(ctx: Context): Promise<void> {\n const managedActions = getManagedActions(ctx);\n\n if (ctx.dryRun) {\n if (managedActions.length === 0) {\n ctx.ui.info(\"Would keep pre-existing rule files untouched\");\n return;\n }\n\n for (const action of managedActions) {\n if (action.preExisting) {\n ctx.ui.info(`Would restore original rule file ${action.target}`);\n } else {\n ctx.ui.info(`Would remove generated rule file ${action.target}`);\n }\n }\n return;\n }\n\n for (const action of managedActions) {\n const targetPath = join(ctx.cwd, action.target);\n const backupPath = buildBackupPath(ctx.cwd, action.target);\n\n if (action.preExisting) {\n if (!existsSync(backupPath)) {\n throw new Error(\n `Missing backup for pre-existing file ${action.target}`,\n );\n }\n const backupContents = await readFile(backupPath, \"utf8\");\n await writeFile(targetPath, backupContents, \"utf8\");\n await rm(backupPath, { force: true });\n continue;\n }\n\n await rm(targetPath, { force: true });\n }\n\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n}\n\nexport const masterPromptPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n detect: detectMasterPrompt,\n install: installMasterPrompt,\n verify: verifyMasterPrompt,\n uninstall: uninstallMasterPrompt,\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n removeManagedMarkdownBlockFile,\n upsertManagedMarkdownBlockFile,\n} from \"../patchers/markdown-block.js\";\nimport type { AgemonPlugin } from \"./types.js\";\n\nconst PLUGIN_ID = \"patcher-checkpoint\";\nconst BLOCK_ID = \"phase-5-checkpoint\";\nconst TARGET_FILE = \"CLAUDE.md\";\n\nfunction getTargetPath(cwd: string): string {\n return join(cwd, TARGET_FILE);\n}\n\nfunction hasManagedBlock(cwd: string): boolean {\n const filePath = getTargetPath(cwd);\n if (!existsSync(filePath)) {\n return false;\n }\n\n const content = readFileSync(filePath, \"utf8\");\n return content.includes(`<!-- agemon:start:${BLOCK_ID} -->`);\n}\n\nexport const patcherCheckpointPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n async detect(ctx) {\n return {\n present: hasManagedBlock(ctx.cwd),\n preExisting: false,\n };\n },\n async install(ctx) {\n if (ctx.dryRun) {\n ctx.ui.info(`Would patch ${TARGET_FILE} with one managed markdown block`);\n return;\n }\n\n const targetPath = getTargetPath(ctx.cwd);\n const filePreviouslyExisted = existsSync(targetPath);\n const changed = await upsertManagedMarkdownBlockFile(\n targetPath,\n BLOCK_ID,\n \"This block is owned by agemon and safe to remove during nuke.\",\n );\n\n if (!changed) {\n return;\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: \"patched-block\",\n target: TARGET_FILE,\n preExisting: filePreviouslyExisted,\n });\n },\n async verify(ctx) {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n return {\n ok: hasManagedBlock(ctx.cwd),\n detail: `managed block present in ${TARGET_FILE}`,\n };\n },\n async uninstall(ctx) {\n if (ctx.dryRun) {\n ctx.ui.info(`Would remove managed markdown block from ${TARGET_FILE}`);\n return;\n }\n\n const targetPath = getTargetPath(ctx.cwd);\n await removeManagedMarkdownBlockFile(targetPath, BLOCK_ID);\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n },\n};\n","import { readFile, writeFile } from \"node:fs/promises\";\n\nfunction startMarker(blockId: string): string {\n return `<!-- agemon:start:${blockId} -->`;\n}\n\nfunction endMarker(blockId: string): string {\n return `<!-- agemon:end:${blockId} -->`;\n}\n\nfunction normalizeBlockBody(blockBody: string): string {\n return blockBody.replace(/\\s+$/u, \"\");\n}\n\nfunction buildManagedBlock(blockId: string, blockBody: string): string {\n const body = normalizeBlockBody(blockBody);\n if (body.length === 0) {\n return `${startMarker(blockId)}\\n${endMarker(blockId)}`;\n }\n return `${startMarker(blockId)}\\n${body}\\n${endMarker(blockId)}`;\n}\n\nfunction findManagedBlockRange(\n content: string,\n blockId: string,\n): {\n start: number;\n end: number;\n} | null {\n const start = content.indexOf(startMarker(blockId));\n if (start < 0) {\n return null;\n }\n\n const endTag = endMarker(blockId);\n const endTagIndex = content.indexOf(endTag, start);\n if (endTagIndex < 0) {\n throw new Error(\n `Found start marker without matching end marker for '${blockId}'.`,\n );\n }\n\n return { start, end: endTagIndex + endTag.length };\n}\n\nexport function upsertManagedMarkdownBlock(\n content: string,\n blockId: string,\n blockBody: string,\n): { nextContent: string; changed: boolean } {\n const managedBlock = buildManagedBlock(blockId, blockBody);\n const range = findManagedBlockRange(content, blockId);\n\n if (range) {\n const current = content.slice(range.start, range.end);\n if (current === managedBlock) {\n return { nextContent: content, changed: false };\n }\n\n const next =\n content.slice(0, range.start) + managedBlock + content.slice(range.end);\n return { nextContent: next, changed: true };\n }\n\n if (content.length === 0) {\n return { nextContent: `${managedBlock}\\n`, changed: true };\n }\n\n const separator = content.endsWith(\"\\n\\n\")\n ? \"\"\n : content.endsWith(\"\\n\")\n ? \"\\n\"\n : \"\\n\\n\";\n\n return {\n nextContent: `${content}${separator}${managedBlock}\\n`,\n changed: true,\n };\n}\n\nexport function removeManagedMarkdownBlock(\n content: string,\n blockId: string,\n): { nextContent: string; changed: boolean } {\n const range = findManagedBlockRange(content, blockId);\n if (!range) {\n return { nextContent: content, changed: false };\n }\n\n const before = content.slice(0, range.start);\n const after = content.slice(range.end);\n\n let next = `${before}${after}`;\n next = next.replace(/\\n{3,}/gu, \"\\n\\n\");\n if (next === \"\\n\") {\n next = \"\";\n }\n\n return { nextContent: next, changed: true };\n}\n\nasync function readFileOrEmpty(filePath: string): Promise<string> {\n try {\n return await readFile(filePath, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\nexport async function upsertManagedMarkdownBlockFile(\n filePath: string,\n blockId: string,\n blockBody: string,\n): Promise<boolean> {\n const content = await readFileOrEmpty(filePath);\n const updated = upsertManagedMarkdownBlock(content, blockId, blockBody);\n if (!updated.changed) {\n return false;\n }\n\n await writeFile(filePath, updated.nextContent, \"utf8\");\n return true;\n}\n\nexport async function removeManagedMarkdownBlockFile(\n filePath: string,\n blockId: string,\n): Promise<boolean> {\n const content = await readFileOrEmpty(filePath);\n const updated = removeManagedMarkdownBlock(content, blockId);\n if (!updated.changed) {\n return false;\n }\n\n await writeFile(filePath, updated.nextContent, \"utf8\");\n return true;\n}\n","import { existsSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n} from \"../types.js\";\nimport { SKILL_BUNDLE } from \"./catalog.js\";\n\nconst PLUGIN_ID = \"skills\";\n\nconst ACTION_TYPE_INSTALLED_SKILL = \"installed-skill\";\nconst ACTION_TYPE_PREEXISTING_SKILL = \"preexisting-skill\";\nconst ACTION_TYPE_GENERATED_SKILLS_LOCK = \"generated-skills-lock\";\nconst SKILLS_LOCK_FILE = \"skills-lock.json\";\n\nconst SKILLS_LIST_TIMEOUT_MS = 30_000;\nconst SKILLS_ADD_TIMEOUT_MS = 180_000;\nconst SKILLS_REMOVE_TIMEOUT_MS = 120_000;\n\ninterface SkillsListEntry {\n name: string;\n}\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction hasManagedInstallRecord(ctx: Context, skillName: string): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_SKILL &&\n action.target === skillName &&\n action.preExisting === false,\n );\n}\n\nfunction hasPreexistingRecord(ctx: Context, skillName: string): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_PREEXISTING_SKILL &&\n action.target === skillName &&\n action.preExisting === true,\n );\n}\n\nfunction hasAnyRecordForSkill(ctx: Context, skillName: string): boolean {\n return (\n hasManagedInstallRecord(ctx, skillName) ||\n hasPreexistingRecord(ctx, skillName)\n );\n}\n\nfunction getSkillsLockPath(cwd: string): string {\n return join(cwd, SKILLS_LOCK_FILE);\n}\n\nfunction hasManagedSkillsLockRecord(ctx: Context): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_GENERATED_SKILLS_LOCK &&\n action.target === SKILLS_LOCK_FILE &&\n action.preExisting === false,\n );\n}\n\nasync function listInstalledSkillNames(ctx: Context): Promise<Set<string>> {\n const listResult = await ctx.run(\"npx\", [\"skills\", \"list\", \"--json\"], {\n timeoutMs: SKILLS_LIST_TIMEOUT_MS,\n });\n if (listResult.code !== 0) {\n throw new Error(listResult.stderr || \"npx skills list failed\");\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(listResult.stdout || \"[]\");\n } catch {\n const stderr = listResult.stderr.trim();\n const stdoutPreview = listResult.stdout.trim().slice(0, 200);\n const detail = stderr || stdoutPreview || \"no command output\";\n throw new Error(`npx skills list returned invalid JSON: ${detail}`);\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\"npx skills list returned non-array JSON\");\n }\n\n const installedSkillNames = new Set<string>();\n for (const item of parsed) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const typedItem = item as SkillsListEntry;\n if (typeof typedItem.name === \"string\" && typedItem.name.length > 0) {\n installedSkillNames.add(typedItem.name);\n }\n }\n\n return installedSkillNames;\n}\n\nfunction allBundleSkillsPresent(installedSkillNames: Set<string>): boolean {\n return SKILL_BUNDLE.every((entry) =>\n installedSkillNames.has(entry.skillName),\n );\n}\n\nasync function detectSkills(ctx: Context): Promise<PluginPresence> {\n const installedSkillNames = await listInstalledSkillNames(ctx);\n if (!allBundleSkillsPresent(installedSkillNames)) {\n return { present: false, preExisting: false };\n }\n\n const allManaged = SKILL_BUNDLE.every((entry) =>\n hasManagedInstallRecord(ctx, entry.skillName),\n );\n if (allManaged) {\n return { present: true, preExisting: false };\n }\n\n if (!ctx.dryRun) {\n for (const entry of SKILL_BUNDLE) {\n if (hasAnyRecordForSkill(ctx, entry.skillName)) {\n continue;\n }\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_SKILL,\n target: entry.skillName,\n preExisting: true,\n });\n }\n }\n\n return { present: true, preExisting: true };\n}\n\nasync function installSkills(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n for (const entry of SKILL_BUNDLE) {\n ctx.ui.info(`Would add skill ${entry.skillName} from ${entry.source}`);\n }\n return;\n }\n\n const skillsLockPreviouslyExisted = existsSync(getSkillsLockPath(ctx.cwd));\n const installedSkillNames = await listInstalledSkillNames(ctx);\n for (const entry of SKILL_BUNDLE) {\n if (installedSkillNames.has(entry.skillName)) {\n if (!hasAnyRecordForSkill(ctx, entry.skillName)) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_SKILL,\n target: entry.skillName,\n preExisting: true,\n });\n }\n continue;\n }\n\n const addResult = await ctx.run(\n \"npx\",\n [\n \"skills\",\n \"add\",\n entry.source,\n \"--skill\",\n entry.skillName,\n \"--agent\",\n entry.agent,\n \"--yes\",\n ],\n {\n timeoutMs: SKILLS_ADD_TIMEOUT_MS,\n },\n );\n if (addResult.code !== 0) {\n throw new Error(\n addResult.stderr || `npx skills add failed for ${entry.skillName}`,\n );\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_INSTALLED_SKILL,\n target: entry.skillName,\n preExisting: false,\n });\n }\n\n const skillsLockExistsAfterInstall = existsSync(getSkillsLockPath(ctx.cwd));\n if (\n !skillsLockPreviouslyExisted &&\n skillsLockExistsAfterInstall &&\n !hasManagedSkillsLockRecord(ctx)\n ) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_GENERATED_SKILLS_LOCK,\n target: SKILLS_LOCK_FILE,\n preExisting: false,\n });\n }\n}\n\nasync function verifySkills(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const installedSkillNames = await listInstalledSkillNames(ctx);\n const missingSkillNames = SKILL_BUNDLE.map((entry) => entry.skillName).filter(\n (skillName) => !installedSkillNames.has(skillName),\n );\n\n if (missingSkillNames.length > 0) {\n return {\n ok: false,\n detail: `Missing skill(s): ${missingSkillNames.join(\", \")}`,\n };\n }\n\n return {\n ok: true,\n detail: `${SKILL_BUNDLE.length} skill bundle entries present`,\n };\n}\n\nasync function uninstallSkills(ctx: Context): Promise<void> {\n const managedActions = getPluginActions(ctx).filter(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_SKILL &&\n action.preExisting === false,\n );\n const shouldRemoveManagedSkillsLock = hasManagedSkillsLockRecord(ctx);\n\n if (ctx.dryRun) {\n if (managedActions.length === 0) {\n if (shouldRemoveManagedSkillsLock) {\n ctx.ui.info(`Would remove ${SKILLS_LOCK_FILE}`);\n } else {\n ctx.ui.info(\"Would keep pre-existing skills untouched\");\n }\n return;\n }\n for (const action of managedActions) {\n ctx.ui.info(`Would remove skill ${action.target}`);\n }\n if (shouldRemoveManagedSkillsLock) {\n ctx.ui.info(`Would remove ${SKILLS_LOCK_FILE}`);\n }\n return;\n }\n\n const installedSkillNames = await listInstalledSkillNames(ctx);\n for (const action of managedActions) {\n if (!installedSkillNames.has(action.target)) {\n continue;\n }\n\n const removeResult = await ctx.run(\n \"npx\",\n [\"skills\", \"remove\", action.target, \"--yes\"],\n {\n timeoutMs: SKILLS_REMOVE_TIMEOUT_MS,\n },\n );\n if (removeResult.code !== 0) {\n throw new Error(\n removeResult.stderr || `npx skills remove failed for ${action.target}`,\n );\n }\n }\n\n if (shouldRemoveManagedSkillsLock) {\n await rm(getSkillsLockPath(ctx.cwd), { force: true });\n }\n\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n}\n\nexport const skillsPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n detect: detectSkills,\n install: installSkills,\n verify: verifySkills,\n uninstall: uninstallSkills,\n};\n","export interface SkillBundleEntry {\n id: string;\n source: string;\n skillName: string;\n agent: string;\n}\n\nexport const SKILL_BUNDLE: SkillBundleEntry[] = [\n {\n id: \"web-design-guidelines\",\n source: \"vercel-labs/agent-skills\",\n skillName: \"web-design-guidelines\",\n agent: \"claude-code\",\n },\n {\n id: \"writing-guidelines\",\n source: \"vercel-labs/agent-skills\",\n skillName: \"writing-guidelines\",\n agent: \"claude-code\",\n },\n];\n","import type { AgemonPlugin } from \"./types.js\";\n\nexport const testPlugin: AgemonPlugin = {\n id: \"test-plugin\",\n async detect(ctx) {\n return {\n present: ctx.manifest.hasActionForPlugin(\"test-plugin\"),\n preExisting: false,\n };\n },\n async install(ctx) {\n if (ctx.dryRun) {\n return;\n }\n await ctx.manifest.recordAction({\n plugin: \"test-plugin\",\n type: \"simulated-install\",\n target: \"phase-1 orchestrator checkpoint\",\n preExisting: false,\n });\n },\n async verify(ctx) {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n return {\n ok: ctx.manifest.hasActionForPlugin(\"test-plugin\"),\n detail: \"action logged in manifest\",\n };\n },\n async uninstall(ctx) {\n if (ctx.dryRun) {\n return;\n }\n await ctx.manifest.removeActionsForPlugin(\"test-plugin\");\n },\n};\n","import { existsSync } from \"node:fs\";\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n} from \"../types.js\";\nimport { WORKFLOW_BUNDLE, type WorkflowBundleEntry } from \"./catalog.js\";\n\nconst PLUGIN_ID = \"workflow-scaffolder\";\nconst WORKFLOW_DIRECTORY = \".github/workflows\";\nconst ACTION_TYPE_SCAFFOLDED_WORKFLOW = \"scaffolded-workflow\";\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction buildWorkflowPath(cwd: string, entry: WorkflowBundleEntry): string {\n return join(cwd, WORKFLOW_DIRECTORY, entry.filename);\n}\n\nfunction buildWorkflowTarget(entry: WorkflowBundleEntry): string {\n return `${WORKFLOW_DIRECTORY}/${entry.filename}`;\n}\n\nfunction hasManagedWorkflowRecord(\n ctx: Context,\n workflowTarget: string,\n): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_SCAFFOLDED_WORKFLOW &&\n action.target === workflowTarget &&\n action.preExisting === false,\n );\n}\n\nfunction getUnmanagedCollisions(ctx: Context): string[] {\n const collisions: string[] = [];\n for (const entry of WORKFLOW_BUNDLE) {\n const workflowPath = buildWorkflowPath(ctx.cwd, entry);\n const workflowTarget = buildWorkflowTarget(entry);\n if (!existsSync(workflowPath)) {\n continue;\n }\n if (hasManagedWorkflowRecord(ctx, workflowTarget)) {\n continue;\n }\n collisions.push(workflowTarget);\n }\n return collisions;\n}\n\nfunction assertNoUnmanagedCollisions(ctx: Context): void {\n const collisions = getUnmanagedCollisions(ctx);\n if (collisions.length === 0) {\n return;\n }\n\n throw new Error(\n `Refusing to overwrite pre-existing workflow file(s): ${collisions.join(\", \")}`,\n );\n}\n\nfunction allBundleWorkflowsExist(ctx: Context): boolean {\n return WORKFLOW_BUNDLE.every((entry) =>\n existsSync(buildWorkflowPath(ctx.cwd, entry)),\n );\n}\n\nasync function detectWorkflows(ctx: Context): Promise<PluginPresence> {\n assertNoUnmanagedCollisions(ctx);\n\n if (!allBundleWorkflowsExist(ctx)) {\n return { present: false, preExisting: false };\n }\n\n return { present: true, preExisting: false };\n}\n\nasync function installWorkflows(ctx: Context): Promise<void> {\n assertNoUnmanagedCollisions(ctx);\n\n if (ctx.dryRun) {\n for (const entry of WORKFLOW_BUNDLE) {\n ctx.ui.info(`Would scaffold workflow ${buildWorkflowTarget(entry)}`);\n }\n return;\n }\n\n const workflowDirectoryPath = join(ctx.cwd, WORKFLOW_DIRECTORY);\n await mkdir(workflowDirectoryPath, { recursive: true });\n\n for (const entry of WORKFLOW_BUNDLE) {\n const workflowPath = buildWorkflowPath(ctx.cwd, entry);\n const workflowTarget = buildWorkflowTarget(entry);\n\n await writeFile(workflowPath, entry.contents, \"utf8\");\n\n if (!hasManagedWorkflowRecord(ctx, workflowTarget)) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_SCAFFOLDED_WORKFLOW,\n target: workflowTarget,\n preExisting: false,\n });\n }\n }\n}\n\nasync function verifyWorkflows(\n ctx: Context,\n): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const missingWorkflows = WORKFLOW_BUNDLE.map((entry) =>\n buildWorkflowTarget(entry),\n ).filter((workflowTarget) => !existsSync(join(ctx.cwd, workflowTarget)));\n\n if (missingWorkflows.length > 0) {\n return {\n ok: false,\n detail: `Missing workflow file(s): ${missingWorkflows.join(\", \")}`,\n };\n }\n\n return {\n ok: true,\n detail: `${WORKFLOW_BUNDLE.length} workflow bundle entries present`,\n };\n}\n\nasync function uninstallWorkflows(ctx: Context): Promise<void> {\n const managedActions = getPluginActions(ctx).filter(\n (action) =>\n action.type === ACTION_TYPE_SCAFFOLDED_WORKFLOW &&\n action.preExisting === false,\n );\n\n if (ctx.dryRun) {\n if (managedActions.length === 0) {\n ctx.ui.info(\"Would keep pre-existing workflow files untouched\");\n return;\n }\n for (const action of managedActions) {\n ctx.ui.info(`Would remove workflow ${action.target}`);\n }\n return;\n }\n\n for (const action of managedActions) {\n await rm(join(ctx.cwd, action.target), { force: true });\n }\n\n await ctx.manifest.removeActionsForPlugin(PLUGIN_ID);\n}\n\nexport const workflowScaffolderPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n detect: detectWorkflows,\n install: installWorkflows,\n verify: verifyWorkflows,\n uninstall: uninstallWorkflows,\n};\n","export interface WorkflowBundleEntry {\n id: string;\n filename: string;\n contents: string;\n}\n\nexport const WORKFLOW_BUNDLE: WorkflowBundleEntry[] = [\n {\n id: \"claude-code-security-review\",\n filename: \"claude-code-security-review.yml\",\n contents: [\n \"name: Claude Code Security Review\",\n \"\",\n \"on:\",\n \" pull_request:\",\n \"\",\n \"permissions:\",\n \" contents: read\",\n \" security-events: write\",\n \"\",\n \"jobs:\",\n \" security-review:\",\n \" runs-on: ubuntu-latest\",\n \" steps:\",\n \" - name: Checkout repository\",\n \" uses: actions/checkout@v4\",\n \"\",\n \" - name: Run Claude Code Security Review\",\n \" uses: anthropics/claude-code-security-review@main\",\n \"\",\n ].join(\"\\n\"),\n },\n {\n id: \"code-review-graph-action\",\n filename: \"code-review-graph-action.yml\",\n contents: [\n \"name: Code Review Graph Action\",\n \"\",\n \"on:\",\n \" pull_request:\",\n \"\",\n \"permissions:\",\n \" contents: read\",\n \"\",\n \"jobs:\",\n \" code-review-graph:\",\n \" runs-on: ubuntu-latest\",\n \" steps:\",\n \" - name: Checkout repository\",\n \" uses: actions/checkout@v4\",\n \"\",\n \" - name: Run Code Review Graph\",\n \" uses: tirth8205/code-review-graph@main\",\n \"\",\n ].join(\"\\n\"),\n },\n];\n","import { cliToolPlugin } from \"./cli-tool/index.js\";\nimport { crgPlugin } from \"./crg/index.js\";\nimport { daemonPlugin } from \"./daemon/index.js\";\nimport { masterPromptPlugin } from \"./master-prompt/index.js\";\nimport { patcherCheckpointPlugin } from \"./patcher-checkpoint.js\";\nimport { skillsPlugin } from \"./skills/index.js\";\nimport { testPlugin } from \"./test-plugin.js\";\nimport type { AgemonPlugin } from \"./types.js\";\nimport { workflowScaffolderPlugin } from \"./workflow-scaffolder/index.js\";\n\nconst corePluginOrder: AgemonPlugin[] = [\n crgPlugin,\n daemonPlugin,\n skillsPlugin,\n workflowScaffolderPlugin,\n cliToolPlugin,\n masterPromptPlugin,\n];\n\nexport function getRegisteredPlugins(): AgemonPlugin[] {\n const devOnlyPlugins: AgemonPlugin[] =\n process.env.AGEMON_DEV === \"1\" ? [testPlugin, patcherCheckpointPlugin] : [];\n return [...corePluginOrder, ...devOnlyPlugins];\n}\n","import boxen from \"boxen\";\nimport { theme } from \"./theme.js\";\n\nexport function renderBanner(title: string, message: string): string {\n return boxen(`${theme.bold(title)}\\n\\n${message}`, {\n padding: 1,\n borderColor: \"cyan\",\n borderStyle: \"round\",\n });\n}\n","import pc from \"picocolors\";\n\nfunction colorsEnabled(): boolean {\n if (process.env.NO_COLOR) return false;\n return Boolean(process.stdout.isTTY);\n}\n\nfunction colors() {\n return pc.createColors(colorsEnabled());\n}\n\nexport const theme = {\n success: (text: string) => colors().green(text),\n warn: (text: string) => colors().yellow(text),\n error: (text: string) => colors().red(text),\n info: (text: string) => colors().cyan(text),\n muted: (text: string) => colors().gray(text),\n bold: (text: string) => colors().bold(text),\n};\n","import ora, { type Ora } from \"ora\";\nimport { theme } from \"./theme.js\";\n\nexport interface StepSpinner {\n start(label: string): void;\n succeed(label?: string): void;\n fail(label?: string): void;\n info(label: string): void;\n}\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\n}\n\nexport function createStepSpinner(): StepSpinner {\n let step = 0;\n let current: Ora | undefined;\n\n return {\n start(label) {\n step += 1;\n const prefixed = `[${step}] ${label}`;\n if (isInteractive()) {\n current = ora(prefixed).start();\n } else {\n console.log(prefixed);\n }\n },\n succeed(label) {\n const text = label ?? current?.text ?? \"\";\n if (isInteractive() && current) {\n current.succeed(text);\n } else {\n console.log(theme.success(`✔ ${text}`));\n }\n },\n fail(label) {\n const text = label ?? current?.text ?? \"\";\n if (isInteractive() && current) {\n current.fail(text);\n } else {\n console.log(theme.error(`✘ ${text}`));\n }\n },\n info(label) {\n if (isInteractive() && current) {\n current.info(label);\n } else {\n console.log(theme.info(label));\n }\n },\n };\n}\n"],"mappings":"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","names":["readFile","join","mkdir","rm","writeFile","homedir","join","resolveHomeDir","resolveUser","mkdir","readFile","rm","writeFile","dirname","join","PLUGIN_ID","VERSION_CHECK_TIMEOUT_MS","INSTALL_TIMEOUT_MS","UNINSTALL_TIMEOUT_MS","getPluginActions","hasPreexistingRecord","PLUGIN_ID","getPluginActions","mkdir","readFile","rm","writeFile","dirname","join","PLUGIN_ID","getPluginActions","existsSync","join","readFile","writeFile","PLUGIN_ID","join","existsSync","existsSync","rm","join","PLUGIN_ID","getPluginActions","hasManagedInstallRecord","hasPreexistingRecord","join","existsSync","rm","existsSync","mkdir","rm","writeFile","join","PLUGIN_ID","getPluginActions","join","existsSync","mkdir","writeFile","rm"]}
1
+ {"version":3,"sources":["../node_modules/sisteransi/src/index.js","../node_modules/picocolors/picocolors.js","../node_modules/cli-boxes/boxes.json","../node_modules/cli-boxes/index.js","../node_modules/ansi-align/node_modules/ansi-regex/index.js","../node_modules/ansi-align/node_modules/strip-ansi/index.js","../node_modules/is-fullwidth-code-point/index.js","../node_modules/ansi-align/node_modules/emoji-regex/index.js","../node_modules/ansi-align/node_modules/string-width/index.js","../node_modules/ansi-align/index.js","../src/cli/index.ts","../node_modules/@clack/core/dist/index.mjs","../node_modules/fast-string-truncated-width/dist/utils.js","../node_modules/fast-string-truncated-width/dist/index.js","../node_modules/fast-string-width/dist/index.js","../node_modules/fast-wrap-ansi/lib/main.js","../node_modules/@clack/prompts/dist/index.mjs","../node_modules/commander/lib/error.js","../node_modules/commander/lib/argument.js","../node_modules/commander/lib/command.js","../node_modules/commander/lib/help.js","../node_modules/commander/lib/option.js","../node_modules/commander/lib/suggestSimilar.js","../node_modules/commander/index.js","../src/inspect/discover.ts","../src/core/gitignore.ts","../src/core/repository-git.ts","../src/core/capability-migration.ts","../src/platform/detect.ts","../src/core/error-message.ts","../src/platform/service-manager/darwin.ts","../src/core/install-location.ts","../src/platform/service-manager/launch-agent-files.ts","../src/platform/service-manager/readiness.ts","../src/platform/service-manager/fake.ts","../src/platform/service-manager/unit-files.ts","../src/platform/service-manager/linux.ts","../src/platform/service-manager/user-unit-files.ts","../src/platform/service-manager/unavailable.ts","../src/platform/service-manager/index.ts","../src/ui/theme.ts","../src/ui/format.ts","../src/ui/symbols.ts","../src/ui/consent-view.ts","../src/core/prompt.ts","../src/core/text-diff.ts","../src/plugins/types.ts","../src/core/untrusted-git-config.ts","../src/core/consent.ts","../src/core/git-config-guard.ts","../src/core/prompt-clack.ts","../src/core/state-manifest.ts","../src/core/ledger-key.ts","../src/core/machine-ledger.ts","../src/core/workspace-footprint.ts","../src/core/subprocess-trace.ts","../src/core/verified-binary-installer.ts","../src/core/bounded-response.ts","../src/core/context.ts","../src/core/interruption.ts","../src/core/orchestrator.ts","../src/adapters/discovery-adapter.ts","../src/adapters/version-probe.ts","../src/adapters/claude-code.ts","../src/adapters/copilot.ts","../src/adapters/gemini-cli.ts","../src/adapters/index.ts","../src/adapters/detect.ts","../src/core/apply-journal.ts","../src/plugins/desired-revision.ts","../src/plugins/shared-resource.ts","../src/plugins/proposed-operation.ts","../src/inspect/duplication.ts","../node_modules/boxen/index.js","../node_modules/ansi-regex/index.js","../node_modules/strip-ansi/index.js","../node_modules/get-east-asian-width/lookup-data.js","../node_modules/get-east-asian-width/utilities.js","../node_modules/get-east-asian-width/lookup.js","../node_modules/get-east-asian-width/index.js","../node_modules/emoji-regex/index.mjs","../node_modules/boxen/node_modules/string-width/index.js","../node_modules/chalk/source/vendor/ansi-styles/index.js","../node_modules/chalk/source/vendor/supports-color/index.js","../node_modules/chalk/source/utilities.js","../node_modules/chalk/source/index.js","../node_modules/widest-line/node_modules/string-width/index.js","../node_modules/widest-line/index.js","../node_modules/camelcase/index.js","../node_modules/wrap-ansi/node_modules/string-width/index.js","../node_modules/ansi-styles/index.js","../node_modules/wrap-ansi/index.js","../src/ui/box.ts","../node_modules/string-width/index.js","../src/ui/table.ts","../src/ui/status-view.ts","../src/inspect/capabilities.ts","../src/inspect/classify.ts","../src/inspect/status.ts","../src/plugins/agents/index.ts","../src/core/managed-file-revert.ts","../src/plugins/skills/ledger-view.ts","../src/plugins/cli-tool/index.ts","../src/plugins/cli-tool/catalog.ts","../src/plugins/crg/index.ts","../src/plugins/crg/constraints.ts","../src/plugins/crg/environment.ts","../src/plugins/crg/graph-directory.ts","../src/plugins/crg/locate.ts","../src/plugins/daemon/index.ts","../src/plugins/daemon/launchd-plist.ts","../src/plugins/master-prompt/index.ts","../src/patchers/markdown-block.ts","../src/plugins/skills/index.ts","../src/plugins/skills/group-selection.ts","../src/plugins/skills/local-source.ts","../src/plugins/skills/skill-manifest.ts","../src/plugins/skills/skill-removal.ts","../src/plugins/skills/skill-revisions.ts","../src/plugins/skills/bundle-fingerprints.ts","../src/plugins/index.ts","../src/ui/plan-view.ts","../src/ui/labels.ts","../src/ui/summary.ts","../src/core/apply.ts","../src/ui/progress.ts","../src/core/plan-store.ts","../src/core/rollback.ts","../src/core/recover.ts","../src/core/self-uninstall.ts","../src/core/self-upgrade.ts","../src/core/github-release.ts","../src/core/update-check.ts","../src/ui/inspect-view.ts","../src/inspect/index.ts","../src/ui/banner.ts","../src/ui/spinner.ts"],"sourcesContent":["'use strict';\n\nconst ESC = '\\x1B';\nconst CSI = `${ESC}[`;\nconst beep = '\\u0007';\n\nconst cursor = {\n to(x, y) {\n if (!y) return `${CSI}${x + 1}G`;\n return `${CSI}${y + 1};${x + 1}H`;\n },\n move(x, y) {\n let ret = '';\n\n if (x < 0) ret += `${CSI}${-x}D`;\n else if (x > 0) ret += `${CSI}${x}C`;\n\n if (y < 0) ret += `${CSI}${-y}A`;\n else if (y > 0) ret += `${CSI}${y}B`;\n\n return ret;\n },\n up: (count = 1) => `${CSI}${count}A`,\n down: (count = 1) => `${CSI}${count}B`,\n forward: (count = 1) => `${CSI}${count}C`,\n backward: (count = 1) => `${CSI}${count}D`,\n nextLine: (count = 1) => `${CSI}E`.repeat(count),\n prevLine: (count = 1) => `${CSI}F`.repeat(count),\n left: `${CSI}G`,\n hide: `${CSI}?25l`,\n show: `${CSI}?25h`,\n save: `${ESC}7`,\n restore: `${ESC}8`\n}\n\nconst scroll = {\n up: (count = 1) => `${CSI}S`.repeat(count),\n down: (count = 1) => `${CSI}T`.repeat(count)\n}\n\nconst erase = {\n screen: `${CSI}2J`,\n up: (count = 1) => `${CSI}1J`.repeat(count),\n down: (count = 1) => `${CSI}J`.repeat(count),\n line: `${CSI}2K`,\n lineEnd: `${CSI}K`,\n lineStart: `${CSI}1K`,\n lines(count) {\n let clear = '';\n for (let i = 0; i < count; i++)\n clear += this.line + (i < count - 1 ? cursor.up() : '');\n if (count)\n clear += cursor.left;\n return clear;\n }\n}\n\nmodule.exports = { cursor, scroll, erase, beep };\n","let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n","{\n\t\"single\": {\n\t\t\"topLeft\": \"┌\",\n\t\t\"top\": \"─\",\n\t\t\"topRight\": \"┐\",\n\t\t\"right\": \"│\",\n\t\t\"bottomRight\": \"┘\",\n\t\t\"bottom\": \"─\",\n\t\t\"bottomLeft\": \"└\",\n\t\t\"left\": \"│\"\n\t},\n\t\"double\": {\n\t\t\"topLeft\": \"╔\",\n\t\t\"top\": \"═\",\n\t\t\"topRight\": \"╗\",\n\t\t\"right\": \"║\",\n\t\t\"bottomRight\": \"╝\",\n\t\t\"bottom\": \"═\",\n\t\t\"bottomLeft\": \"╚\",\n\t\t\"left\": \"║\"\n\t},\n\t\"round\": {\n\t\t\"topLeft\": \"╭\",\n\t\t\"top\": \"─\",\n\t\t\"topRight\": \"╮\",\n\t\t\"right\": \"│\",\n\t\t\"bottomRight\": \"╯\",\n\t\t\"bottom\": \"─\",\n\t\t\"bottomLeft\": \"╰\",\n\t\t\"left\": \"│\"\n\t},\n\t\"bold\": {\n\t\t\"topLeft\": \"┏\",\n\t\t\"top\": \"━\",\n\t\t\"topRight\": \"┓\",\n\t\t\"right\": \"┃\",\n\t\t\"bottomRight\": \"┛\",\n\t\t\"bottom\": \"━\",\n\t\t\"bottomLeft\": \"┗\",\n\t\t\"left\": \"┃\"\n\t},\n\t\"singleDouble\": {\n\t\t\"topLeft\": \"╓\",\n\t\t\"top\": \"─\",\n\t\t\"topRight\": \"╖\",\n\t\t\"right\": \"║\",\n\t\t\"bottomRight\": \"╜\",\n\t\t\"bottom\": \"─\",\n\t\t\"bottomLeft\": \"╙\",\n\t\t\"left\": \"║\"\n\t},\n\t\"doubleSingle\": {\n\t\t\"topLeft\": \"╒\",\n\t\t\"top\": \"═\",\n\t\t\"topRight\": \"╕\",\n\t\t\"right\": \"│\",\n\t\t\"bottomRight\": \"╛\",\n\t\t\"bottom\": \"═\",\n\t\t\"bottomLeft\": \"╘\",\n\t\t\"left\": \"│\"\n\t},\n\t\"classic\": {\n\t\t\"topLeft\": \"+\",\n\t\t\"top\": \"-\",\n\t\t\"topRight\": \"+\",\n\t\t\"right\": \"|\",\n\t\t\"bottomRight\": \"+\",\n\t\t\"bottom\": \"-\",\n\t\t\"bottomLeft\": \"+\",\n\t\t\"left\": \"|\"\n\t},\n\t\"arrow\": {\n\t\t\"topLeft\": \"↘\",\n\t\t\"top\": \"↓\",\n\t\t\"topRight\": \"↙\",\n\t\t\"right\": \"←\",\n\t\t\"bottomRight\": \"↖\",\n\t\t\"bottom\": \"↑\",\n\t\t\"bottomLeft\": \"↗\",\n\t\t\"left\": \"→\"\n\t}\n}\n","'use strict';\nconst cliBoxes = require('./boxes.json');\n\nmodule.exports = cliBoxes;\n// TODO: Remove this for the next major release\nmodule.exports.default = cliBoxes;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","'use strict'\n\nconst stringWidth = require('string-width')\n\nfunction ansiAlign (text, opts) {\n if (!text) return text\n\n opts = opts || {}\n const align = opts.align || 'center'\n\n // short-circuit `align: 'left'` as no-op\n if (align === 'left') return text\n\n const split = opts.split || '\\n'\n const pad = opts.pad || ' '\n const widthDiffFn = align !== 'right' ? halfDiff : fullDiff\n\n let returnString = false\n if (!Array.isArray(text)) {\n returnString = true\n text = String(text).split(split)\n }\n\n let width\n let maxWidth = 0\n text = text.map(function (str) {\n str = String(str)\n width = stringWidth(str)\n maxWidth = Math.max(width, maxWidth)\n return {\n str,\n width\n }\n }).map(function (obj) {\n return new Array(widthDiffFn(maxWidth, obj.width) + 1).join(pad) + obj.str\n })\n\n return returnString ? text.join(split) : text\n}\n\nansiAlign.left = function left (text) {\n return ansiAlign(text, { align: 'left' })\n}\n\nansiAlign.center = function center (text) {\n return ansiAlign(text, { align: 'center' })\n}\n\nansiAlign.right = function right (text) {\n return ansiAlign(text, { align: 'right' })\n}\n\nmodule.exports = ansiAlign\n\nfunction halfDiff (maxWidth, curWidth) {\n return Math.floor((maxWidth - curWidth) / 2)\n}\n\nfunction fullDiff (maxWidth, curWidth) {\n return maxWidth - curWidth\n}\n","import { relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { intro, outro } from \"@clack/prompts\";\nimport { Command, CommanderError } from \"commander\";\nimport {\n addCapabilitiesToConfig,\n capabilitiesToAutoAdd,\n outcomeUpdatesConfig,\n} from \"../core/capability-migration.js\";\nimport {\n type AgemonConfig,\n type CustomSkillGroupConfig,\n loadConfig,\n SKILL_GROUPS_WHEN_ABSENT,\n} from \"../core/config.js\";\nimport { createContext } from \"../core/context.js\";\nimport { assertFakeBackendsAreDevOnly } from \"../core/dev-mode.js\";\nimport {\n assertNotRootOnMacOS,\n assertRootUsesItsOwnEnvironment,\n} from \"../core/install-location.js\";\nimport {\n readPackageVersion,\n resolveInstallMethod,\n} from \"../core/install-method.js\";\nimport { ApplyInterruptedError } from \"../core/interruption.js\";\nimport {\n buildPlan,\n exitCodeForOutcome,\n type RunOutcome,\n reconcile,\n uninstallPlugins,\n} from \"../core/orchestrator.js\";\nimport { assertValidPlanId, readPlan, writePlan } from \"../core/plan-store.js\";\nimport { isInteractiveTerminal } from \"../core/prompt.js\";\nimport {\n RECOVER_LIMIT_NOTE,\n recoverInterruptedApply,\n} from \"../core/recover.js\";\nimport { resolveRepositoryRoot } from \"../core/repo-paths.js\";\nimport { runSelfUninstall } from \"../core/self-uninstall.js\";\nimport { runRollback, runUpgrade } from \"../core/self-upgrade.js\";\nimport {\n checkAgemonStateDirectoryBeforeRun,\n withRepositoryRunLock,\n} from \"../core/state-root.js\";\nimport { printable } from \"../core/untrusted-text.js\";\nimport { startUpdateCheck } from \"../core/update-check.js\";\nimport { runInspect } from \"../inspect/index.js\";\nimport { runStatus } from \"../inspect/status.js\";\nimport {\n assertPlatformSupportsChanges,\n detectPlatformCapabilities,\n type PlatformCapabilities,\n} from \"../platform/detect.js\";\nimport {\n hasPinnedBuildFor,\n pinnedArchiveKeyFor,\n} from \"../plugins/cli-tool/index.js\";\nimport { CORE_CAPABILITY_IDS, getRegisteredPlugins } from \"../plugins/index.js\";\nimport { assertCustomSkillGroupsAreValid } from \"../plugins/skills/catalog.js\";\nimport type { AgemonPlugin } from \"../plugins/types.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { box } from \"../ui/box.js\";\nimport { renderPlan } from \"../ui/plan-view.js\";\nimport {\n createStepProgress,\n SILENT_PROGRESS,\n type StepProgress,\n} from \"../ui/progress.js\";\nimport { createStepSpinner, type StepSpinner } from \"../ui/spinner.js\";\nimport { symbol } from \"../ui/symbols.js\";\nimport { theme } from \"../ui/theme.js\";\n\nconst VERSION = readPackageVersion();\nconst DESCRIPTION =\n \"Bootstraps and reverses an AI coding agent's working environment in a repo.\";\nconst TRUST_REPO_GIT_CONFIG_HELP =\n \"with --yes, approve installing code-review-graph and its daemon in a repository whose own git config has keys agemon does not trust by default (the keys are always printed; read them first)\";\n\ninterface CliOptions {\n dryRun?: boolean;\n yes?: boolean;\n only?: string;\n skipDaemon?: boolean;\n skillGroups?: string;\n json?: boolean;\n allowUnignoredState?: boolean;\n trustRepoGitConfig?: boolean;\n plan?: string;\n quiet?: boolean;\n verbose?: boolean;\n checkAgentsUsable?: boolean;\n removeShared?: string;\n print?: boolean;\n rollback?: boolean;\n platformSkippedIds?: string[];\n}\n\nconst SILENT_SPINNER: StepSpinner = {\n start() {},\n succeed() {},\n fail() {},\n info() {},\n};\n\nfunction selectSpinner(options: CliOptions): StepSpinner {\n if (options.quiet) {\n return SILENT_SPINNER;\n }\n return createStepSpinner({ animated: !options.verbose });\n}\n\nfunction selectProgress(options: CliOptions): StepProgress {\n return options.quiet ? SILENT_PROGRESS : createStepProgress();\n}\n\nfunction openInteractiveFrame(options: CliOptions): void {\n if (!options.quiet && isInteractiveTerminal()) {\n intro(theme.heading(`agemon ${VERSION}`));\n }\n}\n\nfunction closeInteractiveFrame(\n options: CliOptions,\n tone: \"success\" | \"failure\" = \"success\",\n): void {\n if (!options.quiet && isInteractiveTerminal()) {\n outro(tone === \"success\" ? theme.ok(\"done\") : theme.danger(\"failed\"));\n }\n}\n\nconst ERROR_HINTS: { match: RegExp; hint: string }[] = [\n {\n match: /is stale/,\n hint: \"run 'agemon plan' to refresh, then 'agemon apply'.\",\n },\n {\n match:\n /^Refusing to write \\.agemon\\/ state: \\/\\.agemon\\/ is not git-ignored\\./,\n hint: \"add /.agemon/ to .gitignore, or re-run interactively or with --yes; if agemon reported that git could not answer, fix that git error first.\",\n },\n {\n match: /\\.gitignore: it is not a regular file/,\n hint: \"replace the .gitignore symlink with a regular file, or pass --allow-unignored-state.\",\n },\n];\n\nexport function renderCliError(untrustedMessage: string): string {\n const message = printable(untrustedMessage);\n const hint = ERROR_HINTS.find((entry) => entry.match.test(message))?.hint;\n const lines = [\n `${symbol(\"fail\")} ${message}`,\n ...(hint ? [`${symbol(\"arrow\")} ${hint}`] : []),\n ];\n return box({ body: lines.join(\"\\n\"), tone: \"danger\" });\n}\n\nfunction excludedPluginIds(options: CliOptions): string[] {\n return [\n ...(options.skipDaemon ? [\"daemon\"] : []),\n ...(options.platformSkippedIds ?? []),\n ];\n}\n\nfunction selectPlugins(options: CliOptions): AgemonPlugin[] {\n const excludedIds = excludedPluginIds(options);\n return getRegisteredPlugins().filter(\n (plugin) => !excludedIds.includes(plugin.id),\n );\n}\n\nfunction describeMissingServiceManager(platform: PlatformCapabilities): string {\n return platform.family === \"linux\"\n ? \"systemd is not running on this machine\"\n : \"agemon has no service manager for this OS yet\";\n}\n\nfunction findWhatThisMachineCannotRun(\n options: CliOptions,\n platform: PlatformCapabilities,\n): { id: string; reason: string }[] {\n const unrunnable: { id: string; reason: string }[] = [];\n if (!options.skipDaemon && platform.serviceManager === \"none\") {\n unrunnable.push({\n id: \"daemon\",\n reason: describeMissingServiceManager(platform),\n });\n }\n if (!hasPinnedBuildFor(platform)) {\n unrunnable.push({\n id: \"cli-tool\",\n reason: `agnix has no pinned build for ${pinnedArchiveKeyFor(platform)}`,\n });\n }\n return unrunnable;\n}\n\nfunction skippingWhatThisMachineCannotRun(\n options: CliOptions,\n platform: PlatformCapabilities,\n): CliOptions {\n const unrunnable = findWhatThisMachineCannotRun(options, platform);\n if (unrunnable.length === 0) {\n return options;\n }\n const onlyIds = parseOnlyOption(options);\n for (const { id, reason } of unrunnable) {\n if (onlyIds?.includes(id)) {\n throw new Error(`--only ${id} cannot run here: ${reason}.`);\n }\n if (onlyIds === undefined && !options.quiet && !options.json) {\n console.error(theme.dim(`${id} skipped: ${reason}.`));\n }\n }\n return { ...options, platformSkippedIds: unrunnable.map(({ id }) => id) };\n}\n\nfunction parseOnlyOption(options: CliOptions): string[] | undefined {\n if (options.only === undefined) {\n return undefined;\n }\n const ids = options.only\n .split(\",\")\n .map((id) => id.trim())\n .filter((id) => id.length > 0);\n if (ids.length === 0) {\n throw new Error(\"--only needs at least one plugin id\");\n }\n if (options.skipDaemon && ids.includes(\"daemon\")) {\n throw new Error(\"--only daemon conflicts with --skip-daemon\");\n }\n return ids;\n}\n\nasync function resolveRepositoryRootFor(options: CliOptions): Promise<string> {\n const { root, notice } = await resolveRepositoryRoot(process.cwd());\n if (notice !== null && !options.quiet && !options.json) {\n console.error(theme.dim(notice));\n }\n return root;\n}\n\nfunction assertConfiguredCapabilitiesAreKnown(config: AgemonConfig): void {\n const knownIds = getRegisteredPlugins().map((plugin) => plugin.id);\n const unknownIds = config.capabilities.filter((id) => !knownIds.includes(id));\n if (unknownIds.length > 0) {\n throw new Error(\n `agemon.toml lists unknown capabilities: ${unknownIds.map(printable).join(\", \")}. Known: ${knownIds.join(\", \")}.`,\n );\n }\n}\n\nconst ADDED_CAPABILITY_PURPOSE =\n \"installs Claude Code subagents for your skill groups\";\n\ninterface DesiredStateDefaults {\n config: AgemonConfig | null;\n only: string[] | undefined;\n skillGroups: string | undefined;\n customSkillGroups: CustomSkillGroupConfig[];\n addedCapabilityIds: string[];\n}\n\nfunction quoteCapabilityIds(capabilityIds: string[]): string {\n return capabilityIds.map((id) => `'${id}'`).join(\", \");\n}\n\nfunction announceAddedCapabilities(\n options: CliOptions,\n addedCapabilityIds: string[],\n willUpdateConfig: boolean,\n): void {\n if (addedCapabilityIds.length === 0 || options.quiet) {\n return;\n }\n const when = willUpdateConfig\n ? \"agemon.toml is updated when this run completes\"\n : \"agemon.toml is updated on the next interactive or --yes run\";\n console.error(\n theme.dim(\n `agemon.toml does not list the new capability ${quoteCapabilityIds(addedCapabilityIds)} (${ADDED_CAPABILITY_PURPOSE}) yet; this run includes it (${when}).`,\n ),\n );\n}\n\nasync function updateConfigWithAddedCapabilities(\n repoRoot: string,\n config: AgemonConfig,\n addedCapabilityIds: string[],\n allowUnignoredState: boolean,\n): Promise<string> {\n const added = quoteCapabilityIds(addedCapabilityIds);\n const update = await addCapabilitiesToConfig(\n repoRoot,\n config,\n addedCapabilityIds,\n { knownCapabilities: CORE_CAPABILITY_IDS, allowUnignoredState },\n );\n if (update.kind === \"state-not-ignored\") {\n return `Left agemon.toml unchanged: /.agemon/ is not git-ignored, so agemon keeps no backup of it there. Add /.agemon/ to .gitignore (or pass --allow-unignored-state) and run agemon again to add ${added}.`;\n }\n if (update.kind === \"not-written\") {\n return `Left agemon.toml unchanged: ${update.reason}. The next run tries again, or add ${added} to capabilities by hand.`;\n }\n const savedOriginal =\n update.backupPath === null\n ? \"\"\n : ` Comments and layout were not kept; the original is saved at ${update.backupPath} (a full 'agemon nuke' deletes .agemon/, so keep a copy if you need it).`;\n return `Updated agemon.toml: added ${added} (${ADDED_CAPABILITY_PURPOSE}) to capabilities; remove it there to opt out.${savedOriginal} Commit agemon.toml; older agemon versions reject it, so upgrade agemon in CI first.`;\n}\n\nasync function recordAddedCapabilities(\n repoRoot: string,\n defaults: DesiredStateDefaults,\n run: {\n outcome: RunOutcome;\n approvable: boolean;\n allowUnignoredState: boolean;\n },\n): Promise<void> {\n const { config, addedCapabilityIds } = defaults;\n if (config === null || addedCapabilityIds.length === 0 || !run.approvable) {\n return;\n }\n if (!outcomeUpdatesConfig(run.outcome)) {\n console.log(\n \"Left agemon.toml unchanged: this run applied nothing that was approved. The next run tries again.\",\n );\n return;\n }\n console.log(\n await updateConfigWithAddedCapabilities(\n repoRoot,\n config,\n addedCapabilityIds,\n run.allowUnignoredState,\n ),\n );\n}\n\nasync function resolveDesiredStateDefaults(\n options: CliOptions,\n repoRoot: string,\n): Promise<DesiredStateDefaults> {\n const config = await loadConfig(repoRoot);\n if (config) {\n assertConfiguredCapabilitiesAreKnown(config);\n assertCustomSkillGroupsAreValid(config.customSkillGroups);\n }\n\n const addedCapabilityIds =\n config === null\n ? []\n : capabilitiesToAutoAdd(config, getRegisteredPlugins());\n const excludedIds = excludedPluginIds(options);\n const configuredIds = config?.capabilities\n .concat(addedCapabilityIds)\n .filter((id) => !excludedIds.includes(id));\n const only = parseOnlyOption(options);\n\n return {\n config,\n only: only ?? configuredIds,\n skillGroups: options.skillGroups ?? config?.skillGroups ?? undefined,\n customSkillGroups: config?.customSkillGroups ?? [],\n addedCapabilityIds: only === undefined ? addedCapabilityIds : [],\n };\n}\n\ninterface ReportConfig {\n customSkillGroups: CustomSkillGroupConfig[];\n configError: string | null;\n}\n\nasync function loadConfigForReport(repoRoot: string): Promise<ReportConfig> {\n try {\n const config = await loadConfig(repoRoot);\n const customSkillGroups = config?.customSkillGroups ?? [];\n assertCustomSkillGroupsAreValid(customSkillGroups);\n return { customSkillGroups, configError: null };\n } catch (error) {\n return {\n customSkillGroups: [],\n configError: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\nasync function runInspectCommand(options: CliOptions): Promise<number> {\n const repoRoot = await resolveRepositoryRootFor(options);\n const { customSkillGroups, configError } =\n await loadConfigForReport(repoRoot);\n const context = await createContext({\n repoRoot,\n platform: await detectPlatformCapabilities(),\n dryRun: false,\n yes: Boolean(options.yes),\n ui: SILENT_SPINNER,\n progress: SILENT_PROGRESS,\n customSkillGroups,\n });\n\n await runInspect(context, {\n json: Boolean(options.json),\n checkAgentsUsable: Boolean(options.checkAgentsUsable),\n configError,\n });\n return 0;\n}\n\nasync function runStatusCommand(options: CliOptions): Promise<number> {\n const repoRoot = await resolveRepositoryRootFor(options);\n const { customSkillGroups, configError } =\n await loadConfigForReport(repoRoot);\n const context = await createContext({\n repoRoot,\n platform: await detectPlatformCapabilities(),\n dryRun: false,\n yes: Boolean(options.yes),\n ui: SILENT_SPINNER,\n progress: SILENT_PROGRESS,\n customSkillGroups,\n });\n\n const report = await runStatus(context, getRegisteredPlugins(), {\n configError,\n });\n return report.configError === null &&\n (report.healthy || !report.hasAgemonState)\n ? 0\n : exitCodeForOutcome(\"drift\");\n}\n\nasync function runPlanCommand(requested: CliOptions): Promise<number> {\n assertNotRootOnMacOS();\n const platform = await detectPlatformCapabilities();\n const options = skippingWhatThisMachineCannotRun(requested, platform);\n const repoRoot = await resolveRepositoryRootFor(options);\n const plugins = selectPlugins(options);\n const { only, skillGroups, customSkillGroups, addedCapabilityIds } =\n await resolveDesiredStateDefaults(options, repoRoot);\n announceAddedCapabilities(options, addedCapabilityIds, false);\n const context = await createContext({\n repoRoot,\n platform,\n dryRun: true,\n yes: Boolean(options.yes),\n ui: SILENT_SPINNER,\n progress: SILENT_PROGRESS,\n skillGroups,\n customSkillGroups,\n });\n\n const plan = await buildPlan(context, plugins, {\n only,\n agemonVersion: VERSION,\n });\n const planPath = await writePlan(context.cwd, plan);\n\n context.log.log(renderPlan(plan));\n context.log.log(`\\nPlan written to ${relative(context.cwd, planPath)}`);\n return 0;\n}\n\nasync function runInstall(requested: CliOptions): Promise<number> {\n const platform = await detectPlatformCapabilities();\n const options = skippingWhatThisMachineCannotRun(requested, platform);\n const repoRoot = await resolveRepositoryRootFor(options);\n const spinner = selectSpinner(options);\n const plugins = selectPlugins(options);\n const defaults = await resolveDesiredStateDefaults(options, repoRoot);\n const { config, only, skillGroups, customSkillGroups } = defaults;\n const dryRun = Boolean(options.dryRun);\n const approvable = Boolean(options.yes) || isInteractiveTerminal();\n announceAddedCapabilities(\n options,\n defaults.addedCapabilityIds,\n approvable && !dryRun,\n );\n openInteractiveFrame(options);\n let outcome: RunOutcome;\n try {\n const context = await createContext({\n repoRoot,\n platform,\n dryRun,\n yes: Boolean(options.yes),\n ui: spinner,\n verbose: Boolean(options.verbose),\n progress: selectProgress(options),\n skillGroups,\n customSkillGroups,\n });\n\n outcome = await reconcile(context, plugins, {\n only,\n agemonVersion: VERSION,\n allowUnignoredState: Boolean(options.allowUnignoredState),\n trustRepoGitConfig: Boolean(options.trustRepoGitConfig),\n conflictDecisions: config?.conflictDecisions,\n persistConfig: config === null,\n platformSkippedCapabilities: options.platformSkippedIds ?? [],\n });\n } catch (error) {\n closeInteractiveFrame(options, \"failure\");\n throw error;\n }\n closeInteractiveFrame(options);\n if (!dryRun) {\n await recordAddedCapabilities(repoRoot, defaults, {\n outcome,\n approvable,\n allowUnignoredState: Boolean(options.allowUnignoredState),\n });\n }\n return exitCodeForOutcome(outcome);\n}\n\nasync function runApply(requested: CliOptions): Promise<number> {\n if (requested.plan) {\n assertValidPlanId(requested.plan);\n }\n const platform = await detectPlatformCapabilities();\n const options = skippingWhatThisMachineCannotRun(requested, platform);\n const repoRoot = await resolveRepositoryRootFor(options);\n const spinner = selectSpinner(options);\n const plugins = selectPlugins(options);\n const defaults = await resolveDesiredStateDefaults(options, repoRoot);\n const { config, only, skillGroups, customSkillGroups } = defaults;\n const approvable = Boolean(options.yes) || isInteractiveTerminal();\n announceAddedCapabilities(options, defaults.addedCapabilityIds, approvable);\n openInteractiveFrame(options);\n let outcome: RunOutcome;\n try {\n const context = await createContext({\n repoRoot,\n platform,\n dryRun: false,\n yes: Boolean(options.yes),\n ui: spinner,\n verbose: Boolean(options.verbose),\n progress: selectProgress(options),\n skillGroups,\n customSkillGroups,\n });\n\n const plan = options.plan\n ? await readPlan(context.cwd, options.plan)\n : undefined;\n\n outcome = await reconcile(context, plugins, {\n only,\n agemonVersion: VERSION,\n allowUnignoredState: Boolean(options.allowUnignoredState),\n trustRepoGitConfig: Boolean(options.trustRepoGitConfig),\n plan,\n conflictDecisions: config?.conflictDecisions,\n persistConfig: config === null,\n platformSkippedCapabilities: options.platformSkippedIds ?? [],\n });\n } catch (error) {\n closeInteractiveFrame(options, \"failure\");\n throw error;\n }\n closeInteractiveFrame(options);\n await recordAddedCapabilities(repoRoot, defaults, {\n outcome,\n approvable,\n allowUnignoredState: Boolean(options.allowUnignoredState),\n });\n return exitCodeForOutcome(outcome);\n}\n\nfunction parseRemoveSharedOption(\n options: CliOptions,\n plugins: AgemonPlugin[],\n): ReadonlySet<string> {\n if (options.removeShared === undefined) {\n return new Set();\n }\n const knownToolNames = plugins.flatMap((plugin) =>\n (plugin.sharedResources ?? [])\n .filter((resource) => resource.migratesFromRepoLedgers)\n .map((resource) => resource.toolName),\n );\n const toolNames = options.removeShared\n .split(\",\")\n .map((name) => name.trim())\n .filter((name) => name.length > 0);\n const unknownToolNames = toolNames.filter(\n (name) => !knownToolNames.includes(name),\n );\n if (toolNames.length === 0 || unknownToolNames.length > 0) {\n throw new Error(\n `--remove-shared takes a comma-separated list of: ${knownToolNames.join(\", \")}`,\n );\n }\n return new Set(toolNames);\n}\n\nasync function runNuke(options: CliOptions): Promise<number> {\n const repoRoot = await resolveRepositoryRootFor(options);\n const spinner = selectSpinner(options);\n const plugins = getRegisteredPlugins();\n const removeSharedTools = parseRemoveSharedOption(options, plugins);\n const context = await createContext({\n repoRoot,\n platform: await detectPlatformCapabilities(),\n dryRun: Boolean(options.dryRun),\n yes: Boolean(options.yes),\n ui: spinner,\n verbose: Boolean(options.verbose),\n progress: selectProgress(options),\n removeSharedTools,\n });\n\n const outcome = await uninstallPlugins(context, plugins, {\n only: parseOnlyOption(options),\n skipIds: options.skipDaemon ? [\"daemon\"] : [],\n });\n return exitCodeForOutcome(outcome);\n}\n\nfunction refusingUnsupportedPlatforms(\n run: (options: CliOptions) => Promise<void>,\n): (options: CliOptions) => Promise<void> {\n return async (options) => {\n assertPlatformSupportsChanges(await detectPlatformCapabilities());\n assertNotRootOnMacOS();\n await run(options);\n };\n}\n\nfunction lockingTheRepository(\n run: (options: CliOptions) => Promise<number>,\n): (options: CliOptions) => Promise<number> {\n return async (options) => {\n if (options.dryRun) {\n return run(options);\n }\n await checkAgemonStateDirectoryBeforeRun(false, (line) =>\n console.log(line),\n );\n return withRepositoryRunLock(await resolveRepositoryRootFor(options), () =>\n run(options),\n );\n };\n}\n\nasync function runUpgradeCommand(\n requestedVersion: string | undefined,\n options: CliOptions,\n): Promise<number> {\n if (options.rollback && (requestedVersion !== undefined || options.print)) {\n throw new Error(\"--rollback takes no version and no --print.\");\n }\n assertNotRootOnMacOS();\n assertRootUsesItsOwnEnvironment();\n const method = await resolveInstallMethod();\n if (options.rollback) {\n return runRollback({ method, yes: Boolean(options.yes) });\n }\n return runUpgrade({\n method,\n runningVersion: VERSION,\n version: requestedVersion,\n print: Boolean(options.print),\n yes: Boolean(options.yes),\n });\n}\n\nasync function runSelfUninstallCommand(options: CliOptions): Promise<number> {\n assertNotRootOnMacOS();\n assertRootUsesItsOwnEnvironment();\n return runSelfUninstall({\n method: await resolveInstallMethod(),\n yes: Boolean(options.yes),\n dryRun: Boolean(options.dryRun),\n sharedTools: getRegisteredPlugins().flatMap(\n (plugin) => plugin.sharedResources ?? [],\n ),\n });\n}\n\nasync function runRecover(options: CliOptions): Promise<number> {\n assertNotRootOnMacOS();\n const context = await createContext({\n repoRoot: await resolveRepositoryRootFor(options),\n platform: await detectPlatformCapabilities(),\n dryRun: Boolean(options.dryRun),\n yes: Boolean(options.yes),\n ui: selectSpinner(options),\n verbose: Boolean(options.verbose),\n progress: selectProgress(options),\n });\n\n await recoverInterruptedApply(context, getRegisteredPlugins(), {\n dryRun: Boolean(options.dryRun),\n });\n return 0;\n}\n\nexport function exitCodeFor(error: unknown): number {\n const cause = error instanceof Error ? error.cause : undefined;\n return cause instanceof ApplyInterruptedError ? cause.exitCode : 1;\n}\n\nconst EXIT_CODE_HELP = `\nExit codes:\n 0 success, nothing to do, preview only, or declined\n 1 error, or rolled back\n 2 drift found, consent missing, or applied but verification failed\n 130 interrupted (143 for SIGTERM)`;\n\nexport function createProgram(recordExitCode: (code: number) => void): Command {\n const program = new Command();\n const record =\n (run: (options: CliOptions) => Promise<number>) =>\n async (options: CliOptions) =>\n recordExitCode(await run(options));\n const recordWithUpdateCheck =\n (run: (options: CliOptions) => Promise<number>) =>\n async (options: CliOptions) => {\n const pendingUpdate = startUpdateCheck({\n currentVersion: VERSION,\n dryRun: Boolean(options.dryRun),\n quiet: Boolean(options.quiet),\n });\n try {\n const exitCode = await run(options);\n recordExitCode(exitCode);\n if (exitCode === 0) {\n await pendingUpdate?.finish({ yes: Boolean(options.yes) });\n }\n } finally {\n pendingUpdate?.abort();\n }\n };\n\n program\n .name(\"agemon\")\n .description(DESCRIPTION)\n .version(VERSION)\n .option(\"--dry-run\", \"narrate actions without making changes\")\n .option(\"--yes\", \"skip confirmation prompts\")\n .option(\"--skip-daemon\", \"skip daemon registration\")\n .option(\n \"--allow-unignored-state\",\n \"let apply write .agemon/ state even when it cannot be git-ignored (discouraged)\",\n )\n .option(\"--trust-repo-git-config\", TRUST_REPO_GIT_CONFIG_HELP)\n .option(\n \"--only <plugins>\",\n \"comma-separated list of plugin ids to run (their dependencies run too, e.g. agents runs skills)\",\n )\n .option(\n \"--skill-groups <groups>\",\n `comma-separated skill group ids to install, or 'all'/'none' (default: ${SKILL_GROUPS_WHEN_ABSENT})`,\n )\n .option(\"--no-color\", \"disable colored output\")\n .option(\"-v, --verbose\", \"show raw subprocess output beneath each step\")\n .option(\"-q, --quiet\", \"print only the final summary\")\n .addHelpText(\"beforeAll\", () => `${renderBanner(\"agemon\", DESCRIPTION)}\\n`)\n .addHelpText(\"after\", EXIT_CODE_HELP)\n .hook(\"preAction\", (thisCommand) => {\n if (thisCommand.opts().color === false) {\n process.env.NO_COLOR = \"1\";\n }\n })\n .action(\n refusingUnsupportedPlatforms(\n recordWithUpdateCheck(lockingTheRepository(runInstall)),\n ),\n );\n\n program\n .command(\"inspect\")\n .description(\n \"Read-only inventory + eight-state classification + duplication report\",\n )\n .option(\"--json\", \"emit the redacted JSON report instead of a table\")\n .option(\n \"--check-agents-usable\",\n \"run a non-mutating usability probe for detected coding agents\",\n )\n .action((_options: CliOptions, command: Command) =>\n record(runInspectCommand)({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program\n .command(\"status\")\n .description(\n \"Post-install health + drift summary from the provenance ledger\",\n )\n .action((_options: CliOptions, command: Command) =>\n record(runStatusCommand)({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program\n .command(\"plan\")\n .description(\n \"Deterministic, fingerprinted proposed-operation set written to .agemon/plans/\",\n )\n .option(\n \"--only <plugins>\",\n \"comma-separated list of plugin ids to run (their dependencies run too, e.g. agents runs skills)\",\n )\n .option(\n \"--skill-groups <groups>\",\n \"comma-separated skill group ids to install, or 'all'/'none'\",\n )\n .action((_options: CliOptions, command: Command) =>\n record(runPlanCommand)({ ...command.parent?.opts(), ...command.opts() }),\n );\n\n program\n .command(\"apply\")\n .description(\"Run a confirmed plan transactionally\")\n .option(\"--plan <id>\", \"apply a specific persisted plan id\")\n .option(\"--yes\", \"skip confirmation prompts\")\n .option(\"--skip-daemon\", \"skip daemon registration\")\n .option(\n \"--allow-unignored-state\",\n \"write .agemon/ state even when it cannot be git-ignored (discouraged)\",\n )\n .option(\"--trust-repo-git-config\", TRUST_REPO_GIT_CONFIG_HELP)\n .option(\n \"--only <plugins>\",\n \"comma-separated list of plugin ids to run (their dependencies run too, e.g. agents runs skills)\",\n )\n .action((_options: CliOptions, command: Command) =>\n refusingUnsupportedPlatforms(\n recordWithUpdateCheck(lockingTheRepository(runApply)),\n )({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program\n .command(\"nuke\")\n .description(\"Reverse agemon-managed changes\")\n .option(\"--dry-run\", \"narrate actions without making changes\")\n .option(\"--yes\", \"skip confirmation prompts\")\n .option(\"--skip-daemon\", \"keep the daemon (and what it needs) installed\")\n .option(\"--only <plugins>\", \"comma-separated list of plugin ids to run\")\n .option(\n \"--remove-shared <tools>\",\n \"also remove these shared tools agemon installed before it tracked them per machine (code-review-graph, agnix)\",\n )\n .action((_options: CliOptions, command: Command) =>\n refusingUnsupportedPlatforms(\n recordWithUpdateCheck(lockingTheRepository(runNuke)),\n )({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program\n .command(\"recover\")\n .description(\"Restore the files an interrupted apply changed\")\n .option(\n \"--dry-run\",\n \"show what would be restored without changing anything\",\n )\n .option(\"--yes\", \"restore without asking\")\n .addHelpText(\"after\", `\\n${RECOVER_LIMIT_NOTE}`)\n .action((_options: CliOptions, command: Command) =>\n record(lockingTheRepository(runRecover))({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program\n .command(\"upgrade\")\n .description(\n \"Install the latest agemon release (or the given version), the way this copy was installed\",\n )\n .argument(\n \"[version]\",\n \"release to install instead of the latest, e.g. 4.8.0\",\n )\n .option(\n \"--print\",\n \"print the verified install steps instead of running them (npm installs)\",\n )\n .option(\n \"--rollback\",\n \"switch back to the install the last upgrade replaced (install-script installs)\",\n )\n .option(\"--yes\", \"skip confirmation prompts\")\n .action(\n (\n requestedVersion: string | undefined,\n _options: CliOptions,\n command: Command,\n ) =>\n record((options) => runUpgradeCommand(requestedVersion, options))({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program\n .command(\"self-uninstall\")\n .description(\n \"Remove agemon itself from this machine (never touches repositories)\",\n )\n .option(\"--dry-run\", \"show what would be removed without removing it\")\n .option(\"--yes\", \"remove without asking\")\n .action((_options: CliOptions, command: Command) =>\n record(runSelfUninstallCommand)({\n ...command.parent?.opts(),\n ...command.opts(),\n }),\n );\n\n program.exitOverride();\n\n return program;\n}\n\nexport async function runCli(argv: string[]): Promise<number> {\n let exitCode = 0;\n const program = createProgram((code) => {\n exitCode = code;\n });\n\n try {\n assertFakeBackendsAreDevOnly();\n await program.parseAsync(argv, { from: \"user\" });\n return exitCode;\n } catch (error) {\n if (error instanceof CommanderError) {\n return error.exitCode;\n }\n console.error(\n renderCliError(error instanceof Error ? error.message : String(error)),\n );\n return exitCodeFor(error);\n }\n}\n\nconst isDirectlyExecuted =\n process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1];\nif (isDirectlyExecuted) {\n process.exitCode = await runCli(process.argv.slice(2));\n}\n","import { styleText } from 'node:util';\nimport { stdout, stdin } from 'node:process';\nimport * as l from 'node:readline';\nimport l__default from 'node:readline';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor, erase } from 'sisteransi';\nimport { ReadStream } from 'node:tty';\n\nfunction findCursor(s, o, l) {\n if (!l.some((r) => !r.disabled))\n return s;\n const t = s + o, n = Math.max(l.length - 1, 0), e = t < 0 ? n : t > n ? 0 : t;\n return l[e]?.disabled ? findCursor(e, o < 0 ? -1 : 1, l) : e;\n}\nfunction findTextCursor(s, o, l, i) {\n const t = i.split(`\n`);\n let n = 0, e = s;\n for (const r of t) {\n if (e <= r.length)\n break;\n e -= r.length + 1, n++;\n }\n for (n = Math.max(0, Math.min(t.length - 1, n + l)), e = Math.min(e, t[n].length) + o; e < 0 && n > 0; )\n n--, e += t[n].length + 1;\n for (; e > t[n].length && n < t.length - 1; )\n e -= t[n].length + 1, n++;\n e = Math.max(0, Math.min(t[n].length, e));\n let h = 0;\n for (let r = 0; r < n; r++)\n h += t[r].length + 1;\n return h + e;\n}\n\nconst a$1 = [\"up\", \"down\", \"left\", \"right\", \"space\", \"enter\", \"cancel\"], t = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n];\nconst settings = {\n actions: new Set(a$1),\n aliases: /* @__PURE__ */ new Map([\n // vim support\n [\"k\", \"up\"],\n [\"j\", \"down\"],\n [\"h\", \"left\"],\n [\"l\", \"right\"],\n [\"\u0003\", \"cancel\"],\n // opinionated defaults!\n [\"escape\", \"cancel\"]\n ]),\n messages: {\n cancel: \"Canceled\",\n error: \"Something went wrong\"\n },\n withGuide: true,\n accessible: void 0,\n date: {\n monthNames: [...t],\n messages: {\n required: \"Please enter a valid date\",\n invalidMonth: \"There are only 12 months in a year\",\n invalidDay: (n, e) => `There are only ${n} days in ${e}`,\n afterMin: (n) => `Date must be on or after ${n.toISOString().slice(0, 10)}`,\n beforeMax: (n) => `Date must be on or before ${n.toISOString().slice(0, 10)}`\n }\n }\n};\nfunction updateSettings(n) {\n if (n.aliases !== void 0) {\n const e = n.aliases;\n for (const s in e) {\n if (!Object.hasOwn(e, s)) continue;\n const i = e[s];\n i === void 0 || !settings.actions.has(i) || settings.aliases.has(s) || settings.aliases.set(s, i);\n }\n }\n if (n.messages !== void 0) {\n const e = n.messages;\n e.cancel !== void 0 && (settings.messages.cancel = e.cancel), e.error !== void 0 && (settings.messages.error = e.error);\n }\n if (n.withGuide !== void 0 && (settings.withGuide = n.withGuide !== false), n.accessible !== void 0 && (settings.accessible = n.accessible === true), n.date !== void 0) {\n const e = n.date;\n e.monthNames !== void 0 && (settings.date.monthNames = [...e.monthNames]), e.messages !== void 0 && (e.messages.required !== void 0 && (settings.date.messages.required = e.messages.required), e.messages.invalidMonth !== void 0 && (settings.date.messages.invalidMonth = e.messages.invalidMonth), e.messages.invalidDay !== void 0 && (settings.date.messages.invalidDay = e.messages.invalidDay), e.messages.afterMin !== void 0 && (settings.date.messages.afterMin = e.messages.afterMin), e.messages.beforeMax !== void 0 && (settings.date.messages.beforeMax = e.messages.beforeMax));\n }\n}\nfunction isAccessible(n) {\n if (n !== void 0) return n;\n if (settings.accessible !== void 0) return settings.accessible;\n const e = process.env.ACCESSIBLE;\n return e !== void 0 && e !== \"\" && e !== \"0\" && e !== \"false\";\n}\nfunction isActionKey(n, e) {\n if (typeof n == \"string\")\n return settings.aliases.get(n) === e;\n for (const s of n)\n if (s !== void 0 && isActionKey(s, e))\n return true;\n return false;\n}\n\nfunction diffLines(i, s) {\n if (i === s) return;\n const e = i.split(`\n`), t = s.split(`\n`), r = Math.max(e.length, t.length), f = [];\n for (let n = 0; n < r; n++)\n e[n] !== t[n] && f.push(n);\n return {\n lines: f,\n numLinesBefore: e.length,\n numLinesAfter: t.length,\n numLines: r\n };\n}\n\nconst R = globalThis.process.platform.startsWith(\"win\");\nconst CANCEL_SYMBOL = Symbol(\"clack:cancel\");\nfunction isCancel(e) {\n return e === CANCEL_SYMBOL;\n}\nfunction setRawMode(e, r) {\n const o = e;\n o.isTTY && o.setRawMode(r);\n}\nfunction block({\n input: e = stdin,\n output: r = stdout,\n overwrite: o = true,\n hideCursor: n = true\n} = {}) {\n const s = l.createInterface({\n input: e,\n output: r,\n prompt: \"\",\n tabSize: 1\n });\n l.emitKeypressEvents(e, s), e instanceof ReadStream && e.isTTY && e.setRawMode(true);\n const t = (f, { name: a, sequence: w }) => {\n const c = String(f);\n if (isActionKey([c, a, w], \"cancel\")) {\n n && r.write(cursor.show), process.exit(0);\n return;\n }\n if (!o) return;\n const i = a === \"return\" ? 0 : -1, m = a === \"return\" ? -1 : 0;\n l.moveCursor(r, i, m, () => {\n l.clearLine(r, 1, () => {\n e.once(\"keypress\", t);\n });\n });\n };\n return n && r.write(cursor.hide), e.once(\"keypress\", t), () => {\n e.off(\"keypress\", t), n && r.write(cursor.show), e instanceof ReadStream && e.isTTY && !R && e.setRawMode(false), s.terminal = false, s.close();\n };\n}\nconst getColumns = (e) => \"columns\" in e && typeof e.columns == \"number\" ? e.columns : 80, getRows = (e) => \"rows\" in e && typeof e.rows == \"number\" ? e.rows : 20;\nfunction wrapTextWithPrefix(e, r, o, n = o, s = o, t) {\n const f = getColumns(e ?? stdout);\n return wrapAnsi(r, f - o.length, {\n hard: true,\n trim: false\n }).split(`\n`).map((c, i, m) => {\n const d = t ? t(c, i) : c;\n return i === 0 ? `${n}${d}` : i === m.length - 1 ? `${s}${d}` : `${o}${d}`;\n }).join(`\n`);\n}\n\nfunction runValidation(e, a) {\n if (\"~standard\" in e) {\n const n = e[\"~standard\"].validate(a);\n return n instanceof Promise ? n.then((r) => r.issues?.at(0)?.message) : n.issues?.at(0)?.message;\n }\n return e(a);\n}\n\nclass y {\n input;\n output;\n _abortSignal;\n rl;\n opts;\n _render;\n _track = false;\n _prevFrame = \"\";\n _subscribers = /* @__PURE__ */ new Map();\n _cursor = 0;\n state = \"initial\";\n error = \"\";\n value;\n userInput = \"\";\n /**\n * Whether accessible (static, screen-reader friendly) output is enabled for\n * this prompt, resolved from the `accessible` option, the global setting,\n * and the `ACCESSIBLE` env var.\n */\n get accessible() {\n return isAccessible(this.opts.accessible);\n }\n constructor(t, e = true) {\n const { input: i = stdin, output: s = stdout, render: r, signal: n, ...o } = t;\n this.opts = o, this.onKeypress = this.onKeypress.bind(this), this.close = this.close.bind(this), this.render = this.render.bind(this), this._render = r.bind(this), this._track = e, this._abortSignal = n, this.input = i, this.output = s;\n }\n /**\n * Unsubscribe all listeners\n */\n unsubscribe() {\n this._subscribers.clear();\n }\n /**\n * Set a subscriber with opts\n * @param event - The event name\n */\n setSubscriber(t, e) {\n const i = this._subscribers.get(t) ?? [];\n i.push(e), this._subscribers.set(t, i);\n }\n /**\n * Subscribe to an event\n * @param event - The event name\n * @param cb - The callback\n */\n on(t, e) {\n this.setSubscriber(t, { cb: e });\n }\n /**\n * Subscribe to an event once\n * @param event - The event name\n * @param cb - The callback\n */\n once(t, e) {\n this.setSubscriber(t, { cb: e, once: true });\n }\n /**\n * Emit an event with data\n * @param event - The event name\n * @param data - The data to pass to the callback\n */\n emit(t, ...e) {\n const i = this._subscribers.get(t) ?? [], s = [];\n for (const r of i)\n r.cb(...e), r.once && s.push(() => i.splice(i.indexOf(r), 1));\n for (const r of s)\n r();\n }\n prompt() {\n return new Promise((t) => {\n if (this._abortSignal) {\n if (this._abortSignal.aborted)\n return this.state = \"cancel\", this.close(), t(CANCEL_SYMBOL);\n this._abortSignal.addEventListener(\n \"abort\",\n () => {\n this.state = \"cancel\", this.close();\n },\n { once: true }\n );\n }\n this.rl = l__default.createInterface({\n input: this.input,\n tabSize: 2,\n prompt: \"\",\n escapeCodeTimeout: 50,\n terminal: true\n }), this.rl.prompt(), this.opts.initialUserInput !== void 0 && this._setUserInput(this.opts.initialUserInput, true), this.input.on(\"keypress\", this.onKeypress), setRawMode(this.input, true), this.output.on(\"resize\", this.render), this.render(), this.once(\"submit\", () => {\n this.output.write(cursor.show), this.output.off(\"resize\", this.render), setRawMode(this.input, false), t(this.value);\n }), this.once(\"cancel\", () => {\n this.output.write(cursor.show), this.output.off(\"resize\", this.render), setRawMode(this.input, false), t(CANCEL_SYMBOL);\n });\n });\n }\n _isActionKey(t, e) {\n return t === \"\t\";\n }\n _shouldSubmit(t, e) {\n return true;\n }\n _setValue(t) {\n this.value = t, this.emit(\"value\", this.value);\n }\n _setUserInput(t, e) {\n this.userInput = t ?? \"\", this.emit(\"userInput\", this.userInput), e && this._track && this.rl && (this.rl.write(this.userInput), this._cursor = this.rl.cursor);\n }\n _clearUserInput() {\n this.rl?.write(null, { ctrl: true, name: \"u\" }), this._setUserInput(\"\");\n }\n async onKeypress(t, e) {\n if (this.state !== \"validating\") {\n if (this._track && e.name !== \"return\" && (e.name && this._isActionKey(t, e) && this.rl?.write(null, { ctrl: true, name: \"h\" }), this._cursor = this.rl?.cursor ?? 0, this._setUserInput(this.rl?.line)), this.state === \"error\" && (this.state = \"active\"), e?.name && (!this._track && settings.aliases.has(e.name) && this.emit(\"cursor\", settings.aliases.get(e.name)), settings.actions.has(e.name) && this.emit(\"cursor\", e.name)), t && (t.toLowerCase() === \"y\" || t.toLowerCase() === \"n\") && this.emit(\"confirm\", t.toLowerCase() === \"y\"), this.emit(\"key\", t, e), e?.name === \"return\" && this._shouldSubmit(t, e)) {\n if (this.opts.validate) {\n const i = runValidation(this.opts.validate, this.value);\n let s;\n i instanceof Promise ? (this.state = \"validating\", this.render(), s = await i) : s = i, s && (this.error = s instanceof Error ? s.message : s, this.state = \"error\", this.rl?.write(this.userInput));\n }\n this.state !== \"error\" && (this.state = \"submit\");\n }\n isActionKey([t, e?.name, e?.sequence], \"cancel\") && (this.state = \"cancel\"), (this.state === \"submit\" || this.state === \"cancel\") && this.emit(\"finalize\"), this.render(), (this.state === \"submit\" || this.state === \"cancel\") && this.close();\n }\n }\n close() {\n this.input.unpipe(), this.input.removeListener(\"keypress\", this.onKeypress), this.output.write(`\n`), setRawMode(this.input, false), this.rl?.close(), this.rl = void 0, this.emit(`${this.state}`, this.value), this.unsubscribe();\n }\n restoreCursor() {\n const t = wrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split(`\n`).length - 1;\n this.output.write(cursor.move(-999, t * -1));\n }\n render() {\n const t = wrapAnsi(this._render(this) ?? \"\", process.stdout.columns, {\n hard: true,\n trim: false\n });\n if (t !== this._prevFrame) {\n if (this.state === \"initial\")\n this.output.write(cursor.hide);\n else {\n const e = diffLines(this._prevFrame, t), i = getRows(this.output);\n if (this.restoreCursor(), e) {\n const s = Math.max(0, e.numLinesAfter - i), r = Math.max(0, e.numLinesBefore - i);\n let n = e.lines.find((o) => o >= s);\n if (n === void 0) {\n this._prevFrame = t;\n return;\n }\n if (e.lines.length === 1) {\n this.output.write(cursor.move(0, n - r)), this.output.write(erase.lines(1));\n const o = t.split(`\n`);\n this.output.write(o[n]), this._prevFrame = t, this.output.write(cursor.move(0, o.length - n - 1));\n return;\n } else if (e.lines.length > 1) {\n if (s < r)\n n = s;\n else {\n const h = n - r;\n h > 0 && this.output.write(cursor.move(0, h));\n }\n this.output.write(erase.down());\n const f = t.split(`\n`).slice(n);\n this.output.write(f.join(`\n`)), this._prevFrame = t;\n return;\n }\n }\n this.output.write(erase.down());\n }\n this.output.write(t), this.state === \"initial\" && (this.state = \"active\"), this._prevFrame = t;\n }\n }\n}\n\nfunction p$1(l, e) {\n if (l === void 0 || e.length === 0)\n return 0;\n const i = e.findIndex((s) => s.value === l);\n return i !== -1 ? i : 0;\n}\nfunction m(l, e) {\n return (e.label ?? String(e.value)).toLowerCase().includes(l.toLowerCase());\n}\nfunction g(l, e) {\n if (e)\n return l ? e : e[0];\n}\nlet T$1 = class T extends y {\n filteredOptions;\n multiple;\n isNavigating = false;\n selectedValues = [];\n focusedValue;\n #e = 0;\n #s = \"\";\n #t;\n #i;\n #n;\n #l;\n get cursor() {\n return this.#e;\n }\n get userInputWithCursor() {\n if (!this.userInput)\n return styleText([\"inverse\", \"hidden\"], \"_\");\n if (this._cursor >= this.userInput.length)\n return `${this.userInput}\\u2588`;\n const e = this.userInput.slice(0, this.cursor), t = this.userInput.slice(this.cursor, this.cursor + 1), i = this.userInput.slice(this.cursor + 1);\n return `${e}${styleText(\"inverse\", t)}${i}`;\n }\n get options() {\n return typeof this.#i == \"function\" ? this.#i() : this.#i;\n }\n constructor(e) {\n super(e), this.#i = e.options, this.#n = e.placeholder, this.#l = e.completeOnTab === true;\n const t = this.options;\n this.filteredOptions = [...t], this.multiple = e.multiple === true, this.#t = typeof e.options == \"function\" ? e.filter : e.filter ?? m;\n let i;\n if (e.initialValue && Array.isArray(e.initialValue) ? this.multiple ? i = e.initialValue : i = e.initialValue.slice(0, 1) : !this.multiple && this.options.length > 0 && (i = [this.options[0]?.value]), i)\n for (const s of i) {\n const n = t.findIndex((r) => r.value === s);\n n !== -1 && (this.toggleSelected(s), this.#e = n);\n }\n this.focusedValue = this.options[this.#e]?.value, this.on(\"key\", (s, n) => this.#u(s, n)), this.on(\"userInput\", (s) => this.#o(s));\n }\n _isActionKey(e, t) {\n return e === \"\t\" || this.multiple && this.isNavigating && t.name === \"space\" && e !== void 0 && e !== \"\";\n }\n #u(e, t) {\n const i = t.name === \"up\", s = t.name === \"down\", n = t.name === \"return\", r = this.userInput === \"\" || this.userInput === \"\t\", u = this.#n, d = this.options, c = u !== void 0 && u !== \"\" && d.some(\n (o) => !o.disabled && (this.#t ? this.#t(u, o) : true)\n );\n if (t.name === \"tab\" && r && c) {\n this.userInput === \"\t\" && this._clearUserInput(), this._setUserInput(u, true), this.isNavigating = false;\n return;\n }\n if (t.name === \"tab\" && this.#l && !this.multiple && this.focusedValue !== void 0) {\n const o = String(this.focusedValue);\n this._clearUserInput(), this._setUserInput(o, true), this.isNavigating = false;\n return;\n }\n i || s ? (this.#e = findCursor(this.#e, i ? -1 : 1, this.filteredOptions), this.focusedValue = this.filteredOptions[this.#e]?.value, this.multiple || (this.selectedValues = [this.focusedValue]), this.isNavigating = true) : n ? this.value = g(this.multiple, this.selectedValues) : this.multiple ? this.focusedValue !== void 0 && (t.name === \"tab\" || this.isNavigating && t.name === \"space\") ? this.toggleSelected(this.focusedValue) : this.isNavigating = false : (this.focusedValue && (this.selectedValues = [this.focusedValue]), this.isNavigating = false);\n }\n deselectAll() {\n this.selectedValues = [];\n }\n toggleSelected(e) {\n this.filteredOptions.length !== 0 && (this.multiple ? this.selectedValues.includes(e) ? this.selectedValues = this.selectedValues.filter((t) => t !== e) : this.selectedValues = [...this.selectedValues, e] : this.selectedValues = [e]);\n }\n #o(e) {\n if (e !== this.#s) {\n this.#s = e;\n const t = this.options;\n e && this.#t ? this.filteredOptions = t.filter((n) => this.#t?.(e, n)) : this.filteredOptions = [...t];\n const i = p$1(this.focusedValue, this.filteredOptions);\n this.#e = findCursor(i, 0, this.filteredOptions);\n const s = this.filteredOptions[this.#e];\n s && !s.disabled ? this.focusedValue = s.value : this.focusedValue = void 0, this.multiple || (this.focusedValue !== void 0 ? this.toggleSelected(this.focusedValue) : this.deselectAll());\n }\n }\n};\n\nclass r extends y {\n get cursor() {\n return this.value ? 0 : 1;\n }\n get _value() {\n return this.cursor === 0;\n }\n constructor(t) {\n super(t, false), this.value = !!t.initialValue, this.on(\"userInput\", () => {\n this.value = this._value;\n }), this.on(\"confirm\", (i) => {\n this.output.write(cursor.move(0, -1)), this.value = i, this.state = \"submit\", this.close();\n }), this.on(\"cursor\", () => {\n this.value = !this.value;\n });\n }\n}\n\nconst _ = {\n Y: { type: \"year\", len: 4 },\n M: { type: \"month\", len: 2 },\n D: { type: \"day\", len: 2 }\n};\nfunction M(r) {\n return [...r].map((t) => _[t]);\n}\nfunction P(r) {\n const i = new Intl.DateTimeFormat(r, {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\"\n }).formatToParts(new Date(2e3, 0, 15)), s = [];\n let n = \"/\";\n for (const e of i)\n e.type === \"literal\" ? n = e.value.trim() || e.value : (e.type === \"year\" || e.type === \"month\" || e.type === \"day\") && s.push({ type: e.type, len: e.type === \"year\" ? 4 : 2 });\n return { segments: s, separator: n };\n}\nfunction p(r) {\n return Number.parseInt((r || \"0\").replace(/_/g, \"0\"), 10) || 0;\n}\nfunction f(r) {\n return {\n year: p(r.year),\n month: p(r.month),\n day: p(r.day)\n };\n}\nfunction c(r, t) {\n return new Date(r || 2001, t || 1, 0).getDate();\n}\nfunction b(r) {\n const { year: t, month: i, day: s } = f(r);\n if (!t || t < 0 || t > 9999 || !i || i < 1 || i > 12 || !s || s < 1) return;\n const n = new Date(Date.UTC(t, i - 1, s));\n if (!(n.getUTCFullYear() !== t || n.getUTCMonth() !== i - 1 || n.getUTCDate() !== s))\n return { year: t, month: i, day: s };\n}\nfunction C(r) {\n const t = b(r);\n return t ? new Date(Date.UTC(t.year, t.month - 1, t.day)) : void 0;\n}\nfunction T(r, t, i, s) {\n const n = i ? {\n year: i.getUTCFullYear(),\n month: i.getUTCMonth() + 1,\n day: i.getUTCDate()\n } : null, e = s ? {\n year: s.getUTCFullYear(),\n month: s.getUTCMonth() + 1,\n day: s.getUTCDate()\n } : null;\n return r === \"year\" ? { min: n?.year ?? 1, max: e?.year ?? 9999 } : r === \"month\" ? {\n min: n && t.year === n.year ? n.month : 1,\n max: e && t.year === e.year ? e.month : 12\n } : {\n min: n && t.year === n.year && t.month === n.month ? n.day : 1,\n max: e && t.year === e.year && t.month === e.month ? e.day : c(t.year, t.month)\n };\n}\nclass U extends y {\n #i;\n #o;\n #t;\n #h;\n #u;\n #e = { segmentIndex: 0, positionInSegment: 0 };\n #n = true;\n #s = null;\n inlineError = \"\";\n get segmentCursor() {\n return { ...this.#e };\n }\n get segmentValues() {\n return { ...this.#t };\n }\n get segments() {\n return this.#i;\n }\n get separator() {\n return this.#o;\n }\n get formattedValue() {\n return this.#l(this.#t);\n }\n #l(t) {\n return this.#i.map((i) => t[i.type]).join(this.#o);\n }\n #r() {\n this._setUserInput(this.#l(this.#t)), this._setValue(C(this.#t) ?? void 0);\n }\n constructor(t) {\n const i = t.format ? { segments: M(t.format), separator: t.separator ?? \"/\" } : P(t.locale), s = t.separator ?? i.separator, n = t.format ? M(t.format) : i.segments, e = t.initialValue ?? t.defaultValue, m = e ? {\n year: String(e.getUTCFullYear()).padStart(4, \"0\"),\n month: String(e.getUTCMonth() + 1).padStart(2, \"0\"),\n day: String(e.getUTCDate()).padStart(2, \"0\")\n } : { year: \"____\", month: \"__\", day: \"__\" }, o = n.map((a) => m[a.type]).join(s);\n super({ ...t, initialUserInput: o }, false), this.#i = n, this.#o = s, this.#t = m, this.#h = t.minDate, this.#u = t.maxDate, this.#r(), this.on(\"cursor\", (a) => this.#f(a)), this.on(\"key\", (a, u) => this.#y(a, u)), this.on(\"finalize\", () => this.#p(t));\n }\n #a() {\n const t = Math.max(0, Math.min(this.#e.segmentIndex, this.#i.length - 1)), i = this.#i[t];\n if (i)\n return this.#e.positionInSegment = Math.max(\n 0,\n Math.min(this.#e.positionInSegment, i.len - 1)\n ), { segment: i, index: t };\n }\n #m(t) {\n this.inlineError = \"\", this.#s = null;\n const i = this.#a();\n i && (this.#e.segmentIndex = Math.max(\n 0,\n Math.min(this.#i.length - 1, i.index + t)\n ), this.#e.positionInSegment = 0, this.#n = true);\n }\n #d(t) {\n const i = this.#a();\n if (!i) return;\n const { segment: s } = i, n = this.#t[s.type], e = !n || n.replace(/_/g, \"\") === \"\", m = Number.parseInt((n || \"0\").replace(/_/g, \"0\"), 10) || 0, o = T(\n s.type,\n f(this.#t),\n this.#h,\n this.#u\n );\n let a;\n e ? a = t === 1 ? o.min : o.max : a = Math.max(Math.min(o.max, m + t), o.min), this.#t = {\n ...this.#t,\n [s.type]: a.toString().padStart(s.len, \"0\")\n }, this.#n = true, this.#s = null, this.#r();\n }\n #f(t) {\n if (t)\n switch (t) {\n case \"right\":\n return this.#m(1);\n case \"left\":\n return this.#m(-1);\n case \"up\":\n return this.#d(1);\n case \"down\":\n return this.#d(-1);\n }\n }\n #y(t, i) {\n if (i?.name === \"backspace\" || i?.sequence === \"\\x7F\" || i?.sequence === \"\\b\" || t === \"\\x7F\" || t === \"\\b\") {\n this.inlineError = \"\";\n const n = this.#a();\n if (!n) return;\n if (!this.#t[n.segment.type].replace(/_/g, \"\")) {\n this.#m(-1);\n return;\n }\n this.#t[n.segment.type] = \"_\".repeat(n.segment.len), this.#n = true, this.#e.positionInSegment = 0, this.#r();\n return;\n }\n if (i?.name === \"tab\") {\n this.inlineError = \"\";\n const n = this.#a();\n if (!n) return;\n const e = i.shift ? -1 : 1, m = n.index + e;\n m >= 0 && m < this.#i.length && (this.#e.segmentIndex = m, this.#e.positionInSegment = 0, this.#n = true);\n return;\n }\n if (t && /^[0-9]$/.test(t)) {\n const n = this.#a();\n if (!n) return;\n const { segment: e } = n, m = !this.#t[e.type].replace(/_/g, \"\");\n if (this.#n && this.#s !== null && !m) {\n const h = this.#s + t, d = { ...this.#t, [e.type]: h }, g = this.#g(d, e);\n if (g) {\n this.inlineError = g, this.#s = null, this.#n = false;\n return;\n }\n this.inlineError = \"\", this.#t[e.type] = h, this.#s = null, this.#n = false, this.#r(), n.index < this.#i.length - 1 && (this.#e.segmentIndex = n.index + 1, this.#e.positionInSegment = 0, this.#n = true);\n return;\n }\n this.#n && !m && (this.#t[e.type] = \"_\".repeat(e.len), this.#e.positionInSegment = 0), this.#n = false, this.#s = null;\n const o = this.#t[e.type], a = o.indexOf(\"_\"), u = a >= 0 ? a : Math.min(this.#e.positionInSegment, e.len - 1);\n if (u < 0 || u >= e.len) return;\n let l = o.slice(0, u) + t + o.slice(u + 1), D = false;\n if (u === 0 && o === \"__\" && (e.type === \"month\" || e.type === \"day\")) {\n const h = Number.parseInt(t, 10);\n l = `0${t}`, D = h <= (e.type === \"month\" ? 1 : 2);\n }\n if (e.type === \"year\" && (l = (o.replace(/_/g, \"\") + t).padStart(e.len, \"_\")), !l.includes(\"_\")) {\n const h = { ...this.#t, [e.type]: l }, d = this.#g(h, e);\n if (d) {\n this.inlineError = d;\n return;\n }\n }\n this.inlineError = \"\", this.#t[e.type] = l;\n const y = l.includes(\"_\") ? void 0 : b(this.#t);\n if (y) {\n const { year: h, month: d } = y, g = c(h, d);\n this.#t = {\n year: String(Math.max(0, Math.min(9999, h))).padStart(4, \"0\"),\n month: String(Math.max(1, Math.min(12, d))).padStart(2, \"0\"),\n day: String(Math.max(1, Math.min(g, y.day))).padStart(2, \"0\")\n };\n }\n this.#r();\n const S = l.indexOf(\"_\");\n D ? (this.#n = true, this.#s = t) : S >= 0 ? this.#e.positionInSegment = S : a >= 0 && n.index < this.#i.length - 1 ? (this.#e.segmentIndex = n.index + 1, this.#e.positionInSegment = 0, this.#n = true) : this.#e.positionInSegment = Math.min(u + 1, e.len - 1);\n }\n }\n #g(t, i) {\n const { month: s, day: n } = f(t);\n if (i.type === \"month\" && (s < 0 || s > 12))\n return settings.date.messages.invalidMonth;\n if (i.type === \"day\" && (n < 0 || n > 31))\n return settings.date.messages.invalidDay(31, \"any month\");\n }\n #p(t) {\n const { year: i, month: s, day: n } = f(this.#t);\n if (i && s && n) {\n const e = c(i, s);\n this.#t = {\n ...this.#t,\n day: String(Math.min(n, e)).padStart(2, \"0\")\n };\n }\n this.value = C(this.#t) ?? t.defaultValue ?? void 0;\n }\n}\n\nlet u$2 = class u extends y {\n options;\n cursor = 0;\n #t;\n getGroupItems(t) {\n return this.options.filter((r) => r.group === t);\n }\n isGroupSelected(t) {\n const r = this.getGroupItems(t), e = this.value;\n return e === void 0 ? false : r.every((s) => e.includes(s.value));\n }\n toggleValue() {\n const t = this.options[this.cursor];\n if (t !== void 0)\n if (this.value === void 0 && (this.value = []), t.group === true) {\n const r = t.value, e = this.getGroupItems(r);\n this.isGroupSelected(r) ? this.value = this.value.filter(\n (s) => e.findIndex((i) => i.value === s) === -1\n ) : this.value = [...this.value, ...e.map((s) => s.value)], this.value = Array.from(new Set(this.value));\n } else {\n const r = this.value.includes(t.value);\n this.value = r ? this.value.filter((e) => e !== t.value) : [...this.value, t.value];\n }\n }\n constructor(t) {\n super(t, false);\n const { options: r } = t;\n this.#t = t.selectableGroups !== false, this.options = Object.entries(r).flatMap(([e, s]) => [\n { value: e, group: true, label: e },\n ...s.map((i) => ({ ...i, group: e }))\n ]), this.value = [...t.initialValues ?? []], this.cursor = Math.max(\n this.options.findIndex(({ value: e }) => e === t.cursorAt),\n this.#t ? 0 : 1\n ), this.on(\"cursor\", (e) => {\n switch (e) {\n case \"left\":\n case \"up\": {\n this.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n const s = this.options[this.cursor]?.group === true;\n !this.#t && s && (this.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1);\n break;\n }\n case \"down\":\n case \"right\": {\n this.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n const s = this.options[this.cursor]?.group === true;\n !this.#t && s && (this.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1);\n break;\n }\n case \"space\":\n this.toggleValue();\n break;\n }\n });\n }\n};\n\nconst o = /* @__PURE__ */ new Set([\"up\", \"down\", \"left\", \"right\"]);\nclass h extends y {\n #t = false;\n #s;\n focused = \"editor\";\n get userInputWithCursor() {\n if (this.state === \"submit\")\n return this.userInput;\n const t = this.userInput;\n if (this.cursor >= t.length)\n return `${t}\\u2588`;\n const s = t.slice(0, this.cursor), r = t.slice(this.cursor, this.cursor + 1), i = t.slice(this.cursor + 1);\n return r === `\n` ? `${s}\\u2588\n${i}` : `${s}${styleText(\"inverse\", r)}${i}`;\n }\n get cursor() {\n return this._cursor;\n }\n #r(t) {\n if (this.userInput.length === 0) {\n this._setUserInput(t);\n return;\n }\n this._setUserInput(\n this.userInput.slice(0, this.cursor) + t + this.userInput.slice(this.cursor)\n );\n }\n #i(t) {\n const s = this.value ?? \"\";\n switch (t) {\n case \"up\":\n this._cursor = findTextCursor(this._cursor, 0, -1, s);\n return;\n case \"down\":\n this._cursor = findTextCursor(this._cursor, 0, 1, s);\n return;\n case \"left\":\n this._cursor = findTextCursor(this._cursor, -1, 0, s);\n return;\n case \"right\":\n this._cursor = findTextCursor(this._cursor, 1, 0, s);\n return;\n }\n }\n _shouldSubmit(t, s) {\n if (this.#s)\n return this.focused === \"submit\" ? true : (this.#r(`\n`), this._cursor++, false);\n const r = this.#t;\n return this.#t = true, r && this.cursor === this.userInput.length ? (this.userInput[this.cursor - 1] === `\n` && (this._setUserInput(\n this.userInput.slice(0, this.cursor - 1) + this.userInput.slice(this.cursor)\n ), this._cursor--), true) : (this.#r(`\n`), this._cursor++, false);\n }\n constructor(t) {\n const s = t.initialUserInput ?? t.initialValue;\n super(\n {\n ...t,\n initialUserInput: s\n },\n false\n ), s !== void 0 && (this._cursor = s.length), this.#s = t.showSubmit ?? false, this.on(\"key\", (r, i) => {\n if (i?.name && o.has(i.name)) {\n this.#t = false, this.#i(i.name);\n return;\n }\n if (r === \"\t\" && this.#s) {\n this.focused = this.focused === \"editor\" ? \"submit\" : \"editor\";\n return;\n }\n if (i?.name !== \"return\") {\n if (this.#t = false, i?.name === \"backspace\" && this.cursor > 0) {\n this._setUserInput(\n this.userInput.slice(0, this.cursor - 1) + this.userInput.slice(this.cursor)\n ), this._cursor--;\n return;\n }\n if (i?.name === \"delete\" && this.cursor < this.userInput.length) {\n this._setUserInput(\n this.userInput.slice(0, this.cursor) + this.userInput.slice(this.cursor + 1)\n );\n return;\n }\n r && (this.#s && this.focused === \"submit\" && (this.focused = \"editor\"), this.#r(r ?? \"\"), this._cursor++);\n }\n }), this.on(\"userInput\", (r) => {\n this._setValue(r);\n }), this.on(\"finalize\", () => {\n this.value || (this.value = t.defaultValue), this.value === void 0 && (this.value = \"\");\n });\n }\n}\n\nclass a extends y {\n options;\n cursor = 0;\n get _value() {\n return this.options[this.cursor]?.value;\n }\n get _enabledOptions() {\n return this.options.filter((e) => e.disabled !== true);\n }\n toggleAll() {\n const e = this._enabledOptions, i = this.value !== void 0 && this.value.length === e.length;\n this.value = i ? [] : e.map((t) => t.value);\n }\n toggleInvert() {\n const e = this.value;\n if (!e)\n return;\n const i = this._enabledOptions.filter((t) => !e.includes(t.value));\n this.value = i.map((t) => t.value);\n }\n toggleValue() {\n this.value === void 0 && (this.value = []);\n const e = this.value.includes(this._value);\n this.value = e ? this.value.filter((i) => i !== this._value) : [...this.value, this._value];\n }\n constructor(e) {\n super(e, false), this.options = e.options, this.value = [...e.initialValues ?? []];\n const i = Math.max(\n this.options.findIndex(({ value: t }) => t === e.cursorAt),\n 0\n );\n this.cursor = this.options[i]?.disabled ? findCursor(i, 1, this.options) : i, this.on(\"key\", (t, l) => {\n l.name === \"a\" && this.toggleAll(), l.name === \"i\" && this.toggleInvert();\n }), this.on(\"cursor\", (t) => {\n switch (t) {\n case \"left\":\n case \"up\":\n this.cursor = findCursor(this.cursor, -1, this.options);\n break;\n case \"down\":\n case \"right\":\n this.cursor = findCursor(this.cursor, 1, this.options);\n break;\n case \"space\":\n this.toggleValue();\n break;\n }\n });\n }\n}\n\nlet u$1 = class u extends y {\n _mask = \"\\u2022\";\n get cursor() {\n return this._cursor;\n }\n get masked() {\n return this.userInput.replaceAll(/./g, this._mask);\n }\n get userInputWithCursor() {\n if (this.state === \"submit\" || this.state === \"cancel\")\n return this.masked;\n const t = this.userInput;\n if (this.cursor >= t.length)\n return `${this.masked}${styleText([\"inverse\", \"hidden\"], \"_\")}`;\n const s = this.masked, r = s.slice(0, this.cursor), i = s.slice(this.cursor, this.cursor + 1), o = s.slice(this.cursor + 1);\n return `${r}${styleText(\"inverse\", i)}${o}`;\n }\n clear() {\n this._clearUserInput();\n }\n constructor({ mask: t, ...s }) {\n super(s), this._mask = t ?? \"\\u2022\", this.on(\"userInput\", (r) => {\n this._setValue(r);\n }), this.on(\"finalize\", () => {\n this.value === void 0 && (this.value = \"\");\n });\n }\n};\n\nlet n$1 = class n extends y {\n options;\n cursor = 0;\n get _selectedValue() {\n return this.options[this.cursor];\n }\n changeValue() {\n const e = this._selectedValue;\n this.value = e === void 0 ? void 0 : e.value;\n }\n constructor(e) {\n super(e, false), this.options = e.options;\n const o = this.options.findIndex(({ value: s }) => s === e.initialValue), t = o === -1 ? 0 : o;\n this.cursor = this.options[t]?.disabled ? findCursor(t, 1, this.options) : t, this.changeValue(), this.on(\"cursor\", (s) => {\n switch (s) {\n case \"left\":\n case \"up\":\n this.cursor = findCursor(this.cursor, -1, this.options);\n break;\n case \"down\":\n case \"right\":\n this.cursor = findCursor(this.cursor, 1, this.options);\n break;\n }\n this.changeValue();\n });\n }\n};\n\nclass u extends y {\n options;\n cursor = 0;\n constructor(t) {\n super(t, false), this.options = t.options;\n const s = t.caseSensitive === true, i = this.options.map(({ value: [e] }) => s ? e : e?.toLowerCase());\n this.cursor = Math.max(i.indexOf(t.initialValue), 0), this.on(\"key\", (e) => {\n if (!e)\n return;\n const o = s ? e : e.toLowerCase();\n if (!i.includes(o))\n return;\n const n = this.options.find(({ value: [r] }) => s ? r === o : r?.toLowerCase() === o);\n n && (this.value = n.value, this.state = \"submit\", this.emit(\"submit\"));\n });\n }\n}\n\nclass n extends y {\n get userInputWithCursor() {\n if (this.state === \"submit\")\n return this.userInput;\n const t = this.userInput;\n if (this.cursor >= t.length)\n return `${this.userInput}\\u2588`;\n const r = t.slice(0, this.cursor), s = t.slice(this.cursor, this.cursor + 1), e = t.slice(this.cursor + 1);\n return `${r}${styleText(\"inverse\", s)}${e}`;\n }\n get cursor() {\n return this._cursor;\n }\n constructor(t) {\n super({\n ...t,\n initialUserInput: t.initialUserInput ?? t.initialValue\n }), this.on(\"userInput\", (r) => {\n this._setValue(r);\n }), this.on(\"finalize\", () => {\n this.value || (this.value = t.defaultValue), this.value === void 0 && (this.value = \"\");\n });\n }\n}\n\nexport { T$1 as AutocompletePrompt, CANCEL_SYMBOL, r as ConfirmPrompt, U as DatePrompt, u$2 as GroupMultiSelectPrompt, h as MultiLinePrompt, a as MultiSelectPrompt, u$1 as PasswordPrompt, y as Prompt, u as SelectKeyPrompt, n$1 as SelectPrompt, n as TextPrompt, block, getColumns, getRows, isAccessible, isCancel, runValidation, settings, updateSettings, wrapTextWithPrefix };\n","/* MAIN */\nconst getCodePointsLength = (() => {\n const SURROGATE_PAIR_RE = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n return (input) => {\n let surrogatePairsNr = 0;\n SURROGATE_PAIR_RE.lastIndex = 0;\n while (SURROGATE_PAIR_RE.test(input)) {\n surrogatePairsNr += 1;\n }\n return input.length - surrogatePairsNr;\n };\n})();\nconst isFullWidth = (x) => {\n return x === 0x3000 || x >= 0xFF01 && x <= 0xFF60 || x >= 0xFFE0 && x <= 0xFFE6;\n};\nconst isWideNotCJKTNotEmoji = (x) => {\n return x === 0x231B || x === 0x2329 || x >= 0x2FF0 && x <= 0x2FFF || x >= 0x3001 && x <= 0x303E || x >= 0x3099 && x <= 0x30FF || x >= 0x3105 && x <= 0x312F || x >= 0x3131 && x <= 0x318E || x >= 0x3190 && x <= 0x31E3 || x >= 0x31EF && x <= 0x321E || x >= 0x3220 && x <= 0x3247 || x >= 0x3250 && x <= 0x4DBF || x >= 0xFE10 && x <= 0xFE19 || x >= 0xFE30 && x <= 0xFE52 || x >= 0xFE54 && x <= 0xFE66 || x >= 0xFE68 && x <= 0xFE6B || x >= 0x1F200 && x <= 0x1F202 || x >= 0x1F210 && x <= 0x1F23B || x >= 0x1F240 && x <= 0x1F248 || x >= 0x20000 && x <= 0x2FFFD || x >= 0x30000 && x <= 0x3FFFD;\n};\n/* EXPORT */\nexport { getCodePointsLength, isFullWidth, isWideNotCJKTNotEmoji };\n","/* IMPORT */\nimport { getCodePointsLength, isFullWidth, isWideNotCJKTNotEmoji } from './utils.js';\n/* HELPERS */\nconst ANSI_RE = /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\\u001b\\]8;[^;]*;.*?(?:\\u0007|\\u001b\\u005c)/y;\nconst CONTROL_RE = /[\\x00-\\x08\\x0A-\\x1F\\x7F-\\x9F]{1,1000}/y;\nconst CJKT_WIDE_RE = /(?:(?![\\uFF61-\\uFF9F\\uFF00-\\uFFEF])[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}\\p{Script=Tangut}]){1,1000}/yu;\nconst TAB_RE = /\\t{1,1000}/y;\nconst EMOJI_RE = /[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*/yu;\nconst LATIN_RE = /(?:[\\x20-\\x7E\\xA0-\\xFF](?!\\uFE0F)){1,1000}/y;\nconst MODIFIER_RE = /\\p{M}+/gu;\nconst NO_TRUNCATION = { limit: Infinity, ellipsis: '' };\n/* MAIN */\nconst getStringTruncatedWidth = (input, truncationOptions = {}, widthOptions = {}) => {\n /* CONSTANTS */\n const LIMIT = truncationOptions.limit ?? Infinity;\n const ELLIPSIS = truncationOptions.ellipsis ?? '';\n const ELLIPSIS_WIDTH = truncationOptions?.ellipsisWidth ?? (ELLIPSIS ? getStringTruncatedWidth(ELLIPSIS, NO_TRUNCATION, widthOptions).width : 0);\n const ANSI_WIDTH = 0;\n const CONTROL_WIDTH = widthOptions.controlWidth ?? 0;\n const TAB_WIDTH = widthOptions.tabWidth ?? 8;\n const EMOJI_WIDTH = widthOptions.emojiWidth ?? 2;\n const FULL_WIDTH_WIDTH = 2;\n const REGULAR_WIDTH = widthOptions.regularWidth ?? 1;\n const WIDE_WIDTH = widthOptions.wideWidth ?? FULL_WIDTH_WIDTH;\n const PARSE_BLOCKS = [\n [LATIN_RE, REGULAR_WIDTH],\n [ANSI_RE, ANSI_WIDTH],\n [CONTROL_RE, CONTROL_WIDTH],\n [TAB_RE, TAB_WIDTH],\n [EMOJI_RE, EMOJI_WIDTH],\n [CJKT_WIDE_RE, WIDE_WIDTH],\n ];\n /* STATE */\n let indexPrev = 0;\n let index = 0;\n let length = input.length;\n let lengthExtra = 0;\n let truncationEnabled = false;\n let truncationIndex = length;\n let truncationLimit = Math.max(0, LIMIT - ELLIPSIS_WIDTH);\n let unmatchedStart = 0;\n let unmatchedEnd = 0;\n let width = 0;\n let widthExtra = 0;\n /* PARSE LOOP */\n outer: while (true) {\n /* UNMATCHED */\n if ((unmatchedEnd > unmatchedStart) || (index >= length && index > indexPrev)) {\n const unmatched = input.slice(unmatchedStart, unmatchedEnd) || input.slice(indexPrev, index);\n lengthExtra = 0;\n for (const char of unmatched.replaceAll(MODIFIER_RE, '')) {\n const codePoint = char.codePointAt(0) || 0;\n if (isFullWidth(codePoint)) {\n widthExtra = FULL_WIDTH_WIDTH;\n }\n else if (isWideNotCJKTNotEmoji(codePoint)) {\n widthExtra = WIDE_WIDTH;\n }\n else {\n widthExtra = REGULAR_WIDTH;\n }\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, Math.max(unmatchedStart, indexPrev) + lengthExtra);\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break outer;\n }\n lengthExtra += char.length;\n width += widthExtra;\n }\n unmatchedStart = unmatchedEnd = 0;\n }\n /* EXITING */\n if (index >= length) {\n break outer;\n }\n /* PARSE BLOCKS */\n for (let i = 0, l = PARSE_BLOCKS.length; i < l; i++) {\n const [BLOCK_RE, BLOCK_WIDTH] = PARSE_BLOCKS[i];\n BLOCK_RE.lastIndex = index;\n if (BLOCK_RE.test(input)) {\n lengthExtra = BLOCK_RE === CJKT_WIDE_RE ? getCodePointsLength(input.slice(index, BLOCK_RE.lastIndex)) : BLOCK_RE === EMOJI_RE ? 1 : BLOCK_RE.lastIndex - index;\n widthExtra = lengthExtra * BLOCK_WIDTH;\n if ((width + widthExtra) > truncationLimit) {\n truncationIndex = Math.min(truncationIndex, index + Math.floor((truncationLimit - width) / BLOCK_WIDTH));\n }\n if ((width + widthExtra) > LIMIT) {\n truncationEnabled = true;\n break outer;\n }\n width += widthExtra;\n unmatchedStart = indexPrev;\n unmatchedEnd = index;\n index = indexPrev = BLOCK_RE.lastIndex;\n continue outer;\n }\n }\n /* UNMATCHED INDEX */\n index += 1;\n }\n /* RETURN */\n return {\n width: truncationEnabled ? truncationLimit : width,\n index: truncationEnabled ? truncationIndex : length,\n truncated: truncationEnabled,\n ellipsed: truncationEnabled && LIMIT >= ELLIPSIS_WIDTH\n };\n};\n/* EXPORT */\nexport default getStringTruncatedWidth;\n","/* IMPORT */\nimport fastStringTruncatedWidth from 'fast-string-truncated-width';\n/* HELPERS */\nconst NO_TRUNCATION = {\n limit: Infinity,\n ellipsis: '',\n ellipsisWidth: 0,\n};\n/* MAIN */\nconst fastStringWidth = (input, options = {}) => {\n return fastStringTruncatedWidth(input, NO_TRUNCATION, options).width;\n};\n/* EXPORT */\nexport default fastStringWidth;\n","import stringWidth from 'fast-string-width';\nconst ESC = '\\x1B';\nconst CSI = '\\x9B';\nconst END_CODE = 39;\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;\nconst GROUP_REGEX = new RegExp(`(?:\\\\${ANSI_CSI}(?<code>\\\\d+)m|\\\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`, 'y');\nconst getClosingCode = (openingCode) => {\n if (openingCode >= 30 && openingCode <= 37)\n return 39;\n if (openingCode >= 90 && openingCode <= 97)\n return 39;\n if (openingCode >= 40 && openingCode <= 47)\n return 49;\n if (openingCode >= 100 && openingCode <= 107)\n return 49;\n if (openingCode === 1 || openingCode === 2)\n return 22;\n if (openingCode === 3)\n return 23;\n if (openingCode === 4)\n return 24;\n if (openingCode === 7)\n return 27;\n if (openingCode === 8)\n return 28;\n if (openingCode === 9)\n return 29;\n if (openingCode === 0)\n return 0;\n return undefined;\n};\nconst wrapAnsiCode = (code) => `${ESC}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = (url) => `${ESC}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;\nconst wrapWord = (rows, word, columns) => {\n const characters = word[Symbol.iterator]();\n let isInsideEscape = false;\n let isInsideLinkEscape = false;\n let lastRow = rows.at(-1);\n let visible = lastRow === undefined ? 0 : stringWidth(lastRow);\n let currentCharacter = characters.next();\n let nextCharacter = characters.next();\n let rawCharacterIndex = 0;\n while (!currentCharacter.done) {\n const character = currentCharacter.value;\n const characterLength = stringWidth(character);\n if (visible + characterLength <= columns) {\n rows[rows.length - 1] += character;\n }\n else {\n rows.push(character);\n visible = 0;\n }\n if (character === ESC || character === CSI) {\n isInsideEscape = true;\n isInsideLinkEscape = word.startsWith(ANSI_ESCAPE_LINK, rawCharacterIndex + 1);\n }\n if (isInsideEscape) {\n if (isInsideLinkEscape) {\n if (character === ANSI_ESCAPE_BELL) {\n isInsideEscape = false;\n isInsideLinkEscape = false;\n }\n }\n else if (character === ANSI_SGR_TERMINATOR) {\n isInsideEscape = false;\n }\n }\n else {\n visible += characterLength;\n if (visible === columns && !nextCharacter.done) {\n rows.push('');\n visible = 0;\n }\n }\n currentCharacter = nextCharacter;\n nextCharacter = characters.next();\n rawCharacterIndex += character.length;\n }\n lastRow = rows.at(-1);\n if (!visible && lastRow !== undefined && lastRow.length && rows.length > 1) {\n rows[rows.length - 2] += rows.pop();\n }\n};\nconst stringVisibleTrimSpacesRight = (string) => {\n const words = string.split(' ');\n let last = words.length;\n while (last) {\n if (stringWidth(words[last - 1])) {\n break;\n }\n last--;\n }\n if (last === words.length) {\n return string;\n }\n return words.slice(0, last).join(' ') + words.slice(last).join('');\n};\nconst exec = (string, columns, options = {}) => {\n if (options.trim !== false && string.trim() === '') {\n return '';\n }\n let returnValue = '';\n let escapeCode;\n let escapeUrl;\n const words = string.split(' ');\n let rows = [''];\n let rowLength = 0;\n for (let index = 0; index < words.length; index++) {\n const word = words[index];\n if (options.trim !== false) {\n const row = rows.at(-1) ?? '';\n const trimmed = row.trimStart();\n if (row.length !== trimmed.length) {\n rows[rows.length - 1] = trimmed;\n rowLength = stringWidth(trimmed);\n }\n }\n if (index !== 0) {\n if (rowLength >= columns &&\n (options.wordWrap === false || options.trim === false)) {\n rows.push('');\n rowLength = 0;\n }\n if (rowLength || options.trim === false) {\n rows[rows.length - 1] += ' ';\n rowLength++;\n }\n }\n const wordLength = stringWidth(word);\n if (options.hard && wordLength > columns) {\n const remainingColumns = columns - rowLength;\n const breaksStartingThisLine = 1 + Math.floor((wordLength - remainingColumns - 1) / columns);\n const breaksStartingNextLine = Math.floor((wordLength - 1) / columns);\n if (breaksStartingNextLine < breaksStartingThisLine) {\n rows.push('');\n }\n wrapWord(rows, word, columns);\n rowLength = stringWidth(rows.at(-1) ?? '');\n continue;\n }\n if (rowLength + wordLength > columns && rowLength && wordLength) {\n if (options.wordWrap === false && rowLength < columns) {\n wrapWord(rows, word, columns);\n rowLength = stringWidth(rows.at(-1) ?? '');\n continue;\n }\n rows.push('');\n rowLength = 0;\n }\n if (rowLength + wordLength > columns && options.wordWrap === false) {\n wrapWord(rows, word, columns);\n rowLength = stringWidth(rows.at(-1) ?? '');\n continue;\n }\n rows[rows.length - 1] += word;\n rowLength += wordLength;\n }\n if (options.trim !== false) {\n rows = rows.map((row) => stringVisibleTrimSpacesRight(row));\n }\n const preString = rows.join('\\n');\n let inSurrogate = false;\n for (let i = 0; i < preString.length; i++) {\n const character = preString[i];\n returnValue += character;\n if (!inSurrogate) {\n inSurrogate = character >= '\\ud800' && character <= '\\udbff';\n if (inSurrogate) {\n continue;\n }\n }\n else {\n inSurrogate = false;\n }\n if (character === ESC || character === CSI) {\n GROUP_REGEX.lastIndex = i + 1;\n const groupsResult = GROUP_REGEX.exec(preString);\n const groups = groupsResult?.groups;\n if (groups?.code !== undefined) {\n const code = Number.parseFloat(groups.code);\n escapeCode = code === END_CODE ? undefined : code;\n }\n else if (groups?.uri !== undefined) {\n escapeUrl = groups.uri.length === 0 ? undefined : groups.uri;\n }\n }\n if (preString[i + 1] === '\\n') {\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink('');\n }\n const closingCode = escapeCode ? getClosingCode(escapeCode) : undefined;\n if (escapeCode && closingCode) {\n returnValue += wrapAnsiCode(closingCode);\n }\n }\n else if (character === '\\n') {\n if (escapeCode && getClosingCode(escapeCode)) {\n returnValue += wrapAnsiCode(escapeCode);\n }\n if (escapeUrl) {\n returnValue += wrapAnsiHyperlink(escapeUrl);\n }\n }\n }\n return returnValue;\n};\nconst CRLF_OR_LF = /\\r?\\n/;\nexport function wrapAnsi(string, columns, options) {\n return String(string)\n .normalize()\n .split(CRLF_OR_LF)\n .map((line) => exec(line, columns, options))\n .join('\\n');\n}\n","import { getColumns, getRows, AutocompletePrompt, settings, ConfirmPrompt, wrapTextWithPrefix, DatePrompt, runValidation, isCancel, MultiSelectPrompt, GroupMultiSelectPrompt, MultiLinePrompt, PasswordPrompt, block, SelectPrompt, SelectKeyPrompt, TextPrompt } from '@clack/core';\nexport { CANCEL_SYMBOL, isCancel, settings, updateSettings } from '@clack/core';\nimport { styleText, stripVTControlCharacters } from 'node:util';\nimport process$1 from 'node:process';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport l from 'fast-string-width';\nimport { existsSync, lstatSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { cursor, erase } from 'sisteransi';\n\nfunction isUnicodeSupported() {\n\tif (process$1.platform !== 'win32') {\n\t\treturn process$1.env.TERM !== 'linux'; // Linux console (kernel)\n\t}\n\n\treturn Boolean(process$1.env.CI)\n\t\t|| Boolean(process$1.env.WT_SESSION) // Windows Terminal\n\t\t|| Boolean(process$1.env.TERMINUS_SUBLIME) // Terminus (<0.2.27)\n\t\t|| process$1.env.ConEmuTask === '{cmd::Cmder}' // ConEmu and cmder\n\t\t|| process$1.env.TERM_PROGRAM === 'Terminus-Sublime'\n\t\t|| process$1.env.TERM_PROGRAM === 'vscode'\n\t\t|| process$1.env.TERM === 'xterm-256color'\n\t\t|| process$1.env.TERM === 'alacritty'\n\t\t|| process$1.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm';\n}\n\nconst unicode = isUnicodeSupported(), isCI = () => process.env.CI === \"true\", isTTY = (o) => o.isTTY === true, unicodeOr = (o, e) => unicode ? o : e, S_STEP_ACTIVE = unicodeOr(\"\\u25C6\", \"*\"), S_STEP_CANCEL = unicodeOr(\"\\u25A0\", \"x\"), S_STEP_ERROR = unicodeOr(\"\\u25B2\", \"x\"), S_STEP_SUBMIT = unicodeOr(\"\\u25C7\", \"o\"), S_BAR_START = unicodeOr(\"\\u250C\", \"T\"), S_BAR = unicodeOr(\"\\u2502\", \"|\"), S_BAR_END = unicodeOr(\"\\u2514\", \"\\u2014\"), S_BAR_START_RIGHT = unicodeOr(\"\\u2510\", \"T\"), S_BAR_END_RIGHT = unicodeOr(\"\\u2518\", \"\\u2014\"), S_RADIO_ACTIVE = unicodeOr(\"\\u25CF\", \">\"), S_RADIO_INACTIVE = unicodeOr(\"\\u25CB\", \" \"), S_CHECKBOX_ACTIVE = unicodeOr(\"\\u25FB\", \"[\\u2022]\"), S_CHECKBOX_SELECTED = unicodeOr(\"\\u25FC\", \"[+]\"), S_CHECKBOX_INACTIVE = unicodeOr(\"\\u25FB\", \"[ ]\"), S_PASSWORD_MASK = unicodeOr(\"\\u25AA\", \"\\u2022\"), S_BAR_H = unicodeOr(\"\\u2500\", \"-\"), S_CORNER_TOP_RIGHT = unicodeOr(\"\\u256E\", \"+\"), S_CONNECT_LEFT = unicodeOr(\"\\u251C\", \"+\"), S_CORNER_BOTTOM_RIGHT = unicodeOr(\"\\u256F\", \"+\"), S_CORNER_BOTTOM_LEFT = unicodeOr(\"\\u2570\", \"+\"), S_CORNER_TOP_LEFT = unicodeOr(\"\\u256D\", \"+\"), S_INFO = unicodeOr(\"\\u25CF\", \"\\u2022\"), S_SUCCESS = unicodeOr(\"\\u25C6\", \"*\"), S_WARN = unicodeOr(\"\\u25B2\", \"!\"), S_ERROR = unicodeOr(\"\\u25A0\", \"x\"), symbol = (o) => {\n switch (o) {\n case \"initial\":\n case \"active\":\n return styleText(\"cyan\", S_STEP_ACTIVE);\n case \"cancel\":\n return styleText(\"red\", S_STEP_CANCEL);\n case \"error\":\n return styleText(\"yellow\", S_STEP_ERROR);\n case \"submit\":\n return styleText(\"green\", S_STEP_SUBMIT);\n case \"validating\":\n return styleText(\"dim\", S_STEP_ACTIVE);\n }\n}, symbolBar = (o) => {\n switch (o) {\n case \"initial\":\n case \"active\":\n return styleText(\"cyan\", S_BAR);\n case \"cancel\":\n return styleText(\"red\", S_BAR);\n case \"error\":\n return styleText(\"yellow\", S_BAR);\n case \"submit\":\n return styleText(\"green\", S_BAR);\n }\n};\nfunction formatInstructionFooter(o, e) {\n const r = [`${e ? `${styleText(\"cyan\", S_BAR)} ` : \"\"}${o.join(\" \\u2022 \")}`];\n return e && r.push(styleText(\"cyan\", S_BAR_END)), r;\n}\n\nconst I = (l, e, w, p, b, C = false) => {\n let r = e, O = 0;\n if (C)\n for (let i = p - 1; i >= w; i--) {\n const m = l[i];\n if (m && (r -= m.length), O++, r <= b) break;\n }\n else\n for (let i = w; i < p; i++) {\n const m = l[i];\n if (m && (r -= m.length), O++, r <= b) break;\n }\n return { lineCount: r, removals: O };\n};\nconst limitOptions = ({\n cursor: l,\n options: e,\n style: w,\n output: p = process.stdout,\n maxItems: b = Number.POSITIVE_INFINITY,\n columnPadding: C = 0,\n rowPadding: r = 4\n}) => {\n const i = getColumns(p) - C, m = getRows(p), M = styleText(\"dim\", \"...\"), v = Math.max(m - r, 0), a = Math.max(Math.min(b, v), 5);\n let f = 0;\n l >= a - 3 && (f = Math.max(\n Math.min(l - a + 3, e.length - a),\n 0\n ));\n let d = a < e.length && f > 0, c = a < e.length && f + a < e.length;\n const W = Math.min(\n f + a,\n e.length\n ), s = [];\n let g = 0;\n d && g++, c && g++;\n const T = f + (d ? 1 : 0), y = W - (c ? 1 : 0);\n for (let t = T; t < y; t++) {\n const n = e[t], o = n ? w(n, t === l) : \"\", h = wrapAnsi(o, i, {\n hard: true,\n trim: false\n }).split(`\n`);\n s.push(h), g += h.length;\n }\n if (g > v) {\n let t = 0, n = 0, o = g;\n const h = l - T;\n let u = v;\n const L = () => I(s, o, 0, h, u), E = () => I(\n s,\n o,\n h + 1,\n s.length,\n u,\n true\n );\n d ? ({ lineCount: o, removals: t } = L(), o > u && (c || (u -= 1), { lineCount: o, removals: n } = E())) : (c || (u -= 1), { lineCount: o, removals: n } = E(), o > u && (u -= 1, { lineCount: o, removals: t } = L())), t > 0 && (d = true, s.splice(0, t)), n > 0 && (c = true, s.splice(s.length - n, n));\n }\n const x = [];\n d && x.push(M);\n for (const t of s)\n for (const n of t)\n x.push(n);\n return c && x.push(M), x;\n};\n\nfunction P(t) {\n return t.label ?? String(t.value ?? \"\");\n}\nfunction E(t, c) {\n if (!t)\n return true;\n const n = (c.label ?? String(c.value ?? \"\")).toLowerCase(), i = (c.hint ?? \"\").toLowerCase(), r = String(c.value).toLowerCase(), o = t.toLowerCase();\n return n.includes(o) || i.includes(o) || r.includes(o);\n}\nfunction N(t, c) {\n const n = [];\n for (const i of c)\n t.includes(i.value) && n.push(i);\n return n;\n}\nconst autocomplete = (t) => new AutocompletePrompt({\n options: t.options,\n initialValue: t.initialValue ? [t.initialValue] : void 0,\n initialUserInput: t.initialUserInput,\n placeholder: t.placeholder,\n completeOnTab: t.completeOnTab,\n filter: t.filter ?? ((n, i) => E(n, i)),\n signal: t.signal,\n input: t.input,\n output: t.output,\n validate: t.validate,\n render() {\n const n = t.withGuide ?? settings.withGuide, i = n ? [`${styleText(\"gray\", S_BAR)}`, `${symbol(this.state)} ${t.message}`] : [`${symbol(this.state)} ${t.message}`], r = this.userInput, o = this.options, m = t.placeholder, p = r === \"\" && m !== void 0, $ = (l, s) => {\n const a = P(l), u = l.hint && l.value === this.focusedValue ? styleText(\"dim\", ` (${l.hint})`) : \"\";\n switch (s) {\n case \"active\":\n return `${styleText(\"green\", S_RADIO_ACTIVE)} ${a}${u}`;\n case \"inactive\":\n return `${styleText(\"dim\", S_RADIO_INACTIVE)} ${styleText(\"dim\", a)}`;\n case \"disabled\":\n return `${styleText(\"gray\", S_RADIO_INACTIVE)} ${styleText([\"strikethrough\", \"gray\"], a)}`;\n }\n };\n switch (this.state) {\n case \"submit\": {\n const l = N(this.selectedValues, o), s = l.length > 0 ? ` ${styleText(\"dim\", l.map(P).join(\", \"))}` : \"\", a = n ? styleText(\"gray\", S_BAR) : \"\";\n return `${i.join(`\n`)}\n${a}${s}`;\n }\n case \"cancel\": {\n const l = r ? ` ${styleText([\"strikethrough\", \"dim\"], r)}` : \"\", s = n ? styleText(\"gray\", S_BAR) : \"\";\n return `${i.join(`\n`)}\n${s}${l}`;\n }\n default: {\n const l = this.state === \"error\" ? \"yellow\" : \"cyan\", s = n ? `${styleText(l, S_BAR)} ` : \"\", a = n ? styleText(l, S_BAR_END) : \"\";\n let u = \"\";\n if (this.isNavigating || p) {\n const d = p ? m : r;\n u = d !== \"\" ? ` ${styleText(\"dim\", d)}` : \"\";\n } else\n u = ` ${this.userInputWithCursor}`;\n const V = this.filteredOptions.length !== o.length ? styleText(\n \"dim\",\n ` (${this.filteredOptions.length} match${this.filteredOptions.length === 1 ? \"\" : \"es\"})`\n ) : \"\", b = this.filteredOptions.length === 0 && r ? [`${s}${styleText(\"yellow\", \"No matches found\")}`] : [], y = this.state === \"error\" ? [`${s}${styleText(\"yellow\", this.error)}`] : [];\n n && i.push(`${s.trimEnd()}`), i.push(\n `${s}${styleText(\"dim\", \"Search:\")}${u}${V}`,\n ...b,\n ...y\n );\n const T = [\n `${styleText(\"dim\", \"\\u2191/\\u2193\")} to select`,\n ...t.completeOnTab ? [`${styleText(\"dim\", \"Tab:\")} complete`] : [],\n `${styleText(\"dim\", \"Enter:\")} confirm`,\n `${styleText(\"dim\", \"Type:\")} to search`\n ], g = [`${s}${T.join(\" \\u2022 \")}`, a], O = this.filteredOptions.length === 0 ? [] : limitOptions({\n cursor: this.cursor,\n options: this.filteredOptions,\n columnPadding: n ? 3 : 0,\n // for `| ` when guide is shown\n rowPadding: i.length + g.length,\n style: (d, f) => $(\n d,\n d.disabled ? \"disabled\" : f ? \"active\" : \"inactive\"\n ),\n maxItems: t.maxItems,\n output: t.output\n });\n return [\n ...i,\n ...O.map((d) => `${s}${d}`),\n ...g\n ].join(`\n`);\n }\n }\n }\n}).prompt(), autocompleteMultiselect = (t) => {\n const c = (i, r, o, m) => {\n const p = o.includes(i.value), $ = i.label ?? String(i.value ?? \"\"), l = i.hint && m !== void 0 && i.value === m ? styleText(\"dim\", ` (${i.hint})`) : \"\", s = p ? styleText(\"green\", S_CHECKBOX_SELECTED) : styleText(\"dim\", S_CHECKBOX_INACTIVE);\n return i.disabled ? `${styleText(\"gray\", S_CHECKBOX_INACTIVE)} ${styleText([\"strikethrough\", \"gray\"], $)}` : r ? `${s} ${$}${l}` : `${s} ${styleText(\"dim\", $)}`;\n }, n = new AutocompletePrompt({\n options: t.options,\n multiple: true,\n placeholder: t.placeholder,\n filter: t.filter ?? ((i, r) => E(i, r)),\n validate: () => {\n if (t.required && n.selectedValues.length === 0)\n return \"Please select at least one item\";\n },\n initialValue: t.initialValues,\n signal: t.signal,\n input: t.input,\n output: t.output,\n render() {\n const i = t.withGuide ?? settings.withGuide, r = `${i ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} ${t.message}\n`, o = this.userInput, m = t.placeholder, p = o === \"\" && m !== void 0, $ = this.isNavigating || p ? styleText(\"dim\", p ? m : o) : this.userInputWithCursor, l = this.options, s = this.filteredOptions.length !== l.length ? styleText(\n \"dim\",\n ` (${this.filteredOptions.length} match${this.filteredOptions.length === 1 ? \"\" : \"es\"})`\n ) : \"\";\n switch (this.state) {\n case \"submit\":\n return `${r}${i ? `${styleText(\"gray\", S_BAR)} ` : \"\"}${styleText(\n \"dim\",\n `${this.selectedValues.length} items selected`\n )}`;\n case \"cancel\":\n return `${r}${i ? `${styleText(\"gray\", S_BAR)} ` : \"\"}${styleText(\n [\"strikethrough\", \"dim\"],\n o\n )}`;\n default: {\n const a = this.state === \"error\" ? \"yellow\" : \"cyan\", u = i ? `${styleText(a, S_BAR)} ` : \"\", V = i ? styleText(a, S_BAR_END) : \"\", b = [\n `${styleText(\"dim\", \"\\u2191/\\u2193\")} to navigate`,\n `${styleText(\"dim\", this.isNavigating ? \"Space/Tab:\" : \"Tab:\")} select`,\n `${styleText(\"dim\", \"Enter:\")} confirm`,\n `${styleText(\"dim\", \"Type:\")} to search`\n ], y = this.filteredOptions.length === 0 && o ? [`${u}${styleText(\"yellow\", \"No matches found\")}`] : [], T = this.state === \"error\" ? [`${u}${styleText(\"yellow\", this.error)}`] : [], g = [\n ...`${r}${i ? styleText(a, S_BAR) : \"\"}`.split(`\n`),\n `${u}${styleText(\"dim\", \"Search:\")} ${$}${s}`,\n ...y,\n ...T\n ], O = [`${u}${b.join(\" \\u2022 \")}`, V], d = limitOptions({\n cursor: this.cursor,\n options: this.filteredOptions,\n style: (f, _) => c(f, _, this.selectedValues, this.focusedValue),\n maxItems: t.maxItems,\n output: t.output,\n rowPadding: g.length + O.length\n });\n return [\n ...g,\n ...d.map((f) => `${u}${f}`),\n ...O\n ].join(`\n`);\n }\n }\n }\n });\n return n.prompt();\n};\n\nconst K = [\n S_CORNER_TOP_LEFT,\n S_CORNER_TOP_RIGHT,\n S_CORNER_BOTTOM_LEFT,\n S_CORNER_BOTTOM_RIGHT\n], Q = [S_BAR_START, S_BAR_START_RIGHT, S_BAR_END, S_BAR_END_RIGHT];\nfunction A$1(n, e, t, o) {\n let i = t, f = t;\n return o === \"center\" ? i = Math.floor((e - n) / 2) : o === \"right\" && (i = e - n - t), f = e - i - n, [i, f];\n}\nconst U = (n) => n;\nconst box = (n = \"\", e = \"\", t) => {\n const o = t?.output ?? process.stdout, i = getColumns(o), R = 1 * 2, u = t?.titlePadding ?? 1, h = t?.contentPadding ?? 2, w = t?.width === void 0 || t.width === \"auto\" ? 1 : Math.min(1, t.width), m = t?.withGuide ?? settings.withGuide ? `${styleText(\"gray\", S_BAR)} ` : \"\", b = t?.formatBorder ?? U, a = (t?.rounded ? K : Q).map(b), _ = b(S_BAR_H), p = b(S_BAR), x = l(m), B = l(e), y = i - x;\n let r = Math.floor(i * w) - x;\n if (t?.width === \"auto\") {\n const c = n.split(`\n`);\n let s = B + u * 2;\n for (const G of c) {\n const P = l(G) + h * 2;\n P > s && (s = P);\n }\n const g = s + R;\n g < r && (r = g);\n }\n r % 2 !== 0 && (r < y ? r++ : r--);\n const d = r - R, T = d - u * 2, S = B > T ? `${e.slice(0, T - 3)}...` : e, [O, W] = A$1(\n l(S),\n d,\n u,\n t?.titleAlign\n ), L = wrapAnsi(n, d - h * 2, {\n hard: true,\n trim: false\n });\n o.write(\n `${m}${a[0]}${_.repeat(O)}${S}${_.repeat(W)}${a[1]}\n`\n );\n const E = L.split(`\n`);\n for (const c of E) {\n const [s, g] = A$1(\n l(c),\n d,\n h,\n t?.contentAlign\n );\n o.write(\n `${m}${p}${\" \".repeat(s)}${c}${\" \".repeat(g)}${p}\n`\n );\n }\n o.write(`${m}${a[2]}${_.repeat(d)}${a[3]}\n`);\n};\n\nconst confirm = (i) => {\n const a = i.active ?? \"Yes\", s = i.inactive ?? \"No\";\n return new ConfirmPrompt({\n active: a,\n inactive: s,\n signal: i.signal,\n input: i.input,\n output: i.output,\n initialValue: i.initialValue ?? true,\n render() {\n const e = i.withGuide ?? settings.withGuide, u = `${symbol(this.state)} `, l = e ? `${styleText(\"gray\", S_BAR)} ` : \"\", f = wrapTextWithPrefix(\n i.output,\n i.message,\n l,\n u\n ), o = `${e ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${f}\n`, c = this.value ? a : s;\n switch (this.state) {\n case \"submit\": {\n const r = e ? `${styleText(\"gray\", S_BAR)} ` : \"\";\n return `${o}${r}${styleText(\"dim\", c)}`;\n }\n case \"cancel\": {\n const r = e ? `${styleText(\"gray\", S_BAR)} ` : \"\";\n return `${o}${r}${styleText([\"strikethrough\", \"dim\"], c)}${e ? `\n${styleText(\"gray\", S_BAR)}` : \"\"}`;\n }\n default: {\n const r = e ? `${styleText(\"cyan\", S_BAR)} ` : \"\", g = e ? styleText(\"cyan\", S_BAR_END) : \"\";\n return `${o}${r}${this.value ? `${styleText(\"green\", S_RADIO_ACTIVE)} ${a}` : `${styleText(\"dim\", S_RADIO_INACTIVE)} ${styleText(\"dim\", a)}`}${i.vertical ? e ? `\n${styleText(\"cyan\", S_BAR)} ` : `\n` : ` ${styleText(\"dim\", \"/\")} `}${this.value ? `${styleText(\"dim\", S_RADIO_INACTIVE)} ${styleText(\"dim\", s)}` : `${styleText(\"green\", S_RADIO_ACTIVE)} ${s}`}\n${g}\n`;\n }\n }\n }\n }).prompt();\n};\n\nconst date = (e) => {\n const r = e.validate;\n return new DatePrompt({\n ...e,\n validate(t) {\n if (t === void 0)\n return e.defaultValue !== void 0 ? void 0 : r ? runValidation(r, t) : settings.date.messages.required;\n const o = (i) => i.toISOString().slice(0, 10);\n if (e.minDate && o(t) < o(e.minDate))\n return settings.date.messages.afterMin(e.minDate);\n if (e.maxDate && o(t) > o(e.maxDate))\n return settings.date.messages.beforeMax(e.maxDate);\n if (r) return runValidation(r, t);\n },\n render() {\n const t = (e?.withGuide ?? settings.withGuide) !== false, i = `${`${t ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} `}${e.message}\n`, l = this.state !== \"initial\" ? this.state : \"active\", d = b(this, l), c = this.value instanceof Date ? this.formattedValue : \"\";\n switch (this.state) {\n case \"error\": {\n const a = this.error ? ` ${styleText(\"yellow\", this.error)}` : \"\", s = t ? `${styleText(\"yellow\", S_BAR)} ` : \"\", f = t ? styleText(\"yellow\", S_BAR_END) : \"\";\n return `${i.trim()}\n${s}${d}\n${f}${a}\n`;\n }\n case \"submit\": {\n const a = c ? ` ${styleText(\"dim\", c)}` : \"\", s = t ? styleText(\"gray\", S_BAR) : \"\";\n return `${i}${s}${a}`;\n }\n case \"cancel\": {\n const a = c ? ` ${styleText([\"strikethrough\", \"dim\"], c)}` : \"\", s = t ? styleText(\"gray\", S_BAR) : \"\";\n return `${i}${s}${a}${c.trim() ? `\n${s}` : \"\"}`;\n }\n default: {\n const a = t ? `${styleText(\"cyan\", S_BAR)} ` : \"\", s = t ? styleText(\"cyan\", S_BAR_END) : \"\", f = t ? `${styleText(\"cyan\", S_BAR)} ` : \"\", g = this.inlineError ? `\n${f}${styleText(\"yellow\", this.inlineError)}` : \"\";\n return `${i}${a}${d}${g}\n${s}\n`;\n }\n }\n }\n }).prompt();\n};\nfunction b(e, r) {\n const t = e.segmentValues, o = e.segmentCursor;\n if (r === \"submit\" || r === \"cancel\")\n return e.formattedValue;\n const i = styleText(\"gray\", e.separator);\n return e.segments.map((l, d) => {\n const c = d === o.segmentIndex && ![\"submit\", \"cancel\"].includes(r), a = p[l.type];\n return x(t[l.type], { isActive: c, label: a });\n }).join(i);\n}\nfunction x(e, r) {\n const t = !e || e.replace(/_/g, \"\") === \"\";\n return r.isActive ? styleText(\"inverse\", t ? r.label : e.replace(/_/g, \" \")) : t ? styleText(\"dim\", r.label) : e.replace(/_/g, styleText(\"dim\", \" \"));\n}\nconst p = {\n year: \"yyyy\",\n month: \"mm\",\n day: \"dd\"\n};\n\nconst group = async (o, r) => {\n const t = {}, p = Object.keys(o);\n for (const e of p) {\n const i = o[e], n = await i({ results: t })?.catch((a) => {\n throw a;\n });\n if (typeof r?.onCancel == \"function\" && isCancel(n)) {\n t[e] = \"canceled\", r.onCancel({ results: t });\n continue;\n }\n t[e] = n;\n }\n return t;\n};\n\nconst MULTISELECT_INSTRUCTIONS = [\n `${styleText(\"dim\", \"\\u2191/\\u2193\")} to navigate`,\n `${styleText(\"dim\", \"Space:\")} select`,\n `${styleText(\"dim\", \"Enter:\")} confirm`\n];\nconst m = (i, u) => i.split(`\n`).map((d) => u(d)).join(`\n`);\nconst multiselect = (i) => {\n const u = (t, a) => {\n const r = t.label ?? String(t.value);\n return a === \"disabled\" ? `${styleText(\"gray\", S_CHECKBOX_INACTIVE)} ${m(r, (o) => styleText([\"strikethrough\", \"gray\"], o))}${t.hint ? ` ${styleText(\"dim\", `(${t.hint ?? \"disabled\"})`)}` : \"\"}` : a === \"active\" ? `${styleText(\"cyan\", S_CHECKBOX_ACTIVE)} ${r}${t.hint ? ` ${styleText(\"dim\", `(${t.hint})`)}` : \"\"}` : a === \"selected\" ? `${styleText(\"green\", S_CHECKBOX_SELECTED)} ${m(r, (o) => styleText(\"dim\", o))}${t.hint ? ` ${styleText(\"dim\", `(${t.hint})`)}` : \"\"}` : a === \"cancelled\" ? `${m(r, (o) => styleText([\"strikethrough\", \"dim\"], o))}` : a === \"active-selected\" ? `${styleText(\"green\", S_CHECKBOX_SELECTED)} ${r}${t.hint ? ` ${styleText(\"dim\", `(${t.hint})`)}` : \"\"}` : a === \"submitted\" ? `${m(r, (o) => styleText(\"dim\", o))}` : `${styleText(\"dim\", S_CHECKBOX_INACTIVE)} ${m(r, (o) => styleText(\"dim\", o))}`;\n }, d = i.required ?? true, v = i.showInstructions ?? true;\n return new MultiSelectPrompt({\n options: i.options,\n signal: i.signal,\n input: i.input,\n output: i.output,\n initialValues: i.initialValues,\n required: d,\n cursorAt: i.cursorAt,\n validate(t) {\n if (d && (t === void 0 || t.length === 0))\n return `Please select at least one option.\n${styleText(\n \"reset\",\n styleText(\n \"dim\",\n `Press ${styleText([\"gray\", \"bgWhite\", \"inverse\"], \" space \")} to select, ${styleText(\n \"gray\",\n styleText(\"bgWhite\", styleText(\"inverse\", \" enter \"))\n )} to submit`\n )\n )}`;\n },\n render() {\n const t = i.withGuide ?? settings.withGuide, a = wrapTextWithPrefix(\n i.output,\n i.message,\n t ? `${symbolBar(this.state)} ` : \"\",\n `${symbol(this.state)} `\n ), r = `${t ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${a}\n`, o = this.value ?? [], p = (n, l) => {\n if (n.disabled)\n return u(n, \"disabled\");\n const s = o.includes(n.value);\n return l && s ? u(n, \"active-selected\") : s ? u(n, \"selected\") : u(n, l ? \"active\" : \"inactive\");\n };\n switch (this.state) {\n case \"submit\": {\n const n = this.options.filter(({ value: s }) => o.includes(s)).map((s) => u(s, \"submitted\")).join(styleText(\"dim\", \", \")) || styleText(\"dim\", \"none\"), l = wrapTextWithPrefix(\n i.output,\n n,\n t ? `${styleText(\"gray\", S_BAR)} ` : \"\"\n );\n return `${r}${l}`;\n }\n case \"cancel\": {\n const n = this.options.filter(({ value: s }) => o.includes(s)).map((s) => u(s, \"cancelled\")).join(styleText(\"dim\", \", \"));\n if (n.trim() === \"\")\n return `${r}${styleText(\"gray\", S_BAR)}`;\n const l = wrapTextWithPrefix(\n i.output,\n n,\n t ? `${styleText(\"gray\", S_BAR)} ` : \"\"\n );\n return `${r}${l}${t ? `\n${styleText(\"gray\", S_BAR)}` : \"\"}`;\n }\n case \"error\": {\n const n = t ? `${styleText(\"yellow\", S_BAR)} ` : \"\", l = this.error.split(`\n`).map(\n ($, C) => C === 0 ? `${t ? `${styleText(\"yellow\", S_BAR_END)} ` : \"\"}${styleText(\"yellow\", $)}` : ` ${$}`\n ).join(`\n`), s = r.split(`\n`).length, h = l.split(`\n`).length + 1;\n return `${r}${n}${limitOptions({\n output: i.output,\n options: this.options,\n cursor: this.cursor,\n maxItems: i.maxItems,\n columnPadding: n.length,\n rowPadding: s + h,\n style: p\n }).join(`\n${n}`)}\n${l}\n`;\n }\n default: {\n const n = t ? `${styleText(\"cyan\", S_BAR)} ` : \"\", l = r.split(`\n`).length, s = v ? formatInstructionFooter(MULTISELECT_INSTRUCTIONS, t) : t ? [styleText(\"cyan\", S_BAR_END)] : [], h = s.join(`\n`), $ = s.length + 1;\n return `${r}${n}${limitOptions({\n output: i.output,\n options: this.options,\n cursor: this.cursor,\n maxItems: i.maxItems,\n columnPadding: n.length,\n rowPadding: l + $,\n style: p\n }).join(`\n${n}`)}\n${h}\n`;\n }\n }\n }\n }).prompt();\n};\n\nconst groupMultiselect = (o) => {\n const { selectableGroups: h = true, groupSpacing: x = 0 } = o, m = (n, l, g = []) => {\n const a = n.label ?? String(n.value), t = typeof n.group == \"string\", s = t && (g[g.indexOf(n) + 1] ?? { group: true }), u = t && s && s.group === true;\n let r = \"\", c = \"\";\n t && (h ? (r = u ? `${S_BAR_END} ` : `${S_BAR} `, c = u ? \" \" : `${S_BAR} `) : r = \" \");\n let i = \"\";\n if (x > 0 && !t && (i = `\n`.repeat(x)), l === \"active\")\n return wrapTextWithPrefix(\n o.output,\n `${a}${n.hint ? ` ${styleText(\"dim\", `(${n.hint})`)}` : \"\"}`,\n `${i}${styleText(\"dim\", r)} `,\n `${i}${styleText(\"dim\", r)}${styleText(\"cyan\", S_CHECKBOX_ACTIVE)} `,\n `${i}${styleText(\"dim\", c)} `\n );\n if (l === \"group-active\")\n return wrapTextWithPrefix(\n o.output,\n a,\n `${i}${r} `,\n `${i}${r}${styleText(\"cyan\", S_CHECKBOX_ACTIVE)} `,\n `${i}${c} `,\n (d) => styleText(\"dim\", d)\n );\n if (l === \"group-active-selected\")\n return wrapTextWithPrefix(\n o.output,\n a,\n `${i}${r} `,\n `${i}${r}${styleText(\"green\", S_CHECKBOX_SELECTED)} `,\n `${i}${c} `,\n (d) => styleText(\"dim\", d)\n );\n if (l === \"selected\") {\n const d = t || h ? styleText(\"green\", S_CHECKBOX_SELECTED) : \"\";\n return wrapTextWithPrefix(\n o.output,\n `${a}${n.hint ? ` (${n.hint})` : \"\"}`,\n `${i}${styleText(\"dim\", r)} `,\n `${i}${styleText(\"dim\", r)}${d} `,\n `${i}${styleText(\"dim\", c)} `,\n (S) => styleText(\"dim\", S)\n );\n }\n if (l === \"cancelled\")\n return `${styleText([\"strikethrough\", \"dim\"], a)}`;\n if (l === \"active-selected\")\n return wrapTextWithPrefix(\n o.output,\n `${a}${n.hint ? ` ${styleText(\"dim\", `(${n.hint})`)}` : \"\"}`,\n `${i}${styleText(\"dim\", r)} `,\n `${i}${styleText(\"dim\", r)}${styleText(\"green\", S_CHECKBOX_SELECTED)} `,\n `${i}${styleText(\"dim\", c)} `\n );\n if (l === \"submitted\")\n return `${styleText(\"dim\", a)}`;\n const f = t || h ? styleText(\"dim\", S_CHECKBOX_INACTIVE) : \"\";\n return wrapTextWithPrefix(\n o.output,\n a,\n `${i}${styleText(\"dim\", r)} `,\n `${i}${styleText(\"dim\", r)}${f} `,\n `${i}${styleText(\"dim\", c)} `,\n (d) => styleText(\"dim\", d)\n );\n }, y = o.required ?? true, I = o.showInstructions ?? true;\n return new GroupMultiSelectPrompt({\n options: o.options,\n signal: o.signal,\n input: o.input,\n output: o.output,\n initialValues: o.initialValues,\n required: y,\n cursorAt: o.cursorAt,\n selectableGroups: h,\n validate(n) {\n if (y && (n === void 0 || n.length === 0))\n return `Please select at least one option.\n${styleText(\n \"reset\",\n styleText(\n \"dim\",\n `Press ${styleText([\"gray\", \"bgWhite\", \"inverse\"], \" space \")} to select, ${styleText(\n \"gray\",\n styleText([\"bgWhite\", \"inverse\"], \" enter \")\n )} to submit`\n )\n )}`;\n },\n render() {\n const n = o.withGuide ?? settings.withGuide, l = `${n ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} ${o.message}\n`, g = this.value ?? [], a = (t, s) => {\n const u = this.options, r = g.includes(t.value) || t.group === true && this.isGroupSelected(`${t.value}`);\n return !s && typeof t.group == \"string\" && this.options[this.cursor]?.value === t.group ? m(t, r ? \"group-active-selected\" : \"group-active\", u) : s && r ? m(t, \"active-selected\", u) : r ? m(t, \"selected\", u) : m(t, s ? \"active\" : \"inactive\", u);\n };\n switch (this.state) {\n case \"submit\": {\n const t = this.options.filter(({ value: u }) => g.includes(u)).map((u) => m(u, \"submitted\")), s = t.length === 0 ? \"\" : ` ${t.join(styleText(\"dim\", \", \"))}`;\n return `${l}${n ? styleText(\"gray\", S_BAR) : \"\"}${s}`;\n }\n case \"cancel\": {\n const t = this.options.filter(({ value: s }) => g.includes(s)).map((s) => m(s, \"cancelled\")).join(styleText(\"dim\", \", \"));\n return `${l}${n ? `${styleText(\"gray\", S_BAR)} ` : \"\"}${t.trim() ? `${t}${n ? `\n${styleText(\"gray\", S_BAR)}` : \"\"}` : \"\"}`;\n }\n case \"error\": {\n const t = n ? `${styleText(\"yellow\", S_BAR)} ` : \"\", s = this.error.split(`\n`).map(\n (i, f) => f === 0 ? `${n ? `${styleText(\"yellow\", S_BAR_END)} ` : \"\"}${styleText(\"yellow\", i)}` : ` ${i}`\n ).join(`\n`), u = l.split(`\n`).length, r = s.split(`\n`).length + 1, c = limitOptions({\n output: o.output,\n options: this.options,\n cursor: this.cursor,\n maxItems: o.maxItems,\n columnPadding: t.length,\n rowPadding: u + r,\n style: a\n }).join(`\n${t}`);\n return `${l}${t}${c}\n${s}\n`;\n }\n default: {\n const t = n ? `${styleText(\"cyan\", S_BAR)} ` : \"\", s = l.split(`\n`).length, u = I ? formatInstructionFooter(MULTISELECT_INSTRUCTIONS, n) : n ? [styleText(\"cyan\", S_BAR_END)] : [], r = u.join(`\n`), c = u.length + 1, i = limitOptions({\n output: o.output,\n options: this.options,\n cursor: this.cursor,\n maxItems: o.maxItems,\n columnPadding: t.length,\n rowPadding: s + c,\n style: a\n }).join(`\n${t}`);\n return `${l}${t}${i}\n${r}\n`;\n }\n }\n }\n }).prompt();\n};\n\nconst log = {\n message: (s = [], {\n symbol: e = styleText(\"gray\", S_BAR),\n secondarySymbol: r = styleText(\"gray\", S_BAR),\n output: m = process.stdout,\n spacing: l = 1,\n withGuide: c\n } = {}) => {\n const t = [], o = c ?? settings.withGuide, f = o ? r : \"\", O = o ? `${e} ` : \"\", u = o ? `${r} ` : \"\";\n for (let i = 0; i < l; i++)\n t.push(f);\n const g = Array.isArray(s) ? s : s.split(`\n`);\n if (g.length > 0) {\n const [i, ...y] = g;\n i.length > 0 ? t.push(`${O}${i}`) : t.push(o ? e : \"\");\n for (const p of y)\n p.length > 0 ? t.push(`${u}${p}`) : t.push(o ? r : \"\");\n }\n m.write(`${t.join(`\n`)}\n`);\n },\n info: (s, e) => {\n log.message(s, { ...e, symbol: styleText(\"blue\", S_INFO) });\n },\n success: (s, e) => {\n log.message(s, { ...e, symbol: styleText(\"green\", S_SUCCESS) });\n },\n step: (s, e) => {\n log.message(s, { ...e, symbol: styleText(\"green\", S_STEP_SUBMIT) });\n },\n warn: (s, e) => {\n log.message(s, { ...e, symbol: styleText(\"yellow\", S_WARN) });\n },\n /** alias for `log.warn()`. */\n warning: (s, e) => {\n log.warn(s, e);\n },\n error: (s, e) => {\n log.message(s, { ...e, symbol: styleText(\"red\", S_ERROR) });\n }\n};\n\nconst cancel = (o = \"\", t) => {\n const i = t?.output ?? process.stdout, e = t?.withGuide ?? settings.withGuide ? `${styleText(\"gray\", S_BAR_END)} ` : \"\";\n i.write(`${e}${styleText(\"red\", o)}\n\n`);\n}, intro = (o = \"\", t) => {\n const i = t?.output ?? process.stdout, e = t?.withGuide ?? settings.withGuide ? `${styleText(\"gray\", S_BAR_START)} ` : \"\";\n i.write(`${e}${o}\n`);\n}, outro = (o = \"\", t) => {\n const i = t?.output ?? process.stdout, e = t?.withGuide ?? settings.withGuide ? `${styleText(\"gray\", S_BAR)}\n${styleText(\"gray\", S_BAR_END)} ` : \"\";\n i.write(`${e}${o}\n\n`);\n};\n\nconst multiline = (e) => new MultiLinePrompt({\n validate: e.validate,\n placeholder: e.placeholder,\n defaultValue: e.defaultValue,\n initialValue: e.initialValue,\n showSubmit: e.showSubmit,\n output: e.output,\n signal: e.signal,\n input: e.input,\n render() {\n const i = e?.withGuide ?? settings.withGuide, o = `${`${i ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} `}${e.message}\n`, m = e.placeholder && e.placeholder.length > 0 ? (\n // biome-ignore lint/style/noNonNullAssertion: guarded by placeholder.length > 0\n styleText(\"inverse\", e.placeholder[0]) + styleText(\"dim\", e.placeholder.slice(1))\n ) : styleText([\"inverse\", \"hidden\"], \"_\"), a = this.userInput ? this.userInputWithCursor : m, l = this.value ?? \"\", c = e.showSubmit ? `\n ${styleText(this.focused === \"submit\" ? \"cyan\" : \"dim\", \"[ submit ]\")}` : \"\";\n switch (this.state) {\n case \"error\": {\n const n = `${styleText(\"yellow\", S_BAR)} `, r = i ? wrapTextWithPrefix(e.output, a, n, void 0) : a, u = styleText(\"yellow\", S_BAR_END);\n return `${o}${r}\n${u} ${styleText(\"yellow\", this.error)}${c}\n`;\n }\n case \"submit\": {\n const n = `${styleText(\"gray\", S_BAR)} `, r = i ? wrapTextWithPrefix(\n e.output,\n l,\n n,\n void 0,\n void 0,\n (u) => styleText(\"dim\", u)\n ) : l ? styleText(\"dim\", l) : \"\";\n return `${o}${r}`;\n }\n case \"cancel\": {\n const n = `${styleText(\"gray\", S_BAR)} `, r = i ? wrapTextWithPrefix(\n e.output,\n l,\n n,\n void 0,\n void 0,\n (u) => styleText([\"strikethrough\", \"dim\"], u)\n ) : l ? styleText([\"strikethrough\", \"dim\"], l) : \"\";\n return `${o}${r}`;\n }\n default: {\n const n = i ? `${styleText(\"cyan\", S_BAR)} ` : \"\", r = i ? styleText(\"cyan\", S_BAR_END) : \"\", u = i ? wrapTextWithPrefix(e.output, a, n) : a;\n return `${o}${u}\n${r}${c}\n`;\n }\n }\n }\n}).prompt();\n\nconst W$1 = (o) => o, C = (o, e, s) => {\n const a = {\n hard: true,\n trim: false\n }, i = wrapAnsi(o, e, a).split(`\n`), c = i.reduce((n, t) => Math.max(l(t), n), 0), u = i.map(s).reduce((n, t) => Math.max(l(t), n), 0), g = e - (u - c);\n return wrapAnsi(o, g, a);\n};\nconst note = (o = \"\", e = \"\", s) => {\n const a = s?.output ?? process$1.stdout, i = s?.withGuide ?? settings.withGuide, c = s?.format ?? W$1, g = [\"\", ...C(o, getColumns(a) - 6, c).split(`\n`).map(c), \"\"], n = l(e), t = Math.max(\n g.reduce((m, F) => {\n const O = l(F);\n return O > m ? O : m;\n }, 0),\n n\n ) + 2, h = g.map(\n (m) => `${styleText(\"gray\", S_BAR)} ${m}${\" \".repeat(t - l(m))}${styleText(\"gray\", S_BAR)}`\n ).join(`\n`), T = i ? `${styleText(\"gray\", S_BAR)}\n` : \"\", l$1 = i ? S_CONNECT_LEFT : S_CORNER_BOTTOM_LEFT;\n a.write(\n `${T}${styleText(\"green\", S_STEP_SUBMIT)} ${styleText(\"reset\", e)} ${styleText(\n \"gray\",\n S_BAR_H.repeat(Math.max(t - n - 1, 1)) + S_CORNER_TOP_RIGHT\n )}\n${h}\n${styleText(\"gray\", l$1 + S_BAR_H.repeat(t + 2) + S_CORNER_BOTTOM_RIGHT)}\n`\n );\n};\n\nconst password = (r) => new PasswordPrompt({\n validate: r.validate,\n mask: r.mask ?? S_PASSWORD_MASK,\n signal: r.signal,\n input: r.input,\n output: r.output,\n render() {\n const e = r.withGuide ?? settings.withGuide, o = `${e ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} ${r.message}\n`, c = this.userInputWithCursor, i = this.masked;\n switch (this.state) {\n case \"error\": {\n const s = e ? `${styleText(\"yellow\", S_BAR)} ` : \"\", n = e ? `${styleText(\"yellow\", S_BAR_END)} ` : \"\", l = i ?? \"\";\n return r.clearOnError && this.clear(), `${o.trim()}\n${s}${l}\n${n}${styleText(\"yellow\", this.error)}\n`;\n }\n case \"submit\": {\n const s = e ? `${styleText(\"gray\", S_BAR)} ` : \"\", n = i ? styleText(\"dim\", i) : \"\";\n return `${o}${s}${n}`;\n }\n case \"cancel\": {\n const s = e ? `${styleText(\"gray\", S_BAR)} ` : \"\", n = i ? styleText([\"strikethrough\", \"dim\"], i) : \"\";\n return `${o}${s}${n}${i && e ? `\n${styleText(\"gray\", S_BAR)}` : \"\"}`;\n }\n default: {\n const s = e ? `${styleText(\"cyan\", S_BAR)} ` : \"\", n = e ? styleText(\"cyan\", S_BAR_END) : \"\";\n return `${o}${s}${c}\n${n}\n`;\n }\n }\n }\n}).prompt();\n\nconst path = (e) => {\n const a = e.validate;\n return autocomplete({\n ...e,\n initialUserInput: e.initialValue ?? e.root ?? process.cwd(),\n maxItems: 5,\n completeOnTab: true,\n validate(t) {\n if (!Array.isArray(t)) {\n if (!t)\n return \"Please select a path\";\n if (a)\n return runValidation(a, t);\n }\n },\n options() {\n const t = this.userInput;\n if (t === \"\")\n return [];\n try {\n let i;\n existsSync(t) ? lstatSync(t).isDirectory() && (!e.directory || t.endsWith(\"/\")) ? i = t : i = dirname(t) : i = dirname(t);\n const c = t.length > 1 && t.endsWith(\"/\") ? t.slice(0, -1) : t;\n return readdirSync(i).map((r) => {\n const n = join(i, r), m = lstatSync(n);\n return {\n name: r,\n path: n,\n isDirectory: m.isDirectory()\n };\n }).filter(\n ({ path: r, isDirectory: n }) => r.startsWith(c) && (n || !e.directory)\n ).map((r) => ({\n value: r.path\n }));\n } catch {\n return [];\n }\n }\n });\n};\n\nconst W = (l) => styleText(\"magenta\", l);\nconst spinner = ({\n indicator: l = \"dots\",\n onCancel: h,\n output: n = process.stdout,\n cancelMessage: G,\n errorMessage: O,\n frames: E = unicode ? [\"\\u25D2\", \"\\u25D0\", \"\\u25D3\", \"\\u25D1\"] : [\"\\u2022\", \"o\", \"O\", \"0\"],\n delay: F = unicode ? 80 : 120,\n signal: m,\n ...I\n} = {}) => {\n const u = isCI();\n let M, T, d = false, S = false, s = \"\", p, w = performance.now();\n const x = getColumns(n), k = I?.styleFrame ?? W, g = (e) => {\n const r = e > 1 ? O ?? settings.messages.error : G ?? settings.messages.cancel;\n S = e === 1, d && (a(r, e), S && typeof h == \"function\" && h());\n }, f = () => g(2), i = () => g(1), A = () => {\n process.on(\"uncaughtExceptionMonitor\", f), process.on(\"unhandledRejection\", f), process.on(\"SIGINT\", i), process.on(\"SIGTERM\", i), process.on(\"exit\", g), m && m.addEventListener(\"abort\", i);\n }, H = () => {\n process.removeListener(\"uncaughtExceptionMonitor\", f), process.removeListener(\"unhandledRejection\", f), process.removeListener(\"SIGINT\", i), process.removeListener(\"SIGTERM\", i), process.removeListener(\"exit\", g), m && m.removeEventListener(\"abort\", i);\n }, y = () => {\n if (p === void 0) return;\n u && n.write(`\n`);\n const r = wrapAnsi(p, x, {\n hard: true,\n trim: false\n }).split(`\n`);\n r.length > 1 && n.write(cursor.up(r.length - 1)), n.write(cursor.to(0)), n.write(erase.down());\n }, C = (e) => e.replace(/\\.+$/, \"\"), _ = (e) => {\n const r = (performance.now() - e) / 1e3, t = Math.floor(r / 60), o = Math.floor(r % 60);\n return t > 0 ? `[${t}m ${o}s]` : `[${o}s]`;\n }, N = I.withGuide ?? settings.withGuide, P = (e = \"\") => {\n d = true, M = block({ output: n }), s = C(e), w = performance.now(), N && n.write(`${styleText(\"gray\", S_BAR)}\n`);\n let r = 0, t = 0;\n A(), T = setInterval(() => {\n if (u && s === p)\n return;\n y(), p = s;\n const o = k(E[r]);\n let v;\n if (u)\n v = `${o} ${s}...`;\n else if (l === \"timer\")\n v = `${o} ${s} ${_(w)}`;\n else {\n const B = \".\".repeat(Math.floor(t)).slice(0, 3);\n v = `${o} ${s}${B}`;\n }\n const j = wrapAnsi(v, x, {\n hard: true,\n trim: false\n });\n n.write(j), r = r + 1 < E.length ? r + 1 : 0, t = t < 4 ? t + 0.125 : 0;\n }, F);\n }, a = (e = \"\", r = 0, t = false) => {\n if (!d) return;\n d = false, clearInterval(T), y();\n const o = r === 0 ? styleText(\"green\", S_STEP_SUBMIT) : r === 1 ? styleText(\"red\", S_STEP_CANCEL) : styleText(\"red\", S_STEP_ERROR);\n s = e ?? s, t || (l === \"timer\" ? n.write(`${o} ${s} ${_(w)}\n`) : n.write(`${o} ${s}\n`)), H(), M();\n };\n return {\n start: P,\n stop: (e = \"\") => a(e, 0),\n message: (e = \"\") => {\n s = C(e ?? s);\n },\n cancel: (e = \"\") => a(e, 1),\n error: (e = \"\") => a(e, 2),\n clear: () => a(\"\", 0, true),\n get isCancelled() {\n return S;\n }\n };\n};\n\nconst u = {\n light: unicodeOr(\"\\u2500\", \"-\"),\n heavy: unicodeOr(\"\\u2501\", \"=\"),\n block: unicodeOr(\"\\u2588\", \"#\")\n};\nfunction progress({\n style: o = \"heavy\",\n max: d = 100,\n size: v = 40,\n ...x\n} = {}) {\n const r = spinner(x);\n let a = 0, n = \"\";\n const c = Math.max(1, d), l = Math.max(1, v), S = (t) => {\n switch (t) {\n case \"initial\":\n case \"active\":\n return (e) => styleText(\"magenta\", e);\n case \"error\":\n case \"cancel\":\n return (e) => styleText(\"red\", e);\n case \"submit\":\n return (e) => styleText(\"green\", e);\n default:\n return (e) => styleText(\"magenta\", e);\n }\n }, p = (t, e) => {\n const m = Math.floor(a / c * l);\n return `${S(t)(u[o].repeat(m))}${styleText(\"dim\", u[o].repeat(l - m))} ${e}`;\n }, h = (t = \"\") => {\n n = t, r.start(p(\"initial\", t));\n }, g = (t = 1, e) => {\n a = Math.min(c, t + a), r.message(p(\"active\", e ?? n)), n = e ?? n;\n };\n return {\n start: h,\n stop: r.stop,\n cancel: r.cancel,\n error: r.error,\n clear: r.clear,\n advance: g,\n isCancelled: r.isCancelled,\n message: (t) => g(0, t)\n };\n}\n\nconst SELECT_INSTRUCTIONS = [\n `${styleText(\"dim\", \"\\u2191/\\u2193\")} to navigate`,\n `${styleText(\"dim\", \"Enter:\")} confirm`\n];\nconst c = (t, o) => t.includes(`\n`) ? t.split(`\n`).map((d) => o(d)).join(`\n`) : o(t);\nconst select = (t) => {\n const o = (n, m) => {\n if (n === void 0)\n return \"\";\n const s = n.label ?? String(n.value);\n switch (m) {\n case \"disabled\":\n return `${styleText(\"gray\", S_RADIO_INACTIVE)} ${c(s, (i) => styleText(\"gray\", i))}${n.hint ? ` ${styleText(\"dim\", `(${n.hint ?? \"disabled\"})`)}` : \"\"}`;\n case \"selected\":\n return `${c(s, (i) => styleText(\"dim\", i))}`;\n case \"active\":\n return `${styleText(\"green\", S_RADIO_ACTIVE)} ${s}${n.hint ? ` ${styleText(\"dim\", `(${n.hint})`)}` : \"\"}`;\n case \"cancelled\":\n return `${c(s, (i) => styleText([\"strikethrough\", \"dim\"], i))}`;\n default:\n return `${styleText(\"dim\", S_RADIO_INACTIVE)} ${c(s, (i) => styleText(\"dim\", i))}`;\n }\n }, d = t.showInstructions ?? true;\n return new SelectPrompt({\n options: t.options,\n signal: t.signal,\n input: t.input,\n output: t.output,\n initialValue: t.initialValue,\n render() {\n const n = t.withGuide ?? settings.withGuide, m = `${symbol(this.state)} `, s = `${symbolBar(this.state)} `, i = wrapTextWithPrefix(\n t.output,\n t.message,\n s,\n m\n ), u = `${n ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${i}\n`;\n switch (this.state) {\n case \"submit\": {\n const r = n ? `${styleText(\"gray\", S_BAR)} ` : \"\", a = wrapTextWithPrefix(\n t.output,\n o(this.options[this.cursor], \"selected\"),\n r\n );\n return `${u}${a}`;\n }\n case \"cancel\": {\n const r = n ? `${styleText(\"gray\", S_BAR)} ` : \"\", a = wrapTextWithPrefix(\n t.output,\n o(this.options[this.cursor], \"cancelled\"),\n r\n );\n return `${u}${a}${n ? `\n${styleText(\"gray\", S_BAR)}` : \"\"}`;\n }\n default: {\n const r = n ? `${styleText(\"cyan\", S_BAR)} ` : \"\", a = u.split(`\n`).length, p = d ? formatInstructionFooter(SELECT_INSTRUCTIONS, n) : n ? [styleText(\"cyan\", S_BAR_END)] : [], b = p.join(`\n`), f = p.length + 1;\n return `${u}${r}${limitOptions({\n output: t.output,\n cursor: this.cursor,\n options: this.options,\n maxItems: t.maxItems,\n columnPadding: r.length,\n rowPadding: a + f,\n style: (g, x) => o(g, g.disabled ? \"disabled\" : x ? \"active\" : \"inactive\")\n }).join(`\n${r}`)}\n${b}\n`;\n }\n }\n }\n }).prompt();\n};\n\nconst selectKey = (t) => {\n const l = (e, a = \"inactive\") => {\n if (e === void 0)\n return \"\";\n const n = e.label ?? String(e.value);\n return a === \"selected\" ? `${styleText(\"dim\", n)}` : a === \"cancelled\" ? `${styleText([\"strikethrough\", \"dim\"], n)}` : a === \"active\" ? `${styleText([\"bgCyan\", \"gray\"], ` ${e.value} `)} ${n}${e.hint ? ` ${styleText(\"dim\", `(${e.hint})`)}` : \"\"}` : `${styleText([\"gray\", \"bgWhite\", \"inverse\"], ` ${e.value} `)} ${n}${e.hint ? ` ${styleText(\"dim\", `(${e.hint})`)}` : \"\"}`;\n };\n return new SelectKeyPrompt({\n options: t.options,\n signal: t.signal,\n input: t.input,\n output: t.output,\n initialValue: t.initialValue,\n caseSensitive: t.caseSensitive,\n render() {\n const e = t.withGuide ?? settings.withGuide, a = `${e ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} ${t.message}\n`;\n switch (this.state) {\n case \"submit\": {\n const n = e ? `${styleText(\"gray\", S_BAR)} ` : \"\", s = this.options.find((u) => u.value === this.value) ?? t.options[0], c = wrapTextWithPrefix(\n t.output,\n l(s, \"selected\"),\n n\n );\n return `${a}${c}`;\n }\n case \"cancel\": {\n const n = e ? `${styleText(\"gray\", S_BAR)} ` : \"\", s = wrapTextWithPrefix(\n t.output,\n l(this.options[0], \"cancelled\"),\n n\n );\n return `${a}${s}${e ? `\n${styleText(\"gray\", S_BAR)}` : \"\"}`;\n }\n default: {\n const n = e ? `${styleText(\"cyan\", S_BAR)} ` : \"\", s = e ? styleText(\"cyan\", S_BAR_END) : \"\", c = this.options.map(\n (u, d) => wrapTextWithPrefix(\n t.output,\n l(u, d === this.cursor ? \"active\" : \"inactive\"),\n n\n )\n ).join(`\n`);\n return `${a}${c}\n${s}\n`;\n }\n }\n }\n }).prompt();\n};\n\nconst i = `${styleText(\"gray\", S_BAR)} `;\nconst stream = {\n message: async (e, { symbol: l = styleText(\"gray\", S_BAR) } = {}) => {\n process.stdout.write(`${styleText(\"gray\", S_BAR)}\n${l} `);\n let s = 3;\n for await (let r of e) {\n r = r.replace(/\\n/g, `\n${i}`), r.includes(`\n`) && (s = 3 + stripVTControlCharacters(r.slice(r.lastIndexOf(`\n`))).length);\n const o = stripVTControlCharacters(r).length;\n s + o < process.stdout.columns ? (s += o, process.stdout.write(r)) : (process.stdout.write(`\n${i}${r.trimStart()}`), s = 3 + stripVTControlCharacters(r.trimStart()).length);\n }\n process.stdout.write(`\n`);\n },\n info: (e) => stream.message(e, { symbol: styleText(\"blue\", S_INFO) }),\n success: (e) => stream.message(e, { symbol: styleText(\"green\", S_SUCCESS) }),\n step: (e) => stream.message(e, { symbol: styleText(\"green\", S_STEP_SUBMIT) }),\n warn: (e) => stream.message(e, { symbol: styleText(\"yellow\", S_WARN) }),\n /** alias for `log.warn()`. */\n warning: (e) => stream.warn(e),\n error: (e) => stream.message(e, { symbol: styleText(\"red\", S_ERROR) })\n};\n\nconst tasks = async (o, e) => {\n for (const t of o) {\n if (t.enabled === false) continue;\n const s = spinner(e);\n s.start(t.title);\n const n = await t.task(s.message);\n s.stop(n || t.title);\n }\n};\n\nconst A = (l) => l.replace(/\\x1b\\[(?:\\d+;)*\\d*[ABCDEFGHfJKSTsu]|\\x1b\\[(s|u)/g, \"\");\nconst taskLog = (l) => {\n const r = l.output ?? process.stdout, O = getColumns(r), i = styleText(\"gray\", S_BAR), p = l.spacing ?? 1, k = 3, m = l.retainLog === true, d = !isCI() && isTTY(r);\n r.write(`${i}\n`), r.write(`${styleText(\"green\", S_STEP_SUBMIT)} ${l.title}\n`);\n for (let e = 0; e < p; e++)\n r.write(`${i}\n`);\n const n = [\n {\n value: \"\",\n full: \"\"\n }\n ];\n let v = false;\n const f = (e) => {\n if (n.length === 0)\n return;\n let s = 0;\n e && (s += p + 2);\n for (const t of n) {\n const { value: o, result: a } = t;\n let g = a?.message ?? o;\n if (g.length === 0)\n continue;\n a === void 0 && t.header !== void 0 && t.header !== \"\" && (g += `\n${t.header}`);\n const E = g.split(`\n`).reduce((b, w) => w === \"\" ? b + 1 : b + Math.ceil((w.length + k) / O), 0);\n s += E;\n }\n s > 0 && (s += 1, r.write(erase.lines(s)));\n }, h = (e, s, t) => {\n const o = t ? `${e.full}\n${e.value}` : e.value;\n e.header !== void 0 && e.header !== \"\" && log.message(\n e.header.split(`\n`).map((a) => styleText(\"bold\", a)),\n {\n output: r,\n secondarySymbol: i,\n symbol: i,\n spacing: 0\n }\n ), log.message(\n o.split(`\n`).map((a) => styleText(\"dim\", a)),\n {\n output: r,\n secondarySymbol: i,\n symbol: i,\n spacing: s ?? p\n }\n );\n }, T = () => {\n for (const e of n) {\n const { header: s, value: t, full: o } = e;\n (s === void 0 || s.length === 0) && t.length === 0 || h(e, void 0, m === true && o.length > 0);\n }\n }, L = (e, s, t) => {\n if (f(false), (t?.raw !== true || !v) && e.value !== \"\" && (e.value += `\n`), e.value += A(s), v = t?.raw === true, l.limit !== void 0) {\n const o = e.value.split(`\n`), a = o.length - l.limit;\n if (a > 0) {\n const g = o.splice(0, a);\n m && (e.full += (e.full === \"\" ? \"\" : `\n`) + g.join(`\n`));\n }\n e.value = o.join(`\n`);\n }\n d && y();\n }, y = () => {\n for (const e of n)\n e.result ? e.result.status === \"error\" ? log.error(e.result.message, { output: r, secondarySymbol: i, spacing: 0 }) : log.success(e.result.message, { output: r, secondarySymbol: i, spacing: 0 }) : e.value !== \"\" && h(e, 0);\n }, B = (e, s) => {\n f(false), e.result = s, d && y();\n };\n return {\n message(e, s) {\n L(n[0], e, s);\n },\n group(e) {\n const s = {\n header: e,\n value: \"\",\n full: \"\"\n };\n return n.push(s), {\n message(t, o) {\n L(s, t, o);\n },\n error(t) {\n B(s, {\n status: \"error\",\n message: t\n });\n },\n success(t) {\n B(s, {\n status: \"success\",\n message: t\n });\n }\n };\n },\n error(e, s) {\n f(true), log.error(e, { output: r, secondarySymbol: i, spacing: 1 }), s?.showLog !== false && T(), n.splice(1, n.length - 1), n[0].value = \"\", n[0].full = \"\";\n },\n success(e, s) {\n f(true), log.success(e, { output: r, secondarySymbol: i, spacing: 1 }), s?.showLog === true && T(), n.splice(1, n.length - 1), n[0].value = \"\", n[0].full = \"\";\n }\n };\n};\n\nconst text = (t) => new TextPrompt({\n validate: t.validate,\n placeholder: t.placeholder,\n defaultValue: t.defaultValue,\n initialValue: t.initialValue,\n output: t.output,\n signal: t.signal,\n input: t.input,\n render() {\n const r = t?.withGuide ?? settings.withGuide, l = `${`${r ? `${styleText(\"gray\", S_BAR)}\n` : \"\"}${symbol(this.state)} `}${t.message}\n`, d = t.placeholder && t.placeholder.length > 0 ? (\n // biome-ignore lint/style/noNonNullAssertion: guarded by placeholder.length > 0\n styleText(\"inverse\", t.placeholder[0]) + styleText(\"dim\", t.placeholder.slice(1))\n ) : styleText([\"inverse\", \"hidden\"], \"_\"), o = this.userInput ? this.userInputWithCursor : d, s = this.value ?? \"\";\n switch (this.state) {\n case \"validating\": {\n const n = r ? `${styleText(\"cyan\", S_BAR)} ` : \"\", i = r ? styleText(\"cyan\", S_BAR_END) : \"\", c = styleText(\"dim\", o), $ = styleText(\"dim\", \"Validating...\");\n return `${l}${n}${c}\n${i} ${$}\n`;\n }\n case \"error\": {\n const n = this.error ? ` ${styleText(\"yellow\", this.error)}` : \"\", i = r ? `${styleText(\"yellow\", S_BAR)} ` : \"\", c = r ? styleText(\"yellow\", S_BAR_END) : \"\";\n return `${l.trim()}\n${i}${o}\n${c}${n}\n`;\n }\n case \"submit\": {\n const n = s ? `${r ? \" \" : \"\"}${styleText(\"dim\", s)}` : \"\", i = r ? styleText(\"gray\", S_BAR) : \"\";\n return `${l}${i}${n}`;\n }\n case \"cancel\": {\n const n = s ? ` ${styleText([\"strikethrough\", \"dim\"], s)}` : \"\", i = r ? styleText(\"gray\", S_BAR) : \"\";\n return `${l}${i}${n}${s.trim() ? `\n${i}` : \"\"}`;\n }\n default: {\n const n = r ? `${styleText(\"cyan\", S_BAR)} ` : \"\", i = r ? styleText(\"cyan\", S_BAR_END) : \"\";\n return `${l}${n}${o}\n${i}\n`;\n }\n }\n }\n}).prompt();\n\nexport { MULTISELECT_INSTRUCTIONS, SELECT_INSTRUCTIONS, S_BAR, S_BAR_END, S_BAR_END_RIGHT, S_BAR_H, S_BAR_START, S_BAR_START_RIGHT, S_CHECKBOX_ACTIVE, S_CHECKBOX_INACTIVE, S_CHECKBOX_SELECTED, S_CONNECT_LEFT, S_CORNER_BOTTOM_LEFT, S_CORNER_BOTTOM_RIGHT, S_CORNER_TOP_LEFT, S_CORNER_TOP_RIGHT, S_ERROR, S_INFO, S_PASSWORD_MASK, S_RADIO_ACTIVE, S_RADIO_INACTIVE, S_STEP_ACTIVE, S_STEP_CANCEL, S_STEP_ERROR, S_STEP_SUBMIT, S_SUCCESS, S_WARN, autocomplete, autocompleteMultiselect, box, cancel, confirm, date, formatInstructionFooter, group, groupMultiselect, intro, isCI, isTTY, limitOptions, log, multiline, multiselect, note, outro, password, path, progress, select, selectKey, spinner, stream, symbol, symbolBar, taskLog, tasks, text, unicode, unicodeOr };\n","/**\n * CommanderError class\n */\nexport class CommanderError extends Error {\n /**\n * Constructs the CommanderError class\n * @param {number} exitCode suggested exit code which could be used with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n */\n constructor(exitCode, code, message) {\n super(message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n this.code = code;\n this.exitCode = exitCode;\n this.nestedError = undefined;\n }\n}\n\n/**\n * InvalidArgumentError class\n */\nexport class InvalidArgumentError extends CommanderError {\n /**\n * Constructs the InvalidArgumentError class\n * @param {string} [message] explanation of why argument is invalid\n */\n constructor(message) {\n super(1, 'commander.invalidArgument', message);\n // properly capture stack trace in Node.js\n Error.captureStackTrace(this, this.constructor);\n this.name = this.constructor.name;\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Argument {\n /**\n * Initialize a new command argument with the given name and description.\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @param {string} name\n * @param {string} [description]\n */\n\n constructor(name, description) {\n this.description = description || '';\n this.variadic = false;\n this.parseArg = undefined;\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.argChoices = undefined;\n\n switch (name[0]) {\n case '<': // e.g. <required>\n this.required = true;\n this._name = name.slice(1, -1);\n break;\n case '[': // e.g. [optional]\n this.required = false;\n this._name = name.slice(1, -1);\n break;\n default:\n this.required = true;\n this._name = name;\n break;\n }\n\n if (this._name.endsWith('...')) {\n this.variadic = true;\n this._name = this._name.slice(0, -3);\n }\n }\n\n /**\n * Return argument name.\n *\n * @return {string}\n */\n\n name() {\n return this._name;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Argument}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI command arguments into argument values.\n *\n * @param {Function} [fn]\n * @return {Argument}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Only allow argument value to be one of choices.\n *\n * @param {string[]} values\n * @return {Argument}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Make argument required.\n *\n * @returns {Argument}\n */\n argRequired() {\n this.required = true;\n return this;\n }\n\n /**\n * Make argument optional.\n *\n * @returns {Argument}\n */\n argOptional() {\n this.required = false;\n return this;\n }\n}\n\n/**\n * Takes an argument and returns its human readable equivalent for help usage.\n *\n * @param {Argument} arg\n * @return {string}\n * @private\n */\n\nexport function humanReadableArgName(arg) {\n const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');\n\n return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';\n}\n","import { EventEmitter } from 'node:events';\nimport childProcess from 'node:child_process';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport process from 'node:process';\nimport { stripVTControlCharacters } from 'node:util';\n\nimport { Argument, humanReadableArgName } from './argument.js';\nimport { CommanderError } from './error.js';\nimport { Help } from './help.js';\nimport { Option, DualOptions } from './option.js';\nimport { suggestSimilar } from './suggestSimilar.js';\n\nexport class Command extends EventEmitter {\n /**\n * Initialize a new `Command`.\n *\n * @param {string} [name]\n */\n\n constructor(name) {\n super();\n /** @type {Command[]} */\n this.commands = [];\n /** @type {Option[]} */\n this.options = [];\n this.parent = null;\n this._allowUnknownOption = false;\n this._allowExcessArguments = false;\n /** @type {Argument[]} */\n this.registeredArguments = [];\n this._args = this.registeredArguments; // deprecated old name\n /** @type {string[]} */\n this.args = []; // cli args with options removed\n this.rawArgs = [];\n this.processedArgs = []; // like .args but after custom processing and collecting variadic\n this._scriptPath = null;\n this._name = name || '';\n this._optionValues = {};\n this._optionValueSources = {}; // default, env, cli etc\n this._storeOptionsAsProperties = false;\n this._actionHandler = null;\n this._executableHandler = false;\n this._executableFile = null; // custom name for executable\n this._executableDir = null; // custom search directory for subcommands\n this._defaultCommandName = null;\n this._exitCallback = null;\n this._aliases = [];\n this._combineFlagAndOptionalValue = true;\n this._description = '';\n this._summary = '';\n this._argsDescription = undefined; // legacy\n this._enablePositionalOptions = false;\n this._passThroughOptions = false;\n this._lifeCycleHooks = {}; // a hash of arrays\n /** @type {(boolean | string)} */\n this._showHelpAfterError = false;\n this._showSuggestionAfterError = true;\n this._savedState = null; // used in save/restoreStateBeforeParse\n\n // see configureOutput() for docs\n this._outputConfiguration = {\n writeOut: (str) => process.stdout.write(str),\n writeErr: (str) => process.stderr.write(str),\n outputError: (str, write) => write(str),\n getOutHelpWidth: () =>\n process.stdout.isTTY ? process.stdout.columns : undefined,\n getErrHelpWidth: () =>\n process.stderr.isTTY ? process.stderr.columns : undefined,\n getOutHasColors: () =>\n useColor() ?? (process.stdout.isTTY && process.stdout.hasColors?.()),\n getErrHasColors: () =>\n useColor() ?? (process.stderr.isTTY && process.stderr.hasColors?.()),\n stripColor: (str) => stripVTControlCharacters(str),\n };\n\n this._hidden = false;\n /** @type {(Option | null | undefined)} */\n this._helpOption = undefined; // Lazy created on demand. May be null if help option is disabled.\n this._addImplicitHelpCommand = undefined; // undecided whether true or false yet, not inherited\n /** @type {Command} */\n this._helpCommand = undefined; // lazy initialised, inherited\n this._helpConfiguration = {};\n /** @type {string | undefined} */\n this._helpGroupHeading = undefined; // soft initialised when added to parent\n /** @type {string | undefined} */\n this._defaultCommandGroup = undefined;\n /** @type {string | undefined} */\n this._defaultOptionGroup = undefined;\n }\n\n /**\n * Copy settings that are useful to have in common across root command and subcommands.\n *\n * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)\n *\n * @param {Command} sourceCommand\n * @return {Command} `this` command for chaining\n */\n copyInheritedSettings(sourceCommand) {\n this._outputConfiguration = sourceCommand._outputConfiguration;\n this._helpOption = sourceCommand._helpOption;\n this._helpCommand = sourceCommand._helpCommand;\n this._helpConfiguration = sourceCommand._helpConfiguration;\n this._exitCallback = sourceCommand._exitCallback;\n this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;\n this._combineFlagAndOptionalValue =\n sourceCommand._combineFlagAndOptionalValue;\n this._allowExcessArguments = sourceCommand._allowExcessArguments;\n this._enablePositionalOptions = sourceCommand._enablePositionalOptions;\n this._showHelpAfterError = sourceCommand._showHelpAfterError;\n this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError;\n\n return this;\n }\n\n /**\n * @returns {Command[]}\n * @private\n */\n\n _getCommandAndAncestors() {\n const result = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n for (let command = this; command; command = command.parent) {\n result.push(command);\n }\n return result;\n }\n\n /**\n * Define a command.\n *\n * There are two styles of command: pay attention to where to put the description.\n *\n * @example\n * // Command implemented using action handler (description is supplied separately to `.command`)\n * program\n * .command('clone <source> [destination]')\n * .description('clone a repository into a newly created directory')\n * .action((source, destination) => {\n * console.log('clone command called');\n * });\n *\n * // Command implemented using separate executable file (description is second parameter to `.command`)\n * program\n * .command('start <service>', 'start named service')\n * .command('stop [service]', 'stop named service, or all if no name supplied');\n *\n * @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`\n * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)\n * @param {object} [execOpts] - configuration options (for executable)\n * @return {Command} returns new command for action handler, or `this` for executable command\n */\n\n command(nameAndArgs, actionOptsOrExecDesc, execOpts) {\n let desc = actionOptsOrExecDesc;\n let opts = execOpts;\n if (typeof desc === 'object' && desc !== null) {\n opts = desc;\n desc = null;\n }\n opts = opts || {};\n const [, name, args] = nameAndArgs.match(/([^ ]+) *(.*)/);\n\n const cmd = this.createCommand(name);\n if (desc) {\n cmd.description(desc);\n cmd._executableHandler = true;\n }\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n cmd._hidden = !!(opts.noHelp || opts.hidden); // noHelp is deprecated old name for hidden\n cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor\n if (args) cmd.arguments(args);\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd.copyInheritedSettings(this);\n\n if (desc) return this;\n return cmd;\n }\n\n /**\n * Factory routine to create a new unattached command.\n *\n * See .command() for creating an attached subcommand, which uses this routine to\n * create the command. You can override createCommand to customise subcommands.\n *\n * @param {string} [name]\n * @return {Command} new command\n */\n\n createCommand(name) {\n return new Command(name);\n }\n\n /**\n * You can customise the help with a subclass of Help by overriding createHelp,\n * or by overriding Help properties using configureHelp().\n *\n * @return {Help}\n */\n\n createHelp() {\n return Object.assign(new Help(), this.configureHelp());\n }\n\n /**\n * You can customise the help by overriding Help properties using configureHelp(),\n * or with a subclass of Help by overriding createHelp().\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureHelp(configuration) {\n if (configuration === undefined) return this._helpConfiguration;\n\n this._helpConfiguration = configuration;\n return this;\n }\n\n /**\n * The default output goes to stdout and stderr. You can customise this for special\n * applications. You can also customise the display of errors by overriding outputError.\n *\n * The configuration properties are all functions:\n *\n * // change how output being written, defaults to stdout and stderr\n * writeOut(str)\n * writeErr(str)\n * // change how output being written for errors, defaults to writeErr\n * outputError(str, write) // used for displaying errors and not used for displaying help\n * // specify width for wrapping help\n * getOutHelpWidth()\n * getErrHelpWidth()\n * // color support, currently only used with Help\n * getOutHasColors()\n * getErrHasColors()\n * stripColor() // used to remove ANSI escape codes if output does not have colors\n *\n * @param {object} [configuration] - configuration options\n * @return {(Command | object)} `this` command for chaining, or stored configuration\n */\n\n configureOutput(configuration) {\n if (configuration === undefined) return this._outputConfiguration;\n\n this._outputConfiguration = {\n ...this._outputConfiguration,\n ...configuration,\n };\n return this;\n }\n\n /**\n * Display the help or a custom message after an error occurs.\n *\n * @param {(boolean|string)} [displayHelp]\n * @return {Command} `this` command for chaining\n */\n showHelpAfterError(displayHelp = true) {\n if (typeof displayHelp !== 'string') displayHelp = !!displayHelp;\n this._showHelpAfterError = displayHelp;\n return this;\n }\n\n /**\n * Display suggestion of similar commands for unknown commands, or options for unknown options.\n *\n * @param {boolean} [displaySuggestion]\n * @return {Command} `this` command for chaining\n */\n showSuggestionAfterError(displaySuggestion = true) {\n this._showSuggestionAfterError = !!displaySuggestion;\n return this;\n }\n\n /**\n * Add a prepared subcommand.\n *\n * See .command() for creating an attached subcommand which inherits settings from its parent.\n *\n * @param {Command} cmd - new subcommand\n * @param {object} [opts] - configuration options\n * @return {Command} `this` command for chaining\n */\n\n addCommand(cmd, opts) {\n if (!cmd._name) {\n throw new Error(`Command passed to .addCommand() must have a name\n- specify the name in Command constructor or using .name()`);\n }\n\n opts = opts || {};\n if (opts.isDefault) this._defaultCommandName = cmd._name;\n if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation\n\n this._registerCommand(cmd);\n cmd.parent = this;\n cmd._checkForBrokenPassThrough();\n\n return this;\n }\n\n /**\n * Factory routine to create a new unattached argument.\n *\n * See .argument() for creating an attached argument, which uses this routine to\n * create the argument. You can override createArgument to return a custom argument.\n *\n * @param {string} name\n * @param {string} [description]\n * @return {Argument} new argument\n */\n\n createArgument(name, description) {\n return new Argument(name, description);\n }\n\n /**\n * Define argument syntax for command.\n *\n * The default is that the argument is required, and you can explicitly\n * indicate this with <> around the name. Put [] around the name for an optional argument.\n *\n * @example\n * program.argument('<input-file>');\n * program.argument('[output-file]');\n *\n * @param {string} name\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom argument processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n argument(name, description, parseArg, defaultValue) {\n const argument = this.createArgument(name, description);\n if (typeof parseArg === 'function') {\n argument.default(defaultValue).argParser(parseArg);\n } else {\n argument.default(parseArg);\n }\n this.addArgument(argument);\n return this;\n }\n\n /**\n * Define argument syntax for command, adding multiple at once (without descriptions).\n *\n * See also .argument().\n *\n * @example\n * program.arguments('<cmd> [env]');\n *\n * @param {string} names\n * @return {Command} `this` command for chaining\n */\n\n arguments(names) {\n names\n .trim()\n .split(/ +/)\n .forEach((detail) => {\n this.argument(detail);\n });\n return this;\n }\n\n /**\n * Define argument syntax for command, adding a prepared argument.\n *\n * @param {Argument} argument\n * @return {Command} `this` command for chaining\n */\n addArgument(argument) {\n const previousArgument = this.registeredArguments.slice(-1)[0];\n if (previousArgument?.variadic) {\n throw new Error(\n `only the last argument can be variadic '${previousArgument.name()}'`,\n );\n }\n if (\n argument.required &&\n argument.defaultValue !== undefined &&\n argument.parseArg === undefined\n ) {\n throw new Error(\n `a default value for a required argument is never used: '${argument.name()}'`,\n );\n }\n this.registeredArguments.push(argument);\n return this;\n }\n\n /**\n * Customise or override default help command. By default a help command is automatically added if your command has subcommands.\n *\n * @example\n * program.helpCommand('help [cmd]');\n * program.helpCommand('help [cmd]', 'show help');\n * program.helpCommand(false); // suppress default help command\n * program.helpCommand(true); // add help command even if no subcommands\n *\n * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added\n * @param {string} [description] - custom description\n * @return {Command} `this` command for chaining\n */\n\n helpCommand(enableOrNameAndArgs, description) {\n if (typeof enableOrNameAndArgs === 'boolean') {\n this._addImplicitHelpCommand = enableOrNameAndArgs;\n if (enableOrNameAndArgs && this._defaultCommandGroup) {\n // make the command to store the group\n this._initCommandGroup(this._getHelpCommand());\n }\n return this;\n }\n\n const nameAndArgs = enableOrNameAndArgs ?? 'help [command]';\n const [, helpName, helpArgs] = nameAndArgs.match(/([^ ]+) *(.*)/);\n const helpDescription = description ?? 'display help for command';\n\n const helpCommand = this.createCommand(helpName);\n helpCommand.helpOption(false);\n if (helpArgs) helpCommand.arguments(helpArgs);\n if (helpDescription) helpCommand.description(helpDescription);\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n // init group unless lazy create\n if (enableOrNameAndArgs || description) this._initCommandGroup(helpCommand);\n\n return this;\n }\n\n /**\n * Add prepared custom help command.\n *\n * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()`\n * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only\n * @return {Command} `this` command for chaining\n */\n addHelpCommand(helpCommand, deprecatedDescription) {\n // If not passed an object, call through to helpCommand for backwards compatibility,\n // as addHelpCommand was originally used like helpCommand is now.\n if (typeof helpCommand !== 'object') {\n this.helpCommand(helpCommand, deprecatedDescription);\n return this;\n }\n\n this._addImplicitHelpCommand = true;\n this._helpCommand = helpCommand;\n this._initCommandGroup(helpCommand);\n return this;\n }\n\n /**\n * Lazy create help command.\n *\n * @return {(Command|null)}\n * @package\n */\n _getHelpCommand() {\n const hasImplicitHelpCommand =\n this._addImplicitHelpCommand ??\n (this.commands.length &&\n !this._actionHandler &&\n !this._findCommand('help'));\n\n if (hasImplicitHelpCommand) {\n if (this._helpCommand === undefined) {\n this.helpCommand(undefined, undefined); // use default name and description\n }\n return this._helpCommand;\n }\n return null;\n }\n\n /**\n * Add hook for life cycle event.\n *\n * @param {string} event\n * @param {Function} listener\n * @return {Command} `this` command for chaining\n */\n\n hook(event, listener) {\n const allowedValues = ['preSubcommand', 'preAction', 'postAction'];\n if (!allowedValues.includes(event)) {\n throw new Error(`Unexpected value for event passed to hook : '${event}'.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n if (this._lifeCycleHooks[event]) {\n this._lifeCycleHooks[event].push(listener);\n } else {\n this._lifeCycleHooks[event] = [listener];\n }\n return this;\n }\n\n /**\n * Register callback to use as replacement for calling process.exit.\n *\n * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing\n * @return {Command} `this` command for chaining\n */\n\n exitOverride(fn) {\n if (fn) {\n this._exitCallback = fn;\n } else {\n this._exitCallback = (err) => {\n if (err.code !== 'commander.executeSubCommandAsync') {\n throw err;\n } else {\n // Async callback from spawn events, not useful to throw.\n }\n };\n }\n return this;\n }\n\n /**\n * Call process.exit, and _exitCallback if defined.\n *\n * @param {number} exitCode exit code for using with process.exit\n * @param {string} code an id string representing the error\n * @param {string} message human-readable description of the error\n * @return never\n * @private\n */\n\n _exit(exitCode, code, message) {\n if (this._exitCallback) {\n this._exitCallback(new CommanderError(exitCode, code, message));\n // Expecting this line is not reached.\n }\n process.exit(exitCode);\n }\n\n /**\n * Register callback `fn` for the command.\n *\n * @example\n * program\n * .command('serve')\n * .description('start service')\n * .action(function() {\n * // do work here\n * });\n *\n * @param {Function} fn\n * @return {Command} `this` command for chaining\n */\n\n action(fn) {\n const listener = (args) => {\n // The .action callback takes an extra parameter which is the command or options.\n const expectedArgsCount = this.registeredArguments.length;\n const actionArgs = args.slice(0, expectedArgsCount);\n if (this._storeOptionsAsProperties) {\n actionArgs[expectedArgsCount] = this; // backwards compatible \"options\"\n } else {\n actionArgs[expectedArgsCount] = this.opts();\n }\n actionArgs.push(this);\n\n return fn.apply(this, actionArgs);\n };\n this._actionHandler = listener;\n return this;\n }\n\n /**\n * Factory routine to create a new unattached option.\n *\n * See .option() for creating an attached option, which uses this routine to\n * create the option. You can override createOption to return a custom option.\n *\n * @param {string} flags\n * @param {string} [description]\n * @return {Option} new option\n */\n\n createOption(flags, description) {\n return new Option(flags, description);\n }\n\n /**\n * Wrap parseArgs to catch 'commander.invalidArgument'.\n *\n * @param {(Option | Argument)} target\n * @param {string} value\n * @param {*} previous\n * @param {string} invalidArgumentMessage\n * @private\n */\n\n _callParseArg(target, value, previous, invalidArgumentMessage) {\n try {\n return target.parseArg(value, previous);\n } catch (err) {\n if (err.code === 'commander.invalidArgument') {\n const message = `${invalidArgumentMessage} ${err.message}`;\n this.error(message, { exitCode: err.exitCode, code: err.code });\n }\n throw err;\n }\n }\n\n /**\n * Check for option flag conflicts.\n * Register option if no conflicts found, or throw on conflict.\n *\n * @param {Option} option\n * @private\n */\n\n _registerOption(option) {\n const matchingOption =\n (option.short && this._findOption(option.short)) ||\n (option.long && this._findOption(option.long));\n if (matchingOption) {\n const matchingFlag =\n option.long && this._findOption(option.long)\n ? option.long\n : option.short;\n throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'\n- already used by option '${matchingOption.flags}'`);\n }\n\n this._initOptionGroup(option);\n this.options.push(option);\n }\n\n /**\n * Check for command name and alias conflicts with existing commands.\n * Register command if no conflicts found, or throw on conflict.\n *\n * @param {Command} command\n * @private\n */\n\n _registerCommand(command) {\n const knownBy = (cmd) => {\n return [cmd.name()].concat(cmd.aliases());\n };\n\n const alreadyUsed = knownBy(command).find((name) =>\n this._findCommand(name),\n );\n if (alreadyUsed) {\n const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');\n const newCmd = knownBy(command).join('|');\n throw new Error(\n `cannot add command '${newCmd}' as already have command '${existingCmd}'`,\n );\n }\n\n this._initCommandGroup(command);\n this.commands.push(command);\n }\n\n /**\n * Add an option.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addOption(option) {\n this._registerOption(option);\n\n const oname = option.name();\n const name = option.attributeName();\n\n // store default value\n if (option.defaultValue !== undefined) {\n this.setOptionValueWithSource(name, option.defaultValue, 'default');\n }\n\n // handler for cli and env supplied values\n const handleOptionValue = (val, invalidValueMessage, valueSource) => {\n // val is null for optional option used without an optional-argument.\n // val is undefined for boolean and negated option.\n if (val == null && option.presetArg !== undefined) {\n val = option.presetArg;\n }\n\n // custom processing\n const oldValue = this.getOptionValue(name);\n if (val !== null && option.parseArg) {\n val = this._callParseArg(option, val, oldValue, invalidValueMessage);\n } else if (val !== null && option.variadic) {\n val = option._collectValue(val, oldValue);\n }\n\n // Fill-in appropriate missing values. Long winded but easy to follow.\n if (val == null) {\n if (option.negate) {\n val = false;\n } else if (option.isBoolean() || option.optional) {\n val = true;\n } else {\n val = ''; // not normal, parseArg might have failed or be a mock function for testing\n }\n }\n this.setOptionValueWithSource(name, val, valueSource);\n };\n\n this.on('option:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'cli');\n });\n\n if (option.envVar) {\n this.on('optionEnv:' + oname, (val) => {\n const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`;\n handleOptionValue(val, invalidValueMessage, 'env');\n });\n }\n\n return this;\n }\n\n /**\n * Internal implementation shared by .option() and .requiredOption()\n *\n * @return {Command} `this` command for chaining\n * @private\n */\n _optionEx(config, flags, description, fn, defaultValue) {\n if (typeof flags === 'object' && flags instanceof Option) {\n throw new Error(\n 'To add an Option object use addOption() instead of option() or requiredOption()',\n );\n }\n const option = this.createOption(flags, description);\n option.makeOptionMandatory(!!config.mandatory);\n if (typeof fn === 'function') {\n option.default(defaultValue).argParser(fn);\n } else if (fn instanceof RegExp) {\n // deprecated\n const regex = fn;\n fn = (val, def) => {\n const m = regex.exec(val);\n return m ? m[0] : def;\n };\n option.default(defaultValue).argParser(fn);\n } else {\n option.default(fn);\n }\n\n return this.addOption(option);\n }\n\n /**\n * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required\n * option-argument is indicated by `<>` and an optional option-argument by `[]`.\n *\n * See the README for more details, and see also addOption() and requiredOption().\n *\n * @example\n * program\n * .option('-p, --pepper', 'add pepper')\n * .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument\n * .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default\n * .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n option(flags, description, parseArg, defaultValue) {\n return this._optionEx({}, flags, description, parseArg, defaultValue);\n }\n\n /**\n * Add a required option which must have a value after parsing. This usually means\n * the option must be specified on the command line. (Otherwise the same as .option().)\n *\n * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.\n *\n * @param {string} flags\n * @param {string} [description]\n * @param {(Function|*)} [parseArg] - custom option processing function or default value\n * @param {*} [defaultValue]\n * @return {Command} `this` command for chaining\n */\n\n requiredOption(flags, description, parseArg, defaultValue) {\n return this._optionEx(\n { mandatory: true },\n flags,\n description,\n parseArg,\n defaultValue,\n );\n }\n\n /**\n * Alter parsing of short flags with optional values.\n *\n * @example\n * // for `.option('-f,--flag [value]'):\n * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour\n * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`\n *\n * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.\n * @return {Command} `this` command for chaining\n */\n combineFlagAndOptionalValue(combine = true) {\n this._combineFlagAndOptionalValue = !!combine;\n return this;\n }\n\n /**\n * Allow unknown options on the command line.\n *\n * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.\n * @return {Command} `this` command for chaining\n */\n allowUnknownOption(allowUnknown = true) {\n this._allowUnknownOption = !!allowUnknown;\n return this;\n }\n\n /**\n * Allow excess command-arguments on the command line. Pass false to make excess arguments an error.\n *\n * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.\n * @return {Command} `this` command for chaining\n */\n allowExcessArguments(allowExcess = true) {\n this._allowExcessArguments = !!allowExcess;\n return this;\n }\n\n /**\n * Enable positional options. Positional means global options are specified before subcommands which lets\n * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.\n * The default behaviour is non-positional and global options may appear anywhere on the command line.\n *\n * @param {boolean} [positional]\n * @return {Command} `this` command for chaining\n */\n enablePositionalOptions(positional = true) {\n this._enablePositionalOptions = !!positional;\n return this;\n }\n\n /**\n * Pass through options that come after command-arguments rather than treat them as command-options,\n * so actual command-options come before command-arguments. Turning this on for a subcommand requires\n * positional options to have been enabled on the program (parent commands).\n * The default behaviour is non-positional and options may appear before or after command-arguments.\n *\n * @param {boolean} [passThrough] for unknown options.\n * @return {Command} `this` command for chaining\n */\n passThroughOptions(passThrough = true) {\n this._passThroughOptions = !!passThrough;\n this._checkForBrokenPassThrough();\n return this;\n }\n\n /**\n * @private\n */\n\n _checkForBrokenPassThrough() {\n if (\n this.parent &&\n this._passThroughOptions &&\n !this.parent._enablePositionalOptions\n ) {\n throw new Error(\n `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,\n );\n }\n }\n\n /**\n * Whether to store option values as properties on command object,\n * or store separately (specify false). In both cases the option values can be accessed using .opts().\n *\n * @param {boolean} [storeAsProperties=true]\n * @return {Command} `this` command for chaining\n */\n\n storeOptionsAsProperties(storeAsProperties = true) {\n if (this.options.length) {\n throw new Error('call .storeOptionsAsProperties() before adding options');\n }\n if (Object.keys(this._optionValues).length) {\n throw new Error(\n 'call .storeOptionsAsProperties() before setting option values',\n );\n }\n this._storeOptionsAsProperties = !!storeAsProperties;\n return this;\n }\n\n /**\n * Retrieve option value.\n *\n * @param {string} key\n * @return {object} value\n */\n\n getOptionValue(key) {\n if (this._storeOptionsAsProperties) {\n return this[key];\n }\n return this._optionValues[key];\n }\n\n /**\n * Store option value.\n *\n * @param {string} key\n * @param {object} value\n * @return {Command} `this` command for chaining\n */\n\n setOptionValue(key, value) {\n return this.setOptionValueWithSource(key, value, undefined);\n }\n\n /**\n * Store option value and where the value came from.\n *\n * @param {string} key\n * @param {object} value\n * @param {string} source - expected values are default/config/env/cli/implied\n * @return {Command} `this` command for chaining\n */\n\n setOptionValueWithSource(key, value, source) {\n if (this._storeOptionsAsProperties) {\n this[key] = value;\n } else {\n this._optionValues[key] = value;\n }\n this._optionValueSources[key] = source;\n return this;\n }\n\n /**\n * Get source of option value.\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSource(key) {\n return this._optionValueSources[key];\n }\n\n /**\n * Get source of option value. See also .optsWithGlobals().\n * Expected values are default | config | env | cli | implied\n *\n * @param {string} key\n * @return {string}\n */\n\n getOptionValueSourceWithGlobals(key) {\n // global overwrites local, like optsWithGlobals\n let source;\n this._getCommandAndAncestors().forEach((cmd) => {\n if (cmd.getOptionValueSource(key) !== undefined) {\n source = cmd.getOptionValueSource(key);\n }\n });\n return source;\n }\n\n /**\n * Get user arguments from implied or explicit arguments.\n * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches.\n *\n * @private\n */\n\n _prepareUserArgs(argv, parseOptions) {\n if (argv !== undefined && !Array.isArray(argv)) {\n throw new Error('first parameter to parse must be array or undefined');\n }\n parseOptions = parseOptions || {};\n\n // auto-detect argument conventions if nothing supplied\n if (argv === undefined && parseOptions.from === undefined) {\n if (process.versions?.electron) {\n parseOptions.from = 'electron';\n }\n // check node specific options for scenarios where user CLI args follow executable without scriptname\n const execArgv = process.execArgv ?? [];\n if (\n execArgv.includes('-e') ||\n execArgv.includes('--eval') ||\n execArgv.includes('-p') ||\n execArgv.includes('--print')\n ) {\n parseOptions.from = 'eval'; // internal usage, not documented\n }\n }\n\n // default to using process.argv\n if (argv === undefined) {\n argv = process.argv;\n }\n this.rawArgs = argv.slice();\n\n // extract the user args and scriptPath\n let userArgs;\n switch (parseOptions.from) {\n case undefined:\n case 'node':\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n break;\n case 'electron':\n // @ts-ignore: because defaultApp is an unknown property\n if (process.defaultApp) {\n this._scriptPath = argv[1];\n userArgs = argv.slice(2);\n } else {\n userArgs = argv.slice(1);\n }\n break;\n case 'user':\n userArgs = argv.slice(0);\n break;\n case 'eval':\n userArgs = argv.slice(1);\n break;\n default:\n throw new Error(\n `unexpected parse option { from: '${parseOptions.from}' }`,\n );\n }\n\n // Find default name for program from arguments.\n if (!this._name && this._scriptPath)\n this.nameFromFilename(this._scriptPath);\n this._name = this._name || 'program';\n\n return userArgs;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Use parseAsync instead of parse if any of your action handlers are async.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * program.parse(); // parse process.argv and auto-detect electron and special node flags\n * program.parse(process.argv); // assume argv[0] is app and argv[1] is script\n * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv] - optional, defaults to process.argv\n * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron\n * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'\n * @return {Command} `this` command for chaining\n */\n\n parse(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n this._parseCommand([], userArgs);\n\n return this;\n }\n\n /**\n * Parse `argv`, setting options and invoking commands when defined.\n *\n * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!\n *\n * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:\n * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that\n * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged\n * - `'user'`: just user arguments\n *\n * @example\n * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags\n * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script\n * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]\n *\n * @param {string[]} [argv]\n * @param {object} [parseOptions]\n * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'\n * @return {Promise}\n */\n\n async parseAsync(argv, parseOptions) {\n this._prepareForParse();\n const userArgs = this._prepareUserArgs(argv, parseOptions);\n await this._parseCommand([], userArgs);\n\n return this;\n }\n\n _prepareForParse() {\n // Save the state the first time, then restore the state before each subsequent parse.\n if (this._savedState === null) {\n // Do the special default of lone negated option to true, now that we have all the options.\n // Filter for negated options that have not been processed already.\n this.options\n .filter(\n (option) =>\n option.negate &&\n option.defaultValue === undefined &&\n this.getOptionValue(option.attributeName()) === undefined,\n )\n .forEach((option) => {\n // check for lone negated option: --no-foo without a --foo option\n const positiveLongFlag = option.long.replace(/^--no-/, '--');\n if (!this._findOption(positiveLongFlag)) {\n this.setOptionValueWithSource(\n option.attributeName(),\n true,\n 'default',\n );\n }\n });\n\n this.saveStateBeforeParse();\n } else {\n this.restoreStateBeforeParse();\n }\n }\n\n /**\n * Called the first time parse is called to save state and allow a restore before subsequent calls to parse.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state saved.\n */\n saveStateBeforeParse() {\n this._savedState = {\n // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing\n _name: this._name,\n // option values before parse have default values (including false for negated options)\n // shallow clones\n _optionValues: { ...this._optionValues },\n _optionValueSources: { ...this._optionValueSources },\n };\n }\n\n /**\n * Restore state before parse for calls after the first.\n * Not usually called directly, but available for subclasses to save their custom state.\n *\n * This is called in a lazy way. Only commands used in parsing chain will have state restored.\n */\n restoreStateBeforeParse() {\n if (this._storeOptionsAsProperties)\n throw new Error(`Can not call parse again when storeOptionsAsProperties is true.\n- either make a new Command for each call to parse, or stop storing options as properties`);\n\n // clear state from _prepareUserArgs\n this._name = this._savedState._name;\n this._scriptPath = null;\n this.rawArgs = [];\n // clear state from setOptionValueWithSource\n this._optionValues = { ...this._savedState._optionValues };\n this._optionValueSources = { ...this._savedState._optionValueSources };\n // clear state from _parseCommand\n this.args = [];\n // clear state from _processArguments\n this.processedArgs = [];\n }\n\n /**\n * Throw if expected executable is missing. Add lots of help for author.\n *\n * @param {string} executableFile\n * @param {string} executableDir\n * @param {string} subcommandName\n */\n _checkForMissingExecutable(executableFile, executableDir, subcommandName) {\n if (fs.existsSync(executableFile)) return;\n\n const executableDirMessage = executableDir\n ? `searched for local subcommand relative to directory '${executableDir}'`\n : 'no directory for search for local subcommand, use .executableDir() to supply a custom directory';\n const executableMissing = `'${executableFile}' does not exist\n - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead\n - if the default executable name is not suitable, use the executableFile option to supply a custom name or path\n - ${executableDirMessage}`;\n throw new Error(executableMissing);\n }\n\n /**\n * Execute a sub-command executable.\n *\n * @private\n */\n\n _executeSubCommand(subcommand, args) {\n args = args.slice();\n const sourceExt = ['.js', '.ts', '.tsx', '.mjs', '.cjs'];\n\n function findFile(baseDir, baseName) {\n // Look for specified file\n const localBin = path.resolve(baseDir, baseName);\n if (fs.existsSync(localBin)) return localBin;\n\n // Stop looking if candidate already has an expected extension.\n if (sourceExt.includes(path.extname(baseName))) return undefined;\n\n // Try all the extensions.\n const foundExt = sourceExt.find((ext) =>\n fs.existsSync(`${localBin}${ext}`),\n );\n if (foundExt) return `${localBin}${foundExt}`;\n\n return undefined;\n }\n\n // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command.\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // executableFile and executableDir might be full path, or just a name\n let executableFile =\n subcommand._executableFile || `${this._name}-${subcommand._name}`;\n let executableDir = this._executableDir || '';\n if (this._scriptPath) {\n let resolvedScriptPath; // resolve possible symlink for installed npm binary\n try {\n resolvedScriptPath = fs.realpathSync(this._scriptPath);\n } catch {\n resolvedScriptPath = this._scriptPath;\n }\n executableDir = path.resolve(\n path.dirname(resolvedScriptPath),\n executableDir,\n );\n }\n\n // Look for a local file in preference to a command in PATH.\n if (executableDir) {\n let localFile = findFile(executableDir, executableFile);\n\n // Legacy search using prefix of script name instead of command name\n if (!localFile && !subcommand._executableFile && this._scriptPath) {\n const legacyName = path.basename(\n this._scriptPath,\n path.extname(this._scriptPath),\n );\n if (legacyName !== this._name) {\n localFile = findFile(\n executableDir,\n `${legacyName}-${subcommand._name}`,\n );\n }\n }\n executableFile = localFile || executableFile;\n }\n\n const launchWithNode = sourceExt.includes(path.extname(executableFile));\n\n let proc;\n if (process.platform !== 'win32') {\n if (launchWithNode) {\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n\n proc = childProcess.spawn(process.argv[0], args, { stdio: 'inherit' });\n } else {\n proc = childProcess.spawn(executableFile, args, { stdio: 'inherit' });\n }\n } else {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n args.unshift(executableFile);\n // add executable arguments to spawn\n args = incrementNodeInspectorPort(process.execArgv).concat(args);\n proc = childProcess.spawn(process.execPath, args, { stdio: 'inherit' });\n }\n\n if (!proc.killed) {\n // testing mainly to avoid leak warnings during unit tests with mocked spawn\n const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n signals.forEach((signal) => {\n process.on(signal, () => {\n if (proc.killed === false && proc.exitCode === null) {\n // @ts-ignore because signals not typed to known strings\n proc.kill(signal);\n }\n });\n });\n }\n\n // By default terminate process when spawned process terminates.\n const exitCallback = this._exitCallback;\n proc.on('close', (code) => {\n code = code ?? 1; // code is null if spawned process terminated due to a signal\n if (!exitCallback) {\n process.exit(code);\n } else {\n exitCallback(\n new CommanderError(\n code,\n 'commander.executeSubCommandAsync',\n '(close)',\n ),\n );\n }\n });\n proc.on('error', (err) => {\n // @ts-ignore: because err.code is an unknown property\n if (err.code === 'ENOENT') {\n this._checkForMissingExecutable(\n executableFile,\n executableDir,\n subcommand._name,\n );\n // @ts-ignore: because err.code is an unknown property\n } else if (err.code === 'EACCES') {\n throw new Error(`'${executableFile}' not executable`);\n }\n if (!exitCallback) {\n process.exit(1);\n } else {\n const wrappedError = new CommanderError(\n 1,\n 'commander.executeSubCommandAsync',\n '(error)',\n );\n wrappedError.nestedError = err;\n exitCallback(wrappedError);\n }\n });\n\n // Store the reference to the child process\n this.runningCommand = proc;\n }\n\n /**\n * @private\n */\n\n _dispatchSubcommand(commandName, operands, unknown) {\n const subCommand = this._findCommand(commandName);\n if (!subCommand) this.help({ error: true });\n\n subCommand._prepareForParse();\n let promiseChain;\n promiseChain = this._chainOrCallSubCommandHook(\n promiseChain,\n subCommand,\n 'preSubcommand',\n );\n promiseChain = this._chainOrCall(promiseChain, () => {\n if (subCommand._executableHandler) {\n this._executeSubCommand(subCommand, operands.concat(unknown));\n } else {\n return subCommand._parseCommand(operands, unknown);\n }\n });\n return promiseChain;\n }\n\n /**\n * Invoke help directly if possible, or dispatch if necessary.\n * e.g. help foo\n *\n * @private\n */\n\n _dispatchHelpCommand(subcommandName) {\n if (!subcommandName) {\n this.help();\n }\n const subCommand = this._findCommand(subcommandName);\n if (subCommand && !subCommand._executableHandler) {\n subCommand.help();\n }\n\n // Fallback to parsing the help flag to invoke the help.\n return this._dispatchSubcommand(\n subcommandName,\n [],\n [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],\n );\n }\n\n /**\n * Check this.args against expected this.registeredArguments.\n *\n * @private\n */\n\n _checkNumberOfArguments() {\n // too few\n this.registeredArguments.forEach((arg, i) => {\n if (arg.required && this.args[i] == null) {\n this.missingArgument(arg.name());\n }\n });\n // too many\n if (\n this.registeredArguments.length > 0 &&\n this.registeredArguments[this.registeredArguments.length - 1].variadic\n ) {\n return;\n }\n if (this.args.length > this.registeredArguments.length) {\n this._excessArguments(this.args);\n }\n }\n\n /**\n * Process this.args using this.registeredArguments and save as this.processedArgs!\n *\n * @private\n */\n\n _processArguments() {\n const myParseArg = (argument, value, previous) => {\n // Extra processing for nice error message on parsing failure.\n let parsedValue = value;\n if (value !== null && argument.parseArg) {\n const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;\n parsedValue = this._callParseArg(\n argument,\n value,\n previous,\n invalidValueMessage,\n );\n }\n return parsedValue;\n };\n\n this._checkNumberOfArguments();\n\n const processedArgs = [];\n this.registeredArguments.forEach((declaredArg, index) => {\n let value = declaredArg.defaultValue;\n if (declaredArg.variadic) {\n // Collect together remaining arguments for passing together as an array.\n if (index < this.args.length) {\n value = this.args.slice(index);\n if (declaredArg.parseArg) {\n value = value.reduce((processed, v) => {\n return myParseArg(declaredArg, v, processed);\n }, declaredArg.defaultValue);\n }\n } else if (value === undefined) {\n value = [];\n }\n } else if (index < this.args.length) {\n value = this.args[index];\n if (declaredArg.parseArg) {\n value = myParseArg(declaredArg, value, declaredArg.defaultValue);\n }\n }\n processedArgs[index] = value;\n });\n this.processedArgs = processedArgs;\n }\n\n /**\n * Once we have a promise we chain, but call synchronously until then.\n *\n * @param {(Promise|undefined)} promise\n * @param {Function} fn\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCall(promise, fn) {\n // thenable\n if (promise?.then && typeof promise.then === 'function') {\n // already have a promise, chain callback\n return promise.then(() => fn());\n }\n // callback might return a promise\n return fn();\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallHooks(promise, event) {\n let result = promise;\n const hooks = [];\n this._getCommandAndAncestors()\n .reverse()\n .filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)\n .forEach((hookedCommand) => {\n hookedCommand._lifeCycleHooks[event].forEach((callback) => {\n hooks.push({ hookedCommand, callback });\n });\n });\n if (event === 'postAction') {\n hooks.reverse();\n }\n\n hooks.forEach((hookDetail) => {\n result = this._chainOrCall(result, () => {\n return hookDetail.callback(hookDetail.hookedCommand, this);\n });\n });\n return result;\n }\n\n /**\n *\n * @param {(Promise|undefined)} promise\n * @param {Command} subCommand\n * @param {string} event\n * @return {(Promise|undefined)}\n * @private\n */\n\n _chainOrCallSubCommandHook(promise, subCommand, event) {\n let result = promise;\n if (this._lifeCycleHooks[event] !== undefined) {\n this._lifeCycleHooks[event].forEach((hook) => {\n result = this._chainOrCall(result, () => {\n return hook(this, subCommand);\n });\n });\n }\n return result;\n }\n\n /**\n * Process arguments in context of this command.\n * Returns action result, in case it is a promise.\n *\n * @private\n */\n\n _parseCommand(operands, unknown) {\n const parsed = this.parseOptions(unknown);\n this._parseOptionsEnv(); // after cli, so parseArg not called on both cli and env\n this._parseOptionsImplied();\n operands = operands.concat(parsed.operands);\n unknown = parsed.unknown;\n this.args = operands.concat(unknown);\n\n if (operands && this._findCommand(operands[0])) {\n return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);\n }\n if (\n this._getHelpCommand() &&\n operands[0] === this._getHelpCommand().name()\n ) {\n return this._dispatchHelpCommand(operands[1]);\n }\n if (this._defaultCommandName) {\n this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command\n return this._dispatchSubcommand(\n this._defaultCommandName,\n operands,\n unknown,\n );\n }\n if (\n this.commands.length &&\n this.args.length === 0 &&\n !this._actionHandler &&\n !this._defaultCommandName\n ) {\n // probably missing subcommand and no handler, user needs help (and exit)\n this.help({ error: true });\n }\n\n this._outputHelpIfRequested(parsed.unknown);\n this._checkForMissingMandatoryOptions();\n this._checkForConflictingOptions();\n\n // We do not always call this check to avoid masking a \"better\" error, like unknown command.\n const checkForUnknownOptions = () => {\n if (parsed.unknown.length > 0) {\n this.unknownOption(parsed.unknown[0]);\n }\n };\n\n const commandEvent = `command:${this.name()}`;\n if (this._actionHandler) {\n checkForUnknownOptions();\n this._processArguments();\n\n let promiseChain;\n promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');\n promiseChain = this._chainOrCall(promiseChain, () =>\n this._actionHandler(this.processedArgs),\n );\n if (this.parent) {\n promiseChain = this._chainOrCall(promiseChain, () => {\n this.parent.emit(commandEvent, operands, unknown); // legacy\n });\n }\n promiseChain = this._chainOrCallHooks(promiseChain, 'postAction');\n return promiseChain;\n }\n if (this.parent?.listenerCount(commandEvent)) {\n checkForUnknownOptions();\n this._processArguments();\n this.parent.emit(commandEvent, operands, unknown); // legacy\n } else if (operands.length) {\n if (this._findCommand('*')) {\n // legacy default command\n return this._dispatchSubcommand('*', operands, unknown);\n }\n if (this.listenerCount('command:*')) {\n // skip option check, emit event for possible misspelling suggestion\n this.emit('command:*', operands, unknown);\n } else if (this.commands.length) {\n this.unknownCommand();\n } else {\n checkForUnknownOptions();\n this._processArguments();\n }\n } else if (this.commands.length) {\n checkForUnknownOptions();\n // This command has subcommands and nothing hooked up at this level, so display help (and exit).\n this.help({ error: true });\n } else {\n checkForUnknownOptions();\n this._processArguments();\n // fall through for caller to handle after calling .parse()\n }\n }\n\n /**\n * Find matching command.\n *\n * @private\n * @return {Command | undefined}\n */\n _findCommand(name) {\n if (!name) return undefined;\n return this.commands.find(\n (cmd) => cmd._name === name || cmd._aliases.includes(name),\n );\n }\n\n /**\n * Return an option matching `arg` if any.\n *\n * @param {string} arg\n * @return {Option}\n * @package\n */\n\n _findOption(arg) {\n return this.options.find((option) => option.is(arg));\n }\n\n /**\n * Display an error message if a mandatory option does not have a value.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n\n _checkForMissingMandatoryOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd.options.forEach((anOption) => {\n if (\n anOption.mandatory &&\n cmd.getOptionValue(anOption.attributeName()) === undefined\n ) {\n cmd.missingMandatoryOptionValue(anOption);\n }\n });\n });\n }\n\n /**\n * Display an error message if conflicting options are used together in this.\n *\n * @private\n */\n _checkForConflictingLocalOptions() {\n const definedNonDefaultOptions = this.options.filter((option) => {\n const optionKey = option.attributeName();\n if (this.getOptionValue(optionKey) === undefined) {\n return false;\n }\n return this.getOptionValueSource(optionKey) !== 'default';\n });\n\n const optionsWithConflicting = definedNonDefaultOptions.filter(\n (option) => option.conflictsWith.length > 0,\n );\n\n optionsWithConflicting.forEach((option) => {\n const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>\n option.conflictsWith.includes(defined.attributeName()),\n );\n if (conflictingAndDefined) {\n this._conflictingOption(option, conflictingAndDefined);\n }\n });\n }\n\n /**\n * Display an error message if conflicting options are used together.\n * Called after checking for help flags in leaf subcommand.\n *\n * @private\n */\n _checkForConflictingOptions() {\n // Walk up hierarchy so can call in subcommand after checking for displaying help.\n this._getCommandAndAncestors().forEach((cmd) => {\n cmd._checkForConflictingLocalOptions();\n });\n }\n\n /**\n * Parse options from `argv` removing known options,\n * and return argv split into operands and unknown arguments.\n *\n * Side effects: modifies command by storing options. Does not reset state if called again.\n *\n * Examples:\n *\n * argv => operands, unknown\n * --known kkk op => [op], []\n * op --known kkk => [op], []\n * sub --unknown uuu op => [sub], [--unknown uuu op]\n * sub -- --unknown uuu op => [sub --unknown uuu op], []\n *\n * @param {string[]} args\n * @return {{operands: string[], unknown: string[]}}\n */\n\n parseOptions(args) {\n const operands = []; // operands, not options or values\n const unknown = []; // first unknown option and remaining unknown args\n let dest = operands;\n\n function maybeOption(arg) {\n return arg.length > 1 && arg[0] === '-';\n }\n\n const negativeNumberArg = (arg) => {\n // return false if not a negative number\n if (!/^-(\\d+|\\d*\\.\\d+)(e[+-]?\\d+)?$/.test(arg)) return false;\n // negative number is ok unless digit used as an option in command hierarchy\n return !this._getCommandAndAncestors().some((cmd) =>\n cmd.options\n .map((opt) => opt.short)\n .some((short) => /^-\\d$/.test(short)),\n );\n };\n\n // parse options\n let activeVariadicOption = null;\n let activeGroup = null; // working through group of short options, like -abc\n let i = 0;\n while (i < args.length || activeGroup) {\n const arg = activeGroup ?? args[i++];\n activeGroup = null;\n\n // literal\n if (arg === '--') {\n if (dest === unknown) dest.push(arg);\n dest.push(...args.slice(i));\n break;\n }\n\n if (\n activeVariadicOption &&\n (!maybeOption(arg) || negativeNumberArg(arg))\n ) {\n this.emit(`option:${activeVariadicOption.name()}`, arg);\n continue;\n }\n activeVariadicOption = null;\n\n if (maybeOption(arg)) {\n const option = this._findOption(arg);\n // recognised option, call listener to assign value with possible custom processing\n if (option) {\n if (option.required) {\n const value = args[i++];\n if (value === undefined) this.optionMissingArgument(option);\n this.emit(`option:${option.name()}`, value);\n } else if (option.optional) {\n let value = null;\n // historical behaviour is optional value is following arg unless an option\n if (\n i < args.length &&\n (!maybeOption(args[i]) || negativeNumberArg(args[i]))\n ) {\n value = args[i++];\n }\n this.emit(`option:${option.name()}`, value);\n } else {\n // boolean flag\n this.emit(`option:${option.name()}`);\n }\n activeVariadicOption = option.variadic ? option : null;\n continue;\n }\n }\n\n // Look for combo options following single dash, eat first one if known.\n if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {\n const option = this._findOption(`-${arg[1]}`);\n if (option) {\n if (\n option.required ||\n (option.optional && this._combineFlagAndOptionalValue)\n ) {\n // option with value following in same argument\n this.emit(`option:${option.name()}`, arg.slice(2));\n } else {\n // boolean option\n this.emit(`option:${option.name()}`);\n // remove the processed option and keep processing group\n activeGroup = `-${arg.slice(2)}`;\n }\n continue;\n }\n }\n\n // Look for known long flag with value, like --foo=bar\n if (/^--[^=]+=/.test(arg)) {\n const index = arg.indexOf('=');\n const option = this._findOption(arg.slice(0, index));\n if (option && (option.required || option.optional)) {\n this.emit(`option:${option.name()}`, arg.slice(index + 1));\n continue;\n }\n }\n\n // Not a recognised option by this command.\n // Might be a command-argument, or subcommand option, or unknown option, or help command or option.\n\n // An unknown option means further arguments also classified as unknown so can be reprocessed by subcommands.\n // A negative number in a leaf command is not an unknown option.\n if (\n dest === operands &&\n maybeOption(arg) &&\n !(this.commands.length === 0 && negativeNumberArg(arg))\n ) {\n dest = unknown;\n }\n\n // If using positionalOptions, stop processing our options at subcommand.\n if (\n (this._enablePositionalOptions || this._passThroughOptions) &&\n operands.length === 0 &&\n unknown.length === 0\n ) {\n if (this._findCommand(arg)) {\n operands.push(arg);\n unknown.push(...args.slice(i));\n break;\n } else if (\n this._getHelpCommand() &&\n arg === this._getHelpCommand().name()\n ) {\n operands.push(arg, ...args.slice(i));\n break;\n } else if (this._defaultCommandName) {\n unknown.push(arg, ...args.slice(i));\n break;\n }\n }\n\n // If using passThroughOptions, stop processing options at first command-argument.\n if (this._passThroughOptions) {\n dest.push(arg, ...args.slice(i));\n break;\n }\n\n // add arg\n dest.push(arg);\n }\n\n return { operands, unknown };\n }\n\n /**\n * Return an object containing local option values as key-value pairs.\n *\n * @return {object}\n */\n opts() {\n if (this._storeOptionsAsProperties) {\n // Preserve original behaviour so backwards compatible when still using properties\n const result = {};\n const len = this.options.length;\n\n for (let i = 0; i < len; i++) {\n const key = this.options[i].attributeName();\n result[key] =\n key === this._versionOptionName ? this._version : this[key];\n }\n return result;\n }\n\n return this._optionValues;\n }\n\n /**\n * Return an object containing merged local and global option values as key-value pairs.\n *\n * @return {object}\n */\n optsWithGlobals() {\n // globals overwrite locals\n return this._getCommandAndAncestors().reduce(\n (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),\n {},\n );\n }\n\n /**\n * Display error message and exit (or call exitOverride).\n *\n * @param {string} message\n * @param {object} [errorOptions]\n * @param {string} [errorOptions.code] - an id string representing the error\n * @param {number} [errorOptions.exitCode] - used with process.exit\n */\n error(message, errorOptions) {\n // output handling\n this._outputConfiguration.outputError(\n `${message}\\n`,\n this._outputConfiguration.writeErr,\n );\n if (typeof this._showHelpAfterError === 'string') {\n this._outputConfiguration.writeErr(`${this._showHelpAfterError}\\n`);\n } else if (this._showHelpAfterError) {\n this._outputConfiguration.writeErr('\\n');\n this.outputHelp({ error: true });\n }\n\n // exit handling\n const config = errorOptions || {};\n const exitCode = config.exitCode || 1;\n const code = config.code || 'commander.error';\n this._exit(exitCode, code, message);\n }\n\n /**\n * Apply any option related environment variables, if option does\n * not have a value from cli or client code.\n *\n * @private\n */\n _parseOptionsEnv() {\n this.options.forEach((option) => {\n if (option.envVar && option.envVar in process.env) {\n const optionKey = option.attributeName();\n // Priority check. Do not overwrite cli or options from unknown source (client-code).\n if (\n this.getOptionValue(optionKey) === undefined ||\n ['default', 'config', 'env'].includes(\n this.getOptionValueSource(optionKey),\n )\n ) {\n if (option.required || option.optional) {\n // option can take a value\n // keep very simple, optional always takes value\n this.emit(`optionEnv:${option.name()}`, process.env[option.envVar]);\n } else {\n // boolean\n // keep very simple, only care that envVar defined and not the value\n this.emit(`optionEnv:${option.name()}`);\n }\n }\n }\n });\n }\n\n /**\n * Apply any implied option values, if option is undefined or default value.\n *\n * @private\n */\n _parseOptionsImplied() {\n const dualHelper = new DualOptions(this.options);\n const hasCustomOptionValue = (optionKey) => {\n return (\n this.getOptionValue(optionKey) !== undefined &&\n !['default', 'implied'].includes(this.getOptionValueSource(optionKey))\n );\n };\n this.options\n .filter(\n (option) =>\n option.implied !== undefined &&\n hasCustomOptionValue(option.attributeName()) &&\n dualHelper.valueFromOption(\n this.getOptionValue(option.attributeName()),\n option,\n ),\n )\n .forEach((option) => {\n Object.keys(option.implied)\n .filter((impliedKey) => !hasCustomOptionValue(impliedKey))\n .forEach((impliedKey) => {\n this.setOptionValueWithSource(\n impliedKey,\n option.implied[impliedKey],\n 'implied',\n );\n });\n });\n }\n\n /**\n * Argument `name` is missing.\n *\n * @param {string} name\n * @private\n */\n\n missingArgument(name) {\n const message = `error: missing required argument '${name}'`;\n this.error(message, { code: 'commander.missingArgument' });\n }\n\n /**\n * `Option` is missing an argument.\n *\n * @param {Option} option\n * @private\n */\n\n optionMissingArgument(option) {\n const message = `error: option '${option.flags}' argument missing`;\n this.error(message, { code: 'commander.optionMissingArgument' });\n }\n\n /**\n * `Option` does not have a value, and is a mandatory option.\n *\n * @param {Option} option\n * @private\n */\n\n missingMandatoryOptionValue(option) {\n const message = `error: required option '${option.flags}' not specified`;\n this.error(message, { code: 'commander.missingMandatoryOptionValue' });\n }\n\n /**\n * `Option` conflicts with another option.\n *\n * @param {Option} option\n * @param {Option} conflictingOption\n * @private\n */\n _conflictingOption(option, conflictingOption) {\n // The calling code does not know whether a negated option is the source of the\n // value, so do some work to take an educated guess.\n const findBestOptionFromValue = (option) => {\n const optionKey = option.attributeName();\n const optionValue = this.getOptionValue(optionKey);\n const negativeOption = this.options.find(\n (target) => target.negate && optionKey === target.attributeName(),\n );\n const positiveOption = this.options.find(\n (target) => !target.negate && optionKey === target.attributeName(),\n );\n if (\n negativeOption &&\n ((negativeOption.presetArg === undefined && optionValue === false) ||\n (negativeOption.presetArg !== undefined &&\n optionValue === negativeOption.presetArg))\n ) {\n return negativeOption;\n }\n return positiveOption || option;\n };\n\n const getErrorMessage = (option) => {\n const bestOption = findBestOptionFromValue(option);\n const optionKey = bestOption.attributeName();\n const source = this.getOptionValueSource(optionKey);\n if (source === 'env') {\n return `environment variable '${bestOption.envVar}'`;\n }\n return `option '${bestOption.flags}'`;\n };\n\n const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`;\n this.error(message, { code: 'commander.conflictingOption' });\n }\n\n /**\n * Unknown option `flag`.\n *\n * @param {string} flag\n * @private\n */\n\n unknownOption(flag) {\n if (this._allowUnknownOption) return;\n let suggestion = '';\n\n if (flag.startsWith('--') && this._showSuggestionAfterError) {\n // Looping to pick up the global options too\n let candidateFlags = [];\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n do {\n const moreFlags = command\n .createHelp()\n .visibleOptions(command)\n .filter((option) => option.long)\n .map((option) => option.long);\n candidateFlags = candidateFlags.concat(moreFlags);\n command = command.parent;\n } while (command && !command._enablePositionalOptions);\n suggestion = suggestSimilar(flag, candidateFlags);\n }\n\n const message = `error: unknown option '${flag}'${suggestion}`;\n this.error(message, { code: 'commander.unknownOption' });\n }\n\n /**\n * Excess arguments, more than expected.\n *\n * @param {string[]} receivedArgs\n * @private\n */\n\n _excessArguments(receivedArgs) {\n if (this._allowExcessArguments) return;\n\n const expected = this.registeredArguments.length;\n const s = expected === 1 ? '' : 's';\n const received = receivedArgs.length;\n const forSubcommand = this.parent ? ` for '${this.name()}'` : '';\n const details = receivedArgs.join(', ');\n const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${received}: ${details}.`;\n this.error(message, { code: 'commander.excessArguments' });\n }\n\n /**\n * Unknown command.\n *\n * @private\n */\n\n unknownCommand() {\n const unknownName = this.args[0];\n let suggestion = '';\n\n if (this._showSuggestionAfterError) {\n const candidateNames = [];\n this.createHelp()\n .visibleCommands(this)\n .forEach((command) => {\n candidateNames.push(command.name());\n // just visible alias\n if (command.alias()) candidateNames.push(command.alias());\n });\n suggestion = suggestSimilar(unknownName, candidateNames);\n }\n\n const message = `error: unknown command '${unknownName}'${suggestion}`;\n this.error(message, { code: 'commander.unknownCommand' });\n }\n\n /**\n * Get or set the program version.\n *\n * This method auto-registers the \"-V, --version\" option which will print the version number.\n *\n * You can optionally supply the flags and description to override the defaults.\n *\n * @param {string} [str]\n * @param {string} [flags]\n * @param {string} [description]\n * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments\n */\n\n version(str, flags, description) {\n if (str === undefined) return this._version;\n this._version = str;\n flags = flags || '-V, --version';\n description = description || 'output the version number';\n const versionOption = this.createOption(flags, description);\n this._versionOptionName = versionOption.attributeName();\n this._registerOption(versionOption);\n\n this.on('option:' + versionOption.name(), () => {\n this._outputConfiguration.writeOut(`${str}\\n`);\n this._exit(0, 'commander.version', str);\n });\n return this;\n }\n\n /**\n * Set the description.\n *\n * @param {string} [str]\n * @param {object} [argsDescription]\n * @return {(string|Command)}\n */\n description(str, argsDescription) {\n if (str === undefined && argsDescription === undefined)\n return this._description;\n this._description = str;\n if (argsDescription) {\n this._argsDescription = argsDescription;\n }\n return this;\n }\n\n /**\n * Set the summary. Used when listed as subcommand of parent.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n summary(str) {\n if (str === undefined) return this._summary;\n this._summary = str;\n return this;\n }\n\n /**\n * Set an alias for the command.\n *\n * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.\n *\n * @param {string} [alias]\n * @return {(string|Command)}\n */\n\n alias(alias) {\n if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility\n\n /** @type {Command} */\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let command = this;\n if (\n this.commands.length !== 0 &&\n this.commands[this.commands.length - 1]._executableHandler\n ) {\n // assume adding alias for last added executable subcommand, rather than this\n command = this.commands[this.commands.length - 1];\n }\n\n if (alias === command._name)\n throw new Error(\"Command alias can't be the same as its name\");\n const matchingCommand = this.parent?._findCommand(alias);\n if (matchingCommand) {\n // c.f. _registerCommand\n const existingCmd = [matchingCommand.name()]\n .concat(matchingCommand.aliases())\n .join('|');\n throw new Error(\n `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,\n );\n }\n\n command._aliases.push(alias);\n return this;\n }\n\n /**\n * Set aliases for the command.\n *\n * Only the first alias is shown in the auto-generated help.\n *\n * @param {string[]} [aliases]\n * @return {(string[]|Command)}\n */\n\n aliases(aliases) {\n // Getter for the array of aliases is the main reason for having aliases() in addition to alias().\n if (aliases === undefined) return this._aliases;\n\n aliases.forEach((alias) => this.alias(alias));\n return this;\n }\n\n /**\n * Set / get the command usage `str`.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n usage(str) {\n if (str === undefined) {\n if (this._usage) return this._usage;\n\n const args = this.registeredArguments.map((arg) => {\n return humanReadableArgName(arg);\n });\n return []\n .concat(\n this.options.length || this._helpOption !== null ? '[options]' : [],\n this.commands.length ? '[command]' : [],\n this.registeredArguments.length ? args : [],\n )\n .join(' ');\n }\n\n this._usage = str;\n return this;\n }\n\n /**\n * Get or set the name of the command.\n *\n * @param {string} [str]\n * @return {(string|Command)}\n */\n\n name(str) {\n if (str === undefined) return this._name;\n this._name = str;\n return this;\n }\n\n /**\n * Set/get the help group heading for this subcommand in parent command's help.\n *\n * @param {string} [heading]\n * @return {Command | string}\n */\n\n helpGroup(heading) {\n if (heading === undefined) return this._helpGroupHeading ?? '';\n this._helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for subcommands added to this command.\n * (This does not override a group set directly on the subcommand using .helpGroup().)\n *\n * @example\n * program.commandsGroup('Development Commands:);\n * program.command('watch')...\n * program.command('lint')...\n * ...\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n commandsGroup(heading) {\n if (heading === undefined) return this._defaultCommandGroup ?? '';\n this._defaultCommandGroup = heading;\n return this;\n }\n\n /**\n * Set/get the default help group heading for options added to this command.\n * (This does not override a group set directly on the option using .helpGroup().)\n *\n * @example\n * program\n * .optionsGroup('Development Options:')\n * .option('-d, --debug', 'output extra debugging')\n * .option('-p, --profile', 'output profiling information')\n *\n * @param {string} [heading]\n * @returns {Command | string}\n */\n optionsGroup(heading) {\n if (heading === undefined) return this._defaultOptionGroup ?? '';\n this._defaultOptionGroup = heading;\n return this;\n }\n\n /**\n * @param {Option} option\n * @private\n */\n _initOptionGroup(option) {\n if (this._defaultOptionGroup && !option.helpGroupHeading)\n option.helpGroup(this._defaultOptionGroup);\n }\n\n /**\n * @param {Command} cmd\n * @private\n */\n _initCommandGroup(cmd) {\n if (this._defaultCommandGroup && !cmd.helpGroup())\n cmd.helpGroup(this._defaultCommandGroup);\n }\n\n /**\n * Set the name of the command from script filename, such as process.argv[1],\n * or import.meta.filename.\n *\n * (Used internally and public although not documented in README.)\n *\n * @example\n * program.nameFromFilename(import.meta.filename);\n *\n * @param {string} filename\n * @return {Command}\n */\n\n nameFromFilename(filename) {\n this._name = path.basename(filename, path.extname(filename));\n\n return this;\n }\n\n /**\n * Get or set the directory for searching for executable subcommands of this command.\n *\n * @example\n * program.executableDir(import.meta.dirname);\n * // or\n * program.executableDir('subcommands');\n *\n * @param {string} [path]\n * @return {(string|null|Command)}\n */\n\n executableDir(path) {\n if (path === undefined) return this._executableDir;\n this._executableDir = path;\n return this;\n }\n\n /**\n * Return program help documentation.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout\n * @return {string}\n */\n\n helpInformation(contextOptions) {\n const helper = this.createHelp();\n const context = this._getOutputContext(contextOptions);\n helper.prepareContext({\n error: context.error,\n helpWidth: context.helpWidth,\n outputHasColors: context.hasColors,\n });\n const text = helper.formatHelp(this, helper);\n if (context.hasColors) return text;\n return this._outputConfiguration.stripColor(text);\n }\n\n /**\n * @typedef HelpContext\n * @type {object}\n * @property {boolean} error\n * @property {number} helpWidth\n * @property {boolean} hasColors\n * @property {function} write - includes stripColor if needed\n *\n * @returns {HelpContext}\n * @private\n */\n\n _getOutputContext(contextOptions) {\n contextOptions = contextOptions || {};\n const error = !!contextOptions.error;\n let baseWrite;\n let hasColors;\n let helpWidth;\n if (error) {\n baseWrite = (str) => this._outputConfiguration.writeErr(str);\n hasColors = this._outputConfiguration.getErrHasColors();\n helpWidth = this._outputConfiguration.getErrHelpWidth();\n } else {\n baseWrite = (str) => this._outputConfiguration.writeOut(str);\n hasColors = this._outputConfiguration.getOutHasColors();\n helpWidth = this._outputConfiguration.getOutHelpWidth();\n }\n const write = (str) => {\n if (!hasColors) str = this._outputConfiguration.stripColor(str);\n return baseWrite(str);\n };\n return { error, write, hasColors, helpWidth };\n }\n\n /**\n * Output help information for this command.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n outputHelp(contextOptions) {\n let deprecatedCallback;\n if (typeof contextOptions === 'function') {\n deprecatedCallback = contextOptions;\n contextOptions = undefined;\n }\n\n const outputContext = this._getOutputContext(contextOptions);\n /** @type {HelpTextEventContext} */\n const eventContext = {\n error: outputContext.error,\n write: outputContext.write,\n command: this,\n };\n\n this._getCommandAndAncestors()\n .reverse()\n .forEach((command) => command.emit('beforeAllHelp', eventContext));\n this.emit('beforeHelp', eventContext);\n\n let helpInformation = this.helpInformation({ error: outputContext.error });\n if (deprecatedCallback) {\n helpInformation = deprecatedCallback(helpInformation);\n if (\n typeof helpInformation !== 'string' &&\n !Buffer.isBuffer(helpInformation)\n ) {\n throw new Error('outputHelp callback must return a string or a Buffer');\n }\n }\n outputContext.write(helpInformation);\n\n if (this._getHelpOption()?.long) {\n this.emit(this._getHelpOption().long); // deprecated\n }\n this.emit('afterHelp', eventContext);\n this._getCommandAndAncestors().forEach((command) =>\n command.emit('afterAllHelp', eventContext),\n );\n }\n\n /**\n * You can pass in flags and a description to customise the built-in help option.\n * Pass in false to disable the built-in help option.\n *\n * @example\n * program.helpOption('-?, --help' 'show help'); // customise\n * program.helpOption(false); // disable\n *\n * @param {(string | boolean)} flags\n * @param {string} [description]\n * @return {Command} `this` command for chaining\n */\n\n helpOption(flags, description) {\n // Support enabling/disabling built-in help option.\n if (typeof flags === 'boolean') {\n if (flags) {\n if (this._helpOption === null) this._helpOption = undefined; // reenable\n if (this._defaultOptionGroup) {\n // make the option to store the group\n this._initOptionGroup(this._getHelpOption());\n }\n } else {\n this._helpOption = null; // disable\n }\n return this;\n }\n\n // Customise flags and description.\n this._helpOption = this.createOption(\n flags ?? '-h, --help',\n description ?? 'display help for command',\n );\n // init group unless lazy create\n if (flags || description) this._initOptionGroup(this._helpOption);\n\n return this;\n }\n\n /**\n * Lazy create help option.\n * Returns null if has been disabled with .helpOption(false).\n *\n * @returns {(Option | null)} the help option\n * @package\n */\n _getHelpOption() {\n // Lazy create help option on demand.\n if (this._helpOption === undefined) {\n this.helpOption(undefined, undefined);\n }\n return this._helpOption;\n }\n\n /**\n * Supply your own option to use for the built-in help option.\n * This is an alternative to using helpOption() to customise the flags and description etc.\n *\n * @param {Option} option\n * @return {Command} `this` command for chaining\n */\n addHelpOption(option) {\n this._helpOption = option;\n this._initOptionGroup(option);\n return this;\n }\n\n /**\n * Output help information and exit.\n *\n * Outputs built-in help, and custom text added using `.addHelpText()`.\n *\n * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout\n */\n\n help(contextOptions) {\n this.outputHelp(contextOptions);\n let exitCode = Number(process.exitCode ?? 0); // process.exitCode does allow a string or an integer, but we prefer just a number\n if (\n exitCode === 0 &&\n contextOptions &&\n typeof contextOptions !== 'function' &&\n contextOptions.error\n ) {\n exitCode = 1;\n }\n // message: do not have all displayed text available so only passing placeholder.\n this._exit(exitCode, 'commander.help', '(outputHelp)');\n }\n\n /**\n * // Do a little typing to coordinate emit and listener for the help text events.\n * @typedef HelpTextEventContext\n * @type {object}\n * @property {boolean} error\n * @property {Command} command\n * @property {function} write\n */\n\n /**\n * Add additional text to be displayed with the built-in help.\n *\n * Position is 'before' or 'after' to affect just this command,\n * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.\n *\n * @param {string} position - before or after built-in help\n * @param {(string | Function)} text - string to add, or a function returning a string\n * @return {Command} `this` command for chaining\n */\n\n addHelpText(position, text) {\n const allowedValues = ['beforeAll', 'before', 'after', 'afterAll'];\n if (!allowedValues.includes(position)) {\n throw new Error(`Unexpected value for position to addHelpText.\nExpecting one of '${allowedValues.join(\"', '\")}'`);\n }\n\n const helpEvent = `${position}Help`;\n this.on(helpEvent, (/** @type {HelpTextEventContext} */ context) => {\n let helpStr;\n if (typeof text === 'function') {\n helpStr = text({ error: context.error, command: context.command });\n } else {\n helpStr = text;\n }\n // Ignore falsy value when nothing to output.\n if (helpStr) {\n context.write(`${helpStr}\\n`);\n }\n });\n return this;\n }\n\n /**\n * Output help information if help flags specified\n *\n * @param {Array} args - array of options to search for help flags\n * @private\n */\n\n _outputHelpIfRequested(args) {\n const helpOption = this._getHelpOption();\n const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));\n if (helpRequested) {\n this.outputHelp();\n // (Do not have all displayed text available so only passing placeholder.)\n this._exit(0, 'commander.helpDisplayed', '(outputHelp)');\n }\n }\n}\n\n/**\n * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command).\n *\n * @param {string[]} args - array of arguments from node.execArgv\n * @returns {string[]}\n * @private\n */\n\nfunction incrementNodeInspectorPort(args) {\n // Testing for these options:\n // --inspect[=[host:]port]\n // --inspect-brk[=[host:]port]\n // --inspect-port=[host:]port\n return args.map((arg) => {\n if (!arg.startsWith('--inspect')) {\n return arg;\n }\n let debugOption;\n let debugHost = '127.0.0.1';\n let debugPort = '9229';\n let match;\n if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {\n // e.g. --inspect\n debugOption = match[1];\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null\n ) {\n debugOption = match[1];\n if (/^\\d+$/.test(match[3])) {\n // e.g. --inspect=1234\n debugPort = match[3];\n } else {\n // e.g. --inspect=localhost\n debugHost = match[3];\n }\n } else if (\n (match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\\d+)$/)) !== null\n ) {\n // e.g. --inspect=localhost:1234\n debugOption = match[1];\n debugHost = match[3];\n debugPort = match[4];\n }\n\n if (debugOption && debugPort !== '0') {\n return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;\n }\n return arg;\n });\n}\n\n/**\n * Exported for using from tests, not otherwise used outside this file.\n *\n * @returns {boolean | undefined}\n * @package\n */\nexport function useColor() {\n // Test for common conventions.\n // NB: the observed behaviour is in combination with how author adds color! For example:\n // - we do not test NODE_DISABLE_COLORS, but util:styletext does\n // - we do test NO_COLOR, but Chalk does not\n //\n // References:\n // https://no-color.org\n // https://bixense.com/clicolors/\n // https://github.com/nodejs/node/blob/0a00217a5f67ef4a22384cfc80eb6dd9a917fdc1/lib/internal/tty.js#L109\n // https://github.com/chalk/supports-color/blob/c214314a14bcb174b12b3014b2b0a8de375029ae/index.js#L33\n // (https://force-color.org recent web page from 2023, does not match major javascript implementations)\n\n if (\n process.env.NO_COLOR ||\n process.env.FORCE_COLOR === '0' ||\n process.env.FORCE_COLOR === 'false'\n )\n return false;\n if (process.env.FORCE_COLOR || process.env.CLICOLOR_FORCE !== undefined)\n return true;\n return undefined;\n}\n","import { humanReadableArgName } from './argument.js';\nimport { stripVTControlCharacters } from 'node:util';\n\n/**\n * TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`\n * https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types\n * @typedef { import(\"./argument.js\").Argument } Argument\n * @typedef { import(\"./command.js\").Command } Command\n * @typedef { import(\"./option.js\").Option } Option\n */\n\n// Although this is a class, methods are static in style to allow override using subclass or just functions.\nexport class Help {\n constructor() {\n this.helpWidth = undefined;\n this.minWidthToWrap = 40;\n this.sortSubcommands = false;\n this.sortOptions = false;\n this.showGlobalOptions = false;\n }\n\n /**\n * prepareContext is called by Commander after applying overrides from `Command.configureHelp()`\n * and just before calling `formatHelp()`.\n *\n * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.\n *\n * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions\n */\n prepareContext(contextOptions) {\n this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;\n }\n\n /**\n * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.\n *\n * @param {Command} cmd\n * @returns {Command[]}\n */\n\n visibleCommands(cmd) {\n const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);\n const helpCommand = cmd._getHelpCommand();\n if (helpCommand && !helpCommand._hidden) {\n visibleCommands.push(helpCommand);\n }\n if (this.sortSubcommands) {\n visibleCommands.sort((a, b) => {\n // @ts-ignore: because overloaded return type\n return a.name().localeCompare(b.name());\n });\n }\n return visibleCommands;\n }\n\n /**\n * Compare options for sort.\n *\n * @param {Option} a\n * @param {Option} b\n * @returns {number}\n */\n compareOptions(a, b) {\n const getSortKey = (option) => {\n // WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.\n return option.short\n ? option.short.replace(/^-/, '')\n : option.long.replace(/^--/, '');\n };\n return getSortKey(a).localeCompare(getSortKey(b));\n }\n\n /**\n * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleOptions(cmd) {\n const visibleOptions = cmd.options.filter((option) => !option.hidden);\n // Built-in help option.\n const helpOption = cmd._getHelpOption();\n if (helpOption && !helpOption.hidden) {\n // Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.\n const removeShort = helpOption.short && cmd._findOption(helpOption.short);\n const removeLong = helpOption.long && cmd._findOption(helpOption.long);\n if (!removeShort && !removeLong) {\n visibleOptions.push(helpOption); // no changes needed\n } else if (helpOption.long && !removeLong) {\n visibleOptions.push(\n cmd.createOption(helpOption.long, helpOption.description),\n );\n } else if (helpOption.short && !removeShort) {\n visibleOptions.push(\n cmd.createOption(helpOption.short, helpOption.description),\n );\n }\n }\n if (this.sortOptions) {\n visibleOptions.sort(this.compareOptions);\n }\n return visibleOptions;\n }\n\n /**\n * Get an array of the visible global options. (Not including help.)\n *\n * @param {Command} cmd\n * @returns {Option[]}\n */\n\n visibleGlobalOptions(cmd) {\n if (!this.showGlobalOptions) return [];\n\n const globalOptions = [];\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n const visibleOptions = ancestorCmd.options.filter(\n (option) => !option.hidden,\n );\n globalOptions.push(...visibleOptions);\n }\n if (this.sortOptions) {\n globalOptions.sort(this.compareOptions);\n }\n return globalOptions;\n }\n\n /**\n * Get an array of the arguments if any have a description.\n *\n * @param {Command} cmd\n * @returns {Argument[]}\n */\n\n visibleArguments(cmd) {\n // Side effect! Apply the legacy descriptions before the arguments are displayed.\n if (cmd._argsDescription) {\n cmd.registeredArguments.forEach((argument) => {\n argument.description =\n argument.description || cmd._argsDescription[argument.name()] || '';\n });\n }\n\n // If there are any arguments with a description then return all the arguments.\n if (cmd.registeredArguments.find((argument) => argument.description)) {\n return cmd.registeredArguments;\n }\n return [];\n }\n\n /**\n * Get the command term to show in the list of subcommands.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandTerm(cmd) {\n // Legacy. Ignores custom usage string, and nested commands.\n const args = cmd.registeredArguments\n .map((arg) => humanReadableArgName(arg))\n .join(' ');\n return (\n cmd._name +\n (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +\n (cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option\n (args ? ' ' + args : '')\n );\n }\n\n /**\n * Get the option term to show in the list of options.\n *\n * @param {Option} option\n * @returns {string}\n */\n\n optionTerm(option) {\n return option.flags;\n }\n\n /**\n * Get the argument term to show in the list of arguments.\n *\n * @param {Argument} argument\n * @returns {string}\n */\n\n argumentTerm(argument) {\n return argument.name();\n }\n\n /**\n * Get the longest command term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestSubcommandTermLength(cmd, helper) {\n return helper.visibleCommands(cmd).reduce((max, command) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleSubcommandTerm(helper.subcommandTerm(command)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the longest option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestOptionTermLength(cmd, helper) {\n return helper.visibleOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest global option term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestGlobalOptionTermLength(cmd, helper) {\n return helper.visibleGlobalOptions(cmd).reduce((max, option) => {\n return Math.max(\n max,\n this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),\n );\n }, 0);\n }\n\n /**\n * Get the longest argument term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n longestArgumentTermLength(cmd, helper) {\n return helper.visibleArguments(cmd).reduce((max, argument) => {\n return Math.max(\n max,\n this.displayWidth(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n ),\n );\n }, 0);\n }\n\n /**\n * Get the command usage to be displayed at the top of the built-in help.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandUsage(cmd) {\n // Usage\n let cmdName = cmd._name;\n if (cmd._aliases[0]) {\n cmdName = cmdName + '|' + cmd._aliases[0];\n }\n let ancestorCmdNames = '';\n for (\n let ancestorCmd = cmd.parent;\n ancestorCmd;\n ancestorCmd = ancestorCmd.parent\n ) {\n ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;\n }\n return ancestorCmdNames + cmdName + ' ' + cmd.usage();\n }\n\n /**\n * Get the description for the command.\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n commandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.description();\n }\n\n /**\n * Get the subcommand summary to show in the list of subcommands.\n * (Fallback to description for backwards compatibility.)\n *\n * @param {Command} cmd\n * @returns {string}\n */\n\n subcommandDescription(cmd) {\n // @ts-ignore: because overloaded return type\n return cmd.summary() || cmd.description();\n }\n\n /**\n * Get the option description to show in the list of options.\n *\n * @param {Option} option\n * @return {string}\n */\n\n optionDescription(option) {\n const extraInfo = [];\n\n if (option.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (option.defaultValue !== undefined) {\n // default for boolean and negated more for programmer than end user,\n // but show true/false for boolean option as may be for hand-rolled env or config processing.\n const showDefault =\n option.required ||\n option.optional ||\n (option.isBoolean() && typeof option.defaultValue === 'boolean');\n if (showDefault) {\n extraInfo.push(\n `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,\n );\n }\n }\n // preset for boolean and negated are more for programmer than end user\n if (option.presetArg !== undefined && option.optional) {\n extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);\n }\n if (option.envVar !== undefined) {\n extraInfo.push(`env: ${option.envVar}`);\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (option.description) {\n return `${option.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n\n return option.description;\n }\n\n /**\n * Get the argument description to show in the list of arguments.\n *\n * @param {Argument} argument\n * @return {string}\n */\n\n argumentDescription(argument) {\n const extraInfo = [];\n if (argument.argChoices) {\n extraInfo.push(\n // use stringify to match the display of the default value\n `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,\n );\n }\n if (argument.defaultValue !== undefined) {\n extraInfo.push(\n `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,\n );\n }\n if (extraInfo.length > 0) {\n const extraDescription = `(${extraInfo.join(', ')})`;\n if (argument.description) {\n return `${argument.description} ${extraDescription}`;\n }\n return extraDescription;\n }\n return argument.description;\n }\n\n /**\n * Format a list of items, given a heading and an array of formatted items.\n *\n * @param {string} heading\n * @param {string[]} items\n * @param {Help} helper\n * @returns string[]\n */\n formatItemList(heading, items, helper) {\n if (items.length === 0) return [];\n\n return [helper.styleTitle(heading), ...items, ''];\n }\n\n /**\n * Group items by their help group heading.\n *\n * @param {Command[] | Option[]} unsortedItems\n * @param {Command[] | Option[]} visibleItems\n * @param {Function} getGroup\n * @returns {Map<string, Command[] | Option[]>}\n */\n groupItems(unsortedItems, visibleItems, getGroup) {\n const result = new Map();\n // Add groups in order of appearance in unsortedItems.\n unsortedItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) result.set(group, []);\n });\n // Add items in order of appearance in visibleItems.\n visibleItems.forEach((item) => {\n const group = getGroup(item);\n if (!result.has(group)) {\n result.set(group, []);\n }\n result.get(group).push(item);\n });\n return result;\n }\n\n /**\n * Generate the built-in help text.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {string}\n */\n\n formatHelp(cmd, helper) {\n const termWidth = helper.padWidth(cmd, helper);\n const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called\n\n function callFormatItem(term, description) {\n return helper.formatItem(term, termWidth, description, helper);\n }\n\n // Usage\n let output = [\n `${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,\n '',\n ];\n\n // Description\n const commandDescription = helper.commandDescription(cmd);\n if (commandDescription.length > 0) {\n output = output.concat([\n helper.boxWrap(\n helper.styleCommandDescription(commandDescription),\n helpWidth,\n ),\n '',\n ]);\n }\n\n // Arguments\n const argumentList = helper.visibleArguments(cmd).map((argument) => {\n return callFormatItem(\n helper.styleArgumentTerm(helper.argumentTerm(argument)),\n helper.styleArgumentDescription(helper.argumentDescription(argument)),\n );\n });\n output = output.concat(\n this.formatItemList('Arguments:', argumentList, helper),\n );\n\n // Options\n const optionGroups = this.groupItems(\n cmd.options,\n helper.visibleOptions(cmd),\n (option) => option.helpGroupHeading ?? 'Options:',\n );\n optionGroups.forEach((options, group) => {\n const optionList = options.map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(this.formatItemList(group, optionList, helper));\n });\n\n if (helper.showGlobalOptions) {\n const globalOptionList = helper\n .visibleGlobalOptions(cmd)\n .map((option) => {\n return callFormatItem(\n helper.styleOptionTerm(helper.optionTerm(option)),\n helper.styleOptionDescription(helper.optionDescription(option)),\n );\n });\n output = output.concat(\n this.formatItemList('Global Options:', globalOptionList, helper),\n );\n }\n\n // Commands\n const commandGroups = this.groupItems(\n cmd.commands,\n helper.visibleCommands(cmd),\n (sub) => sub.helpGroup() || 'Commands:',\n );\n commandGroups.forEach((commands, group) => {\n const commandList = commands.map((sub) => {\n return callFormatItem(\n helper.styleSubcommandTerm(helper.subcommandTerm(sub)),\n helper.styleSubcommandDescription(helper.subcommandDescription(sub)),\n );\n });\n output = output.concat(this.formatItemList(group, commandList, helper));\n });\n\n return output.join('\\n');\n }\n\n /**\n * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.\n *\n * @param {string} str\n * @returns {number}\n */\n displayWidth(str) {\n return stripVTControlCharacters(str).length;\n }\n\n /**\n * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.\n *\n * @param {string} str\n * @returns {string}\n */\n styleTitle(str) {\n return str;\n }\n\n styleUsage(str) {\n // Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:\n // command subcommand [options] [command] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word === '[command]') return this.styleSubcommandText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleCommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleCommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleOptionDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleSubcommandDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleArgumentDescription(str) {\n return this.styleDescriptionText(str);\n }\n styleDescriptionText(str) {\n return str;\n }\n styleOptionTerm(str) {\n return this.styleOptionText(str);\n }\n styleSubcommandTerm(str) {\n // This is very like usage with lots of parts! Assume default string which is formed like:\n // subcommand [options] <foo> [bar]\n return str\n .split(' ')\n .map((word) => {\n if (word === '[options]') return this.styleOptionText(word);\n if (word[0] === '[' || word[0] === '<')\n return this.styleArgumentText(word);\n return this.styleSubcommandText(word); // Restrict to initial words?\n })\n .join(' ');\n }\n styleArgumentTerm(str) {\n return this.styleArgumentText(str);\n }\n styleOptionText(str) {\n return str;\n }\n styleArgumentText(str) {\n return str;\n }\n styleSubcommandText(str) {\n return str;\n }\n styleCommandText(str) {\n return str;\n }\n\n /**\n * Calculate the pad width from the maximum term length.\n *\n * @param {Command} cmd\n * @param {Help} helper\n * @returns {number}\n */\n\n padWidth(cmd, helper) {\n return Math.max(\n helper.longestOptionTermLength(cmd, helper),\n helper.longestGlobalOptionTermLength(cmd, helper),\n helper.longestSubcommandTermLength(cmd, helper),\n helper.longestArgumentTermLength(cmd, helper),\n );\n }\n\n /**\n * Detect manually wrapped and indented strings by checking for line break followed by whitespace.\n *\n * @param {string} str\n * @returns {boolean}\n */\n preformatted(str) {\n return /\\n[^\\S\\r\\n]/.test(str);\n }\n\n /**\n * Format the \"item\", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.\n *\n * So \"TTT\", 5, \"DDD DDDD DD DDD\" might be formatted for this.helpWidth=17 like so:\n * TTT DDD DDDD\n * DD DDD\n *\n * @param {string} term\n * @param {number} termWidth\n * @param {string} description\n * @param {Help} helper\n * @returns {string}\n */\n formatItem(term, termWidth, description, helper) {\n const itemIndent = 2;\n const itemIndentStr = ' '.repeat(itemIndent);\n if (!description) return itemIndentStr + term;\n\n // Pad the term out to a consistent width, so descriptions are aligned.\n const paddedTerm = term.padEnd(\n termWidth + term.length - helper.displayWidth(term),\n );\n\n // Format the description.\n const spacerWidth = 2; // between term and description\n const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called\n const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;\n let formattedDescription;\n if (\n remainingWidth < this.minWidthToWrap ||\n helper.preformatted(description)\n ) {\n formattedDescription = description;\n } else {\n const wrappedDescription = helper.boxWrap(description, remainingWidth);\n formattedDescription = wrappedDescription.replace(\n /\\n/g,\n '\\n' + ' '.repeat(termWidth + spacerWidth),\n );\n }\n\n // Construct and overall indent.\n return (\n itemIndentStr +\n paddedTerm +\n ' '.repeat(spacerWidth) +\n formattedDescription.replace(/\\n/g, `\\n${itemIndentStr}`)\n );\n }\n\n /**\n * Wrap a string at whitespace, preserving existing line breaks.\n * Wrapping is skipped if the width is less than `minWidthToWrap`.\n *\n * @param {string} str\n * @param {number} width\n * @returns {string}\n */\n boxWrap(str, width) {\n if (width < this.minWidthToWrap) return str;\n\n const rawLines = str.split(/\\r\\n|\\n/);\n // split up text by whitespace\n const chunkPattern = /[\\s]*[^\\s]+/g;\n const wrappedLines = [];\n rawLines.forEach((line) => {\n const chunks = line.match(chunkPattern);\n if (chunks === null) {\n wrappedLines.push('');\n return;\n }\n\n let sumChunks = [chunks.shift()];\n let sumWidth = this.displayWidth(sumChunks[0]);\n chunks.forEach((chunk) => {\n const visibleWidth = this.displayWidth(chunk);\n // Accumulate chunks while they fit into width.\n if (sumWidth + visibleWidth <= width) {\n sumChunks.push(chunk);\n sumWidth += visibleWidth;\n return;\n }\n wrappedLines.push(sumChunks.join(''));\n\n const nextChunk = chunk.trimStart(); // trim space at line break\n sumChunks = [nextChunk];\n sumWidth = this.displayWidth(nextChunk);\n });\n wrappedLines.push(sumChunks.join(''));\n });\n\n return wrappedLines.join('\\n');\n }\n}\n","import { InvalidArgumentError } from './error.js';\n\nexport class Option {\n /**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {string} flags\n * @param {string} [description]\n */\n\n constructor(flags, description) {\n this.flags = flags;\n this.description = description || '';\n\n this.required = flags.includes('<'); // A value must be supplied when the option is specified.\n this.optional = flags.includes('['); // A value is optional when the option is specified.\n // variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument\n this.variadic = /\\w\\.\\.\\.[>\\]]$/.test(flags); // The option can take multiple values.\n this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.\n const optionFlags = splitOptionFlags(flags);\n this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).\n this.long = optionFlags.longFlag;\n this.negate = false;\n if (this.long) {\n this.negate = this.long.startsWith('--no-');\n }\n this.defaultValue = undefined;\n this.defaultValueDescription = undefined;\n this.presetArg = undefined;\n this.envVar = undefined;\n this.parseArg = undefined;\n this.hidden = false;\n this.argChoices = undefined;\n this.conflictsWith = [];\n this.implied = undefined;\n this.helpGroupHeading = undefined; // soft initialised when option added to command\n }\n\n /**\n * Set the default value, and optionally supply the description to be displayed in the help.\n *\n * @param {*} value\n * @param {string} [description]\n * @return {Option}\n */\n\n default(value, description) {\n this.defaultValue = value;\n this.defaultValueDescription = description;\n return this;\n }\n\n /**\n * Preset to use when option used without option-argument, especially optional but also boolean and negated.\n * The custom processing (parseArg) is called.\n *\n * @example\n * new Option('--color').default('GREYSCALE').preset('RGB');\n * new Option('--donate [amount]').preset('20').argParser(parseFloat);\n *\n * @param {*} arg\n * @return {Option}\n */\n\n preset(arg) {\n this.presetArg = arg;\n return this;\n }\n\n /**\n * Add option name(s) that conflict with this option.\n * An error will be displayed if conflicting options are found during parsing.\n *\n * @example\n * new Option('--rgb').conflicts('cmyk');\n * new Option('--js').conflicts(['ts', 'jsx']);\n *\n * @param {(string | string[])} names\n * @return {Option}\n */\n\n conflicts(names) {\n this.conflictsWith = this.conflictsWith.concat(names);\n return this;\n }\n\n /**\n * Specify implied option values for when this option is set and the implied options are not.\n *\n * The custom processing (parseArg) is not called on the implied values.\n *\n * @example\n * program\n * .addOption(new Option('--log', 'write logging information to file'))\n * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));\n *\n * @param {object} impliedOptionValues\n * @return {Option}\n */\n implies(impliedOptionValues) {\n let newImplied = impliedOptionValues;\n if (typeof impliedOptionValues === 'string') {\n // string is not documented, but easy mistake and we can do what user probably intended.\n newImplied = { [impliedOptionValues]: true };\n }\n this.implied = Object.assign(this.implied || {}, newImplied);\n return this;\n }\n\n /**\n * Set environment variable to check for option value.\n *\n * An environment variable is only used if when processed the current option value is\n * undefined, or the source of the current value is 'default' or 'config' or 'env'.\n *\n * @param {string} name\n * @return {Option}\n */\n\n env(name) {\n this.envVar = name;\n return this;\n }\n\n /**\n * Set the custom handler for processing CLI option arguments into option values.\n *\n * @param {Function} [fn]\n * @return {Option}\n */\n\n argParser(fn) {\n this.parseArg = fn;\n return this;\n }\n\n /**\n * Whether the option is mandatory and must have a value after parsing.\n *\n * @param {boolean} [mandatory=true]\n * @return {Option}\n */\n\n makeOptionMandatory(mandatory = true) {\n this.mandatory = !!mandatory;\n return this;\n }\n\n /**\n * Hide option in help.\n *\n * @param {boolean} [hide=true]\n * @return {Option}\n */\n\n hideHelp(hide = true) {\n this.hidden = !!hide;\n return this;\n }\n\n /**\n * @package\n */\n\n _collectValue(value, previous) {\n if (previous === this.defaultValue || !Array.isArray(previous)) {\n return [value];\n }\n\n previous.push(value);\n return previous;\n }\n\n /**\n * Only allow option value to be one of choices.\n *\n * @param {string[]} values\n * @return {Option}\n */\n\n choices(values) {\n this.argChoices = values.slice();\n this.parseArg = (arg, previous) => {\n if (!this.argChoices.includes(arg)) {\n throw new InvalidArgumentError(\n `Allowed choices are ${this.argChoices.join(', ')}.`,\n );\n }\n if (this.variadic) {\n return this._collectValue(arg, previous);\n }\n return arg;\n };\n return this;\n }\n\n /**\n * Return option name.\n *\n * @return {string}\n */\n\n name() {\n if (this.long) {\n return this.long.replace(/^--/, '');\n }\n return this.short.replace(/^-/, '');\n }\n\n /**\n * Return option name, in a camelcase format that can be used\n * as an object attribute key.\n *\n * @return {string}\n */\n\n attributeName() {\n if (this.negate) {\n return camelcase(this.name().replace(/^no-/, ''));\n }\n return camelcase(this.name());\n }\n\n /**\n * Set the help group heading.\n *\n * @param {string} heading\n * @return {Option}\n */\n helpGroup(heading) {\n this.helpGroupHeading = heading;\n return this;\n }\n\n /**\n * Check if `arg` matches the short or long flag.\n *\n * @param {string} arg\n * @return {boolean}\n * @package\n */\n\n is(arg) {\n return this.short === arg || this.long === arg;\n }\n\n /**\n * Return whether a boolean option.\n *\n * Options are one of boolean, negated, required argument, or optional argument.\n *\n * @return {boolean}\n * @package\n */\n\n isBoolean() {\n return !this.required && !this.optional && !this.negate;\n }\n}\n\n/**\n * This class is to make it easier to work with dual options, without changing the existing\n * implementation. We support separate dual options for separate positive and negative options,\n * like `--build` and `--no-build`, which share a single option value. This works nicely for some\n * use cases, but is tricky for others where we want separate behaviours despite\n * the single shared option value.\n */\nexport class DualOptions {\n /**\n * @param {Option[]} options\n */\n constructor(options) {\n this.positiveOptions = new Map();\n this.negativeOptions = new Map();\n this.dualOptions = new Set();\n options.forEach((option) => {\n if (option.negate) {\n this.negativeOptions.set(option.attributeName(), option);\n } else {\n this.positiveOptions.set(option.attributeName(), option);\n }\n });\n this.negativeOptions.forEach((value, key) => {\n if (this.positiveOptions.has(key)) {\n this.dualOptions.add(key);\n }\n });\n }\n\n /**\n * Did the value come from the option, and not from possible matching dual option?\n *\n * @param {*} value\n * @param {Option} option\n * @returns {boolean}\n */\n valueFromOption(value, option) {\n const optionKey = option.attributeName();\n if (!this.dualOptions.has(optionKey)) return true;\n\n // Use the value to deduce if (probably) came from the option.\n const preset = this.negativeOptions.get(optionKey).presetArg;\n const negativeValue = preset !== undefined ? preset : false;\n return option.negate === (negativeValue === value);\n }\n}\n\n/**\n * Convert string from kebab-case to camelCase.\n *\n * @param {string} str\n * @return {string}\n * @private\n */\n\nfunction camelcase(str) {\n return str.split('-').reduce((str, word) => {\n return str + word[0].toUpperCase() + word.slice(1);\n });\n}\n\n/**\n * Split the short and long flag out of something like '-m,--mixed <value>'\n *\n * @private\n */\n\nfunction splitOptionFlags(flags) {\n let shortFlag;\n let longFlag;\n // short flag, single dash and single character\n const shortFlagExp = /^-[^-]$/;\n // long flag, double dash and at least one character\n const longFlagExp = /^--[^-]/;\n\n const flagParts = flags.split(/[ |,]+/).concat('guard');\n // Normal is short and/or long.\n if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();\n if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();\n // Long then short. Rarely used but fine.\n if (!shortFlag && shortFlagExp.test(flagParts[0]))\n shortFlag = flagParts.shift();\n // Allow two long flags, like '--ws, --workspace'\n // This is the supported way to have a shortish option flag.\n if (!shortFlag && longFlagExp.test(flagParts[0])) {\n shortFlag = longFlag;\n longFlag = flagParts.shift();\n }\n\n // Check for unprocessed flag. Fail noisily rather than silently ignore.\n if (flagParts[0].startsWith('-')) {\n const unsupportedFlag = flagParts[0];\n const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;\n if (/^-[^-][^-]/.test(unsupportedFlag))\n throw new Error(\n `${baseError}\n- a short flag is a single dash and a single character\n - either use a single dash and a single character (for a short flag)\n - or use a double dash for a long option (and can have two, like '--ws, --workspace')`,\n );\n if (shortFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many short flags`);\n if (longFlagExp.test(unsupportedFlag))\n throw new Error(`${baseError}\n- too many long flags`);\n\n throw new Error(`${baseError}\n- unrecognised flag format`);\n }\n if (shortFlag === undefined && longFlag === undefined)\n throw new Error(\n `option creation failed due to no flags found in '${flags}'.`,\n );\n\n return { shortFlag, longFlag };\n}\n","const maxDistance = 3;\n\nfunction editDistance(a, b) {\n // https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance\n // Calculating optimal string alignment distance, no substring is edited more than once.\n // (Simple implementation.)\n\n // Quick early exit, return worst case.\n if (Math.abs(a.length - b.length) > maxDistance)\n return Math.max(a.length, b.length);\n\n // distance between prefix substrings of a and b\n const d = [];\n\n // pure deletions turn a into empty string\n for (let i = 0; i <= a.length; i++) {\n d[i] = [i];\n }\n // pure insertions turn empty string into b\n for (let j = 0; j <= b.length; j++) {\n d[0][j] = j;\n }\n\n // fill matrix\n for (let j = 1; j <= b.length; j++) {\n for (let i = 1; i <= a.length; i++) {\n let cost;\n if (a[i - 1] === b[j - 1]) {\n cost = 0;\n } else {\n cost = 1;\n }\n d[i][j] = Math.min(\n d[i - 1][j] + 1, // deletion\n d[i][j - 1] + 1, // insertion\n d[i - 1][j - 1] + cost, // substitution\n );\n // transposition\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {\n d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);\n }\n }\n }\n\n return d[a.length][b.length];\n}\n\n/**\n * Find close matches, restricted to same number of edits.\n *\n * @param {string} word\n * @param {string[]} candidates\n * @returns {string}\n */\n\nexport function suggestSimilar(word, candidates) {\n if (!candidates || candidates.length === 0) return '';\n // remove possible duplicates\n candidates = Array.from(new Set(candidates));\n\n const searchingOptions = word.startsWith('--');\n if (searchingOptions) {\n word = word.slice(2);\n candidates = candidates.map((candidate) => candidate.slice(2));\n }\n\n let similar = [];\n let bestDistance = maxDistance;\n const minSimilarity = 0.4;\n candidates.forEach((candidate) => {\n if (candidate.length <= 1) return; // no one character guesses\n\n const distance = editDistance(word, candidate);\n const length = Math.max(word.length, candidate.length);\n const similarity = (length - distance) / length;\n if (similarity > minSimilarity) {\n if (distance < bestDistance) {\n // better edit distance, throw away previous worse matches\n bestDistance = distance;\n similar = [candidate];\n } else if (distance === bestDistance) {\n similar.push(candidate);\n }\n }\n });\n\n similar.sort((a, b) => a.localeCompare(b));\n if (searchingOptions) {\n similar = similar.map((candidate) => `--${candidate}`);\n }\n\n if (similar.length > 1) {\n return `\\n(Did you mean one of ${similar.join(', ')}?)`;\n }\n if (similar.length === 1) {\n return `\\n(Did you mean ${similar[0]}?)`;\n }\n return '';\n}\n","import { Argument } from './lib/argument.js';\nimport { Command } from './lib/command.js';\nimport { CommanderError, InvalidArgumentError } from './lib/error.js';\nimport { Help } from './lib/help.js';\nimport { Option } from './lib/option.js';\n\nexport const program = new Command();\n\nexport const createCommand = (name) => new Command(name);\nexport const createOption = (flags, description) =>\n new Option(flags, description);\nexport const createArgument = (name, description) =>\n new Argument(name, description);\n\n/**\n * Expose classes\n */\n\nexport { Command, Option, Argument, Help };\nexport { CommanderError, InvalidArgumentError };\nexport { InvalidArgumentError as InvalidOptionArgumentError }; // Deprecated\n","import { readdir } from \"node:fs/promises\";\nimport type { Context } from \"../core/context.js\";\nimport { RefusedFileError, readRegularFileIfExists } from \"../core/files.js\";\nimport {\n gitIgnoresAgemonState,\n gitignoreListsAgemonState,\n} from \"../core/gitignore.js\";\nimport {\n hasGitEntry,\n resolveInsideRepo,\n resolveRepoDirectory,\n} from \"../core/repo-paths.js\";\nimport { runRepositoryGit } from \"../core/repository-git.js\";\nimport { TRUNCATION_MARKER } from \"../core/subprocess-runner.js\";\nimport { printable } from \"../core/untrusted-text.js\";\nimport { isDenylistedPath } from \"./redact.js\";\n\nconst GIT_ERROR_MAX_CHARACTERS = 200;\n\nexport const ROOT_RULE_FILES = [\n \"AGENTS.md\",\n \"CLAUDE.md\",\n \"GEMINI.md\",\n \".cursorrules\",\n \".windsurfrules\",\n] as const;\n\nexport const STRUCTURED_CONFIG_FILES = [\n \".mcp.json\",\n \".claude/settings.json\",\n \".gemini/settings.json\",\n] as const;\n\nconst ROOT_COPILOT_INSTRUCTION_FILE = \".github/copilot-instructions.md\";\nconst SCOPED_COPILOT_INSTRUCTION_DIRECTORY = \".github/instructions\";\nconst SCOPED_COPILOT_INSTRUCTION_SUFFIX = \".instructions.md\";\n\nexport type IsolationStatus = \"ignored\" | \"not-ignored\" | \"no-gitignore-file\";\n\nexport interface RuleFileResource {\n kind: \"rule-file\";\n path: string;\n exists: boolean;\n contents: string | null;\n}\n\nexport interface CopilotInstructionResource {\n kind: \"copilot-instruction\";\n path: string;\n exists: boolean;\n}\n\nexport interface StructuredConfigResource {\n kind: \"structured-config\";\n path: string;\n exists: boolean;\n parsed: unknown;\n parseError: string | null;\n denylisted: boolean;\n}\n\nexport interface BinaryResource {\n kind: \"binary\";\n name: string;\n present: boolean;\n}\n\nexport interface WorkspaceIsolation {\n status: IsolationStatus;\n trackedAgemonPaths: string[];\n trackingCheckError: string | null;\n}\n\nexport interface DiscoveryResult {\n ruleFiles: RuleFileResource[];\n copilotInstructions: CopilotInstructionResource[];\n structuredConfigs: StructuredConfigResource[];\n binaries: BinaryResource[];\n isolation: WorkspaceIsolation;\n}\n\ntype RepoFileRead =\n | { exists: false; contents: null; refusal: null }\n | { exists: true; contents: string; refusal: null }\n | { exists: true; contents: null; refusal: string };\n\nasync function readRepoFile(\n cwd: string,\n relativePath: string,\n): Promise<RepoFileRead> {\n try {\n const contents = await readRegularFileIfExists(\n await resolveInsideRepo(cwd, relativePath),\n );\n return contents === null\n ? { exists: false, contents: null, refusal: null }\n : { exists: true, contents, refusal: null };\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return { exists: true, contents: null, refusal: error.message };\n }\n throw error;\n }\n}\n\nasync function discoverStructuredConfig(\n cwd: string,\n relativePath: string,\n): Promise<StructuredConfigResource> {\n const { exists, contents, refusal } = await readRepoFile(cwd, relativePath);\n if (!exists) {\n return {\n kind: \"structured-config\",\n path: relativePath,\n exists: false,\n parsed: null,\n parseError: null,\n denylisted: false,\n };\n }\n\n if (refusal !== null) {\n return {\n kind: \"structured-config\",\n path: relativePath,\n exists: true,\n parsed: null,\n parseError: `not read: ${printable(refusal)}`,\n denylisted: false,\n };\n }\n\n if (isDenylistedPath(relativePath)) {\n return {\n kind: \"structured-config\",\n path: relativePath,\n exists: true,\n parsed: null,\n parseError: null,\n denylisted: true,\n };\n }\n\n try {\n return {\n kind: \"structured-config\",\n path: relativePath,\n exists: true,\n parsed: JSON.parse(contents),\n parseError: null,\n denylisted: false,\n };\n } catch (error) {\n return {\n kind: \"structured-config\",\n path: relativePath,\n exists: true,\n parsed: null,\n parseError: error instanceof Error ? error.message : String(error),\n denylisted: false,\n };\n }\n}\n\nasync function discoverScopedCopilotInstructions(\n cwd: string,\n): Promise<CopilotInstructionResource[]> {\n let entries: string[];\n try {\n const instructionDirectory = await resolveRepoDirectory(\n cwd,\n SCOPED_COPILOT_INSTRUCTION_DIRECTORY,\n );\n if (instructionDirectory === null) {\n return [];\n }\n entries = await readdir(instructionDirectory);\n } catch {\n return [];\n }\n\n return entries\n .filter((entry) => entry.endsWith(SCOPED_COPILOT_INSTRUCTION_SUFFIX))\n .sort()\n .map((entry) => ({\n kind: \"copilot-instruction\" as const,\n path: `${SCOPED_COPILOT_INSTRUCTION_DIRECTORY}/${entry}`,\n exists: true,\n }));\n}\n\nasync function discoverCopilotInstructions(\n cwd: string,\n): Promise<CopilotInstructionResource[]> {\n const instructions: CopilotInstructionResource[] = [];\n\n if ((await readRepoFile(cwd, ROOT_COPILOT_INSTRUCTION_FILE)).exists) {\n instructions.push({\n kind: \"copilot-instruction\",\n path: ROOT_COPILOT_INSTRUCTION_FILE,\n exists: true,\n });\n }\n\n instructions.push(...(await discoverScopedCopilotInstructions(cwd)));\n return instructions;\n}\n\ninterface IsolationCheck {\n status: IsolationStatus;\n gitCheckError: string | null;\n}\n\nasync function checkIsolation(cwd: string): Promise<IsolationCheck> {\n const { exists, contents } = await readRepoFile(cwd, \".gitignore\");\n if (!exists) {\n return { status: \"no-gitignore-file\", gitCheckError: null };\n }\n if (contents === null || !gitignoreListsAgemonState(contents)) {\n return { status: \"not-ignored\", gitCheckError: null };\n }\n const verdict = await gitIgnoresAgemonState(cwd);\n if (verdict.kind === \"failed\") {\n return {\n status: \"not-ignored\",\n gitCheckError: `could not ask git whether .agemon/ is ignored: ${describeGitFailure(verdict.detail)}`,\n };\n }\n return {\n status:\n verdict.kind === \"ignored\" || verdict.kind === \"not-a-repository\"\n ? \"ignored\"\n : \"not-ignored\",\n gitCheckError: null,\n };\n}\n\nexport async function readIsolationStatus(\n cwd: string,\n): Promise<IsolationStatus> {\n return (await checkIsolation(cwd)).status;\n}\n\ninterface TrackedAgemonPaths {\n trackedAgemonPaths: string[];\n trackingCheckError: string | null;\n}\n\nfunction describeGitFailure(text: string): string {\n const lastLine = text.trim().split(/\\r?\\n/).at(-1) ?? \"\";\n return printable(lastLine).slice(0, GIT_ERROR_MAX_CHARACTERS);\n}\n\nasync function listTrackedAgemonPaths(\n cwd: string,\n): Promise<TrackedAgemonPaths> {\n const result = await runRepositoryGit(cwd, [\"ls-files\", \"--\", \".agemon\"]);\n const failure =\n result.code !== 0\n ? describeGitFailure(result.stderr || \"git failed\")\n : result.stdout.endsWith(TRUNCATION_MARKER)\n ? \"git ls-files output exceeded the capture limit\"\n : null;\n if (failure !== null) {\n return {\n trackedAgemonPaths: [],\n trackingCheckError: (await hasGitEntry(cwd))\n ? `could not check whether .agemon/ is tracked by git: ${failure}`\n : null,\n };\n }\n return {\n trackedAgemonPaths: result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0),\n trackingCheckError: null,\n };\n}\n\nfunction joinGitCheckErrors(...errors: Array<string | null>): string | null {\n const reported = errors.filter((error): error is string => error !== null);\n return reported.length === 0 ? null : reported.join(\"; \");\n}\n\nexport async function discoverRepository(\n ctx: Context,\n): Promise<DiscoveryResult> {\n const ruleFiles = await Promise.all(\n ROOT_RULE_FILES.map(async (relativePath) => {\n const { exists, contents } = await readRepoFile(ctx.cwd, relativePath);\n return {\n kind: \"rule-file\" as const,\n path: relativePath,\n exists,\n contents,\n };\n }),\n );\n\n const structuredConfigs = await Promise.all(\n STRUCTURED_CONFIG_FILES.map((relativePath) =>\n discoverStructuredConfig(ctx.cwd, relativePath),\n ),\n );\n\n const isolationCheck = await checkIsolation(ctx.cwd);\n const tracked = await listTrackedAgemonPaths(ctx.cwd);\n return {\n ruleFiles,\n copilotInstructions: await discoverCopilotInstructions(ctx.cwd),\n structuredConfigs,\n binaries: ctx.binaries.map((binary) => ({\n kind: \"binary\" as const,\n name: binary.name,\n present: binary.present,\n })),\n isolation: {\n status: isolationCheck.status,\n trackedAgemonPaths: tracked.trackedAgemonPaths,\n trackingCheckError: joinGitCheckErrors(\n isolationCheck.gitCheckError,\n tracked.trackingCheckError,\n ),\n },\n };\n}\n","import { join } from \"node:path\";\nimport { readRegularFileIfExists, writeFileAtomic } from \"./files.js\";\nimport { hasGitEntry } from \"./repo-paths.js\";\nimport { runRepositoryGit } from \"./repository-git.js\";\nimport {\n describeSubprocessFailure,\n isSpawnFailure,\n} from \"./subprocess-runner.js\";\n\nconst GITIGNORE_FILENAME = \".gitignore\";\nexport const AGEMON_GITIGNORE_ENTRY = \"/.agemon/\";\nexport const SKILLS_LOCK_GITIGNORE_ENTRY = \"/skills-lock.json\";\nconst GIT_CHECK_IGNORE_IGNORED = 0;\nconst GIT_CHECK_IGNORE_NOT_IGNORED = 1;\n\nexport type AgemonStateIgnoreVerdict =\n | { kind: \"ignored\" }\n | { kind: \"not-ignored\" }\n | { kind: \"not-a-repository\" }\n | { kind: \"failed\"; detail: string };\n\nfunction normalizeIgnoreLine(line: string): string {\n return line.trim().replace(/^\\//, \"\").replace(/\\/$/, \"\");\n}\n\nexport function gitignoreListsEntry(contents: string, entry: string): boolean {\n const normalizedEntry = normalizeIgnoreLine(entry);\n return contents\n .split(/\\r?\\n/)\n .some((line) => normalizeIgnoreLine(line) === normalizedEntry);\n}\n\nexport function gitignoreListsAgemonState(contents: string): boolean {\n return gitignoreListsEntry(contents, AGEMON_GITIGNORE_ENTRY);\n}\n\nexport async function gitIgnoresAgemonState(\n cwd: string,\n): Promise<AgemonStateIgnoreVerdict> {\n const result = await runRepositoryGit(cwd, [\n \"check-ignore\",\n \"-q\",\n \"--no-index\",\n \"--\",\n \".agemon/\",\n ]);\n if (!isSpawnFailure(result)) {\n if (result.code === GIT_CHECK_IGNORE_IGNORED) {\n return { kind: \"ignored\" };\n }\n if (result.code === GIT_CHECK_IGNORE_NOT_IGNORED) {\n return { kind: \"not-ignored\" };\n }\n }\n if (!(await hasGitEntry(cwd))) {\n return { kind: \"not-a-repository\" };\n }\n return {\n kind: \"failed\",\n detail: describeSubprocessFailure(result, \"git check-ignore\"),\n };\n}\n\nasync function appendGitignoreEntry(\n gitignorePath: string,\n contents: string | null,\n entry: string,\n): Promise<void> {\n if (contents === null) {\n await writeFileAtomic(gitignorePath, `${entry}\\n`);\n return;\n }\n const newline = contents.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const separator =\n contents.length === 0 || contents.endsWith(\"\\n\") ? \"\" : newline;\n await writeFileAtomic(\n gitignorePath,\n `${contents}${separator}${entry}${newline}`,\n );\n}\n\nexport interface GitignoreWrite {\n added: boolean;\n existedBefore: boolean;\n contentsBefore: string | null;\n}\n\nasync function appendUnlessCovered(\n cwd: string,\n entry: string,\n isCovered: (contents: string) => boolean,\n): Promise<GitignoreWrite> {\n const gitignorePath = join(cwd, GITIGNORE_FILENAME);\n const contents = await readRegularFileIfExists(gitignorePath);\n const before = { existedBefore: contents !== null, contentsBefore: contents };\n if (contents !== null && isCovered(contents)) {\n return { added: false, ...before };\n }\n await appendGitignoreEntry(gitignorePath, contents, entry);\n return { added: true, ...before };\n}\n\nexport function ensureGitignoreEntry(\n cwd: string,\n entry: string,\n): Promise<GitignoreWrite> {\n return appendUnlessCovered(cwd, entry, (contents) =>\n gitignoreListsEntry(contents, entry),\n );\n}\n\nfunction lastRuleIsEntry(contents: string, entry: string): boolean {\n const lastRule = contents\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line !== \"\" && !line.startsWith(\"#\"))\n .at(-1);\n return (\n lastRule !== undefined &&\n normalizeIgnoreLine(lastRule) === normalizeIgnoreLine(entry)\n );\n}\n\nexport function writeAgemonGitignoreEntry(\n cwd: string,\n): Promise<GitignoreWrite> {\n return appendUnlessCovered(cwd, AGEMON_GITIGNORE_ENTRY, (contents) =>\n lastRuleIsEntry(contents, AGEMON_GITIGNORE_ENTRY),\n );\n}\n","import {\n runRealSubprocess,\n type SubprocessResult,\n} from \"./subprocess-runner.js\";\n\nconst REPOSITORY_GIT_TIMEOUT_MS = 5_000;\n\nexport const HARDENED_GIT_ARGS = [\n \"-c\",\n \"core.fsmonitor=false\",\n \"-c\",\n \"core.hooksPath=/dev/null\",\n] as const;\n\nexport const REPOSITORY_LOCAL_GIT_VARIABLES = [\n \"GIT_ALTERNATE_OBJECT_DIRECTORIES\",\n \"GIT_CONFIG\",\n \"GIT_CONFIG_PARAMETERS\",\n \"GIT_CONFIG_COUNT\",\n \"GIT_OBJECT_DIRECTORY\",\n \"GIT_DIR\",\n \"GIT_WORK_TREE\",\n \"GIT_IMPLICIT_WORK_TREE\",\n \"GIT_GRAFT_FILE\",\n \"GIT_INDEX_FILE\",\n \"GIT_NO_REPLACE_OBJECTS\",\n \"GIT_REPLACE_REF_BASE\",\n \"GIT_PREFIX\",\n \"GIT_SHALLOW_FILE\",\n \"GIT_COMMON_DIR\",\n] as const;\n\nexport const GIT_TRANSPORTS_DISABLED: Readonly<Record<string, string>> = {\n GIT_NO_LAZY_FETCH: \"1\",\n GIT_ALLOW_PROTOCOL: \"\",\n};\n\nexport function runRepositoryGit(\n directory: string,\n args: string[],\n): Promise<SubprocessResult> {\n return runRealSubprocess(\n \"git\",\n [...HARDENED_GIT_ARGS, \"-C\", directory, ...args],\n {\n timeoutMs: REPOSITORY_GIT_TIMEOUT_MS,\n env: { ...GIT_TRANSPORTS_DISABLED },\n unsetEnv: REPOSITORY_LOCAL_GIT_VARIABLES,\n },\n );\n}\n","import { readIsolationStatus } from \"../inspect/discover.js\";\nimport type { AgemonPlugin } from \"../plugins/types.js\";\nimport {\n type AgemonConfig,\n type ConfigCapabilityUpdate,\n rewriteConfigCapabilities,\n} from \"./config.js\";\nimport type { RunOutcome } from \"./orchestrator.js\";\n\nconst CAPABILITIES_BEFORE_KNOWN_LIST: readonly string[] = [\n \"crg\",\n \"daemon\",\n \"skills\",\n \"cli-tool\",\n \"master-prompt\",\n];\n\nconst AUTO_ADDED_TO_EXISTING_CONFIGS: readonly string[] = [\"agents\"];\n\nconst OUTCOMES_THAT_UPDATE_CONFIG: ReadonlySet<RunOutcome> = new Set([\n \"applied\",\n \"nothing-to-do\",\n \"partial\",\n \"declined\",\n]);\n\nexport function capabilitiesToAutoAdd(\n config: AgemonConfig,\n plugins: AgemonPlugin[],\n): string[] {\n const knownIds = new Set(\n config.knownCapabilities ?? CAPABILITIES_BEFORE_KNOWN_LIST,\n );\n const listedIds = new Set(config.capabilities);\n return AUTO_ADDED_TO_EXISTING_CONFIGS.filter((id) => {\n const plugin = plugins.find((candidate) => candidate.id === id);\n return (\n plugin !== undefined &&\n !knownIds.has(id) &&\n !listedIds.has(id) &&\n (plugin.dependsOn ?? []).every((dependencyId) =>\n listedIds.has(dependencyId),\n )\n );\n });\n}\n\nexport type AddedCapabilitiesUpdate =\n | ConfigCapabilityUpdate\n | { kind: \"state-not-ignored\" };\n\nexport async function addCapabilitiesToConfig(\n repoRoot: string,\n config: AgemonConfig,\n addedCapabilityIds: string[],\n options: { knownCapabilities: string[]; allowUnignoredState: boolean },\n): Promise<AddedCapabilitiesUpdate> {\n if (\n !options.allowUnignoredState &&\n (await readIsolationStatus(repoRoot)) !== \"ignored\"\n ) {\n return { kind: \"state-not-ignored\" };\n }\n return rewriteConfigCapabilities(repoRoot, config, {\n capabilities: [...config.capabilities, ...addedCapabilityIds],\n knownCapabilities: options.knownCapabilities,\n });\n}\n\nexport function outcomeUpdatesConfig(outcome: RunOutcome): boolean {\n return OUTCOMES_THAT_UPDATE_CONFIG.has(outcome);\n}\n","import { constants } from \"node:fs\";\nimport { access, realpath, stat } from \"node:fs/promises\";\nimport { delimiter, join } from \"node:path\";\nimport { assertFakeBackendsAreDevOnly, isDevMode } from \"../core/dev-mode.js\";\nimport { errorMessage } from \"../core/error-message.js\";\nimport { readRegularFileIfExists } from \"../core/files.js\";\n\nexport const REQUIRED_BINARIES = [\n \"python3\",\n \"pip\",\n \"pipx\",\n \"uv\",\n \"code-review-graph\",\n] as const;\n\nexport type RequiredBinary = (typeof REQUIRED_BINARIES)[number];\n\nexport interface BinaryDetectionResult {\n name: RequiredBinary;\n present: boolean;\n path?: string;\n}\n\ntype PlatformFamily = \"linux\" | \"darwin\" | \"other\";\n\nexport type ServiceManagerKind = \"systemd-user\" | \"launchd\" | \"none\";\n\nexport interface PlatformCapabilities {\n family: PlatformFamily;\n arch: string;\n serviceManager: ServiceManagerKind;\n unsupportedReason: string | null;\n}\n\nexport interface DetectPlatformInput {\n osReleasePath?: string;\n hostPlatform?: NodeJS.Platform;\n hostArch?: string;\n systemdRuntimeDirectory?: string;\n}\n\nconst SUPPORTED_LINUX_IDS = [\"ubuntu\", \"debian\"];\nconst SYSTEMD_RUNTIME_DIRECTORY = \"/run/systemd/system\";\nconst READ_ONLY_COMMANDS_NOTE =\n \"Read-only commands (inspect, status, plan) still work here.\";\n\nexport class UnsupportedPlatformError extends Error {}\n\nfunction normalizeOsReleaseValue(value: string): string {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('\"') && trimmedValue.endsWith('\"')) ||\n (trimmedValue.startsWith(\"'\") && trimmedValue.endsWith(\"'\"))\n ) {\n return trimmedValue.slice(1, -1);\n }\n return trimmedValue;\n}\n\nfunction readOsReleaseField(\n osReleaseContents: string,\n fieldName: string,\n): string | undefined {\n for (const line of osReleaseContents.split(/\\r?\\n/)) {\n const trimmedLine = line.trim();\n if (trimmedLine.length === 0 || trimmedLine.startsWith(\"#\")) {\n continue;\n }\n\n const separatorIndex = trimmedLine.indexOf(\"=\");\n if (separatorIndex === -1) {\n continue;\n }\n\n const key = trimmedLine.slice(0, separatorIndex).trim();\n if (key === fieldName) {\n return normalizeOsReleaseValue(\n trimmedLine.slice(separatorIndex + 1),\n ).toLowerCase();\n }\n }\n\n return undefined;\n}\n\nfunction isSupportedLinuxDistribution(osReleaseContents: string): boolean {\n const osId = readOsReleaseField(osReleaseContents, \"ID\") ?? \"\";\n const osIdLike = readOsReleaseField(osReleaseContents, \"ID_LIKE\") ?? \"\";\n return [osId, ...osIdLike.split(/\\s+/)].some((id) =>\n SUPPORTED_LINUX_IDS.includes(id),\n );\n}\n\nasync function findLinuxUnsupportedReason(\n osReleasePath: string,\n): Promise<string | null> {\n let osReleaseContents: string | null;\n try {\n osReleaseContents = await readRegularFileIfExists(\n await realpath(osReleasePath),\n );\n } catch (error) {\n const reason = (error as NodeJS.ErrnoException).code ?? errorMessage(error);\n return `agemon could not identify this Linux distribution: reading ${osReleasePath} failed (${reason}). ${READ_ONLY_COMMANDS_NOTE}`;\n }\n if (osReleaseContents === null) {\n return `agemon could not identify this Linux distribution: reading ${osReleasePath} failed (ENOENT). ${READ_ONLY_COMMANDS_NOTE}`;\n }\n\n if (isSupportedLinuxDistribution(osReleaseContents)) {\n return null;\n }\n const osId = readOsReleaseField(osReleaseContents, \"ID\") ?? \"unknown\";\n return `agemon can only change Ubuntu, Debian, their derivatives and macOS. ${osReleasePath} reports '${osId}'. ${READ_ONLY_COMMANDS_NOTE}`;\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction usesFakeServices(): boolean {\n if (process.env.AGEMON_FAKE_SERVICES !== \"1\") {\n return false;\n }\n assertFakeBackendsAreDevOnly();\n return true;\n}\n\nasync function detectLinuxServiceManager(\n systemdRuntimeDirectory: string,\n): Promise<ServiceManagerKind> {\n if (usesFakeServices()) {\n return \"systemd-user\";\n }\n return (await isDirectory(systemdRuntimeDirectory)) ? \"systemd-user\" : \"none\";\n}\n\nfunction detectDarwinServiceManager(): ServiceManagerKind {\n return usesFakeServices() ? \"systemd-user\" : \"launchd\";\n}\n\nfunction resolveOsReleasePath(input: DetectPlatformInput): string {\n const testOverride = isDevMode()\n ? process.env.AGEMON_OS_RELEASE_PATH\n : undefined;\n return input.osReleasePath ?? testOverride ?? \"/etc/os-release\";\n}\n\nexport async function detectPlatformCapabilities(\n input: DetectPlatformInput = {},\n): Promise<PlatformCapabilities> {\n const hostPlatform = input.hostPlatform ?? process.platform;\n const arch = input.hostArch ?? process.arch;\n if (hostPlatform === \"darwin\") {\n return {\n family: \"darwin\",\n arch,\n serviceManager: detectDarwinServiceManager(),\n unsupportedReason: null,\n };\n }\n if (hostPlatform !== \"linux\") {\n return {\n family: \"other\",\n arch,\n serviceManager: \"none\",\n unsupportedReason: `agemon does not support ${hostPlatform}. ${READ_ONLY_COMMANDS_NOTE}`,\n };\n }\n\n return {\n family: \"linux\",\n arch,\n serviceManager: await detectLinuxServiceManager(\n input.systemdRuntimeDirectory ?? SYSTEMD_RUNTIME_DIRECTORY,\n ),\n unsupportedReason: await findLinuxUnsupportedReason(\n resolveOsReleasePath(input),\n ),\n };\n}\n\nexport function assertPlatformSupportsChanges(\n platform: PlatformCapabilities,\n): void {\n if (platform.unsupportedReason !== null) {\n throw new UnsupportedPlatformError(platform.unsupportedReason);\n }\n}\n\nexport async function findBinaryPath(\n binaryName: string,\n pathEnv: string,\n): Promise<string | undefined> {\n for (const pathEntry of pathEnv.split(delimiter)) {\n if (!pathEntry) {\n continue;\n }\n\n const binaryPath = join(pathEntry, binaryName);\n try {\n await access(binaryPath, constants.X_OK);\n return binaryPath;\n } catch {}\n }\n\n return undefined;\n}\n\nexport async function detectRequiredBinaries(\n pathEnv: string,\n): Promise<Record<RequiredBinary, BinaryDetectionResult>> {\n const binaryResults = await Promise.all(\n REQUIRED_BINARIES.map(async (binaryName) => {\n const binaryPath = await findBinaryPath(binaryName, pathEnv);\n return {\n name: binaryName,\n present: binaryPath !== undefined,\n path: binaryPath,\n } satisfies BinaryDetectionResult;\n }),\n );\n\n return Object.fromEntries(\n binaryResults.map((binaryResult) => [binaryResult.name, binaryResult]),\n ) as Record<RequiredBinary, BinaryDetectionResult>;\n}\n","export function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { chmod, mkdir, rm } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { errorMessage } from \"../../core/error-message.js\";\nimport { RefusedFileError, writeFileAtomic } from \"../../core/files.js\";\nimport { currentUid } from \"../../core/install-location.js\";\nimport { printable, quoteForShlex } from \"../../core/untrusted-text.js\";\nimport { resolveHomeDirectory } from \"../home.js\";\nimport type {\n AutostartAttempt,\n RegisterAutostartInput,\n RegisterAutostartResult,\n RunCommand,\n RunCommandResult,\n ServiceManager,\n ServiceStatus,\n UnregisterAutostartInput,\n} from \"./index.js\";\nimport {\n createLaunchAgentFiles,\n launchAgentLabelOf,\n readPlistEnvironment,\n readPlistString,\n} from \"./launch-agent-files.js\";\nimport {\n type ReadinessObservation,\n type ServiceClock,\n systemClock,\n waitUntilSteadilyRunning,\n} from \"./readiness.js\";\n\ninterface CreateLaunchdServiceManagerInput {\n run: RunCommand;\n homeDir?: string;\n uid?: number;\n clock?: ServiceClock;\n}\n\nconst LAUNCHCTL = \"/bin/launchctl\";\nconst LAUNCHCTL_TIMEOUT_MS = 20_000;\nconst PLIST_FILE_MODE = 0o644;\nconst EXIT_SERVICE_NOT_FOUND = 113;\nconst EXIT_NO_SUCH_PROCESS = 3;\nconst BOOTSTRAP_EXIT_CODES_WORTH_RETRYING = [5, 37];\nconst EXIT_DOMAIN_UNSUPPORTED = 125;\nconst TEARDOWN_POLL_INTERVAL_MS = 250;\nconst TEARDOWN_TIMEOUT_MS = 5_000;\nconst OUTPUT_EXCERPT_LENGTH = 200;\nconst NO_GUI_SESSION_HINT =\n \"log in to this Mac's desktop session and run agemon there\";\n\ninterface LaunchdJobState {\n state: string | null;\n runs: number;\n lastExitCode: number | null;\n}\n\nfunction excerpt(output: string): string {\n return printable(output.trim()).slice(0, OUTPUT_EXCERPT_LENGTH);\n}\n\nfunction readPrintField(output: string, field: string): string | null {\n return (\n new RegExp(`^\\\\s*${field} = (.+)$`, \"m\").exec(output)?.[1].trim() ?? null\n );\n}\n\nexport function parseLaunchdJobState(printOutput: string): LaunchdJobState {\n const lastExit = readPrintField(printOutput, \"last exit code\");\n return {\n state: readPrintField(printOutput, \"state\"),\n runs: Number(readPrintField(printOutput, \"runs\") ?? \"0\") || 0,\n lastExitCode:\n lastExit !== null && /^-?\\d+$/.test(lastExit) ? Number(lastExit) : null,\n };\n}\n\nfunction observeJob(\n label: string,\n job: LaunchdJobState,\n printOutput: string,\n): ReadinessObservation {\n if (job.runs > 1) {\n return {\n kind: \"failed\",\n reason: `${label} restarted ${job.runs - 1} time(s) after it started`,\n };\n }\n if (job.lastExitCode !== null && job.lastExitCode !== 0) {\n return {\n kind: \"failed\",\n reason: `${label} exited with code ${job.lastExitCode}`,\n };\n }\n if (job.state === \"running\") {\n return { kind: \"running\" };\n }\n if (job.runs >= 1) {\n return {\n kind: \"failed\",\n reason: `${label} is ${printable(job.state ?? \"stopped\")}`,\n };\n }\n return {\n kind: \"pending\",\n state:\n job.state === null\n ? `unrecognised (${excerpt(printOutput)})`\n : printable(job.state),\n };\n}\n\nfunction describeLaunchctlFailure(\n args: string[],\n result: RunCommandResult,\n): string {\n const detail = excerpt(result.stderr || result.stdout);\n return `launchctl ${args.join(\" \")} exited ${result.code}${detail ? `: ${detail}` : \"\"}`;\n}\n\nfunction reportsMissingGuiSession(result: RunCommandResult): boolean {\n return (\n result.code === EXIT_DOMAIN_UNSUPPORTED ||\n /Domain does not support specified action|Could not find domain/i.test(\n result.stderr,\n )\n );\n}\n\nfunction isListedAsDisabled(\n printDisabledOutput: string,\n label: string,\n): boolean {\n return printDisabledOutput\n .split(\"\\n\")\n .some(\n (line) =>\n line.includes(`\"${label}\"`) && /=>\\s*(?:disabled|true)\\b/.test(line),\n );\n}\n\nexport function createLaunchdServiceManager(\n input: CreateLaunchdServiceManagerInput,\n): ServiceManager {\n const files = createLaunchAgentFiles(input.homeDir ?? resolveHomeDirectory());\n const domain = `gui/${input.uid ?? currentUid()}`;\n const clock = input.clock ?? systemClock;\n\n const launchctl = (args: string[]) =>\n input.run(LAUNCHCTL, args, { timeoutMs: LAUNCHCTL_TIMEOUT_MS });\n const serviceTarget = (label: string) => `${domain}/${label}`;\n\n const printJob = (label: string) =>\n launchctl([\"print\", serviceTarget(label)]);\n\n const isLoaded = async (label: string): Promise<boolean> => {\n const result = await printJob(label);\n if (result.code === EXIT_SERVICE_NOT_FOUND) {\n return false;\n }\n if (result.code !== 0) {\n const failure = describeLaunchctlFailure(\n [\"print\", serviceTarget(label)],\n result,\n );\n throw new Error(\n reportsMissingGuiSession(result)\n ? `${failure}; ${NO_GUI_SESSION_HINT}`\n : failure,\n );\n }\n return true;\n };\n\n const bootOutAndWait = async (label: string): Promise<void> => {\n const bootoutResult = await launchctl([\"bootout\", serviceTarget(label)]);\n const deadline = clock.now() + TEARDOWN_TIMEOUT_MS;\n while (await isLoaded(label)) {\n if (clock.now() >= deadline) {\n const bootoutFailed = ![\n 0,\n EXIT_NO_SUCH_PROCESS,\n EXIT_SERVICE_NOT_FOUND,\n ].includes(bootoutResult.code);\n throw new Error(\n `${label} is still loaded ${TEARDOWN_TIMEOUT_MS / 1000} s after launchctl bootout${bootoutFailed ? ` (${describeLaunchctlFailure([\"bootout\", serviceTarget(label)], bootoutResult)})` : \"\"}`,\n );\n }\n await clock.wait(TEARDOWN_POLL_INTERVAL_MS);\n }\n };\n\n const explainBootstrapFailure = async (\n label: string,\n args: string[],\n result: RunCommandResult,\n ): Promise<string> => {\n const failure = describeLaunchctlFailure(args, result);\n const disabled = await launchctl([\"print-disabled\", domain]);\n if (disabled.code === 0 && isListedAsDisabled(disabled.stdout, label)) {\n return `${failure}; the job is disabled: run 'launchctl enable ${serviceTarget(label)}' or allow it in System Settings › General › Login Items, then run agemon again`;\n }\n return reportsMissingGuiSession(result)\n ? `${failure}; ${NO_GUI_SESSION_HINT}`\n : failure;\n };\n\n const bootstrap = async (label: string, plistPath: string): Promise<void> => {\n const args = [\"bootstrap\", domain, plistPath];\n let result = await launchctl(args);\n if (BOOTSTRAP_EXIT_CODES_WORTH_RETRYING.includes(result.code)) {\n await bootOutAndWait(label);\n result = await launchctl(args);\n }\n if (result.code !== 0) {\n throw new Error(await explainBootstrapFailure(label, args, result));\n }\n };\n\n const observe = async (label: string): Promise<ReadinessObservation> => {\n const result = await printJob(label);\n if (result.code === EXIT_SERVICE_NOT_FOUND) {\n return { kind: \"failed\", reason: `${label} is not loaded` };\n }\n if (result.code !== 0) {\n return {\n kind: \"failed\",\n reason: describeLaunchctlFailure(\n [\"print\", serviceTarget(label)],\n result,\n ),\n };\n }\n return observeJob(\n label,\n parseLaunchdJobState(result.stdout),\n result.stdout,\n );\n };\n\n const startAttempt = async (\n label: string,\n plistPath: string,\n attempt: AutostartAttempt,\n ): Promise<void> => {\n await writeFileAtomic(plistPath, attempt.unitContents, {\n newFileMode: PLIST_FILE_MODE,\n });\n await chmod(plistPath, PLIST_FILE_MODE);\n if (await isLoaded(label)) {\n await bootOutAndWait(label);\n }\n await bootstrap(label, plistPath);\n await waitUntilSteadilyRunning(label, () => observe(label), clock);\n };\n\n const removeFailedAgent = async (\n label: string,\n plistPath: string,\n ): Promise<string[]> => {\n const manualCleanup: string[] = [];\n try {\n await bootOutAndWait(label);\n } catch {\n manualCleanup.push(`launchctl bootout ${serviceTarget(label)}`);\n }\n try {\n await rm(plistPath, { force: true });\n } catch {\n manualCleanup.push(`rm ${quoteForShlex(plistPath)}`);\n }\n return manualCleanup;\n };\n\n const registerAutostart = async (\n registration: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult> => {\n const label = launchAgentLabelOf(registration.unitName);\n const plistPath = files.plistPathFor(registration.unitName);\n await mkdir(dirname(plistPath), { recursive: true });\n\n const failures: string[] = [];\n const manualCleanup: string[] = [];\n for (const attempt of registration.attempts) {\n try {\n await startAttempt(label, plistPath, attempt);\n return {\n unitPath: plistPath,\n attemptLabel: attempt.label,\n failedAttempts: failures,\n };\n } catch (error) {\n failures.push(`${attempt.label}: ${errorMessage(error)}`);\n if (error instanceof RefusedFileError) {\n break;\n }\n manualCleanup.push(...(await removeFailedAgent(label, plistPath)));\n }\n }\n\n const cleanupAdvice =\n manualCleanup.length === 0\n ? \"\"\n : ` Cleanup also failed; run these yourself: ${[...new Set(manualCleanup)].join(\"; \")}`;\n throw new Error(\n `Could not start ${label} (${failures.join(\"; \")}).${cleanupAdvice}`,\n );\n };\n\n const readOwnPlist = async (\n plistFileName: string,\n ): Promise<string | null> => {\n const contents = await files.readPlist(plistFileName);\n if (contents === null) {\n return null;\n }\n const plistPath = files.plistPathFor(plistFileName);\n const label = launchAgentLabelOf(plistFileName);\n if (readPlistString(contents, \"Label\", plistPath) !== label) {\n throw new RefusedFileError(\n `Refusing to manage ${plistPath}: its Label is not ${label}, so it is not the file agemon wrote.`,\n );\n }\n return contents;\n };\n\n const unregisterAutostart = async (\n registration: UnregisterAutostartInput,\n ): Promise<void> => {\n const label = launchAgentLabelOf(registration.unitName);\n await readOwnPlist(registration.unitName);\n await bootOutAndWait(label);\n await rm(files.plistPathFor(registration.unitName), { force: true });\n };\n\n const isActive = async (unitName: string): Promise<ServiceStatus> => {\n const label = launchAgentLabelOf(unitName);\n const result = await printJob(label);\n if (result.code !== 0) {\n return { active: false, failed: false };\n }\n const job = parseLaunchdJobState(result.stdout);\n const running = job.state === \"running\";\n return {\n active: running,\n failed: !running && job.lastExitCode !== null && job.lastExitCode !== 0,\n };\n };\n\n const readUnitWorkingDirectory = async (\n unitName: string,\n ): Promise<string | null> => {\n const contents = await readOwnPlist(unitName);\n if (contents === null) {\n return null;\n }\n return readPlistString(\n contents,\n \"WorkingDirectory\",\n files.plistPathFor(unitName),\n );\n };\n\n const readUnitEnvironment = async (\n unitName: string,\n ): Promise<Record<string, string> | null> => {\n try {\n const contents = await readOwnPlist(unitName);\n return contents === null ? null : readPlistEnvironment(contents);\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return null;\n }\n throw error;\n }\n };\n\n const refuseLinger = () =>\n Promise.reject(new Error(\"launchd has no user linger.\"));\n\n return {\n kind: \"launchd\",\n isActive,\n isSandboxEnforced: async () => false,\n registerAutostart,\n unregisterAutostart,\n readUnitWorkingDirectory,\n readUnitEnvironment,\n unitPathFor: files.plistPathFor,\n isLingerEnabled: refuseLinger,\n enableLinger: refuseLinger,\n disableLinger: refuseLinger,\n findAgemonDaemonUnit: files.findAgemonLaunchAgent,\n };\n}\n","import { constants } from \"node:fs\";\nimport { access, lstat, readFile, realpath, stat } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport {\n containsHomeDirectory,\n resolveHomeDirectory,\n} from \"../platform/home.js\";\nimport { INSTALL_MARKER_FILE_NAME } from \"./install-method.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst ROOT_UID = 0;\nconst ROOT_INSTALL_DIRECTORY = \"/usr/local/lib/agemon\";\nconst USER_INSTALL_DIRECTORY_IN_HOME = join(\".local\", \"share\", \"agemon\");\nconst ROOT_SENSITIVE_VARIABLES = [\"XDG_STATE_HOME\", \"XDG_CACHE_HOME\"];\n\nexport function currentUid(): number {\n return process.geteuid?.() ?? process.getuid?.() ?? -1;\n}\n\nfunction defaultInstallDirectory(): string {\n return currentUid() === ROOT_UID\n ? ROOT_INSTALL_DIRECTORY\n : join(resolveHomeDirectory(), USER_INSTALL_DIRECTORY_IN_HOME);\n}\n\nexport function protectedInstallDirectories(home: string): string[] {\n return [\n \"/\",\n \"/bin\",\n \"/etc\",\n \"/home\",\n \"/opt\",\n \"/usr\",\n \"/usr/bin\",\n \"/usr/local\",\n \"/usr/local/bin\",\n \"/var\",\n \"/Users\",\n \"/Library\",\n \"/Applications\",\n \"/System\",\n \"/private\",\n \"/opt/homebrew\",\n home,\n join(home, \".local\"),\n join(home, \".local\", \"share\"),\n ];\n}\n\nexport async function isProtectedInstallDirectory(\n realDirectory: string,\n): Promise<boolean> {\n for (const candidate of protectedInstallDirectories(resolveHomeDirectory())) {\n try {\n if ((await realpath(candidate)) === realDirectory) {\n return true;\n }\n } catch {}\n }\n return containsHomeDirectory(realDirectory);\n}\n\nexport async function isDefaultInstallDirectory(\n installDir: string,\n): Promise<boolean> {\n try {\n return (\n (await realpath(defaultInstallDirectory())) ===\n (await realpath(installDir))\n );\n } catch {\n return false;\n }\n}\n\nexport function assertNotRootOnMacOS(\n hostPlatform: NodeJS.Platform = process.platform,\n uid: number = currentUid(),\n): void {\n if (hostPlatform === \"darwin\" && uid === ROOT_UID) {\n throw new Error(\n \"On macOS agemon runs as your own user, never as root: everything it installs belongs to one user. Run it without sudo. If agemon was installed with 'sudo npm install -g', remove it with 'sudo npm uninstall -g agemon' and reinstall it as your user.\",\n );\n }\n}\n\nexport function assertRootUsesItsOwnEnvironment(): void {\n if (currentUid() !== ROOT_UID) {\n return;\n }\n const rootHome = userInfo().homedir;\n const borrowedVariables = ROOT_SENSITIVE_VARIABLES.filter(\n (name) => process.env[name] !== undefined,\n );\n if (process.env.HOME !== rootHome || borrowedVariables.length > 0) {\n throw new Error(\n `Running as root with another user's environment (HOME=${printable(process.env.HOME ?? \"\")}${borrowedVariables.map((name) => `, ${name} set`).join(\"\")}). Run it as root with root's own environment, for example plain 'sudo' or 'sudo -H', not 'sudo -E'.`,\n );\n }\n}\n\nexport async function assertCurrentUserOwns(path: string): Promise<void> {\n const owner = (await stat(path)).uid;\n const uid = currentUid();\n if (owner !== uid) {\n throw new Error(\n uid === ROOT_UID\n ? `${printable(path)} belongs to uid ${owner}, not root. Run this as that user, without sudo.`\n : `${printable(path)} belongs to ${owner === ROOT_UID ? \"root\" : `uid ${owner}`}. Run this with sudo (as its owner).`,\n );\n }\n try {\n await access(path, constants.W_OK);\n await access(dirname(path), constants.W_OK);\n } catch {\n throw new Error(\n `${printable(path)} or its parent directory is not writable, so it cannot be replaced.`,\n );\n }\n}\n\nasync function readPackageName(directory: string): Promise<unknown> {\n try {\n return (\n JSON.parse(await readFile(join(directory, \"package.json\"), \"utf8\")) as {\n name?: unknown;\n }\n ).name;\n } catch {\n return undefined;\n }\n}\n\nasync function isRegularFile(path: string): Promise<boolean> {\n try {\n return (await lstat(path)).isFile();\n } catch {\n return false;\n }\n}\n\nexport async function readInstallTreeVersion(\n directory: string,\n): Promise<string | null> {\n try {\n if (!(await lstat(directory)).isDirectory()) {\n return null;\n }\n } catch {\n return null;\n }\n const markerPath = join(directory, INSTALL_MARKER_FILE_NAME);\n const isAgemonTree =\n (await isRegularFile(markerPath)) &&\n (await readPackageName(directory)) === \"agemon\" &&\n (await isRegularFile(join(directory, \"bin\", \"agemon.js\")));\n return isAgemonTree ? (await readFile(markerPath, \"utf8\")).trim() : null;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { RefusedFileError, readRegularFileIfExists } from \"../../core/files.js\";\n\nexport const AGEMON_LAUNCH_AGENT_PATTERN =\n /^dev\\.agemon\\.crg\\.[a-z0-9-]{1,40}-[0-9a-f]{8}\\.plist$/;\nconst PLIST_FILE_SUFFIX = \".plist\";\nconst BINARY_PLIST_MAGIC = \"bplist\";\nconst XML_COMMENTS = /<!--[\\s\\S]*?-->/g;\nconst CDATA_SECTION_START = \"<![CDATA[\";\n\nconst XML_ESCAPES: ReadonlyArray<readonly [string, string]> = [\n [\"&\", \"&amp;\"],\n [\"<\", \"&lt;\"],\n [\">\", \"&gt;\"],\n ['\"', \"&quot;\"],\n [\"'\", \"&apos;\"],\n];\n\nexport function escapePlistString(value: string): string {\n return XML_ESCAPES.reduce(\n (escaped, [character, entity]) => escaped.replaceAll(character, entity),\n value,\n );\n}\n\nfunction unescapePlistString(value: string): string {\n return [...XML_ESCAPES]\n .reverse()\n .reduce(\n (unescaped, [character, entity]) =>\n unescaped.replaceAll(entity, character),\n value,\n );\n}\n\nexport function launchAgentLabelOf(plistFileName: string): string {\n if (!AGEMON_LAUNCH_AGENT_PATTERN.test(plistFileName)) {\n throw new RefusedFileError(\n `Refusing to manage ${plistFileName}: it is not an agemon launch agent name.`,\n );\n }\n return plistFileName.slice(0, -PLIST_FILE_SUFFIX.length);\n}\n\nexport function readPlistString(\n plistContents: string,\n key: \"Label\" | \"WorkingDirectory\",\n plistPath: string,\n): string {\n if (\n plistContents.startsWith(BINARY_PLIST_MAGIC) ||\n plistContents.includes(CDATA_SECTION_START)\n ) {\n throw new RefusedFileError(\n `Refusing to read ${plistPath}: it is a binary plist or contains CDATA, so it is not the file agemon wrote.`,\n );\n }\n const values = [\n ...plistContents\n .replace(XML_COMMENTS, \"\")\n .matchAll(\n new RegExp(`<key>${key}</key>\\\\s*<string>([^<]*)</string>`, \"g\"),\n ),\n ].map((match) => unescapePlistString(match[1]));\n if (values.length !== 1) {\n throw new RefusedFileError(\n `Refusing to read ${plistPath}: it does not have exactly one ${key}, so it is not the file agemon wrote.`,\n );\n }\n return values[0];\n}\n\nconst MAX_AGEMON_PLIST_CHARACTERS = 64 * 1024;\nconst ENVIRONMENT_DICT =\n /<key>EnvironmentVariables<\\/key>\\s*<dict>([\\s\\S]*?)<\\/dict>/;\nconst STRING_ENTRY = /<key>([^<]*)<\\/key>\\s*<string>([^<]*)<\\/string>/g;\n\nexport function readPlistEnvironment(\n plistContents: string,\n): Record<string, string> | null {\n if (\n plistContents.length > MAX_AGEMON_PLIST_CHARACTERS ||\n plistContents.startsWith(BINARY_PLIST_MAGIC) ||\n plistContents.includes(CDATA_SECTION_START)\n ) {\n return null;\n }\n const dictionary = ENVIRONMENT_DICT.exec(\n plistContents.replace(XML_COMMENTS, \"\"),\n )?.[1];\n if (dictionary === undefined) {\n return {};\n }\n return Object.fromEntries(\n [...dictionary.matchAll(STRING_ENTRY)].map((entry) => [\n unescapePlistString(entry[1]),\n unescapePlistString(entry[2]),\n ]),\n );\n}\n\nexport interface LaunchAgentFiles {\n plistPathFor(plistFileName: string): string;\n readPlist(plistFileName: string): Promise<string | null>;\n findAgemonLaunchAgent(): Promise<string | null>;\n}\n\nexport function createLaunchAgentFiles(homeDir: string): LaunchAgentFiles {\n const launchAgentsDirectory = join(homeDir, \"Library\", \"LaunchAgents\");\n const plistPathFor = (plistFileName: string) => {\n launchAgentLabelOf(plistFileName);\n return join(launchAgentsDirectory, plistFileName);\n };\n\n return {\n plistPathFor,\n readPlist: (plistFileName) =>\n readRegularFileIfExists(plistPathFor(plistFileName)),\n async findAgemonLaunchAgent() {\n let fileNames: string[];\n try {\n fileNames = await readdir(launchAgentsDirectory);\n } catch {\n return null;\n }\n return (\n fileNames.find((fileName) =>\n AGEMON_LAUNCH_AGENT_PATTERN.test(fileName),\n ) ?? null\n );\n },\n };\n}\n","import { setTimeout as sleep } from \"node:timers/promises\";\n\nexport interface ServiceClock {\n now(): number;\n wait(milliseconds: number): Promise<void>;\n}\n\nexport type ReadinessObservation =\n | { kind: \"running\" }\n | { kind: \"pending\"; state: string }\n | { kind: \"failed\"; reason: string };\n\nconst READINESS_POLL_INTERVAL_MS = 500;\nconst READINESS_TIMEOUT_MS = 10_000;\nconst READINESS_SETTLE_MS = 2_000;\n\nexport const systemClock: ServiceClock = {\n now: () => Date.now(),\n wait: (milliseconds) => sleep(milliseconds),\n};\n\nexport async function waitUntilSteadilyRunning(\n serviceName: string,\n observe: () => Promise<ReadinessObservation>,\n clock: ServiceClock,\n): Promise<void> {\n const deadline = clock.now() + READINESS_TIMEOUT_MS;\n let runningSince: number | null = null;\n for (;;) {\n const observation = await observe();\n if (observation.kind === \"failed\") {\n throw new Error(observation.reason);\n }\n if (observation.kind === \"running\") {\n runningSince ??= clock.now();\n if (clock.now() - runningSince >= READINESS_SETTLE_MS) {\n return;\n }\n } else {\n runningSince = null;\n if (clock.now() >= deadline) {\n throw new Error(\n `${serviceName} was still ${observation.state} after ${READINESS_TIMEOUT_MS / 1000} s`,\n );\n }\n }\n await clock.wait(READINESS_POLL_INTERVAL_MS);\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { resolveHomeDirectory } from \"../home.js\";\nimport type {\n RegisterAutostartInput,\n RegisterAutostartResult,\n ServiceManager,\n ServiceStatus,\n UnregisterAutostartInput,\n} from \"./index.js\";\nimport {\n environmentOfUnit,\n isAgemonDaemonUnitFile,\n workingDirectoryOfUnit,\n} from \"./unit-files.js\";\n\ninterface CreateFakeServiceManagerInput {\n homeDir?: string;\n user?: string;\n}\n\ninterface FakeServiceState {\n unitName: string;\n unitContents: string;\n attemptLabel: string;\n user: string;\n active: boolean;\n failed?: boolean;\n}\n\nfunction resolveUser(user?: string): string {\n return user ?? process.env.USER ?? \"unknown-user\";\n}\n\nfunction markerPath(homeDir: string, unitName: string): string {\n return join(homeDir, \".agemon\", \"fake-services\", `${unitName}.json`);\n}\n\nfunction lingerMarkerPath(homeDir: string): string {\n return join(homeDir, \".agemon\", \"fake-linger\");\n}\n\nasync function readMarker(\n homeDir: string,\n unitName: string,\n): Promise<FakeServiceState | null> {\n try {\n const markerContents = await readFile(\n markerPath(homeDir, unitName),\n \"utf8\",\n );\n return JSON.parse(markerContents) as FakeServiceState;\n } catch {\n return null;\n }\n}\n\nexport function createFakeServiceManager(\n input: CreateFakeServiceManagerInput,\n): ServiceManager {\n const homeDir = input.homeDir ?? resolveHomeDirectory();\n const user = resolveUser(input.user);\n\n const isActive = async (unitName: string): Promise<ServiceStatus> => {\n const marker = await readMarker(homeDir, unitName);\n return {\n active: marker?.active === true,\n failed: marker?.failed === true,\n };\n };\n\n const registerAutostart = async (\n registration: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult> => {\n const destinationPath = markerPath(homeDir, registration.unitName);\n await mkdir(join(homeDir, \".agemon\", \"fake-services\"), { recursive: true });\n const [firstAttempt] = registration.attempts;\n const state: FakeServiceState = {\n unitName: registration.unitName,\n unitContents: firstAttempt.unitContents,\n attemptLabel: firstAttempt.label,\n user,\n active: true,\n };\n await writeFile(\n destinationPath,\n `${JSON.stringify(state, null, 2)}\\n`,\n \"utf8\",\n );\n\n return {\n unitPath: destinationPath,\n attemptLabel: state.attemptLabel,\n failedAttempts: [],\n };\n };\n\n const unregisterAutostart = async (\n registration: UnregisterAutostartInput,\n ): Promise<void> => {\n await rm(markerPath(homeDir, registration.unitName), { force: true });\n };\n\n const readUnitWorkingDirectory = async (\n unitName: string,\n ): Promise<string | null> => {\n const marker = await readMarker(homeDir, unitName);\n return marker === null ? null : workingDirectoryOfUnit(marker.unitContents);\n };\n\n const readUnitEnvironment = async (\n unitName: string,\n ): Promise<Record<string, string> | null> => {\n const marker = await readMarker(homeDir, unitName);\n return marker === null ? null : environmentOfUnit(marker.unitContents);\n };\n\n const findAgemonDaemonUnit = async (): Promise<string | null> => {\n const markers = await readdir(\n join(homeDir, \".agemon\", \"fake-services\"),\n ).catch(() => []);\n return (\n markers\n .map((marker) => marker.replace(/\\.json$/, \"\"))\n .find(isAgemonDaemonUnitFile) ?? null\n );\n };\n\n return {\n kind: \"systemd-user\",\n isActive,\n isSandboxEnforced: async () => true,\n registerAutostart,\n unregisterAutostart,\n readUnitWorkingDirectory,\n readUnitEnvironment,\n unitPathFor: (unitName) => markerPath(homeDir, unitName),\n isLingerEnabled: async () => existsSync(lingerMarkerPath(homeDir)),\n async enableLinger() {\n await mkdir(join(homeDir, \".agemon\"), { recursive: true });\n await writeFile(lingerMarkerPath(homeDir), `${user}\\n`, \"utf8\");\n },\n async disableLinger() {\n await rm(lingerMarkerPath(homeDir), { force: true });\n },\n findAgemonDaemonUnit,\n };\n}\n","export const AGEMON_DAEMON_UNIT_PATTERN =\n /^agemon-crg-daemon-[a-z0-9-]{1,60}\\.service$/;\nconst LEGACY_AGEMON_DAEMON_UNIT_NAME = \"agemon-crg-daemon.service\";\n\nexport function isAgemonDaemonUnitFile(fileName: string): boolean {\n return (\n fileName === LEGACY_AGEMON_DAEMON_UNIT_NAME ||\n AGEMON_DAEMON_UNIT_PATTERN.test(fileName)\n );\n}\n\nconst ENVIRONMENT_DIRECTIVE = \"Environment=\";\nconst QUOTED_UNIT_ESCAPE = /\\\\([\"\\\\])/g;\nconst ENVIRONMENT_WORD = /\"((?:[^\"\\\\]|\\\\.)*)\"|(\\S+)/g;\n\nexport function environmentOfUnit(\n unitContents: string,\n): Record<string, string> {\n const environment: Record<string, string> = {};\n for (const line of unitContents.split(\"\\n\").map((entry) => entry.trim())) {\n if (!line.startsWith(ENVIRONMENT_DIRECTIVE)) {\n continue;\n }\n for (const word of line\n .slice(ENVIRONMENT_DIRECTIVE.length)\n .matchAll(ENVIRONMENT_WORD)) {\n const assignment = (\n word[1] === undefined\n ? word[2]\n : word[1].replace(QUOTED_UNIT_ESCAPE, \"$1\")\n ).replaceAll(\"%%\", \"%\");\n const separator = assignment.indexOf(\"=\");\n if (separator > 0) {\n environment[assignment.slice(0, separator)] = assignment.slice(\n separator + 1,\n );\n }\n }\n }\n return environment;\n}\n\nexport function workingDirectoryOfUnit(unitContents: string): string | null {\n const values = unitContents\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.startsWith(\"WorkingDirectory=\"))\n .map((line) => line.slice(\"WorkingDirectory=\".length).trim());\n return values.at(-1) || null;\n}\n","import { mkdir, readFile, readlink, rm } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { errorMessage } from \"../../core/error-message.js\";\nimport { RefusedFileError, writeFileAtomic } from \"../../core/files.js\";\nimport { currentUid } from \"../../core/install-location.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\nimport { quoteForShlex } from \"../../core/untrusted-text.js\";\nimport { resolveHomeDirectory } from \"../home.js\";\nimport type {\n AutostartAttempt,\n RegisterAutostartInput,\n RegisterAutostartResult,\n RunCommand,\n ServiceManager,\n ServiceStatus,\n UnregisterAutostartInput,\n} from \"./index.js\";\nimport {\n type ReadinessObservation,\n type ServiceClock,\n systemClock,\n waitUntilSteadilyRunning,\n} from \"./readiness.js\";\nimport { createUserUnitFiles } from \"./user-unit-files.js\";\n\ninterface CreateLinuxServiceManagerInput {\n run: RunCommand;\n homeDir?: string;\n user?: string;\n clock?: ServiceClock;\n procRoot?: string;\n}\n\nconst SYSTEM_COMMAND_TIMEOUT_MS = 20_000;\nconst UNIT_FILE_MODE = 0o644;\nconst UNKNOWN_UID = -1;\nconst PROCESS_ID = /^[1-9]\\d*$/;\nconst PARENT_PID_LINE = /^PPid:\\s*([1-9]\\d*)$/m;\n\nfunction resolveUser(user?: string): string {\n if (user !== undefined) {\n return user;\n }\n const uid = currentUid();\n if (uid === UNKNOWN_UID) {\n throw new Error(\"cannot determine the current user id\");\n }\n return String(uid);\n}\n\nfunction reportsUnitNotLoaded(stderr: string, unitName: string): boolean {\n const notLoaded = `Unit ${unitName} not loaded.`;\n const message = stderr.trim();\n return message === notLoaded || message.endsWith(`: ${notLoaded}`);\n}\n\nfunction isMissingUnitError(stderr: string): boolean {\n const normalized = stderr.toLowerCase();\n return (\n normalized.includes(\"not loaded\") ||\n normalized.includes(\"does not exist\") ||\n normalized.includes(\"no such file\") ||\n normalized.includes(\"not found\")\n );\n}\n\nasync function assertSucceeded(\n run: RunCommand,\n command: string,\n args: string[],\n failureMessage: string,\n): Promise<{ stdout: string; stderr: string }> {\n const result = await run(command, args, {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n });\n if (result.code !== 0) {\n throw new Error(\n result.stderr.trim()\n ? describeSubprocessFailure(result, command)\n : failureMessage,\n );\n }\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nfunction parseProperties(output: string): Map<string, string> {\n const properties = new Map<string, string>();\n for (const line of output.split(\"\\n\")) {\n const separator = line.indexOf(\"=\");\n if (separator > 0) {\n properties.set(line.slice(0, separator), line.slice(separator + 1));\n }\n }\n return properties;\n}\n\nexport function createLinuxServiceManager(\n input: CreateLinuxServiceManagerInput,\n): ServiceManager {\n const unitFiles = createUserUnitFiles(\n input.homeDir ?? resolveHomeDirectory(),\n );\n const lingerUser = (): string => resolveUser(input.user);\n const clock = input.clock ?? systemClock;\n const procRoot = input.procRoot ?? \"/proc\";\n\n const isActive = async (unitName: string): Promise<ServiceStatus> => {\n const result = await input.run(\n \"systemctl\",\n [\"--user\", \"is-active\", unitName],\n {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n },\n );\n return {\n active: result.code === 0,\n failed: result.stdout.trim() === \"failed\",\n };\n };\n\n const readMountNamespace = (pid: string): Promise<string> =>\n readlink(join(procRoot, pid, \"ns\", \"mnt\"));\n\n const readParentPid = async (pid: string): Promise<string> => {\n const status = await readFile(join(procRoot, pid, \"status\"), \"utf8\");\n const parentPid = PARENT_PID_LINE.exec(status)?.[1];\n if (parentPid === undefined) {\n throw new Error(`no parent process id in ${pid}'s status`);\n }\n return parentPid;\n };\n\n // The unit's parent is the systemd user manager. Comparing with it rather than with\n // agemon keeps the answer right when agemon itself runs in another mount namespace\n // (a toolbox container or an agent sandbox).\n const isSandboxEnforced = async (unitName: string): Promise<boolean> => {\n const mainPid = await input.run(\n \"systemctl\",\n [\"--user\", \"show\", \"-p\", \"MainPID\", \"--value\", unitName],\n { timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS },\n );\n const pid = mainPid.stdout.trim();\n if (mainPid.code !== 0 || !PROCESS_ID.test(pid)) {\n return false;\n }\n try {\n const [unitNamespace, userManagerNamespace] = await Promise.all([\n readMountNamespace(pid),\n readParentPid(pid).then(readMountNamespace),\n ]);\n return unitNamespace !== userManagerNamespace;\n } catch {\n return false;\n }\n };\n\n const readLingerIsOn = async (): Promise<boolean> => {\n const lingerStatus = await assertSucceeded(\n input.run,\n \"loginctl\",\n [\"show-user\", lingerUser(), \"--property=Linger\", \"--value\"],\n \"Unable to read linger status.\",\n );\n const linger = lingerStatus.stdout.trim();\n if (linger !== \"yes\" && linger !== \"no\") {\n throw new Error(\n `loginctl reported linger as '${linger}' instead of yes or no; nothing was changed.`,\n );\n }\n return linger === \"yes\";\n };\n\n const readUnitState = async (\n unitName: string,\n ): Promise<{ activeState: string; subState: string; restarts: number }> => {\n const show = await assertSucceeded(\n input.run,\n \"systemctl\",\n [\n \"--user\",\n \"show\",\n unitName,\n \"--property=ActiveState\",\n \"--property=SubState\",\n \"--property=NRestarts\",\n ],\n `Unable to read the state of ${unitName}.`,\n );\n const properties = parseProperties(show.stdout);\n return {\n activeState: properties.get(\"ActiveState\") ?? \"unknown\",\n subState: properties.get(\"SubState\") ?? \"unknown\",\n restarts: Number(properties.get(\"NRestarts\") ?? \"0\") || 0,\n };\n };\n\n const observeUnit = async (\n unitName: string,\n ): Promise<ReadinessObservation> => {\n const { activeState, subState, restarts } = await readUnitState(unitName);\n if (restarts > 0) {\n return {\n kind: \"failed\",\n reason: `${unitName} restarted ${restarts} time(s) after it started`,\n };\n }\n if (subState === \"auto-restart\") {\n return {\n kind: \"failed\",\n reason: `${unitName} exited and is waiting to restart`,\n };\n }\n if (activeState === \"failed\" || activeState === \"inactive\") {\n return { kind: \"failed\", reason: `${unitName} is ${activeState}` };\n }\n return activeState === \"active\"\n ? { kind: \"running\" }\n : { kind: \"pending\", state: activeState };\n };\n\n const runResetFailed = (unitName: string) =>\n input.run(\"systemctl\", [\"--user\", \"reset-failed\", unitName], {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n });\n\n const resetStartLimit = async (unitName: string): Promise<void> => {\n const result = await runResetFailed(unitName);\n if (result.code !== 0 && !reportsUnitNotLoaded(result.stderr, unitName)) {\n throw new Error(\n result.stderr.trim()\n ? describeSubprocessFailure(result, \"systemctl\")\n : `Unable to reset the start limit of ${unitName}.`,\n );\n }\n };\n\n const startAttempt = async (\n unitName: string,\n unitPath: string,\n attempt: AutostartAttempt,\n ): Promise<void> => {\n await writeFileAtomic(unitPath, attempt.unitContents, {\n newFileMode: UNIT_FILE_MODE,\n });\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"daemon-reload\"],\n \"Unable to reload systemd user units.\",\n );\n await resetStartLimit(unitName);\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"enable\", unitName],\n \"Unable to enable the daemon unit.\",\n );\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"restart\", unitName],\n \"Unable to start the daemon unit.\",\n );\n await waitUntilSteadilyRunning(\n unitName,\n () => observeUnit(unitName),\n clock,\n );\n };\n\n const stopAndDisable = async (unitName: string): Promise<void> => {\n const disableResult = await input.run(\n \"systemctl\",\n [\"--user\", \"disable\", \"--now\", unitName],\n {\n timeoutMs: SYSTEM_COMMAND_TIMEOUT_MS,\n },\n );\n if (\n disableResult.code !== 0 &&\n !isMissingUnitError(disableResult.stderr || \"\")\n ) {\n throw new Error(\n disableResult.stderr.trim()\n ? describeSubprocessFailure(disableResult, \"systemctl\")\n : \"Unable to disable/stop the daemon unit during uninstall.\",\n );\n }\n };\n\n const removeFailedUnit = async (\n unitName: string,\n unitPath: string,\n ): Promise<string[]> => {\n const manualCleanup: string[] = [];\n try {\n await stopAndDisable(unitName);\n } catch {\n manualCleanup.push(`systemctl --user disable --now ${unitName}`);\n }\n await runResetFailed(unitName).catch(() => undefined);\n try {\n await rm(unitPath, { force: true });\n } catch {\n manualCleanup.push(`rm ${quoteForShlex(unitPath)}`);\n }\n try {\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"daemon-reload\"],\n \"Unable to reload systemd user units.\",\n );\n } catch {\n manualCleanup.push(\"systemctl --user daemon-reload\");\n }\n return manualCleanup;\n };\n\n const registerAutostart = async (\n registration: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult> => {\n const unitPath = unitFiles.unitPathFor(registration.unitName);\n await mkdir(dirname(unitPath), { recursive: true });\n\n const failures: string[] = [];\n const manualCleanup: string[] = [];\n for (const attempt of registration.attempts) {\n try {\n await startAttempt(registration.unitName, unitPath, attempt);\n return {\n unitPath,\n attemptLabel: attempt.label,\n failedAttempts: failures,\n };\n } catch (error) {\n failures.push(`${attempt.label}: ${errorMessage(error)}`);\n if (error instanceof RefusedFileError) {\n break;\n }\n manualCleanup.push(\n ...(await removeFailedUnit(registration.unitName, unitPath)),\n );\n }\n }\n\n const cleanupAdvice =\n manualCleanup.length === 0\n ? \"\"\n : ` Cleanup also failed; run these yourself: ${[...new Set(manualCleanup)].join(\"; \")}`;\n throw new Error(\n `Could not start ${registration.unitName} (${failures.join(\"; \")}).${cleanupAdvice}`,\n );\n };\n\n const unregisterAutostart = async (\n registration: UnregisterAutostartInput,\n ): Promise<void> => {\n await stopAndDisable(registration.unitName);\n await rm(unitFiles.unitPathFor(registration.unitName), { force: true });\n await assertSucceeded(\n input.run,\n \"systemctl\",\n [\"--user\", \"daemon-reload\"],\n \"Unable to reload systemd user units.\",\n );\n };\n\n const setLinger = async (enabled: boolean): Promise<void> => {\n await assertSucceeded(\n input.run,\n \"loginctl\",\n [enabled ? \"enable-linger\" : \"disable-linger\", lingerUser()],\n `Unable to ${enabled ? \"enable\" : \"disable\"} linger for the current user.`,\n );\n };\n\n return {\n kind: \"systemd-user\",\n isActive,\n isSandboxEnforced,\n registerAutostart,\n unregisterAutostart,\n readUnitWorkingDirectory: unitFiles.readUnitWorkingDirectory,\n readUnitEnvironment: unitFiles.readUnitEnvironment,\n unitPathFor: unitFiles.unitPathFor,\n isLingerEnabled: readLingerIsOn,\n enableLinger: () => setLinger(true),\n disableLinger: () => setLinger(false),\n findAgemonDaemonUnit: unitFiles.findAgemonDaemonUnit,\n };\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { readRegularFileIfExists } from \"../../core/files.js\";\nimport type { ServiceManager } from \"./index.js\";\nimport {\n environmentOfUnit,\n isAgemonDaemonUnitFile,\n workingDirectoryOfUnit,\n} from \"./unit-files.js\";\n\nexport type UserUnitFiles = Pick<\n ServiceManager,\n | \"unitPathFor\"\n | \"readUnitWorkingDirectory\"\n | \"readUnitEnvironment\"\n | \"findAgemonDaemonUnit\"\n>;\n\nexport function createUserUnitFiles(homeDir: string): UserUnitFiles {\n const unitDirectory = join(homeDir, \".config\", \"systemd\", \"user\");\n const unitPathFor = (unitName: string) => join(unitDirectory, unitName);\n\n return {\n unitPathFor,\n async readUnitWorkingDirectory(unitName) {\n const unitContents = await readRegularFileIfExists(unitPathFor(unitName));\n return unitContents === null\n ? null\n : workingDirectoryOfUnit(unitContents);\n },\n async readUnitEnvironment(unitName) {\n const unitContents = await readRegularFileIfExists(unitPathFor(unitName));\n return unitContents === null ? null : environmentOfUnit(unitContents);\n },\n async findAgemonDaemonUnit() {\n let unitFileNames: string[];\n try {\n unitFileNames = await readdir(unitDirectory);\n } catch {\n return null;\n }\n return unitFileNames.find(isAgemonDaemonUnitFile) ?? null;\n },\n };\n}\n","import type { ServiceManager } from \"./index.js\";\nimport type { UserUnitFiles } from \"./user-unit-files.js\";\n\nconst RUN_WHERE_SYSTEMD_RUNS = \"run 'agemon nuke' where systemd runs\";\n\nfunction refuseWithoutSystemd(remedy: string): Promise<never> {\n return Promise.reject(\n new Error(`systemd is not running on this machine; ${remedy}.`),\n );\n}\n\nexport function createUnavailableServiceManager(\n unitFiles: UserUnitFiles,\n): ServiceManager {\n const refuseUnit = (unitName: string) =>\n refuseWithoutSystemd(\n `remove ${unitFiles.unitPathFor(unitName)} by hand, or ${RUN_WHERE_SYSTEMD_RUNS}`,\n );\n const refuseLinger = () =>\n refuseWithoutSystemd(\n `agemon cannot manage user linger here; ${RUN_WHERE_SYSTEMD_RUNS}`,\n );\n\n return {\n kind: \"none\",\n isActive: async () => ({ active: false, failed: false }),\n isSandboxEnforced: async () => false,\n registerAutostart: ({ unitName }) =>\n refuseWithoutSystemd(`agemon cannot register ${unitName} here`),\n unregisterAutostart: ({ unitName }) => refuseUnit(unitName),\n readUnitWorkingDirectory: unitFiles.readUnitWorkingDirectory,\n readUnitEnvironment: async () => null,\n unitPathFor: unitFiles.unitPathFor,\n isLingerEnabled: refuseLinger,\n enableLinger: refuseLinger,\n disableLinger: refuseLinger,\n findAgemonDaemonUnit: unitFiles.findAgemonDaemonUnit,\n };\n}\n","import type { ServiceManagerKind } from \"../detect.js\";\nimport { resolveHomeDirectory } from \"../home.js\";\nimport { createLaunchdServiceManager } from \"./darwin.js\";\nimport { createFakeServiceManager } from \"./fake.js\";\nimport { createLinuxServiceManager } from \"./linux.js\";\nimport { createUnavailableServiceManager } from \"./unavailable.js\";\nimport { createUserUnitFiles } from \"./user-unit-files.js\";\n\nexport interface RunCommandResult {\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport interface RunCommandOptions {\n timeoutMs?: number;\n killSignal?: NodeJS.Signals;\n}\n\nexport type RunCommand = (\n command: string,\n args: string[],\n options?: RunCommandOptions,\n) => Promise<RunCommandResult>;\n\nexport interface ServiceStatus {\n active: boolean;\n failed: boolean;\n}\n\nexport interface AutostartAttempt {\n label: string;\n unitContents: string;\n}\n\nexport interface RegisterAutostartInput {\n unitName: string;\n attempts: AutostartAttempt[];\n}\n\nexport interface RegisterAutostartResult {\n unitPath: string;\n attemptLabel: string;\n failedAttempts: string[];\n}\n\nexport interface UnregisterAutostartInput {\n unitName: string;\n}\n\nexport interface ServiceManager {\n readonly kind: ServiceManagerKind;\n isActive(unitName: string): Promise<ServiceStatus>;\n isSandboxEnforced(unitName: string): Promise<boolean>;\n registerAutostart(\n input: RegisterAutostartInput,\n ): Promise<RegisterAutostartResult>;\n unregisterAutostart(input: UnregisterAutostartInput): Promise<void>;\n readUnitWorkingDirectory(unitName: string): Promise<string | null>;\n readUnitEnvironment(unitName: string): Promise<Record<string, string> | null>;\n unitPathFor(unitName: string): string;\n isLingerEnabled(): Promise<boolean>;\n enableLinger(): Promise<void>;\n disableLinger(): Promise<void>;\n findAgemonDaemonUnit(): Promise<string | null>;\n}\n\nexport interface CreateServiceManagerInput {\n kind: ServiceManagerKind;\n run: RunCommand;\n user?: string;\n}\n\nexport function createServiceManager(\n input: CreateServiceManagerInput,\n): ServiceManager {\n if (process.env.AGEMON_FAKE_SERVICES === \"1\") {\n return createFakeServiceManager({\n user: input.user,\n });\n }\n\n switch (input.kind) {\n case \"systemd-user\":\n return createLinuxServiceManager({\n run: input.run,\n user: input.user,\n });\n case \"launchd\":\n return createLaunchdServiceManager({ run: input.run });\n case \"none\":\n return createUnavailableServiceManager(\n createUserUnitFiles(resolveHomeDirectory()),\n );\n default: {\n const unhandledKind: never = input.kind;\n throw new Error(`No service manager for ${String(unhandledKind)}`);\n }\n }\n}\n","import pc from \"picocolors\";\n\nfunction colorsEnabled(): boolean {\n if (process.env.NO_COLOR) return false;\n return Boolean(process.stdout.isTTY);\n}\n\nfunction colors() {\n return pc.createColors(colorsEnabled());\n}\n\nexport type Tone = \"ok\" | \"warn\" | \"danger\" | \"accent\" | \"dim\" | \"neutral\";\n\nexport const theme = {\n heading: (text: string) => colors().bold(text),\n dim: (text: string) => colors().gray(text),\n accent: (text: string) => colors().cyan(text),\n ok: (text: string) => colors().green(text),\n warn: (text: string) => colors().yellow(text),\n danger: (text: string) => colors().red(text),\n added: (text: string) => colors().green(text),\n removed: (text: string) => colors().red(text),\n inverse: (text: string) => colors().inverse(text),\n};\n\nexport function paintTone(tone: Tone, text: string): string {\n switch (tone) {\n case \"ok\":\n return theme.ok(text);\n case \"warn\":\n return theme.warn(text);\n case \"danger\":\n return theme.danger(text);\n case \"accent\":\n return theme.accent(text);\n case \"dim\":\n return theme.dim(text);\n case \"neutral\":\n return text;\n }\n}\n","import { paintTone, type Tone, theme } from \"./theme.js\";\n\nconst MIN_WIDTH = 60;\nconst MAX_WIDTH = 100;\nconst DEFAULT_WIDTH = 80;\n\nexport function terminalWidth(): number {\n const raw = process.stdout.columns ?? DEFAULT_WIDTH;\n return Math.max(MIN_WIDTH, Math.min(MAX_WIDTH, raw));\n}\n\nfunction badgesRenderAsBlocks(): boolean {\n return !process.env.NO_COLOR && Boolean(process.stdout.isTTY);\n}\n\nexport function rule(width: number = terminalWidth()): string {\n return theme.dim(\"─\".repeat(width));\n}\n\nexport function section(title: string): string {\n return `\\n${theme.heading(title)}`;\n}\n\nexport function indent(text: string, spaces = 2): string {\n const pad = \" \".repeat(spaces);\n return text\n .split(\"\\n\")\n .map((line) => (line.length > 0 ? pad + line : line))\n .join(\"\\n\");\n}\n\nexport function bullet(text: string, level = 0): string {\n return `${\" \".repeat(level)}${theme.dim(\"·\")} ${text}`;\n}\n\nexport function kv(pairs: [string, string][]): string {\n const keyWidth = Math.max(...pairs.map(([key]) => key.length));\n return pairs\n .map(([key, value]) => `${key.padEnd(keyWidth)} ${value}`)\n .join(\"\\n\");\n}\n\nexport function badge(label: string, tone: Tone = \"neutral\"): string {\n if (badgesRenderAsBlocks()) {\n return theme.inverse(paintTone(tone, ` ${label} `));\n }\n return `[ ${label} ]`;\n}\n\nexport interface CountPart {\n n: number;\n label: string;\n tone?: Tone;\n}\n\nexport function countLine(parts: CountPart[]): string {\n return parts\n .map((part) => paintTone(part.tone ?? \"neutral\", `${part.n} ${part.label}`))\n .join(theme.dim(\" · \"));\n}\n","export type SymbolName =\n | \"ok\"\n | \"fail\"\n | \"warn\"\n | \"pending\"\n | \"prompt\"\n | \"arrow\"\n | \"add\"\n | \"del\"\n | \"mod\"\n | \"adopt\"\n | \"install\"\n | \"conflict\";\n\nconst UNICODE: Record<SymbolName, string> = {\n ok: \"✔\",\n fail: \"✘\",\n warn: \"⚠\",\n pending: \"●\",\n prompt: \"›\",\n arrow: \"→\",\n add: \"+\",\n del: \"-\",\n mod: \"~\",\n adopt: \"⇄\",\n install: \"⤓\",\n conflict: \"⚑\",\n};\n\nconst ASCII: Record<SymbolName, string> = {\n ok: \"[ok]\",\n fail: \"[x]\",\n warn: \"[!]\",\n pending: \"*\",\n prompt: \">\",\n arrow: \"->\",\n add: \"+\",\n del: \"-\",\n mod: \"~\",\n adopt: \"<>\",\n install: \"v\",\n conflict: \"!\",\n};\n\nfunction asciiMode(): boolean {\n return Boolean(process.env.NO_COLOR) || !process.stdout.isTTY;\n}\n\nexport function symbol(name: SymbolName): string {\n return (asciiMode() ? ASCII : UNICODE)[name];\n}\n","import type { ProposedOperation } from \"../plugins/types.js\";\nimport { indent } from \"./format.js\";\nimport { symbol } from \"./symbols.js\";\nimport { theme } from \"./theme.js\";\n\nconst GATE_TITLES: Record<string, string> = {\n \"workspace-isolation\": \"Workspace isolation\",\n \"trust-repository-git-config\": \"Trust this repository's git config\",\n \"install-custom-skills\": \"Install skills from this repository\",\n \"install-tooling\": \"Install tooling\",\n \"install-subagents\": \"Install Claude Code subagents\",\n \"register-service\": \"Register background service\",\n \"write-config\": \"Write structured config\",\n \"touch-instruction-files\": \"Write instruction files\",\n \"resolve-conflict\": \"Resolve conflicts\",\n};\n\nfunction gateTitle(gateId: string): string {\n return GATE_TITLES[gateId] ?? gateId;\n}\n\nfunction operationLine(operation: ProposedOperation): string {\n const target = operation.targetPath || operation.resourceId;\n return `${symbol(\"arrow\")} ${target}`;\n}\n\nexport function renderGateIntro(input: {\n index: number;\n total: number;\n gateId: string;\n operations: ProposedOperation[];\n}): string {\n const heading = theme.heading(\n `Gate ${input.index} / ${input.total} ${theme.dim(\"·\")} ${gateTitle(\n input.gateId,\n )}`,\n );\n if (input.operations.length === 0) {\n return heading;\n }\n return `${heading}\\n${indent(\n input.operations.map(operationLine).join(\"\\n\"),\n )}`;\n}\n","import { createInterface } from \"node:readline/promises\";\n\nexport function isInteractiveTerminal(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport async function promptYesNo(message: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(`${message} [y/N] `);\n return answer.trim().toLowerCase() === \"y\";\n } finally {\n rl.close();\n }\n}\n\nexport type GateReply = \"approve\" | \"decline\" | \"show-diff\";\nexport type ConflictReply = \"keep\" | \"replace\" | \"show-theirs\" | \"skip\";\n\nexport interface CreateConfirmerInput {\n yes: boolean;\n}\n\nexport function createConfirmer(\n input: CreateConfirmerInput,\n): (message: string) => Promise<boolean> {\n return async (message: string): Promise<boolean> => {\n if (input.yes) {\n return true;\n }\n if (!isInteractiveTerminal()) {\n return false;\n }\n return promptYesNo(message);\n };\n}\n","import { theme } from \"../ui/theme.js\";\n\ntype DiffLineKind = \" \" | \"+\" | \"-\";\n\ninterface DiffLine {\n kind: DiffLineKind;\n text: string;\n}\n\nconst DEFAULT_CONTEXT = 3;\nconst MAX_LCS_TABLE_CELLS = 1_000_000;\nconst ELLIPSIS_LINE_PREFIX = \" ⋯\";\n\nexport interface RenderDiffOptions {\n color?: boolean;\n context?: number;\n maxLines?: number;\n}\n\nfunction splitIntoLines(text: string): string[] {\n if (text === \"\") {\n return [];\n }\n const lines = text.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n return lines;\n}\n\nfunction countCommonPrefix(before: string[], after: string[]): number {\n const limit = Math.min(before.length, after.length);\n let count = 0;\n while (count < limit && before[count] === after[count]) {\n count += 1;\n }\n return count;\n}\n\nfunction countCommonSuffix(\n before: string[],\n after: string[],\n prefixLength: number,\n): number {\n const limit = Math.min(before.length, after.length) - prefixLength;\n let count = 0;\n while (\n count < limit &&\n before[before.length - 1 - count] === after[after.length - 1 - count]\n ) {\n count += 1;\n }\n return count;\n}\n\nfunction contextLines(lines: string[]): DiffLine[] {\n return lines.map((text) => ({ kind: \" \", text }));\n}\n\nfunction diffWithLongestCommonSubsequence(\n before: string[],\n after: string[],\n): DiffLine[] {\n const beforeCount = before.length;\n const afterCount = after.length;\n const commonSuffixLengths: number[][] = Array.from(\n { length: beforeCount + 1 },\n () => new Array<number>(afterCount + 1).fill(0),\n );\n\n for (let beforeIndex = beforeCount - 1; beforeIndex >= 0; beforeIndex -= 1) {\n for (let afterIndex = afterCount - 1; afterIndex >= 0; afterIndex -= 1) {\n commonSuffixLengths[beforeIndex][afterIndex] =\n before[beforeIndex] === after[afterIndex]\n ? commonSuffixLengths[beforeIndex + 1][afterIndex + 1] + 1\n : Math.max(\n commonSuffixLengths[beforeIndex + 1][afterIndex],\n commonSuffixLengths[beforeIndex][afterIndex + 1],\n );\n }\n }\n\n const diff: DiffLine[] = [];\n let beforeIndex = 0;\n let afterIndex = 0;\n while (beforeIndex < beforeCount && afterIndex < afterCount) {\n if (before[beforeIndex] === after[afterIndex]) {\n diff.push({ kind: \" \", text: before[beforeIndex] });\n beforeIndex += 1;\n afterIndex += 1;\n } else if (\n commonSuffixLengths[beforeIndex + 1][afterIndex] >=\n commonSuffixLengths[beforeIndex][afterIndex + 1]\n ) {\n diff.push({ kind: \"-\", text: before[beforeIndex] });\n beforeIndex += 1;\n } else {\n diff.push({ kind: \"+\", text: after[afterIndex] });\n afterIndex += 1;\n }\n }\n while (beforeIndex < beforeCount) {\n diff.push({ kind: \"-\", text: before[beforeIndex] });\n beforeIndex += 1;\n }\n while (afterIndex < afterCount) {\n diff.push({ kind: \"+\", text: after[afterIndex] });\n afterIndex += 1;\n }\n return diff;\n}\n\nfunction diffChangedMiddle(before: string[], after: string[]): DiffLine[] {\n const tableCells = (before.length + 1) * (after.length + 1);\n if (tableCells > MAX_LCS_TABLE_CELLS) {\n return [\n {\n kind: \" \",\n text: ` ⋯ too large to diff line by line: ${before.length} lines replaced by ${after.length} lines`,\n },\n ];\n }\n return diffWithLongestCommonSubsequence(before, after);\n}\n\nfunction diffLineSequences(before: string[], after: string[]): DiffLine[] {\n const prefixLength = countCommonPrefix(before, after);\n const suffixLength = countCommonSuffix(before, after, prefixLength);\n return [\n ...contextLines(before.slice(0, prefixLength)),\n ...diffChangedMiddle(\n before.slice(prefixLength, before.length - suffixLength),\n after.slice(prefixLength, after.length - suffixLength),\n ),\n ...contextLines(before.slice(before.length - suffixLength)),\n ];\n}\n\nfunction collapseUnchangedRuns(body: string[], context: number): string[] {\n const result: string[] = [];\n let unchangedRun: string[] = [];\n\n const flush = (): void => {\n if (unchangedRun.length > context * 2) {\n const hiddenCount = unchangedRun.length - context * 2;\n result.push(...unchangedRun.slice(0, context));\n result.push(` ⋯ ${hiddenCount} unchanged lines`);\n result.push(...unchangedRun.slice(unchangedRun.length - context));\n } else {\n result.push(...unchangedRun);\n }\n unchangedRun = [];\n };\n\n for (const line of body) {\n const isUnchangedLine =\n (line.startsWith(\" \") && !line.startsWith(ELLIPSIS_LINE_PREFIX)) ||\n line === \"\";\n if (isUnchangedLine) {\n unchangedRun.push(line);\n } else {\n flush();\n result.push(line);\n }\n }\n flush();\n return result;\n}\nexport function styleUnifiedDiff(\n diffText: string,\n options: RenderDiffOptions = {},\n): string {\n const useColor = options.color ?? false;\n const context = options.context ?? DEFAULT_CONTEXT;\n\n const lines = diffText.split(\"\\n\");\n const header: string[] = [];\n let bodyStart = 0;\n for (const line of lines) {\n if (line.startsWith(\"--- \") || line.startsWith(\"+++ \")) {\n header.push(line);\n bodyStart += 1;\n continue;\n }\n break;\n }\n\n const collapsed = collapseUnchangedRuns(lines.slice(bodyStart), context);\n const limited =\n options.maxLines !== undefined && collapsed.length > options.maxLines\n ? [\n ...collapsed.slice(0, options.maxLines),\n ` ⋯ diff trimmed, ${collapsed.length - options.maxLines} more lines`,\n ]\n : collapsed;\n\n const paintBodyLine = (line: string): string => {\n if (!useColor) return line;\n if (line.startsWith(\"+\")) return theme.added(line);\n if (line.startsWith(\"-\")) return theme.removed(line);\n if (line.startsWith(ELLIPSIS_LINE_PREFIX)) return theme.dim(line);\n return line;\n };\n\n return [\n ...header.map((line) => (useColor ? theme.dim(line) : line)),\n ...limited.map(paintBodyLine),\n ].join(\"\\n\");\n}\n\nexport function renderUnifiedDiff(\n before: string,\n after: string,\n label: string,\n options: RenderDiffOptions = {},\n): string {\n const diff = diffLineSequences(splitIntoLines(before), splitIntoLines(after));\n const body = diff.map((line) => `${line.kind}${line.text}`).join(\"\\n\");\n const raw = `--- ${label}\\n+++ ${label}\\n${body}`;\n\n if (\n options.color === undefined &&\n options.context === undefined &&\n options.maxLines === undefined\n ) {\n return raw;\n }\n return styleUnifiedDiff(raw, options);\n}\n","import type { Context } from \"../core/context.js\";\nimport type { SharedResourceId } from \"../core/machine-ledger.js\";\nimport type { LedgerEntry } from \"../core/state-manifest.js\";\n\nexport interface PluginPresence {\n present: boolean;\n preExisting: boolean;\n}\n\nexport interface PluginVerificationResult {\n ok: boolean;\n detail?: string;\n attention?: string;\n}\n\nexport const RISK_CLASSES = [\n \"inert\",\n \"writes-config\",\n \"executes\",\n \"credential-adjacent\",\n] as const;\n\nexport type RiskClass = (typeof RISK_CLASSES)[number];\n\nexport const PROPOSED_OPERATION_ACTIONS = [\n \"create\",\n \"merge-block\",\n \"merge-key\",\n \"adopt\",\n \"replace\",\n \"install-package\",\n \"register-service\",\n \"use-shared\",\n \"conflict\",\n \"skip\",\n] as const;\n\nexport type ProposedOperationAction =\n (typeof PROPOSED_OPERATION_ACTIONS)[number];\n\nexport const UNREADABLE_GIT_CONFIG_CATEGORIES = [\n \"git-failed\",\n \"truncated\",\n \"malformed\",\n \"cap-reached\",\n \"not-a-regular-file\",\n] as const;\n\nexport type UnreadableGitConfigCategory =\n (typeof UNREADABLE_GIT_CONFIG_CATEGORIES)[number];\n\nexport type UntrustedGitConfig =\n | { kind: \"pairs\"; pairs: string[]; fingerprint: string }\n | { kind: \"tooMany\"; count: number; fingerprint: string }\n | { kind: \"unshowable\"; fingerprint: string }\n | { kind: \"unreadable\"; category: UnreadableGitConfigCategory };\n\nexport interface SkillUpdate {\n name: string;\n installedFingerprint: string;\n currentFingerprint: string;\n}\n\nexport interface ProposedOperation {\n id: string;\n capabilityId: string;\n resourceId: string;\n targetPath: string;\n action: ProposedOperationAction;\n riskClass: RiskClass;\n requiresConsent: boolean;\n expectedFingerprint: string | null;\n preview: { kind: \"diff\" | \"note\"; text: string };\n untrustedGitConfig?: UntrustedGitConfig;\n updates?: SkillUpdate[];\n}\n\nexport type StagedFileKind = \"markdown\" | \"json\" | \"yaml\" | \"text\";\n\nexport interface StagedFile {\n targetPath: string;\n contents: string;\n kind: StagedFileKind;\n}\n\nexport type CapabilityState =\n | \"present-managed\"\n | \"present-adopted\"\n | \"present-modified\"\n | \"absent\"\n | \"declined\"\n | \"unknown\";\n\nexport interface CapabilityStateRow {\n capabilityId: string;\n resourceId: string;\n label: string;\n state: CapabilityState;\n detail: string | null;\n}\n\nexport interface SharedResourceDeclaration {\n id: SharedResourceId;\n toolName: string;\n manualRemoveCommand: string;\n removalVerb: \"uninstall\" | \"disable\";\n migratesFromRepoLedgers: boolean;\n}\n\nexport interface SkippedPluginOperation {\n operationId: string;\n reason: string;\n}\n\nexport interface PluginApplyReport {\n skipped: SkippedPluginOperation[];\n}\n\nexport interface AgemonPlugin {\n id: string;\n dependsOn?: string[];\n riskClass?: RiskClass;\n sharedResources?: SharedResourceDeclaration[];\n detect(ctx: Context): Promise<PluginPresence>;\n desiredRevision?(ctx: Context, resourceId: string): string | null;\n describeState?(ctx: Context): Promise<CapabilityStateRow[]>;\n plan?(\n ctx: Context,\n plannedSoFar?: readonly ProposedOperation[],\n ): Promise<ProposedOperation[]>;\n materialize?(\n ctx: Context,\n operations: ProposedOperation[],\n ): Promise<StagedFile[]>;\n apply?(\n ctx: Context,\n operations: ProposedOperation[],\n staged?: StagedFile[],\n ): Promise<PluginApplyReport | undefined>;\n install?(ctx: Context): Promise<void>;\n verify(ctx: Context): Promise<PluginVerificationResult>;\n revert?(ctx: Context, entries: LedgerEntry[]): Promise<void>;\n describeKeptAfterRollback?(\n ctx: Context,\n operations: ProposedOperation[],\n ): Promise<string[]>;\n uninstall(ctx: Context): Promise<void>;\n}\n\nexport type PluginWithInstall = AgemonPlugin &\n Required<Pick<AgemonPlugin, \"install\">>;\n","import {\n type ProposedOperation,\n UNREADABLE_GIT_CONFIG_CATEGORIES,\n type UnreadableGitConfigCategory,\n type UntrustedGitConfig,\n} from \"../plugins/types.js\";\nimport type { SkippedOperation } from \"./consent.js\";\nimport type { Context } from \"./context.js\";\nimport { isSafeIdentifier } from \"./untrusted-text.js\";\n\nexport const MAX_UNTRUSTED_GIT_CONFIG_PAIRS = 20;\nexport const MAX_GIT_CONFIG_SOURCE_CHARACTERS = 60;\nexport const MAX_GIT_CONFIG_KEY_CHARACTERS = 200;\nexport const MAX_GIT_CONFIG_VALUE_CHARACTERS = 200;\nexport const MAX_UNTRUSTED_GIT_CONFIG_PAIR_CHARACTERS =\n MAX_GIT_CONFIG_SOURCE_CHARACTERS +\n \": \".length +\n MAX_GIT_CONFIG_KEY_CHARACTERS +\n \"=\".length +\n MAX_GIT_CONFIG_VALUE_CHARACTERS;\n\nexport type GitConfigGuardResult =\n | { kind: \"clean\" }\n | Exclude<UntrustedGitConfig, { kind: \"unreadable\" }>\n | {\n kind: \"unreadable\";\n category: UnreadableGitConfigCategory;\n detail: string;\n };\n\nexport interface GitConfigGuard {\n planned(): Promise<GitConfigGuardResult>;\n recheck(): Promise<GitConfigGuardResult>;\n}\n\nexport const CLEAN_GIT_CONFIG: GitConfigGuardResult = { kind: \"clean\" };\n\nexport const UNTRUSTED_GIT_CONFIG_REMEDY =\n \"Remove them, or run 'agemon nuke --only crg' and then 'agemon --only crg' interactively to review them in the trust gate.\";\n\nconst FINGERPRINT_PATTERN = /^[0-9a-f]{64}$/;\n\nexport function validateUntrustedGitConfig(\n value: unknown,\n field: string,\n fail: (detail: string) => never,\n): UntrustedGitConfig {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return fail(`'${field}' must be an object`);\n }\n const record = value as Record<string, unknown>;\n const fingerprint = (): string =>\n typeof record.fingerprint === \"string\" &&\n FINGERPRINT_PATTERN.test(record.fingerprint)\n ? record.fingerprint\n : fail(`'${field}.fingerprint' must be 64 lowercase hex characters`);\n switch (record.kind) {\n case \"pairs\": {\n const pairs = record.pairs;\n if (\n !Array.isArray(pairs) ||\n pairs.length === 0 ||\n pairs.length > MAX_UNTRUSTED_GIT_CONFIG_PAIRS ||\n !pairs.every(\n (pair) =>\n typeof pair === \"string\" &&\n pair.length <= MAX_UNTRUSTED_GIT_CONFIG_PAIR_CHARACTERS &&\n isSafeIdentifier(pair),\n )\n ) {\n return fail(\n `'${field}.pairs' must hold 1 to ${MAX_UNTRUSTED_GIT_CONFIG_PAIRS} safe strings of at most ${MAX_UNTRUSTED_GIT_CONFIG_PAIR_CHARACTERS} characters`,\n );\n }\n return {\n kind: \"pairs\",\n pairs: pairs as string[],\n fingerprint: fingerprint(),\n };\n }\n case \"tooMany\":\n return Number.isSafeInteger(record.count) &&\n (record.count as number) > MAX_UNTRUSTED_GIT_CONFIG_PAIRS\n ? {\n kind: \"tooMany\",\n count: record.count as number,\n fingerprint: fingerprint(),\n }\n : fail(\n `'${field}.count' must be an integer above ${MAX_UNTRUSTED_GIT_CONFIG_PAIRS}`,\n );\n case \"unshowable\":\n return { kind: \"unshowable\", fingerprint: fingerprint() };\n case \"unreadable\":\n return UNREADABLE_GIT_CONFIG_CATEGORIES.includes(\n record.category as UnreadableGitConfigCategory,\n )\n ? {\n kind: \"unreadable\",\n category: record.category as UnreadableGitConfigCategory,\n }\n : fail(\n `'${field}.category' must be one of ${UNREADABLE_GIT_CONFIG_CATEGORIES.join(\", \")}`,\n );\n default:\n return fail(\n `'${field}.kind' must be one of pairs, tooMany, unshowable, unreadable`,\n );\n }\n}\n\nfunction untrustedGitConfigField(\n result: GitConfigGuardResult,\n): UntrustedGitConfig | undefined {\n if (result.kind === \"clean\") {\n return undefined;\n }\n return result.kind === \"unreadable\"\n ? { kind: \"unreadable\", category: result.category }\n : result;\n}\n\nexport function describeUntrustedGitConfig(field: UntrustedGitConfig): string {\n switch (field.kind) {\n case \"pairs\":\n return `untrusted repository git config: ${field.pairs.join(\"; \")}`;\n case \"tooMany\":\n return `too many untrusted git config keys to review (${field.count} > ${MAX_UNTRUSTED_GIT_CONFIG_PAIRS})`;\n case \"unshowable\":\n return \"untrusted git config contains entries that cannot be shown safely\";\n case \"unreadable\":\n return `could not read this repository's git config (${field.category})`;\n }\n}\n\nfunction gitConfigMatchesPlan(\n current: GitConfigGuardResult,\n planned: UntrustedGitConfig | undefined,\n): boolean {\n if (planned === undefined || current.kind === \"clean\") {\n return planned === undefined && current.kind === \"clean\";\n }\n if (current.kind === \"unreadable\" || planned.kind === \"unreadable\") {\n return false;\n }\n return (\n current.kind === planned.kind && current.fingerprint === planned.fingerprint\n );\n}\n\nexport async function assertGitConfigMatchesPlan(\n guard: GitConfigGuard,\n operation: ProposedOperation | undefined,\n): Promise<void> {\n if (\n !gitConfigMatchesPlan(await guard.recheck(), operation?.untrustedGitConfig)\n ) {\n throw new Error(\n \"this repository's git config changed since the plan; run 'agemon plan' again and review it\",\n );\n }\n}\n\nexport async function markUntrustedGitConfig(\n ctx: Pick<Context, \"gitConfigGuard\" | \"ui\">,\n operations: ProposedOperation[],\n options: {\n runsGit: (operation: ProposedOperation) => boolean;\n reportsUnreadableConfig: boolean;\n },\n): Promise<ProposedOperation[]> {\n const { runsGit } = options;\n if (!operations.some(runsGit)) {\n return operations;\n }\n const result = await ctx.gitConfigGuard.planned();\n if (result.kind === \"unreadable\" && options.reportsUnreadableConfig) {\n ctx.ui.info(\n `could not read this repository's git config: ${result.detail}`,\n );\n }\n const field = untrustedGitConfigField(result);\n return field === undefined\n ? operations\n : operations.map((operation) =>\n runsGit(operation)\n ? { ...operation, untrustedGitConfig: field }\n : operation,\n );\n}\n\nfunction summarizeUntrustedKeys(\n result: Exclude<GitConfigGuardResult, { kind: \"clean\" | \"unreadable\" }>,\n): string {\n switch (result.kind) {\n case \"pairs\":\n return result.pairs.join(\"; \");\n case \"tooMany\":\n return `${result.count} keys`;\n case \"unshowable\":\n return \"entries that cannot be shown safely\";\n }\n}\n\ntype GitConfigVerification =\n | { kind: \"trusted\" }\n | { kind: \"unreadable\"; detail: string }\n | { kind: \"untrusted\"; untrustedKeys: string };\n\nexport async function verifyRepositoryGitConfig(\n guard: GitConfigGuard,\n): Promise<GitConfigVerification> {\n const result = await guard.planned();\n if (result.kind === \"clean\") {\n return { kind: \"trusted\" };\n }\n if (result.kind === \"unreadable\") {\n return {\n kind: \"unreadable\",\n detail: `could not read this repository's git config: ${result.detail}`,\n };\n }\n return { kind: \"untrusted\", untrustedKeys: summarizeUntrustedKeys(result) };\n}\n\nexport function joinAttention(...attentions: Array<string | undefined>): {\n attention?: string;\n} {\n const shown = attentions.filter(\n (attention): attention is string => attention !== undefined,\n );\n return shown.length === 0 ? {} : { attention: shown.join(\"; \") };\n}\n\nexport function needsGitConfigApproval(operation: ProposedOperation): boolean {\n return operation.untrustedGitConfig?.kind === \"pairs\";\n}\n\nexport function skipUnapprovableGitConfigOperations(\n operations: ProposedOperation[],\n): { approvable: ProposedOperation[]; skipped: SkippedOperation[] } {\n const approvable: ProposedOperation[] = [];\n const skipped: SkippedOperation[] = [];\n for (const operation of operations) {\n if (\n operation.untrustedGitConfig === undefined ||\n needsGitConfigApproval(operation)\n ) {\n approvable.push(operation);\n } else {\n skipped.push({\n operation,\n reason: describeUntrustedGitConfig(operation.untrustedGitConfig),\n consentMissing: true,\n });\n }\n }\n return { approvable, skipped };\n}\n","import type { IsolationStatus } from \"../inspect/discover.js\";\nimport type {\n ProposedOperation,\n ProposedOperationAction,\n} from \"../plugins/types.js\";\nimport { renderGateIntro } from \"../ui/consent-view.js\";\nimport type { Plan } from \"./plan-store.js\";\nimport {\n type ConflictReply,\n type GateReply,\n isInteractiveTerminal,\n} from \"./prompt.js\";\nimport { styleUnifiedDiff } from \"./text-diff.js\";\nimport { needsGitConfigApproval } from \"./untrusted-git-config.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nexport type ConsentGateId =\n | \"workspace-isolation\"\n | \"trust-repository-git-config\"\n | \"install-custom-skills\"\n | \"install-tooling\"\n | \"install-subagents\"\n | \"register-service\"\n | \"write-config\"\n | \"touch-instruction-files\"\n | \"resolve-conflict\";\n\nexport interface ConsentGate {\n id: ConsentGateId;\n summary: string;\n operations: ProposedOperation[];\n forcesDiff: boolean;\n announcementWithYes: string | null;\n satisfiableWithYes: boolean;\n}\n\nexport interface SkippedOperation {\n operation: ProposedOperation;\n reason: string;\n consentMissing: boolean;\n}\n\nexport type RecordedConflictDecision = \"keep\" | \"replace\" | \"skip\";\n\nexport interface ConflictResolution {\n resourceId: string;\n decision: RecordedConflictDecision;\n}\n\nexport interface ApprovedOperationSet {\n approved: ProposedOperation[];\n skipped: SkippedOperation[];\n workspaceIsolationApproved: boolean | null;\n conflictResolutions: ConflictResolution[];\n}\n\nconst INSTRUCTION_FILE_ACTIONS: ReadonlySet<ProposedOperationAction> = new Set([\n \"create\",\n \"replace\",\n \"merge-block\",\n \"adopt\",\n]);\n\ntype OperationGateId = Exclude<ConsentGateId, \"workspace-isolation\">;\n\nexport const CUSTOM_SKILL_GROUP_RESOURCE_PREFIX = \"custom-skill-group:\";\nexport const AGENT_FILE_RESOURCE_PREFIX = \"agent-file:\";\n\nconst TRUST_GATE_EXPLANATION =\n \"code-review-graph and its daemon will run git here with these repository settings, which agemon does not trust by default:\";\nconst DIFF_HEADER_LINE_COUNT = 2;\nconst FRONTMATTER_FENCE = \"---\";\nconst TOOLS_LINE_PATTERN = /^tools: (.+)$/u;\nconst UNKNOWN_TOOLS = \"tools: unknown — see diff\";\n\nconst OPERATION_GATE_ORDER: readonly OperationGateId[] = [\n \"trust-repository-git-config\",\n \"install-custom-skills\",\n \"install-tooling\",\n \"install-subagents\",\n \"register-service\",\n \"write-config\",\n \"touch-instruction-files\",\n \"resolve-conflict\",\n];\n\nexport interface BuildConsentGatesInput {\n plan: Plan;\n isolationStatus: IsolationStatus;\n trustRepoGitConfig?: boolean;\n}\n\nexport function buildConsentGates(\n input: BuildConsentGatesInput,\n): ConsentGate[] {\n const gates: ConsentGate[] = [];\n\n if (input.isolationStatus !== \"ignored\") {\n gates.push({\n id: \"workspace-isolation\",\n summary: isolationGateSummary(input.isolationStatus),\n operations: [],\n forcesDiff: false,\n announcementWithYes: null,\n satisfiableWithYes: true,\n });\n }\n\n const operationsByGate = new Map<OperationGateId, ProposedOperation[]>();\n for (const operation of input.plan.operations) {\n const gateId = gateForOperation(operation);\n if (gateId === null) {\n continue;\n }\n const bucket = operationsByGate.get(gateId);\n if (bucket) {\n bucket.push(operation);\n } else {\n operationsByGate.set(gateId, [operation]);\n }\n }\n\n for (const gateId of OPERATION_GATE_ORDER) {\n const operations = operationsByGate.get(gateId);\n if (operations === undefined) {\n continue;\n }\n gates.push(\n gateId === \"trust-repository-git-config\"\n ? trustRepositoryGitConfigGate(\n operations,\n input.trustRepoGitConfig === true,\n )\n : {\n id: gateId,\n summary: operationGateSummary(gateId, operations),\n operations,\n forcesDiff:\n gateId === \"install-custom-skills\" ||\n operations.some(\n (operation) => operation.riskClass === \"credential-adjacent\",\n ),\n announcementWithYes:\n gateId === \"install-subagents\"\n ? `Installing ${describeSubagents(operations)}.`\n : null,\n satisfiableWithYes: gateId !== \"resolve-conflict\",\n },\n );\n }\n\n return gates;\n}\n\nfunction untrustedPairsOf(operations: ProposedOperation[]): string[] {\n return [\n ...new Set(\n operations.flatMap((operation) =>\n operation.untrustedGitConfig?.kind === \"pairs\"\n ? operation.untrustedGitConfig.pairs\n : [],\n ),\n ),\n ];\n}\n\nfunction normalActionText(operation: ProposedOperation): string {\n const normalGate = gateForOperation({\n ...operation,\n untrustedGitConfig: undefined,\n });\n return normalGate === null\n ? `Record that this repository uses ${operation.targetPath || operation.resourceId}.`\n : operationGateSummary(normalGate, [operation]).replace(/ Proceed\\?$/, \"\");\n}\n\nfunction trustRepositoryGitConfigGate(\n operations: ProposedOperation[],\n flagGiven: boolean,\n): ConsentGate {\n const pairs = untrustedPairsOf(operations);\n const pairLines = pairs.map((pair) => ` ${pair}`).join(\"\\n\");\n return {\n id: \"trust-repository-git-config\",\n summary: `${operations.map(normalActionText).join(\" \")}\\n${TRUST_GATE_EXPLANATION}\\n${pairLines}\\nProceed?`,\n operations,\n forcesDiff: true,\n announcementWithYes: `${TRUST_GATE_EXPLANATION}\\n${pairLines}`,\n satisfiableWithYes: flagGiven,\n };\n}\n\nexport function useSharedOperations(plan: Plan): ProposedOperation[] {\n return plan.operations.filter(\n (operation) =>\n operation.action === \"use-shared\" && !needsGitConfigApproval(operation),\n );\n}\n\nfunction gateForOperation(\n operation: ProposedOperation,\n): OperationGateId | null {\n if (needsGitConfigApproval(operation)) {\n return \"trust-repository-git-config\";\n }\n if (operation.action === \"conflict\") {\n return \"resolve-conflict\";\n }\n if (operation.resourceId.startsWith(AGENT_FILE_RESOURCE_PREFIX)) {\n return \"install-subagents\";\n }\n const isCustomSkillGroup = operation.resourceId.startsWith(\n CUSTOM_SKILL_GROUP_RESOURCE_PREFIX,\n );\n if (\n isCustomSkillGroup &&\n (operation.action === \"install-package\" || operation.action === \"skip\")\n ) {\n return \"install-custom-skills\";\n }\n if (operation.action === \"skip\" && operation.requiresConsent) {\n return \"install-tooling\";\n }\n if (operation.action === \"skip\" || operation.action === \"use-shared\") {\n return null;\n }\n if (operation.riskClass === \"inert\" && !operation.requiresConsent) {\n throw new Error(\n `Operation ${printable(operation.id)} (${operation.action}) is marked as needing no consent; only use-shared operations may be.`,\n );\n }\n if (operation.action === \"install-package\") {\n return \"install-tooling\";\n }\n if (operation.action === \"register-service\") {\n return \"register-service\";\n }\n if (operation.action === \"merge-key\") {\n return \"write-config\";\n }\n if (INSTRUCTION_FILE_ACTIONS.has(operation.action)) {\n return \"touch-instruction-files\";\n }\n return null;\n}\n\nfunction isolationGateSummary(status: IsolationStatus): string {\n if (status === \"no-gitignore-file\") {\n return \"This repo has no .gitignore. agemon needs one so its regenerated state under .agemon/ is never committed. Create .gitignore with /.agemon/?\";\n }\n return \"agemon needs /.agemon/ git-ignored so its regenerated state is never committed. Add /.agemon/ to .gitignore?\";\n}\n\nfunction describeTargets(operations: ProposedOperation[]): string {\n return operations\n .map((operation) => operation.targetPath || operation.resourceId)\n .join(\", \");\n}\n\nfunction describeUpdates(operations: ProposedOperation[]): string {\n return operations\n .map(\n (operation) =>\n `${operation.resourceId} updates ${(operation.updates ?? []).map((update) => update.name).join(\", \")}`,\n )\n .join(\"; \");\n}\n\nfunction installToolingSummary(operations: ProposedOperation[]): string {\n const declines = operations.filter(\n (operation) => operation.action === \"skip\",\n );\n const updates = operations.filter(\n (operation) => (operation.updates ?? []).length > 0,\n );\n const installs = operations.filter(\n (operation) => operation.action !== \"skip\" && !updates.includes(operation),\n );\n const parts = [\n ...(installs.length > 0\n ? [\n `Install ${installs.length} package(s) (${describeTargets(installs)}). Uses pipx / npm`,\n ]\n : []),\n ...(updates.length > 0\n ? [\n `update or repair ${updates.length} skill group(s) to the version bundled with this agemon (${describeUpdates(updates)})`,\n ]\n : []),\n ...(declines.length > 0\n ? [\n `record ${declines.length} declined skill group(s) (${describeTargets(declines)})`,\n ]\n : []),\n ];\n const sentence = parts.join(\", and \");\n return `${sentence.charAt(0).toUpperCase()}${sentence.slice(1)}. Proceed?`;\n}\n\nfunction postImageFrontmatter(diffPreview: string): string[] | null {\n const postImage = diffPreview\n .split(\"\\n\")\n .slice(DIFF_HEADER_LINE_COUNT)\n .filter((line) => line.startsWith(\"+\") || line.startsWith(\" \"))\n .map((line) => line.slice(1));\n if (postImage[0] !== FRONTMATTER_FENCE) {\n return null;\n }\n const closingFence = postImage.indexOf(FRONTMATTER_FENCE, 1);\n return closingFence === -1 ? null : postImage.slice(1, closingFence);\n}\n\nfunction describeSubagent(operation: ProposedOperation): string {\n const name = operation.resourceId.slice(AGENT_FILE_RESOURCE_PREFIX.length);\n if (operation.preview.kind !== \"diff\") {\n return `${name} (already identical; nothing written)`;\n }\n const toolsLines = (postImageFrontmatter(operation.preview.text) ?? [])\n .map((line) => TOOLS_LINE_PATTERN.exec(line)?.[1])\n .filter((tools) => tools !== undefined);\n const tools =\n toolsLines.length === 1 ? `tools: ${toolsLines[0]}` : UNKNOWN_TOOLS;\n return `${name} [${tools}]`;\n}\n\nfunction describeSubagents(operations: ProposedOperation[]): string {\n return `${operations.length} Claude Code subagent definition(s) into .claude/agents: ${operations.map(describeSubagent).join(\", \")}. Each agent can use only the tools listed`;\n}\n\nfunction operationGateSummary(\n gateId: OperationGateId,\n operations: ProposedOperation[],\n): string {\n const targets = describeTargets(operations);\n switch (gateId) {\n case \"trust-repository-git-config\":\n return trustRepositoryGitConfigGate(operations, false).summary;\n case \"install-custom-skills\":\n return `Install skills from ${operations.length} skill group(s) defined in this repository's agemon.toml (${targets}). They come from the repository's own sources, not from agemon — review every source shown. Proceed?`;\n case \"install-tooling\":\n return installToolingSummary(operations);\n case \"install-subagents\":\n return `Install ${describeSubagents(operations)}. Proceed?`;\n case \"register-service\":\n return `Register ${operations.length} background service unit(s) (${targets}). Proceed?`;\n case \"write-config\":\n return `Merge ${operations.length} config key set(s) into ${targets}. Sibling keys stay untouched; exact diff shown. Proceed?`;\n case \"touch-instruction-files\":\n return `Write agemon's managed content into ${operations.length} instruction file(s) (${targets}). Your prose is preserved. Proceed?`;\n case \"resolve-conflict\":\n return `${operations.length} conflict(s) need an explicit decision.`;\n }\n}\n\nexport interface GatePrompts {\n gate(summary: string): Promise<GateReply>;\n conflict(summary: string): Promise<ConflictReply>;\n}\n\nexport interface ResolveConsentInput {\n gates: ConsentGate[];\n yes: boolean;\n log: Pick<Console, \"log\">;\n interactive?: boolean;\n prompts: GatePrompts;\n conflictDecisions?: ReadonlyMap<string, RecordedConflictDecision>;\n}\n\nexport async function resolveConsent(\n input: ResolveConsentInput,\n): Promise<ApprovedOperationSet> {\n const interactive = input.interactive ?? isInteractiveTerminal();\n const prompts = input.prompts;\n const approved: ProposedOperation[] = [];\n const skipped: SkippedOperation[] = [];\n const conflictResolutions: ConflictResolution[] = [];\n let workspaceIsolationApproved: boolean | null = null;\n\n const totalGates = input.gates.length;\n let gateIndex = 0;\n for (const gate of input.gates) {\n gateIndex += 1;\n const gateIntro =\n interactive && !(input.yes && gate.satisfiableWithYes)\n ? renderGateIntro({\n index: gateIndex,\n total: totalGates,\n gateId: gate.id,\n operations: gate.operations,\n })\n : undefined;\n\n if (gate.id === \"workspace-isolation\") {\n workspaceIsolationApproved = await askGate(gate, {\n yes: input.yes,\n interactive,\n prompts,\n log: input.log,\n intro: gateIntro,\n });\n if (!workspaceIsolationApproved) {\n input.log.log(\n \"Declined: /.agemon/ stays un-ignored — apply will refuse to write .agemon/ state unless --allow-unignored-state is passed.\",\n );\n }\n continue;\n }\n\n if (gate.id === \"resolve-conflict\") {\n if (gateIntro) {\n input.log.log(gateIntro);\n }\n for (const operation of gate.operations) {\n const outcome = await settleConflict(operation, {\n recordedDecision: input.conflictDecisions?.get(operation.resourceId),\n yes: input.yes,\n interactive,\n prompts,\n log: input.log,\n });\n if (outcome.decision !== null && outcome.recordable) {\n conflictResolutions.push({\n resourceId: operation.resourceId,\n decision: outcome.decision,\n });\n }\n if (outcome.decision === \"replace\") {\n if (operation.resourceId.startsWith(AGENT_FILE_RESOURCE_PREFIX)) {\n input.log.log(`Installing ${describeSubagents([operation])}.`);\n }\n approved.push({ ...operation, action: \"replace\" });\n continue;\n }\n skipped.push({\n operation,\n reason: outcome.reason,\n consentMissing: outcome.decision === null,\n });\n }\n continue;\n }\n\n const gateApproved = await askGate(gate, {\n yes: input.yes,\n interactive,\n prompts,\n log: input.log,\n intro: gateIntro,\n });\n if (gateApproved) {\n approved.push(...gate.operations);\n continue;\n }\n\n const consentMissing =\n !interactive && !(input.yes && gate.satisfiableWithYes);\n const reason = skipReason(gate, consentMissing);\n for (const operation of gate.operations) {\n skipped.push({ operation, reason, consentMissing });\n }\n input.log.log(`Skipped ${gate.operations.length} operation(s): ${reason}.`);\n }\n\n return {\n approved,\n skipped,\n workspaceIsolationApproved,\n conflictResolutions,\n };\n}\n\ninterface GateDecisionContext {\n yes: boolean;\n interactive: boolean;\n prompts: GatePrompts;\n log: Pick<Console, \"log\">;\n intro?: string;\n}\n\nfunction skipReason(gate: ConsentGate, consentMissing: boolean): string {\n if (gate.id === \"trust-repository-git-config\") {\n const pairs = untrustedPairsOf(gate.operations).join(\"; \");\n return consentMissing\n ? `untrusted repository git config (approve interactively or pass --yes --trust-repo-git-config): ${pairs}`\n : `declined: untrusted repository git config: ${pairs}`;\n }\n return consentMissing\n ? `no consent for the '${gate.id}' gate (non-interactive, no --yes)`\n : `declined at the '${gate.id}' consent gate`;\n}\n\nasync function askGate(\n gate: ConsentGate,\n ctx: GateDecisionContext,\n): Promise<boolean> {\n if (ctx.yes && gate.satisfiableWithYes) {\n if (gate.forcesDiff) {\n printOperationPreviews(gate.operations, ctx.log);\n }\n if (gate.announcementWithYes !== null) {\n ctx.log.log(gate.announcementWithYes);\n }\n return true;\n }\n if (!ctx.interactive) {\n return false;\n }\n\n if (ctx.intro) {\n ctx.log.log(ctx.intro);\n }\n for (;;) {\n const reply = await ctx.prompts.gate(gate.summary);\n if (reply !== \"show-diff\") {\n return reply === \"approve\";\n }\n printOperationPreviews(gate.operations, ctx.log);\n }\n}\n\ninterface ConflictOutcome {\n decision: RecordedConflictDecision | null;\n reason: string;\n}\n\nfunction describeRecordedDecision(decision: RecordedConflictDecision): string {\n switch (decision) {\n case \"keep\":\n return \"resolved by keeping your version\";\n case \"replace\":\n return \"resolved by replacing with agemon's version\";\n case \"skip\":\n return \"skipped\";\n }\n}\n\ninterface SettleConflictContext extends GateDecisionContext {\n recordedDecision: RecordedConflictDecision | undefined;\n}\n\ninterface SettledConflict extends ConflictOutcome {\n recordable: boolean;\n}\n\nasync function settleConflict(\n operation: ProposedOperation,\n ctx: SettleConflictContext,\n): Promise<SettledConflict> {\n if (operation.expectedFingerprint === null) {\n return {\n decision: \"keep\",\n reason: `${printable(operation.targetPath)} is not a regular file; agemon leaves it alone`,\n recordable: false,\n };\n }\n\n const { recordedDecision } = ctx;\n if (recordedDecision === \"replace\" && !ctx.yes) {\n if (!ctx.interactive) {\n return {\n decision: null,\n reason: \"recorded 'replace' needs --yes or an interactive session\",\n recordable: false,\n };\n }\n return {\n ...(await resolveConflict(\n operation,\n ctx,\n \"agemon.toml records 'replace'. \",\n )),\n recordable: true,\n };\n }\n if (recordedDecision !== undefined) {\n return {\n decision: recordedDecision,\n reason: `conflict ${describeRecordedDecision(recordedDecision)} per agemon.toml`,\n recordable: true,\n };\n }\n return { ...(await resolveConflict(operation, ctx)), recordable: true };\n}\n\nasync function resolveConflict(\n operation: ProposedOperation,\n ctx: Omit<GateDecisionContext, \"yes\">,\n questionPrefix = \"\",\n): Promise<ConflictOutcome> {\n if (!ctx.interactive) {\n return {\n decision: null,\n reason: `conflict left unresolved (non-interactive) — record \"${printable(operation.resourceId)}\" = \"keep\", \"replace\" or \"skip\" under [conflict_decisions] in agemon.toml`,\n };\n }\n\n const reply = await ctx.prompts.conflict(\n `${questionPrefix}Conflict at ${operation.targetPath || operation.resourceId}: keep, replace, show agemon's, or skip?`,\n );\n if (reply === \"show-theirs\") {\n printOperationPreviews([operation], ctx.log);\n return resolveConflict(operation, ctx, questionPrefix);\n }\n if (reply === \"skip\") {\n return { decision: \"skip\", reason: \"conflict skipped by choice\" };\n }\n const decision: RecordedConflictDecision = reply;\n return { decision, reason: describeRecordedDecision(decision) };\n}\n\nfunction printOperationPreviews(\n operations: ProposedOperation[],\n log: Pick<Console, \"log\">,\n): void {\n for (const operation of operations) {\n log.log(`--- ${operation.targetPath || operation.resourceId}`);\n log.log(\n operation.preview.kind === \"diff\"\n ? styleUnifiedDiff(printable(operation.preview.text), {\n color: true,\n context: 3,\n })\n : printable(operation.preview.text),\n );\n }\n}\n","import { lstat, mkdtemp, realpath, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { basename, join, relative, resolve } from \"node:path\";\nimport { redactSecretsInText } from \"../inspect/redact.js\";\nimport type { UnreadableGitConfigCategory } from \"../plugins/types.js\";\nimport { sha256Hex } from \"./fingerprint.js\";\nimport { hasGitEntry } from \"./repo-paths.js\";\nimport {\n GIT_TRANSPORTS_DISABLED,\n HARDENED_GIT_ARGS,\n REPOSITORY_LOCAL_GIT_VARIABLES,\n runRepositoryGit,\n} from \"./repository-git.js\";\nimport {\n describeSubprocessFailure,\n isSpawnFailure,\n runRealSubprocess,\n type SubprocessResult,\n TRUNCATION_MARKER,\n} from \"./subprocess-runner.js\";\nimport {\n CLEAN_GIT_CONFIG,\n type GitConfigGuard,\n type GitConfigGuardResult,\n MAX_GIT_CONFIG_KEY_CHARACTERS,\n MAX_GIT_CONFIG_SOURCE_CHARACTERS,\n MAX_GIT_CONFIG_VALUE_CHARACTERS,\n MAX_UNTRUSTED_GIT_CONFIG_PAIR_CHARACTERS,\n MAX_UNTRUSTED_GIT_CONFIG_PAIRS,\n} from \"./untrusted-git-config.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nconst MAX_KEYS_PER_CONFIG_FILE = 4096;\nconst MAX_SUBMODULE_DEPTH = 8;\nconst MAX_SUBMODULES = 256;\nconst GIT_LISTING_TIMEOUT_MS = 5_000;\nconst GITLINK_MODE = \"160000\";\nconst SPARSE_DIRECTORY_MODE = \"040000\";\nconst REGULAR_BLOB_MODE = \"100644\";\nconst UNMERGED_STAGE_NONE = \"0\";\nconst REPLACEMENT_CHARACTER = \"�\";\nconst VALUELESS_BOOLEAN = \"true\";\nconst REV_PARSE_NO_SUCH_REVISION = 1;\nconst GIT_NOT_A_REPOSITORY = 128;\n\nclass UnreadableGitConfigError extends Error {\n constructor(\n readonly category: UnreadableGitConfigCategory,\n detail: string,\n ) {\n super(detail);\n }\n}\n\ninterface Repository {\n worktree: string;\n gitDir: string;\n commonDir: string;\n isSubmodule: boolean;\n}\n\ninterface ConfigRecord {\n source: string;\n key: string;\n value: string | null;\n owner: Repository;\n}\n\ninterface IndexEntry {\n mode: string;\n stage: string;\n path: string;\n}\n\ninterface Walk {\n repoRoot: string;\n neutralDirectory: string;\n submodulesSeen: number;\n}\n\ntype ValueRule = (value: string) => boolean;\n\nconst anyValue: ValueRule = () => true;\nconst booleanValue: ValueRule = (value) =>\n /^(?:true|false|yes|no|on|off|1|0)$/i.test(value);\nconst oneOf =\n (...allowed: string[]): ValueRule =>\n (value) =>\n allowed.includes(value);\nconst either =\n (...rules: ValueRule[]): ValueRule =>\n (value) =>\n rules.some((rule) => rule(value));\nconst rebaseMode = either(booleanValue, oneOf(\"merges\", \"interactive\"));\n\nconst KEYS_WITHOUT_SUBSECTION: ReadonlyMap<string, ValueRule> = new Map([\n [\"core.repositoryformatversion\", oneOf(\"0\", \"1\")],\n [\"core.filemode\", booleanValue],\n [\"core.bare\", booleanValue],\n [\"core.logallrefupdates\", either(booleanValue, oneOf(\"always\"))],\n [\"core.ignorecase\", booleanValue],\n [\"core.precomposeunicode\", booleanValue],\n [\"core.symlinks\", booleanValue],\n [\"core.autocrlf\", either(booleanValue, oneOf(\"input\"))],\n [\"core.eol\", oneOf(\"lf\", \"crlf\", \"native\")],\n [\"core.sparsecheckout\", booleanValue],\n [\"core.sparsecheckoutcone\", booleanValue],\n [\"core.fsmonitor\", booleanValue],\n [\"core.hookspath\", anyValue],\n [\"extensions.objectformat\", oneOf(\"sha1\", \"sha256\")],\n [\"extensions.worktreeconfig\", booleanValue],\n [\"extensions.partialclone\", anyValue],\n [\"user.name\", anyValue],\n [\"user.email\", anyValue],\n [\"submodule.active\", anyValue],\n [\"lfs.repositoryformatversion\", oneOf(\"0\")],\n [\"pull.rebase\", rebaseMode],\n [\"pull.ff\", either(booleanValue, oneOf(\"only\"))],\n [\"init.defaultbranch\", anyValue],\n [\"fetch.prune\", booleanValue],\n [\n \"push.default\",\n oneOf(\"nothing\", \"current\", \"upstream\", \"simple\", \"matching\"),\n ],\n [\"rerere.enabled\", booleanValue],\n [\"gc.auto\", (value) => /^-?\\d+$/.test(value)],\n]);\n\nconst KEYS_WITH_ANY_SUBSECTION: ReadonlyMap<string, ValueRule> = new Map([\n [\"remote.url\", anyValue],\n [\"remote.pushurl\", anyValue],\n [\"remote.fetch\", anyValue],\n [\"remote.promisor\", booleanValue],\n [\"remote.partialclonefilter\", anyValue],\n [\"branch.remote\", anyValue],\n [\"branch.merge\", anyValue],\n [\"branch.rebase\", rebaseMode],\n [\"branch.vscode-merge-base\", anyValue],\n [\"submodule.url\", anyValue],\n [\"submodule.active\", booleanValue],\n [\"submodule.path\", anyValue],\n [\"submodule.branch\", anyValue],\n [\"submodule.shallow\", booleanValue],\n [\"submodule.ignore\", oneOf(\"dirty\", \"all\")],\n [\"lfs.access\", oneOf(\"basic\", \"negotiate\", \"none\")],\n [\"lfs.locksverify\", booleanValue],\n]);\n\nconst STOCK_GIT_LFS_FILTER: ReadonlyMap<string, ValueRule> = new Map([\n [\"clean\", oneOf(\"git-lfs clean -- %f\")],\n [\"smudge\", oneOf(\"git-lfs smudge -- %f\", \"git-lfs smudge --skip -- %f\")],\n [\"process\", oneOf(\"git-lfs filter-process\", \"git-lfs filter-process --skip\")],\n [\"required\", oneOf(\"true\")],\n]);\n\nconst CREDENTIAL_CARRYING_KEYS: ReadonlySet<string> = new Set([\n \"http.extraheader\",\n \"remote.url\",\n \"remote.pushurl\",\n \"credential.username\",\n]);\n\ninterface KeyParts {\n section: string;\n subsection: string | null;\n variable: string;\n}\n\nfunction splitKey(key: string): KeyParts | null {\n const firstDot = key.indexOf(\".\");\n const lastDot = key.lastIndexOf(\".\");\n if (firstDot <= 0 || lastDot === key.length - 1) {\n return null;\n }\n return {\n section: key.slice(0, firstDot).toLowerCase(),\n subsection: firstDot === lastDot ? null : key.slice(firstDot + 1, lastDot),\n variable: key.slice(lastDot + 1).toLowerCase(),\n };\n}\n\nasync function sameDirectory(left: string, right: string): Promise<boolean> {\n try {\n return (await realpath(left)) === (await realpath(right));\n } catch {\n return false;\n }\n}\n\nasync function isAllowlisted(record: ConfigRecord): Promise<boolean> {\n const parts = splitKey(record.key);\n if (parts === null) {\n return false;\n }\n const value = record.value ?? VALUELESS_BOOLEAN;\n const name = `${parts.section}.${parts.variable}`;\n if (parts.subsection === null) {\n if (name === \"core.worktree\") {\n return record.owner.isSubmodule;\n }\n return KEYS_WITHOUT_SUBSECTION.get(name)?.(value) ?? false;\n }\n if (parts.section === \"filter\" && parts.subsection === \"lfs\") {\n return STOCK_GIT_LFS_FILTER.get(parts.variable)?.(value) ?? false;\n }\n return KEYS_WITH_ANY_SUBSECTION.get(name)?.(value) ?? false;\n}\n\nfunction unreadableFromResult(\n result: SubprocessResult,\n command: string,\n): UnreadableGitConfigError | null {\n if (result.code !== 0) {\n return new UnreadableGitConfigError(\n \"git-failed\",\n describeSubprocessFailure(result, command),\n );\n }\n if (result.stdout.endsWith(TRUNCATION_MARKER)) {\n return new UnreadableGitConfigError(\n \"truncated\",\n `${command} output exceeded the capture limit`,\n );\n }\n return null;\n}\n\nfunction splitNulRecords(stdout: string, command: string): string[] {\n if (stdout === \"\") {\n return [];\n }\n if (!stdout.endsWith(\"\\0\")) {\n throw new UnreadableGitConfigError(\n \"malformed\",\n `${command} output does not end with a record terminator`,\n );\n }\n return stdout.slice(0, -1).split(\"\\0\");\n}\n\nfunction parseConfigListing(\n result: SubprocessResult,\n source: string,\n owner: Repository,\n): ConfigRecord[] {\n const command = `git config (${source})`;\n const failure = unreadableFromResult(result, command);\n if (failure !== null) {\n throw failure;\n }\n const rawRecords = splitNulRecords(result.stdout, command);\n if (rawRecords.length > MAX_KEYS_PER_CONFIG_FILE) {\n throw new UnreadableGitConfigError(\n \"cap-reached\",\n `${source} has more than ${MAX_KEYS_PER_CONFIG_FILE} keys`,\n );\n }\n return rawRecords.map((rawRecord) => {\n const separator = rawRecord.indexOf(\"\\n\");\n const key = separator < 0 ? rawRecord : rawRecord.slice(0, separator);\n if (key === \"\") {\n throw new UnreadableGitConfigError(\n \"malformed\",\n `${command} printed a record without a key`,\n );\n }\n return {\n source,\n key,\n value: separator < 0 ? null : rawRecord.slice(separator + 1),\n owner,\n };\n });\n}\n\nfunction sourceLabel(walk: Walk, path: string, suffix = \"\"): string {\n return `${relative(walk.repoRoot, path) || basename(path)}${suffix}`;\n}\n\nfunction runGitOutsideRepositories(\n walk: Walk,\n args: string[],\n): Promise<SubprocessResult> {\n return runRealSubprocess(\"git\", [...HARDENED_GIT_ARGS, ...args], {\n cwd: walk.neutralDirectory,\n timeoutMs: GIT_LISTING_TIMEOUT_MS,\n env: {\n ...GIT_TRANSPORTS_DISABLED,\n GIT_CEILING_DIRECTORIES: walk.neutralDirectory,\n },\n unsetEnv: REPOSITORY_LOCAL_GIT_VARIABLES,\n });\n}\n\nasync function listConfigFile(\n walk: Walk,\n path: string,\n owner: Repository,\n): Promise<ConfigRecord[]> {\n const result = await runGitOutsideRepositories(walk, [\n \"config\",\n \"--file\",\n path,\n \"--null\",\n \"--list\",\n ]);\n return parseConfigListing(result, sourceLabel(walk, path), owner);\n}\n\nasync function listConfigBlob(\n walk: Walk,\n owner: Repository,\n blob: string,\n label: string,\n): Promise<ConfigRecord[]> {\n const result = await runGitOutsideRepositories(walk, [\n `--git-dir=${owner.gitDir}`,\n \"config\",\n \"--blob\",\n blob,\n \"--null\",\n \"--list\",\n ]);\n return parseConfigListing(result, label, owner);\n}\n\nasync function regularFileExists(path: string): Promise<boolean> {\n let stats: Awaited<ReturnType<typeof lstat>>;\n try {\n stats = await lstat(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw new UnreadableGitConfigError(\n \"git-failed\",\n `cannot inspect ${path}: ${(error as Error).message}`,\n );\n }\n if (!stats.isFile()) {\n throw new UnreadableGitConfigError(\n \"not-a-regular-file\",\n `${path} is not a regular file`,\n );\n }\n return true;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction revParseRepository(directory: string): Promise<SubprocessResult> {\n return runRepositoryGit(directory, [\n \"rev-parse\",\n \"--show-toplevel\",\n \"--git-dir\",\n \"--git-common-dir\",\n ]);\n}\n\nasync function locateTopLevelRepository(\n directory: string,\n): Promise<Repository | null> {\n const result = await revParseRepository(directory);\n const failure = unreadableFromResult(result, \"git rev-parse\");\n if (failure === null) {\n return repositoryFrom(result, directory, false);\n }\n const gitAnsweredNoRepository =\n isSpawnFailure(result) || result.code === GIT_NOT_A_REPOSITORY;\n if (gitAnsweredNoRepository && !(await hasGitEntry(directory))) {\n return null;\n }\n throw failure;\n}\n\nasync function locateSubmodule(directory: string): Promise<Repository> {\n const result = await revParseRepository(directory);\n const failure = unreadableFromResult(result, \"git rev-parse\");\n if (failure !== null) {\n throw failure;\n }\n return repositoryFrom(result, directory, true);\n}\n\nasync function repositoryFrom(\n result: SubprocessResult,\n directory: string,\n isSubmodule: boolean,\n): Promise<Repository> {\n const [topLevel, gitDir, commonDir] = result.stdout.trim().split(\"\\n\");\n if (!topLevel || !gitDir || !commonDir) {\n throw new UnreadableGitConfigError(\n \"malformed\",\n \"git rev-parse did not print the work tree and git directories\",\n );\n }\n if (!(await sameDirectory(topLevel, directory))) {\n throw new UnreadableGitConfigError(\n \"git-failed\",\n `git treats ${directory} as part of the repository at ${topLevel}`,\n );\n }\n return {\n worktree: directory,\n gitDir: resolve(directory, gitDir),\n commonDir: resolve(directory, commonDir),\n isSubmodule,\n };\n}\n\nasync function listIndex(worktree: string): Promise<IndexEntry[]> {\n const result = await runRepositoryGit(worktree, [\n \"ls-files\",\n \"--sparse\",\n \"-s\",\n \"-z\",\n ]);\n const failure = unreadableFromResult(result, \"git ls-files\");\n if (failure !== null) {\n throw failure;\n }\n return splitNulRecords(result.stdout, \"git ls-files\").map((rawEntry) => {\n const match = /^(\\d{6}) [0-9a-f]+ (\\d)\\t(.+)$/s.exec(rawEntry);\n if (match === null) {\n throw new UnreadableGitConfigError(\n \"malformed\",\n \"git ls-files printed an entry agemon cannot read\",\n );\n }\n if (match[1] === SPARSE_DIRECTORY_MODE) {\n throw new UnreadableGitConfigError(\n \"malformed\",\n \"the index is sparse, so its gitlinks cannot be listed without expanding it\",\n );\n }\n return { mode: match[1], stage: match[2], path: match[3] };\n });\n}\n\nasync function readCommittedGitmodules(\n walk: Walk,\n owner: Repository,\n label: string,\n): Promise<ConfigRecord[]> {\n const head = await runRepositoryGit(owner.worktree, [\n \"rev-parse\",\n \"--verify\",\n \"--quiet\",\n \"HEAD\",\n ]);\n if (head.code === REV_PARSE_NO_SUCH_REVISION && !isSpawnFailure(head)) {\n return [];\n }\n const headFailure = unreadableFromResult(head, \"git rev-parse HEAD\");\n if (headFailure !== null) {\n throw headFailure;\n }\n const tree = await runRepositoryGit(owner.worktree, [\n \"ls-tree\",\n \"-z\",\n \"HEAD\",\n \"--\",\n \".gitmodules\",\n ]);\n const treeFailure = unreadableFromResult(tree, \"git ls-tree\");\n if (treeFailure !== null) {\n throw treeFailure;\n }\n const entries = splitNulRecords(tree.stdout, \"git ls-tree\");\n if (entries.length === 0) {\n return [];\n }\n if (\n entries.length !== 1 ||\n !entries[0].startsWith(`${REGULAR_BLOB_MODE} blob `)\n ) {\n throw new UnreadableGitConfigError(\n \"not-a-regular-file\",\n `${label} in HEAD is not a regular file`,\n );\n }\n return listConfigBlob(walk, owner, \"HEAD:.gitmodules\", `${label} (HEAD)`);\n}\n\nasync function readGitmodules(\n walk: Walk,\n owner: Repository,\n index: IndexEntry[],\n): Promise<ConfigRecord[]> {\n const worktreeFile = join(owner.worktree, \".gitmodules\");\n if (await regularFileExists(worktreeFile)) {\n return listConfigFile(walk, worktreeFile, owner);\n }\n const label = sourceLabel(walk, worktreeFile);\n const indexEntry = index.find(\n (entry) =>\n entry.path === \".gitmodules\" && entry.stage === UNMERGED_STAGE_NONE,\n );\n if (indexEntry === undefined) {\n return readCommittedGitmodules(walk, owner, label);\n }\n if (indexEntry.mode !== REGULAR_BLOB_MODE) {\n throw new UnreadableGitConfigError(\n \"not-a-regular-file\",\n `${label} in the index is not a regular file`,\n );\n }\n return listConfigBlob(walk, owner, \":.gitmodules\", `${label} (index)`);\n}\n\nasync function collectRecords(\n walk: Walk,\n repository: Repository,\n depth: number,\n): Promise<ConfigRecord[]> {\n const configFiles = [\n ...new Set([\n join(repository.commonDir, \"config\"),\n join(repository.gitDir, \"config.worktree\"),\n join(repository.commonDir, \"config.worktree\"),\n ]),\n ];\n const records: ConfigRecord[] = [];\n for (const configFile of configFiles) {\n if (await regularFileExists(configFile)) {\n records.push(...(await listConfigFile(walk, configFile, repository)));\n }\n }\n const index = await listIndex(repository.worktree);\n records.push(...(await readGitmodules(walk, repository, index)));\n\n const gitlinks = index.filter(\n (entry) =>\n entry.mode === GITLINK_MODE && entry.stage === UNMERGED_STAGE_NONE,\n );\n for (const gitlink of gitlinks) {\n walk.submodulesSeen += 1;\n if (walk.submodulesSeen > MAX_SUBMODULES) {\n throw new UnreadableGitConfigError(\n \"cap-reached\",\n `more than ${MAX_SUBMODULES} submodules`,\n );\n }\n if (gitlink.path.includes(REPLACEMENT_CHARACTER)) {\n throw new UnreadableGitConfigError(\n \"malformed\",\n \"a submodule path is not valid UTF-8\",\n );\n }\n const submoduleWorktree = join(repository.worktree, gitlink.path);\n if (!(await pathExists(join(submoduleWorktree, \".git\")))) {\n continue;\n }\n if (depth + 1 > MAX_SUBMODULE_DEPTH) {\n throw new UnreadableGitConfigError(\n \"cap-reached\",\n `submodules nested deeper than ${MAX_SUBMODULE_DEPTH} levels`,\n );\n }\n const submodule = await locateSubmodule(submoduleWorktree);\n records.push(...(await collectRecords(walk, submodule, depth + 1)));\n }\n return records;\n}\n\nfunction canonicalCredentialName(key: string): string | null {\n const parts = splitKey(key);\n return parts === null ? null : `${parts.section}.${parts.variable}`;\n}\n\nfunction displayedRecord(\n record: ConfigRecord,\n shown: (part: string) => string = (part) => part,\n): string {\n const firstDot = record.key.indexOf(\".\");\n const lastDot = record.key.lastIndexOf(\".\");\n const key =\n firstDot === lastDot\n ? record.key\n : `${record.key.slice(0, firstDot + 1)}${shown(record.key.slice(firstDot + 1, lastDot))}${record.key.slice(lastDot)}`;\n return record.value === null ? key : `${key}=${shown(record.value)}`;\n}\n\nfunction redactedDisplay(record: ConfigRecord): string {\n return printable(displayedRecord(record, redactSecretsInText));\n}\n\nfunction namesIncludedFile(record: ConfigRecord): boolean {\n const section = splitKey(record.key)?.section;\n return section === \"include\" || section === \"includeif\";\n}\n\nfunction isShowable(record: ConfigRecord): boolean {\n const value = record.value ?? \"\";\n if (\n namesIncludedFile(record) ||\n record.key.length > MAX_GIT_CONFIG_KEY_CHARACTERS ||\n value.length > MAX_GIT_CONFIG_VALUE_CHARACTERS ||\n !isSafeIdentifier(record.key) ||\n !isSafeIdentifier(value) ||\n `${record.key}${value}`.includes(REPLACEMENT_CHARACTER)\n ) {\n return false;\n }\n const credentialName = canonicalCredentialName(record.key);\n return (\n redactedDisplay(record) === displayedRecord(record) ||\n (credentialName !== null && CREDENTIAL_CARRYING_KEYS.has(credentialName))\n );\n}\n\nfunction shortSource(source: string): string {\n const shortened = source.split(\"/\").slice(-2).join(\"/\");\n return shortened.length > MAX_GIT_CONFIG_SOURCE_CHARACTERS\n ? `…${shortened.slice(-(MAX_GIT_CONFIG_SOURCE_CHARACTERS - 1))}`\n : shortened;\n}\n\nfunction fingerprintRecords(records: ConfigRecord[]): string {\n return sha256Hex(\n records\n .map(\n (record) =>\n `${record.source}\\0${record.key}\\0${record.value === null ? \"-\" : `=${record.value}`}\\0`,\n )\n .join(\"\"),\n );\n}\n\nasync function classify(\n records: ConfigRecord[],\n): Promise<GitConfigGuardResult> {\n const outside: ConfigRecord[] = [];\n for (const record of records) {\n if (!(await isAllowlisted(record))) {\n outside.push(record);\n }\n }\n if (outside.length === 0) {\n return CLEAN_GIT_CONFIG;\n }\n const fingerprint = fingerprintRecords(outside);\n if (!outside.every(isShowable)) {\n return { kind: \"unshowable\", fingerprint };\n }\n if (outside.length > MAX_UNTRUSTED_GIT_CONFIG_PAIRS) {\n return { kind: \"tooMany\", count: outside.length, fingerprint };\n }\n const pairs = outside.map(\n (record) => `${shortSource(record.source)}: ${redactedDisplay(record)}`,\n );\n if (\n pairs.some((pair) => pair.length > MAX_UNTRUSTED_GIT_CONFIG_PAIR_CHARACTERS)\n ) {\n return { kind: \"unshowable\", fingerprint };\n }\n return { kind: \"pairs\", pairs, fingerprint };\n}\n\nexport async function findUntrustedGitConfig(\n repoRoot: string,\n): Promise<GitConfigGuardResult> {\n const neutralDirectory = await mkdtemp(join(tmpdir(), \"agemon-git-config-\"));\n try {\n const repository = await locateTopLevelRepository(repoRoot);\n if (repository === null) {\n return CLEAN_GIT_CONFIG;\n }\n const walk: Walk = { repoRoot, neutralDirectory, submodulesSeen: 0 };\n return await classify(await collectRecords(walk, repository, 0));\n } catch (error) {\n if (error instanceof UnreadableGitConfigError) {\n return {\n kind: \"unreadable\",\n category: error.category,\n detail: printable(error.message),\n };\n }\n throw error;\n } finally {\n await rm(neutralDirectory, { recursive: true, force: true });\n }\n}\n\nexport function createGitConfigGuard(repoRoot: string): GitConfigGuard {\n let planned: Promise<GitConfigGuardResult> | undefined;\n return {\n planned() {\n planned ??= findUntrustedGitConfig(repoRoot);\n return planned;\n },\n recheck: () => findUntrustedGitConfig(repoRoot),\n };\n}\n","import { cancel, isCancel, select } from \"@clack/prompts\";\nimport type { GatePrompts } from \"./consent.js\";\nimport type { ConflictReply, GateReply } from \"./prompt.js\";\n\nconst CANCELLED_EXIT_CODE = 130;\n\nexport function assertNotCancelled<Value>(value: Value | symbol): Value {\n if (isCancel(value)) {\n cancel(\"Cancelled — nothing applied.\");\n process.exit(CANCELLED_EXIT_CODE);\n }\n return value as Value;\n}\n\nexport const clackPrompts: GatePrompts = {\n async gate(summary): Promise<GateReply> {\n return assertNotCancelled(\n await select<GateReply>({\n message: summary,\n options: [\n { value: \"approve\", label: \"Proceed\" },\n { value: \"decline\", label: \"Skip\" },\n { value: \"show-diff\", label: \"Show diff\" },\n ],\n initialValue: \"decline\",\n }),\n );\n },\n async conflict(summary): Promise<ConflictReply> {\n return assertNotCancelled(\n await select<ConflictReply>({\n message: summary,\n options: [\n { value: \"keep\", label: \"Keep — leave your version as-is\" },\n {\n value: \"replace\",\n label: \"Replace — overwrite with agemon's version\",\n },\n { value: \"show-theirs\", label: \"Show agemon's\" },\n { value: \"skip\", label: \"Skip — decide later\" },\n ],\n initialValue: \"skip\",\n }),\n );\n },\n};\n","import { createHmac, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n readRegularFileIfExists,\n writeFileAtomic,\n writeNewFileWithFallback,\n} from \"./files.js\";\nimport { ensureLedgerKey, readLedgerKey } from \"./ledger-key.js\";\nimport {\n identitiesAcceptingEntry,\n type ReceiptIdentities,\n repositoryReceiptIdentities,\n} from \"./machine-ledger.js\";\nimport { resolveStateDirectory } from \"./repo-paths.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\nimport { isWorkspaceEntry } from \"./workspace-footprint.js\";\n\nconst MANIFEST_RELATIVE_PATH = \".agemon/state.json\";\nconst LEDGER_VERSION = 3;\nconst RECEIPT_DOMAIN = \"agemon-ledger-entry/1\";\nconst RECEIPT_PATTERN = /^[0-9a-f]{64}$/u;\n\nexport type OwnershipMode = \"created\" | \"recorded-key\" | \"delimited-block\";\n\nexport interface LedgerBackupRef {\n path: string;\n checksum: string;\n}\n\nexport interface LedgerValidation {\n ok: boolean;\n detail?: string;\n}\n\nexport interface LedgerEntry {\n id: string;\n plugin: string;\n type: string;\n target: string;\n preExisting: boolean;\n createdAt: string;\n planId: string | null;\n resourceId: string | null;\n ownershipMode: OwnershipMode | null;\n agemonVersion: string | null;\n fingerprintBefore: string | null;\n fingerprintAfter: string | null;\n desiredRevision: string | null;\n validation: LedgerValidation | null;\n backup: LedgerBackupRef | null;\n receipt: string | null;\n}\n\nexport type ManifestAction = LedgerEntry;\n\nexport interface StateManifestData {\n version: typeof LEDGER_VERSION;\n createdAt: string;\n updatedAt: string;\n os: \"linux\";\n actions: LedgerEntry[];\n}\n\nexport interface RecordManifestActionInput {\n plugin: string;\n type: string;\n target: string;\n preExisting: boolean;\n planId?: string;\n resourceId?: string;\n ownershipMode?: OwnershipMode;\n agemonVersion?: string;\n fingerprintBefore?: string | null;\n fingerprintAfter?: string | null;\n desiredRevision?: string | null;\n validation?: LedgerValidation | null;\n backup?: LedgerBackupRef | null;\n}\n\nexport interface LedgerEntryPatch {\n fingerprintBefore?: string | null;\n fingerprintAfter?: string;\n desiredRevision?: string | null;\n validation?: LedgerValidation | null;\n}\n\ninterface LegacyManifestAction {\n id: string;\n plugin: string;\n type: string;\n target: string;\n preExisting: boolean;\n createdAt: string;\n}\n\nfunction createDefaultState(now: string): StateManifestData {\n return {\n version: LEDGER_VERSION,\n createdAt: now,\n updatedAt: now,\n os: \"linux\",\n actions: [],\n };\n}\n\nfunction inferOwnershipMode(type: string): OwnershipMode {\n if (type.includes(\"block\")) {\n return \"delimited-block\";\n }\n if (type.startsWith(\"preexisting-\")) {\n return \"recorded-key\";\n }\n return \"created\";\n}\n\nfunction isLegacyManifestAction(value: unknown): value is LegacyManifestAction {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const typed = value as Partial<LegacyManifestAction>;\n return (\n typeof typed.id === \"string\" &&\n typeof typed.plugin === \"string\" &&\n typeof typed.type === \"string\" &&\n typeof typed.target === \"string\" &&\n typeof typed.preExisting === \"boolean\" &&\n typeof typed.createdAt === \"string\"\n );\n}\n\nconst OWNERSHIP_MODES: readonly OwnershipMode[] = [\n \"created\",\n \"recorded-key\",\n \"delimited-block\",\n];\n\nfunction isOptionalString(value: unknown): boolean {\n return value === undefined || value === null || typeof value === \"string\";\n}\n\nfunction isOptionalOwnershipMode(value: unknown): boolean {\n return (\n value === undefined ||\n value === null ||\n OWNERSHIP_MODES.includes(value as OwnershipMode)\n );\n}\n\nfunction isOptionalRecord(\n value: unknown,\n isValidRecord: (record: Record<string, unknown>) => boolean,\n): boolean {\n if (value === undefined || value === null) {\n return true;\n }\n return (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n isValidRecord(value as Record<string, unknown>)\n );\n}\n\nfunction isLedgerEntry(value: unknown): value is LedgerEntry {\n if (!isLegacyManifestAction(value)) {\n return false;\n }\n const typed = value as unknown as Record<string, unknown>;\n return (\n isOptionalString(typed.planId) &&\n isOptionalString(typed.resourceId) &&\n isOptionalOwnershipMode(typed.ownershipMode) &&\n isOptionalString(typed.agemonVersion) &&\n isOptionalString(typed.fingerprintBefore) &&\n isOptionalString(typed.fingerprintAfter) &&\n isOptionalString(typed.desiredRevision) &&\n isOptionalRecord(\n typed.validation,\n (validation) =>\n typeof validation.ok === \"boolean\" &&\n (validation.detail === undefined ||\n typeof validation.detail === \"string\"),\n ) &&\n isOptionalRecord(\n typed.backup,\n (backup) =>\n typeof backup.path === \"string\" && typeof backup.checksum === \"string\",\n )\n );\n}\n\nconst PATH_TEXT_UNSAFE_CHARACTER_RANGES =\n \"\\\\u0000-\\\\u0008\\\\u000a-\\\\u001f\\\\u007f-\\\\u009f\";\nconst PATH_TEXT_UNSAFE_CHARACTERS = new RegExp(\n `[${PATH_TEXT_UNSAFE_CHARACTER_RANGES}]`,\n \"u\",\n);\n\nconst MAX_ECHOED_IDENTIFIER_CHARACTERS = 80;\n\nconst IDENTIFIER_TEXT_FIELDS = [\n \"id\",\n \"plugin\",\n \"type\",\n \"resourceId\",\n \"planId\",\n \"createdAt\",\n \"agemonVersion\",\n \"fingerprintBefore\",\n \"fingerprintAfter\",\n \"desiredRevision\",\n] as const;\n\nfunction isSafePathText(value: string): boolean {\n return !PATH_TEXT_UNSAFE_CHARACTERS.test(value);\n}\n\nfunction findUnsafeTextField(entry: Record<string, unknown>): string | null {\n for (const field of IDENTIFIER_TEXT_FIELDS) {\n const value = entry[field];\n if (typeof value === \"string\" && !isSafeIdentifier(value)) {\n return field;\n }\n }\n if (typeof entry.target === \"string\" && !isSafePathText(entry.target)) {\n return \"target\";\n }\n const validation = entry.validation as Record<string, unknown> | null;\n if (\n typeof validation?.detail === \"string\" &&\n !isSafeIdentifier(validation.detail)\n ) {\n return \"validation.detail\";\n }\n const backup = entry.backup as Record<string, unknown> | null;\n if (typeof backup?.path === \"string\" && !isSafePathText(backup.path)) {\n return \"backup.path\";\n }\n if (\n typeof backup?.checksum === \"string\" &&\n !isSafeIdentifier(backup.checksum)\n ) {\n return \"backup.checksum\";\n }\n return null;\n}\n\nfunction describeUnsafeEntry(\n entries: unknown[],\n): { index: number; field: string; entry: Record<string, unknown> } | null {\n for (const [index, value] of entries.entries()) {\n if (typeof value !== \"object\" || value === null) {\n continue;\n }\n const entry = value as Record<string, unknown>;\n const field = findUnsafeTextField(entry);\n if (field !== null) {\n return { index, field, entry };\n }\n }\n return null;\n}\n\nfunction assertSafeLedgerText(entries: unknown[]): void {\n const unsafe = describeUnsafeEntry(entries);\n if (unsafe === null) {\n return;\n }\n const shortText = (value: unknown) =>\n printable(String(value).slice(0, MAX_ECHOED_IDENTIFIER_CHARACTERS));\n throw new Error(\n `${MANIFEST_RELATIVE_PATH} entry ${unsafe.index} (${shortText(unsafe.entry.plugin)}/${shortText(unsafe.entry.id)}): '${unsafe.field}' contains a control character. agemon never writes this — restore .agemon/state.json from git or remove that entry; nuke and apply stay blocked until then.`,\n );\n}\n\nfunction normalizeLedgerEntry(value: LedgerEntry): LedgerEntry {\n return {\n id: value.id,\n plugin: value.plugin,\n type: value.type,\n target: value.target,\n preExisting: value.preExisting,\n createdAt: value.createdAt,\n planId: value.planId ?? null,\n resourceId: value.resourceId ?? null,\n ownershipMode: value.ownershipMode ?? null,\n agemonVersion: value.agemonVersion ?? null,\n fingerprintBefore: value.fingerprintBefore ?? null,\n fingerprintAfter: value.fingerprintAfter ?? null,\n desiredRevision: value.desiredRevision ?? null,\n validation: value.validation\n ? {\n ok: value.validation.ok,\n ...(value.validation.detail === undefined\n ? {}\n : { detail: value.validation.detail }),\n }\n : null,\n backup: value.backup\n ? { path: value.backup.path, checksum: value.backup.checksum }\n : null,\n receipt:\n typeof value.receipt === \"string\" && RECEIPT_PATTERN.test(value.receipt)\n ? value.receipt\n : null,\n };\n}\n\nfunction computeReceipt(\n key: Buffer,\n repositoryIdentity: string,\n entry: LedgerEntry,\n): Buffer {\n const { receipt: _unsigned, ...signedFields } = normalizeLedgerEntry(entry);\n return createHmac(\"sha256\", key)\n .update(JSON.stringify([RECEIPT_DOMAIN, repositoryIdentity, signedFields]))\n .digest();\n}\n\nfunction receiptMatches(\n key: Buffer,\n repositoryIdentity: string,\n entry: LedgerEntry,\n): boolean {\n return (\n entry.receipt !== null &&\n RECEIPT_PATTERN.test(entry.receipt) &&\n timingSafeEqual(\n Buffer.from(entry.receipt, \"hex\"),\n computeReceipt(key, repositoryIdentity, entry),\n )\n );\n}\n\nfunction describesSameResource(\n candidate: LedgerEntry,\n recorded: LedgerEntry,\n): boolean {\n if (candidate.plugin !== recorded.plugin) {\n return false;\n }\n return recorded.resourceId === null\n ? candidate.resourceId === null &&\n candidate.type === recorded.type &&\n candidate.target === recorded.target\n : candidate.resourceId === recorded.resourceId;\n}\n\nexport function parseLedgerEntries(value: unknown): LedgerEntry[] | null {\n if (\n !Array.isArray(value) ||\n !value.every((entry) => isLedgerEntry(entry)) ||\n describeUnsafeEntry(value) !== null\n ) {\n return null;\n }\n return value.map(normalizeLedgerEntry);\n}\n\nfunction migrateLegacyActionToLedgerEntry(\n action: LegacyManifestAction,\n): LedgerEntry {\n return {\n id: action.id,\n plugin: action.plugin,\n type: action.type,\n target: action.target,\n preExisting: action.preExisting,\n createdAt: action.createdAt,\n planId: null,\n resourceId: null,\n ownershipMode: inferOwnershipMode(action.type),\n agemonVersion: null,\n fingerprintBefore: null,\n fingerprintAfter: null,\n desiredRevision: null,\n validation: null,\n backup: null,\n receipt: null,\n };\n}\n\nfunction hasManifestEnvelope(value: unknown): value is {\n version: unknown;\n createdAt: string;\n updatedAt: string;\n os: \"linux\";\n actions: unknown[];\n} {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n const typed = value as Record<string, unknown>;\n return (\n typed.os === \"linux\" &&\n typeof typed.createdAt === \"string\" &&\n typeof typed.updatedAt === \"string\" &&\n Array.isArray(typed.actions)\n );\n}\n\ninterface LoadedManifest {\n state: StateManifestData;\n migratedFromVersion: number | null;\n}\n\nfunction interpretManifestContents(parsed: unknown): LoadedManifest {\n if (!hasManifestEnvelope(parsed)) {\n throw new Error(\"State manifest has an invalid schema\");\n }\n\n assertSafeLedgerText(parsed.actions);\n if (parsed.version === LEDGER_VERSION || parsed.version === 2) {\n const actions = parseLedgerEntries(parsed.actions);\n if (actions === null) {\n throw new Error(\"State manifest has an invalid schema\");\n }\n return {\n state: {\n version: LEDGER_VERSION,\n createdAt: parsed.createdAt,\n updatedAt: parsed.updatedAt,\n os: \"linux\",\n actions,\n },\n migratedFromVersion: parsed.version === LEDGER_VERSION ? null : 2,\n };\n }\n\n if (parsed.version === 1) {\n if (!parsed.actions.every((entry) => isLegacyManifestAction(entry))) {\n throw new Error(\"State manifest has an invalid schema\");\n }\n return {\n state: {\n version: LEDGER_VERSION,\n createdAt: parsed.createdAt,\n updatedAt: parsed.updatedAt,\n os: \"linux\",\n actions: (parsed.actions as LegacyManifestAction[]).map(\n migrateLegacyActionToLedgerEntry,\n ),\n },\n migratedFromVersion: 1,\n };\n }\n\n throw new Error(\n `Unrecognised state manifest version: ${String(parsed.version)}`,\n );\n}\n\nfunction parseManifestJson(rawContents: string): unknown {\n try {\n return JSON.parse(rawContents);\n } catch (error) {\n throw new Error(\n `${MANIFEST_RELATIVE_PATH} is not valid JSON (${printable((error as Error).message)}). ` +\n \"It was left untouched. Fix it, or move it aside to start with an empty \" +\n \"ledger (agemon then forgets what it installed in this repo).\",\n );\n }\n}\n\nexport function parseStateManifestContents(\n rawContents: string,\n): LoadedManifest {\n return interpretManifestContents(parseManifestJson(rawContents));\n}\n\nexport class StateManifest {\n private recordingAgemonVersion: string | null = null;\n private recordingPlanId: string | null = null;\n private receiptKey: Buffer | null = null;\n private receiptIdentities: ReceiptIdentities | null = null;\n\n private constructor(\n private readonly repoRoot: string,\n private readonly manifestPath: string,\n private state: StateManifestData,\n ) {}\n\n private async loadReceiptContext(): Promise<void> {\n this.receiptKey = await readLedgerKey();\n this.receiptIdentities = await repositoryReceiptIdentities(this.repoRoot);\n }\n\n private async signingContext(): Promise<{ key: Buffer; identity: string }> {\n await resolveStateDirectory(this.repoRoot, [], { create: true });\n this.receiptIdentities ??= await repositoryReceiptIdentities(this.repoRoot);\n this.receiptKey ??= await ensureLedgerKey();\n this.resignPathFormEntries(this.receiptKey, this.receiptIdentities);\n return { key: this.receiptKey, identity: this.receiptIdentities.signing };\n }\n\n private resignPathFormEntries(\n key: Buffer,\n { signing, byPath }: ReceiptIdentities,\n ): void {\n if (signing === byPath) {\n return;\n }\n for (const entry of this.state.actions) {\n if (this.isConfirmed(entry) && !receiptMatches(key, signing, entry)) {\n entry.receipt = computeReceipt(key, signing, entry).toString(\"hex\");\n }\n }\n }\n\n isConfirmed(entry: LedgerEntry): boolean {\n const key = this.receiptKey;\n if (key === null || this.receiptIdentities === null) {\n return false;\n }\n return identitiesAcceptingEntry(\n this.receiptIdentities,\n entry.createdAt,\n ).some((identity) => receiptMatches(key, identity, entry));\n }\n\n getConfirmedActions(): LedgerEntry[] {\n return this.state.actions.filter((action) => this.isConfirmed(action));\n }\n\n setRecordingAgemonVersion(version: string | null): void {\n this.recordingAgemonVersion = version;\n }\n\n setRecordingPlanId(planId: string | null): void {\n this.recordingPlanId = planId;\n }\n\n static async load(cwd: string): Promise<StateManifest> {\n const manifestPath = join(cwd, MANIFEST_RELATIVE_PATH);\n const now = new Date().toISOString();\n\n const stateDirectory = await resolveStateDirectory(cwd, [], {\n create: false,\n });\n let rawContents: string | null;\n try {\n rawContents =\n stateDirectory === null\n ? null\n : await readRegularFileIfExists(manifestPath);\n } catch (error) {\n throw new Error(\n `Unable to load manifest at ${manifestPath}: ${String(error)}`,\n );\n }\n if (rawContents === null) {\n return new StateManifest(cwd, manifestPath, createDefaultState(now));\n }\n\n const { state, migratedFromVersion } =\n parseStateManifestContents(rawContents);\n const manifest = new StateManifest(cwd, manifestPath, state);\n if (state.actions.length > 0) {\n await manifest.loadReceiptContext();\n }\n\n if (migratedFromVersion !== null) {\n await manifest.persistPreMigrationBackup(\n rawContents,\n migratedFromVersion,\n );\n await manifest.persist();\n }\n\n return manifest;\n }\n\n getActions(): LedgerEntry[] {\n return [...this.state.actions];\n }\n\n hasActions(): boolean {\n return this.state.actions.length > 0;\n }\n\n hasCapabilityActions(): boolean {\n return this.state.actions.some((action) => !isWorkspaceEntry(action));\n }\n\n hasActionForPlugin(plugin: string): boolean {\n return this.state.actions.some((action) => action.plugin === plugin);\n }\n\n async recordAction(input: RecordManifestActionInput): Promise<LedgerEntry> {\n const action: LedgerEntry = {\n id: randomUUID(),\n plugin: input.plugin,\n type: input.type,\n target: input.target,\n preExisting: input.preExisting,\n createdAt: new Date().toISOString(),\n planId: input.planId ?? this.recordingPlanId,\n resourceId: input.resourceId ?? null,\n ownershipMode: input.ownershipMode ?? null,\n agemonVersion: input.agemonVersion ?? this.recordingAgemonVersion,\n fingerprintBefore: input.fingerprintBefore ?? null,\n fingerprintAfter: input.fingerprintAfter ?? null,\n desiredRevision: input.desiredRevision ?? null,\n validation: input.validation ?? null,\n backup: input.backup ?? null,\n receipt: null,\n };\n assertSafeLedgerText([action]);\n const { key, identity } = await this.signingContext();\n action.receipt = computeReceipt(key, identity, action).toString(\"hex\");\n this.state.actions = this.state.actions.filter(\n (existing) =>\n this.isConfirmed(existing) || !describesSameResource(existing, action),\n );\n this.state.actions.push(action);\n await this.persist();\n return action;\n }\n\n async updateResourceEntry(\n resourceId: string,\n patch: LedgerEntryPatch,\n ): Promise<LedgerEntry | undefined> {\n const entriesForResource = this.state.actions.filter(\n (action) => action.resourceId === resourceId,\n );\n const entry =\n entriesForResource.find((action) => this.isConfirmed(action)) ??\n entriesForResource[0];\n if (!entry) {\n return undefined;\n }\n const wasConfirmed = this.isConfirmed(entry);\n assertSafeLedgerText([\n {\n ...entry,\n ...Object.fromEntries(\n Object.entries(patch).filter(([, value]) => value !== undefined),\n ),\n },\n ]);\n if (patch.fingerprintBefore !== undefined) {\n entry.fingerprintBefore = patch.fingerprintBefore;\n }\n if (patch.fingerprintAfter !== undefined) {\n entry.fingerprintAfter = patch.fingerprintAfter;\n }\n if (patch.desiredRevision !== undefined) {\n entry.desiredRevision = patch.desiredRevision;\n }\n if (patch.validation !== undefined) {\n entry.validation = patch.validation;\n }\n entry.receipt = null;\n if (wasConfirmed) {\n const { key, identity } = await this.signingContext();\n entry.receipt = computeReceipt(key, identity, entry).toString(\"hex\");\n }\n await this.persist();\n return entry;\n }\n\n async removeActionsForPlugin(plugin: string): Promise<void> {\n const nextActions = this.state.actions.filter(\n (action) => action.plugin !== plugin,\n );\n if (nextActions.length === this.state.actions.length) {\n return;\n }\n this.state.actions = nextActions;\n await this.persist();\n }\n\n async removeActionIds(ids: readonly string[]): Promise<void> {\n const removedIds = new Set(ids);\n const nextActions = this.state.actions.filter(\n (action) => !removedIds.has(action.id),\n );\n if (nextActions.length === this.state.actions.length) {\n return;\n }\n this.state.actions = nextActions;\n await this.persist();\n }\n\n async restoreActions(entries: LedgerEntry[]): Promise<void> {\n const restoredActions = entries.map(normalizeLedgerEntry);\n if (\n JSON.stringify(restoredActions) === JSON.stringify(this.state.actions)\n ) {\n return;\n }\n this.state.actions = restoredActions;\n await this.persist();\n }\n\n async pruneIfEmpty(): Promise<void> {\n if (this.state.actions.length > 0) {\n return;\n }\n\n const manifestDir = dirname(this.manifestPath);\n await rm(this.manifestPath, { force: true });\n await rm(manifestDir, { recursive: true, force: true });\n }\n\n private async persistPreMigrationBackup(\n rawContents: string,\n fromVersion: number,\n ): Promise<void> {\n const manifestDir = dirname(this.manifestPath);\n await resolveStateDirectory(this.repoRoot, [], { create: true });\n await writeNewFileWithFallback(\n join(manifestDir, `state.v${fromVersion}.bak`),\n join(manifestDir, `state.v${fromVersion}.${Date.now()}.bak`),\n rawContents,\n );\n }\n\n private async persist(): Promise<void> {\n const now = new Date().toISOString();\n this.state.updatedAt = now;\n\n const payload = `${JSON.stringify(this.state, null, 2)}\\n`;\n await resolveStateDirectory(this.repoRoot, [], { create: true });\n await writeFileAtomic(this.manifestPath, payload);\n }\n}\n","import { randomBytes, randomUUID } from \"node:crypto\";\nimport { link, lstat, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { readRegularFileIfExists } from \"./files.js\";\nimport {\n resolveAgemonStateDirectory,\n type StateDirectoryMode,\n withAgemonStateLock,\n} from \"./state-root.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst LEDGER_KEY_FILE_NAME = \"ledger-key\";\nconst LEDGER_KEY_LOCK_FILE_NAME = \"ledger-key.lock\";\nconst LEDGER_KEY_LOCK_WAIT_MS = 60_000;\nconst LEDGER_KEY_BYTES = 32;\nconst LEDGER_KEY_FILE_MODE = 0o600;\nconst GROUP_AND_OTHER_PERMISSIONS = 0o077;\nconst LEDGER_KEY_PATTERN = /^[0-9a-f]{64}\\n?$/u;\n\nfunction invalidKey(path: string, reason: string): Error {\n return new Error(\n `agemon's ledger key ${printable(path)} is invalid: ${reason}. Move it aside to continue; agemon then treats every existing ledger entry as unconfirmed.`,\n );\n}\n\nasync function ledgerKeyPath(mode: StateDirectoryMode): Promise<string> {\n return join(\n (await resolveAgemonStateDirectory(mode)).path,\n LEDGER_KEY_FILE_NAME,\n );\n}\n\nasync function readKeyAt(path: string): Promise<Buffer | null> {\n let stats: Awaited<ReturnType<typeof lstat>>;\n try {\n stats = await lstat(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n if (!stats.isFile()) {\n throw invalidKey(path, \"it is not a regular file\");\n }\n if (stats.uid !== process.getuid?.()) {\n throw invalidKey(path, \"it is owned by another user\");\n }\n if (stats.mode & GROUP_AND_OTHER_PERMISSIONS) {\n throw invalidKey(path, \"other users can read or change it\");\n }\n const contents = await readRegularFileIfExists(path);\n if (contents === null || !LEDGER_KEY_PATTERN.test(contents)) {\n throw invalidKey(path, \"it does not hold 64 hexadecimal characters\");\n }\n return Buffer.from(contents.trim(), \"hex\");\n}\n\nexport async function readLedgerKey(): Promise<Buffer | null> {\n return readKeyAt(await ledgerKeyPath(\"check\"));\n}\n\nasync function publishNewKey(path: string): Promise<void> {\n const temporaryPath = `${path}.tmp-${randomUUID()}`;\n await writeFile(\n temporaryPath,\n `${randomBytes(LEDGER_KEY_BYTES).toString(\"hex\")}\\n`,\n { mode: LEDGER_KEY_FILE_MODE, flag: \"wx\" },\n );\n try {\n await link(temporaryPath, path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n } finally {\n await rm(temporaryPath, { force: true });\n }\n}\n\nexport async function ensureLedgerKey(): Promise<Buffer> {\n const path = await ledgerKeyPath(\"prepare\");\n return withAgemonStateLock(\n LEDGER_KEY_LOCK_FILE_NAME,\n async () => {\n const existing = await readKeyAt(path);\n if (existing !== null) {\n return existing;\n }\n await publishNewKey(path);\n const created = await readKeyAt(path);\n if (created === null) {\n throw invalidKey(path, \"it disappeared right after agemon created it\");\n }\n return created;\n },\n LEDGER_KEY_LOCK_WAIT_MS,\n );\n}\n","import { lstat, realpath, rm } from \"node:fs/promises\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport type { HeldFileLock } from \"./file-lock.js\";\nimport { readRegularFileIfExists, writeFileAtomic } from \"./files.js\";\nimport {\n resolveAgemonStateDirectory,\n withAgemonStateLock,\n} from \"./state-root.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nconst MACHINE_LEDGER_VERSION = 1;\nconst MACHINE_LEDGER_FILE_NAME = \"machine.json\";\nconst MACHINE_LOCK_FILE_NAME = \"machine.lock\";\nconst MACHINE_LEDGER_FILE_MODE = 0o600;\nconst MACHINE_LOCK_WAIT_MS = 10 * 60_000;\nexport const MAX_SHARED_RESOURCE_HOLDERS = 1000;\n\nconst SHARED_RESOURCE_IDS = [\n \"pipx:code-review-graph\",\n \"npm-global:agnix\",\n \"linger\",\n] as const;\n\nexport type SharedResourceId = (typeof SHARED_RESOURCE_IDS)[number];\n\nconst DIRECTORY_ID_PATTERN = /^\\d+:\\d+:\\d+$/u;\n\nexport type SharedResourceRecord =\n | {\n origin: \"installed\";\n installedBy: string;\n ownerDirectoryId: string;\n holders: string[];\n }\n | {\n origin: \"migrated\";\n claimedBy: string;\n ownerDirectoryId: string;\n holders: string[];\n }\n | { origin: \"pre-existing\"; holders: string[] };\n\ninterface MachineLedger {\n version: typeof MACHINE_LEDGER_VERSION;\n resources: Partial<Record<SharedResourceId, SharedResourceRecord>>;\n}\n\ninterface SharedResourceChange<Result> {\n record: SharedResourceRecord | null;\n result: Result;\n}\n\nexport function isRecordableRepositoryPath(path: string): boolean {\n return isAbsolute(path) && resolve(path) === path && isSafeIdentifier(path);\n}\n\nexport async function directoryIdentity(path: string): Promise<string | null> {\n try {\n const stats = await lstat(path, { bigint: true });\n return `${stats.dev}:${stats.ino}:${stats.birthtimeNs}`;\n } catch {\n return null;\n }\n}\n\ninterface DirectoryTimes {\n ino: bigint;\n birthtimeNs: bigint;\n ctimeNs: bigint;\n}\n\nexport interface ReceiptIdentities {\n signing: string;\n byBirthTime: string | null;\n byPath: string;\n usableBirthTimeMs: number | null;\n}\n\nconst NANOSECONDS_PER_MILLISECOND = 1_000_000n;\nconst ENTRY_CLOCK_TOLERANCE_MS = 1_000;\n\nexport function receiptIdentitiesFromStats(\n stats: DirectoryTimes,\n realpathOfDirectory: string,\n): ReceiptIdentities {\n const byBirthTime =\n stats.birthtimeNs === 0n ? null : `${stats.ino}:${stats.birthtimeNs}`;\n const byPath = `${stats.ino}:${realpathOfDirectory}`;\n const birthTimeIsUsable =\n byBirthTime !== null && stats.birthtimeNs !== stats.ctimeNs;\n return {\n signing: birthTimeIsUsable ? byBirthTime : byPath,\n byBirthTime,\n byPath,\n usableBirthTimeMs: birthTimeIsUsable\n ? Number(stats.birthtimeNs / NANOSECONDS_PER_MILLISECOND)\n : null,\n };\n}\n\nexport function identitiesAcceptingEntry(\n identities: ReceiptIdentities,\n entryCreatedAt: string,\n): string[] {\n const createdAtMs = Date.parse(entryCreatedAt);\n const pathFormIsPlausible =\n identities.usableBirthTimeMs === null ||\n createdAtMs >= identities.usableBirthTimeMs - ENTRY_CLOCK_TOLERANCE_MS;\n return [\n ...(identities.byBirthTime === null ? [] : [identities.byBirthTime]),\n ...(pathFormIsPlausible ? [identities.byPath] : []),\n ];\n}\n\nexport async function repositoryReceiptIdentities(\n repoRoot: string,\n): Promise<ReceiptIdentities> {\n const realpathOfRepository = await realpath(repoRoot);\n return receiptIdentitiesFromStats(\n await lstat(realpathOfRepository, { bigint: true }),\n realpathOfRepository,\n );\n}\n\nfunction hasTrustworthyBirthTime(directoryId: string): boolean {\n return !directoryId.endsWith(\":0\");\n}\n\nfunction validateMachineLedger(parsed: unknown, path: string): MachineLedger {\n const fail = (detail: string): never => {\n throw new Error(\n `The shared-tools ledger ${printable(path)} is invalid: ${detail}. Move it aside to continue; agemon then keeps every shared tool installed until each repository registers again.`,\n );\n };\n const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n const repositoryPath = (value: unknown, field: string): string =>\n typeof value === \"string\" && isRecordableRepositoryPath(value)\n ? value\n : fail(`'${field}' must be an absolute, normalised path`);\n const directoryId = (value: unknown, field: string): string =>\n typeof value === \"string\" && DIRECTORY_ID_PATTERN.test(value)\n ? value\n : fail(`'${field}' must be a directory identity`);\n\n if (!isRecord(parsed) || parsed.version !== MACHINE_LEDGER_VERSION) {\n return fail(`expected version ${MACHINE_LEDGER_VERSION}`);\n }\n if (!isRecord(parsed.resources)) {\n return fail(\"'resources' must be an object\");\n }\n\n const resources: MachineLedger[\"resources\"] = {};\n for (const [resourceId, value] of Object.entries(parsed.resources)) {\n if (!SHARED_RESOURCE_IDS.includes(resourceId as SharedResourceId)) {\n fail(`unknown resource '${printable(resourceId)}'`);\n }\n const field = (name: string) => `resources.${resourceId}.${name}`;\n const record = isRecord(value)\n ? value\n : fail(`'resources.${resourceId}' must be an object`);\n if (!Array.isArray(record.holders)) {\n fail(`'${field(\"holders\")}' must be an array`);\n }\n const holders = (record.holders as unknown[]).map((holder, index) =>\n repositoryPath(holder, `${field(\"holders\")}[${index}]`),\n );\n if (new Set(holders).size !== holders.length) {\n fail(`'${field(\"holders\")}' lists a repository twice`);\n }\n if (holders.length > MAX_SHARED_RESOURCE_HOLDERS) {\n fail(\n `'${field(\"holders\")}' has more than ${MAX_SHARED_RESOURCE_HOLDERS} entries`,\n );\n }\n resources[resourceId as SharedResourceId] =\n record.origin === \"installed\"\n ? {\n origin: \"installed\",\n installedBy: repositoryPath(\n record.installedBy,\n field(\"installedBy\"),\n ),\n ownerDirectoryId: directoryId(\n record.ownerDirectoryId,\n field(\"ownerDirectoryId\"),\n ),\n holders,\n }\n : record.origin === \"migrated\"\n ? {\n origin: \"migrated\",\n claimedBy: repositoryPath(record.claimedBy, field(\"claimedBy\")),\n ownerDirectoryId: directoryId(\n record.ownerDirectoryId,\n field(\"ownerDirectoryId\"),\n ),\n holders,\n }\n : record.origin === \"pre-existing\"\n ? { origin: \"pre-existing\", holders }\n : fail(\n `'${field(\"origin\")}' must be installed, migrated or pre-existing`,\n );\n }\n return { version: MACHINE_LEDGER_VERSION, resources };\n}\n\nasync function machineLedgerPath(mode: \"check\" | \"prepare\"): Promise<string> {\n return join(\n (await resolveAgemonStateDirectory(mode)).path,\n MACHINE_LEDGER_FILE_NAME,\n );\n}\n\nasync function readLedgerAt(ledgerPath: string): Promise<MachineLedger> {\n const contents = await readRegularFileIfExists(ledgerPath);\n if (contents === null) {\n return { version: MACHINE_LEDGER_VERSION, resources: {} };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch {\n parsed = null;\n }\n return validateMachineLedger(parsed, ledgerPath);\n}\n\nexport async function readMachineLedger(): Promise<MachineLedger> {\n return readLedgerAt(await machineLedgerPath(\"check\"));\n}\n\nasync function pathIsGone(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return false;\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n }\n}\n\nexport async function withoutMissingHolders(\n holders: string[],\n reportPruned: (holder: string) => void,\n): Promise<string[]> {\n const existing: string[] = [];\n for (const holder of holders) {\n if (await pathIsGone(holder)) {\n reportPruned(holder);\n } else {\n existing.push(holder);\n }\n }\n return existing;\n}\n\nexport async function withoutReplacedOwner(\n record: SharedResourceRecord,\n): Promise<SharedResourceRecord> {\n if (record.origin === \"pre-existing\") {\n return record;\n }\n const owner =\n record.origin === \"installed\" ? record.installedBy : record.claimedBy;\n return hasTrustworthyBirthTime(record.ownerDirectoryId) &&\n (await directoryIdentity(owner)) === record.ownerDirectoryId\n ? record\n : { origin: \"pre-existing\", holders: record.holders };\n}\n\nexport async function withMachineLedgerLock<Result>(\n work: () => Promise<Result>,\n): Promise<Result> {\n return withAgemonStateLock(\n MACHINE_LOCK_FILE_NAME,\n () => work(),\n MACHINE_LOCK_WAIT_MS,\n );\n}\n\nexport async function updateSharedResource<Result>(\n resourceId: SharedResourceId,\n change: (\n record: SharedResourceRecord | null,\n lock: HeldFileLock,\n ) => Promise<SharedResourceChange<Result>>,\n reportPruned: (holder: string) => void,\n): Promise<Result> {\n const ledgerPath = await machineLedgerPath(\"prepare\");\n return withAgemonStateLock(\n MACHINE_LOCK_FILE_NAME,\n async (lock) => {\n const ledger = await readLedgerAt(ledgerPath);\n const stored = ledger.resources[resourceId] ?? null;\n const current =\n stored === null\n ? null\n : await withoutReplacedOwner({\n ...stored,\n holders: await withoutMissingHolders(\n stored.holders,\n reportPruned,\n ),\n });\n const { record, result } = await change(current, lock);\n\n const next: MachineLedger = {\n version: MACHINE_LEDGER_VERSION,\n resources: { ...ledger.resources },\n };\n if (record === null) {\n delete next.resources[resourceId];\n } else {\n next.resources[resourceId] = record;\n }\n try {\n validateMachineLedger(next, ledgerPath);\n } catch (error) {\n throw new Error(\n `agemon refused to write an invalid shared-tools ledger (a bug in agemon): ${(error as Error).message}`,\n );\n }\n await lock.assertStillHeld();\n if (Object.keys(next.resources).length === 0) {\n await rm(ledgerPath, { force: true });\n } else {\n await writeFileAtomic(\n ledgerPath,\n `${JSON.stringify(next, null, 2)}\\n`,\n { newFileMode: MACHINE_LEDGER_FILE_MODE },\n );\n }\n return result;\n },\n MACHINE_LOCK_WAIT_MS,\n );\n}\n","import { lstat, rm, rmdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"./context.js\";\nimport {\n RefusedFileError,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"./files.js\";\nimport { fingerprintContent } from \"./fingerprint.js\";\nimport {\n AGEMON_GITIGNORE_ENTRY as AGEMON_LINE,\n type GitignoreWrite,\n gitignoreListsEntry,\n SKILLS_LOCK_GITIGNORE_ENTRY as SKILLS_LOCK_LINE,\n} from \"./gitignore.js\";\nimport { AGEMON_STATE_DIRECTORY, resolveRepoDirectory } from \"./repo-paths.js\";\nimport type { LedgerEntry } from \"./state-manifest.js\";\n\nexport const WORKSPACE_PLUGIN_ID = \"workspace\";\n\nconst GITIGNORE_FILE = \".gitignore\";\nconst GITIGNORE_LINE_TYPE = \"gitignore-line\";\nconst CREATED_DIRECTORY_TYPE = \"created-directory\";\nconst SKILLS_LOCK_FILE = \"skills-lock.json\";\nconst RECORDABLE_LINES: readonly string[] = [AGEMON_LINE, SKILLS_LOCK_LINE];\nconst RECORDABLE_DIRECTORIES: readonly string[] = [\n \".claude\",\n \".claude/skills\",\n \".claude/agents\",\n];\nconst LINE_TERMINATOR = /\\r?\\n$/u;\nconst AFTER_EACH_LINE_TERMINATOR = /(?<=\\n)/u;\n\nfunction gitignoreLineResourceId(line: string): string {\n return `${GITIGNORE_LINE_TYPE}:${line}`;\n}\n\nfunction createdDirectoryResourceId(directory: string): string {\n return `${CREATED_DIRECTORY_TYPE}:${directory}`;\n}\n\nexport async function recordGitignoreLine(\n ctx: Context,\n line: string,\n write: GitignoreWrite,\n): Promise<void> {\n if (!write.added || !RECORDABLE_LINES.includes(line)) {\n return;\n }\n await ctx.manifest.recordAction({\n plugin: WORKSPACE_PLUGIN_ID,\n type: GITIGNORE_LINE_TYPE,\n target: GITIGNORE_FILE,\n resourceId: gitignoreLineResourceId(line),\n preExisting: write.existedBefore,\n fingerprintBefore:\n write.contentsBefore === null\n ? null\n : fingerprintContent(write.contentsBefore),\n });\n}\n\nexport async function recordCreatedDirectories(\n ctx: Context,\n createdDirectories: string[],\n): Promise<void> {\n for (const directory of createdDirectories) {\n if (RECORDABLE_DIRECTORIES.includes(directory)) {\n await ctx.manifest.recordAction({\n plugin: WORKSPACE_PLUGIN_ID,\n type: CREATED_DIRECTORY_TYPE,\n target: directory,\n resourceId: createdDirectoryResourceId(directory),\n preExisting: false,\n });\n }\n }\n}\n\nexport function isWorkspaceEntry(entry: LedgerEntry): boolean {\n return entry.plugin === WORKSPACE_PLUGIN_ID;\n}\n\nfunction recordedLine(entry: LedgerEntry): string | null {\n if (\n !isWorkspaceEntry(entry) ||\n entry.type !== GITIGNORE_LINE_TYPE ||\n entry.target !== GITIGNORE_FILE\n ) {\n return null;\n }\n return (\n RECORDABLE_LINES.find(\n (line) => entry.resourceId === gitignoreLineResourceId(line),\n ) ?? null\n );\n}\n\nfunction recordedDirectory(entry: LedgerEntry): string | null {\n return isWorkspaceEntry(entry) &&\n entry.type === CREATED_DIRECTORY_TYPE &&\n RECORDABLE_DIRECTORIES.includes(entry.target) &&\n entry.resourceId === createdDirectoryResourceId(entry.target)\n ? entry.target\n : null;\n}\n\nfunction recordedLines(entries: LedgerEntry[]): Set<string> {\n return new Set(\n entries.map(recordedLine).filter((line): line is string => line !== null),\n );\n}\n\nexport function isCreatedDirectoryEntry(entry: LedgerEntry): boolean {\n return recordedDirectory(entry) !== null;\n}\n\nfunction depth(directory: string): number {\n return directory.split(\"/\").length;\n}\n\nfunction deepestFirst(entries: LedgerEntry[]): LedgerEntry[] {\n return [...entries].sort(\n (left, right) => depth(right.target) - depth(left.target),\n );\n}\n\nfunction confirmedDirectoryEntries(ctx: Context): LedgerEntry[] {\n return ctx.manifest\n .getActions()\n .filter(\n (entry) =>\n isCreatedDirectoryEntry(entry) && ctx.manifest.isConfirmed(entry),\n );\n}\n\nfunction newestFirstConfirmedLineEntries(ctx: Context): LedgerEntry[] {\n return ctx.manifest\n .getActions()\n .filter(\n (entry) =>\n recordedLine(entry) !== null && ctx.manifest.isConfirmed(entry),\n )\n .reverse();\n}\n\nexport async function removeEmptyDirectories(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<Set<string>> {\n const goneEntryIds = new Set<string>();\n for (const entry of deepestFirst(entries)) {\n const directory = recordedDirectory(entry);\n if (directory === null) {\n continue;\n }\n try {\n const path = await resolveRepoDirectory(ctx.cwd, directory);\n if (path !== null) {\n await rmdir(path);\n }\n goneEntryIds.add(entry.id);\n } catch {\n // rmdir never deletes content: a non-empty, symlinked or busy directory stays with its entry.\n }\n }\n return goneEntryIds;\n}\n\nexport async function removeRecordedEmptyDirectories(\n ctx: Context,\n): Promise<void> {\n const goneEntryIds = await removeEmptyDirectories(\n ctx,\n confirmedDirectoryEntries(ctx),\n );\n await ctx.manifest.removeActionIds([...goneEntryIds]);\n}\n\nexport function describeDirectoryRemoval(entries: LedgerEntry[]): string[] {\n const directories = new Set(\n deepestFirst(entries.filter(isCreatedDirectoryEntry)).map(\n (entry) => entry.target,\n ),\n );\n return directories.size === 0\n ? []\n : [\n `remove empty directories agemon created: ${[...directories].join(\", \")}`,\n ];\n}\n\nexport function describeFootprintRemoval(\n ctx: Context,\n removesLastCapability: boolean,\n): string[] {\n const lines = describeDirectoryRemoval(confirmedDirectoryEntries(ctx));\n const linesToRemove = recordedLines(newestFirstConfirmedLineEntries(ctx));\n if (removesLastCapability && linesToRemove.size > 0) {\n lines.push(\n `remove from ${GITIGNORE_FILE}: ${[...linesToRemove].join(\", \")} (added by agemon)`,\n );\n }\n return lines;\n}\n\nfunction withoutLastExactLine(contents: string, line: string): string | null {\n const lines = contents.split(AFTER_EACH_LINE_TERMINATOR);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n if (lines[index].replace(LINE_TERMINATOR, \"\") === line) {\n lines.splice(index, 1);\n return lines.join(\"\");\n }\n }\n return null;\n}\n\nfunction withSeparatorAgemonAddedUndone(\n entry: LedgerEntry,\n contents: string,\n): string {\n const withoutFinalTerminator = contents.replace(LINE_TERMINATOR, \"\");\n return entry.fingerprintBefore !== null &&\n fingerprintContent(withoutFinalTerminator) === entry.fingerprintBefore\n ? withoutFinalTerminator\n : contents;\n}\n\nasync function exists(path: string): Promise<boolean> {\n return lstat(path).then(\n () => true,\n () => false,\n );\n}\n\nasync function removeRecordedLine(\n ctx: Context,\n line: string,\n entries: LedgerEntry[],\n agemonCreatedGitignore: boolean,\n): Promise<void> {\n const gitignorePath = join(ctx.cwd, GITIGNORE_FILE);\n for (const entry of entries) {\n let contents: string | null;\n try {\n contents = await readRegularFileIfExists(gitignorePath);\n } catch (error) {\n if (!(error instanceof RefusedFileError)) {\n throw error;\n }\n ctx.ui.info(\n `Keeping ${line} in ${GITIGNORE_FILE}: ${GITIGNORE_FILE} is not a regular file.`,\n );\n return;\n }\n const remaining =\n contents === null ? null : withoutLastExactLine(contents, line);\n if (remaining === null) {\n continue;\n }\n const restored = withSeparatorAgemonAddedUndone(entry, remaining);\n if (restored === \"\" && agemonCreatedGitignore) {\n if ((await lstat(gitignorePath)).isFile()) {\n await rm(gitignorePath);\n }\n return;\n }\n await writeFileAtomic(gitignorePath, restored);\n }\n}\n\nfunction reportClaimedLines(ctx: Context, confirmedLines: Set<string>): void {\n const claimedLines = recordedLines(\n ctx.manifest\n .getActions()\n .filter((entry) => !ctx.manifest.isConfirmed(entry)),\n );\n for (const line of claimedLines) {\n if (!confirmedLines.has(line)) {\n ctx.ui.info(\n `Keeping ${line} in ${GITIGNORE_FILE}: agemon has no record on this machine that it added it.`,\n );\n }\n }\n}\n\nasync function reportUnrecordedLines(ctx: Context): Promise<void> {\n let contents: string | null;\n try {\n contents = await readRegularFileIfExists(join(ctx.cwd, GITIGNORE_FILE));\n } catch {\n return;\n }\n const leftLines = RECORDABLE_LINES.filter(\n (line) => contents !== null && gitignoreListsEntry(contents, line),\n );\n if (leftLines.length === 0) {\n return;\n }\n const pronoun = leftLines.length === 1 ? \"it\" : \"them\";\n ctx.ui.info(\n `Left ${leftLines.join(\" and \")} in ${GITIGNORE_FILE}: agemon has no record of adding ${pronoun}. Remove ${pronoun} if you no longer need ${pronoun}.`,\n );\n}\n\nexport async function removeWorkspaceFootprint(ctx: Context): Promise<void> {\n const hasAnyLineEntry = ctx.manifest\n .getActions()\n .some((entry) => recordedLine(entry) !== null);\n const lineEntries = newestFirstConfirmedLineEntries(ctx);\n const agemonCreatedGitignore = lineEntries.some(\n (entry) => !entry.preExisting,\n );\n const removeLineUnless = async (\n line: string,\n stillNeededPath: string,\n keepReason: string,\n ) => {\n const entries = lineEntries.filter((entry) => recordedLine(entry) === line);\n if (entries.length === 0) {\n return;\n }\n if (await exists(join(ctx.cwd, stillNeededPath))) {\n ctx.ui.info(`Keeping ${line} in ${GITIGNORE_FILE}: ${keepReason}`);\n return;\n }\n await removeRecordedLine(ctx, line, entries, agemonCreatedGitignore);\n };\n reportClaimedLines(ctx, recordedLines(lineEntries));\n if (!hasAnyLineEntry) {\n await reportUnrecordedLines(ctx);\n }\n\n await removeLineUnless(\n SKILLS_LOCK_LINE,\n SKILLS_LOCK_FILE,\n `${SKILLS_LOCK_FILE} still exists`,\n );\n await ctx.manifest.removeActionsForPlugin(WORKSPACE_PLUGIN_ID);\n await ctx.manifest.pruneIfEmpty();\n await removeLineUnless(\n AGEMON_LINE,\n AGEMON_STATE_DIRECTORY,\n `${AGEMON_STATE_DIRECTORY}/ still exists`,\n );\n}\n","import type { StepSpinner } from \"../ui/spinner.js\";\nimport {\n capShownLine,\n MAX_RAW_OUTPUT_LINE_CHARACTERS,\n type RunSubprocessOptions,\n type SubprocessResult,\n safeOutputTail,\n sanitizeOutput,\n} from \"./subprocess-runner.js\";\n\nconst TRACED_LINES_PER_STREAM = 20;\n\nexport type RunSubprocess = (\n command: string,\n args: string[],\n options?: RunSubprocessOptions,\n) => Promise<SubprocessResult>;\n\nfunction tailLines(stream: string, prefix: string): string[] {\n const { earlierLineCount, lines } = safeOutputTail(\n stream,\n TRACED_LINES_PER_STREAM,\n );\n return [\n ...(earlierLineCount > 0 ? [`│ … ${earlierLineCount} earlier lines`] : []),\n ...lines.map((line) => `│ ${prefix}${line}`),\n ];\n}\n\nfunction describeCommandLine(command: string, args: string[]): string {\n const commandLine = [command, ...args]\n .join(\" \")\n .slice(0, MAX_RAW_OUTPUT_LINE_CHARACTERS);\n return capShownLine(sanitizeOutput(commandLine));\n}\n\nexport function traceSubprocessCalls(\n run: RunSubprocess,\n ui: Pick<StepSpinner, \"info\">,\n): RunSubprocess {\n return async (command, args, options) => {\n const result = await run(command, args, options);\n const lines = [\n `$ ${describeCommandLine(command, args)} (exit ${result.code})`,\n ...tailLines(result.stdout, \"\"),\n ...tailLines(result.stderr, \"! \"),\n ];\n for (const line of lines) {\n ui.info(line);\n }\n return result;\n };\n}\n","import { createHash } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n mkdtemp,\n readFile,\n realpath,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { findBinaryPath } from \"../platform/detect.js\";\nimport { readBoundedBody } from \"./bounded-response.js\";\nimport { errorMessage } from \"./error-message.js\";\nimport { readRegularFileIfExists, sha256OfRegularFile } from \"./files.js\";\nimport { sha256Hex } from \"./fingerprint.js\";\nimport { resolveGlobalNpmRoot } from \"./npm-global.js\";\nimport { resolveAgemonStateDirectory } from \"./state-root.js\";\nimport {\n agemonSubprocessEnvironment,\n describeSubprocessFailure,\n} from \"./subprocess-runner.js\";\nimport type { RunSubprocess } from \"./subprocess-trace.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst ARCHIVE_DOWNLOAD_TIMEOUT_MS = 120_000;\nconst MAX_ARCHIVE_BYTES = 50 * 1024 * 1024;\nconst EXTRACT_TIMEOUT_MS = 60_000;\nconst BINARY_PROBE_TIMEOUT_MS = 20_000;\nconst DOWNLOADED_ARCHIVE_MODE = 0o600;\nconst EXECUTABLE_MODE = 0o755;\nconst NPM_INSTALL_TIMEOUT_MS = 180_000;\nconst MAX_HASHED_FILE_BYTES = 50 * 1024 * 1024;\nconst MAX_NPM_TARBALL_BYTES = 20 * 1024 * 1024;\n\nexport interface VerifiedArchiveCandidate {\n url: string;\n sha256: string;\n}\n\nexport interface PinnedNpmTarball {\n url: string;\n integrity: string;\n}\n\nexport interface VerifiedBinaryInstallRequest {\n packageName: string;\n version: string;\n binaryPathInPackage: string;\n archiveMemberName: string;\n candidates: VerifiedArchiveCandidate[];\n packageTarball: PinnedNpmTarball;\n}\n\nexport interface InstalledPackageInspectionRequest {\n packageName: string;\n commandName: string;\n commandPathInPackage: string;\n binaryPathInPackage: string;\n packageFileSha256: Readonly<Record<string, string>>;\n binarySha256: readonly string[];\n}\n\nexport type InstalledPackageInspection =\n | { kind: \"absent\" }\n | { kind: \"installed\"; version: string | null; differences: string[] };\n\nexport interface VerifiedBinaryInstaller {\n install(request: VerifiedBinaryInstallRequest): Promise<void>;\n inspect(\n request: InstalledPackageInspectionRequest,\n ): Promise<InstalledPackageInspection>;\n}\n\nexport interface InstallVerifiedArchiveInput {\n archive: Uint8Array;\n expectedSha256: string;\n archiveMemberName: string;\n extractionParent: string;\n targetPath: string;\n run: RunSubprocess;\n}\n\nexport type VerifiedArchiveOutcome =\n | { binaryRuns: true }\n | { binaryRuns: false; probeFailure: string };\n\nexport async function installVerifiedArchive(\n input: InstallVerifiedArchiveInput,\n): Promise<VerifiedArchiveOutcome> {\n const actualSha256 = sha256Hex(Buffer.from(input.archive));\n if (actualSha256 !== input.expectedSha256) {\n throw new Error(\n `Downloaded archive does not match its pinned sha256: expected ${input.expectedSha256}, got ${actualSha256}.`,\n );\n }\n\n const extractionDirectory = await mkdtemp(\n join(input.extractionParent, \".agemon-extract-\"),\n );\n try {\n const archivePath = join(extractionDirectory, \"archive.tar.gz\");\n await writeFile(archivePath, input.archive, {\n mode: DOWNLOADED_ARCHIVE_MODE,\n });\n const extractResult = await input.run(\n \"tar\",\n [\"-xzf\", archivePath, input.archiveMemberName],\n { cwd: extractionDirectory, timeoutMs: EXTRACT_TIMEOUT_MS },\n );\n if (extractResult.code !== 0) {\n throw new Error(\n `Extracting ${input.archiveMemberName} from the verified archive failed: ${describeSubprocessFailure(extractResult, \"tar\")}`,\n );\n }\n\n const extractedBinary = join(extractionDirectory, input.archiveMemberName);\n if (!(await lstat(extractedBinary)).isFile()) {\n throw new Error(\n `${input.archiveMemberName} in the verified archive is not a regular file.`,\n );\n }\n await chmod(extractedBinary, EXECUTABLE_MODE);\n const probeResult = await input.run(extractedBinary, [\"--version\"], {\n timeoutMs: BINARY_PROBE_TIMEOUT_MS,\n });\n if (probeResult.code !== 0) {\n return {\n binaryRuns: false,\n probeFailure: describeSubprocessFailure(\n probeResult,\n `${input.archiveMemberName} --version`,\n ),\n };\n }\n await rename(extractedBinary, input.targetPath);\n return { binaryRuns: true };\n } finally {\n await rm(extractionDirectory, { recursive: true, force: true });\n }\n}\n\nasync function readInstalledManifest(\n packageDirectory: string,\n): Promise<{ version?: unknown }> {\n try {\n return JSON.parse(\n await readFile(join(packageDirectory, \"package.json\"), \"utf8\"),\n ) as { version?: unknown };\n } catch (error) {\n throw new Error(\n `${packageDirectory} does not hold an npm-installed package: ${errorMessage(error)}`,\n );\n }\n}\n\nasync function resolveInstalledPackageDirectory(\n run: RunSubprocess,\n request: VerifiedBinaryInstallRequest,\n cwd: string,\n): Promise<string> {\n const npmRoot = await resolveGlobalNpmRoot(run, { cwd });\n const packageDirectory = join(npmRoot, request.packageName);\n const installedManifest = await readInstalledManifest(packageDirectory);\n if (installedManifest.version !== request.version) {\n throw new Error(\n `${packageDirectory} holds ${request.packageName} ${printable(\n String(installedManifest.version),\n )}, expected ${request.version}.`,\n );\n }\n return packageDirectory;\n}\n\nasync function readBoundedArchive(\n fetchArchive: typeof fetch,\n url: string,\n maxBytes = MAX_ARCHIVE_BYTES,\n): Promise<Uint8Array> {\n const response = await fetchArchive(url, {\n signal: AbortSignal.timeout(ARCHIVE_DOWNLOAD_TIMEOUT_MS),\n });\n if (!response.ok || !response.body) {\n throw new Error(`HTTP ${response.status}`);\n }\n return readBoundedBody(\n response.body,\n maxBytes,\n () => new Error(`the archive exceeded the ${maxBytes}-byte limit`),\n );\n}\n\nasync function downloadArchive(\n fetchArchive: typeof fetch,\n url: string,\n): Promise<Uint8Array> {\n try {\n return await readBoundedArchive(fetchArchive, url);\n } catch (error) {\n throw new Error(`Downloading ${url} failed: ${errorMessage(error)}`);\n }\n}\n\nfunction npmIntegrityOf(contents: Uint8Array): string {\n return `sha512-${createHash(\"sha512\").update(contents).digest(\"base64\")}`;\n}\n\nasync function installVerifiedNpmTarball(\n input: { run: RunSubprocess; fetchArchive: typeof fetch },\n request: VerifiedBinaryInstallRequest,\n directory: string,\n): Promise<void> {\n let tarball: Uint8Array;\n try {\n tarball = await readBoundedArchive(\n input.fetchArchive,\n request.packageTarball.url,\n MAX_NPM_TARBALL_BYTES,\n );\n } catch (error) {\n throw new Error(\n `Could not download ${request.packageName} ${request.version} from ${request.packageTarball.url} (${errorMessage(error)}); agemon installs it only from there, verified by its pinned sha512.`,\n );\n }\n if (npmIntegrityOf(tarball) !== request.packageTarball.integrity) {\n throw new Error(\n `The downloaded ${request.packageName} ${request.version} tarball does not match its pinned sha512; nothing was installed.`,\n );\n }\n const tarballPath = join(\n directory,\n `${request.packageName}-${request.version}.tgz`,\n );\n await writeFile(tarballPath, tarball, { mode: DOWNLOADED_ARCHIVE_MODE });\n const installResult = await input.run(\n \"npm\",\n [\n \"install\",\n \"--global\",\n \"--ignore-scripts\",\n \"--no-audit\",\n \"--no-fund\",\n \"--no-update-notifier\",\n tarballPath,\n ],\n { cwd: directory, timeoutMs: NPM_INSTALL_TIMEOUT_MS },\n );\n if (installResult.code !== 0) {\n throw new Error(\n `npm global install of the verified ${request.packageName} ${request.version} tarball failed: ${describeSubprocessFailure(installResult, \"npm install\")}`,\n );\n }\n}\n\nasync function readOnlyNpmCwd(): Promise<string> {\n try {\n const stateDirectory = (await resolveAgemonStateDirectory(\"check\")).path;\n await lstat(stateDirectory);\n return stateDirectory;\n } catch {\n return homedir();\n }\n}\n\nasync function isRealDirectory(path: string): Promise<boolean> {\n return (await lstat(path)).isDirectory();\n}\n\nasync function hashOrReason(path: string): Promise<string> {\n try {\n return await sha256OfRegularFile(path, MAX_HASHED_FILE_BYTES);\n } catch (error) {\n return `unreadable (${errorMessage(error)})`;\n }\n}\n\nasync function readPackageVersion(\n packageDirectory: string,\n): Promise<string | null> {\n try {\n const manifest = JSON.parse(\n (await readRegularFileIfExists(join(packageDirectory, \"package.json\"))) ??\n \"null\",\n ) as { version?: unknown } | null;\n return typeof manifest?.version === \"string\" ? manifest.version : null;\n } catch {\n return null;\n }\n}\n\nasync function inspectInstalledPackage(\n run: RunSubprocess,\n request: InstalledPackageInspectionRequest,\n): Promise<InstalledPackageInspection> {\n let npmRoot: string;\n try {\n npmRoot = await realpath(\n await resolveGlobalNpmRoot(run, { cwd: await readOnlyNpmCwd() }),\n );\n } catch (error) {\n return {\n kind: \"installed\",\n version: null,\n differences: [\n `could not locate the global npm root (${errorMessage(error)})`,\n ],\n };\n }\n const packageDirectory = join(npmRoot, request.packageName);\n try {\n await lstat(packageDirectory);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { kind: \"absent\" };\n }\n }\n\n const differences: string[] = [];\n for (const directory of [packageDirectory, join(packageDirectory, \"bin\")]) {\n if (!(await isRealDirectory(directory).catch(() => false))) {\n differences.push(`${printable(directory)} is not a real directory`);\n }\n }\n for (const [file, expected] of Object.entries(request.packageFileSha256)) {\n const actual = await hashOrReason(join(packageDirectory, file));\n if (actual !== expected) {\n differences.push(\n `${file} ${actual.startsWith(\"unreadable\") ? actual : \"differs\"}`,\n );\n }\n }\n const binaryHash = await hashOrReason(\n join(packageDirectory, request.binaryPathInPackage),\n );\n if (!request.binarySha256.includes(binaryHash)) {\n differences.push(\n `${request.binaryPathInPackage} ${binaryHash.startsWith(\"unreadable\") ? binaryHash : \"is not a pinned build\"}`,\n );\n }\n const commandOnPath = await findBinaryPath(\n request.commandName,\n agemonSubprocessEnvironment().PATH ?? \"\",\n );\n const expectedCommand = join(packageDirectory, request.commandPathInPackage);\n const commandIsThisCopy =\n commandOnPath !== undefined &&\n (await realpath(commandOnPath).catch(() => null)) ===\n (await realpath(expectedCommand).catch(() => expectedCommand));\n if (!commandIsThisCopy) {\n differences.push(\n `${request.commandName} on PATH is not the npm copy at ${printable(packageDirectory)}`,\n );\n }\n return {\n kind: \"installed\",\n version: await readPackageVersion(packageDirectory),\n differences,\n };\n}\n\nexport interface CreateVerifiedBinaryInstallerInput {\n run: RunSubprocess;\n fetch?: typeof fetch;\n}\n\nexport function createVerifiedBinaryInstaller(\n input: CreateVerifiedBinaryInstallerInput,\n): VerifiedBinaryInstaller {\n const fetchArchive = input.fetch ?? fetch;\n return {\n inspect(request) {\n return inspectInstalledPackage(input.run, request);\n },\n async install(request) {\n const downloadDirectory = await mkdtemp(join(tmpdir(), \"agemon-npm-\"));\n try {\n await installVerifiedNpmTarball(\n { run: input.run, fetchArchive },\n request,\n downloadDirectory,\n );\n } finally {\n await rm(downloadDirectory, { recursive: true, force: true });\n }\n const packageDirectory = await resolveInstalledPackageDirectory(\n input.run,\n request,\n await readOnlyNpmCwd(),\n );\n const targetPath = join(packageDirectory, request.binaryPathInPackage);\n\n const probeFailures: string[] = [];\n for (const candidate of request.candidates) {\n const archive = await downloadArchive(fetchArchive, candidate.url);\n const outcome = await installVerifiedArchive({\n archive,\n expectedSha256: candidate.sha256,\n archiveMemberName: request.archiveMemberName,\n extractionParent: packageDirectory,\n targetPath,\n run: input.run,\n });\n if (outcome.binaryRuns) {\n return;\n }\n probeFailures.push(outcome.probeFailure);\n }\n\n throw new Error(\n `No pinned ${request.packageName} ${request.version} build runs on this host (${probeFailures.join(\"; \")}).`,\n );\n },\n };\n}\n","export async function readBoundedBody(\n body: ReadableStream<Uint8Array>,\n maxBytes: number,\n tooLarge: () => Error,\n): Promise<Buffer> {\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n for await (const chunk of body) {\n receivedBytes += chunk.byteLength;\n if (receivedBytes > maxBytes) {\n throw tooLarge();\n }\n chunks.push(chunk);\n }\n return Buffer.concat(chunks);\n}\n","import {\n detectRequiredBinaries,\n type PlatformCapabilities,\n REQUIRED_BINARIES,\n} from \"../platform/detect.js\";\nimport type { ServiceManager } from \"../platform/service-manager/index.js\";\nimport { createServiceManager } from \"../platform/service-manager/index.js\";\nimport type { StepProgress } from \"../ui/progress.js\";\nimport type { StepSpinner } from \"../ui/spinner.js\";\nimport type { CustomSkillGroupConfig } from \"./config.js\";\nimport {\n type ApprovedOperationSet,\n type ConsentGate,\n type RecordedConflictDecision,\n resolveConsent,\n} from \"./consent.js\";\nimport { assertFakeBackendsAreDevOnly } from \"./dev-mode.js\";\nimport { createGitConfigGuard } from \"./git-config-guard.js\";\nimport { createConfirmer, isInteractiveTerminal } from \"./prompt.js\";\nimport { clackPrompts } from \"./prompt-clack.js\";\nimport { StateManifest } from \"./state-manifest.js\";\nimport {\n agemonSubprocessEnvironment,\n type RunSubprocessOptions,\n runSubprocess,\n type SubprocessResult,\n} from \"./subprocess-runner.js\";\nimport {\n type RunSubprocess,\n traceSubprocessCalls,\n} from \"./subprocess-trace.js\";\nimport type { GitConfigGuard } from \"./untrusted-git-config.js\";\nimport {\n createVerifiedBinaryInstaller,\n type VerifiedBinaryInstaller,\n} from \"./verified-binary-installer.js\";\n\nexport type { SubprocessResult } from \"./subprocess-runner.js\";\n\nexport interface BinaryAvailability {\n name: string;\n present: boolean;\n path?: string;\n}\n\nexport interface Context {\n cwd: string;\n platform: PlatformCapabilities;\n binaries: BinaryAvailability[];\n dryRun: boolean;\n yes: boolean;\n interactive: boolean;\n log: Pick<Console, \"log\" | \"error\">;\n ui: StepSpinner;\n progress?: StepProgress;\n run: (\n command: string,\n args: string[],\n options?: RunSubprocessOptions,\n ) => Promise<SubprocessResult>;\n manifest: StateManifest;\n serviceManager: ServiceManager;\n verifiedBinaryInstaller: VerifiedBinaryInstaller;\n\n confirm: (message: string) => Promise<boolean>;\n consent: (\n gates: ConsentGate[],\n options?: {\n conflictDecisions?: ReadonlyMap<string, RecordedConflictDecision>;\n },\n ) => Promise<ApprovedOperationSet>;\n skillGroupsOption?: string;\n customSkillGroups?: CustomSkillGroupConfig[];\n removeSharedTools?: ReadonlySet<string>;\n gitConfigGuard: GitConfigGuard;\n}\n\nexport interface CreateContextInput {\n repoRoot: string;\n platform: PlatformCapabilities;\n dryRun: boolean;\n yes: boolean;\n ui: StepSpinner;\n progress: StepProgress;\n skillGroups?: string;\n customSkillGroups?: CustomSkillGroupConfig[];\n verbose?: boolean;\n removeSharedTools?: ReadonlySet<string>;\n}\n\nasync function selectVerifiedBinaryInstaller(\n run: RunSubprocess,\n): Promise<VerifiedBinaryInstaller> {\n if (process.env.AGEMON_FAKE_SUBPROCESS === \"1\") {\n const { createFakeVerifiedBinaryInstaller } = await import(\n \"./fake-subprocess.js\"\n );\n return createFakeVerifiedBinaryInstaller();\n }\n return createVerifiedBinaryInstaller({ run });\n}\n\nexport async function createContext(\n input: CreateContextInput,\n): Promise<Context> {\n assertFakeBackendsAreDevOnly();\n const binaries = await detectRequiredBinaries(\n agemonSubprocessEnvironment().PATH ?? \"\",\n );\n const interactive = isInteractiveTerminal();\n const runInRepo: RunSubprocess = (command, args, options) =>\n runSubprocess(command, args, { cwd: input.repoRoot, ...options });\n const run = input.verbose\n ? traceSubprocessCalls(runInRepo, input.ui)\n : runInRepo;\n\n const checkedBinaries = REQUIRED_BINARIES.map((name) => binaries[name]);\n const presentBinaries = checkedBinaries.filter((binary) => binary.present);\n const presentNames = presentBinaries.map((binary) => binary.name).join(\", \");\n input.ui.info(\n presentNames\n ? `${presentBinaries.length}/${checkedBinaries.length} tools present — ${presentNames}`\n : `${presentBinaries.length}/${checkedBinaries.length} tools present`,\n );\n for (const binary of checkedBinaries) {\n if (!binary.present) {\n input.ui.info(`${binary.name} missing`);\n }\n }\n\n return {\n cwd: input.repoRoot,\n platform: input.platform,\n binaries: checkedBinaries,\n dryRun: input.dryRun,\n yes: input.yes,\n interactive,\n skillGroupsOption: input.skillGroups,\n customSkillGroups: input.customSkillGroups,\n removeSharedTools: input.removeSharedTools,\n gitConfigGuard: createGitConfigGuard(input.repoRoot),\n log: console,\n ui: input.ui,\n progress: input.progress,\n run,\n manifest: await StateManifest.load(input.repoRoot),\n serviceManager: createServiceManager({\n kind: input.platform.serviceManager,\n run: runSubprocess,\n }),\n verifiedBinaryInstaller: await selectVerifiedBinaryInstaller(run),\n confirm: createConfirmer({ yes: input.yes }),\n consent: (gates, options) =>\n resolveConsent({\n gates,\n yes: input.yes,\n log: console,\n prompts: clackPrompts,\n conflictDecisions: options?.conflictDecisions,\n }),\n };\n}\n","import { constants } from \"node:os\";\nimport { errorMessage } from \"./error-message.js\";\n\nconst INTERRUPT_SIGNALS = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const;\nconst SIGNAL_EXIT_CODE_BASE = 128;\n\ntype InterruptSignal = (typeof INTERRUPT_SIGNALS)[number];\n\nexport type ExitProcess = (code: number) => void;\n\nfunction exitCodeFor(signal: InterruptSignal): number {\n return SIGNAL_EXIT_CODE_BASE + constants.signals[signal];\n}\n\nexport class ApplyInterruptedError extends Error {\n readonly signal: InterruptSignal;\n readonly exitCode: number;\n\n constructor(signal: InterruptSignal, stepError?: unknown) {\n super(\n stepError === undefined\n ? `interrupted by ${signal}`\n : `interrupted by ${signal} (${errorMessage(stepError)})`,\n );\n this.name = \"ApplyInterruptedError\";\n this.signal = signal;\n this.exitCode = exitCodeFor(signal);\n }\n}\n\nexport function ignoringTerminalErrors(print: () => void): void {\n try {\n print();\n } catch {\n // After SIGHUP the terminal may be gone (EIO); rollback and its result must not depend on it.\n }\n}\n\nexport interface InterruptionWatch {\n throwIfInterrupted(): void;\n causeOf(error: unknown): unknown;\n dispose(): void;\n}\n\nexport function watchForInterruption(\n onFirstSignal: () => void,\n exitProcess: ExitProcess,\n): InterruptionWatch {\n let received: InterruptSignal | null = null;\n\n const handleSignal = (signal: InterruptSignal): void => {\n if (received !== null) {\n exitProcess(exitCodeFor(signal));\n return;\n }\n received = signal;\n ignoringTerminalErrors(onFirstSignal);\n };\n for (const signal of INTERRUPT_SIGNALS) {\n process.on(signal, handleSignal);\n }\n\n return {\n throwIfInterrupted() {\n if (received !== null) {\n throw new ApplyInterruptedError(received);\n }\n },\n causeOf(error) {\n if (received === null || error instanceof ApplyInterruptedError) {\n return error;\n }\n return new ApplyInterruptedError(received, error);\n },\n dispose() {\n for (const signal of INTERRUPT_SIGNALS) {\n process.off(signal, handleSignal);\n }\n },\n };\n}\n","import { access, rm } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport { discoverRepository } from \"../inspect/discover.js\";\nimport { redactSecretsInText } from \"../inspect/redact.js\";\nimport { verifyManagedState } from \"../inspect/status.js\";\nimport { CORE_CAPABILITY_IDS } from \"../plugins/index.js\";\nimport type { AgemonPlugin, ProposedOperation } from \"../plugins/types.js\";\nimport { renderPlan } from \"../ui/plan-view.js\";\nimport { renderRunSummary } from \"../ui/summary.js\";\nimport {\n ApplyRollbackError,\n applyPlan,\n FILE_TARGETING_ACTIONS,\n} from \"./apply.js\";\nimport { assertNoInterruptedApply } from \"./apply-journal.js\";\nimport {\n type ConflictDecision,\n resolveConfigPath,\n writeConfig,\n} from \"./config.js\";\nimport type { ConflictResolution, SkippedOperation } from \"./consent.js\";\nimport { buildConsentGates, useSharedOperations } from \"./consent.js\";\nimport type { Context } from \"./context.js\";\nimport {\n computePlanId,\n type Plan,\n planContentFingerprint,\n resolveDesiredStateHash,\n writePlan,\n} from \"./plan-store.js\";\nimport { isInteractiveTerminal } from \"./prompt.js\";\nimport { checkAgemonStateDirectoryBeforeRun } from \"./state-root.js\";\nimport { MAX_RAW_OUTPUT_LINE_CHARACTERS } from \"./subprocess-runner.js\";\nimport { skipUnapprovableGitConfigOperations } from \"./untrusted-git-config.js\";\nimport { printable } from \"./untrusted-text.js\";\nimport {\n describeFootprintRemoval,\n isWorkspaceEntry,\n removeRecordedEmptyDirectories,\n removeWorkspaceFootprint,\n} from \"./workspace-footprint.js\";\n\nexport type RunOutcome =\n | \"applied\"\n | \"nothing-to-do\"\n | \"drift\"\n | \"partial\"\n | \"declined\"\n | \"previewed\";\n\nconst DRIFT_EXIT_CODE = 2;\n\nexport function exitCodeForOutcome(outcome: RunOutcome): number {\n return outcome === \"drift\" || outcome === \"partial\" ? DRIFT_EXIT_CODE : 0;\n}\n\nexport interface UninstallOptions {\n only?: string[];\n skipIds?: string[];\n}\n\nexport type UninstallOutcome = Extract<\n RunOutcome,\n \"applied\" | \"nothing-to-do\" | \"declined\" | \"previewed\"\n>;\n\nconst MAX_PREVIEW_LINES_PER_PLUGIN = 20;\nconst MAX_PREVIEW_LINE_CHARACTERS = 300;\nconst MAX_FAILURE_DETAIL_CHARACTERS = 200;\nconst NOTHING_TO_DO_MESSAGE =\n \"Nothing to do — every managed resource already matches the desired state.\";\nconst NOTHING_APPLIED_MESSAGE =\n \"Nothing was applied; see the skipped items above.\";\n\nfunction singleLine(untrusted: string, maxCharacters: number): string {\n const line = printable(untrusted).replace(/[\\n\\t]/g, \" \");\n return line.length > maxCharacters\n ? `${line.slice(0, maxCharacters)}…`\n : line;\n}\n\nfunction describeFailure(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n const [firstLine = \"\"] = message.trim().split(/\\r?\\n/);\n return singleLine(\n redactSecretsInText(firstLine.slice(0, MAX_RAW_OUTPUT_LINE_CHARACTERS)),\n MAX_FAILURE_DETAIL_CHARACTERS,\n );\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n return access(path).then(\n () => true,\n () => false,\n );\n}\n\nexport interface ReconcileOptions {\n only?: string[];\n agemonVersion: string;\n allowUnignoredState: boolean;\n trustRepoGitConfig?: boolean;\n plan?: Plan;\n conflictDecisions?: ReadonlyMap<string, ConflictDecision>;\n persistConfig?: boolean;\n platformSkippedCapabilities?: string[];\n}\n\nexport interface BuildPlanOptions {\n only?: string[];\n agemonVersion: string;\n}\n\nfunction resolvePluginOrder(\n allPlugins: AgemonPlugin[],\n onlyIds: string[] | undefined,\n): AgemonPlugin[] {\n const pluginById = new Map(allPlugins.map((plugin) => [plugin.id, plugin]));\n const unresolvedOnlyIds = (onlyIds ?? []).filter((id) => !pluginById.has(id));\n if (unresolvedOnlyIds.length > 0) {\n throw new Error(`Unknown plugin id(s): ${unresolvedOnlyIds.join(\", \")}`);\n }\n\n const selected =\n onlyIds === undefined\n ? [...allPlugins]\n : allPlugins.filter((plugin) => onlyIds.includes(plugin.id));\n\n const temporary = new Set<string>();\n const permanent = new Set<string>();\n const ordered: AgemonPlugin[] = [];\n\n const visit = (plugin: AgemonPlugin): void => {\n if (permanent.has(plugin.id)) {\n return;\n }\n if (temporary.has(plugin.id)) {\n throw new Error(`Circular dependency detected at plugin '${plugin.id}'.`);\n }\n\n temporary.add(plugin.id);\n for (const dependencyId of plugin.dependsOn ?? []) {\n const dependencyPlugin = pluginById.get(dependencyId);\n if (!dependencyPlugin) {\n throw new Error(\n `Plugin '${plugin.id}' depends on missing plugin '${dependencyId}'.`,\n );\n }\n visit(dependencyPlugin);\n }\n temporary.delete(plugin.id);\n permanent.add(plugin.id);\n ordered.push(plugin);\n };\n\n for (const plugin of selected) {\n visit(plugin);\n }\n\n return ordered;\n}\n\nexport async function buildPlan(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: BuildPlanOptions,\n): Promise<Plan> {\n const plugins = resolvePluginOrder(allPlugins, options.only);\n\n const operations: ProposedOperation[] = [];\n for (const plugin of plugins) {\n const pluginOperations = (await plugin.plan?.(ctx, operations)) ?? [];\n operations.push(...pluginOperations);\n }\n\n const inputs = {\n capabilityIds: plugins.map((plugin) => plugin.id),\n skillGroups: ctx.skillGroupsOption ?? null,\n };\n const desiredStateHash = resolveDesiredStateHash(inputs);\n\n return {\n id: computePlanId({\n agemonVersion: options.agemonVersion,\n desiredStateHash,\n operations,\n }),\n agemonVersion: options.agemonVersion,\n desiredStateHash,\n inputs,\n createdAt: new Date().toISOString(),\n operations,\n };\n}\n\nfunction reportSkippedOperations(\n ctx: Context,\n skipped: { operation: ProposedOperation; reason: string }[],\n): void {\n for (const entry of skipped) {\n ctx.ui.info(\n `Skipped ${entry.operation.action} ${\n entry.operation.targetPath || entry.operation.resourceId\n } — ${entry.reason}`,\n );\n }\n}\n\nfunction reportSweepProblems(ctx: Context, problems: string[]): void {\n for (const problem of problems) {\n ctx.ui.info(` - ${problem}`);\n }\n}\n\nasync function runPostApplySweep(\n ctx: Context,\n plugins: AgemonPlugin[],\n appliedCapabilityIds: ReadonlySet<string>,\n): Promise<string[]> {\n const problems: string[] = [];\n for (const plugin of plugins) {\n if (!appliedCapabilityIds.has(plugin.id)) {\n continue;\n }\n const verification = await plugin.verify(ctx);\n if (!verification.ok) {\n problems.push(\n `${plugin.id}: ${verification.detail ?? \"verification failed\"}`,\n );\n }\n }\n problems.push(...(await verifyManagedState(ctx, plugins)));\n return problems;\n}\n\nfunction desiredCapabilityIds(\n plugins: AgemonPlugin[],\n options: ReconcileOptions,\n): string[] {\n const selectedIds = plugins.map((plugin) => plugin.id);\n const skippedOnlyByThisMachine =\n options.only === undefined\n ? (options.platformSkippedCapabilities ?? [])\n : [];\n return CORE_CAPABILITY_IDS.filter(\n (id) => selectedIds.includes(id) || skippedOnlyByThisMachine.includes(id),\n );\n}\n\nasync function persistDesiredStateConfig(\n ctx: Context,\n plugins: AgemonPlugin[],\n options: ReconcileOptions,\n conflictResolutions: ConflictResolution[],\n): Promise<void> {\n const conflictDecisions = new Map(\n conflictResolutions.map((resolution) => [\n resolution.resourceId,\n resolution.decision,\n ]),\n );\n\n const configPath = await writeConfig(ctx.cwd, {\n capabilities: desiredCapabilityIds(plugins, options),\n skillGroups: ctx.skillGroupsOption ?? null,\n conflictDecisions,\n knownCapabilities: CORE_CAPABILITY_IDS,\n });\n\n ctx.ui.info(\n `Wrote ${relative(ctx.cwd, configPath)} — commit it so teammates and CI reconcile the same way.`,\n );\n}\n\nasync function removeDesiredStateConfig(ctx: Context): Promise<void> {\n await rm(resolveConfigPath(ctx.cwd), { force: true });\n}\n\nasync function previewAndStop(ctx: Context, plan: Plan): Promise<void> {\n const planPath = await writePlan(ctx.cwd, plan);\n ctx.log.log(renderPlan(plan));\n ctx.log.log(`\\nPlan written to ${relative(ctx.cwd, planPath)}`);\n if (plan.operations.length > 0) {\n ctx.log.log(\n `Review, then re-run interactively or with --yes, or 'agemon apply --plan ${plan.id}'.`,\n );\n }\n}\n\nfunction assertPlanIsCompatible(\n plan: Plan,\n allPlugins: AgemonPlugin[],\n agemonVersion: string,\n): void {\n if (plan.agemonVersion !== agemonVersion) {\n throw new Error(\n `Plan ${plan.id} was made by agemon ${printable(plan.agemonVersion)}; this is agemon ${agemonVersion}. Re-run 'agemon plan'.`,\n );\n }\n\n const pluginById = new Map(allPlugins.map((plugin) => [plugin.id, plugin]));\n const unknownCapabilityIds = [\n ...new Set(\n plan.operations\n .map((operation) => operation.capabilityId)\n .filter((capabilityId) => !pluginById.has(capabilityId)),\n ),\n ];\n if (unknownCapabilityIds.length > 0) {\n throw new Error(\n `Plan ${plan.id} references unknown capabilities: ${unknownCapabilityIds.map(printable).join(\", \")}.`,\n );\n }\n\n const foreignSharedOperation = plan.operations.find(\n (operation) =>\n operation.action === \"use-shared\" &&\n !pluginById\n .get(operation.capabilityId)\n ?.sharedResources?.some(\n (resource) =>\n resource.id === operation.targetPath &&\n resource.id === operation.resourceId,\n ),\n );\n if (foreignSharedOperation) {\n throw new Error(\n `Plan ${plan.id} asks ${foreignSharedOperation.capabilityId} to use the shared tool ${printable(foreignSharedOperation.targetPath)}, which it does not manage.`,\n );\n }\n\n const fileActionForNonWriter = plan.operations.find(\n (operation) =>\n FILE_TARGETING_ACTIONS.has(operation.action) &&\n !pluginById.get(operation.capabilityId)?.materialize,\n );\n if (fileActionForNonWriter) {\n throw new Error(\n `Plan ${plan.id} asks ${fileActionForNonWriter.capabilityId} to ${fileActionForNonWriter.action} ${printable(fileActionForNonWriter.targetPath)}, which it never does.`,\n );\n }\n}\n\nconst REPLAN_ADVICE =\n \"Run 'agemon plan' again with the options you want, review it, then apply that plan.\";\n\nfunction describeSkillGroupsInput(skillGroups: string | null): string {\n return skillGroups === null ? \"the default\" : `\"${printable(skillGroups)}\"`;\n}\n\nfunction describePlanMismatch(stored: Plan, rebuilt: Plan): string {\n const storedCapabilities = stored.inputs.capabilityIds.map(printable);\n const rebuiltCapabilities = rebuilt.inputs.capabilityIds;\n if (storedCapabilities.join(\",\") !== rebuiltCapabilities.join(\",\")) {\n return `Plan ${stored.id} was made for capabilities [${storedCapabilities.join(\", \")}]; this run selects [${rebuiltCapabilities.join(\", \")}] (from --only, --skip-daemon or agemon.toml).`;\n }\n if (stored.inputs.skillGroups !== rebuilt.inputs.skillGroups) {\n return `Plan ${stored.id} was made with ${describeSkillGroupsInput(stored.inputs.skillGroups)} skill groups; this run has ${describeSkillGroupsInput(rebuilt.inputs.skillGroups)}.`;\n }\n const rebuiltById = new Map(\n rebuilt.operations.map((operation) => [operation.id, operation]),\n );\n const gitConfigChanged = stored.operations.some((operation) => {\n const counterpart = rebuiltById.get(operation.id);\n return (\n counterpart !== undefined &&\n JSON.stringify(counterpart.untrustedGitConfig ?? null) !==\n JSON.stringify(operation.untrustedGitConfig ?? null)\n );\n });\n if (gitConfigChanged) {\n return `Plan ${stored.id} no longer matches what agemon would do now: this repository's git config changed since the plan.`;\n }\n return `Plan ${stored.id} no longer matches what agemon would do now: the repository changed since it was made, or the plan file was edited.`;\n}\n\nasync function rebuildStoredPlan(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: ReconcileOptions,\n stored: Plan,\n): Promise<Plan> {\n const rebuilt = await buildPlan(\n { ...ctx, dryRun: true, yes: false, interactive: false },\n allPlugins,\n { only: options.only, agemonVersion: options.agemonVersion },\n );\n if (planContentFingerprint(rebuilt) !== planContentFingerprint(stored)) {\n throw new Error(\n `${describePlanMismatch(stored, rebuilt)} ${REPLAN_ADVICE}`,\n );\n }\n return rebuilt;\n}\n\nfunction isSettledConflict(skip: SkippedOperation): boolean {\n return skip.operation.action === \"conflict\" && !skip.consentMissing;\n}\n\nasync function reportInstalledCapabilityAttention(\n ctx: Context,\n plugins: AgemonPlugin[],\n): Promise<void> {\n const recordedPluginIds = new Set(\n ctx.manifest.getActions().map((action) => action.plugin),\n );\n for (const plugin of plugins) {\n if (!recordedPluginIds.has(plugin.id)) {\n continue;\n }\n const { attention } = await plugin.verify(ctx);\n if (attention) {\n ctx.ui.info(`${plugin.id}: ${printable(attention)}`);\n }\n }\n}\n\nasync function finishWithNothingToApply(\n ctx: Context,\n plugins: AgemonPlugin[],\n options: ReconcileOptions,\n conflictResolutions: ConflictResolution[],\n successMessage = NOTHING_TO_DO_MESSAGE,\n): Promise<RunOutcome> {\n await reportInstalledCapabilityAttention(ctx, plugins);\n const driftProblems = await verifyManagedState(ctx, plugins);\n if (driftProblems.length > 0) {\n ctx.ui.fail(\"Nothing to apply, but the environment has drifted:\");\n reportSweepProblems(ctx, driftProblems);\n return \"drift\";\n }\n if (options.persistConfig) {\n await persistDesiredStateConfig(ctx, plugins, options, conflictResolutions);\n }\n ctx.ui.succeed(successMessage);\n return \"nothing-to-do\";\n}\n\nexport async function reconcile(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: ReconcileOptions,\n): Promise<RunOutcome> {\n await checkAgemonStateDirectoryBeforeRun(ctx.dryRun, (line) =>\n ctx.ui.info(line),\n );\n await assertNoInterruptedApply(ctx.cwd);\n const plugins = resolvePluginOrder(allPlugins, options.only);\n\n if (plugins.length === 0) {\n ctx.ui.info(\"Nothing to do — no capabilities selected.\");\n return \"nothing-to-do\";\n }\n\n if (options.plan) {\n assertPlanIsCompatible(options.plan, allPlugins, options.agemonVersion);\n }\n\n const plan = options.plan\n ? await rebuildStoredPlan(ctx, allPlugins, options, options.plan)\n : await buildPlan(ctx, allPlugins, {\n only: options.only,\n agemonVersion: options.agemonVersion,\n });\n\n if (ctx.dryRun) {\n await previewAndStop(ctx, plan);\n return \"previewed\";\n }\n\n const { isolation } = await discoverRepository(ctx);\n const sessionCannotConsent = !ctx.yes && !isInteractiveTerminal();\n const isFirstRun = options.persistConfig === true;\n const needsConsentBeforeApplying =\n plan.operations.some((operation) => operation.action !== \"use-shared\") ||\n (plan.operations.length > 0 && isolation.status !== \"ignored\");\n if (sessionCannotConsent && isFirstRun && needsConsentBeforeApplying) {\n await previewAndStop(ctx, plan);\n return \"previewed\";\n }\n if (isolation.trackingCheckError !== null) {\n ctx.ui.info(isolation.trackingCheckError);\n }\n\n if (plan.operations.length === 0) {\n return finishWithNothingToApply(ctx, plugins, options, []);\n }\n\n const { approvable, skipped: untrustedGitConfigSkips } =\n skipUnapprovableGitConfigOperations(plan.operations);\n const consentablePlan = { ...plan, operations: approvable };\n const gates = buildConsentGates({\n plan: consentablePlan,\n isolationStatus: isolation.status,\n trustRepoGitConfig: options.trustRepoGitConfig === true,\n });\n const approval = await ctx.consent(gates, {\n conflictDecisions: options.conflictDecisions,\n });\n const stateCanBeWritten =\n isolation.status === \"ignored\" ||\n approval.workspaceIsolationApproved === true ||\n options.allowUnignoredState;\n const sharedOperations = useSharedOperations(consentablePlan);\n const skipped: SkippedOperation[] = [\n ...untrustedGitConfigSkips,\n ...approval.skipped,\n ...(stateCanBeWritten\n ? []\n : sharedOperations.map((operation) => ({\n operation,\n reason: \"needs /.agemon/ git-ignored\",\n consentMissing: sessionCannotConsent,\n }))),\n ];\n const toApply = [\n ...approval.approved,\n ...(stateCanBeWritten ? sharedOperations : []),\n ];\n const consentMissing = skipped.some((skip) => skip.consentMissing);\n\n if (toApply.length === 0) {\n if (skipped.every(isSettledConflict)) {\n return finishWithNothingToApply(\n ctx,\n plugins,\n options,\n approval.conflictResolutions,\n );\n }\n await reportInstalledCapabilityAttention(ctx, plugins);\n ctx.log.log(\n renderRunSummary({\n kind: \"declined\",\n skipped: skipped.map((skip) => ({\n label: skip.operation.targetPath || skip.operation.resourceId,\n reason: skip.reason,\n })),\n }),\n );\n return consentMissing ? \"drift\" : \"declined\";\n }\n\n let result: Awaited<ReturnType<typeof applyPlan>>;\n try {\n result = await applyPlan(ctx, allPlugins, {\n plan,\n approved: toApply,\n workspaceIsolationApproved: approval.workspaceIsolationApproved,\n isolationStatus: isolation.status,\n allowUnignoredState: options.allowUnignoredState,\n });\n } catch (error) {\n if (error instanceof ApplyRollbackError) {\n ctx.log.log(renderRunSummary({ kind: \"failure\", ...error.rollback }));\n }\n throw error;\n }\n\n reportSkippedOperations(ctx, [...skipped, ...result.skipped]);\n if (result.applied.length === 0) {\n const outcome = await finishWithNothingToApply(\n ctx,\n plugins,\n options,\n approval.conflictResolutions,\n NOTHING_APPLIED_MESSAGE,\n );\n return consentMissing && outcome === \"nothing-to-do\" ? \"drift\" : outcome;\n }\n\n const appliedCapabilityIds = new Set(\n result.applied.map((operation) => operation.capabilityId),\n );\n const sweepProblems = await runPostApplySweep(\n ctx,\n plugins,\n appliedCapabilityIds,\n );\n if (sweepProblems.length > 0) {\n ctx.log.log(\n renderRunSummary({\n kind: \"partial\",\n appliedCount: result.applied.length,\n problems: sweepProblems,\n }),\n );\n return \"partial\";\n }\n\n if (options.persistConfig) {\n await persistDesiredStateConfig(\n ctx,\n plugins,\n options,\n approval.conflictResolutions,\n );\n }\n\n ctx.log.log(\n renderRunSummary({\n kind: \"success\",\n applied: result.applied,\n nextSteps: buildNextSteps(options, isolation.trackedAgemonPaths),\n }),\n );\n return consentMissing ? \"drift\" : \"applied\";\n}\n\nfunction buildNextSteps(\n options: ReconcileOptions,\n trackedAgemonPaths: string[],\n): string[] {\n const steps: string[] = [];\n if (options.persistConfig) {\n steps.push(\"commit agemon.toml so teammates and CI reconcile the same way\");\n }\n if (trackedAgemonPaths.length > 0) {\n steps.push(\"git rm -r --cached .agemon to stop tracking regenerated state\");\n }\n return steps;\n}\n\nfunction selectUninstallRequest(\n allPlugins: AgemonPlugin[],\n options: UninstallOptions,\n): Set<string> {\n const knownIds = new Set(allPlugins.map((plugin) => plugin.id));\n const unknownIds = (options.only ?? []).filter((id) => !knownIds.has(id));\n if (unknownIds.length > 0) {\n throw new Error(`Unknown plugin id(s): ${unknownIds.join(\", \")}`);\n }\n const requested = options.only ?? [...knownIds];\n return new Set(\n requested.filter((id) => !(options.skipIds ?? []).includes(id)),\n );\n}\n\nfunction reasonToKeep(\n plugin: AgemonPlugin,\n allPlugins: AgemonPlugin[],\n installedIds: ReadonlySet<string>,\n failedIds: ReadonlySet<string>,\n): string | null {\n const dependent = allPlugins.find(\n (candidate) =>\n installedIds.has(candidate.id) &&\n (candidate.dependsOn ?? []).includes(plugin.id),\n );\n if (dependent === undefined) {\n return null;\n }\n return failedIds.has(dependent.id)\n ? `${dependent.id} could not be uninstalled`\n : `${dependent.id} is still installed`;\n}\n\nfunction pluginsWithLedgerEntries(ctx: Context): Set<string> {\n return new Set(\n ctx.manifest\n .getActions()\n .filter((action) => !isWorkspaceEntry(action))\n .map((action) => action.plugin),\n );\n}\n\nfunction removesLastCapability(\n remainingIds: ReadonlySet<string>,\n installedBefore: ReadonlySet<string>,\n hasSelectionFilter: boolean,\n): boolean {\n return (\n remainingIds.size === 0 &&\n (!hasSelectionFilter || remainingIds.size < installedBefore.size)\n );\n}\n\nclass PreviewPromptError extends Error {}\n\nfunction previewContext(\n ctx: Context,\n collect: (line: string) => void,\n): Context {\n const refuse = (): never => {\n throw new PreviewPromptError(\"the nuke preview must not ask for consent\");\n };\n const refuseCommand = (): never => {\n throw new PreviewPromptError(\"the nuke preview must not run commands\");\n };\n return {\n ...ctx,\n dryRun: true,\n ui: { start() {}, succeed() {}, fail() {}, info: collect },\n confirm: refuse,\n consent: refuse,\n run: refuseCommand,\n serviceManager: {\n kind: ctx.serviceManager.kind,\n isActive: refuseCommand,\n isSandboxEnforced: refuseCommand,\n registerAutostart: refuseCommand,\n unregisterAutostart: refuseCommand,\n readUnitWorkingDirectory: (unitName) =>\n ctx.serviceManager.readUnitWorkingDirectory(unitName),\n readUnitEnvironment: (unitName) =>\n ctx.serviceManager.readUnitEnvironment(unitName),\n unitPathFor: (unitName) => ctx.serviceManager.unitPathFor(unitName),\n isLingerEnabled: refuseCommand,\n enableLinger: refuseCommand,\n disableLinger: refuseCommand,\n findAgemonDaemonUnit: () => ctx.serviceManager.findAgemonDaemonUnit(),\n },\n };\n}\n\nasync function previewPluginReversal(\n ctx: Context,\n plugin: AgemonPlugin,\n): Promise<string[]> {\n const planned: string[] = [];\n try {\n await plugin.uninstall(\n previewContext(ctx, (line) =>\n planned.push(singleLine(line, MAX_PREVIEW_LINE_CHARACTERS)),\n ),\n );\n } catch (error) {\n if (error instanceof PreviewPromptError) {\n throw error;\n }\n planned.push(`could not preview (${describeFailure(error)})`);\n }\n const overflow = planned.length - MAX_PREVIEW_LINES_PER_PLUGIN;\n return [\n ...planned.slice(0, MAX_PREVIEW_LINES_PER_PLUGIN),\n ...(overflow > 0\n ? [`… ${overflow} more — run 'agemon nuke --dry-run' for the full list`]\n : []),\n ];\n}\n\nasync function describeReversal(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n orderedRequest: AgemonPlugin[],\n hasSelectionFilter: boolean,\n): Promise<string[]> {\n const lines: string[] = [];\n const installedBefore = pluginsWithLedgerEntries(ctx);\n const remainingIds = new Set(installedBefore);\n for (const plugin of orderedRequest) {\n if (!installedBefore.has(plugin.id)) {\n continue;\n }\n const keptBecause = reasonToKeep(\n plugin,\n allPlugins,\n remainingIds,\n new Set(),\n );\n if (keptBecause !== null) {\n lines.push(`kept: ${plugin.id} (${keptBecause})`);\n continue;\n }\n const planned = await previewPluginReversal(ctx, plugin);\n lines.push(`${plugin.id}:`, ...planned.map((line) => ` ${line}`));\n remainingIds.delete(plugin.id);\n }\n const lastCapabilityGoes = removesLastCapability(\n remainingIds,\n installedBefore,\n hasSelectionFilter,\n );\n if (lastCapabilityGoes && (await fileExists(resolveConfigPath(ctx.cwd)))) {\n lines.push(\"agemon.toml (deleted)\");\n }\n lines.push(...describeFootprintRemoval(ctx, lastCapabilityGoes));\n return lines;\n}\n\nasync function confirmReversal(\n ctx: Context,\n reversal: string[],\n): Promise<UninstallOutcome | null> {\n ctx.log.log(\n [\"agemon nuke will reverse:\", ...reversal.map((line) => ` ${line}`)].join(\n \"\\n\",\n ),\n );\n if (!ctx.interactive) {\n ctx.log.log(\"Re-run with --yes to reverse these changes.\");\n return \"previewed\";\n }\n return (await ctx.confirm(\"Reverse these changes?\")) ? null : \"declined\";\n}\n\nexport async function uninstallPlugins(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: UninstallOptions,\n): Promise<UninstallOutcome> {\n await checkAgemonStateDirectoryBeforeRun(ctx.dryRun, (line) =>\n ctx.ui.info(line),\n );\n await assertNoInterruptedApply(ctx.cwd);\n const requestedIds = selectUninstallRequest(allPlugins, options);\n const orderedRequest = resolvePluginOrder(allPlugins, undefined)\n .reverse()\n .filter((plugin) => requestedIds.has(plugin.id));\n\n if (orderedRequest.length === 0) {\n ctx.ui.info(\"Nothing to do — no plugins selected.\");\n return \"nothing-to-do\";\n }\n\n const hasSelectionFilter =\n options.only !== undefined || (options.skipIds ?? []).length > 0;\n const installedBefore = pluginsWithLedgerEntries(ctx);\n const installedIds = new Set(installedBefore);\n if (!ctx.dryRun && !ctx.yes) {\n const reversal = await describeReversal(\n ctx,\n allPlugins,\n orderedRequest,\n hasSelectionFilter,\n );\n const stopOutcome =\n reversal.length > 0 ? await confirmReversal(ctx, reversal) : null;\n if (stopOutcome !== null) {\n return stopOutcome;\n }\n }\n\n const entriesBefore = ctx.manifest.getActions().length;\n const failedIds = new Set<string>();\n const failures: string[] = [];\n const total = orderedRequest.length;\n let step = 0;\n for (const plugin of orderedRequest) {\n step += 1;\n const keptBecause = reasonToKeep(\n plugin,\n allPlugins,\n installedIds,\n failedIds,\n );\n if (keptBecause !== null) {\n ctx.ui.info(`kept: ${plugin.id} (${keptBecause})`);\n continue;\n }\n ctx.ui.start(`Uninstalling ${plugin.id}`, { step, total });\n try {\n await plugin.uninstall(ctx);\n if (!ctx.dryRun) {\n await ctx.manifest.removeActionsForPlugin(plugin.id);\n }\n installedIds.delete(plugin.id);\n ctx.ui.succeed(`Uninstalled ${plugin.id}`);\n } catch (error) {\n failedIds.add(plugin.id);\n failures.push(`${plugin.id} (${describeFailure(error)})`);\n ctx.ui.fail(`Could not uninstall ${plugin.id}`);\n }\n }\n\n if (ctx.dryRun) {\n const lastCapabilityGoes =\n failures.length === 0 &&\n removesLastCapability(installedIds, installedBefore, hasSelectionFilter);\n for (const line of describeFootprintRemoval(ctx, lastCapabilityGoes)) {\n ctx.ui.info(`Would ${line}`);\n }\n return \"previewed\";\n }\n\n const removedEntries = ctx.manifest.getActions().length < entriesBefore;\n await removeRecordedEmptyDirectories(ctx);\n if (\n failures.length === 0 &&\n !ctx.manifest.hasCapabilityActions() &&\n (!hasSelectionFilter || removedEntries)\n ) {\n await removeDesiredStateConfig(ctx);\n await removeWorkspaceFootprint(ctx);\n }\n await ctx.manifest.pruneIfEmpty();\n\n if (failures.length > 0) {\n throw new Error(\n `nuke could not reverse ${failures.join(\"; \")}. Their ledger entries are kept — fix the cause and re-run 'agemon nuke'.`,\n );\n }\n return \"applied\";\n}\n","import type { DiscoveryResult } from \"../inspect/discover.js\";\nimport type { DiscoveredAgentResource } from \"./types.js\";\n\nexport function matchRuleFiles(\n discovery: DiscoveryResult,\n paths: readonly string[],\n): DiscoveredAgentResource[] {\n return discovery.ruleFiles\n .filter((ruleFile) => paths.includes(ruleFile.path))\n .map((ruleFile) => ({\n path: ruleFile.path,\n kind: \"rule-file\",\n exists: ruleFile.exists,\n }));\n}\n\nexport function matchStructuredConfigs(\n discovery: DiscoveryResult,\n paths: readonly string[],\n): DiscoveredAgentResource[] {\n return discovery.structuredConfigs\n .filter((config) => paths.includes(config.path))\n .map((config) => ({\n path: config.path,\n kind: \"structured-config\",\n exists: config.exists,\n }));\n}\n\nexport function matchCopilotInstructions(\n discovery: DiscoveryResult,\n): DiscoveredAgentResource[] {\n return discovery.copilotInstructions.map((instruction) => ({\n path: instruction.path,\n kind: \"copilot-instruction\",\n exists: instruction.exists,\n }));\n}\n","import { constants } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { delimiter, join } from \"node:path\";\nimport type { Context } from \"../core/context.js\";\nimport { agemonSubprocessEnvironment } from \"../core/subprocess-runner.js\";\nimport type { AgentInstallationEvidence } from \"./types.js\";\n\nconst SEMVER_PATTERN = /\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?/;\n\nexport function extractSemverVersion(stdout: string): string | null {\n return SEMVER_PATTERN.exec(stdout)?.[0] ?? null;\n}\nexport async function resolveExecutableAbsolutePath(\n binaryName: string,\n pathEnv: string,\n): Promise<string | undefined> {\n for (const pathEntry of pathEnv.split(delimiter)) {\n if (!pathEntry) {\n continue;\n }\n\n const binaryPath = join(pathEntry, binaryName);\n try {\n await access(binaryPath, constants.X_OK);\n return binaryPath;\n } catch {}\n }\n\n return undefined;\n}\n\nexport interface VersionProbeSpec {\n binaryName: string;\n versionArgs: string[];\n parseVersion: (stdout: string) => string | null;\n timeoutMs: number;\n}\n\nfunction notInstalledEvidence(): AgentInstallationEvidence {\n return {\n level: \"configured\",\n executablePath: null,\n version: null,\n evidence: [],\n };\n}\n\nexport async function probeAgentInstallation(\n ctx: Context,\n spec: VersionProbeSpec,\n): Promise<AgentInstallationEvidence> {\n const executablePath = await resolveExecutableAbsolutePath(\n spec.binaryName,\n agemonSubprocessEnvironment().PATH ?? \"\",\n );\n if (!executablePath) {\n return notInstalledEvidence();\n }\n\n const result = await ctx.run(executablePath, spec.versionArgs, {\n timeoutMs: spec.timeoutMs,\n });\n const version = result.code === 0 ? spec.parseVersion(result.stdout) : null;\n\n return {\n level: version ? \"installed\" : \"configured\",\n executablePath,\n version,\n evidence: [\n `resolved ${spec.binaryName} at ${executablePath}`,\n version\n ? `reported version ${version}`\n : `probe failed: exit ${result.code}`,\n ],\n };\n}\n\nexport interface UsabilityProbeSpec {\n usabilityArgs: string[];\n timeoutMs: number;\n}\n\nexport async function probeAgentUsability(\n ctx: Context,\n installation: AgentInstallationEvidence,\n spec: UsabilityProbeSpec,\n): Promise<AgentInstallationEvidence> {\n if (installation.level !== \"installed\" || !installation.executablePath) {\n return installation;\n }\n\n const command = [installation.executablePath, ...spec.usabilityArgs].join(\n \" \",\n );\n const result = await ctx.run(\n installation.executablePath,\n spec.usabilityArgs,\n {\n timeoutMs: spec.timeoutMs,\n },\n );\n\n if (result.code !== 0) {\n return {\n ...installation,\n evidence: [\n ...installation.evidence,\n `usability probe failed: ${command} exited ${result.code}`,\n ],\n };\n }\n\n return {\n ...installation,\n level: \"usable\",\n evidence: [\n ...installation.evidence,\n `usability probe succeeded: ${command}`,\n ],\n };\n}\n","import { matchRuleFiles, matchStructuredConfigs } from \"./discovery-adapter.js\";\nimport type { AgentAdapter } from \"./types.js\";\nimport {\n extractSemverVersion,\n probeAgentInstallation,\n probeAgentUsability,\n type UsabilityProbeSpec,\n type VersionProbeSpec,\n} from \"./version-probe.js\";\n\nexport const CLAUDE_PROBE_SPEC: VersionProbeSpec = {\n binaryName: \"claude\",\n versionArgs: [\"--version\"],\n parseVersion: extractSemverVersion,\n timeoutMs: 3000,\n};\n\nexport const CLAUDE_USABILITY_PROBE_SPEC: UsabilityProbeSpec = {\n usabilityArgs: [\"doctor\"],\n timeoutMs: 5000,\n};\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: \"claude-code\",\n displayName: \"Claude Code\",\n discoverProjectResources(discovery) {\n return [\n ...matchRuleFiles(discovery, [\"CLAUDE.md\"]),\n ...matchStructuredConfigs(discovery, [\n \".mcp.json\",\n \".claude/settings.json\",\n ]),\n ];\n },\n detectInstallation: (ctx) => probeAgentInstallation(ctx, CLAUDE_PROBE_SPEC),\n detectUsability: (ctx, installation) =>\n probeAgentUsability(ctx, installation, CLAUDE_USABILITY_PROBE_SPEC),\n};\n","import { matchCopilotInstructions } from \"./discovery-adapter.js\";\nimport type { AgentAdapter, AgentInstallationEvidence } from \"./types.js\";\n\nfunction copilotInstallationEvidence(): AgentInstallationEvidence {\n return {\n level: \"configured\",\n executablePath: null,\n version: null,\n evidence: [\n \"Copilot has no standalone executable to probe; installation state stops at configured.\",\n ],\n };\n}\n\nexport const copilotAdapter: AgentAdapter = {\n id: \"copilot\",\n displayName: \"GitHub Copilot\",\n discoverProjectResources(discovery) {\n return matchCopilotInstructions(discovery);\n },\n detectInstallation: async () => copilotInstallationEvidence(),\n};\n","import { matchRuleFiles, matchStructuredConfigs } from \"./discovery-adapter.js\";\nimport type { AgentAdapter } from \"./types.js\";\nimport {\n extractSemverVersion,\n probeAgentInstallation,\n probeAgentUsability,\n type UsabilityProbeSpec,\n type VersionProbeSpec,\n} from \"./version-probe.js\";\n\nexport const GEMINI_PROBE_SPEC: VersionProbeSpec = {\n binaryName: \"gemini\",\n versionArgs: [\"--version\"],\n parseVersion: extractSemverVersion,\n timeoutMs: 3000,\n};\nexport const GEMINI_USABILITY_PROBE_SPEC: UsabilityProbeSpec = {\n usabilityArgs: [\"mcp\", \"list\"],\n timeoutMs: 5000,\n};\n\nexport const geminiCliAdapter: AgentAdapter = {\n id: \"gemini-cli\",\n displayName: \"Gemini CLI\",\n discoverProjectResources(discovery) {\n return [\n ...matchRuleFiles(discovery, [\"GEMINI.md\"]),\n ...matchStructuredConfigs(discovery, [\".gemini/settings.json\"]),\n ];\n },\n detectInstallation: (ctx) => probeAgentInstallation(ctx, GEMINI_PROBE_SPEC),\n detectUsability: (ctx, installation) =>\n probeAgentUsability(ctx, installation, GEMINI_USABILITY_PROBE_SPEC),\n};\n","import { claudeCodeAdapter } from \"./claude-code.js\";\nimport { copilotAdapter } from \"./copilot.js\";\nimport { geminiCliAdapter } from \"./gemini-cli.js\";\nimport type { AgentAdapter } from \"./types.js\";\n\nconst adapterRegistry: AgentAdapter[] = [\n claudeCodeAdapter,\n geminiCliAdapter,\n copilotAdapter,\n];\n\nexport function getRegisteredAdapters(): AgentAdapter[] {\n return adapterRegistry;\n}\n","import type { Context } from \"../core/context.js\";\nimport type { DiscoveryResult } from \"../inspect/discover.js\";\nimport { getRegisteredAdapters } from \"./index.js\";\nimport type { AgentDetectionRow, AgentInstallationEvidence } from \"./types.js\";\n\nexport const PROBE_AGENT_INSTALLATIONS_PROMPT =\n \"May agemon look for AI coding agents installed on this machine? It runs only \" +\n \"--version-style probes. No repository content leaves your machine.\";\n\nfunction configuredOnlyEvidence(): AgentInstallationEvidence {\n return {\n level: \"configured\",\n executablePath: null,\n version: null,\n evidence: [],\n };\n}\n\nexport interface DetectAgentsOptions {\n checkUsable?: boolean;\n}\n\ntype BaseDetectionRow = Omit<AgentDetectionRow, \"installation\">;\nexport async function detectAgents(\n ctx: Context,\n discovery: DiscoveryResult,\n options: DetectAgentsOptions = {},\n): Promise<AgentDetectionRow[]> {\n const adapters = getRegisteredAdapters();\n const baseRows: BaseDetectionRow[] = adapters.map((adapter) => {\n const resources = adapter.discoverProjectResources(discovery);\n return {\n adapterId: adapter.id,\n displayName: adapter.displayName,\n configured: resources.some((resource) => resource.exists),\n configuredResources: resources,\n };\n });\n\n const canProbeInstallations = await ctx.confirm(\n PROBE_AGENT_INSTALLATIONS_PROMPT,\n );\n if (!canProbeInstallations) {\n return baseRows.map((row) => ({\n ...row,\n installation: configuredOnlyEvidence(),\n }));\n }\n\n const installations = await Promise.all(\n adapters.map((adapter) => adapter.detectInstallation(ctx)),\n );\n\n if (!options.checkUsable) {\n return baseRows.map((row, index) => ({\n ...row,\n installation: installations[index],\n }));\n }\n\n const withUsability = await Promise.all(\n adapters.map((adapter, index) => {\n const installation = installations[index];\n return adapter.detectUsability\n ? adapter.detectUsability(ctx, installation)\n : installation;\n }),\n );\n return baseRows.map((row, index) => ({\n ...row,\n installation: withUsability[index],\n }));\n}\n","import { mkdir, readdir, realpath, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n MAX_READ_FILE_BYTES,\n MAX_READ_FILE_LABEL,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"./files.js\";\nimport { type LedgerEntry, parseLedgerEntries } from \"./state-manifest.js\";\nimport {\n repositoryStateKey,\n resolveAgemonStateDirectory,\n type StateDirectoryMode,\n} from \"./state-root.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nconst JOURNAL_VERSION = 1;\nconst JOURNAL_DIRECTORY_MODE = 0o700;\nconst JOURNAL_FILE_MODE = 0o600;\nconst JOURNAL_FILE_NAME_PATTERN = /^([0-9a-f]{16})\\.json$/u;\n\nexport interface JournalSnapshot {\n targetPath: string;\n previousContents: string | null;\n stagedFingerprint: string | null;\n}\n\nexport interface ApplyJournal {\n version: typeof JOURNAL_VERSION;\n planId: string;\n repoRoot: string;\n startedAt: string;\n capabilityOrder: string[];\n ledgerBefore: LedgerEntry[];\n snapshots: JournalSnapshot[];\n}\n\nexport interface StoredJournal {\n path: string;\n journal: ApplyJournal;\n}\n\nexport type NewApplyJournal = Omit<ApplyJournal, \"version\" | \"repoRoot\">;\n\nexport async function resolveJournalDirectory(\n repoRoot: string,\n mode: StateDirectoryMode = \"check\",\n): Promise<string> {\n return join(\n (await resolveAgemonStateDirectory(mode)).path,\n \"journals\",\n await repositoryStateKey(repoRoot),\n );\n}\n\nexport async function writeJournal(\n repoRoot: string,\n newJournal: NewApplyJournal,\n): Promise<StoredJournal> {\n const journal: ApplyJournal = {\n version: JOURNAL_VERSION,\n repoRoot: await realpath(repoRoot),\n ...newJournal,\n };\n const payload = `${JSON.stringify(journal)}\\n`;\n if (Buffer.byteLength(payload) > MAX_READ_FILE_BYTES) {\n throw new Error(\n `Refusing to apply: the rollback journal would exceed ${MAX_READ_FILE_LABEL} (${journal.snapshots.length} rule files). Shrink them or apply fewer capabilities with --only.`,\n );\n }\n\n const directory = await resolveJournalDirectory(repoRoot, \"prepare\");\n await mkdir(directory, { recursive: true, mode: JOURNAL_DIRECTORY_MODE });\n const path = join(directory, `${journal.planId}.json`);\n await writeFileAtomic(path, payload, { newFileMode: JOURNAL_FILE_MODE });\n return { path, journal };\n}\n\nexport async function deleteJournal(path: string): Promise<void> {\n await rm(path, { force: true });\n}\n\nfunction validateJournal(\n parsed: unknown,\n expectedPlanId: string,\n expectedRepoRoot: string,\n): ApplyJournal {\n const fail = (detail: string): never => {\n throw new Error(detail);\n };\n const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n const identifier = (value: unknown, field: string): string =>\n typeof value === \"string\" && isSafeIdentifier(value)\n ? value\n : fail(`'${field}' must be a string without control characters`);\n const nullableIdentifier = (value: unknown, field: string): string | null =>\n value === null ? null : identifier(value, field);\n const list = (value: unknown, field: string): unknown[] =>\n Array.isArray(value) ? value : fail(`'${field}' must be an array`);\n\n if (!isRecord(parsed)) {\n return fail(\"it is not a JSON object\");\n }\n if (parsed.version !== JOURNAL_VERSION) {\n fail(`unknown version ${printable(String(parsed.version))}`);\n }\n if (parsed.planId !== expectedPlanId) {\n fail(\"its plan id does not match its file name\");\n }\n if (parsed.repoRoot !== expectedRepoRoot) {\n fail(\n `it belongs to another repository (${printable(String(parsed.repoRoot))})`,\n );\n }\n\n return {\n version: JOURNAL_VERSION,\n planId: expectedPlanId,\n repoRoot: expectedRepoRoot,\n startedAt: identifier(parsed.startedAt, \"startedAt\"),\n capabilityOrder: list(parsed.capabilityOrder, \"capabilityOrder\").map(\n (value, index) => identifier(value, `capabilityOrder[${index}]`),\n ),\n ledgerBefore:\n parseLedgerEntries(parsed.ledgerBefore) ??\n fail(\"'ledgerBefore' is not a list of valid ledger entries\"),\n snapshots: list(parsed.snapshots, \"snapshots\").map((value, index) => {\n const field = (name: string) => `snapshots[${index}].${name}`;\n const snapshot = isRecord(value)\n ? value\n : fail(`'snapshots[${index}]' must be an object`);\n const { previousContents } = snapshot;\n return {\n targetPath: identifier(snapshot.targetPath, field(\"targetPath\")),\n previousContents:\n previousContents === null || typeof previousContents === \"string\"\n ? previousContents\n : fail(`'${field(\"previousContents\")}' must be a string or null`),\n stagedFingerprint: nullableIdentifier(\n snapshot.stagedFingerprint,\n field(\"stagedFingerprint\"),\n ),\n };\n }),\n };\n}\n\nexport function invalidJournalError(path: string, detail: string): Error {\n return new Error(\n `The interrupted-apply journal ${path} is invalid: ${detail}. Delete it to continue; agemon then cannot restore what that apply changed.`,\n );\n}\n\nasync function readJournal(\n path: string,\n planId: string,\n repoRoot: string,\n): Promise<ApplyJournal | null> {\n try {\n const contents = await readRegularFileIfExists(path);\n return contents === null\n ? null\n : validateJournal(JSON.parse(contents), planId, repoRoot);\n } catch (error) {\n throw invalidJournalError(path, printable((error as Error).message));\n }\n}\n\nasync function listJournalFileNames(directory: string): Promise<string[]> {\n try {\n return (await readdir(directory)).sort();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n}\n\nexport async function readJournals(repoRoot: string): Promise<StoredJournal[]> {\n const directory = await resolveJournalDirectory(repoRoot);\n const realRepoRoot = await realpath(repoRoot);\n const journals: StoredJournal[] = [];\n for (const fileName of await listJournalFileNames(directory)) {\n const planId = JOURNAL_FILE_NAME_PATTERN.exec(fileName)?.[1];\n if (planId === undefined) {\n continue;\n }\n const path = join(directory, fileName);\n const journal = await readJournal(path, planId, realRepoRoot);\n if (journal !== null) {\n journals.push({ path, journal });\n }\n }\n return journals;\n}\n\nexport async function assertNoInterruptedApply(\n repoRoot: string,\n): Promise<void> {\n const [interrupted] = await readJournals(repoRoot);\n if (interrupted) {\n throw new Error(\n `An earlier apply (plan ${interrupted.journal.planId}, started ${interrupted.journal.startedAt}) was interrupted. Run 'agemon recover' to restore the files it changed.`,\n );\n }\n}\n","import type { Context } from \"../core/context.js\";\nimport type { AgemonPlugin } from \"./types.js\";\n\nexport function resolveCurrentDesiredRevision(\n plugins: AgemonPlugin[],\n ctx: Context,\n resourceId: string,\n): string | null {\n for (const plugin of plugins) {\n const revision = plugin.desiredRevision?.(ctx, resourceId) ?? null;\n if (revision !== null) {\n return revision;\n }\n }\n return null;\n}\n","import { realpath } from \"node:fs/promises\";\nimport type { Context } from \"../core/context.js\";\nimport {\n directoryIdentity,\n isRecordableRepositoryPath,\n MAX_SHARED_RESOURCE_HOLDERS,\n readMachineLedger,\n type SharedResourceRecord,\n updateSharedResource,\n withoutMissingHolders,\n withoutReplacedOwner,\n} from \"../core/machine-ledger.js\";\nimport type { LedgerEntry } from \"../core/state-manifest.js\";\nimport { printable } from \"../core/untrusted-text.js\";\nimport { describeOperation } from \"./proposed-operation.js\";\nimport type {\n AgemonPlugin,\n ProposedOperation,\n SharedResourceDeclaration,\n} from \"./types.js\";\n\nconst ACTION_TYPE_USES_SHARED_RESOURCE = \"uses-shared-resource\";\nconst SHARED_RESOURCE_ENTRY_PREFIX = \"shared:\";\nconst INSTALL_ENTRY_TYPES: ReadonlySet<string> = new Set([\n \"installed-binary\",\n \"installed-cli-tool\",\n]);\n\ninterface SharedResourceProbe {\n isPresent(): Promise<boolean>;\n}\n\ninterface ThisRepository {\n path: string;\n directoryId: string;\n}\n\ntype ReleaseDecision =\n | { kind: \"not-registered\" }\n | { kind: \"still-used\"; others: string[] }\n | { kind: \"not-the-installer\" }\n | { kind: \"installer-entry-unconfirmed\" }\n | { kind: \"needs-remove-shared\"; claimedBy: string }\n | { kind: \"remove\"; claimedBy: string | null };\n\nasync function resolveThisRepository(ctx: Context): Promise<ThisRepository> {\n const path = await realpath(ctx.cwd);\n if (!isRecordableRepositoryPath(path)) {\n throw new Error(\n `This repository's path ${printable(path)} contains control characters, so agemon can't record it as a user of shared tools. Move it to a plain path and run agemon again.`,\n );\n }\n const directoryId = await directoryIdentity(path);\n if (directoryId === null) {\n throw new Error(\n `Can't read this repository's directory ${printable(path)}; run agemon again from an existing repository.`,\n );\n }\n return { path, directoryId };\n}\n\nfunction reportPrunedHolder(\n ctx: Context,\n resource: SharedResourceDeclaration,\n): (holder: string) => void {\n return (holder) =>\n ctx.ui.info(\n `dropped ${printable(holder)} as a user of ${resource.toolName}: it no longer exists`,\n );\n}\n\nfunction sharedResourceEntryId(resource: SharedResourceDeclaration): string {\n return `${SHARED_RESOURCE_ENTRY_PREFIX}${resource.id}`;\n}\n\nexport async function isHeldByThisRepository(\n ctx: Context,\n resource: SharedResourceDeclaration,\n): Promise<boolean> {\n const record = (await readMachineLedger()).resources[resource.id];\n return record?.holders.includes(await realpath(ctx.cwd)) ?? false;\n}\n\nexport async function wasInstalledByAgemon(\n resource: SharedResourceDeclaration,\n repoLedgerSaysInstalled: boolean,\n): Promise<boolean> {\n if (repoLedgerSaysInstalled) {\n return true;\n }\n const origin = (await readMachineLedger()).resources[resource.id]?.origin;\n return origin === \"installed\" || origin === \"migrated\";\n}\n\nexport function describeUseSharedOperation(\n capabilityId: string,\n resource: SharedResourceDeclaration,\n repoLedgerSaysInstalled: boolean,\n): ProposedOperation {\n const claim = repoLedgerSaysInstalled\n ? \" (this repository's ledger says agemon installed it)\"\n : \"\";\n return describeOperation({\n capabilityId,\n resourceId: resource.id,\n targetPath: resource.id,\n action: \"use-shared\",\n riskClass: \"inert\",\n requiresConsent: false,\n preview: {\n kind: \"note\",\n text: `record that this repository uses ${resource.toolName}${claim}`,\n },\n });\n}\n\nasync function recordUsesSharedResource(\n ctx: Context,\n capabilityId: string,\n resource: SharedResourceDeclaration,\n): Promise<void> {\n const entryResourceId = sharedResourceEntryId(resource);\n const alreadyRecorded = ctx.manifest\n .getActions()\n .some(\n (entry) =>\n entry.plugin === capabilityId &&\n entry.type === ACTION_TYPE_USES_SHARED_RESOURCE &&\n entry.resourceId === entryResourceId,\n );\n if (alreadyRecorded) {\n return;\n }\n await ctx.manifest.recordAction({\n plugin: capabilityId,\n type: ACTION_TYPE_USES_SHARED_RESOURCE,\n target: resource.toolName,\n resourceId: entryResourceId,\n preExisting: true,\n });\n}\n\nfunction assertRoomForHolder(\n resource: SharedResourceDeclaration,\n record: SharedResourceRecord | null,\n repository: ThisRepository,\n): void {\n if (\n record !== null &&\n !record.holders.includes(repository.path) &&\n record.holders.length >= MAX_SHARED_RESOURCE_HOLDERS\n ) {\n throw new Error(\n `${resource.toolName} already has ${MAX_SHARED_RESOURCE_HOLDERS} repositories recorded as users, so agemon can't add this one. Run 'agemon nuke' in repositories you no longer use (see 'agemon status'), then run agemon here again.`,\n );\n }\n}\n\nfunction withHolder(holders: string[], repository: string): string[] {\n return holders.includes(repository) ? holders : [...holders, repository];\n}\n\nfunction installedRecord(\n record: SharedResourceRecord | null,\n repository: ThisRepository,\n): SharedResourceRecord {\n return {\n origin: \"installed\",\n installedBy: repository.path,\n ownerDirectoryId: repository.directoryId,\n holders: withHolder(record?.holders ?? [], repository.path),\n };\n}\n\nfunction holdExistingResource(\n resource: SharedResourceDeclaration,\n record: SharedResourceRecord | null,\n repository: ThisRepository,\n repoLedgerSaysInstalled: boolean,\n): SharedResourceRecord {\n if (record !== null) {\n return { ...record, holders: withHolder(record.holders, repository.path) };\n }\n return repoLedgerSaysInstalled && resource.migratesFromRepoLedgers\n ? {\n origin: \"migrated\",\n claimedBy: repository.path,\n ownerDirectoryId: repository.directoryId,\n holders: [repository.path],\n }\n : { origin: \"pre-existing\", holders: [repository.path] };\n}\n\nexport async function addSharedHolder(\n ctx: Context,\n capabilityId: string,\n resource: SharedResourceDeclaration,\n options: SharedResourceProbe & { repoLedgerSaysInstalled: boolean },\n): Promise<void> {\n const repository = await resolveThisRepository(ctx);\n await updateSharedResource(\n resource.id,\n async (record) => {\n if (!(await options.isPresent())) {\n throw new Error(\n `${resource.toolName} is no longer installed — re-run 'agemon plan'.`,\n );\n }\n assertRoomForHolder(resource, record, repository);\n await recordUsesSharedResource(ctx, capabilityId, resource);\n return {\n record: holdExistingResource(\n resource,\n record,\n repository,\n options.repoLedgerSaysInstalled,\n ),\n result: undefined,\n };\n },\n reportPrunedHolder(ctx, resource),\n );\n}\n\nexport async function createSharedResource(\n ctx: Context,\n capabilityId: string,\n resource: SharedResourceDeclaration,\n options: SharedResourceProbe & {\n create(): Promise<void>;\n recordInstall(): Promise<void>;\n },\n): Promise<\"created\" | \"already-present\"> {\n const repository = await resolveThisRepository(ctx);\n return updateSharedResource(\n resource.id,\n async (record, lock) => {\n assertRoomForHolder(resource, record, repository);\n if (await options.isPresent()) {\n ctx.ui.info(`${resource.toolName} was installed meanwhile — using it`);\n await recordUsesSharedResource(ctx, capabilityId, resource);\n return {\n record: holdExistingResource(resource, record, repository, false),\n result: \"already-present\" as const,\n };\n }\n await lock.assertStillHeld();\n await options.create();\n await options.recordInstall();\n return {\n record: installedRecord(record, repository),\n result: \"created\" as const,\n };\n },\n reportPrunedHolder(ctx, resource),\n );\n}\n\nexport async function claimSharedResourceBeforeCreating(\n ctx: Context,\n resource: SharedResourceDeclaration,\n options: SharedResourceProbe & {\n recordIntent(becomesInstaller: boolean): Promise<void>;\n },\n): Promise<boolean> {\n const repository = await resolveThisRepository(ctx);\n return updateSharedResource(\n resource.id,\n async (record) => {\n assertRoomForHolder(resource, record, repository);\n const anotherInstallerStillHoldsIt =\n record?.origin === \"installed\" &&\n record.installedBy !== repository.path &&\n record.holders.includes(record.installedBy);\n const mustCreate = !(await options.isPresent());\n const becomesInstaller = mustCreate && !anotherInstallerStillHoldsIt;\n await options.recordIntent(becomesInstaller);\n return {\n record: becomesInstaller\n ? installedRecord(record, repository)\n : holdExistingResource(resource, record, repository, false),\n result: mustCreate,\n };\n },\n reportPrunedHolder(ctx, resource),\n );\n}\n\nfunction recordedInstaller(record: SharedResourceRecord): string | null {\n switch (record.origin) {\n case \"installed\":\n return record.installedBy;\n case \"migrated\":\n return record.claimedBy;\n case \"pre-existing\":\n return null;\n }\n}\n\nfunction decideRelease(\n record: SharedResourceRecord | null,\n repository: string,\n releasingRepoInstalledIt: boolean,\n removeSharedRequested: boolean,\n): ReleaseDecision {\n if (record === null || !record.holders.includes(repository)) {\n return { kind: \"not-registered\" };\n }\n const others = record.holders.filter((holder) => holder !== repository);\n if (others.length > 0) {\n return { kind: \"still-used\", others };\n }\n if (!releasingRepoInstalledIt) {\n return recordedInstaller(record) === repository\n ? { kind: \"installer-entry-unconfirmed\" }\n : { kind: \"not-the-installer\" };\n }\n if (record.origin === \"installed\" && record.installedBy === repository) {\n return { kind: \"remove\", claimedBy: null };\n }\n if (record.origin === \"migrated\" && record.claimedBy === repository) {\n return removeSharedRequested\n ? { kind: \"remove\", claimedBy: record.claimedBy }\n : { kind: \"needs-remove-shared\", claimedBy: record.claimedBy };\n }\n return { kind: \"not-the-installer\" };\n}\n\nfunction recordAfterRelease(\n decision: ReleaseDecision,\n record: SharedResourceRecord | null,\n): SharedResourceRecord | null {\n if (decision.kind === \"not-registered\") {\n return record;\n }\n if (decision.kind === \"still-used\" && record !== null) {\n return { ...record, holders: decision.others };\n }\n return null;\n}\n\nfunction describeRemoval(\n resource: SharedResourceDeclaration,\n decision: Extract<ReleaseDecision, { kind: \"remove\" }>,\n): string {\n return decision.claimedBy === null\n ? `Would ${resource.removalVerb} ${resource.toolName} (no other repository uses it)`\n : `Would ${resource.removalVerb} ${resource.toolName} (no other repository uses it; installed before agemon tracked shared tools — the ledger of ${printable(decision.claimedBy)} says agemon installed it)`;\n}\n\nconst REMOVAL_PAST_TENSE: Record<\n SharedResourceDeclaration[\"removalVerb\"],\n string\n> = {\n uninstall: \"uninstalled\",\n disable: \"disabled\",\n};\n\nasync function isPresentOrUnknown(\n probe: SharedResourceProbe,\n): Promise<boolean> {\n try {\n return await probe.isPresent();\n } catch {\n return true;\n }\n}\n\nasync function unregisteredResourceMayNeedRemoval(\n decision: Exclude<ReleaseDecision, { kind: \"remove\" }>,\n options: SharedResourceProbe & { releasingRepoInstalledIt: boolean },\n): Promise<boolean> {\n return (\n decision.kind === \"not-registered\" &&\n options.releasingRepoInstalledIt &&\n (await isPresentOrUnknown(options))\n );\n}\n\nfunction describeKeptResource(\n ctx: Context,\n resource: SharedResourceDeclaration,\n decision: Exclude<ReleaseDecision, { kind: \"remove\" }>,\n record: SharedResourceRecord | null,\n unregisteredResourceMayNeedRemoval: boolean,\n): string {\n const keeping = `${ctx.dryRun ? \"Would keep\" : \"Keeping\"} ${resource.toolName}`;\n const manualRemoval = `run '${resource.manualRemoveCommand}' yourself if nothing else needs it`;\n switch (decision.kind) {\n case \"not-registered\":\n return unregisteredResourceMayNeedRemoval\n ? `${keeping}: this repository is not registered as using it — ${manualRemoval}`\n : `${keeping}: this repository is not registered as using it`;\n case \"still-used\":\n return `${keeping}: still used by ${decision.others.map(printable).join(\", \")}`;\n case \"not-the-installer\":\n return record?.origin === \"pre-existing\" &&\n resource.removalVerb === \"disable\"\n ? `${keeping}: it was enabled before agemon tracked it — ${manualRemoval}`\n : `${keeping}: agemon has no record on this machine that it installed it from this repository — ${manualRemoval}`;\n case \"installer-entry-unconfirmed\":\n return `${keeping}: the shared-tools ledger names this repository as its installer, but this repository's ledger entry for that install is not confirmed (written before ledger receipts, or not on this machine) — ${manualRemoval}`;\n case \"needs-remove-shared\": {\n const reason = `${keeping}: agemon installed it before it tracked shared tools (the ledger of ${printable(decision.claimedBy)} says so), so another repository may still use it.`;\n return ctx.dryRun\n ? `${reason} Re-run with --remove-shared ${resource.toolName}, or run '${resource.manualRemoveCommand}'.`\n : `${reason} Run '${resource.manualRemoveCommand}' yourself if nothing else needs it.`;\n }\n }\n}\n\nexport function repoLedgerUsesSharedResource(\n entries: LedgerEntry[],\n resource: SharedResourceDeclaration,\n): boolean {\n return entries.some(\n (entry) =>\n entry.type === ACTION_TYPE_USES_SHARED_RESOURCE &&\n entry.resourceId === sharedResourceEntryId(resource),\n );\n}\n\nasync function currentRecord(\n resource: SharedResourceDeclaration,\n): Promise<SharedResourceRecord | null> {\n const stored = (await readMachineLedger()).resources[resource.id] ?? null;\n return stored === null\n ? null\n : withoutReplacedOwner({\n ...stored,\n holders: await withoutMissingHolders(stored.holders, () => {}),\n });\n}\n\nexport async function releaseSharedResource(\n ctx: Context,\n resource: SharedResourceDeclaration,\n options: SharedResourceProbe & {\n releasingRepoInstalledIt: boolean;\n remove(): Promise<void>;\n },\n): Promise<void> {\n const repository = await realpath(ctx.cwd);\n const removeSharedRequested =\n ctx.removeSharedTools?.has(resource.toolName) ?? false;\n\n if (ctx.dryRun) {\n const record = await currentRecord(resource);\n const decision = decideRelease(\n record,\n repository,\n options.releasingRepoInstalledIt,\n removeSharedRequested,\n );\n ctx.ui.info(\n decision.kind === \"remove\"\n ? describeRemoval(resource, decision)\n : describeKeptResource(\n ctx,\n resource,\n decision,\n record,\n await unregisteredResourceMayNeedRemoval(decision, options),\n ),\n );\n return;\n }\n\n await updateSharedResource(\n resource.id,\n async (record, lock) => {\n const decision = decideRelease(\n record,\n repository,\n options.releasingRepoInstalledIt,\n removeSharedRequested,\n );\n if (decision.kind !== \"remove\") {\n ctx.ui.info(\n describeKeptResource(\n ctx,\n resource,\n decision,\n record,\n await unregisteredResourceMayNeedRemoval(decision, options),\n ),\n );\n } else if (await options.isPresent()) {\n await lock.assertStillHeld();\n await options.remove();\n } else {\n ctx.ui.info(\n `${resource.toolName} was already ${REMOVAL_PAST_TENSE[resource.removalVerb]}`,\n );\n }\n return {\n record: recordAfterRelease(decision, record),\n result: undefined,\n };\n },\n reportPrunedHolder(ctx, resource),\n );\n}\n\nexport interface SharedToolStatus {\n tool: string;\n origin: SharedResourceRecord[\"origin\"];\n recordedBy: string | null;\n holders: { path: string; thisRepository: boolean; missing: boolean }[];\n heldWithoutLedgerEntry: boolean;\n manualRemoveCommand: string;\n}\n\nfunction ledgerRecordsUseOf(\n ctx: Context,\n plugin: AgemonPlugin,\n resource: SharedResourceDeclaration,\n): boolean {\n const entries = ctx.manifest\n .getActions()\n .filter((entry) => entry.plugin === plugin.id);\n return (\n repoLedgerUsesSharedResource(entries, resource) ||\n entries.some((entry) => INSTALL_ENTRY_TYPES.has(entry.type))\n );\n}\n\nexport async function describeSharedTools(\n ctx: Context,\n plugins: AgemonPlugin[],\n): Promise<SharedToolStatus[]> {\n const ledger = await readMachineLedger();\n const repository = await realpath(ctx.cwd);\n const rows: SharedToolStatus[] = [];\n for (const plugin of plugins) {\n for (const resource of plugin.sharedResources ?? []) {\n const stored = ledger.resources[resource.id];\n if (stored === undefined) {\n continue;\n }\n const record = await withoutReplacedOwner(stored);\n const existing = new Set(\n await withoutMissingHolders(record.holders, () => {}),\n );\n rows.push({\n tool: resource.toolName,\n origin: record.origin,\n recordedBy: recordedInstaller(record),\n holders: record.holders.map((holder) => ({\n path: holder,\n thisRepository: holder === repository,\n missing: !existing.has(holder),\n })),\n heldWithoutLedgerEntry:\n record.holders.includes(repository) &&\n !ledgerRecordsUseOf(ctx, plugin, resource),\n manualRemoveCommand: resource.manualRemoveCommand,\n });\n }\n }\n return rows;\n}\n","import type {\n ProposedOperation,\n ProposedOperationAction,\n RiskClass,\n SkillUpdate,\n} from \"./types.js\";\n\ninterface DescribeOperationInput {\n capabilityId: string;\n resourceId: string;\n targetPath: string;\n action: ProposedOperationAction;\n riskClass: RiskClass;\n requiresConsent: boolean;\n expectedFingerprint?: string | null;\n preview: { kind: \"diff\" | \"note\"; text: string };\n updates?: SkillUpdate[];\n}\n\nexport function describeOperation(\n input: DescribeOperationInput,\n): ProposedOperation {\n return {\n ...(input.updates === undefined ? {} : { updates: input.updates }),\n id: `${input.capabilityId}:${input.resourceId}:${input.action}`,\n capabilityId: input.capabilityId,\n resourceId: input.resourceId,\n targetPath: input.targetPath,\n action: input.action,\n riskClass: input.riskClass,\n requiresConsent: input.requiresConsent,\n expectedFingerprint: input.expectedFingerprint ?? null,\n preview: input.preview,\n };\n}\n","const MIN_SIGNIFICANT_LINE_LENGTH = 12;\nconst OVERLAP_SIMILARITY_THRESHOLD = 0.5;\nconst POINTER_MAX_NORMALIZED_LENGTH = 800;\nconst CANONICAL_RULE_FILE = \"AGENTS.md\";\n\nexport type RuleFileRole = \"canonical\" | \"pointer\" | \"unknown\";\nexport type DuplicationReportScope = \"all\" | \"involving-canonical\";\n\nexport interface OverlapFinding {\n left: string;\n right: string;\n leftRole: RuleFileRole;\n rightRole: RuleFileRole;\n similarity: number;\n bothRuleBearing: boolean;\n}\n\nexport interface DuplicationReport {\n overlaps: OverlapFinding[];\n}\n\nexport interface RuleFileContents {\n path: string;\n contents: string | null;\n}\n\nexport interface DetectDuplicationOptions {\n report?: DuplicationReportScope;\n}\n\nfunction normalizeToSignificantLines(contents: string): Set<string> {\n const withoutHtmlComments = contents.replace(/<!--[\\s\\S]*?-->/g, \" \");\n const significantLines = withoutHtmlComments\n .split(/\\r?\\n/)\n .map((line) =>\n line\n .toLowerCase()\n .replace(/[`*_>#]+/g, \" \")\n .replace(/^\\s*[-+]\\s+/, \" \")\n .replace(/\\s+/g, \" \")\n .trim(),\n )\n .filter((line) => line.length >= MIN_SIGNIFICANT_LINE_LENGTH);\n return new Set(significantLines);\n}\n\nfunction classifyRole(path: string, contents: string): RuleFileRole {\n if (path === CANONICAL_RULE_FILE) {\n return \"canonical\";\n }\n const normalizedLength = contents.replace(/\\s+/g, \" \").trim().length;\n const referencesCanonical = /AGENTS\\.md/i.test(contents);\n if (\n normalizedLength <= POINTER_MAX_NORMALIZED_LENGTH &&\n referencesCanonical\n ) {\n return \"pointer\";\n }\n return \"unknown\";\n}\n\nfunction overlapIsReportable(\n leftRole: RuleFileRole,\n rightRole: RuleFileRole,\n scope: DuplicationReportScope,\n): boolean {\n if (leftRole === \"pointer\" && rightRole === \"pointer\") {\n return false;\n }\n if (scope === \"involving-canonical\") {\n return leftRole === \"canonical\" || rightRole === \"canonical\";\n }\n return true;\n}\n\nfunction jaccardSimilarity(left: Set<string>, right: Set<string>): number {\n if (left.size === 0 || right.size === 0) {\n return 0;\n }\n\n let intersectionSize = 0;\n for (const value of left) {\n if (right.has(value)) {\n intersectionSize += 1;\n }\n }\n\n const unionSize = left.size + right.size - intersectionSize;\n return unionSize === 0 ? 0 : intersectionSize / unionSize;\n}\n\nexport function detectDuplication(\n ruleFiles: RuleFileContents[],\n options: DetectDuplicationOptions = {},\n): DuplicationReport {\n const scope = options.report ?? \"involving-canonical\";\n\n const normalizedFiles = ruleFiles\n .filter(\n (file): file is { path: string; contents: string } =>\n file.contents !== null,\n )\n .map((file) => ({\n path: file.path,\n role: classifyRole(file.path, file.contents),\n lines: normalizeToSignificantLines(file.contents),\n }));\n\n const overlaps: OverlapFinding[] = [];\n for (let leftIndex = 0; leftIndex < normalizedFiles.length; leftIndex += 1) {\n for (\n let rightIndex = leftIndex + 1;\n rightIndex < normalizedFiles.length;\n rightIndex += 1\n ) {\n const left = normalizedFiles[leftIndex];\n const right = normalizedFiles[rightIndex];\n if (!overlapIsReportable(left.role, right.role, scope)) {\n continue;\n }\n\n const similarity = jaccardSimilarity(left.lines, right.lines);\n if (similarity >= OVERLAP_SIMILARITY_THRESHOLD) {\n overlaps.push({\n left: left.path,\n right: right.path,\n leftRole: left.role,\n rightRole: right.role,\n similarity: Math.round(similarity * 100) / 100,\n bothRuleBearing: left.role !== \"pointer\" && right.role !== \"pointer\",\n });\n }\n }\n }\n\n return { overlaps };\n}\n\nexport function describeOverlap(overlap: OverlapFinding): string {\n const reason = overlap.bothRuleBearing\n ? \"both carry rule content\"\n : `similarity ${overlap.similarity}`;\n return `${overlap.left} ~ ${overlap.right} (${reason})`;\n}\n","import process from 'node:process';\nimport stringWidth from 'string-width';\nimport chalk from 'chalk';\nimport widestLine from 'widest-line';\nimport cliBoxes from 'cli-boxes';\nimport camelCase from 'camelcase';\nimport ansiAlign from 'ansi-align';\nimport wrapAnsi from 'wrap-ansi';\n\nconst NEWLINE = '\\n';\nconst PAD = ' ';\nconst NONE = 'none';\n\nconst terminalColumns = () => {\n\tconst {env, stdout, stderr} = process;\n\n\tif (stdout?.columns) {\n\t\treturn stdout.columns;\n\t}\n\n\tif (stderr?.columns) {\n\t\treturn stderr.columns;\n\t}\n\n\tif (env.COLUMNS) {\n\t\treturn Number.parseInt(env.COLUMNS, 10);\n\t}\n\n\treturn 80;\n};\n\nconst getObject = detail => typeof detail === 'number' ? {\n\ttop: detail,\n\tright: detail * 3,\n\tbottom: detail,\n\tleft: detail * 3,\n} : {\n\ttop: 0,\n\tright: 0,\n\tbottom: 0,\n\tleft: 0,\n\t...detail,\n};\n\nconst getBorderWidth = borderStyle => borderStyle === NONE ? 0 : 2;\n\nconst getBorderChars = borderStyle => {\n\tconst sides = [\n\t\t'topLeft',\n\t\t'topRight',\n\t\t'bottomRight',\n\t\t'bottomLeft',\n\t\t'left',\n\t\t'right',\n\t\t'top',\n\t\t'bottom',\n\t];\n\n\tlet characters;\n\n\t// Create empty border style\n\tif (borderStyle === NONE) {\n\t\tborderStyle = {};\n\t\tfor (const side of sides) {\n\t\t\tborderStyle[side] = '';\n\t\t}\n\t}\n\n\tif (typeof borderStyle === 'string') {\n\t\tcharacters = cliBoxes[borderStyle];\n\n\t\tif (!characters) {\n\t\t\tthrow new TypeError(`Invalid border style: ${borderStyle}`);\n\t\t}\n\t} else {\n\t\t// Ensure retro-compatibility\n\t\tif (typeof borderStyle?.vertical === 'string') {\n\t\t\tborderStyle.left = borderStyle.vertical;\n\t\t\tborderStyle.right = borderStyle.vertical;\n\t\t}\n\n\t\t// Ensure retro-compatibility\n\t\tif (typeof borderStyle?.horizontal === 'string') {\n\t\t\tborderStyle.top = borderStyle.horizontal;\n\t\t\tborderStyle.bottom = borderStyle.horizontal;\n\t\t}\n\n\t\tfor (const side of sides) {\n\t\t\tif (borderStyle[side] === null || typeof borderStyle[side] !== 'string') {\n\t\t\t\tthrow new TypeError(`Invalid border style: ${side}`);\n\t\t\t}\n\t\t}\n\n\t\tcharacters = borderStyle;\n\t}\n\n\treturn characters;\n};\n\nconst makeTitle = (text, horizontal, alignment) => {\n\tlet title = '';\n\n\tconst textWidth = stringWidth(text);\n\n\tswitch (alignment) {\n\t\tcase 'left': {\n\t\t\ttitle = text + horizontal.slice(textWidth);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'right': {\n\t\t\ttitle = horizontal.slice(textWidth) + text;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault: {\n\t\t\thorizontal = horizontal.slice(textWidth);\n\n\t\t\tif (horizontal.length % 2 === 1) { // This is needed in case the length is odd\n\t\t\t\thorizontal = horizontal.slice(Math.floor(horizontal.length / 2));\n\t\t\t\ttitle = horizontal.slice(1) + text + horizontal; // We reduce the left part of one character to avoid the bar to go beyond its limit\n\t\t\t} else {\n\t\t\t\thorizontal = horizontal.slice(horizontal.length / 2);\n\t\t\t\ttitle = horizontal + text + horizontal;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn title;\n};\n\nconst makeContentText = (text, {padding, width, textAlignment, height}) => {\n\ttext = ansiAlign(text, {align: textAlignment});\n\tlet lines = text.split(NEWLINE);\n\tconst textWidth = widestLine(text);\n\n\tconst max = width - padding.left - padding.right;\n\n\tif (textWidth > max) {\n\t\tconst newLines = [];\n\t\tfor (const line of lines) {\n\t\t\tconst createdLines = wrapAnsi(line, max, {hard: true});\n\t\t\tconst alignedLines = ansiAlign(createdLines, {align: textAlignment});\n\t\t\tconst alignedLinesArray = alignedLines.split('\\n');\n\t\t\tconst longestLength = Math.max(...alignedLinesArray.map(s => stringWidth(s)));\n\n\t\t\tfor (const alignedLine of alignedLinesArray) {\n\t\t\t\tlet paddedLine;\n\t\t\t\tswitch (textAlignment) {\n\t\t\t\t\tcase 'center': {\n\t\t\t\t\t\tpaddedLine = PAD.repeat((max - longestLength) / 2) + alignedLine;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tpaddedLine = PAD.repeat(max - longestLength) + alignedLine;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tpaddedLine = alignedLine;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewLines.push(paddedLine);\n\t\t\t}\n\t\t}\n\n\t\tlines = newLines;\n\t}\n\n\tif (textAlignment === 'center' && textWidth < max) {\n\t\tlines = lines.map(line => PAD.repeat((max - textWidth) / 2) + line);\n\t} else if (textAlignment === 'right' && textWidth < max) {\n\t\tlines = lines.map(line => PAD.repeat(max - textWidth) + line);\n\t}\n\n\tconst paddingLeft = PAD.repeat(padding.left);\n\tconst paddingRight = PAD.repeat(padding.right);\n\n\tlines = lines.map(line => {\n\t\tconst newLine = paddingLeft + line + paddingRight;\n\n\t\treturn newLine + PAD.repeat(width - stringWidth(newLine));\n\t});\n\n\tif (padding.top > 0) {\n\t\tlines = [...Array.from({length: padding.top}).fill(PAD.repeat(width)), ...lines];\n\t}\n\n\tif (padding.bottom > 0) {\n\t\tlines = [...lines, ...Array.from({length: padding.bottom}).fill(PAD.repeat(width))];\n\t}\n\n\tif (height && lines.length > height) {\n\t\tlines = lines.slice(0, height);\n\t} else if (height && lines.length < height) {\n\t\tlines = [...lines, ...Array.from({length: height - lines.length}).fill(PAD.repeat(width))];\n\t}\n\n\treturn lines.join(NEWLINE);\n};\n\nconst boxContent = (content, contentWidth, options) => {\n\tconst colorizeBorder = border => {\n\t\tconst newBorder = options.borderColor ? getColorFunction(options.borderColor)(border) : border;\n\t\treturn options.dimBorder ? chalk.dim(newBorder) : newBorder;\n\t};\n\n\tconst colorizeContent = content => options.backgroundColor ? getBGColorFunction(options.backgroundColor)(content) : content;\n\n\tconst chars = getBorderChars(options.borderStyle);\n\tconst columns = terminalColumns();\n\tlet marginLeft = PAD.repeat(options.margin.left);\n\n\tif (options.float === 'center') {\n\t\tconst marginWidth = Math.max((columns - contentWidth - getBorderWidth(options.borderStyle)) / 2, 0);\n\t\tmarginLeft = PAD.repeat(marginWidth);\n\t} else if (options.float === 'right') {\n\t\tconst marginWidth = Math.max(columns - contentWidth - options.margin.right - getBorderWidth(options.borderStyle), 0);\n\t\tmarginLeft = PAD.repeat(marginWidth);\n\t}\n\n\tlet result = '';\n\n\tif (options.margin.top) {\n\t\tresult += NEWLINE.repeat(options.margin.top);\n\t}\n\n\tif (options.borderStyle !== NONE || options.title) {\n\t\tresult += colorizeBorder(marginLeft + chars.topLeft + (options.title ? makeTitle(options.title, chars.top.repeat(contentWidth), options.titleAlignment) : chars.top.repeat(contentWidth)) + chars.topRight) + NEWLINE;\n\t}\n\n\tconst lines = content.split(NEWLINE);\n\n\tresult += lines.map(line => marginLeft + colorizeBorder(chars.left) + colorizeContent(line) + colorizeBorder(chars.right)).join(NEWLINE);\n\n\tif (options.borderStyle !== NONE) {\n\t\tresult += NEWLINE + colorizeBorder(marginLeft + chars.bottomLeft + chars.bottom.repeat(contentWidth) + chars.bottomRight);\n\t}\n\n\tif (options.margin.bottom) {\n\t\tresult += NEWLINE.repeat(options.margin.bottom);\n\t}\n\n\treturn result;\n};\n\nconst sanitizeOptions = options => {\n\t// If fullscreen is enabled, max-out unspecified width/height\n\tif (options.fullscreen && process?.stdout) {\n\t\tlet newDimensions = [process.stdout.columns, process.stdout.rows];\n\n\t\tif (typeof options.fullscreen === 'function') {\n\t\t\tnewDimensions = options.fullscreen(...newDimensions);\n\t\t}\n\n\t\toptions.width ||= newDimensions[0];\n\n\t\toptions.height ||= newDimensions[1];\n\t}\n\n\t// If width is provided, make sure it's not below 1\n\toptions.width &&= Math.max(1, options.width - getBorderWidth(options.borderStyle));\n\n\t// If height is provided, make sure it's not below 1\n\toptions.height &&= Math.max(1, options.height - getBorderWidth(options.borderStyle));\n\n\treturn options;\n};\n\nconst formatTitle = (title, borderStyle) => borderStyle === NONE ? title : ` ${title} `;\n\nconst determineDimensions = (text, options) => {\n\toptions = sanitizeOptions(options);\n\tconst widthOverride = options.width !== undefined;\n\tconst columns = terminalColumns();\n\tconst borderWidth = getBorderWidth(options.borderStyle);\n\tconst maxWidth = columns - options.margin.left - options.margin.right - borderWidth;\n\n\tconst widest = widestLine(wrapAnsi(text, columns - borderWidth, {hard: true, trim: false})) + options.padding.left + options.padding.right;\n\n\t// If title and width are provided, title adheres to fixed width\n\tif (options.title && widthOverride) {\n\t\toptions.title = options.title.slice(0, Math.max(0, options.width - 2));\n\t\toptions.title &&= formatTitle(options.title, options.borderStyle);\n\t} else if (options.title) {\n\t\toptions.title = options.title.slice(0, Math.max(0, maxWidth - 2));\n\n\t\t// Recheck if title isn't empty now\n\t\tif (options.title) {\n\t\t\toptions.title = formatTitle(options.title, options.borderStyle);\n\t\t\t// If the title is larger than content, box adheres to title width\n\t\t\tif (stringWidth(options.title) > widest) {\n\t\t\t\toptions.width = stringWidth(options.title);\n\t\t\t}\n\t\t}\n\t}\n\n\t// If fixed width is provided, use it or content width as reference\n\toptions.width ||= widest;\n\n\tif (!widthOverride) {\n\t\tif ((options.margin.left && options.margin.right) && options.width > maxWidth) {\n\t\t\t// Let's assume we have margins: left = 3, right = 5, in total = 8\n\t\t\tconst spaceForMargins = columns - options.width - borderWidth;\n\t\t\t// Let's assume we have space = 4\n\t\t\tconst multiplier = spaceForMargins / (options.margin.left + options.margin.right);\n\t\t\t// Here: multiplier = 4/8 = 0.5\n\t\t\toptions.margin.left = Math.max(0, Math.floor(options.margin.left * multiplier));\n\t\t\toptions.margin.right = Math.max(0, Math.floor(options.margin.right * multiplier));\n\t\t\t// Left: 3 * 0.5 = 1.5 -> 1\n\t\t\t// Right: 6 * 0.5 = 3\n\t\t}\n\n\t\t// Re-cap width considering the margins after shrinking\n\t\toptions.width = Math.min(options.width, columns - borderWidth - options.margin.left - options.margin.right);\n\t}\n\n\t// Prevent padding overflow\n\tif (options.width - (options.padding.left + options.padding.right) <= 0) {\n\t\toptions.padding.left = 0;\n\t\toptions.padding.right = 0;\n\t}\n\n\tif (options.height && options.height - (options.padding.top + options.padding.bottom) <= 0) {\n\t\toptions.padding.top = 0;\n\t\toptions.padding.bottom = 0;\n\t}\n\n\treturn options;\n};\n\nconst isHex = color => color.match(/^#(?:[0-f]{3}){1,2}$/i);\nconst isColorValid = color => typeof color === 'string' && (chalk[color] ?? isHex(color));\nconst getColorFunction = color => isHex(color) ? chalk.hex(color) : chalk[color];\nconst getBGColorFunction = color => isHex(color) ? chalk.bgHex(color) : chalk[camelCase(['bg', color])];\n\nexport default function boxen(text, options) {\n\toptions = {\n\t\tpadding: 0,\n\t\tborderStyle: 'single',\n\t\tdimBorder: false,\n\t\ttextAlignment: 'left',\n\t\tfloat: 'left',\n\t\ttitleAlignment: 'left',\n\t\t...options,\n\t};\n\n\t// This option is deprecated\n\tif (options.align) {\n\t\toptions.textAlignment = options.align;\n\t}\n\n\tif (options.borderColor && !isColorValid(options.borderColor)) {\n\t\tthrow new Error(`${options.borderColor} is not a valid borderColor`);\n\t}\n\n\tif (options.backgroundColor && !isColorValid(options.backgroundColor)) {\n\t\tthrow new Error(`${options.backgroundColor} is not a valid backgroundColor`);\n\t}\n\n\toptions.padding = getObject(options.padding);\n\toptions.margin = getObject(options.margin);\n\n\toptions = determineDimensions(text, options);\n\n\ttext = makeContentText(text, options);\n\n\treturn boxContent(text, options.width, options);\n}\n\nexport {default as _borderStyles} from 'cli-boxes';\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST\n\t// The payload stops at the first terminator character rather than scanning ahead for one, so an unterminated `ESC ]` cannot rescan the rest of the input. Terminals likewise abort a control string on an unexpected ESC.\n\tconst osc = `(?:\\\\u001B\\\\][^\\\\u0007\\\\u001B\\\\u009C]*${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Fast path: ANSI codes require ESC (7-bit) or CSI (8-bit) introducer\n\tif (!string.includes('\\u001B') && !string.includes('\\u009B')) {\n\t\treturn string;\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","// Generated by scripts/build.js\n\nexport const ambiguousMinimalCodePoint = 161;\nexport const ambiguousMaximumCodePoint = 1114109;\nexport const ambiguousRanges = [161, 161, 164, 164, 167, 168, 170, 170, 173, 174, 176, 180, 182, 186, 188, 191, 198, 198, 208, 208, 215, 216, 222, 225, 230, 230, 232, 234, 236, 237, 240, 240, 242, 243, 247, 250, 252, 252, 254, 254, 257, 257, 273, 273, 275, 275, 283, 283, 294, 295, 299, 299, 305, 307, 312, 312, 319, 322, 324, 324, 328, 331, 333, 333, 338, 339, 358, 359, 363, 363, 462, 462, 464, 464, 466, 466, 468, 468, 470, 470, 472, 472, 474, 474, 476, 476, 593, 593, 609, 609, 708, 708, 711, 711, 713, 715, 717, 717, 720, 720, 728, 731, 733, 733, 735, 735, 768, 879, 913, 929, 931, 937, 945, 961, 963, 969, 1025, 1025, 1040, 1103, 1105, 1105, 8208, 8208, 8211, 8214, 8216, 8217, 8220, 8221, 8224, 8226, 8228, 8231, 8240, 8240, 8242, 8243, 8245, 8245, 8251, 8251, 8254, 8254, 8308, 8308, 8319, 8319, 8321, 8324, 8364, 8364, 8451, 8451, 8453, 8453, 8457, 8457, 8467, 8467, 8470, 8470, 8481, 8482, 8486, 8486, 8491, 8491, 8531, 8532, 8539, 8542, 8544, 8555, 8560, 8569, 8585, 8585, 8592, 8601, 8632, 8633, 8658, 8658, 8660, 8660, 8679, 8679, 8704, 8704, 8706, 8707, 8711, 8712, 8715, 8715, 8719, 8719, 8721, 8721, 8725, 8725, 8730, 8730, 8733, 8736, 8739, 8739, 8741, 8741, 8743, 8748, 8750, 8750, 8756, 8759, 8764, 8765, 8776, 8776, 8780, 8780, 8786, 8786, 8800, 8801, 8804, 8807, 8810, 8811, 8814, 8815, 8834, 8835, 8838, 8839, 8853, 8853, 8857, 8857, 8869, 8869, 8895, 8895, 8978, 8978, 9312, 9449, 9451, 9547, 9552, 9587, 9600, 9615, 9618, 9621, 9632, 9633, 9635, 9641, 9650, 9651, 9654, 9655, 9660, 9661, 9664, 9665, 9670, 9672, 9675, 9675, 9678, 9681, 9698, 9701, 9711, 9711, 9733, 9734, 9737, 9737, 9742, 9743, 9756, 9756, 9758, 9758, 9792, 9792, 9794, 9794, 9824, 9825, 9827, 9829, 9831, 9834, 9836, 9837, 9839, 9839, 9886, 9887, 9919, 9919, 9926, 9933, 9935, 9939, 9941, 9953, 9955, 9955, 9960, 9961, 9963, 9969, 9972, 9972, 9974, 9977, 9979, 9980, 9982, 9983, 10045, 10045, 10102, 10111, 11094, 11097, 12872, 12879, 57344, 63743, 65024, 65039, 65533, 65533, 127232, 127242, 127248, 127277, 127280, 127337, 127344, 127373, 127375, 127376, 127387, 127404, 917760, 917999, 983040, 1048573, 1048576, 1114109];\n\nexport const fullwidthMinimalCodePoint = 12288;\nexport const fullwidthMaximumCodePoint = 65510;\nexport const fullwidthRanges = [12288, 12288, 65281, 65376, 65504, 65510];\n\nexport const halfwidthMinimalCodePoint = 8361;\nexport const halfwidthMaximumCodePoint = 65518;\nexport const halfwidthRanges = [8361, 8361, 65377, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65512, 65518];\n\nexport const narrowMinimalCodePoint = 32;\nexport const narrowMaximumCodePoint = 10630;\nexport const narrowRanges = [32, 126, 162, 163, 165, 166, 172, 172, 175, 175, 10214, 10221, 10629, 10630];\n\nexport const wideMinimalCodePoint = 4352;\nexport const wideMaximumCodePoint = 262141;\nexport const wideRanges = [4352, 4447, 8986, 8987, 9001, 9002, 9193, 9196, 9200, 9200, 9203, 9203, 9725, 9726, 9748, 9749, 9776, 9783, 9800, 9811, 9855, 9855, 9866, 9871, 9875, 9875, 9889, 9889, 9898, 9899, 9917, 9918, 9924, 9925, 9934, 9934, 9940, 9940, 9962, 9962, 9970, 9971, 9973, 9973, 9978, 9978, 9981, 9981, 9989, 9989, 9994, 9995, 10024, 10024, 10060, 10060, 10062, 10062, 10067, 10069, 10071, 10071, 10133, 10135, 10160, 10160, 10175, 10175, 11035, 11036, 11088, 11088, 11093, 11093, 11904, 11929, 11931, 12019, 12032, 12245, 12272, 12287, 12289, 12350, 12353, 12438, 12441, 12543, 12549, 12591, 12593, 12686, 12688, 12773, 12783, 12830, 12832, 12871, 12880, 42124, 42128, 42182, 43360, 43388, 44032, 55203, 63744, 64255, 65040, 65049, 65072, 65106, 65108, 65126, 65128, 65131, 94176, 94180, 94192, 94198, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 119552, 119638, 119648, 119670, 126980, 126980, 127183, 127183, 127374, 127374, 127377, 127386, 127488, 127490, 127504, 127547, 127552, 127560, 127568, 127569, 127584, 127589, 127744, 127776, 127789, 127797, 127799, 127868, 127870, 127891, 127904, 127946, 127951, 127955, 127968, 127984, 127988, 127988, 127992, 128062, 128064, 128064, 128066, 128252, 128255, 128317, 128331, 128334, 128336, 128359, 128378, 128378, 128405, 128406, 128420, 128420, 128507, 128591, 128640, 128709, 128716, 128716, 128720, 128722, 128725, 128728, 128732, 128735, 128747, 128748, 128756, 128764, 128992, 129003, 129008, 129008, 129292, 129338, 129340, 129349, 129351, 129535, 129648, 129660, 129664, 129674, 129678, 129734, 129736, 129736, 129741, 129756, 129759, 129770, 129775, 129784, 131072, 196605, 196608, 262141];\n","/**\nBinary search on a sorted flat array of [start, end] pairs.\n\n@param {number[]} ranges - Flat array of inclusive [start, end] range pairs, e.g. [0, 5, 10, 20].\n@param {number} codePoint - The value to search for.\n@returns {boolean} Whether the value falls within any of the ranges.\n*/\nexport const isInRange = (ranges, codePoint) => {\n\tlet low = 0;\n\tlet high = Math.floor(ranges.length / 2) - 1;\n\twhile (low <= high) {\n\t\tconst mid = Math.floor((low + high) / 2);\n\t\tconst i = mid * 2;\n\t\tif (codePoint < ranges[i]) {\n\t\t\thigh = mid - 1;\n\t\t} else if (codePoint > ranges[i + 1]) {\n\t\t\tlow = mid + 1;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n","import {\n\tambiguousMinimalCodePoint,\n\tambiguousMaximumCodePoint,\n\tambiguousRanges,\n\n\tfullwidthMinimalCodePoint,\n\tfullwidthMaximumCodePoint,\n\tfullwidthRanges,\n\n\thalfwidthMinimalCodePoint,\n\thalfwidthMaximumCodePoint,\n\thalfwidthRanges,\n\n\tnarrowMinimalCodePoint,\n\tnarrowMaximumCodePoint,\n\tnarrowRanges,\n\n\twideMinimalCodePoint,\n\twideMaximumCodePoint,\n\twideRanges,\n} from './lookup-data.js';\nimport {isInRange} from './utilities.js';\n\nconst commonCjkCodePoint = 0x4E_00;\nconst [wideFastPathStart, wideFastPathEnd] = /* #__PURE__ */ findWideFastPathRange(wideRanges);\n\n// Use a hot-path range so common `isWide` calls can skip binary search.\n// The range containing U+4E00 covers common CJK ideographs;\n// fallback to the largest range for resilience to Unicode table changes.\nfunction findWideFastPathRange(ranges) {\n\tlet fastPathStart = ranges[0];\n\tlet fastPathEnd = ranges[1];\n\n\tfor (let index = 0; index < ranges.length; index += 2) {\n\t\tconst start = ranges[index];\n\t\tconst end = ranges[index + 1];\n\n\t\tif (\n\t\t\tcommonCjkCodePoint >= start\n\t\t\t&& commonCjkCodePoint <= end\n\t\t) {\n\t\t\treturn [start, end];\n\t\t}\n\n\t\tif ((end - start) > (fastPathEnd - fastPathStart)) {\n\t\t\tfastPathStart = start;\n\t\t\tfastPathEnd = end;\n\t\t}\n\t}\n\n\treturn [fastPathStart, fastPathEnd];\n}\n\nexport const isAmbiguous = codePoint => {\n\tif (\n\t\tcodePoint < ambiguousMinimalCodePoint\n\t\t|| codePoint > ambiguousMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(ambiguousRanges, codePoint);\n};\n\nexport const isFullWidth = codePoint => {\n\tif (\n\t\tcodePoint < fullwidthMinimalCodePoint\n\t\t|| codePoint > fullwidthMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(fullwidthRanges, codePoint);\n};\n\nconst isHalfWidth = codePoint => {\n\tif (\n\t\tcodePoint < halfwidthMinimalCodePoint\n\t\t|| codePoint > halfwidthMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(halfwidthRanges, codePoint);\n};\n\nconst isNarrow = codePoint => {\n\tif (\n\t\tcodePoint < narrowMinimalCodePoint\n\t\t|| codePoint > narrowMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(narrowRanges, codePoint);\n};\n\nexport const isWide = codePoint => {\n\tif (\n\t\tcodePoint >= wideFastPathStart\n\t\t&& codePoint <= wideFastPathEnd\n\t) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\tcodePoint < wideMinimalCodePoint\n\t\t|| codePoint > wideMaximumCodePoint\n\t) {\n\t\treturn false;\n\t}\n\n\treturn isInRange(wideRanges, codePoint);\n};\n\nexport function getCategory(codePoint) {\n\tif (isAmbiguous(codePoint)) {\n\t\treturn 'ambiguous';\n\t}\n\n\tif (isFullWidth(codePoint)) {\n\t\treturn 'fullwidth';\n\t}\n\n\tif (isHalfWidth(codePoint)) {\n\t\treturn 'halfwidth';\n\t}\n\n\tif (isNarrow(codePoint)) {\n\t\treturn 'narrow';\n\t}\n\n\tif (isWide(codePoint)) {\n\t\treturn 'wide';\n\t}\n\n\treturn 'neutral';\n}\n","import {getCategory, isAmbiguous, isFullWidth, isWide} from './lookup.js';\n\nfunction validate(codePoint) {\n\tif (!Number.isSafeInteger(codePoint)) {\n\t\tthrow new TypeError(`Expected a code point, got \\`${typeof codePoint}\\`.`);\n\t}\n}\n\nexport function eastAsianWidthType(codePoint) {\n\tvalidate(codePoint);\n\n\treturn getCategory(codePoint);\n}\n\nexport function eastAsianWidth(codePoint, {ambiguousAsWide = false} = {}) {\n\tvalidate(codePoint);\n\n\tif (\n\t\tisFullWidth(codePoint)\n\t\t|| isWide(codePoint)\n\t\t|| (ambiguousAsWide && isAmbiguous(codePoint))\n\t) {\n\t\treturn 2;\n\t}\n\n\treturn 1;\n}\n\n// Private exports for https://github.com/sindresorhus/is-fullwidth-code-point\nexport {isFullWidth as _isFullWidth, isWide as _isWide} from './lookup.js';\n","export default () => {\n\t// https://mths.be/emoji\n\treturn /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E-\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED8\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDD75(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC2\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF]|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\n};\n","import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\nimport emojiRegex from 'emoji-regex';\n\nconst segmenter = new Intl.Segmenter();\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\nimport emojiRegex from 'emoji-regex';\n\nconst segmenter = new Intl.Segmenter();\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n","import stringWidth from 'string-width';\n\nexport default function widestLine(string) {\n\tlet lineWidth = 0;\n\n\tfor (const line of string.split('\\n')) {\n\t\tlineWidth = Math.max(lineWidth, stringWidth(line));\n\t}\n\n\treturn lineWidth;\n}\n","const UPPERCASE = /[\\p{Lu}]/u;\nconst LOWERCASE = /[\\p{Ll}]/u;\nconst LEADING_CAPITAL = /^[\\p{Lu}](?![\\p{Lu}])/gu;\nconst IDENTIFIER = /([\\p{Alpha}\\p{N}_]|$)/u;\nconst SEPARATORS = /[_.\\- ]+/;\n\nconst LEADING_SEPARATORS = new RegExp('^' + SEPARATORS.source);\nconst SEPARATORS_AND_IDENTIFIER = new RegExp(SEPARATORS.source + IDENTIFIER.source, 'gu');\nconst NUMBERS_AND_IDENTIFIER = new RegExp('\\\\d+' + IDENTIFIER.source, 'gu');\n\nconst preserveCamelCase = (string, toLowerCase, toUpperCase, preserveConsecutiveUppercase) => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\tlet isLastLastCharPreserved = false;\n\n\tfor (let index = 0; index < string.length; index++) {\n\t\tconst character = string[index];\n\t\tisLastLastCharPreserved = index > 2 ? string[index - 3] === '-' : true;\n\n\t\tif (isLastCharLower && UPPERCASE.test(character)) {\n\t\t\tstring = string.slice(0, index) + '-' + string.slice(index);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\tindex++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && LOWERCASE.test(character) && (!isLastLastCharPreserved || preserveConsecutiveUppercase)) {\n\t\t\tstring = string.slice(0, index - 1) + '-' + string.slice(index - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = toLowerCase(character) === character && toUpperCase(character) !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = toUpperCase(character) === character && toLowerCase(character) !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst preserveConsecutiveUppercase = (input, toLowerCase) => {\n\tLEADING_CAPITAL.lastIndex = 0;\n\n\treturn input.replaceAll(LEADING_CAPITAL, match => toLowerCase(match));\n};\n\nconst postProcess = (input, toUpperCase) => {\n\tSEPARATORS_AND_IDENTIFIER.lastIndex = 0;\n\tNUMBERS_AND_IDENTIFIER.lastIndex = 0;\n\n\treturn input\n\t\t.replaceAll(NUMBERS_AND_IDENTIFIER, (match, pattern, offset) => ['_', '-'].includes(input.charAt(offset + match.length)) ? match : toUpperCase(match))\n\t\t.replaceAll(SEPARATORS_AND_IDENTIFIER, (_, identifier) => toUpperCase(identifier));\n};\n\nexport default function camelCase(input, options) {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = {\n\t\tpascalCase: false,\n\t\tpreserveConsecutiveUppercase: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst toLowerCase = options.locale === false\n\t\t? string => string.toLowerCase()\n\t\t: string => string.toLocaleLowerCase(options.locale);\n\n\tconst toUpperCase = options.locale === false\n\t\t? string => string.toUpperCase()\n\t\t: string => string.toLocaleUpperCase(options.locale);\n\n\tif (input.length === 1) {\n\t\tif (SEPARATORS.test(input)) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn options.pascalCase ? toUpperCase(input) : toLowerCase(input);\n\t}\n\n\tconst hasUpperCase = input !== toLowerCase(input);\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input, toLowerCase, toUpperCase, options.preserveConsecutiveUppercase);\n\t}\n\n\tinput = input.replace(LEADING_SEPARATORS, '');\n\tinput = options.preserveConsecutiveUppercase ? preserveConsecutiveUppercase(input, toLowerCase) : toLowerCase(input);\n\n\tif (options.pascalCase) {\n\t\tinput = toUpperCase(input.charAt(0)) + input.slice(1);\n\t}\n\n\treturn postProcess(input, toUpperCase);\n}\n","import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\nimport emojiRegex from 'emoji-regex';\n\nconst segmenter = new Intl.Segmenter();\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import stringWidth from 'string-width';\nimport stripAnsi from 'strip-ansi';\nimport ansiStyles from 'ansi-styles';\n\nconst ESCAPES = new Set([\n\t'\\u001B',\n\t'\\u009B',\n]);\n\nconst END_CODE = 39;\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;\n\nconst wrapAnsiCode = code => `${ESCAPES.values().next().value}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = url => `${ESCAPES.values().next().value}${ANSI_ESCAPE_LINK}${url}${ANSI_ESCAPE_BELL}`;\n\n// Calculate the length of words split on ' ', ignoring\n// the extra characters added by ansi escape codes\nconst wordLengths = string => string.split(' ').map(character => stringWidth(character));\n\n// Wrap a long word across multiple rows\n// Ansi escape codes do not count towards length\nconst wrapWord = (rows, word, columns) => {\n\tconst characters = [...word];\n\n\tlet isInsideEscape = false;\n\tlet isInsideLinkEscape = false;\n\tlet visible = stringWidth(stripAnsi(rows.at(-1)));\n\n\tfor (const [index, character] of characters.entries()) {\n\t\tconst characterLength = stringWidth(character);\n\n\t\tif (visible + characterLength <= columns) {\n\t\t\trows[rows.length - 1] += character;\n\t\t} else {\n\t\t\trows.push(character);\n\t\t\tvisible = 0;\n\t\t}\n\n\t\tif (ESCAPES.has(character)) {\n\t\t\tisInsideEscape = true;\n\n\t\t\tconst ansiEscapeLinkCandidate = characters.slice(index + 1, index + 1 + ANSI_ESCAPE_LINK.length).join('');\n\t\t\tisInsideLinkEscape = ansiEscapeLinkCandidate === ANSI_ESCAPE_LINK;\n\t\t}\n\n\t\tif (isInsideEscape) {\n\t\t\tif (isInsideLinkEscape) {\n\t\t\t\tif (character === ANSI_ESCAPE_BELL) {\n\t\t\t\t\tisInsideEscape = false;\n\t\t\t\t\tisInsideLinkEscape = false;\n\t\t\t\t}\n\t\t\t} else if (character === ANSI_SGR_TERMINATOR) {\n\t\t\t\tisInsideEscape = false;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tvisible += characterLength;\n\n\t\tif (visible === columns && index < characters.length - 1) {\n\t\t\trows.push('');\n\t\t\tvisible = 0;\n\t\t}\n\t}\n\n\t// It's possible that the last row we copy over is only\n\t// ansi escape characters, handle this edge-case\n\tif (!visible && rows.at(-1).length > 0 && rows.length > 1) {\n\t\trows[rows.length - 2] += rows.pop();\n\t}\n};\n\n// Trims spaces from a string ignoring invisible sequences\nconst stringVisibleTrimSpacesRight = string => {\n\tconst words = string.split(' ');\n\tlet last = words.length;\n\n\twhile (last > 0) {\n\t\tif (stringWidth(words[last - 1]) > 0) {\n\t\t\tbreak;\n\t\t}\n\n\t\tlast--;\n\t}\n\n\tif (last === words.length) {\n\t\treturn string;\n\t}\n\n\treturn words.slice(0, last).join(' ') + words.slice(last).join('');\n};\n\n// The wrap-ansi module can be invoked in either 'hard' or 'soft' wrap mode.\n//\n// 'hard' will never allow a string to take up more than columns characters.\n//\n// 'soft' allows long words to expand past the column length.\nconst exec = (string, columns, options = {}) => {\n\tif (options.trim !== false && string.trim() === '') {\n\t\treturn '';\n\t}\n\n\tlet returnValue = '';\n\tlet escapeCode;\n\tlet escapeUrl;\n\n\tconst lengths = wordLengths(string);\n\tlet rows = [''];\n\n\tfor (const [index, word] of string.split(' ').entries()) {\n\t\tif (options.trim !== false) {\n\t\t\trows[rows.length - 1] = rows.at(-1).trimStart();\n\t\t}\n\n\t\tlet rowLength = stringWidth(rows.at(-1));\n\n\t\tif (index !== 0) {\n\t\t\tif (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {\n\t\t\t\t// If we start with a new word but the current row length equals the length of the columns, add a new row\n\t\t\t\trows.push('');\n\t\t\t\trowLength = 0;\n\t\t\t}\n\n\t\t\tif (rowLength > 0 || options.trim === false) {\n\t\t\t\trows[rows.length - 1] += ' ';\n\t\t\t\trowLength++;\n\t\t\t}\n\t\t}\n\n\t\t// In 'hard' wrap mode, the length of a line is never allowed to extend past 'columns'\n\t\tif (options.hard && lengths[index] > columns) {\n\t\t\tconst remainingColumns = (columns - rowLength);\n\t\t\tconst breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);\n\t\t\tconst breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);\n\t\t\tif (breaksStartingNextLine < breaksStartingThisLine) {\n\t\t\t\trows.push('');\n\t\t\t}\n\n\t\t\twrapWord(rows, word, columns);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) {\n\t\t\tif (options.wordWrap === false && rowLength < columns) {\n\t\t\t\twrapWord(rows, word, columns);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trows.push('');\n\t\t}\n\n\t\tif (rowLength + lengths[index] > columns && options.wordWrap === false) {\n\t\t\twrapWord(rows, word, columns);\n\t\t\tcontinue;\n\t\t}\n\n\t\trows[rows.length - 1] += word;\n\t}\n\n\tif (options.trim !== false) {\n\t\trows = rows.map(row => stringVisibleTrimSpacesRight(row));\n\t}\n\n\tconst preString = rows.join('\\n');\n\tconst pre = [...preString];\n\n\t// We need to keep a separate index as `String#slice()` works on Unicode code units, while `pre` is an array of codepoints.\n\tlet preStringIndex = 0;\n\n\tfor (const [index, character] of pre.entries()) {\n\t\treturnValue += character;\n\n\t\tif (ESCAPES.has(character)) {\n\t\t\tconst {groups} = new RegExp(`(?:\\\\${ANSI_CSI}(?<code>\\\\d+)m|\\\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`).exec(preString.slice(preStringIndex)) || {groups: {}};\n\t\t\tif (groups.code !== undefined) {\n\t\t\t\tconst code = Number.parseFloat(groups.code);\n\t\t\t\tescapeCode = code === END_CODE ? undefined : code;\n\t\t\t} else if (groups.uri !== undefined) {\n\t\t\t\tescapeUrl = groups.uri.length === 0 ? undefined : groups.uri;\n\t\t\t}\n\t\t}\n\n\t\tconst code = ansiStyles.codes.get(Number(escapeCode));\n\n\t\tif (pre[index + 1] === '\\n') {\n\t\t\tif (escapeUrl) {\n\t\t\t\treturnValue += wrapAnsiHyperlink('');\n\t\t\t}\n\n\t\t\tif (escapeCode && code) {\n\t\t\t\treturnValue += wrapAnsiCode(code);\n\t\t\t}\n\t\t} else if (character === '\\n') {\n\t\t\tif (escapeCode && code) {\n\t\t\t\treturnValue += wrapAnsiCode(escapeCode);\n\t\t\t}\n\n\t\t\tif (escapeUrl) {\n\t\t\t\treturnValue += wrapAnsiHyperlink(escapeUrl);\n\t\t\t}\n\t\t}\n\n\t\tpreStringIndex += character.length;\n\t}\n\n\treturn returnValue;\n};\n\n// For each newline, invoke the method separately\nexport default function wrapAnsi(string, columns, options) {\n\treturn String(string)\n\t\t.normalize()\n\t\t.replaceAll('\\r\\n', '\\n')\n\t\t.split('\\n')\n\t\t.map(line => exec(line, columns, options))\n\t\t.join('\\n');\n}\n","import boxen from \"boxen\";\nimport { paintTone, type Tone } from \"./theme.js\";\n\nexport interface BoxInput {\n title?: string;\n body: string;\n tone?: Tone;\n}\n\nexport function box(input: BoxInput): string {\n const tone = input.tone ?? \"accent\";\n const borderColor =\n tone === \"ok\"\n ? \"green\"\n : tone === \"warn\"\n ? \"yellow\"\n : tone === \"danger\"\n ? \"red\"\n : \"cyan\";\n\n return boxen(input.body, {\n title: input.title ? paintTone(tone, input.title) : undefined,\n padding: 1,\n borderColor,\n borderStyle: \"round\",\n });\n}\n","import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\n\n/**\nLogic:\n- Segment graphemes to match how terminals render clusters.\n- Width rules:\n\t1. Skip non-printing clusters (Default_Ignorable, Control, pure nonspacing/enclosing Mark, lone Surrogates). Tabs are ignored by design.\n\t2. RGI emoji clusters (\\p{RGI_Emoji}) are double-width.\n\t3. Minimally-qualified/unqualified emoji clusters (ZWJ sequences with 2+ Extended_Pictographic, or keycap sequences) are double-width.\n\t4. Hangul jamo collapse each standard modern Hangul L+V or L+V+T syllable piece to width 2.\n\t Unmatched repeated leading/vowel/trailing jamo stay additive because that matches how the terminals we target render them.\n\t5. Otherwise use East Asian Width of the cluster's first visible code point, and add widths for trailing spacing marks and Halfwidth/Fullwidth Forms within the same cluster (e.g., dakuten/handakuten/prolonged sound mark).\n*/\n\nconst segmenter = new Intl.Segmenter();\n\n// Whole-cluster zero-width\nconst zeroWidthClusterRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Nonspacing_Mark}|\\p{Enclosing_Mark}|\\p{Surrogate})+$/v;\n\n// Pick the base scalar if the cluster starts with Prepend/Format/Marks\nconst leadingNonPrintingRegex = /^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Nonspacing_Mark}\\p{Enclosing_Mark}\\p{Surrogate}]+/v;\nconst spacingMarkRegex = /\\p{Spacing_Mark}/v;\n\n// RGI emoji sequences\nconst rgiEmojiRegex = /^\\p{RGI_Emoji}$/v;\n\n// Detect minimally-qualified/unqualified emoji sequences (missing VS16 but still render as double-width)\nconst unqualifiedKeycapRegex = /^[\\d#*]\\u20E3$/;\nconst extendedPictographicRegex = /\\p{Extended_Pictographic}/gu;\n\nfunction isDoubleWidthNonRgiEmojiSequence(segment) {\n\t// Real emoji clusters are < 30 chars; guard against pathological input\n\tif (segment.length > 50) {\n\t\treturn false;\n\t}\n\n\tif (unqualifiedKeycapRegex.test(segment)) {\n\t\treturn true;\n\t}\n\n\t// ZWJ sequences with 2+ Extended_Pictographic\n\tif (segment.includes('\\u200D')) {\n\t\tconst pictographics = segment.match(extendedPictographicRegex);\n\t\treturn pictographics !== null && pictographics.length >= 2;\n\t}\n\n\treturn false;\n}\n\nfunction baseVisible(segment) {\n\treturn segment.replace(leadingNonPrintingRegex, '');\n}\n\nfunction isZeroWidthCluster(segment) {\n\treturn zeroWidthClusterRegex.test(segment);\n}\n\nfunction isHangulLeadingJamo(codePoint) {\n\treturn (codePoint >= 0x11_00 && codePoint <= 0x11_5F)\n\t\t|| (codePoint >= 0xA9_60 && codePoint <= 0xA9_7C);\n}\n\nfunction isHangulVowelJamo(codePoint) {\n\treturn (codePoint >= 0x11_60 && codePoint <= 0x11_A7)\n\t\t|| (codePoint >= 0xD7_B0 && codePoint <= 0xD7_C6);\n}\n\nfunction isHangulTrailingJamo(codePoint) {\n\treturn (codePoint >= 0x11_A8 && codePoint <= 0x11_FF)\n\t\t|| (codePoint >= 0xD7_CB && codePoint <= 0xD7_FB);\n}\n\nfunction isHangulJamo(codePoint) {\n\treturn isHangulLeadingJamo(codePoint)\n\t\t|| isHangulVowelJamo(codePoint)\n\t\t|| isHangulTrailingJamo(codePoint);\n}\n\nfunction hangulClusterWidth(visibleSegment, eastAsianWidthOptions) {\n\tconst codePoints = [];\n\n\tfor (const character of visibleSegment) {\n\t\tif (zeroWidthClusterRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tcodePoints.push(character.codePointAt(0));\n\t}\n\n\tif (codePoints.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tlet width = 0;\n\n\tfor (let index = 0; index < codePoints.length; index++) {\n\t\tconst codePoint = codePoints[index];\n\t\tif (!isHangulJamo(codePoint)) {\n\t\t\tif (width === 0) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Mixed cluster (e.g., L + precomposed syllable): use EAW for non-jamo remainder\n\t\t\tfor (let remaining = index; remaining < codePoints.length; remaining++) {\n\t\t\t\twidth += eastAsianWidth(codePoints[remaining], eastAsianWidthOptions);\n\t\t\t}\n\n\t\t\treturn width;\n\t\t}\n\n\t\t// Modern Hangul L+V(+T) shapes as one syllable block. Unmatched jamo stay additive:\n\t\t// U+1100 U+1100 U+1161 => U+1100 + (U+1100 U+1161) => 2 + 2.\n\t\tif (\n\t\t\tisHangulLeadingJamo(codePoint)\n\t\t\t&& isHangulVowelJamo(codePoints[index + 1])\n\t\t) {\n\t\t\twidth += 2;\n\t\t\tindex += isHangulTrailingJamo(codePoints[index + 2]) ? 2 : 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n\nfunction trailingWidth(visibleSegment, eastAsianWidthOptions) {\n\tlet extra = 0;\n\tlet first = true;\n\n\tfor (const character of visibleSegment) {\n\t\tif (first) {\n\t\t\tfirst = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\tspacingMarkRegex.test(character)\n\t\t\t|| (character >= '\\uFF00' && character <= '\\uFFEF')\n\t\t) {\n\t\t\textra += eastAsianWidth(character.codePointAt(0), eastAsianWidthOptions);\n\t\t}\n\t}\n\n\treturn extra;\n}\n\nexport default function stringWidth(input, options = {}) {\n\tif (typeof input !== 'string' || input.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tlet string = input;\n\n\t// Avoid calling stripAnsi when there are no ANSI escape sequences (ESC = 0x1B, CSI = 0x9B)\n\tif (!countAnsiEscapeCodes && (string.includes('\\u001B') || string.includes('\\u009B'))) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\t// Fast path: printable ASCII (0x20–0x7E) needs no segmenter, regex, or EAW lookup — width equals length.\n\tif (/^[\\u0020-\\u007E]*$/.test(string)) {\n\t\treturn string.length;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment} of segmenter.segment(string)) {\n\t\t// Zero-width / non-printing clusters\n\t\tif (isZeroWidthCluster(segment)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Emoji width logic\n\t\tif (rgiEmojiRegex.test(segment) || isDoubleWidthNonRgiEmojiSequence(segment)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst visibleSegment = baseVisible(segment);\n\t\tconst hangulWidth = hangulClusterWidth(visibleSegment, eastAsianWidthOptions);\n\t\tif (hangulWidth !== undefined) {\n\t\t\twidth += hangulWidth;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Everything else: EAW of the cluster’s first visible scalar\n\t\tconst codePoint = visibleSegment.codePointAt(0);\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\n\t\t// Add width for trailing spacing marks and Halfwidth/Fullwidth Forms (e.g., ゙, ゚, ー)\n\t\twidth += trailingWidth(visibleSegment, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n","import stringWidth from \"string-width\";\nimport { terminalWidth } from \"./format.js\";\nimport { theme } from \"./theme.js\";\n\nconst LEFT_GUTTER = \" \";\nconst COLUMN_GAP = \" \";\nconst ELLIPSIS = \"…\";\nconst MIN_COLUMN_WIDTH = 3;\nconst ESCAPE_CHARACTER = String.fromCharCode(27);\nconst ANSI_ESCAPE_AT_START = new RegExp(`^${ESCAPE_CHARACTER}\\\\[[0-9;]*m`);\nconst ANSI_RESET = `${ESCAPE_CHARACTER}[0m`;\nconst GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, {\n granularity: \"grapheme\",\n});\n\nfunction visibleWidth(value: string): number {\n return stringWidth(value);\n}\n\nfunction isNumericCell(value: string): boolean {\n const trimmed = value.trim();\n return trimmed.length > 0 && /^-?\\d+(?:\\.\\d+)?$/.test(trimmed);\n}\n\nfunction padCell(value: string, width: number, align: \"start\" | \"end\"): string {\n const padding = \" \".repeat(Math.max(0, width - visibleWidth(value)));\n return align === \"start\" ? padding + value : value + padding;\n}\n\nfunction truncateCell(value: string, width: number): string {\n if (visibleWidth(value) <= width) return value;\n if (width <= 1) return ELLIPSIS;\n\n const targetVisibleWidth = width - 1;\n let renderedWidth = 0;\n let cursor = 0;\n let truncated = \"\";\n let sawEscapeCode = false;\n\n while (cursor < value.length) {\n const escapeMatch = ANSI_ESCAPE_AT_START.exec(value.slice(cursor));\n if (escapeMatch) {\n truncated += escapeMatch[0];\n cursor += escapeMatch[0].length;\n sawEscapeCode = true;\n continue;\n }\n\n const remainder = value.slice(cursor);\n const nextGrapheme = GRAPHEME_SEGMENTER.segment(remainder)\n [Symbol.iterator]()\n .next();\n if (nextGrapheme.done) break;\n\n const grapheme = nextGrapheme.value.segment;\n const graphemeWidth = stringWidth(grapheme);\n if (renderedWidth + graphemeWidth > targetVisibleWidth) break;\n\n truncated += grapheme;\n renderedWidth += graphemeWidth;\n cursor += grapheme.length;\n }\n\n return sawEscapeCode\n ? `${truncated}${ELLIPSIS}${ANSI_RESET}`\n : `${truncated}${ELLIPSIS}`;\n}\n\nfunction fitColumnWidths(naturalWidths: number[], available: number): number[] {\n const widths = [...naturalWidths];\n let total = widths.reduce((sum, width) => sum + width, 0);\n while (total > available) {\n const widest = widths.indexOf(Math.max(...widths));\n if (widths[widest] <= MIN_COLUMN_WIDTH) break;\n widths[widest] -= 1;\n total -= 1;\n }\n return widths;\n}\n\nexport function renderTable(rows: string[][]): string {\n if (rows.length === 0) return \"\";\n\n const [header, ...body] = rows;\n const columnCount = header.length;\n\n const naturalWidths = Array.from({ length: columnCount }, (_, column) =>\n Math.max(...rows.map((row) => visibleWidth(row[column] ?? \"\"))),\n );\n const available =\n terminalWidth() -\n LEFT_GUTTER.length -\n COLUMN_GAP.length * (columnCount - 1);\n const columnWidths = fitColumnWidths(naturalWidths, available);\n\n const rightAligned = Array.from(\n { length: columnCount },\n (_, column) =>\n body.length > 0 && body.every((row) => isNumericCell(row[column] ?? \"\")),\n );\n\n const renderRow = (\n row: string[],\n paint: (cell: string) => string,\n ): string => {\n const cells = row.map((cell, column) => {\n const clipped = truncateCell(cell ?? \"\", columnWidths[column]);\n const padded = padCell(\n clipped,\n columnWidths[column],\n rightAligned[column] ? \"start\" : \"end\",\n );\n return paint(padded);\n });\n return (LEFT_GUTTER + cells.join(COLUMN_GAP)).replace(/\\s+$/, \"\");\n };\n\n const headerRule = columnWidths\n .map((width) => \"─\".repeat(width))\n .join(COLUMN_GAP);\n\n return [\n renderRow(header, (cell) => theme.dim(cell)),\n (LEFT_GUTTER + theme.dim(headerRule)).replace(/\\s+$/, \"\"),\n ...body.map((row) => renderRow(row, (cell) => cell)),\n ].join(\"\\n\");\n}\n","import { printable } from \"../core/untrusted-text.js\";\nimport { describeOverlap } from \"../inspect/duplication.js\";\nimport type {\n CapabilityStatusRow,\n ManagedResourceStatus,\n StatusReport,\n} from \"../inspect/status.js\";\nimport type { SharedToolStatus } from \"../plugins/shared-resource.js\";\nimport type { CapabilityState } from \"../plugins/types.js\";\nimport { box } from \"./box.js\";\nimport { badge, section } from \"./format.js\";\nimport { symbol } from \"./symbols.js\";\nimport { renderTable } from \"./table.js\";\nimport { theme } from \"./theme.js\";\n\nconst CAPABILITY_STATE_TONE: Record<\n CapabilityState,\n Parameters<typeof badge>[1]\n> = {\n \"present-managed\": \"ok\",\n \"present-adopted\": \"warn\",\n \"present-modified\": \"warn\",\n absent: \"neutral\",\n declined: \"neutral\",\n unknown: \"warn\",\n};\n\nconst CAPABILITY_STATE_LABEL: Record<CapabilityState, string> = {\n \"present-managed\": \"present · managed\",\n \"present-adopted\": \"present · adopted\",\n \"present-modified\": \"present · changed\",\n absent: \"absent\",\n declined: \"absent · declined\",\n unknown: \"unknown\",\n};\n\nfunction healthBadge(health: ManagedResourceStatus[\"health\"]): string {\n if (health === \"managed-current\") {\n return badge(\"current\", \"ok\");\n }\n if (health === \"managed-drifted\") {\n return badge(\"drifted\", \"warn\");\n }\n return badge(\"missing\", \"danger\");\n}\n\nfunction managedResourceRow(resource: ManagedResourceStatus): string[] {\n return [\n resource.target,\n resource.ownershipMode ?? \"\",\n healthBadge(resource.health),\n printable(resource.detail ?? \"\"),\n ];\n}\n\nfunction describeSharedToolHolder(\n holder: SharedToolStatus[\"holders\"][number],\n): string {\n const path = printable(holder.path);\n if (holder.missing) {\n return `${path} (missing — dropped on the next change)`;\n }\n return holder.thisRepository ? `${path} (this repository)` : path;\n}\n\nfunction describeSharedToolNote(tool: SharedToolStatus): string {\n if (tool.heldWithoutLedgerEntry) {\n return \"held by this repository but not in its ledger — run 'agemon' to repair\";\n }\n if (tool.origin === \"installed\") {\n return `installed by ${printable(tool.recordedBy ?? \"\")}`;\n }\n if (tool.origin === \"migrated\") {\n return `installed before agemon tracked shared tools (per ${printable(tool.recordedBy ?? \"\")}); 'agemon nuke --remove-shared ${tool.tool}' there, or '${tool.manualRemoveCommand}'`;\n }\n return `there before agemon tracked it; agemon never removes it ('${tool.manualRemoveCommand}')`;\n}\n\nfunction sharedToolLines(tool: SharedToolStatus): string[] {\n return [\n ` ${tool.tool} (${tool.origin}) — ${describeSharedToolNote(tool)}`,\n ` used by: ${tool.holders.map(describeSharedToolHolder).join(\", \") || \"nobody\"}`,\n ];\n}\n\nfunction capabilityRow(row: CapabilityStatusRow): string[] {\n const state = badge(\n CAPABILITY_STATE_LABEL[row.state],\n CAPABILITY_STATE_TONE[row.state],\n );\n const health =\n row.health === null\n ? \"\"\n : !row.health.ok\n ? badge(\"unhealthy\", \"danger\")\n : row.health.attention !== null\n ? badge(\"needs attention\", \"warn\")\n : badge(\"healthy\", \"ok\");\n const detail =\n row.health === null\n ? (row.detail ?? \"\")\n : !row.health.ok\n ? row.health.detail\n : (row.detail ?? \"\");\n return [row.capabilityId, state, health, printable(detail)];\n}\n\nexport function renderStatusReport(report: StatusReport): string {\n const lines: string[] = [];\n\n lines.push(section(\"Environment\").trimStart());\n if (report.interruptedApply !== null) {\n lines.push(\n box({\n title: `${symbol(\"warn\")} Interrupted apply`,\n body: `An earlier apply (plan ${report.interruptedApply.planId}, started ${report.interruptedApply.startedAt}) was interrupted — run 'agemon recover'.`,\n tone: \"warn\",\n }),\n );\n }\n lines.push(\n report.healthy\n ? box({\n title: `${symbol(\"ok\")} Environment healthy`,\n body: \"every managed resource matches agemon's ledger\",\n tone: \"ok\",\n })\n : box({\n title: `${symbol(\"warn\")} Environment needs attention`,\n body: \"see the flagged rows below\",\n tone: \"warn\",\n }),\n );\n\n lines.push(section(\"Managed resources\"));\n if (report.managedResources.length === 0) {\n lines.push(\" none recorded in the ledger yet\");\n } else {\n lines.push(\n renderTable([\n [\"RESOURCE\", \"OWNERSHIP\", \"HEALTH\", \"DETAIL\"],\n ...report.managedResources.map(managedResourceRow),\n ]),\n );\n }\n\n lines.push(section(\"Capabilities\"));\n if (report.capabilities.length === 0) {\n lines.push(\" no capability reports state in this repo\");\n } else {\n lines.push(\n renderTable([\n [\"CAPABILITY\", \"STATE\", \"HEALTH\", \"DETAIL\"],\n ...report.capabilities.map(capabilityRow),\n ]),\n );\n const attentionNotes = new Set(\n report.capabilities.flatMap((row) =>\n row.health?.attention\n ? [` ${row.capabilityId}: ${printable(row.health.attention)}`]\n : [],\n ),\n );\n lines.push(...attentionNotes);\n }\n\n lines.push(section(\"Shared tools\"));\n if (report.sharedResources.length === 0) {\n lines.push(\" none recorded on this machine\");\n } else {\n lines.push(...report.sharedResources.flatMap(sharedToolLines));\n }\n\n lines.push(section(\"Duplication\"));\n if (report.duplication.length === 0) {\n lines.push(\" no overlapping instruction content detected\");\n } else {\n lines.push(\n ...report.duplication.map((overlap) => ` ${describeOverlap(overlap)}`),\n );\n }\n\n lines.push(section(\"Agents\"));\n lines.push(\n ` ${report.agentsSummary.configured}/${report.agentsSummary.total} configured, ${report.agentsSummary.installed}/${report.agentsSummary.total} installed`,\n );\n\n if (report.configError !== null) {\n lines.push(section(\"Configuration\"));\n lines.push(` ${theme.warn(`${symbol(\"warn\")} ${report.configError}`)}`);\n }\n\n lines.push(section(\"Workspace isolation\"));\n if (report.trackingCheckError !== null) {\n lines.push(\n ` ${theme.warn(`${symbol(\"warn\")} ${report.trackingCheckError}`)}`,\n );\n } else if (report.trackedAgemonPaths.length === 0) {\n lines.push(\" .agemon/ is not tracked by git\");\n } else {\n lines.push(\n ` ${theme.warn(`${symbol(\"warn\")} ${report.trackedAgemonPaths.length} .agemon/ path(s) are tracked by git`)}`,\n ` ${symbol(\"arrow\")} git rm -r --cached .agemon`,\n );\n }\n if (report.unconfirmedLedgerEntries > 0) {\n const entries =\n report.unconfirmedLedgerEntries === 1\n ? \"1 ledger entry was\"\n : `${report.unconfirmedLedgerEntries} ledger entries were`;\n lines.push(\n ` ${theme.warn(`${symbol(\"warn\")} ${entries} not written by agemon on this machine; agemon won't remove, replace or repair the skills, subagents, shared tools, daemon units or code graph they name.`)}`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n","import type { Context } from \"../core/context.js\";\nimport type { AgemonPlugin, CapabilityStateRow } from \"../plugins/types.js\";\n\nexport async function collectCapabilityStates(\n ctx: Context,\n plugins: AgemonPlugin[],\n): Promise<CapabilityStateRow[]> {\n const rows: CapabilityStateRow[] = [];\n for (const plugin of plugins) {\n if (!plugin.describeState) {\n continue;\n }\n rows.push(...(await plugin.describeState(ctx)));\n }\n\n return rows.sort(\n (a, b) =>\n a.capabilityId.localeCompare(b.capabilityId) ||\n a.resourceId.localeCompare(b.resourceId),\n );\n}\n","import { fingerprintContent } from \"../core/fingerprint.js\";\nimport type { LedgerEntry } from \"../core/state-manifest.js\";\nimport type {\n CopilotInstructionResource,\n DiscoveryResult,\n RuleFileResource,\n StructuredConfigResource,\n} from \"./discover.js\";\n\nexport type ResourceState =\n | \"absent\"\n | \"equivalent\"\n | \"managed-current\"\n | \"managed-drifted\"\n | \"mergeable\"\n | \"conflict\"\n | \"unmanaged\"\n | \"invalid\";\n\nexport interface ClassifiedResource {\n resourceId: string;\n path: string;\n kind: string;\n state: ResourceState;\n detail: string | null;\n}\n\nconst CANONICAL_RULE_FILE = \"AGENTS.md\";\nconst POINTER_REFERENCE_PATTERN = /AGENTS\\.md/i;\nconst POINTER_MAX_NORMALIZED_LENGTH = 800;\n\nexport const USER_DRIFT_DETAIL = \"edited since agemon wrote it\";\nexport const TEMPLATE_DRIFT_DETAIL =\n \"agemon template updated — re-run to refresh\";\n\nexport type CurrentDesiredRevisionResolver = (\n resourceId: string,\n) => string | null;\n\nfunction ledgerEntryForResource(\n entries: LedgerEntry[],\n resourceId: string,\n): LedgerEntry | undefined {\n return entries.find((entry) => entry.resourceId === resourceId);\n}\n\nfunction classifyManaged(\n entry: LedgerEntry,\n currentContents: string,\n currentDesiredRevision: CurrentDesiredRevisionResolver | undefined,\n): { state: ResourceState; detail: string | null } {\n const fingerprintMatches =\n entry.fingerprintAfter !== null &&\n entry.fingerprintAfter === fingerprintContent(currentContents);\n if (!fingerprintMatches) {\n return { state: \"managed-drifted\", detail: USER_DRIFT_DETAIL };\n }\n\n if (entry.desiredRevision !== null && currentDesiredRevision !== undefined) {\n const current = currentDesiredRevision(entry.resourceId ?? \"\");\n if (current !== null && current !== entry.desiredRevision) {\n return { state: \"managed-drifted\", detail: TEMPLATE_DRIFT_DETAIL };\n }\n }\n\n return { state: \"managed-current\", detail: entry.ownershipMode };\n}\n\nfunction looksLikePointerFile(contents: string): boolean {\n if (!POINTER_REFERENCE_PATTERN.test(contents)) {\n return false;\n }\n return (\n contents.replace(/\\s+/g, \" \").trim().length <= POINTER_MAX_NORMALIZED_LENGTH\n );\n}\n\nfunction classifyRuleFile(\n resource: RuleFileResource,\n ledgerEntries: LedgerEntry[],\n currentDesiredRevision: CurrentDesiredRevisionResolver | undefined,\n): ClassifiedResource {\n const resourceId = `rule-file:${resource.path}`;\n\n if (!resource.exists || resource.contents === null) {\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"absent\",\n detail: null,\n };\n }\n\n const entry = ledgerEntryForResource(ledgerEntries, resourceId);\n if (entry !== undefined) {\n const { state, detail } = classifyManaged(\n entry,\n resource.contents,\n currentDesiredRevision,\n );\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state,\n detail,\n };\n }\n\n if (\n resource.path !== CANONICAL_RULE_FILE &&\n looksLikePointerFile(resource.contents)\n ) {\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"equivalent\",\n detail: `points to ${CANONICAL_RULE_FILE}`,\n };\n }\n\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"unmanaged\",\n detail: null,\n };\n}\n\nfunction classifyStructuredConfig(\n resource: StructuredConfigResource,\n): ClassifiedResource {\n const resourceId = `structured-config:${resource.path}`;\n\n if (resource.denylisted) {\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"unmanaged\",\n detail: \"excluded: private local config\",\n };\n }\n\n if (!resource.exists) {\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"absent\",\n detail: null,\n };\n }\n\n if (resource.parseError !== null) {\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"invalid\",\n detail: resource.parseError,\n };\n }\n\n return {\n resourceId,\n path: resource.path,\n kind: resource.kind,\n state: \"unmanaged\",\n detail: null,\n };\n}\n\nfunction classifyCopilotInstruction(\n resource: CopilotInstructionResource,\n): ClassifiedResource {\n return {\n resourceId: `copilot-instruction:${resource.path}`,\n path: resource.path,\n kind: resource.kind,\n state: \"unmanaged\",\n detail: null,\n };\n}\n\nexport function classifyResources(\n discovery: DiscoveryResult,\n ledgerEntries: LedgerEntry[],\n currentDesiredRevision?: CurrentDesiredRevisionResolver,\n): ClassifiedResource[] {\n return [\n ...discovery.ruleFiles.map((resource) =>\n classifyRuleFile(resource, ledgerEntries, currentDesiredRevision),\n ),\n ...discovery.structuredConfigs.map(classifyStructuredConfig),\n ...discovery.copilotInstructions.map(classifyCopilotInstruction),\n ];\n}\n","import { detectAgents } from \"../adapters/detect.js\";\nimport { readJournals } from \"../core/apply-journal.js\";\nimport type { Context } from \"../core/context.js\";\nimport { RefusedFileError, readRegularFileIfExists } from \"../core/files.js\";\nimport { fingerprintContent } from \"../core/fingerprint.js\";\nimport { resolveInsideRepo } from \"../core/repo-paths.js\";\nimport type { LedgerEntry } from \"../core/state-manifest.js\";\nimport { printable } from \"../core/untrusted-text.js\";\nimport { resolveCurrentDesiredRevision } from \"../plugins/desired-revision.js\";\nimport {\n describeSharedTools,\n type SharedToolStatus,\n} from \"../plugins/shared-resource.js\";\nimport type { AgemonPlugin, CapabilityStateRow } from \"../plugins/types.js\";\nimport { renderStatusReport } from \"../ui/status-view.js\";\nimport { collectCapabilityStates } from \"./capabilities.js\";\nimport { TEMPLATE_DRIFT_DETAIL, USER_DRIFT_DETAIL } from \"./classify.js\";\nimport { discoverRepository, ROOT_RULE_FILES } from \"./discover.js\";\nimport { detectDuplication, type OverlapFinding } from \"./duplication.js\";\n\nconst RULE_FILE_RESOURCE_PREFIX = \"rule-file:\";\nconst MANAGED_RULE_FILE_TARGETS: ReadonlySet<string> = new Set(ROOT_RULE_FILES);\n\nexport type ManagedResourceHealth =\n | \"managed-current\"\n | \"managed-drifted\"\n | \"missing\";\n\nexport interface ManagedResourceStatus {\n resourceId: string;\n target: string;\n ownershipMode: string | null;\n health: ManagedResourceHealth;\n detail: string | null;\n}\n\nexport interface CapabilityHealth {\n ok: boolean;\n detail: string;\n attention: string | null;\n}\n\nexport interface CapabilityStatusRow extends CapabilityStateRow {\n health: CapabilityHealth | null;\n}\n\nexport interface AgentsSummary {\n total: number;\n configured: number;\n installed: number;\n}\n\nexport interface InterruptedApplySummary {\n planId: string;\n startedAt: string;\n}\n\nexport interface StatusReport {\n managedResources: ManagedResourceStatus[];\n capabilities: CapabilityStatusRow[];\n sharedResources: SharedToolStatus[];\n duplication: OverlapFinding[];\n trackedAgemonPaths: string[];\n trackingCheckError: string | null;\n unconfirmedLedgerEntries: number;\n configError: string | null;\n interruptedApply: InterruptedApplySummary | null;\n agentsSummary: AgentsSummary;\n healthy: boolean;\n hasAgemonState: boolean;\n}\n\nasync function findInterruptedApply(\n ctx: Context,\n): Promise<InterruptedApplySummary | null> {\n const [interrupted] = await readJournals(ctx.cwd);\n return interrupted\n ? {\n planId: printable(interrupted.journal.planId),\n startedAt: printable(interrupted.journal.startedAt),\n }\n : null;\n}\n\nfunction isFileBackedRuleEntry(entry: LedgerEntry): entry is LedgerEntry & {\n resourceId: string;\n fingerprintAfter: string;\n} {\n return (\n entry.fingerprintAfter !== null &&\n entry.resourceId?.startsWith(RULE_FILE_RESOURCE_PREFIX) === true\n );\n}\n\ntype ManagedTargetRead =\n | { contents: string | null; refused: false }\n | { contents: null; refused: true };\n\nasync function readManagedTarget(\n ctx: Context,\n target: string,\n): Promise<ManagedTargetRead> {\n try {\n return {\n contents: await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, target),\n ),\n refused: false,\n };\n } catch (error) {\n if (!(error instanceof RefusedFileError)) {\n throw error;\n }\n return { contents: null, refused: true };\n }\n}\n\nexport async function checkManagedResources(\n ctx: Context,\n plugins: AgemonPlugin[] = [],\n): Promise<ManagedResourceStatus[]> {\n const seenResourceIds = new Set<string>();\n const readsByTarget = new Map<string, Promise<ManagedTargetRead>>();\n const results: ManagedResourceStatus[] = [];\n\n for (const entry of ctx.manifest.getActions()) {\n if (\n !isFileBackedRuleEntry(entry) ||\n seenResourceIds.has(entry.resourceId)\n ) {\n continue;\n }\n seenResourceIds.add(entry.resourceId);\n const displayTarget = printable(entry.target);\n const reportDrift = (detail: string) =>\n results.push({\n resourceId: entry.resourceId,\n target: displayTarget,\n ownershipMode: entry.ownershipMode,\n health: \"managed-drifted\",\n detail,\n });\n\n if (!MANAGED_RULE_FILE_TARGETS.has(entry.target)) {\n reportDrift(\n `ignoring ledger entry for ${displayTarget}: master-prompt does not manage that file`,\n );\n continue;\n }\n\n let pendingRead = readsByTarget.get(entry.target);\n if (pendingRead === undefined) {\n pendingRead = readManagedTarget(ctx, entry.target);\n readsByTarget.set(entry.target, pendingRead);\n }\n const targetRead = await pendingRead;\n if (targetRead.refused) {\n reportDrift(USER_DRIFT_DETAIL);\n continue;\n }\n\n const { contents } = targetRead;\n let health: ManagedResourceHealth;\n let detail: string | null = null;\n if (contents === null) {\n health = \"missing\";\n } else if (fingerprintContent(contents) !== entry.fingerprintAfter) {\n health = \"managed-drifted\";\n detail = USER_DRIFT_DETAIL;\n } else if (entry.desiredRevision !== null) {\n const currentRevision = resolveCurrentDesiredRevision(\n plugins,\n ctx,\n entry.resourceId,\n );\n if (\n currentRevision !== null &&\n currentRevision !== entry.desiredRevision\n ) {\n health = \"managed-drifted\";\n detail = TEMPLATE_DRIFT_DETAIL;\n } else {\n health = \"managed-current\";\n }\n } else {\n health = \"managed-current\";\n }\n\n results.push({\n resourceId: entry.resourceId,\n target: displayTarget,\n ownershipMode: entry.ownershipMode,\n health,\n detail,\n });\n }\n\n return results;\n}\n\nexport async function verifyManagedState(\n ctx: Context,\n plugins: AgemonPlugin[] = [],\n): Promise<string[]> {\n const problems: string[] = [];\n\n for (const managed of await checkManagedResources(ctx, plugins)) {\n if (managed.health === \"missing\") {\n problems.push(\n `${managed.target} is recorded in the ledger but missing on disk`,\n );\n } else if (managed.detail === TEMPLATE_DRIFT_DETAIL) {\n problems.push(\n `${managed.target} is behind agemon's current template; re-run to refresh`,\n );\n } else if (managed.detail === USER_DRIFT_DETAIL) {\n problems.push(\n `${managed.target} no longer matches its ledger fingerprint`,\n );\n } else if (managed.detail !== null) {\n problems.push(managed.detail);\n }\n }\n\n const discovery = await discoverRepository(ctx);\n const overlaps = detectDuplication(\n discovery.ruleFiles.map((file) => ({\n path: file.path,\n contents: file.contents,\n })),\n ).overlaps;\n for (const overlap of overlaps) {\n problems.push(\n `duplicate guidance across managed files: ${overlap.left} ~ ${overlap.right}`,\n );\n }\n\n if (discovery.isolation.trackedAgemonPaths.length > 0) {\n problems.push(\n `.agemon/ is tracked by git (${discovery.isolation.trackedAgemonPaths.length} path(s)); run 'git rm -r --cached .agemon'`,\n );\n }\n\n return problems;\n}\n\nexport interface StatusOptions {\n configError?: string | null;\n}\n\nexport async function buildStatusReport(\n ctx: Context,\n plugins: AgemonPlugin[],\n options: StatusOptions = {},\n): Promise<StatusReport> {\n const configError = options.configError ?? null;\n const managedResources = await checkManagedResources(ctx, plugins);\n\n const discovery = await discoverRepository(ctx);\n const duplication = detectDuplication(\n discovery.ruleFiles.map((file) => ({\n path: file.path,\n contents: file.contents,\n })),\n ).overlaps;\n\n const capabilities = await buildCapabilityStatusRows(ctx, plugins);\n const sharedResources = await describeSharedTools(ctx, plugins);\n\n const agents = await detectAgents(ctx, discovery);\n const agentsSummary: AgentsSummary = {\n total: agents.length,\n configured: agents.filter((row) => row.configured).length,\n installed: agents.filter((row) => row.installation.level !== \"configured\")\n .length,\n };\n\n const trackedAgemonPaths = discovery.isolation.trackedAgemonPaths;\n const interruptedApply = await findInterruptedApply(ctx);\n const healthy =\n managedResources.every(\n (resource) => resource.health === \"managed-current\",\n ) &&\n duplication.length === 0 &&\n capabilities.every(\n (row) =>\n row.health === null || (row.health.ok && row.health.attention === null),\n ) &&\n trackedAgemonPaths.length === 0 &&\n interruptedApply === null &&\n configError === null;\n\n return {\n managedResources,\n capabilities,\n sharedResources,\n duplication,\n trackedAgemonPaths,\n trackingCheckError: discovery.isolation.trackingCheckError,\n unconfirmedLedgerEntries:\n ctx.manifest.getActions().length -\n ctx.manifest.getConfirmedActions().length,\n configError,\n interruptedApply,\n agentsSummary,\n healthy,\n hasAgemonState: ctx.manifest.hasActions() || interruptedApply !== null,\n };\n}\n\nasync function buildCapabilityStatusRows(\n ctx: Context,\n plugins: AgemonPlugin[],\n): Promise<CapabilityStatusRow[]> {\n const rows = await collectCapabilityStates(ctx, plugins);\n const recordedCapabilityIds = new Set(\n ctx.manifest.getActions().map((action) => action.plugin),\n );\n\n const healthByCapability = new Map<string, CapabilityHealth | null>();\n const resolveHealth = async (\n capabilityId: string,\n ): Promise<CapabilityHealth | null> => {\n const cached = healthByCapability.get(capabilityId);\n if (cached !== undefined) {\n return cached;\n }\n\n let health: CapabilityHealth | null = null;\n const plugin = plugins.find((entry) => entry.id === capabilityId);\n if (plugin && recordedCapabilityIds.has(capabilityId)) {\n const verification = await plugin.verify(ctx);\n health = {\n ok: verification.ok,\n detail:\n verification.detail ?? (verification.ok ? \"healthy\" : \"unhealthy\"),\n attention: verification.attention ?? null,\n };\n }\n healthByCapability.set(capabilityId, health);\n return health;\n };\n\n const result: CapabilityStatusRow[] = [];\n for (const row of rows) {\n result.push({ ...row, health: await resolveHealth(row.capabilityId) });\n }\n return result;\n}\n\nexport async function runStatus(\n ctx: Context,\n plugins: AgemonPlugin[],\n options: StatusOptions = {},\n): Promise<StatusReport> {\n const report = await buildStatusReport(ctx, plugins, options);\n ctx.log.log(renderStatusReport(report));\n return report;\n}\n","import { opendir, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport {\n immutableBackupCandidates,\n readFirstExistingBackup,\n replaceStaleBackup,\n resolveImmutableBackupPath,\n} from \"../../core/backups.js\";\nimport { AGENT_FILE_RESOURCE_PREFIX } from \"../../core/consent.js\";\nimport type { Context } from \"../../core/context.js\";\nimport {\n MAX_READ_FILE_LABEL,\n RefusedFileError,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"../../core/files.js\";\nimport { fingerprintContent } from \"../../core/fingerprint.js\";\nimport { revertManagedFile } from \"../../core/managed-file-revert.js\";\nimport {\n ensureRepoDirectory,\n readRegularFilePrefix,\n resolveInsideRepo,\n resolveRepoDirectory,\n} from \"../../core/repo-paths.js\";\nimport type { LedgerEntry } from \"../../core/state-manifest.js\";\nimport { renderUnifiedDiff } from \"../../core/text-diff.js\";\nimport { isSafeIdentifier, printable } from \"../../core/untrusted-text.js\";\nimport { recordCreatedDirectories } from \"../../core/workspace-footprint.js\";\nimport { describeOperation } from \"../proposed-operation.js\";\nimport {\n type AgentDefinition,\n RETIRED_AGENT_NAMES,\n SKILL_GROUPS,\n type SkillGroup,\n} from \"../skills/catalog.js\";\nimport {\n builtInGroupIdFromResource,\n recordedBuiltInGroupIds,\n SKILLS_PLUGIN_ID,\n} from \"../skills/ledger-view.js\";\nimport type {\n AgemonPlugin,\n CapabilityState,\n CapabilityStateRow,\n PluginApplyReport,\n PluginPresence,\n PluginVerificationResult,\n ProposedOperation,\n ProposedOperationAction,\n SkippedPluginOperation,\n StagedFile,\n} from \"../types.js\";\n\nconst PLUGIN_ID = \"agents\";\nconst AGENTS_DIRECTORY = \".claude/agents\";\nconst AGENT_TARGET_PATTERN =\n /^\\.claude\\/agents\\/([a-z0-9]+(?:-[a-z0-9]+)*)\\.md$/u;\nconst ACTION_TYPE_MANAGED_AGENT_FILE = \"managed-agent-file\";\nconst ACTION_TYPE_ADOPTED_AGENT_FILE = \"adopted-agent-file\";\nconst AGENT_FILE_ACTIONS: readonly ProposedOperationAction[] = [\n \"create\",\n \"replace\",\n \"adopt\",\n \"conflict\",\n];\nconst MAX_AGENT_DIRECTORY_ENTRIES = 256;\nconst AGENT_FRONTMATTER_PREFIX_BYTES = 4096;\nconst AGENT_FRONTMATTER_MAX_LINES = 64;\nconst BYTE_ORDER_MARK = \"\";\nconst FRONTMATTER_FENCE = \"---\";\nconst NAME_KEY = \"name\";\nconst UPDATE_AVAILABLE_DETAIL =\n \"agemon has a newer version; run agemon to update it\";\nconst CLAIM_SUFFIX = \" (ledger entry not written by agemon on this machine)\";\n\ninterface CatalogAgent {\n group: SkillGroup;\n agent: AgentDefinition;\n}\n\ntype AgentFileState =\n | { kind: \"not-a-regular-file\" }\n | { kind: \"readable\"; contents: string | null };\n\nfunction catalogAgents(): CatalogAgent[] {\n return SKILL_GROUPS.flatMap((group) =>\n (group.agents ?? []).map((agent) => ({ group, agent })),\n );\n}\n\nfunction agentTarget(name: string): string {\n return `${AGENTS_DIRECTORY}/${name}.md`;\n}\n\nfunction agentResourceId(name: string): string {\n return `${AGENT_FILE_RESOURCE_PREFIX}${name}`;\n}\n\nfunction catalogAgentForTarget(target: string): CatalogAgent | undefined {\n const name = AGENT_TARGET_PATTERN.exec(target)?.[1];\n return catalogAgents().find((entry) => entry.agent.name === name);\n}\n\nfunction retiredAgentNameForTarget(target: string): string | undefined {\n const name = AGENT_TARGET_PATTERN.exec(target)?.[1];\n return RETIRED_AGENT_NAMES.find((retiredName) => retiredName === name);\n}\n\nfunction revertableAgentName(target: string): string | undefined {\n return (\n catalogAgentForTarget(target)?.agent.name ??\n retiredAgentNameForTarget(target)\n );\n}\n\nexport async function renderAgentFile(agent: AgentDefinition): Promise<string> {\n const frontmatter = [\n `name: ${agent.name}`,\n `description: ${JSON.stringify(agent.description)}`,\n `tools: ${agent.tools.join(\", \")}`,\n ].join(\"\\n\");\n const brief = await readFile(agent.briefPath, \"utf8\");\n return `---\\n${frontmatter}\\n---\\n\\n${brief}`;\n}\n\nfunction pluginActions(ctx: Context): LedgerEntry[] {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction confirmedPluginActions(ctx: Context): LedgerEntry[] {\n return pluginActions(ctx).filter((action) =>\n ctx.manifest.isConfirmed(action),\n );\n}\n\nfunction ledgerEntryForTarget(\n ctx: Context,\n target: string,\n): LedgerEntry | undefined {\n return confirmedPluginActions(ctx).find((action) => action.target === target);\n}\n\nfunction assertAgentsPerforms(operation: ProposedOperation): CatalogAgent {\n const entry = catalogAgentForTarget(operation.targetPath);\n if (\n entry === undefined ||\n operation.resourceId !== agentResourceId(entry.agent.name) ||\n operation.targetPath !== agentTarget(entry.agent.name) ||\n !AGENT_FILE_ACTIONS.includes(operation.action)\n ) {\n throw new Error(\n `Plan operation ${printable(operation.id)} is not something the agents capability does (${operation.action} ${printable(operation.targetPath)}).`,\n );\n }\n return entry;\n}\n\nfunction plannedGroupIds(\n plannedSoFar: readonly ProposedOperation[],\n): Set<string> {\n const groupIds = new Set<string>();\n for (const operation of plannedSoFar) {\n const groupId =\n operation.capabilityId === SKILLS_PLUGIN_ID &&\n operation.action === \"install-package\"\n ? builtInGroupIdFromResource(operation.resourceId)\n : null;\n if (groupId !== null) {\n groupIds.add(groupId);\n }\n }\n return groupIds;\n}\n\nfunction desiredAgents(\n ctx: Context,\n plannedSoFar: readonly ProposedOperation[],\n): CatalogAgent[] {\n const groupIds = new Set([\n ...plannedGroupIds(plannedSoFar),\n ...recordedBuiltInGroupIds(ctx),\n ]);\n return catalogAgents().filter(({ group }) => groupIds.has(group.id));\n}\n\nasync function readAgentFile(\n ctx: Context,\n target: string,\n): Promise<AgentFileState> {\n try {\n return {\n kind: \"readable\",\n contents: await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, target),\n ),\n };\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return { kind: \"not-a-regular-file\" };\n }\n throw error;\n }\n}\n\nfunction agentOperation(\n name: string,\n action: ProposedOperationAction,\n expectedFingerprint: string | null,\n preview: ProposedOperation[\"preview\"],\n): ProposedOperation {\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: agentResourceId(name),\n targetPath: agentTarget(name),\n action,\n riskClass: \"writes-config\",\n requiresConsent: true,\n expectedFingerprint,\n preview,\n });\n}\n\nasync function planAgent(\n ctx: Context,\n { agent }: CatalogAgent,\n): Promise<ProposedOperation | null> {\n const target = agentTarget(agent.name);\n const file = await readAgentFile(ctx, target);\n if (file.kind === \"not-a-regular-file\") {\n return agentOperation(agent.name, \"conflict\", null, {\n kind: \"note\",\n text: `${target} is a symlink, special file, larger than ${MAX_READ_FILE_LABEL}, or under a symlinked directory; agemon leaves it alone.`,\n });\n }\n\n const desired = await renderAgentFile(agent);\n const { contents } = file;\n const diffPreview = {\n kind: \"diff\" as const,\n text: renderUnifiedDiff(contents ?? \"\", desired, target),\n };\n if (contents === null) {\n return agentOperation(agent.name, \"create\", null, diffPreview);\n }\n\n const fingerprint = fingerprintContent(contents);\n const recorded = ledgerEntryForTarget(ctx, target);\n if (contents === desired) {\n return recorded\n ? null\n : agentOperation(agent.name, \"adopt\", fingerprint, {\n kind: \"note\",\n text: `${target} already matches agemon's ${agent.name}; record the adoption in the ledger and write nothing.`,\n });\n }\n const untouchedSinceRecorded = recorded?.fingerprintAfter === fingerprint;\n return agentOperation(\n agent.name,\n untouchedSinceRecorded ? \"replace\" : \"conflict\",\n fingerprint,\n diffPreview,\n );\n}\n\nasync function planAgents(\n ctx: Context,\n plannedSoFar: readonly ProposedOperation[] = [],\n): Promise<ProposedOperation[]> {\n const operations: ProposedOperation[] = [];\n for (const entry of desiredAgents(ctx, plannedSoFar)) {\n const operation = await planAgent(ctx, entry);\n if (operation) {\n operations.push(operation);\n }\n }\n return operations;\n}\n\nasync function materializeAgents(\n _ctx: Context,\n operations: ProposedOperation[],\n): Promise<StagedFile[]> {\n const staged: StagedFile[] = [];\n for (const operation of operations) {\n const { agent } = assertAgentsPerforms(operation);\n if (operation.action === \"create\" || operation.action === \"replace\") {\n staged.push({\n targetPath: operation.targetPath,\n contents: await renderAgentFile(agent),\n kind: \"markdown\",\n });\n }\n }\n return staged;\n}\n\nasync function recordAdoption(\n ctx: Context,\n target: string,\n name: string,\n contents: string | null,\n): Promise<void> {\n const fingerprint = contents === null ? null : fingerprintContent(contents);\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_ADOPTED_AGENT_FILE,\n target,\n preExisting: true,\n resourceId: agentResourceId(name),\n ownershipMode: \"recorded-key\",\n fingerprintBefore: fingerprint,\n fingerprintAfter: fingerprint,\n backup: null,\n });\n}\n\nasync function differentEarlierOriginalPath(\n ctx: Context,\n name: string,\n contentsBefore: string,\n): Promise<string | null> {\n const earlier = await readFirstExistingBackup(ctx.cwd, [\n resolveImmutableBackupPath(ctx.cwd, agentResourceId(name)),\n ]);\n return earlier !== null && earlier.contents !== contentsBefore\n ? earlier.path\n : null;\n}\n\nasync function writeAgentFile(\n ctx: Context,\n operation: ProposedOperation,\n name: string,\n contentsAfter: string,\n): Promise<{ skipReason: string } | null> {\n const target = operation.targetPath;\n await recordCreatedDirectories(\n ctx,\n await ensureRepoDirectory(ctx.cwd, AGENTS_DIRECTORY),\n );\n const targetPath = await resolveInsideRepo(ctx.cwd, target);\n const contentsBefore = await readRegularFileIfExists(targetPath);\n const recorded = ledgerEntryForTarget(ctx, target);\n const keepsRecordedOriginal =\n recorded?.type === ACTION_TYPE_MANAGED_AGENT_FILE &&\n (contentsBefore === null ||\n fingerprintContent(contentsBefore) === recorded.fingerprintAfter);\n\n if (keepsRecordedOriginal) {\n await writeFileAtomic(targetPath, contentsAfter);\n await ctx.manifest.updateResourceEntry(agentResourceId(name), {\n fingerprintAfter: fingerprintContent(contentsAfter),\n });\n return null;\n }\n\n const earlierOriginalPath =\n contentsBefore === null\n ? null\n : await differentEarlierOriginalPath(ctx, name, contentsBefore);\n if (earlierOriginalPath !== null) {\n return {\n skipReason: `agemon already keeps an earlier original of it at ${relative(ctx.cwd, earlierOriginalPath)}; keep your version, or delete ${target} and re-run agemon`,\n };\n }\n\n const backup =\n contentsBefore === null\n ? null\n : await replaceStaleBackup(\n ctx.cwd,\n agentResourceId(name),\n contentsBefore,\n );\n await writeFileAtomic(targetPath, contentsAfter);\n if (recorded) {\n await ctx.manifest.removeActionIds([recorded.id]);\n }\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_MANAGED_AGENT_FILE,\n target,\n preExisting: contentsBefore !== null,\n resourceId: agentResourceId(name),\n ownershipMode: \"created\",\n fingerprintBefore:\n contentsBefore === null ? null : fingerprintContent(contentsBefore),\n fingerprintAfter: fingerprintContent(contentsAfter),\n backup:\n backup === null ? null : { path: backup.path, checksum: backup.checksum },\n });\n return null;\n}\n\nasync function applyAgents(\n ctx: Context,\n operations: ProposedOperation[],\n staged?: StagedFile[],\n): Promise<PluginApplyReport> {\n const stagedContentsByPath = new Map(\n (staged ?? []).map((file) => [file.targetPath, file.contents] as const),\n );\n const installedGroupIds = recordedBuiltInGroupIds(ctx);\n const skipped: SkippedPluginOperation[] = [];\n for (const operation of operations) {\n const { group, agent } = assertAgentsPerforms(operation);\n if (operation.action === \"conflict\") {\n continue;\n }\n if (!installedGroupIds.has(group.id)) {\n skipped.push({\n operationId: operation.id,\n reason: `its skill group ${group.id} is not installed; approve the skill group install to get it`,\n });\n continue;\n }\n if (operation.action === \"adopt\") {\n if (!ledgerEntryForTarget(ctx, operation.targetPath)) {\n await recordAdoption(\n ctx,\n operation.targetPath,\n agent.name,\n await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, operation.targetPath),\n ),\n );\n }\n continue;\n }\n const refusal = await writeAgentFile(\n ctx,\n operation,\n agent.name,\n stagedContentsByPath.get(operation.targetPath) ??\n (await renderAgentFile(agent)),\n );\n if (refusal !== null) {\n skipped.push({ operationId: operation.id, reason: refusal.skipReason });\n }\n }\n return { skipped };\n}\n\nasync function detectAgents(ctx: Context): Promise<PluginPresence> {\n const operations = await planAgents(ctx);\n return {\n present: operations.every((operation) => operation.action === \"conflict\"),\n preExisting: pluginActions(ctx).some(\n (action) => action.type === ACTION_TYPE_ADOPTED_AGENT_FILE,\n ),\n };\n}\n\ninterface AgentFileStatus {\n state: CapabilityState;\n detail: string;\n updateAvailable: boolean;\n}\n\nasync function agentFileStatus(\n ctx: Context,\n { agent }: CatalogAgent,\n): Promise<AgentFileStatus> {\n const target = agentTarget(agent.name);\n const file = await readAgentFile(ctx, target);\n const status = (\n state: CapabilityState,\n detail: string,\n updateAvailable = false,\n ): AgentFileStatus => ({ state, detail, updateAvailable });\n if (file.kind === \"not-a-regular-file\") {\n return status(\"unknown\", \"not a regular file; agemon leaves it alone\");\n }\n if (file.contents === null) {\n return status(\"absent\", \"run agemon to create it\");\n }\n\n const recorded = ledgerEntryForTarget(ctx, target);\n const claimSuffix =\n recorded === undefined &&\n pluginActions(ctx).some((action) => action.target === target)\n ? CLAIM_SUFFIX\n : \"\";\n const recordedState: CapabilityState =\n recorded?.type === ACTION_TYPE_MANAGED_AGENT_FILE\n ? \"present-managed\"\n : \"present-adopted\";\n if (file.contents === (await renderAgentFile(agent))) {\n return recordedState === \"present-managed\"\n ? status(\"present-managed\", target)\n : status(\n \"present-adopted\",\n `identical to agemon's version${claimSuffix}`,\n );\n }\n if (\n recorded !== undefined &&\n recorded.fingerprintAfter === fingerprintContent(file.contents)\n ) {\n return status(recordedState, UPDATE_AVAILABLE_DETAIL, true);\n }\n return recorded === undefined\n ? status(\n \"present-modified\",\n `differs from agemon's version; agemon keeps yours (conflict)${claimSuffix}`,\n )\n : status(\n \"present-modified\",\n \"changed since agemon wrote it; agemon keeps your version (conflict)\",\n );\n}\n\ninterface ShadowScan {\n shadowingFilesByName: Map<string, string[]>;\n problems: string[];\n capReached: boolean;\n}\n\nfunction comparableAgentName(name: string): string {\n return name.normalize(\"NFKC\").toLowerCase();\n}\n\nfunction isQuote(character: string | undefined): boolean {\n return character === '\"' || character === \"'\";\n}\n\nfunction withoutTrailingComment(value: string): string {\n for (let index = 1; index < value.length; index += 1) {\n if (value[index] === \"#\" && /\\s/u.test(value[index - 1])) {\n return value.slice(0, index);\n }\n }\n return value;\n}\n\nfunction unquotedFrontmatterValue(rawValue: string): string {\n const value = withoutTrailingComment(rawValue).trim();\n const quote = value[0];\n const isQuoted = value.length >= 2 && isQuote(quote) && value.endsWith(quote);\n return isQuoted ? value.slice(1, -1) : value;\n}\n\nfunction nameValueOf(line: string): string | null {\n if (/^\\s/u.test(line)) {\n return null;\n }\n let rest = line;\n const openingQuote = isQuote(rest[0]) ? rest[0] : \"\";\n rest = rest.slice(openingQuote.length);\n if (!rest.startsWith(NAME_KEY)) {\n return null;\n }\n rest = rest.slice(NAME_KEY.length);\n if (openingQuote !== \"\") {\n if (!rest.startsWith(openingQuote)) {\n return null;\n }\n rest = rest.slice(1);\n }\n rest = rest.trimStart();\n return rest.startsWith(\":\") ? unquotedFrontmatterValue(rest.slice(1)) : null;\n}\n\nfunction frontmatterName(prefix: string): string | null {\n const text = prefix.startsWith(BYTE_ORDER_MARK) ? prefix.slice(1) : prefix;\n const lines = text.split(\"\\n\", AGENT_FRONTMATTER_MAX_LINES + 1);\n if (lines[0]?.trim() !== FRONTMATTER_FENCE) {\n return null;\n }\n for (const line of lines.slice(1)) {\n if (line.trim() === FRONTMATTER_FENCE) {\n return null;\n }\n const value = nameValueOf(line);\n if (value !== null) {\n return value;\n }\n }\n return null;\n}\n\nasync function readFrontmatterPrefix(path: string): Promise<string | null> {\n try {\n return await readRegularFilePrefix(path, AGENT_FRONTMATTER_PREFIX_BYTES);\n } catch {\n return null;\n }\n}\n\nconst BMP_LAST_CODE_POINT = 0xffff;\n\nfunction escapedCodePoint(character: string): string {\n const codePoint = character.codePointAt(0) ?? 0;\n return codePoint > BMP_LAST_CODE_POINT\n ? `\\\\u{${codePoint.toString(16)}}`\n : `\\\\u${codePoint.toString(16).padStart(4, \"0\")}`;\n}\n\nfunction escapedUnsafeCharacters(value: string): string {\n return [...value]\n .map((character) => {\n if (character === \"\\\\\") {\n return \"\\\\\\\\\";\n }\n return isSafeIdentifier(character)\n ? character\n : escapedCodePoint(character);\n })\n .join(\"\");\n}\n\nfunction displayAgentFileName(fileName: string): string {\n return `${AGENTS_DIRECTORY}/${escapedUnsafeCharacters(fileName)}`;\n}\n\nasync function scanAgentDirectory(\n directory: string,\n agentNames: string[],\n scan: ShadowScan,\n): Promise<void> {\n const agentNameByComparable = new Map(\n agentNames.map((name) => [comparableAgentName(name), name] as const),\n );\n const ownFileNames = new Set(agentNames.map((name) => `${name}.md`));\n let entriesSeen = 0;\n for await (const entry of await opendir(directory)) {\n entriesSeen += 1;\n if (entriesSeen > MAX_AGENT_DIRECTORY_ENTRIES) {\n scan.capReached = true;\n break;\n }\n if (\n !entry.isFile() ||\n !entry.name.endsWith(\".md\") ||\n ownFileNames.has(entry.name)\n ) {\n continue;\n }\n const prefix = await readFrontmatterPrefix(join(directory, entry.name));\n const declaredName = prefix === null ? null : frontmatterName(prefix);\n const shadowedName =\n declaredName === null\n ? undefined\n : agentNameByComparable.get(comparableAgentName(declaredName));\n if (shadowedName !== undefined) {\n const files = scan.shadowingFilesByName.get(shadowedName) ?? [];\n files.push(displayAgentFileName(entry.name));\n scan.shadowingFilesByName.set(shadowedName, files);\n }\n }\n}\n\nasync function findShadowingAgentFiles(\n ctx: Context,\n agentNames: string[],\n): Promise<ShadowScan> {\n const scan: ShadowScan = {\n shadowingFilesByName: new Map(),\n problems: [],\n capReached: false,\n };\n if (agentNames.length === 0) {\n return scan;\n }\n let directory: string | null;\n try {\n directory = await resolveRepoDirectory(ctx.cwd, AGENTS_DIRECTORY, {\n create: false,\n });\n } catch {\n scan.problems.push(\n `${AGENTS_DIRECTORY} is not a real directory; agemon can't check it`,\n );\n return scan;\n }\n if (directory === null) {\n return scan;\n }\n try {\n await scanAgentDirectory(directory, agentNames, scan);\n } catch {\n scan.problems.push(\n `agemon can't read ${AGENTS_DIRECTORY} to check for same-name agents`,\n );\n }\n return scan;\n}\n\nasync function retiredAgentRows(ctx: Context): Promise<CapabilityStateRow[]> {\n const rows: CapabilityStateRow[] = [];\n for (const entry of confirmedPluginActions(ctx)) {\n const name = retiredAgentNameForTarget(entry.target);\n if (name === undefined || entry.type !== ACTION_TYPE_MANAGED_AGENT_FILE) {\n continue;\n }\n const file = await readAgentFile(ctx, entry.target);\n if (file.kind === \"readable\" && file.contents === null) {\n continue;\n }\n rows.push({\n capabilityId: PLUGIN_ID,\n resourceId: agentResourceId(name),\n label: name,\n state: \"present-managed\",\n detail:\n \"agemon no longer ships this agent; 'agemon nuke --only agents' removes it\",\n });\n }\n return rows;\n}\n\nasync function describeAgentsState(\n ctx: Context,\n): Promise<CapabilityStateRow[]> {\n const desired = desiredAgents(ctx, []);\n const shadowScan = await findShadowingAgentFiles(\n ctx,\n desired.map(({ agent }) => agent.name),\n );\n const rows: CapabilityStateRow[] = [];\n for (const entry of desired) {\n const { state, detail } = await agentFileStatus(ctx, entry);\n const shadowingFiles =\n shadowScan.shadowingFilesByName.get(entry.agent.name) ?? [];\n rows.push({\n capabilityId: PLUGIN_ID,\n resourceId: agentResourceId(entry.agent.name),\n label: entry.agent.name,\n state,\n detail:\n shadowingFiles.length === 0\n ? detail\n : `${detail}; shadowed by ${shadowingFiles.join(\", \")}`,\n });\n }\n return [...rows, ...(await retiredAgentRows(ctx))];\n}\n\nasync function desiredAgentAttention(ctx: Context): Promise<string[]> {\n const desired = desiredAgents(ctx, []);\n const attention: string[] = [];\n for (const entry of desired) {\n if ((await agentFileStatus(ctx, entry)).updateAvailable) {\n attention.push(\n `agemon has a newer version of ${entry.agent.name}; run agemon to update it`,\n );\n }\n }\n const shadowScan = await findShadowingAgentFiles(\n ctx,\n desired.map(({ agent }) => agent.name),\n );\n for (const [name, files] of shadowScan.shadowingFilesByName) {\n for (const file of files) {\n attention.push(\n `${file} also declares name: ${name}; Claude Code may load it instead of agemon's agent. Rename or remove it.`,\n );\n }\n }\n if (shadowScan.capReached) {\n ctx.ui.info(\n `agents: checked the first ${MAX_AGENT_DIRECTORY_ENTRIES} files in ${AGENTS_DIRECTORY}; a same-name agent beyond them is not checked`,\n );\n }\n return [...attention, ...shadowScan.problems];\n}\n\nasync function verifyAgents(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n const problems: string[] = [];\n const recordedTargets = confirmedPluginActions(ctx)\n .map((action) => action.target)\n .filter((target) => catalogAgentForTarget(target) !== undefined);\n for (const target of recordedTargets) {\n const file = await readAgentFile(ctx, target);\n if (file.kind === \"not-a-regular-file\") {\n problems.push(`${target} is not a regular file`);\n } else if (file.contents === null) {\n problems.push(\n `${target} is recorded in the ledger but missing; run agemon to recreate it`,\n );\n }\n }\n problems.push(...(await desiredAgentAttention(ctx)));\n return {\n ok: true,\n detail: `${recordedTargets.length} subagent file(s)`,\n ...(problems.length > 0 ? { attention: problems.join(\"; \") } : {}),\n };\n}\n\nclass AgentFileRevertError extends Error {\n constructor(\n failures: string[],\n readonly revertedEntryIds: string[],\n ) {\n super(`Could not revert subagent files — ${failures.join(\"; \")}`);\n }\n}\n\nfunction validatedResourceId(entry: LedgerEntry): string | null {\n const agentName = revertableAgentName(entry.target);\n const isAgentEntry =\n entry.type === ACTION_TYPE_MANAGED_AGENT_FILE ||\n entry.type === ACTION_TYPE_ADOPTED_AGENT_FILE;\n const resourceId =\n agentName === undefined ? null : agentResourceId(agentName);\n return isAgentEntry && resourceId !== null && entry.resourceId === resourceId\n ? resourceId\n : null;\n}\n\ninterface RevertableEntry {\n entry: LedgerEntry;\n resourceId: string;\n}\n\nfunction revertableManagedEntries(\n ctx: Context,\n entries: LedgerEntry[],\n): RevertableEntry[] {\n const revertable: RevertableEntry[] = [];\n for (const entry of entries) {\n const resourceId = validatedResourceId(entry);\n if (resourceId === null) {\n ctx.ui.info(\n `ignoring ledger entry for ${printable(entry.target)}: the agents capability does not manage that file`,\n );\n } else if (!ctx.manifest.isConfirmed(entry)) {\n ctx.ui.info(\n `ignoring ledger entry for ${printable(entry.target)}: agemon did not write it on this machine`,\n );\n } else if (entry.type === ACTION_TYPE_MANAGED_AGENT_FILE) {\n revertable.push({ entry, resourceId });\n }\n }\n return revertable;\n}\n\nasync function revertAgents(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<void> {\n const managedEntries = revertableManagedEntries(ctx, entries);\n\n if (ctx.dryRun) {\n for (const { entry } of managedEntries) {\n ctx.ui.info(`Would revert subagent file ${entry.target}`);\n }\n return;\n }\n\n const failures: string[] = [];\n const revertedEntryIds: string[] = [];\n for (const { entry, resourceId } of managedEntries) {\n try {\n await revertManagedFile(ctx, entry, {\n backupCandidates: immutableBackupCandidates(\n ctx.cwd,\n resourceId,\n entry.backup?.path ?? null,\n ),\n });\n revertedEntryIds.push(entry.id);\n } catch (error) {\n failures.push(\n `${printable(entry.target)}: ${printable(error instanceof Error ? error.message : String(error))}`,\n );\n }\n }\n if (failures.length > 0) {\n throw new AgentFileRevertError(failures, revertedEntryIds);\n }\n}\n\nasync function uninstallAgents(ctx: Context): Promise<void> {\n try {\n await revertAgents(ctx, pluginActions(ctx));\n } catch (error) {\n if (error instanceof AgentFileRevertError) {\n await ctx.manifest.removeActionIds(error.revertedEntryIds);\n }\n throw error;\n }\n}\n\nexport const agentsPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n dependsOn: [SKILLS_PLUGIN_ID],\n riskClass: \"writes-config\",\n detect: detectAgents,\n describeState: describeAgentsState,\n plan: planAgents,\n materialize: materializeAgents,\n apply: applyAgents,\n verify: verifyAgents,\n revert: revertAgents,\n uninstall: uninstallAgents,\n};\n","import { rm } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport { type FoundBackup, readFirstExistingBackup } from \"./backups.js\";\nimport type { Context } from \"./context.js\";\nimport {\n readRegularFileIfExists,\n saveVerifiedCopyBeside,\n writeFileAtomic,\n} from \"./files.js\";\nimport { fingerprintContent } from \"./fingerprint.js\";\nimport { resolveInsideRepo } from \"./repo-paths.js\";\nimport type { LedgerEntry } from \"./state-manifest.js\";\n\ninterface ManagedFileRevertOptions {\n backupCandidates: string[];\n salvage?: (currentContents: string) => string | null;\n}\n\nasync function findPreferredBackup(\n ctx: Context,\n action: LedgerEntry,\n backupCandidates: string[],\n): Promise<FoundBackup | null> {\n let firstExisting: FoundBackup | null = null;\n for (const candidatePath of backupCandidates) {\n const candidate = await readFirstExistingBackup(ctx.cwd, [candidatePath]);\n if (candidate === null) {\n continue;\n }\n if (fingerprintContent(candidate.contents) === action.fingerprintBefore) {\n return candidate;\n }\n firstExisting ??= candidate;\n }\n return firstExisting;\n}\n\nasync function removeRedundantBackups(\n ctx: Context,\n action: LedgerEntry,\n backupCandidates: string[],\n resolvedBackup: FoundBackup | null,\n contentsKeptElsewhere: string | null,\n): Promise<void> {\n for (const candidatePath of backupCandidates) {\n const candidate = await readFirstExistingBackup(ctx.cwd, [candidatePath]);\n if (candidate === null) {\n continue;\n }\n const isVerifiedResolvedBackup =\n candidate.path === resolvedBackup?.path &&\n fingerprintContent(candidate.contents) === action.fingerprintBefore;\n if (\n isVerifiedResolvedBackup ||\n candidate.contents === contentsKeptElsewhere\n ) {\n await rm(candidate.path, { force: true });\n }\n }\n}\n\nasync function preserveChangedFile(\n ctx: Context,\n action: LedgerEntry,\n backupCandidates: string[],\n targetIsMissing: boolean,\n backup: FoundBackup | null,\n): Promise<void> {\n const what = targetIsMissing\n ? `${action.target} was removed since agemon wrote it`\n : `${action.target} changed since agemon wrote it — kept as is`;\n if (backup === null) {\n ctx.ui.info(`manual cleanup needed: ${what}`);\n return;\n }\n const savedPath = await saveVerifiedCopyBeside(\n await resolveInsideRepo(ctx.cwd, action.target),\n backup.contents,\n );\n await removeRedundantBackups(\n ctx,\n action,\n backupCandidates,\n backup,\n backup.contents,\n );\n ctx.ui.info(\n `manual cleanup needed: ${what}; earlier contents saved as ${relative(ctx.cwd, savedPath)}`,\n );\n}\n\nexport async function revertManagedFile(\n ctx: Context,\n action: LedgerEntry,\n { backupCandidates, salvage }: ManagedFileRevertOptions,\n): Promise<void> {\n const targetPath = await resolveInsideRepo(ctx.cwd, action.target);\n const currentContents = await readRegularFileIfExists(targetPath);\n const currentFingerprint =\n currentContents === null ? null : fingerprintContent(currentContents);\n const backup = await findPreferredBackup(ctx, action, backupCandidates);\n const backupIsVerified =\n backup !== null &&\n fingerprintContent(backup.contents) === action.fingerprintBefore;\n\n if (\n currentFingerprint !== null &&\n currentFingerprint === action.fingerprintBefore\n ) {\n await removeRedundantBackups(\n ctx,\n action,\n backupCandidates,\n backup,\n currentContents,\n );\n return;\n }\n\n const untouchedSinceAgemonWrote =\n currentContents === null || currentFingerprint === action.fingerprintAfter;\n if (untouchedSinceAgemonWrote && !action.preExisting) {\n await rm(targetPath, { force: true });\n return;\n }\n if (untouchedSinceAgemonWrote && backupIsVerified) {\n await writeFileAtomic(targetPath, backup.contents);\n await removeRedundantBackups(\n ctx,\n action,\n backupCandidates,\n backup,\n backup.contents,\n );\n return;\n }\n\n const salvaged =\n currentContents === null || salvage === undefined\n ? null\n : salvage(currentContents);\n if (salvaged !== null) {\n if (!action.preExisting && salvaged.trim().length === 0) {\n await rm(targetPath, { force: true });\n } else {\n await writeFileAtomic(targetPath, salvaged);\n }\n await removeRedundantBackups(ctx, action, backupCandidates, backup, null);\n return;\n }\n\n await preserveChangedFile(\n ctx,\n action,\n backupCandidates,\n currentContents === null,\n backup,\n );\n}\n","import type { Context } from \"../../core/context.js\";\nimport type { LedgerEntry } from \"../../core/state-manifest.js\";\nimport { findSkillGroup, SKILL_GROUPS } from \"./catalog.js\";\n\nexport const SKILLS_PLUGIN_ID = \"skills\";\nexport const SKILL_GROUP_RESOURCE_PREFIX = \"skill-group:\";\nexport const ACTION_TYPE_INSTALLED_SKILL = \"installed-skill\";\nexport const ACTION_TYPE_PREEXISTING_SKILL = \"preexisting-skill\";\nexport const ACTION_TYPE_DECLINED_SKILL_GROUP = \"declined-skill-group\";\n\nconst SKILL_RECORD_TYPES: ReadonlySet<string> = new Set([\n ACTION_TYPE_INSTALLED_SKILL,\n ACTION_TYPE_PREEXISTING_SKILL,\n]);\n\nexport function skillsLedgerEntries(ctx: Context): LedgerEntry[] {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === SKILLS_PLUGIN_ID);\n}\n\nfunction skillNamesIn(entries: LedgerEntry[]): Set<string> {\n return new Set(\n entries\n .filter((action) => SKILL_RECORD_TYPES.has(action.type))\n .map((action) => action.target),\n );\n}\n\nexport function recordedSkillNames(ctx: Context): Set<string> {\n return skillNamesIn(skillsLedgerEntries(ctx));\n}\n\nexport function confirmedRecordedSkillNames(ctx: Context): Set<string> {\n return skillNamesIn(\n skillsLedgerEntries(ctx).filter((action) =>\n ctx.manifest.isConfirmed(action),\n ),\n );\n}\n\nexport function declinedSkillGroupIds(ctx: Context): Set<string> {\n return new Set(\n skillsLedgerEntries(ctx)\n .filter((action) => action.type === ACTION_TYPE_DECLINED_SKILL_GROUP)\n .map((action) => action.target),\n );\n}\n\nexport function recordedBuiltInGroupIds(ctx: Context): Set<string> {\n const skillNames = recordedSkillNames(ctx);\n const declinedIds = declinedSkillGroupIds(ctx);\n return new Set(\n SKILL_GROUPS.filter(\n (group) =>\n !declinedIds.has(group.id) &&\n group.skills.some((skill) => skillNames.has(skill.skillName)),\n ).map((group) => group.id),\n );\n}\n\nexport function builtInGroupIdFromResource(resourceId: string): string | null {\n if (!resourceId.startsWith(SKILL_GROUP_RESOURCE_PREFIX)) {\n return null;\n }\n const groupId = resourceId.slice(SKILL_GROUP_RESOURCE_PREFIX.length);\n return findSkillGroup(groupId) === undefined ? null : groupId;\n}\n","import { lstat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport { errorMessage } from \"../../core/error-message.js\";\nimport { readMachineLedger } from \"../../core/machine-ledger.js\";\nimport { resolveGlobalNpmRoot } from \"../../core/npm-global.js\";\nimport type { LedgerEntry } from \"../../core/state-manifest.js\";\nimport { resolveAgemonStateDirectory } from \"../../core/state-root.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport type {\n InstalledPackageInspection,\n VerifiedArchiveCandidate,\n} from \"../../core/verified-binary-installer.js\";\nimport type { PlatformCapabilities } from \"../../platform/detect.js\";\nimport { describeOperation } from \"../proposed-operation.js\";\nimport {\n addSharedHolder,\n createSharedResource,\n describeUseSharedOperation,\n isHeldByThisRepository,\n releaseSharedResource,\n repoLedgerUsesSharedResource,\n wasInstalledByAgemon,\n} from \"../shared-resource.js\";\nimport type {\n CapabilityStateRow,\n PluginPresence,\n PluginVerificationResult,\n PluginWithInstall,\n ProposedOperation,\n} from \"../types.js\";\nimport { CLI_TOOL_BUNDLE, type CliToolBundleEntry } from \"./catalog.js\";\n\nconst PLUGIN_ID = \"cli-tool\";\n\nconst ACTION_TYPE_INSTALLED_CLI_TOOL = \"installed-cli-tool\";\nconst ACTION_TYPE_PREEXISTING_CLI_TOOL = \"preexisting-cli-tool\";\n\nconst VERSION_CHECK_TIMEOUT_MS = 20_000;\nconst UNINSTALL_TIMEOUT_MS = 60_000;\n\nexport function pinnedArchiveKeyFor(platform: PlatformCapabilities): string {\n return `${platform.family}-${platform.arch}`;\n}\n\nexport function hasPinnedBuildFor(platform: PlatformCapabilities): boolean {\n const platformKey = pinnedArchiveKeyFor(platform);\n return CLI_TOOL_BUNDLE.every((entry) =>\n Object.hasOwn(entry.releaseArchivesByPlatform, platformKey),\n );\n}\n\nexport function resolveVerifiedArchiveCandidates(\n entry: CliToolBundleEntry,\n platformKey: string,\n): VerifiedArchiveCandidate[] {\n const archives = Object.hasOwn(entry.releaseArchivesByPlatform, platformKey)\n ? entry.releaseArchivesByPlatform[platformKey]\n : undefined;\n if (!archives) {\n throw new Error(\n `${entry.packageName} has no pinned build for ${platformKey}.`,\n );\n }\n return archives.map(({ asset, sha256 }) => ({\n url: `${entry.releaseDownloadUrl}/${asset}`,\n sha256,\n }));\n}\n\nfunction pinnedPackageSpec(entry: CliToolBundleEntry): string {\n return `${entry.packageName}@${entry.version}`;\n}\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction isManagedInstallOf(action: LedgerEntry, toolId: string): boolean {\n return (\n action.type === ACTION_TYPE_INSTALLED_CLI_TOOL &&\n action.target === toolId &&\n action.preExisting === false\n );\n}\n\nfunction hasManagedInstallRecord(ctx: Context, toolId: string): boolean {\n return getPluginActions(ctx).some(\n (action) =>\n isManagedInstallOf(action, toolId) && ctx.manifest.isConfirmed(action),\n );\n}\n\nconst inspectionsByContext = new WeakMap<\n Context,\n Map<string, Promise<InstalledPackageInspection>>\n>();\n\nfunction forgetInspections(ctx: Context): void {\n inspectionsByContext.delete(ctx);\n}\n\nfunction inspectInstalledTool(\n ctx: Context,\n entry: CliToolBundleEntry,\n options: { fresh?: boolean } = {},\n): Promise<InstalledPackageInspection> {\n const inspections = inspectionsByContext.get(ctx) ?? new Map();\n inspectionsByContext.set(ctx, inspections);\n const cached = options.fresh ? undefined : inspections.get(entry.id);\n if (cached) {\n return cached;\n }\n const inspection = ctx.verifiedBinaryInstaller.inspect({\n packageName: entry.packageName,\n commandName: entry.binaryName,\n commandPathInPackage: entry.commandPathInPackage,\n binaryPathInPackage: entry.binaryPathInPackage,\n packageFileSha256: entry.packageFileSha256,\n binarySha256: entry.binarySha256,\n });\n inspections.set(entry.id, inspection);\n return inspection;\n}\n\nfunction isInstalledByAgemon(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<boolean> {\n return wasInstalledByAgemon(\n entry.sharedResource,\n hasManagedInstallRecord(ctx, entry.id),\n );\n}\n\nasync function unpinnedFilesOfAgemonInstall(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<string[]> {\n if (!(await isInstalledByAgemon(ctx, entry))) {\n return [];\n }\n const inspection = await inspectInstalledTool(ctx, entry);\n return inspection.kind === \"installed\" ? inspection.differences : [];\n}\n\nasync function isToolBinaryAvailable(\n ctx: Context,\n entry: CliToolBundleEntry,\n options: { fresh?: boolean } = {},\n): Promise<boolean> {\n if (await isInstalledByAgemon(ctx, entry)) {\n const inspection = await inspectInstalledTool(ctx, entry, options);\n if (inspection.kind === \"absent\") {\n return false;\n }\n if (inspection.differences.length > 0) {\n return true;\n }\n }\n const result = await ctx.run(entry.binaryName, [\"--version\"], {\n timeoutMs: VERSION_CHECK_TIMEOUT_MS,\n });\n return result.code === 0;\n}\n\nasync function detectCliTools(ctx: Context): Promise<PluginPresence> {\n for (const entry of CLI_TOOL_BUNDLE) {\n if (!(await isToolBinaryAvailable(ctx, entry))) {\n return { present: false, preExisting: false };\n }\n }\n const allManaged = CLI_TOOL_BUNDLE.every((entry) =>\n hasManagedInstallRecord(ctx, entry.id),\n );\n return { present: true, preExisting: !allManaged };\n}\n\nasync function describeCliToolsState(\n ctx: Context,\n): Promise<CapabilityStateRow[]> {\n return Promise.all(\n CLI_TOOL_BUNDLE.map(async (entry): Promise<CapabilityStateRow> => {\n const available = await isToolBinaryAvailable(ctx, entry);\n const resourceId = `package:${entry.id}`;\n\n if (!available) {\n return {\n capabilityId: PLUGIN_ID,\n resourceId,\n label: entry.binaryName,\n state: \"absent\",\n detail: null,\n };\n }\n\n const managed = hasManagedInstallRecord(ctx, entry.id);\n const inspection = await inspectInstalledTool(ctx, entry);\n const installed =\n inspection.kind !== \"installed\"\n ? entry.packageName\n : inspection.version === null\n ? `${entry.packageName}; agemon could not inspect it (${inspection.differences.join(\"; \")})`\n : `${entry.packageName} ${inspection.version}${inspection.differences.length > 0 ? `, not the pinned ${entry.version} build` : \"\"}`;\n return {\n capabilityId: PLUGIN_ID,\n resourceId,\n label: entry.binaryName,\n state: managed ? \"present-managed\" : \"present-adopted\",\n detail: managed\n ? `installed via npm (${installed})`\n : `pre-existing install (${installed})`,\n };\n }),\n );\n}\n\nfunction describeInstallOperation(\n entry: CliToolBundleEntry,\n): ProposedOperation {\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: `package:${entry.id}`,\n targetPath: entry.packageName,\n action: \"install-package\",\n riskClass: \"executes\",\n requiresConsent: true,\n preview: {\n kind: \"note\",\n text: `npm install --global --ignore-scripts of the sha512-pinned ${pinnedPackageSpec(entry)} tarball; binary from the v${entry.version} GitHub release, sha256-pinned`,\n },\n });\n}\n\nasync function planCliTools(ctx: Context): Promise<ProposedOperation[]> {\n const operations: ProposedOperation[] = [];\n for (const entry of CLI_TOOL_BUNDLE) {\n if (!(await isToolBinaryAvailable(ctx, entry))) {\n operations.push(describeInstallOperation(entry));\n } else if (\n !(\n entriesForTool(ctx, getPluginActions(ctx), entry).usesIt &&\n (await isHeldByThisRepository(ctx, entry.sharedResource))\n )\n ) {\n operations.push(\n describeUseSharedOperation(\n PLUGIN_ID,\n entry.sharedResource,\n hasManagedInstallRecord(ctx, entry.id),\n ),\n );\n }\n }\n return operations;\n}\n\nasync function uninstallGlobalPackage(\n ctx: Context,\n packageName: string,\n): Promise<void> {\n const uninstallResult = await ctx.run(\n \"npm\",\n [\"uninstall\", \"--global\", packageName],\n {\n timeoutMs: UNINSTALL_TIMEOUT_MS,\n },\n );\n if (uninstallResult.code !== 0) {\n throw new Error(\n `npm global uninstall failed for ${printable(packageName)}: ${describeSubprocessFailure(uninstallResult, \"npm uninstall\")}`,\n );\n }\n}\n\nasync function removePartlyInstalledPackage(\n ctx: Context,\n packageName: string,\n installError: unknown,\n): Promise<void> {\n try {\n await uninstallGlobalPackage(ctx, packageName);\n } catch (uninstallError) {\n throw new Error(\n `${errorMessage(installError)} Removing the partly installed ${packageName} also failed (${errorMessage(uninstallError)}); run: npm uninstall --global ${packageName}`,\n );\n }\n}\n\nasync function assertNoForeignGlobalPackage(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<void> {\n const npmRoot = await resolveGlobalNpmRoot(ctx.run, {\n cwd: (await resolveAgemonStateDirectory(\"prepare\")).path,\n mayNotExistYet: true,\n });\n const packagePath = join(npmRoot, entry.packageName);\n try {\n await lstat(packagePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n const recordedByAgemon =\n (await readMachineLedger()).resources[entry.sharedResource.id] !==\n undefined;\n throw new Error(\n recordedByAgemon\n ? `${entry.packageName} is installed but '${entry.binaryName} --version' fails on your PATH (it is recorded in the shared-tools ledger); fix your PATH, then run agemon again.`\n : `A global npm ${entry.packageName} already exists at ${printable(packagePath)} but '${entry.binaryName} --version' fails on your PATH — fix it or run 'npm uninstall --global ${entry.packageName}', then run agemon again.`,\n );\n}\n\nasync function installPinnedCliTool(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<void> {\n await assertNoForeignGlobalPackage(ctx, entry);\n const candidates = resolveVerifiedArchiveCandidates(\n entry,\n pinnedArchiveKeyFor(ctx.platform),\n );\n try {\n await ctx.verifiedBinaryInstaller.install({\n packageName: entry.packageName,\n version: entry.version,\n binaryPathInPackage: entry.binaryPathInPackage,\n archiveMemberName: entry.archiveMemberName,\n candidates,\n packageTarball: entry.packageTarball,\n });\n } catch (installError) {\n await removePartlyInstalledPackage(ctx, entry.packageName, installError);\n throw new Error(\n `${errorMessage(installError)} agemon uninstalled the global npm package ${entry.packageName} again, so nothing is left half-installed.`,\n { cause: installError },\n );\n }\n}\n\nasync function installSharedCliTool(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(\n `Would install the sha512-pinned ${pinnedPackageSpec(entry)} tarball globally via npm, with its sha256-pinned binary`,\n );\n return;\n }\n await createSharedResource(ctx, PLUGIN_ID, entry.sharedResource, {\n isPresent: () => isToolBinaryAvailable(ctx, entry, { fresh: true }),\n create: async () => {\n try {\n await installPinnedCliTool(ctx, entry);\n } finally {\n forgetInspections(ctx);\n }\n },\n async recordInstall() {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_INSTALLED_CLI_TOOL,\n target: entry.id,\n preExisting: false,\n });\n },\n });\n}\n\nasync function useInstalledCliTool(\n ctx: Context,\n entry: CliToolBundleEntry,\n): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(`Would record that this repository uses ${entry.binaryName}`);\n return;\n }\n await addSharedHolder(ctx, PLUGIN_ID, entry.sharedResource, {\n isPresent: () => isToolBinaryAvailable(ctx, entry, { fresh: true }),\n repoLedgerSaysInstalled: hasManagedInstallRecord(ctx, entry.id),\n });\n}\n\nasync function installCliTools(ctx: Context): Promise<void> {\n for (const entry of CLI_TOOL_BUNDLE) {\n if (!(await isToolBinaryAvailable(ctx, entry))) {\n await installSharedCliTool(ctx, entry);\n }\n }\n}\n\nasync function applyCliTools(\n ctx: Context,\n operations: ProposedOperation[],\n): Promise<undefined> {\n for (const operation of operations) {\n const installEntry = CLI_TOOL_BUNDLE.find(\n (entry) => operation.resourceId === `package:${entry.id}`,\n );\n const sharedEntry = CLI_TOOL_BUNDLE.find(\n (entry) => operation.resourceId === entry.sharedResource.id,\n );\n if (operation.action === \"install-package\" && installEntry) {\n await installSharedCliTool(ctx, installEntry);\n } else if (operation.action === \"use-shared\" && sharedEntry) {\n await useInstalledCliTool(ctx, sharedEntry);\n }\n }\n}\n\nasync function verifyCliTools(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const missingToolIds: string[] = [];\n for (const entry of CLI_TOOL_BUNDLE) {\n const toolIsAvailable = await isToolBinaryAvailable(ctx, entry);\n if (!toolIsAvailable) {\n missingToolIds.push(entry.id);\n }\n }\n\n if (missingToolIds.length > 0) {\n return {\n ok: false,\n detail: `Missing CLI tool(s): ${missingToolIds.join(\", \")}`,\n };\n }\n\n const attention: string[] = [];\n for (const entry of CLI_TOOL_BUNDLE) {\n const differences = await unpinnedFilesOfAgemonInstall(ctx, entry);\n if (differences.length > 0) {\n attention.push(\n `${entry.binaryName} is not the pinned ${entry.packageName} ${entry.version} build (${differences.join(\"; \")}); reinstall it: npm uninstall --global ${entry.packageName}, then run agemon`,\n );\n }\n }\n\n return {\n ok: true,\n detail: `${CLI_TOOL_BUNDLE.length} CLI tool bundle entries present`,\n ...(attention.length > 0 ? { attention: attention.join(\" \") } : {}),\n };\n}\n\nfunction entriesForTool(\n ctx: Context,\n entries: LedgerEntry[],\n entry: CliToolBundleEntry,\n): { installedIt: boolean; usesIt: boolean } {\n const installEntries = entries.filter((action) =>\n isManagedInstallOf(action, entry.id),\n );\n const installedIt = installEntries.some((action) =>\n ctx.manifest.isConfirmed(action),\n );\n const usesIt =\n installEntries.length > 0 ||\n repoLedgerUsesSharedResource(entries, entry.sharedResource) ||\n entries.some(\n (action) =>\n action.type === ACTION_TYPE_PREEXISTING_CLI_TOOL &&\n action.target === entry.id,\n );\n return { installedIt, usesIt };\n}\n\nfunction reportUnmanagedTargets(ctx: Context, entries: LedgerEntry[]): void {\n for (const action of entries) {\n const isToolEntry =\n action.type === ACTION_TYPE_INSTALLED_CLI_TOOL ||\n action.type === ACTION_TYPE_PREEXISTING_CLI_TOOL;\n if (\n isToolEntry &&\n !CLI_TOOL_BUNDLE.some((entry) => entry.id === action.target)\n ) {\n ctx.ui.info(\n `ignoring ledger entry for ${printable(action.target)}: cli-tool does not manage that package`,\n );\n }\n }\n}\n\nasync function revertCliTools(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<void> {\n reportUnmanagedTargets(ctx, entries);\n let releasedAny = false;\n for (const entry of CLI_TOOL_BUNDLE) {\n const { installedIt, usesIt } = entriesForTool(ctx, entries, entry);\n if (!usesIt) {\n continue;\n }\n releasedAny = true;\n await releaseSharedResource(ctx, entry.sharedResource, {\n releasingRepoInstalledIt: installedIt,\n isPresent: async () => true,\n remove: async () => {\n await uninstallGlobalPackage(ctx, entry.packageName);\n forgetInspections(ctx);\n },\n });\n }\n if (ctx.dryRun && !releasedAny) {\n ctx.ui.info(\"Would keep pre-existing CLI tools untouched\");\n }\n}\n\nasync function uninstallCliTools(ctx: Context): Promise<void> {\n await revertCliTools(ctx, getPluginActions(ctx));\n}\n\nexport const cliToolPlugin: PluginWithInstall = {\n id: PLUGIN_ID,\n riskClass: \"executes\",\n sharedResources: CLI_TOOL_BUNDLE.map((entry) => entry.sharedResource),\n detect: detectCliTools,\n describeState: describeCliToolsState,\n plan: planCliTools,\n apply: applyCliTools,\n install: installCliTools,\n verify: verifyCliTools,\n revert: revertCliTools,\n uninstall: uninstallCliTools,\n};\n","import type { PinnedNpmTarball } from \"../../core/verified-binary-installer.js\";\nimport {\n AGNIX_BINARY_SHA256,\n AGNIX_NPM_TARBALL,\n AGNIX_PACKAGE_FILE_SHA256,\n AGNIX_RELEASE_ARCHIVE_SHA256,\n AGNIX_VERSION,\n} from \"../pins.js\";\nimport type { SharedResourceDeclaration } from \"../types.js\";\n\nexport interface PinnedReleaseArchive {\n asset: string;\n sha256: string;\n}\n\nexport interface CliToolBundleEntry {\n id: string;\n packageName: string;\n version: string;\n binaryName: string;\n commandPathInPackage: string;\n binaryPathInPackage: string;\n packageTarball: PinnedNpmTarball;\n packageFileSha256: Readonly<Record<string, string>>;\n binarySha256: readonly string[];\n archiveMemberName: string;\n releaseDownloadUrl: string;\n releaseArchivesByPlatform: Record<string, PinnedReleaseArchive[]>;\n sharedResource: SharedResourceDeclaration;\n}\n\nfunction agnixArchive(\n asset: keyof typeof AGNIX_RELEASE_ARCHIVE_SHA256,\n): PinnedReleaseArchive {\n return { asset, sha256: AGNIX_RELEASE_ARCHIVE_SHA256[asset] };\n}\n\nexport const CLI_TOOL_BUNDLE: CliToolBundleEntry[] = [\n {\n id: \"agnix\",\n packageName: \"agnix\",\n version: AGNIX_VERSION,\n binaryName: \"agnix\",\n commandPathInPackage: \"bin/agnix\",\n binaryPathInPackage: \"bin/agnix-binary\",\n packageTarball: AGNIX_NPM_TARBALL,\n packageFileSha256: AGNIX_PACKAGE_FILE_SHA256,\n binarySha256: AGNIX_BINARY_SHA256,\n archiveMemberName: \"agnix\",\n releaseDownloadUrl: `https://github.com/agent-sh/agnix/releases/download/v${AGNIX_VERSION}`,\n releaseArchivesByPlatform: {\n \"linux-x64\": [\n agnixArchive(\"agnix-x86_64-unknown-linux-gnu.tar.gz\"),\n agnixArchive(\"agnix-x86_64-unknown-linux-musl.tar.gz\"),\n ],\n \"linux-arm64\": [agnixArchive(\"agnix-aarch64-unknown-linux-gnu.tar.gz\")],\n \"darwin-arm64\": [agnixArchive(\"agnix-aarch64-apple-darwin.tar.gz\")],\n },\n sharedResource: {\n id: \"npm-global:agnix\",\n toolName: \"agnix\",\n manualRemoveCommand: \"npm uninstall --global agnix\",\n removalVerb: \"uninstall\",\n migratesFromRepoLedgers: true,\n },\n },\n];\n","import { lstat, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport type { LedgerEntry } from \"../../core/state-manifest.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\nimport {\n assertGitConfigMatchesPlan,\n joinAttention,\n markUntrustedGitConfig,\n UNTRUSTED_GIT_CONFIG_REMEDY,\n verifyRepositoryGitConfig,\n} from \"../../core/untrusted-git-config.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport { CODE_REVIEW_GRAPH_PACKAGE_SPEC } from \"../pins.js\";\nimport { describeOperation } from \"../proposed-operation.js\";\nimport {\n addSharedHolder,\n createSharedResource,\n describeUseSharedOperation,\n isHeldByThisRepository,\n releaseSharedResource,\n repoLedgerUsesSharedResource,\n wasInstalledByAgemon,\n} from \"../shared-resource.js\";\nimport type {\n CapabilityStateRow,\n PluginPresence,\n PluginVerificationResult,\n PluginWithInstall,\n ProposedOperation,\n SharedResourceDeclaration,\n} from \"../types.js\";\nimport { ensureCrgConstraintsFile, hashLockedPipArgs } from \"./constraints.js\";\nimport {\n crgRepositoryEnvironment,\n REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG,\n resolveCrgHome,\n} from \"./environment.js\";\nimport { GRAPH_DIRECTORY, graphDirectoryProblem } from \"./graph-directory.js\";\nimport {\n BROKEN_PIPX_VENV_HINT,\n type CrgLocation,\n locateCodeReviewGraph,\n pipxMetadataPath,\n resolvePipxHome,\n} from \"./locate.js\";\n\nconst PLUGIN_ID = \"crg\";\nconst PACKAGE_NAME = \"code-review-graph\";\n\nconst INSTALL_TIMEOUT_MS = 180_000;\nconst BUILD_TIMEOUT_MS = 300_000;\nconst STATUS_TIMEOUT_MS = 30_000;\nconst UNINSTALL_TIMEOUT_MS = 120_000;\n\nconst ACTION_TYPE_INSTALLED_BINARY = \"installed-binary\";\nconst ACTION_TYPE_GRAPH_BUILT = \"graph-built\";\n\nconst PIPX_NOT_FOUND = /process spawn error: spawn pipx ENOENT/;\nconst NOT_ON_PATH_HINT =\n \"not on PATH — run 'pipx ensurepath' and open a new shell\";\n\nconst CRG_SHARED_RESOURCE: SharedResourceDeclaration = {\n id: \"pipx:code-review-graph\",\n toolName: PACKAGE_NAME,\n manualRemoveCommand: `pipx uninstall ${PACKAGE_NAME}`,\n removalVerb: \"uninstall\",\n migratesFromRepoLedgers: true,\n};\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction confirmedPluginActions(ctx: Context): LedgerEntry[] {\n return getPluginActions(ctx).filter((action) =>\n ctx.manifest.isConfirmed(action),\n );\n}\n\nfunction hasManagedInstall(ctx: Context): boolean {\n return entriesHaveManagedInstall(confirmedPluginActions(ctx));\n}\n\ntype FoundCrg = Extract<CrgLocation, { status: \"found\" }>;\n\nfunction describeLocation(location: FoundCrg): string {\n const installedAs =\n location.source === \"pipx\"\n ? `pipx ${location.version}`\n : `${printable(location.binaryPath)} ${location.version}`;\n const locked = location.hashLocked\n ? installedAs\n : `${installedAs}; dependencies not hash-locked`;\n return location.onPath ? locked : `${locked}; ${NOT_ON_PATH_HINT}`;\n}\n\nasync function hashLockAttention(\n ctx: Context,\n location: FoundCrg,\n): Promise<{ attention?: string }> {\n if (\n location.hashLocked ||\n !(await wasInstalledByAgemon(CRG_SHARED_RESOURCE, hasManagedInstall(ctx)))\n ) {\n return {};\n }\n return {\n attention:\n location.source === \"pipx\"\n ? `${PACKAGE_NAME}'s dependencies are not hash-locked (installed by an older agemon, by hand, or rewritten by 'pipx upgrade'); reinstall it: pipx uninstall ${PACKAGE_NAME}, then run agemon`\n : `${PACKAGE_NAME} at ${printable(location.binaryPath)} is not a pipx install agemon can check for hash-locked dependencies; remove it, then run agemon to install the hash-locked one`,\n };\n}\n\nasync function detectCrgPresence(ctx: Context): Promise<PluginPresence> {\n const location = await locateCodeReviewGraph(ctx);\n if (location.status === \"absent\") {\n return { present: false, preExisting: false };\n }\n return { present: true, preExisting: !hasManagedInstall(ctx) };\n}\n\nasync function describeCrgState(ctx: Context): Promise<CapabilityStateRow[]> {\n const location = await locateCodeReviewGraph(ctx);\n const row = {\n capabilityId: PLUGIN_ID,\n resourceId: `package:${PACKAGE_NAME}`,\n label: PACKAGE_NAME,\n };\n\n if (location.status === \"absent\") {\n return [{ ...row, state: \"absent\", detail: null }];\n }\n if (location.status === \"broken-venv\") {\n return [{ ...row, state: \"unknown\", detail: BROKEN_PIPX_VENV_HINT }];\n }\n return [\n {\n ...row,\n state: hasManagedInstall(ctx) ? \"present-managed\" : \"present-adopted\",\n detail: describeLocation(location),\n },\n ];\n}\n\nasync function planCrg(ctx: Context): Promise<ProposedOperation[]> {\n return markUntrustedGitConfig(ctx, await planCrgOperations(ctx), {\n runsGit: () => true,\n reportsUnreadableConfig: true,\n });\n}\n\nasync function planCrgOperations(ctx: Context): Promise<ProposedOperation[]> {\n const location = await locateCodeReviewGraph(ctx);\n if (location.status === \"broken-venv\") {\n ctx.ui.info(BROKEN_PIPX_VENV_HINT);\n return [];\n }\n if (location.status === \"found\") {\n if (!location.onPath) {\n ctx.ui.info(\n `${PACKAGE_NAME} is installed via pipx but ${NOT_ON_PATH_HINT}`,\n );\n }\n const ledgerRecordsUse =\n hasManagedInstall(ctx) ||\n repoLedgerUsesSharedResource(getPluginActions(ctx), CRG_SHARED_RESOURCE);\n return ledgerRecordsUse &&\n (await isHeldByThisRepository(ctx, CRG_SHARED_RESOURCE))\n ? []\n : [\n describeUseSharedOperation(\n PLUGIN_ID,\n CRG_SHARED_RESOURCE,\n hasManagedInstall(ctx),\n ),\n ];\n }\n\n return [\n describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: `package:${PACKAGE_NAME}`,\n targetPath: PACKAGE_NAME,\n action: \"install-package\",\n riskClass: \"executes\",\n requiresConsent: true,\n preview: {\n kind: \"note\",\n text: `pipx install ${CODE_REVIEW_GRAPH_PACKAGE_SPEC} (dependencies hash-locked); build the code graph for this repository`,\n },\n }),\n ];\n}\n\nasync function graphDirectoryExists(ctx: Context): Promise<boolean> {\n try {\n await lstat(join(ctx.cwd, GRAPH_DIRECTORY));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction reportIgnoredCrgEnvironment(ctx: Context): void {\n if (\n process.env.CRG_HOME ||\n process.env.CRG_DATA_DIR ||\n process.env.CRG_REPO_ROOT\n ) {\n ctx.ui.info(\n `CRG_HOME, CRG_DATA_DIR and CRG_REPO_ROOT from your environment are not used here: agemon's managed graph lives in ${GRAPH_DIRECTORY}/ and code-review-graph's home is ${printable(resolveCrgHome())}`,\n );\n }\n}\n\nasync function isCrgInstalled(ctx: Context): Promise<boolean> {\n return (await locateCodeReviewGraph(ctx)).status === \"found\";\n}\n\nfunction describeMissingPipx(ctx: Context): string {\n const installHint =\n ctx.platform.family === \"darwin\"\n ? \"install it with 'brew install pipx' and make sure Homebrew's bin directory is on PATH (eval \\\"$(brew shellenv)\\\")\"\n : \"install it with 'sudo apt install pipx'\";\n return `pipx is not on PATH, so ${PACKAGE_NAME} cannot be installed; ${installHint}, then run agemon again.`;\n}\n\nasync function pipxInstallCrg(ctx: Context, pipxHome: string): Promise<void> {\n const constraintsPath = await ensureCrgConstraintsFile();\n const installResult = await ctx.run(\n \"pipx\",\n [\n \"install\",\n CODE_REVIEW_GRAPH_PACKAGE_SPEC,\n hashLockedPipArgs(constraintsPath),\n ],\n { timeoutMs: INSTALL_TIMEOUT_MS, env: { PIPX_HOME: pipxHome } },\n );\n if (PIPX_NOT_FOUND.test(installResult.stderr)) {\n throw new Error(describeMissingPipx(ctx));\n }\n if (installResult.code !== 0) {\n throw new Error(\n `pipx install failed for ${CODE_REVIEW_GRAPH_PACKAGE_SPEC}: ${describeSubprocessFailure(installResult, \"pipx\")}`,\n );\n }\n}\n\nasync function installCrg(\n ctx: Context,\n operation?: ProposedOperation,\n): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(`Would install ${PACKAGE_NAME} via pipx`);\n ctx.ui.info(\"Would build graph for current repository\");\n return;\n }\n\n const pipxHome = await resolvePipxHome(ctx.platform.family);\n const outcome = await createSharedResource(\n ctx,\n PLUGIN_ID,\n CRG_SHARED_RESOURCE,\n {\n isPresent: () => isCrgInstalled(ctx),\n create: () => pipxInstallCrg(ctx, pipxHome),\n async recordInstall() {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_INSTALLED_BINARY,\n target: `${PACKAGE_NAME} (pipx)`,\n preExisting: false,\n });\n },\n },\n );\n if (outcome === \"already-present\") {\n return;\n }\n\n const location = await locateCodeReviewGraph(ctx);\n if (location.status === \"broken-venv\") {\n throw new Error(`pipx reported success but the ${BROKEN_PIPX_VENV_HINT}`);\n }\n if (location.status !== \"found\") {\n throw new Error(\n `pipx reported success but ${pipxMetadataPath(pipxHome)} is missing or invalid`,\n );\n }\n\n const graphProblem = await graphDirectoryProblem(ctx.cwd);\n if (graphProblem !== null) {\n ctx.ui.info(`skipped the graph build: ${graphProblem}`);\n return;\n }\n\n reportIgnoredCrgEnvironment(ctx);\n await assertGitConfigMatchesPlan(ctx.gitConfigGuard, operation);\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_GRAPH_BUILT,\n target: GRAPH_DIRECTORY,\n preExisting: await graphDirectoryExists(ctx),\n });\n const buildResult = await ctx.run(location.binaryPath, [\"build\"], {\n timeoutMs: BUILD_TIMEOUT_MS,\n env: crgRepositoryEnvironment(ctx.cwd),\n unsetEnv: REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG,\n });\n if (buildResult.code !== 0) {\n throw new Error(\n `code-review-graph build failed: ${describeSubprocessFailure(buildResult, \"code-review-graph build\")}`,\n );\n }\n}\n\nasync function useInstalledCrg(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(`Would record that this repository uses ${PACKAGE_NAME}`);\n return;\n }\n await addSharedHolder(ctx, PLUGIN_ID, CRG_SHARED_RESOURCE, {\n isPresent: () => isCrgInstalled(ctx),\n repoLedgerSaysInstalled: hasManagedInstall(ctx),\n });\n}\n\nasync function applyCrg(\n ctx: Context,\n operations: ProposedOperation[],\n): Promise<undefined> {\n for (const operation of operations) {\n if (operation.action === \"use-shared\") {\n await useInstalledCrg(ctx);\n } else if (operation.action === \"install-package\") {\n await installCrg(ctx, operation);\n }\n }\n}\n\nasync function verifyCrg(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const location = await locateCodeReviewGraph(ctx);\n if (location.status === \"broken-venv\") {\n return { ok: false, detail: BROKEN_PIPX_VENV_HINT };\n }\n if (location.status === \"absent\") {\n return { ok: false, detail: `${PACKAGE_NAME} is not installed` };\n }\n\n const gitConfig = await verifyRepositoryGitConfig(ctx.gitConfigGuard);\n if (gitConfig.kind === \"unreadable\") {\n return { ok: false, detail: gitConfig.detail };\n }\n const gitConfigAttention =\n gitConfig.kind === \"untrusted\"\n ? `this repository's git config has keys agemon does not trust by default: ${gitConfig.untrustedKeys}; ${PACKAGE_NAME} runs git here. ${UNTRUSTED_GIT_CONFIG_REMEDY}`\n : undefined;\n\n const graphProblem = await graphDirectoryProblem(ctx.cwd);\n if (graphProblem !== null) {\n return { ok: false, detail: graphProblem };\n }\n if (!(await graphDirectoryExists(ctx))) {\n return entriesHaveBuiltGraph(confirmedPluginActions(ctx))\n ? {\n ok: false,\n detail: `${GRAPH_DIRECTORY}/ is missing — run agemon to build it again`,\n }\n : {\n ok: true,\n detail: \"installed; no graph built in this repository\",\n ...joinAttention(\n (await hashLockAttention(ctx, location)).attention,\n gitConfigAttention,\n ),\n };\n }\n if (gitConfigAttention !== undefined) {\n return {\n ok: true,\n detail: `installed; ${PACKAGE_NAME} status not run`,\n ...joinAttention(\n (await hashLockAttention(ctx, location)).attention,\n gitConfigAttention,\n ),\n };\n }\n\n const statusResult = await ctx.run(location.binaryPath, [\"status\"], {\n timeoutMs: STATUS_TIMEOUT_MS,\n env: crgRepositoryEnvironment(ctx.cwd),\n unsetEnv: REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG,\n });\n if (statusResult.code !== 0) {\n return {\n ok: false,\n detail: `code-review-graph status failed: ${describeSubprocessFailure(statusResult, \"code-review-graph status\")}`,\n };\n }\n\n return {\n ok: true,\n detail: \"status command passed\",\n ...(await hashLockAttention(ctx, location)),\n };\n}\n\nfunction entriesHaveManagedInstall(entries: LedgerEntry[]): boolean {\n return entries.some(\n (entry) =>\n entry.type === ACTION_TYPE_INSTALLED_BINARY &&\n entry.preExisting === false,\n );\n}\n\nfunction entriesHaveBuiltGraph(entries: LedgerEntry[]): boolean {\n return entries.some(\n (entry) =>\n entry.type === ACTION_TYPE_GRAPH_BUILT &&\n entry.preExisting === false &&\n entry.target === GRAPH_DIRECTORY,\n );\n}\n\nasync function removeBuiltGraph(ctx: Context): Promise<void> {\n const graphPath = join(ctx.cwd, GRAPH_DIRECTORY);\n let graphStats: Awaited<ReturnType<typeof lstat>>;\n try {\n graphStats = await lstat(graphPath);\n } catch {\n ctx.ui.info(\n `no ${GRAPH_DIRECTORY} in the repository; a graph kept elsewhere by crg's registry is not removed`,\n );\n return;\n }\n\n if (!graphStats.isDirectory()) {\n ctx.ui.info(\n `left ${GRAPH_DIRECTORY} in place: it is a symlink or file, not the directory agemon built; remove it by hand if you no longer need it`,\n );\n return;\n }\n await rm(graphPath, { recursive: true, force: true });\n}\n\nasync function revertCrg(ctx: Context, entries: LedgerEntry[]): Promise<void> {\n const confirmedEntries = entries.filter((entry) =>\n ctx.manifest.isConfirmed(entry),\n );\n const managedInstall = entriesHaveManagedInstall(confirmedEntries);\n const usesSharedCrg =\n entriesHaveManagedInstall(entries) ||\n repoLedgerUsesSharedResource(entries, CRG_SHARED_RESOURCE);\n const builtGraph = entriesHaveBuiltGraph(confirmedEntries);\n\n if (!builtGraph && entriesHaveBuiltGraph(entries)) {\n ctx.ui.info(\n `${ctx.dryRun ? \"Would keep\" : \"Keeping\"} ${GRAPH_DIRECTORY}/: agemon has no record on this machine that it built it here`,\n );\n }\n if (builtGraph) {\n if (ctx.dryRun) {\n ctx.ui.info(\n `Would remove ${GRAPH_DIRECTORY}/ (code graph, wiki/exports, embeddings — rebuildable with code-review-graph build)`,\n );\n } else {\n await removeBuiltGraph(ctx);\n }\n }\n if (!usesSharedCrg) {\n if (ctx.dryRun) {\n ctx.ui.info(`Would keep pre-existing ${PACKAGE_NAME} install`);\n }\n return;\n }\n\n await releaseSharedResource(ctx, CRG_SHARED_RESOURCE, {\n releasingRepoInstalledIt: managedInstall,\n isPresent: async () =>\n (await locateCodeReviewGraph(ctx)).status !== \"absent\",\n async remove() {\n const uninstallResult = await ctx.run(\n \"pipx\",\n [\"uninstall\", PACKAGE_NAME],\n {\n timeoutMs: UNINSTALL_TIMEOUT_MS,\n env: { PIPX_HOME: await resolvePipxHome(ctx.platform.family) },\n },\n );\n if (uninstallResult.code !== 0) {\n throw new Error(\n `pipx uninstall failed for ${PACKAGE_NAME}: ${describeSubprocessFailure(uninstallResult, \"pipx\")}`,\n );\n }\n },\n });\n}\n\nasync function uninstallCrg(ctx: Context): Promise<void> {\n await revertCrg(ctx, getPluginActions(ctx));\n}\n\nexport const crgPlugin: PluginWithInstall = {\n id: PLUGIN_ID,\n riskClass: \"executes\",\n sharedResources: [CRG_SHARED_RESOURCE],\n detect: detectCrgPresence,\n describeState: describeCrgState,\n plan: planCrg,\n apply: applyCrg,\n install: installCrg,\n verify: verifyCrg,\n revert: revertCrg,\n uninstall: uninstallCrg,\n};\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { readRegularFileIfExists, writeFileAtomic } from \"../../core/files.js\";\nimport { sha256Hex } from \"../../core/fingerprint.js\";\nimport { resolveToolsManifestDirectory } from \"../../core/package-assets.js\";\nimport { prepareToolsRoot } from \"../../core/state-root.js\";\nimport { quoteForShlex } from \"../../core/untrusted-text.js\";\n\nconst CONSTRAINTS_FILE_NAME = \"code-review-graph-constraints.txt\";\nconst CONSTRAINTS_HASH_LENGTH = 16;\n\nexport async function ensureCrgConstraintsFile(): Promise<string> {\n const shippedConstraints = await readFile(\n join(resolveToolsManifestDirectory(), CONSTRAINTS_FILE_NAME),\n \"utf8\",\n );\n const toolsRoot = await prepareToolsRoot();\n const constraintsPath = join(\n toolsRoot,\n `code-review-graph-constraints-${sha256Hex(shippedConstraints).slice(0, CONSTRAINTS_HASH_LENGTH)}.txt`,\n );\n if ((await readRegularFileIfExists(constraintsPath)) !== shippedConstraints) {\n await writeFileAtomic(constraintsPath, shippedConstraints);\n }\n return constraintsPath;\n}\n\nexport function hashLockedPipArgs(constraintsPath: string): string {\n return `--pip-args=--require-hashes --only-binary=:all: -c ${quoteForShlex(constraintsPath)}`;\n}\n","import { join } from \"node:path\";\nimport {\n GIT_TRANSPORTS_DISABLED,\n REPOSITORY_LOCAL_GIT_VARIABLES,\n} from \"../../core/repository-git.js\";\nimport { resolveHomeDirectory } from \"../../platform/home.js\";\n\nconst GIT_SAFETY_CONFIG: ReadonlyArray<readonly [string, string]> = [\n [\"core.fsmonitor\", \"false\"],\n [\"core.hooksPath\", \"/dev/null\"],\n [\"diff.ignoreSubmodules\", \"all\"],\n];\n\nconst VARIABLES_CLEARED_FOR_CRG = [\"CRG_DATA_DIR\", \"GIT_CONFIG_PARAMETERS\"];\n\nexport const REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG =\n REPOSITORY_LOCAL_GIT_VARIABLES.filter(\n (variable) =>\n variable !== \"GIT_CONFIG_COUNT\" &&\n !VARIABLES_CLEARED_FOR_CRG.includes(variable),\n );\n\nexport function resolveCrgHome(): string {\n return join(resolveHomeDirectory(), \".code-review-graph\");\n}\n\nfunction existingGitConfigCount(): number {\n const configured = process.env.GIT_CONFIG_COUNT ?? \"\";\n const count = Number(configured);\n return /^\\d+$/.test(configured) && Number.isSafeInteger(count) ? count : 0;\n}\n\nfunction gitSafetyConfiguration(firstIndex: number): Record<string, string> {\n const environment: Record<string, string> = {\n GIT_CONFIG_COUNT: String(firstIndex + GIT_SAFETY_CONFIG.length),\n };\n GIT_SAFETY_CONFIG.forEach(([key, value], offset) => {\n environment[`GIT_CONFIG_KEY_${firstIndex + offset}`] = key;\n environment[`GIT_CONFIG_VALUE_${firstIndex + offset}`] = value;\n });\n return environment;\n}\n\nexport function crgSubprocessEnvironment(): Record<string, string> {\n return {\n CRG_HOME: resolveCrgHome(),\n ...Object.fromEntries(\n VARIABLES_CLEARED_FOR_CRG.map((variable) => [variable, \"\"]),\n ),\n ...gitSafetyConfiguration(existingGitConfigCount()),\n ...GIT_TRANSPORTS_DISABLED,\n };\n}\n\nexport function crgRepositoryEnvironment(\n repoRoot: string,\n): Record<string, string> {\n return { ...crgSubprocessEnvironment(), CRG_REPO_ROOT: repoRoot };\n}\n\nexport function crgUnitGitSafetyEnvironment(): Record<string, string> {\n return { ...gitSafetyConfiguration(0), ...GIT_TRANSPORTS_DISABLED };\n}\n\nexport function crgUnitEnvironment(repoRoot: string): {\n set: Record<string, string>;\n unset: string[];\n removedRepositoryLocal: string[];\n} {\n return {\n set: {\n CRG_HOME: resolveCrgHome(),\n CRG_REPO_ROOT: repoRoot,\n ...crgUnitGitSafetyEnvironment(),\n },\n unset: VARIABLES_CLEARED_FOR_CRG,\n removedRepositoryLocal: REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG,\n };\n}\n","import type { Dirent, Stats } from \"node:fs\";\nimport { lstat, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { errorMessage } from \"../../core/error-message.js\";\nimport { hasGitEntry, isMissingPathError } from \"../../core/repo-paths.js\";\nimport { runRepositoryGit } from \"../../core/repository-git.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\nimport { printable, quoteForShlex } from \"../../core/untrusted-text.js\";\n\nexport const GRAPH_DIRECTORY = \".code-review-graph\";\nconst LEGACY_ROOT_DATABASE = \".code-review-graph.db\";\nconst LEGACY_ROOT_DATABASE_FILES = [\n LEGACY_ROOT_DATABASE,\n `${LEGACY_ROOT_DATABASE}-wal`,\n `${LEGACY_ROOT_DATABASE}-shm`,\n `${LEGACY_ROOT_DATABASE}-journal`,\n];\n\nexport const PATHS_CRG_WRITES_THROUGH = [\n GRAPH_DIRECTORY,\n ...[\n \".gitignore\",\n \"graph.db\",\n \"graph.db-wal\",\n \"graph.db-shm\",\n \"graph.db-journal\",\n \"graph.html\",\n \"wiki\",\n ].map((name) => `${GRAPH_DIRECTORY}/${name}`),\n LEGACY_ROOT_DATABASE,\n];\n\nconst TRACKED_PATHSPECS = [GRAPH_DIRECTORY, ...LEGACY_ROOT_DATABASE_FILES].map(\n (path) => `:(top,icase)${path}`,\n);\nconst MAX_CHECKED_ENTRIES = 20_000;\nconst MAX_NAMED_TRACKED_ENTRIES = 5;\n\nconst GRAPH_ENTRY_NOT_DIRECTORY = `${GRAPH_DIRECTORY} is a symlink or file, not a directory; remove it, then run code-review-graph build`;\nconst TOO_MANY_ENTRIES = `${GRAPH_DIRECTORY} has more than 20 000 entries, so agemon can't check it for links; remove the directory (code-review-graph build recreates it) and run agemon again.`;\n\ntype EntryType =\n | \"file\"\n | \"directory\"\n | \"symlink\"\n | \"fifo\"\n | \"socket\"\n | \"device\"\n | \"unknown\";\n\nconst ENTRY_TYPE_DESCRIPTIONS: Record<EntryType, string> = {\n file: \"a regular file\",\n directory: \"a directory\",\n symlink: \"a symlink\",\n fifo: \"a FIFO\",\n socket: \"a socket\",\n device: \"a device\",\n unknown: \"of an unknown type\",\n};\n\nexport async function graphDirectoryProblem(\n repoRoot: string,\n): Promise<string | null> {\n const trackedProblem = await trackedGraphContentProblem(repoRoot);\n if (trackedProblem !== null) {\n return trackedProblem;\n }\n try {\n return (\n (await graphDirectoryContentProblem(repoRoot)) ??\n (await legacyRootDatabaseProblem(repoRoot))\n );\n } catch (error) {\n return `could not check ${GRAPH_DIRECTORY} for links: ${printable(errorMessage(error))}`;\n }\n}\n\nasync function trackedGraphContentProblem(\n repoRoot: string,\n): Promise<string | null> {\n const result = await runRepositoryGit(repoRoot, [\n \"ls-files\",\n \"-z\",\n \"--\",\n ...TRACKED_PATHSPECS,\n ]);\n if (result.code !== 0) {\n return (await hasGitEntry(repoRoot))\n ? `could not check whether ${GRAPH_DIRECTORY} is tracked: ${describeSubprocessFailure(result, \"git ls-files\")}`\n : null;\n }\n const trackedPaths = result.stdout.split(\"\\0\").filter(Boolean);\n if (trackedPaths.length === 0) {\n return null;\n }\n const trackedEntries = [...new Set(trackedPaths.map(topLevelEntryOf))];\n const namedEntries = trackedEntries\n .slice(0, MAX_NAMED_TRACKED_ENTRIES)\n .map((entry) => printable(quoteForShlex(entry)));\n const more =\n trackedEntries.length > MAX_NAMED_TRACKED_ENTRIES ? \" and more\" : \"\";\n return `${trackedPaths.length} path(s) where crg writes its graph are tracked by git; crg would write through repository content. Remove them from the repository (git rm -r --cached -- ${namedEntries.join(\" \")}${more}) and run agemon again.`;\n}\n\nfunction topLevelEntryOf(trackedPath: string): string {\n const components = trackedPath.split(\"/\");\n const firstEntryIndex = components.findIndex((part) => part !== \"..\");\n return components.slice(0, firstEntryIndex + 1).join(\"/\");\n}\n\nasync function graphDirectoryContentProblem(\n repoRoot: string,\n): Promise<string | null> {\n const graphType = await lstatEntryType(join(repoRoot, GRAPH_DIRECTORY));\n if (graphType === \"missing\") {\n return null;\n }\n if (graphType !== \"directory\") {\n return GRAPH_ENTRY_NOT_DIRECTORY;\n }\n return await findEntryCrgWouldWriteThrough(repoRoot);\n}\n\nasync function findEntryCrgWouldWriteThrough(\n repoRoot: string,\n): Promise<string | null> {\n const directoriesToCheck = [GRAPH_DIRECTORY];\n let checkedEntries = 0;\n for (\n let directory = directoriesToCheck.pop();\n directory !== undefined;\n directory = directoriesToCheck.pop()\n ) {\n const entries = await readDirectoryUnlessGone(join(repoRoot, directory));\n for (const entry of entries) {\n checkedEntries += 1;\n if (checkedEntries > MAX_CHECKED_ENTRIES) {\n return TOO_MANY_ENTRIES;\n }\n const path = `${directory}/${entry.name}`;\n const type = await resolvedEntryType(join(repoRoot, path), entry);\n if (type === \"directory\") {\n directoriesToCheck.push(path);\n } else if (type !== \"file\" && type !== \"missing\") {\n return `${printable(path)} is ${ENTRY_TYPE_DESCRIPTIONS[type]}, not a regular file or directory; crg would write through it. Remove ${GRAPH_DIRECTORY} (code-review-graph build recreates it) and run agemon again.`;\n }\n }\n }\n return null;\n}\n\nasync function readDirectoryUnlessGone(directory: string): Promise<Dirent[]> {\n try {\n return await readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (isMissingPathError(error)) {\n return [];\n }\n throw error;\n }\n}\n\nasync function resolvedEntryType(\n path: string,\n entry: Dirent,\n): Promise<EntryType | \"missing\"> {\n const reportedType = entryTypeOf(entry);\n return reportedType === \"unknown\" ? await lstatEntryType(path) : reportedType;\n}\n\nasync function legacyRootDatabaseProblem(\n repoRoot: string,\n): Promise<string | null> {\n for (const name of LEGACY_ROOT_DATABASE_FILES) {\n const type = await lstatEntryType(join(repoRoot, name));\n if (type !== \"missing\" && type !== \"file\") {\n return `${name} at the repository root is ${ENTRY_TYPE_DESCRIPTIONS[type]}, not a regular file; crg would write through it. Remove it and run agemon again.`;\n }\n }\n return null;\n}\n\nasync function lstatEntryType(path: string): Promise<EntryType | \"missing\"> {\n try {\n return entryTypeOf(await lstat(path));\n } catch (error) {\n if (isMissingPathError(error)) {\n return \"missing\";\n }\n throw error;\n }\n}\n\nfunction entryTypeOf(entry: Dirent | Stats): EntryType {\n if (entry.isFile()) {\n return \"file\";\n }\n if (entry.isDirectory()) {\n return \"directory\";\n }\n if (entry.isSymbolicLink()) {\n return \"symlink\";\n }\n if (entry.isFIFO()) {\n return \"fifo\";\n }\n if (entry.isSocket()) {\n return \"socket\";\n }\n if (entry.isBlockDevice() || entry.isCharacterDevice()) {\n return \"device\";\n }\n return \"unknown\";\n}\n","import { constants } from \"node:fs\";\nimport { access, realpath, stat } from \"node:fs/promises\";\nimport {\n basename,\n delimiter,\n dirname,\n isAbsolute,\n join,\n resolve,\n} from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport { readRegularFileIfExists } from \"../../core/files.js\";\nimport { isSameOrInside } from \"../../core/repo-paths.js\";\nimport { resolveStateRoot } from \"../../core/state-root.js\";\nimport { agemonSubprocessEnvironment } from \"../../core/subprocess-runner.js\";\nimport { isSafeIdentifier, printable } from \"../../core/untrusted-text.js\";\nimport {\n findBinaryPath,\n type PlatformCapabilities,\n} from \"../../platform/detect.js\";\nimport {\n isHomeDirectory,\n isUsableAbsolutePath,\n resolveHomeDirectory,\n} from \"../../platform/home.js\";\nimport {\n crgSubprocessEnvironment,\n REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG,\n} from \"./environment.js\";\n\nconst CRG_BINARY_NAME = \"code-review-graph\";\nexport const BROKEN_PIPX_VENV_HINT = `pipx venv is broken — run 'pipx uninstall ${CRG_BINARY_NAME}', then 'agemon'`;\nconst PIPX_VENV_NAME = \"code-review-graph\";\nconst PACKAGE_VERSION_PATTERN = /^[0-9][0-9A-Za-z.+!-]{0,63}$/;\nconst VERSION_IN_OUTPUT_PATTERN = /\\d+(?:\\.\\d+){1,8}[0-9A-Za-z.+!-]{0,32}/;\nconst VERSION_CHECK_TIMEOUT_MS = 20_000;\n\nexport type CrgLocation =\n | {\n status: \"found\";\n source: \"pipx\" | \"path\";\n binaryPath: string;\n version: string;\n onPath: boolean;\n hashLocked: boolean;\n }\n | { status: \"broken-venv\" }\n | { status: \"absent\" };\n\ntype PipxLookup =\n | {\n status: \"found\";\n binaryPath: string;\n version: string;\n hashLocked: boolean;\n }\n | { status: \"broken-venv\" }\n | null;\ntype LocateContext = Pick<Context, \"cwd\" | \"run\" | \"platform\">;\ntype PathPolicy = (realPath: string) => boolean;\n\nfunction isFakeSubprocessMode(): boolean {\n return process.env.AGEMON_FAKE_SUBPROCESS === \"1\";\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolvePipxHome(\n family: PlatformCapabilities[\"family\"],\n): Promise<string> {\n if (isFakeSubprocessMode()) {\n const { fakePipxHome } = await import(\"../../core/fake-subprocess.js\");\n return fakePipxHome();\n }\n\n const configured = process.env.PIPX_HOME;\n if (configured !== undefined) {\n if (!isUsableAbsolutePath(configured)) {\n throw new Error(\n `PIPX_HOME is set to '${printable(configured)}', which is not an absolute path without control characters or surrounding spaces. Fix or unset PIPX_HOME and run agemon again.`,\n );\n }\n return configured;\n }\n\n const home = resolveHomeDirectory();\n const legacyHome = join(home, \".local\", \"pipx\");\n if (await pathExists(legacyHome)) {\n return legacyHome;\n }\n if (family === \"darwin\") {\n return join(home, \"Library\", \"Application Support\", \"pipx\");\n }\n const dataHome = process.env.XDG_DATA_HOME;\n if (dataHome && isAbsolute(dataHome)) {\n return join(dataHome, \"pipx\");\n }\n return join(home, \".local\", \"share\", \"pipx\");\n}\n\nexport function pipxMetadataPath(pipxHome: string): string {\n return join(pipxHome, \"venvs\", PIPX_VENV_NAME, \"pipx_metadata.json\");\n}\n\nasync function readPipxMetadata(pipxHome: string): Promise<unknown> {\n try {\n const contents = await readRegularFileIfExists(pipxMetadataPath(pipxHome));\n return contents === null ? null : JSON.parse(contents);\n } catch {\n return null;\n }\n}\n\nconst CONSTRAINTS_FILE_NAME_PATTERN =\n /^code-review-graph-constraints-[0-9a-f]{16}\\.txt$/;\n\nfunction isAgemonHashLock(pipArgs: unknown): boolean {\n if (!Array.isArray(pipArgs) || pipArgs.length !== 4) {\n return false;\n }\n const [requireHashes, onlyBinary, constraintFlag, constraintsPath] = pipArgs;\n return (\n requireHashes === \"--require-hashes\" &&\n onlyBinary === \"--only-binary=:all:\" &&\n constraintFlag === \"-c\" &&\n typeof constraintsPath === \"string\" &&\n isAbsolute(constraintsPath) &&\n resolve(constraintsPath) === constraintsPath &&\n dirname(constraintsPath) === join(resolveStateRoot(), \"agemon\", \"tools\") &&\n CONSTRAINTS_FILE_NAME_PATTERN.test(basename(constraintsPath))\n );\n}\n\nfunction pipxAppPath(\n metadata: unknown,\n): { appPath: string; version: string; hashLocked: boolean } | null {\n const mainPackage = (metadata as { main_package?: unknown } | null)\n ?.main_package as\n | {\n package?: unknown;\n package_version?: unknown;\n app_paths?: unknown;\n pip_args?: unknown;\n }\n | undefined;\n if (\n mainPackage?.package !== PIPX_VENV_NAME ||\n typeof mainPackage.package_version !== \"string\" ||\n !PACKAGE_VERSION_PATTERN.test(mainPackage.package_version) ||\n !Array.isArray(mainPackage.app_paths)\n ) {\n return null;\n }\n\n const appPath = mainPackage.app_paths\n .map((entry) => (entry as { __Path__?: unknown } | null)?.__Path__)\n .find(\n (path): path is string =>\n typeof path === \"string\" &&\n isAbsolute(path) &&\n isSafeIdentifier(path) &&\n basename(path) === CRG_BINARY_NAME,\n );\n return appPath\n ? {\n appPath,\n version: mainPackage.package_version,\n hashLocked: isAgemonHashLock(mainPackage.pip_args),\n }\n : null;\n}\n\nasync function locateInPipx(\n pipxHome: string,\n isAllowed: PathPolicy,\n): Promise<PipxLookup> {\n const app = pipxAppPath(await readPipxMetadata(pipxHome));\n if (!app) {\n return null;\n }\n\n const venvPath = join(pipxHome, \"venvs\", PIPX_VENV_NAME);\n let realApp: string;\n try {\n const realVenv = await realpath(venvPath);\n realApp = await realpath(app.appPath);\n if (!isSameOrInside(realApp, realVenv) || !isAllowed(realApp)) {\n return null;\n }\n } catch {\n return null;\n }\n\n try {\n await realpath(join(venvPath, \"bin\", \"python\"));\n } catch {\n return { status: \"broken-venv\" };\n }\n\n try {\n await access(realApp, constants.X_OK);\n } catch {\n return null;\n }\n return {\n status: \"found\",\n binaryPath: realApp,\n version: app.version,\n hashLocked: app.hashLocked,\n };\n}\n\nasync function findOnPath(isAllowed: PathPolicy): Promise<string | undefined> {\n if (isFakeSubprocessMode()) {\n const { fakeCodeReviewGraphOnPath } = await import(\n \"../../core/fake-subprocess.js\"\n );\n return fakeCodeReviewGraphOnPath();\n }\n\n const allowedEntries: string[] = [];\n for (const entry of (agemonSubprocessEnvironment().PATH ?? \"\").split(\n delimiter,\n )) {\n if (!isAbsolute(entry)) {\n continue;\n }\n try {\n if (isAllowed(await realpath(entry))) {\n allowedEntries.push(entry);\n }\n } catch {}\n }\n\n const binaryPath = await findBinaryPath(\n CRG_BINARY_NAME,\n allowedEntries.join(delimiter),\n );\n if (binaryPath === undefined) {\n return undefined;\n }\n try {\n return isAllowed(await realpath(binaryPath)) ? binaryPath : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function readPathBinaryVersion(\n ctx: LocateContext,\n binaryPath: string,\n): Promise<string | null> {\n const versionCheck = await ctx.run(binaryPath, [\"--version\"], {\n timeoutMs: VERSION_CHECK_TIMEOUT_MS,\n env: crgSubprocessEnvironment(),\n unsetEnv: REPOSITORY_LOCAL_VARIABLES_REMOVED_FOR_CRG,\n });\n if (versionCheck.code !== 0) {\n return null;\n }\n return (\n versionCheck.stdout.match(VERSION_IN_OUTPUT_PATTERN)?.[0] ??\n \"version unknown\"\n );\n}\n\nexport async function locateCodeReviewGraph(\n ctx: LocateContext,\n): Promise<CrgLocation> {\n const repoRoot = await realpath(ctx.cwd);\n const repoIsHome = await isHomeDirectory(repoRoot);\n const isAllowed: PathPolicy = (realPath) =>\n repoIsHome || !isSameOrInside(realPath, repoRoot);\n\n const binaryOnPath = await findOnPath(isAllowed);\n const pipxLocation = await locateInPipx(\n await resolvePipxHome(ctx.platform.family),\n isAllowed,\n );\n if (pipxLocation?.status === \"broken-venv\") {\n return pipxLocation;\n }\n if (pipxLocation?.status === \"found\") {\n return {\n status: \"found\",\n source: \"pipx\",\n binaryPath: pipxLocation.binaryPath,\n version: pipxLocation.version,\n onPath: binaryOnPath !== undefined,\n hashLocked: pipxLocation.hashLocked,\n };\n }\n\n if (binaryOnPath === undefined) {\n return { status: \"absent\" };\n }\n const version = await readPathBinaryVersion(ctx, binaryOnPath);\n return version === null\n ? { status: \"absent\" }\n : {\n status: \"found\",\n source: \"path\",\n binaryPath: binaryOnPath,\n version,\n onPath: true,\n hashLocked: false,\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { realpath, stat } from \"node:fs/promises\";\nimport { basename, isAbsolute, join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport { errorMessage } from \"../../core/error-message.js\";\nimport { RefusedFileError } from \"../../core/files.js\";\nimport { isSameOrInside } from \"../../core/repo-paths.js\";\nimport type {\n LedgerEntry,\n RecordManifestActionInput,\n} from \"../../core/state-manifest.js\";\nimport { resolveStateRoot } from \"../../core/state-root.js\";\nimport {\n assertGitConfigMatchesPlan,\n joinAttention,\n markUntrustedGitConfig,\n verifyRepositoryGitConfig,\n} from \"../../core/untrusted-git-config.js\";\nimport { printable, quoteForShlex } from \"../../core/untrusted-text.js\";\nimport {\n containsHomeDirectory,\n isUsableAbsolutePath,\n} from \"../../platform/home.js\";\nimport type { RegisterAutostartResult } from \"../../platform/service-manager/index.js\";\nimport {\n AGEMON_LAUNCH_AGENT_PATTERN,\n launchAgentLabelOf,\n} from \"../../platform/service-manager/launch-agent-files.js\";\nimport { AGEMON_DAEMON_UNIT_PATTERN } from \"../../platform/service-manager/unit-files.js\";\nimport {\n crgUnitEnvironment,\n crgUnitGitSafetyEnvironment,\n resolveCrgHome,\n} from \"../crg/environment.js\";\nimport {\n graphDirectoryProblem,\n PATHS_CRG_WRITES_THROUGH,\n} from \"../crg/graph-directory.js\";\nimport { BROKEN_PIPX_VENV_HINT, locateCodeReviewGraph } from \"../crg/locate.js\";\nimport { CODE_REVIEW_GRAPH_PACKAGE_SPEC } from \"../pins.js\";\nimport { describeOperation } from \"../proposed-operation.js\";\nimport {\n addSharedHolder,\n claimSharedResourceBeforeCreating,\n describeUseSharedOperation,\n isHeldByThisRepository,\n releaseSharedResource,\n repoLedgerUsesSharedResource,\n} from \"../shared-resource.js\";\nimport type {\n CapabilityStateRow,\n PluginPresence,\n PluginVerificationResult,\n PluginWithInstall,\n ProposedOperation,\n SharedResourceDeclaration,\n} from \"../types.js\";\nimport { buildLaunchAgentPlist } from \"./launchd-plist.js\";\n\nconst PLUGIN_ID = \"daemon\";\nconst CRG_COMMAND = \"code-review-graph\";\nconst UNIT_NAME_PREFIX = \"agemon-crg-daemon\";\nconst STALE_UNIT_ATTENTION =\n \"the daemon unit predates agemon's git safeguards: until it is re-registered it runs this repository's hooks and fsmonitor program and can fetch lazily; run 'agemon nuke --only daemon', then 'agemon --only daemon'\";\nconst UNTRUSTED_GIT_CONFIG_ATTENTION =\n \"the daemon runs git here with repository settings agemon does not trust by default (listed for crg); stop it with 'agemon nuke --only daemon' if you do not trust them\";\nconst LAUNCH_AGENT_LABEL_PREFIX = \"dev.agemon.crg\";\nconst LAUNCHD_HARDENING_LABEL = \"launchd\";\nconst UNIT_NAME_MAX_SLUG_LENGTH = 40;\nconst UNIT_NAME_HASH_LENGTH = 8;\nconst CHARACTERS_SYSTEMD_CANNOT_EXECUTE = /[\\\\\"']/;\nconst RESTART_DELAY_SECONDS = 10;\nconst START_LIMIT_INTERVAL_SECONDS = 600;\nconst START_LIMIT_BURST = 5;\nconst STRICT_NOT_ENFORCED =\n \"daemon hardening: strict requested, not enforced on this host\";\n\nconst ACTION_TYPE_REGISTERED_SERVICE = \"registered-service\";\nconst ACTION_TYPE_ENABLED_LINGER = \"enabled-linger\";\nconst ACTION_TYPE_HARDENING_PROFILE = \"hardening-profile\";\nconst SERVICE_UNIT_RESOURCE_PREFIX = \"service-unit:\";\n\nconst LINGER_SHARED_RESOURCE: SharedResourceDeclaration = {\n id: \"linger\",\n toolName: \"linger\",\n manualRemoveCommand: \"loginctl disable-linger\",\n removalVerb: \"disable\",\n migratesFromRepoLedgers: false,\n};\n\nfunction slugifyForUnitName(raw: string): string {\n const normalized = raw\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return (normalized || \"repo\").slice(0, UNIT_NAME_MAX_SLUG_LENGTH);\n}\n\nasync function resolveUnitName(ctx: Context): Promise<string> {\n const repoRoot = await realpath(ctx.cwd);\n const repoHash = createHash(\"sha256\")\n .update(repoRoot)\n .digest(\"hex\")\n .slice(0, UNIT_NAME_HASH_LENGTH);\n const repoKey = `${slugifyForUnitName(basename(repoRoot))}-${repoHash}`;\n return runsUnderLaunchd(ctx)\n ? `${LAUNCH_AGENT_LABEL_PREFIX}.${repoKey}.plist`\n : `${UNIT_NAME_PREFIX}-${repoKey}.service`;\n}\n\nfunction runsUnderLaunchd(ctx: Context): boolean {\n return ctx.serviceManager.kind === \"launchd\";\n}\n\nfunction managedUnitPattern(ctx: Context): RegExp {\n return runsUnderLaunchd(ctx)\n ? AGEMON_LAUNCH_AGENT_PATTERN\n : AGEMON_DAEMON_UNIT_PATTERN;\n}\n\nfunction otherOsUnitPattern(ctx: Context): RegExp {\n return runsUnderLaunchd(ctx)\n ? AGEMON_DAEMON_UNIT_PATTERN\n : AGEMON_LAUNCH_AGENT_PATTERN;\n}\n\ninterface RecordedUnit {\n entry: LedgerEntry;\n unitName: string;\n}\n\nfunction isRecordedRegistration(entry: LedgerEntry): boolean {\n return (\n entry.type === ACTION_TYPE_REGISTERED_SERVICE && entry.preExisting === false\n );\n}\n\nfunction isOwnRegistration(ctx: Context, entry: LedgerEntry): boolean {\n return (\n isRecordedRegistration(entry) &&\n managedUnitPattern(ctx).test(recordedUnitName(entry))\n );\n}\n\nfunction recordedUnits(ctx: Context, entries: LedgerEntry[]): RecordedUnit[] {\n return entries\n .filter((entry) => isOwnRegistration(ctx, entry))\n .map((entry) => ({ entry, unitName: recordedUnitName(entry) }));\n}\n\nfunction otherOsUnitNames(ctx: Context, entries: LedgerEntry[]): string[] {\n return entries\n .filter(isRecordedRegistration)\n .map(recordedUnitName)\n .filter((unitName) => otherOsUnitPattern(ctx).test(unitName));\n}\n\nfunction reportUnmanagedUnitNames(ctx: Context, entries: LedgerEntry[]): void {\n for (const entry of entries.filter(isRecordedRegistration)) {\n const unitName = recordedUnitName(entry);\n if (\n !managedUnitPattern(ctx).test(unitName) &&\n !otherOsUnitPattern(ctx).test(unitName)\n ) {\n ctx.ui.info(\n `ignoring ledger entry for ${printable(unitName)}: daemon does not manage that unit`,\n );\n }\n }\n}\n\nfunction findStaleRecordedUnits(\n ctx: Context,\n expectedUnitName: string,\n): RecordedUnit[] {\n return recordedUnits(ctx, getPluginActions(ctx)).filter(\n (unit) => unit.unitName !== expectedUnitName,\n );\n}\n\nasync function existingDirectoryRealpath(path: string): Promise<string | null> {\n try {\n const real = await realpath(path);\n return (await stat(real)).isDirectory() ? real : null;\n } catch {\n return null;\n }\n}\n\ntype UnitOwnership =\n | { kind: \"no-unit-file\" }\n | { kind: \"this-repo\" }\n | { kind: \"other\"; owner: string }\n | { kind: \"unresolved\"; workingDirectory: string };\n\nconst HASHED_UNIT_NAME_SUFFIX = /-[0-9a-f]{8}\\.(?:service|plist)$/;\n\nasync function classifyRecordedUnit(\n ctx: Context,\n unit: RecordedUnit,\n repoRoot: string,\n): Promise<UnitOwnership> {\n let workingDirectory: string | null;\n try {\n workingDirectory = await ctx.serviceManager.readUnitWorkingDirectory(\n unit.unitName,\n );\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return { kind: \"other\", owner: \"an unreadable unit file\" };\n }\n throw error;\n }\n if (workingDirectory === null) {\n return { kind: \"no-unit-file\" };\n }\n if (!isAbsolute(workingDirectory)) {\n return {\n kind: \"other\",\n owner: `a non-absolute WorkingDirectory (${workingDirectory})`,\n };\n }\n\n const isHashedName = HASHED_UNIT_NAME_SUFFIX.test(unit.unitName);\n const isThisRepositorysOldName =\n unit.unitName === oldSchemeUnitNameFor(repoRoot);\n const candidates = new Set([\n workingDirectory,\n workingDirectory.replaceAll(\"%%\", \"%\"),\n ]);\n let foreignDirectory: string | null = null;\n for (const candidate of candidates) {\n const real = await existingDirectoryRealpath(candidate);\n if (real === null) {\n continue;\n }\n const owned = isHashedName\n ? real === repoRoot\n : isThisRepositorysOldName && isSameOrInside(real, repoRoot);\n if (owned) {\n return { kind: \"this-repo\" };\n }\n foreignDirectory = real;\n }\n return foreignDirectory === null\n ? { kind: \"unresolved\", workingDirectory }\n : { kind: \"other\", owner: foreignDirectory };\n}\n\nfunction oldSchemeUnitNameFor(repoRoot: string): string {\n return `${UNIT_NAME_PREFIX}-${slugifyForUnitName(basename(repoRoot))}.service`;\n}\n\nfunction manualUnitRemoval(ctx: Context, unitName: string): string {\n const removeUnitFile = `rm ${quoteForShlex(ctx.serviceManager.unitPathFor(unitName))}`;\n return runsUnderLaunchd(ctx)\n ? `launchctl bootout \"gui/$(id -u)/${launchAgentLabelOf(unitName)}\"; ${removeUnitFile}`\n : `systemctl --user disable --now ${quoteForShlex(unitName)}; ${removeUnitFile}; systemctl --user daemon-reload`;\n}\n\ninterface RecordedUnitDecision {\n unregister: boolean;\n keptBecause: string | null;\n}\n\nfunction decideRecordedUnit(\n ctx: Context,\n { entry, unitName }: RecordedUnit,\n ownership: UnitOwnership,\n): RecordedUnitDecision {\n const recordedByThisMachine = ctx.manifest.isConfirmed(entry);\n const keeping = `${ctx.dryRun ? \"Would keep\" : \"Keeping\"} user service ${unitName}`;\n switch (ownership.kind) {\n case \"this-repo\":\n return { unregister: true, keptBecause: null };\n case \"no-unit-file\":\n return { unregister: recordedByThisMachine, keptBecause: null };\n case \"other\":\n return {\n unregister: false,\n keptBecause: `${keeping}: it now runs for ${printable(ownership.owner)}`,\n };\n case \"unresolved\":\n return recordedByThisMachine\n ? { unregister: true, keptBecause: null }\n : {\n unregister: false,\n keptBecause: printable(\n `${keeping}: its WorkingDirectory ${ownership.workingDirectory} does not exist now, so agemon can't tell which repository it serves. If nothing needs it, remove it yourself: ${manualUnitRemoval(ctx, unitName)}`,\n ),\n };\n }\n}\n\nfunction reportedUnitDecision(\n ctx: Context,\n unit: RecordedUnit,\n ownership: UnitOwnership,\n): RecordedUnitDecision {\n const decision = decideRecordedUnit(ctx, unit, ownership);\n if (decision.keptBecause !== null) {\n ctx.ui.info(decision.keptBecause);\n }\n return decision;\n}\n\nasync function migrateStaleUnit(\n ctx: Context,\n staleUnit: RecordedUnit,\n repoRoot: string,\n): Promise<void> {\n const ownership = await classifyRecordedUnit(ctx, staleUnit, repoRoot);\n if (reportedUnitDecision(ctx, staleUnit, ownership).unregister) {\n await ctx.serviceManager.unregisterAutostart({\n unitName: staleUnit.unitName,\n });\n }\n await ctx.manifest.removeActionIds([staleUnit.entry.id]);\n}\n\ntype HardeningProfile = \"strict\" | \"compat\";\n\ninterface UnitPaths {\n repoRoot: string;\n crgBinaryPath: string;\n crgHome: string;\n agemonState: string;\n}\n\ninterface HardeningChoice {\n profiles: HardeningProfile[];\n compatReason: string | null;\n hidesAgemonState: boolean;\n}\n\nconst STRICT_FAILED_NOTE =\n \"if crg's registry stores this repo's graph outside the repository, strict can't write it\";\n\nfunction escapeSpecifiers(value: string): string {\n return value.replaceAll(\"%\", \"%%\");\n}\n\nfunction quoteUnitValue(value: string): string {\n const escaped = escapeSpecifiers(value)\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll('\"', '\\\\\"');\n return `\"${escaped}\"`;\n}\n\nfunction quoteExecArgument(value: string): string {\n return quoteUnitValue(value).replaceAll(\"$\", () => \"$$\");\n}\n\nfunction assertUsableInUnit(label: string, path: string): void {\n if (!isUsableAbsolutePath(path) || path.endsWith(\"\\\\\")) {\n throw new Error(\n `Can't register the daemon: the ${label} '${printable(path)}' must be an absolute path without control characters, surrounding spaces or a trailing backslash.`,\n );\n }\n}\n\nasync function resolveCrgBinaryPath(ctx: Context): Promise<string> {\n const location = await locateCodeReviewGraph(ctx);\n if (location.status === \"broken-venv\") {\n throw new Error(`${CRG_COMMAND}'s ${BROKEN_PIPX_VENV_HINT}`);\n }\n if (location.status !== \"found\") {\n throw new Error(\n `Unable to resolve an absolute path for '${CRG_COMMAND}' on PATH; ` +\n `is it installed (e.g. via 'pipx install ${CODE_REVIEW_GRAPH_PACKAGE_SPEC}')?`,\n );\n }\n if (CHARACTERS_SYSTEMD_CANNOT_EXECUTE.test(location.binaryPath)) {\n throw new Error(\n `code-review-graph is installed at ${printable(location.binaryPath)}, which systemd can't run; reinstall it under a path without \\\\ \" or '`,\n );\n }\n return location.binaryPath;\n}\n\nasync function assertCrgWritesOnlyIntoTheRepository(\n repoRoot: string,\n): Promise<void> {\n const problem = await graphDirectoryProblem(repoRoot);\n if (problem !== null) {\n throw new Error(`Can't register the daemon: ${problem}`);\n }\n}\n\nasync function resolveUnitPaths(ctx: Context): Promise<UnitPaths> {\n const paths: UnitPaths = {\n repoRoot: await realpath(ctx.cwd),\n crgBinaryPath: await resolveCrgBinaryPath(ctx),\n crgHome: resolveCrgHome(),\n agemonState: join(resolveStateRoot(), \"agemon\"),\n };\n assertUsableInUnit(\"repository path\", paths.repoRoot);\n assertUsableInUnit(\"code-review-graph path\", paths.crgBinaryPath);\n assertUsableInUnit(\"code-review-graph home\", paths.crgHome);\n assertUsableInUnit(\"agemon state directory\", paths.agemonState);\n await assertCrgWritesOnlyIntoTheRepository(paths.repoRoot);\n return paths;\n}\n\nasync function realpathOrSelf(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n return path;\n }\n}\n\nasync function chooseHardening(paths: UnitPaths): Promise<HardeningChoice> {\n const compatOnly = (compatReason: string): HardeningChoice => ({\n profiles: [\"compat\"],\n compatReason,\n hidesAgemonState: false,\n });\n if (process.env.AGEMON_DAEMON_HARDENING === \"compat\") {\n return compatOnly(\"AGEMON_DAEMON_HARDENING=compat\");\n }\n if (await containsHomeDirectory(paths.repoRoot)) {\n return compatOnly(\"the repository is or contains your home directory\");\n }\n if (await containsHomeDirectory(await realpathOrSelf(paths.crgHome))) {\n return compatOnly(\"crg's home is or contains your home directory\");\n }\n return {\n profiles: [\"strict\", \"compat\"],\n compatReason: null,\n hidesAgemonState: !(await crgNeedsAgemonState(paths)),\n };\n}\n\nasync function crgNeedsAgemonState(paths: UnitPaths): Promise<boolean> {\n const [agemonState, ...crgPaths] = await Promise.all(\n [paths.agemonState, paths.repoRoot, paths.crgBinaryPath, paths.crgHome].map(\n realpathOrSelf,\n ),\n );\n return crgPaths.some((path) => isSameOrInside(path, agemonState));\n}\n\nasync function describeHardening(\n ctx: Context,\n unitName: string,\n registration: RegisterAutostartResult,\n choice: HardeningChoice,\n): Promise<string> {\n if (registration.attemptLabel === \"strict\") {\n return (await ctx.serviceManager.isSandboxEnforced(unitName))\n ? \"daemon hardening: strict\"\n : STRICT_NOT_ENFORCED;\n }\n const reason =\n choice.compatReason ??\n `the strict unit did not start (${printable(registration.failedAttempts.join(\"; \"))}); ${STRICT_FAILED_NOTE}`;\n return `daemon hardening: compat (${reason})`;\n}\n\nfunction getHardeningDirectives(\n profile: HardeningProfile,\n paths: UnitPaths,\n hidesAgemonState: boolean,\n): string[] {\n if (profile === \"compat\") {\n return [\"NoNewPrivileges=yes\", \"RestrictSUIDSGID=yes\"];\n }\n\n return [\n \"NoNewPrivileges=yes\",\n \"RestrictSUIDSGID=yes\",\n \"ProtectSystem=full\",\n \"ProtectHome=read-only\",\n \"PrivateTmp=yes\",\n `ReadWritePaths=${quoteUnitValue(paths.repoRoot)} ${quoteUnitValue(`-${paths.crgHome}`)}`,\n `ReadOnlyPaths=${quoteUnitValue(`-${join(paths.repoRoot, \".git\")}`)}`,\n ...(hidesAgemonState\n ? [`InaccessiblePaths=${quoteUnitValue(`-${paths.agemonState}`)}`]\n : []),\n ];\n}\n\nfunction buildUnitContents(\n paths: UnitPaths,\n profile: HardeningProfile,\n hidesAgemonState: boolean,\n): string {\n const environment = crgUnitEnvironment(paths.repoRoot);\n return [\n \"[Unit]\",\n \"Description=agemon code-review-graph daemon\",\n \"After=network-online.target\",\n `StartLimitIntervalSec=${START_LIMIT_INTERVAL_SECONDS}`,\n `StartLimitBurst=${START_LIMIT_BURST}`,\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `WorkingDirectory=${escapeSpecifiers(paths.repoRoot)}`,\n ...PATHS_CRG_WRITES_THROUGH.map(\n (path) =>\n `ExecStartPre=/usr/bin/test ! -L ${quoteExecArgument(join(paths.repoRoot, path))}`,\n ),\n `ExecStart=${quoteUnitValue(paths.crgBinaryPath)} ${quoteExecArgument(\"watch\")}`,\n ...Object.entries(environment.set).map(\n ([name, value]) => `Environment=${quoteUnitValue(`${name}=${value}`)}`,\n ),\n `UnsetEnvironment=${[...environment.unset, ...environment.removedRepositoryLocal].join(\" \")}`,\n ...getHardeningDirectives(profile, paths, hidesAgemonState),\n \"Restart=always\",\n `RestartSec=${RESTART_DELAY_SECONDS}`,\n \"\",\n \"[Install]\",\n \"WantedBy=default.target\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction getPluginActions(ctx: Context) {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction hasManagedServiceRegistration(ctx: Context): boolean {\n return getPluginActions(ctx).some((action) => isOwnRegistration(ctx, action));\n}\n\nasync function detectDaemon(ctx: Context): Promise<PluginPresence> {\n const unitName = await resolveUnitName(ctx);\n const status = await ctx.serviceManager.isActive(unitName);\n if (!status.active || findStaleRecordedUnits(ctx, unitName).length > 0) {\n return { present: false, preExisting: false };\n }\n\n if (hasManagedServiceRegistration(ctx)) {\n return { present: true, preExisting: false };\n }\n\n return { present: true, preExisting: true };\n}\n\nasync function describeDaemonState(\n ctx: Context,\n): Promise<CapabilityStateRow[]> {\n const unitName = await resolveUnitName(ctx);\n const status = await ctx.serviceManager.isActive(unitName);\n const resourceId = `${SERVICE_UNIT_RESOURCE_PREFIX}${unitName}`;\n\n if (findStaleRecordedUnits(ctx, unitName).length > 0) {\n return [\n {\n capabilityId: PLUGIN_ID,\n resourceId,\n label: unitName,\n state: \"present-managed\",\n detail: \"registered under an old name — run 'agemon' to migrate\",\n },\n ];\n }\n\n if (!status.active) {\n return [\n {\n capabilityId: PLUGIN_ID,\n resourceId,\n label: unitName,\n state: \"absent\",\n detail: status.failed ? failedUnitDetail(ctx, unitName) : null,\n },\n ];\n }\n\n const managed = hasManagedServiceRegistration(ctx);\n return [\n {\n capabilityId: PLUGIN_ID,\n resourceId,\n label: unitName,\n state: managed ? \"present-managed\" : \"present-adopted\",\n detail: managed\n ? await describeManagedUnit(ctx, unitName)\n : \"pre-existing unit\",\n },\n ];\n}\n\nfunction failedUnitDetail(ctx: Context, unitName: string): string {\n const failure = runsUnderLaunchd(ctx)\n ? `crg exited with an error; launchd restarts it at most once a minute — see 'launchctl print gui/$(id -u)/${launchAgentLabelOf(unitName)}'`\n : `crg kept exiting and the service manager stopped restarting it — see 'journalctl --user -u ${unitName}'`;\n return `failed: ${failure}; running agemon registers it again`;\n}\n\nasync function describeManagedUnit(\n ctx: Context,\n unitName: string,\n): Promise<string> {\n const recordedProfile = getPluginActions(ctx).find(\n (action) => action.type === ACTION_TYPE_HARDENING_PROFILE,\n )?.target;\n const strictNotEnforced =\n recordedProfile === \"strict\" &&\n !(await ctx.serviceManager.isSandboxEnforced(unitName));\n return strictNotEnforced\n ? `registered by agemon; ${STRICT_NOT_ENFORCED}`\n : \"registered by agemon\";\n}\n\nfunction ledgerRecordsLingerUse(ctx: Context, entries: LedgerEntry[]): boolean {\n return (\n entries.some(\n (entry) =>\n isOwnRegistration(ctx, entry) ||\n entry.type === ACTION_TYPE_ENABLED_LINGER,\n ) || repoLedgerUsesSharedResource(entries, LINGER_SHARED_RESOURCE)\n );\n}\n\nasync function lingerIsOnOrUnknown(ctx: Context): Promise<boolean | null> {\n try {\n return await ctx.serviceManager.isLingerEnabled();\n } catch (error) {\n ctx.ui.info(\n `could not read user linger (${printable(errorMessage(error))}); not recording this repository as a linger user this time`,\n );\n return null;\n }\n}\n\nasync function needsLingerUseShared(ctx: Context): Promise<boolean> {\n if (runsUnderLaunchd(ctx) || (await lingerIsOnOrUnknown(ctx)) !== true) {\n return false;\n }\n return !(\n ledgerRecordsLingerUse(ctx, getPluginActions(ctx)) &&\n (await isHeldByThisRepository(ctx, LINGER_SHARED_RESOURCE))\n );\n}\n\nasync function planDaemon(ctx: Context): Promise<ProposedOperation[]> {\n return markUntrustedGitConfig(ctx, await planDaemonOperations(ctx), {\n runsGit: (operation) => operation.action === \"register-service\",\n reportsUnreadableConfig: false,\n });\n}\n\nasync function planDaemonOperations(\n ctx: Context,\n): Promise<ProposedOperation[]> {\n const unitName = await resolveUnitName(ctx);\n const status = await ctx.serviceManager.isActive(unitName);\n const staleUnitNames = findStaleRecordedUnits(ctx, unitName).map(\n (unit) => unit.unitName,\n );\n if (status.active && staleUnitNames.length === 0) {\n return (await needsLingerUseShared(ctx))\n ? [describeUseSharedOperation(PLUGIN_ID, LINGER_SHARED_RESOURCE, false)]\n : [];\n }\n\n const replaces =\n staleUnitNames.length === 0\n ? \"\"\n : `; replaces ${staleUnitNames.join(\", \")}`;\n return [\n describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: `${SERVICE_UNIT_RESOURCE_PREFIX}${unitName}`,\n targetPath: unitName,\n action: \"register-service\",\n riskClass: \"executes\",\n requiresConsent: true,\n preview: {\n kind: \"note\",\n text: `register ${runsUnderLaunchd(ctx) ? \"launchd agent\" : \"systemd --user unit\"} ${unitName} to keep the code graph fresh${replaces}`,\n },\n }),\n ];\n}\n\nfunction reportOtherOsUnits(ctx: Context): void {\n for (const unitName of otherOsUnitNames(ctx, getPluginActions(ctx))) {\n ctx.ui.info(\n `ignoring ledger entry for ${printable(unitName)}: it was registered on another OS`,\n );\n }\n}\n\nasync function installDaemon(\n ctx: Context,\n operation?: ProposedOperation,\n): Promise<void> {\n const unitName = await resolveUnitName(ctx);\n reportOtherOsUnits(ctx);\n\n const staleUnits = findStaleRecordedUnits(ctx, unitName);\n if (ctx.dryRun) {\n const replaces =\n staleUnits.length === 0\n ? \"\"\n : ` and replace ${staleUnits.map((unit) => unit.unitName).join(\", \")}`;\n ctx.ui.info(`Would register user service ${unitName}${replaces}`);\n if (!runsUnderLaunchd(ctx)) {\n ctx.ui.info(\"Would enable user linger when not already enabled\");\n }\n return;\n }\n\n const alreadyRegistered =\n recordedUnits(ctx, getPluginActions(ctx)).some(\n (unit) => unit.unitName === unitName,\n ) && (await ctx.serviceManager.isActive(unitName)).active;\n if (!alreadyRegistered) {\n await registerDaemon(ctx, unitName, operation);\n }\n const repoRoot = await realpath(ctx.cwd);\n for (const staleUnit of staleUnits) {\n await migrateStaleUnit(ctx, staleUnit, repoRoot);\n }\n}\n\nasync function recordDaemonAction(\n ctx: Context,\n input: Omit<RecordManifestActionInput, \"plugin\" | \"preExisting\">,\n): Promise<void> {\n await ctx.manifest.recordAction({\n ...input,\n plugin: PLUGIN_ID,\n preExisting: false,\n });\n}\n\nasync function claimLingerAndRecordIntent(\n ctx: Context,\n recordRegistrationIntent: () => Promise<void>,\n): Promise<void> {\n const mustEnableLinger = await claimSharedResourceBeforeCreating(\n ctx,\n LINGER_SHARED_RESOURCE,\n {\n isPresent: () => ctx.serviceManager.isLingerEnabled(),\n async recordIntent(becomesLingerInstaller) {\n await recordRegistrationIntent();\n if (becomesLingerInstaller) {\n await recordDaemonAction(ctx, {\n type: ACTION_TYPE_ENABLED_LINGER,\n target: process.env.USER ?? \"current-user\",\n });\n }\n },\n },\n );\n if (mustEnableLinger) {\n await ctx.serviceManager.enableLinger();\n }\n}\n\nasync function registerSystemdUnit(\n ctx: Context,\n unitName: string,\n paths: UnitPaths,\n): Promise<RegisterAutostartResult> {\n const hardening = await chooseHardening(paths);\n const registration = await ctx.serviceManager.registerAutostart({\n unitName,\n attempts: hardening.profiles.map((profile) => ({\n label: profile,\n unitContents: buildUnitContents(\n paths,\n profile,\n hardening.hidesAgemonState,\n ),\n })),\n });\n ctx.ui.info(await describeHardening(ctx, unitName, registration, hardening));\n return registration;\n}\n\nasync function registerLaunchAgent(\n ctx: Context,\n unitName: string,\n paths: UnitPaths,\n): Promise<RegisterAutostartResult> {\n const label = launchAgentLabelOf(unitName);\n const registration = await ctx.serviceManager.registerAutostart({\n unitName,\n attempts: [\n {\n label: LAUNCHD_HARDENING_LABEL,\n unitContents: buildLaunchAgentPlist(label, paths),\n },\n ],\n });\n ctx.ui.info(\"daemon hardening: none (launchd has no per-service sandbox)\");\n return registration;\n}\n\nasync function registerDaemon(\n ctx: Context,\n unitName: string,\n operation: ProposedOperation | undefined,\n): Promise<void> {\n const paths = await resolveUnitPaths(ctx);\n await assertGitConfigMatchesPlan(ctx.gitConfigGuard, operation);\n const supersededIds = getPluginActions(ctx)\n .filter(\n (action) =>\n action.type === ACTION_TYPE_HARDENING_PROFILE ||\n (action.type === ACTION_TYPE_REGISTERED_SERVICE &&\n recordedUnitName(action) === unitName),\n )\n .map((action) => action.id);\n\n const recordRegistrationIntent = () =>\n recordDaemonAction(ctx, {\n type: ACTION_TYPE_REGISTERED_SERVICE,\n target: ctx.serviceManager.unitPathFor(unitName),\n resourceId: `${SERVICE_UNIT_RESOURCE_PREFIX}${unitName}`,\n });\n let registration: RegisterAutostartResult;\n if (runsUnderLaunchd(ctx)) {\n await recordRegistrationIntent();\n registration = await registerLaunchAgent(ctx, unitName, paths);\n } else {\n await claimLingerAndRecordIntent(ctx, recordRegistrationIntent);\n registration = await registerSystemdUnit(ctx, unitName, paths);\n }\n await recordDaemonAction(ctx, {\n type: ACTION_TYPE_HARDENING_PROFILE,\n target: registration.attemptLabel,\n });\n await ctx.manifest.removeActionIds(supersededIds);\n}\n\nfunction recordedUnitName(entry: LedgerEntry): string {\n return entry.resourceId?.startsWith(SERVICE_UNIT_RESOURCE_PREFIX)\n ? entry.resourceId.slice(SERVICE_UNIT_RESOURCE_PREFIX.length)\n : basename(entry.target);\n}\n\nasync function verifyDaemon(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const unitName = await resolveUnitName(ctx);\n const graphProblem = await graphDirectoryProblem(ctx.cwd);\n if (graphProblem !== null) {\n return {\n ok: false,\n detail: `${graphProblem}; the daemon would write through it on its next start — on systemd its start-time check refuses that, on macOS it does not. Fix it, then run '${restartCommand(ctx, unitName)}'.`,\n };\n }\n const status = await ctx.serviceManager.isActive(unitName);\n if (!status.active) {\n return {\n ok: false,\n detail: status.failed\n ? failedUnitDetail(ctx, unitName)\n : `${unitName} is not active`,\n };\n }\n\n const gitConfig = await verifyRepositoryGitConfig(ctx.gitConfigGuard);\n if (gitConfig.kind === \"unreadable\") {\n return { ok: false, detail: gitConfig.detail };\n }\n return {\n ok: true,\n detail: `${unitName} active`,\n ...joinAttention(\n (await unitPredatesGitSafeguards(ctx, unitName))\n ? STALE_UNIT_ATTENTION\n : undefined,\n gitConfig.kind === \"untrusted\"\n ? UNTRUSTED_GIT_CONFIG_ATTENTION\n : undefined,\n ),\n };\n}\n\nfunction restartCommand(ctx: Context, unitName: string): string {\n return runsUnderLaunchd(ctx)\n ? `launchctl kickstart -k gui/$(id -u)/${launchAgentLabelOf(unitName)}`\n : `systemctl --user restart ${unitName}`;\n}\n\nasync function unitPredatesGitSafeguards(\n ctx: Context,\n unitName: string,\n): Promise<boolean> {\n const environment = await ctx.serviceManager.readUnitEnvironment(unitName);\n if (environment === null) {\n return false;\n }\n return Object.entries(crgUnitGitSafetyEnvironment()).some(\n ([name, value]) => environment[name] !== value,\n );\n}\n\nfunction entriesEnabledLingerByAgemon(entries: LedgerEntry[]): boolean {\n return entries.some(\n (entry) =>\n entry.type === ACTION_TYPE_ENABLED_LINGER && entry.preExisting === false,\n );\n}\n\nasync function releaseLingerIfThisRepoUsedIt(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<void> {\n if (runsUnderLaunchd(ctx) || !ledgerRecordsLingerUse(ctx, entries)) {\n return;\n }\n const enabledLingerHere = entriesEnabledLingerByAgemon(entries);\n const revertedIds = new Set(entries.map((entry) => entry.id));\n const revertsARegistration = entries.some((entry) =>\n isOwnRegistration(ctx, entry),\n );\n const olderRegistrationRemains = getPluginActions(ctx).some(\n (entry) => isOwnRegistration(ctx, entry) && !revertedIds.has(entry.id),\n );\n if (revertsARegistration && olderRegistrationRemains && !enabledLingerHere) {\n return;\n }\n await releaseSharedResource(ctx, LINGER_SHARED_RESOURCE, {\n releasingRepoInstalledIt: enabledLingerHere,\n isPresent: () => ctx.serviceManager.isLingerEnabled(),\n async remove() {\n const remainingUnit = await ctx.serviceManager.findAgemonDaemonUnit();\n if (remainingUnit !== null) {\n ctx.ui.info(\n `Keeping user linger: another agemon daemon (${printable(remainingUnit)}) still needs it`,\n );\n return;\n }\n await ctx.serviceManager.disableLinger();\n },\n });\n}\n\nasync function revertDaemon(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<void> {\n reportUnmanagedUnitNames(ctx, entries);\n const units = recordedUnits(ctx, entries);\n const repoRoot = await realpath(ctx.cwd);\n const removableUnits: RecordedUnit[] = [];\n for (const unit of units) {\n const ownership = await classifyRecordedUnit(ctx, unit, repoRoot);\n if (reportedUnitDecision(ctx, unit, ownership).unregister) {\n removableUnits.push(unit);\n }\n }\n\n if (ctx.dryRun) {\n for (const unit of removableUnits) {\n ctx.ui.info(`Would unregister user service ${unit.unitName}`);\n }\n if (!entries.some(isRecordedRegistration)) {\n ctx.ui.info(\n \"Would keep the pre-existing daemon unit (agemon did not register it)\",\n );\n }\n } else {\n for (const unit of removableUnits) {\n await ctx.serviceManager.unregisterAutostart({ unitName: unit.unitName });\n }\n }\n await releaseLingerIfThisRepoUsedIt(ctx, entries);\n refuseToForgetOtherOsUnits(ctx, entries);\n}\n\nfunction refuseToForgetOtherOsUnits(\n ctx: Context,\n entries: LedgerEntry[],\n): void {\n const unitNames = otherOsUnitNames(ctx, entries).map(printable);\n if (unitNames.length === 0) {\n return;\n }\n const advice = `registered on another OS; run 'agemon nuke' there to remove ${unitNames.length === 1 ? \"it\" : \"them\"}`;\n if (ctx.dryRun) {\n ctx.ui.info(`Would keep ${unitNames.join(\", \")}: ${advice}`);\n return;\n }\n throw new Error(\n `${unitNames.join(\", \")} ${unitNames.length === 1 ? \"was\" : \"were\"} ${advice}.`,\n );\n}\n\nasync function useLinger(ctx: Context): Promise<void> {\n if (ctx.dryRun) {\n ctx.ui.info(\"Would record that this repository uses user linger\");\n return;\n }\n await addSharedHolder(ctx, PLUGIN_ID, LINGER_SHARED_RESOURCE, {\n isPresent: () => ctx.serviceManager.isLingerEnabled(),\n repoLedgerSaysInstalled: false,\n });\n}\n\nasync function applyDaemon(\n ctx: Context,\n operations: ProposedOperation[],\n): Promise<undefined> {\n for (const operation of operations) {\n if (operation.action === \"use-shared\") {\n await useLinger(ctx);\n } else if (operation.action === \"register-service\") {\n await installDaemon(ctx, operation);\n }\n }\n}\n\nasync function uninstallDaemon(ctx: Context): Promise<void> {\n await revertDaemon(ctx, getPluginActions(ctx));\n}\n\nexport const daemonPlugin: PluginWithInstall = {\n id: PLUGIN_ID,\n dependsOn: [\"crg\"],\n riskClass: \"executes\",\n sharedResources: [LINGER_SHARED_RESOURCE],\n detect: detectDaemon,\n describeState: describeDaemonState,\n plan: planDaemon,\n apply: applyDaemon,\n install: installDaemon,\n verify: verifyDaemon,\n revert: revertDaemon,\n uninstall: uninstallDaemon,\n};\n","import { escapePlistString } from \"../../platform/service-manager/launch-agent-files.js\";\nimport { crgUnitEnvironment } from \"../crg/environment.js\";\n\nconst SYSTEM_ONLY_PATH = \"/usr/bin:/bin:/usr/sbin:/sbin\";\nconst RESPAWN_THROTTLE_SECONDS = 60;\n\nexport interface LaunchAgentPaths {\n repoRoot: string;\n crgBinaryPath: string;\n}\n\nfunction stringElement(value: string): string {\n return `<string>${escapePlistString(value)}</string>`;\n}\n\nfunction keyElement(key: string): string {\n return `<key>${escapePlistString(key)}</key>`;\n}\n\nfunction launchAgentEnvironment(repoRoot: string): Record<string, string> {\n const environment = crgUnitEnvironment(repoRoot);\n return {\n PATH: SYSTEM_ONLY_PATH,\n ...environment.set,\n ...Object.fromEntries(environment.unset.map((name) => [name, \"\"])),\n };\n}\n\nexport function buildLaunchAgentPlist(\n label: string,\n paths: LaunchAgentPaths,\n): string {\n const environmentEntries = Object.entries(\n launchAgentEnvironment(paths.repoRoot),\n ).flatMap(([name, value]) => [\n ` ${keyElement(name)}`,\n ` ${stringElement(value)}`,\n ]);\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">',\n '<plist version=\"1.0\">',\n \"<dict>\",\n ` ${keyElement(\"Label\")}`,\n ` ${stringElement(label)}`,\n ` ${keyElement(\"ProgramArguments\")}`,\n \" <array>\",\n ` ${stringElement(paths.crgBinaryPath)}`,\n ` ${stringElement(\"watch\")}`,\n \" </array>\",\n ` ${keyElement(\"WorkingDirectory\")}`,\n ` ${stringElement(paths.repoRoot)}`,\n ` ${keyElement(\"EnvironmentVariables\")}`,\n \" <dict>\",\n ...environmentEntries,\n \" </dict>\",\n ` ${keyElement(\"RunAtLoad\")}`,\n \" <true/>\",\n ` ${keyElement(\"KeepAlive\")}`,\n \" <true/>\",\n ` ${keyElement(\"ThrottleInterval\")}`,\n ` <integer>${RESPAWN_THROTTLE_SECONDS}</integer>`,\n ` ${keyElement(\"ProcessType\")}`,\n ` ${stringElement(\"Background\")}`,\n \"</dict>\",\n \"</plist>\",\n \"\",\n ].join(\"\\n\");\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n immutableBackupCandidates,\n replaceStaleBackup,\n resolveV1RuleFileBackupPath,\n writeImmutableBackup,\n} from \"../../core/backups.js\";\nimport type { Context } from \"../../core/context.js\";\nimport {\n MAX_READ_FILE_LABEL,\n RefusedFileError,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"../../core/files.js\";\nimport { fingerprintContent, fingerprintJson } from \"../../core/fingerprint.js\";\nimport { revertManagedFile } from \"../../core/managed-file-revert.js\";\nimport { resolveInsideRepo } from \"../../core/repo-paths.js\";\nimport type { LedgerEntry } from \"../../core/state-manifest.js\";\nimport { renderUnifiedDiff } from \"../../core/text-diff.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport { detectDuplication } from \"../../inspect/duplication.js\";\nimport {\n removeManagedMarkdownBlock,\n upsertManagedMarkdownBlock,\n} from \"../../patchers/markdown-block.js\";\nimport { describeOperation } from \"../proposed-operation.js\";\nimport type {\n AgemonPlugin,\n PluginPresence,\n PluginVerificationResult,\n ProposedOperation,\n ProposedOperationAction,\n StagedFile,\n} from \"../types.js\";\n\nconst PLUGIN_ID = \"master-prompt\";\nconst AGENTS_FILE = \"AGENTS.md\";\nconst AGENT_RULES_BLOCK_ID = \"agent-rules\";\nconst AGENT_RULES_START_MARKER = `<!-- agemon:start:${AGENT_RULES_BLOCK_ID} -->`;\n\nconst ACTION_TYPE_MANAGED_RULE_FILE = \"managed-rule-file\";\nconst ACTION_TYPE_ADOPTED_POINTER = \"adopted-pointer\";\n\nconst POINTER_MAX_NORMALIZED_LENGTH = 800;\nconst UNREADABLE_RULE_FILE = Symbol(\"unreadable rule file\");\n\ninterface PointerTarget {\n target: string;\n toolName: string;\n}\n\nconst POINTER_TARGETS: PointerTarget[] = [\n { target: \"CLAUDE.md\", toolName: \"Claude Code\" },\n { target: \"GEMINI.md\", toolName: \"Gemini CLI\" },\n { target: \".cursorrules\", toolName: \"Cursor\" },\n { target: \".windsurfrules\", toolName: \"Windsurf\" },\n];\n\nconst ALLOWED_ACTIONS_BY_KIND: Record<\n ClassifiedRuleFile[\"kind\"],\n readonly ProposedOperationAction[]\n> = {\n agents: [\"create\", \"merge-block\", \"conflict\"],\n pointer: [\"create\", \"replace\", \"adopt\", \"conflict\"],\n};\n\ntype RuleFileState =\n | \"not-a-regular-file\"\n | \"absent\"\n | \"managed-current\"\n | \"managed-drifted\"\n | \"mergeable\"\n | \"equivalent\"\n | \"conflict\";\n\ninterface ClassifiedRuleFile {\n target: string;\n kind: \"agents\" | \"pointer\";\n state: RuleFileState;\n currentContents: string | null;\n}\n\nfunction buildAgentRulesBlockBody(): string {\n return [\n \"# AI Agent Rules\",\n \"\",\n \"This block is the canonical, repo-wide rule set for every AI coding agent in this\",\n \"repository. `CLAUDE.md`, `GEMINI.md`, `.cursorrules`, and `.windsurfrules` are pointer\",\n \"files that exist only because their tools look for those exact names — read this first.\",\n \"\",\n \"## Task Lifecycle\",\n \"\",\n \"Apply this sequence to every task:\",\n \"\",\n \"1. Discover existing skills, tools, utilities, and conventions before writing new code.\",\n \"2. Plan the smallest complete change; state assumptions and tradeoffs before implementing.\",\n \"3. Verify assumptions with tests or reproducible checks.\",\n \"4. Implement with clear names, modular boundaries, and no dead code.\",\n \"5. Re-verify after the change and confirm no regressions were introduced.\",\n \"6. Record anything out of scope in `improvements.md` instead of fixing it inline.\",\n \"\",\n \"## Core Directives\",\n \"\",\n \"- Simplicity first: the minimum code that solves the problem, nothing speculative.\",\n \"- Reuse existing project utilities instead of duplicating logic.\",\n \"- Match the surrounding code's style, naming, and structure.\",\n \"- Keep every change surgical: touch only what the task requires.\",\n \"- Zero waste in your own changes: no unused imports, variables, or dead branches.\",\n \"- Self-documenting code: descriptive names and named constants over explanatory comments.\",\n \"- Preserve user-authored content outside agemon-managed files and blocks.\",\n \"- Prefer safe, reversible changes; call out irreversible or outward-facing steps first.\",\n \"- Security and performance by default within scope: validate input, least privilege,\",\n \" no needless recomputation.\",\n \"\",\n \"## Output Conventions\",\n \"\",\n \"- Reference real, existing file paths.\",\n \"- Mark the file path above each changed code block.\",\n \"- End every task with a short summary of what changed and why.\",\n ].join(\"\\n\");\n}\n\nfunction buildPointerFileContents(\n toolName: string,\n targetFileName: string,\n): string {\n return [\n \"<!-- AI agent rules pointer -->\",\n \"# AI Agent Rules\",\n \"\",\n \"The canonical rules for this repo live in AGENTS.md — read that file in full before\",\n \"making any changes here. This file exists only because \" +\n `${toolName} looks for \\`${targetFileName}\\` specifically; it intentionally does not restate the rules.`,\n \"\",\n ].join(\"\\n\");\n}\n\nfunction pointerContentsFor(target: string): string {\n const pointer = POINTER_TARGETS.find((entry) => entry.target === target);\n if (!pointer) {\n throw new Error(`No pointer definition for '${target}'.`);\n }\n return buildPointerFileContents(pointer.toolName, pointer.target);\n}\n\nfunction ruleFileKind(target: string): ClassifiedRuleFile[\"kind\"] | null {\n if (target === AGENTS_FILE) {\n return \"agents\";\n }\n return POINTER_TARGETS.some((pointer) => pointer.target === target)\n ? \"pointer\"\n : null;\n}\n\nfunction assertMasterPromptPerforms(operation: ProposedOperation): void {\n const kind = ruleFileKind(operation.targetPath);\n if (\n kind === null ||\n !ALLOWED_ACTIONS_BY_KIND[kind].includes(operation.action)\n ) {\n throw new Error(\n `Plan operation ${printable(operation.id)} is not something master-prompt does (${operation.action} ${printable(operation.targetPath)}).`,\n );\n }\n}\n\nfunction ruleFileResourceId(target: string): string {\n return `rule-file:${target}`;\n}\n\nfunction ruleFileTargetFromResourceId(resourceId: string): string | null {\n const prefix = \"rule-file:\";\n return resourceId.startsWith(prefix) ? resourceId.slice(prefix.length) : null;\n}\n\nfunction desiredRevisionForTarget(target: string): string | null {\n if (target === AGENTS_FILE) {\n return fingerprintJson({\n block: buildAgentRulesBlockBody(),\n pointer: null,\n });\n }\n if (POINTER_TARGETS.some((pointer) => pointer.target === target)) {\n return fingerprintJson({\n block: null,\n pointer: pointerContentsFor(target),\n });\n }\n return null;\n}\n\nfunction masterPromptDesiredRevision(\n _ctx: Context,\n resourceId: string,\n): string | null {\n const target = ruleFileTargetFromResourceId(resourceId);\n return target === null ? null : desiredRevisionForTarget(target);\n}\n\nfunction pluginActions(ctx: Context): LedgerEntry[] {\n return ctx.manifest\n .getActions()\n .filter((action) => action.plugin === PLUGIN_ID);\n}\n\nfunction ledgerActionForTarget(\n ctx: Context,\n target: string,\n): LedgerEntry | undefined {\n return pluginActions(ctx).find((action) => action.target === target);\n}\n\nfunction hasActionForTarget(ctx: Context, target: string): boolean {\n return ledgerActionForTarget(ctx, target) !== undefined;\n}\n\nfunction looksLikePointer(contents: string): boolean {\n if (!/AGENTS\\.md/i.test(contents)) {\n return false;\n }\n return (\n contents.replace(/\\s+/gu, \" \").trim().length <=\n POINTER_MAX_NORMALIZED_LENGTH\n );\n}\n\nfunction agentsFileNeedsBlock(contents: string): boolean {\n return !contents.includes(AGENT_RULES_START_MARKER);\n}\n\nfunction agentsBlockIsDrifted(contents: string): boolean {\n return upsertManagedMarkdownBlock(\n contents,\n AGENT_RULES_BLOCK_ID,\n buildAgentRulesBlockBody(),\n ).changed;\n}\n\nfunction classifyAgentsFile(contents: string | null): RuleFileState {\n if (contents === null || contents.trim().length === 0) {\n return \"absent\";\n }\n if (agentsFileNeedsBlock(contents)) {\n return \"mergeable\";\n }\n return agentsBlockIsDrifted(contents) ? \"managed-drifted\" : \"managed-current\";\n}\n\nfunction classifyPointerFile(\n ctx: Context,\n target: string,\n contents: string | null,\n): RuleFileState {\n if (contents === null) {\n return \"absent\";\n }\n\n const action = ledgerActionForTarget(ctx, target);\n if (action) {\n if (action.type === ACTION_TYPE_ADOPTED_POINTER) {\n return \"managed-current\";\n }\n return contents === pointerContentsFor(target)\n ? \"managed-current\"\n : \"managed-drifted\";\n }\n\n return looksLikePointer(contents) ? \"equivalent\" : \"conflict\";\n}\n\nasync function classifyRuleFile(\n ctx: Context,\n target: string,\n kind: ClassifiedRuleFile[\"kind\"],\n): Promise<ClassifiedRuleFile> {\n let contents: string | null;\n try {\n contents = await readRegularFileIfExists(join(ctx.cwd, target));\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return {\n target,\n kind,\n state: \"not-a-regular-file\",\n currentContents: null,\n };\n }\n throw error;\n }\n const state =\n kind === \"agents\"\n ? classifyAgentsFile(contents)\n : classifyPointerFile(ctx, target, contents);\n return { target, kind, state, currentContents: contents };\n}\n\nasync function classifyRuleFiles(ctx: Context): Promise<ClassifiedRuleFile[]> {\n const classified = [await classifyRuleFile(ctx, AGENTS_FILE, \"agents\")];\n for (const pointer of POINTER_TARGETS) {\n classified.push(await classifyRuleFile(ctx, pointer.target, \"pointer\"));\n }\n return classified;\n}\n\nfunction renderRuleFileContents(\n target: string,\n contentsBefore: string | null,\n): string {\n if (target === AGENTS_FILE) {\n return upsertManagedMarkdownBlock(\n contentsBefore ?? \"\",\n AGENT_RULES_BLOCK_ID,\n buildAgentRulesBlockBody(),\n ).nextContent;\n }\n return pointerContentsFor(target);\n}\n\nfunction proposedContentsFor(entry: ClassifiedRuleFile): string {\n return renderRuleFileContents(entry.target, entry.currentContents);\n}\n\nfunction operationWritesRuleFile(operation: ProposedOperation): boolean {\n return operation.action !== \"conflict\" && operation.action !== \"adopt\";\n}\n\nasync function materializeMasterPrompt(\n ctx: Context,\n operations: ProposedOperation[],\n): Promise<StagedFile[]> {\n const staged: StagedFile[] = [];\n for (const operation of operations) {\n assertMasterPromptPerforms(operation);\n if (!operationWritesRuleFile(operation)) {\n continue;\n }\n const contentsBefore = await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, operation.targetPath),\n );\n staged.push({\n targetPath: operation.targetPath,\n contents: renderRuleFileContents(operation.targetPath, contentsBefore),\n kind: \"markdown\",\n });\n }\n return staged;\n}\n\nfunction operationForClassifiedFile(\n entry: ClassifiedRuleFile,\n): ProposedOperation | null {\n if (entry.state === \"managed-current\") {\n return null;\n }\n\n const expectedFingerprint =\n entry.currentContents === null\n ? null\n : fingerprintContent(entry.currentContents);\n\n if (entry.state === \"not-a-regular-file\") {\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: ruleFileResourceId(entry.target),\n targetPath: entry.target,\n action: \"conflict\",\n riskClass: \"writes-config\",\n requiresConsent: true,\n expectedFingerprint,\n preview: {\n kind: \"note\",\n text: `${entry.target} is a symlink, special file or larger than ${MAX_READ_FILE_LABEL}; agemon leaves it alone.`,\n },\n });\n }\n\n if (entry.state === \"conflict\") {\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: ruleFileResourceId(entry.target),\n targetPath: entry.target,\n action: \"conflict\",\n riskClass: \"writes-config\",\n requiresConsent: true,\n expectedFingerprint,\n preview: {\n kind: \"note\",\n text: `${entry.target} carries independent rules that duplicate guidance belonging in ${AGENTS_FILE}; keep yours, or replace it with a pointer.`,\n },\n });\n }\n\n if (entry.state === \"equivalent\") {\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: ruleFileResourceId(entry.target),\n targetPath: entry.target,\n action: \"adopt\",\n riskClass: \"writes-config\",\n requiresConsent: true,\n expectedFingerprint,\n preview: {\n kind: \"note\",\n text: `${entry.target} already points to ${AGENTS_FILE}; record the adoption in the ledger and write nothing.`,\n },\n });\n }\n\n const action =\n entry.state === \"absent\"\n ? \"create\"\n : entry.kind === \"agents\"\n ? \"merge-block\"\n : \"replace\";\n\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: ruleFileResourceId(entry.target),\n targetPath: entry.target,\n action,\n riskClass: \"writes-config\",\n requiresConsent: true,\n expectedFingerprint,\n preview: {\n kind: \"diff\",\n text: renderUnifiedDiff(\n entry.currentContents ?? \"\",\n proposedContentsFor(entry),\n entry.target,\n ),\n },\n });\n}\n\nasync function planMasterPrompt(ctx: Context): Promise<ProposedOperation[]> {\n const classified = await classifyRuleFiles(ctx);\n const operations: ProposedOperation[] = [];\n for (const entry of classified) {\n const operation = operationForClassifiedFile(entry);\n if (operation) {\n operations.push(operation);\n }\n }\n return operations;\n}\n\nasync function recordManagedRuleFile(\n ctx: Context,\n input: {\n target: string;\n ownershipMode: \"created\" | \"delimited-block\";\n contentsBefore: string | null;\n contentsAfter: string;\n backup: { path: string; checksum: string } | null;\n },\n): Promise<void> {\n const fingerprintAfter = fingerprintContent(input.contentsAfter);\n const desiredRevision = desiredRevisionForTarget(input.target);\n\n if (hasActionForTarget(ctx, input.target)) {\n await ctx.manifest.updateResourceEntry(ruleFileResourceId(input.target), {\n fingerprintAfter,\n desiredRevision,\n });\n return;\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_MANAGED_RULE_FILE,\n target: input.target,\n preExisting: input.contentsBefore !== null,\n resourceId: ruleFileResourceId(input.target),\n ownershipMode: input.ownershipMode,\n fingerprintBefore:\n input.contentsBefore === null\n ? null\n : fingerprintContent(input.contentsBefore),\n fingerprintAfter,\n desiredRevision,\n backup: input.backup,\n });\n}\n\nasync function backupContentsBefore(\n ctx: Context,\n target: string,\n contentsBefore: string,\n) {\n const resourceId = ruleFileResourceId(target);\n return hasActionForTarget(ctx, target)\n ? writeImmutableBackup(ctx.cwd, resourceId, contentsBefore)\n : replaceStaleBackup(ctx.cwd, resourceId, contentsBefore);\n}\n\nasync function applyRuleFileOperation(\n ctx: Context,\n operation: ProposedOperation,\n stagedContents: string | undefined,\n): Promise<void> {\n const targetPath = await resolveInsideRepo(ctx.cwd, operation.targetPath);\n const contentsBefore = await readRegularFileIfExists(targetPath);\n\n if (operation.action === \"adopt\") {\n if (hasActionForTarget(ctx, operation.targetPath)) {\n return;\n }\n const fingerprint =\n contentsBefore === null ? null : fingerprintContent(contentsBefore);\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_ADOPTED_POINTER,\n target: operation.targetPath,\n preExisting: true,\n resourceId: ruleFileResourceId(operation.targetPath),\n ownershipMode: \"recorded-key\",\n fingerprintBefore: fingerprint,\n fingerprintAfter: fingerprint,\n backup: null,\n });\n return;\n }\n\n const contentsAfter =\n stagedContents ??\n renderRuleFileContents(operation.targetPath, contentsBefore);\n\n const backup =\n contentsBefore === null\n ? null\n : await backupContentsBefore(ctx, operation.targetPath, contentsBefore);\n\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFileAtomic(targetPath, contentsAfter);\n\n await recordManagedRuleFile(ctx, {\n target: operation.targetPath,\n ownershipMode:\n operation.targetPath === AGENTS_FILE ? \"delimited-block\" : \"created\",\n contentsBefore,\n contentsAfter,\n backup:\n backup === null ? null : { path: backup.path, checksum: backup.checksum },\n });\n}\n\nasync function applyMasterPrompt(\n ctx: Context,\n operations: ProposedOperation[],\n staged?: StagedFile[],\n): Promise<undefined> {\n const stagedContentsByPath = new Map(\n (staged ?? []).map((file) => [file.targetPath, file.contents] as const),\n );\n for (const operation of operations) {\n assertMasterPromptPerforms(operation);\n if (operation.action === \"conflict\") {\n continue;\n }\n await applyRuleFileOperation(\n ctx,\n operation,\n stagedContentsByPath.get(operation.targetPath),\n );\n }\n}\n\nasync function detectMasterPrompt(ctx: Context): Promise<PluginPresence> {\n const operations = await planMasterPrompt(ctx);\n const actionable = operations.filter(\n (operation) => operation.action !== \"conflict\",\n );\n const classified = await classifyRuleFiles(ctx);\n return {\n present: actionable.length === 0,\n preExisting: classified.some(\n (entry) =>\n entry.state === \"equivalent\" ||\n entry.state === \"conflict\" ||\n entry.state === \"mergeable\" ||\n entry.state === \"managed-drifted\",\n ),\n };\n}\n\nasync function verifyMasterPrompt(\n ctx: Context,\n): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const problems: string[] = [];\n const readForVerification = async (\n target: string,\n ): Promise<string | null | typeof UNREADABLE_RULE_FILE> => {\n try {\n return await readRegularFileIfExists(join(ctx.cwd, target));\n } catch (error) {\n if (!(error instanceof RefusedFileError)) {\n throw error;\n }\n problems.push(error.message);\n return UNREADABLE_RULE_FILE;\n }\n };\n\n const agentsContents = await readForVerification(AGENTS_FILE);\n if (agentsContents !== UNREADABLE_RULE_FILE) {\n if (agentsContents === null || agentsFileNeedsBlock(agentsContents)) {\n problems.push(`${AGENTS_FILE} is missing agemon's managed block`);\n } else if (agentsBlockIsDrifted(agentsContents)) {\n problems.push(`${AGENTS_FILE} managed block drifted from its template`);\n }\n }\n\n const managedRuleFiles: { path: string; contents: string | null }[] = [\n {\n path: AGENTS_FILE,\n contents: agentsContents === UNREADABLE_RULE_FILE ? null : agentsContents,\n },\n ];\n for (const pointer of POINTER_TARGETS) {\n if (!hasActionForTarget(ctx, pointer.target)) {\n continue;\n }\n const contents = await readForVerification(pointer.target);\n if (contents === UNREADABLE_RULE_FILE) {\n continue;\n }\n if (contents === null) {\n problems.push(`${pointer.target} is recorded in the ledger but missing`);\n continue;\n }\n managedRuleFiles.push({ path: pointer.target, contents });\n }\n\n const duplicateGuidance = detectDuplication(managedRuleFiles).overlaps;\n if (duplicateGuidance.length > 0) {\n problems.push(\n `duplicate guidance across managed files: ${duplicateGuidance\n .map((overlap) => `${overlap.left} ~ ${overlap.right}`)\n .join(\", \")}`,\n );\n }\n\n if (problems.length > 0) {\n return { ok: false, detail: problems.join(\"; \") };\n }\n\n return {\n ok: true,\n detail: `${managedRuleFiles.length} managed rule file(s), no duplicate guidance`,\n };\n}\n\nclass RuleFileRevertError extends Error {\n constructor(\n failures: string[],\n readonly revertedEntryIds: string[],\n ) {\n super(`Could not revert rule files — ${failures.join(\"; \")}`);\n }\n}\n\nasync function revertMasterPrompt(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<void> {\n const ruleFileActions = entries.filter(\n (entry) => entry.type === ACTION_TYPE_MANAGED_RULE_FILE,\n );\n const managedActions = ruleFileActions.filter(\n (entry) => ruleFileKind(entry.target) !== null,\n );\n for (const unmanaged of ruleFileActions) {\n if (ruleFileKind(unmanaged.target) === null) {\n ctx.ui.info(\n `ignoring ledger entry for ${printable(unmanaged.target)}: master-prompt does not manage that file`,\n );\n }\n }\n\n if (ctx.dryRun) {\n if (managedActions.length === 0) {\n ctx.ui.info(\"Would keep every pre-existing rule file untouched\");\n return;\n }\n for (const action of managedActions) {\n ctx.ui.info(`Would revert rule file ${action.target}`);\n }\n return;\n }\n\n const failures: string[] = [];\n const revertedEntryIds: string[] = [];\n for (const action of managedActions) {\n try {\n await revertManagedRuleFile(ctx, action);\n revertedEntryIds.push(action.id);\n } catch (error) {\n failures.push(\n `${printable(action.target)}: ${printable(error instanceof Error ? error.message : String(error))}`,\n );\n }\n }\n if (failures.length > 0) {\n throw new RuleFileRevertError(failures, revertedEntryIds);\n }\n}\n\nfunction backupCandidatesFor(ctx: Context, action: LedgerEntry): string[] {\n return [\n ...immutableBackupCandidates(\n ctx.cwd,\n ruleFileResourceId(action.target),\n action.backup?.path ?? null,\n ),\n resolveV1RuleFileBackupPath(ctx.cwd, action.target),\n ];\n}\n\nfunction exciseAgentRulesBlock(contents: string): string | null {\n try {\n const excised = removeManagedMarkdownBlock(contents, AGENT_RULES_BLOCK_ID);\n return excised.changed ? excised.nextContent : null;\n } catch {\n return null;\n }\n}\n\nasync function revertManagedRuleFile(\n ctx: Context,\n action: LedgerEntry,\n): Promise<void> {\n await revertManagedFile(ctx, action, {\n backupCandidates: backupCandidatesFor(ctx, action),\n salvage: exciseAgentRulesBlock,\n });\n}\n\nasync function uninstallMasterPrompt(ctx: Context): Promise<void> {\n try {\n await revertMasterPrompt(ctx, pluginActions(ctx));\n } catch (error) {\n if (error instanceof RuleFileRevertError) {\n await ctx.manifest.removeActionIds(error.revertedEntryIds);\n }\n throw error;\n }\n}\n\nexport const masterPromptPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n riskClass: \"writes-config\",\n detect: detectMasterPrompt,\n desiredRevision: masterPromptDesiredRevision,\n plan: planMasterPrompt,\n materialize: materializeMasterPrompt,\n apply: applyMasterPrompt,\n verify: verifyMasterPrompt,\n revert: revertMasterPrompt,\n uninstall: uninstallMasterPrompt,\n};\n","function startMarker(blockId: string): string {\n return `<!-- agemon:start:${blockId} -->`;\n}\n\nfunction endMarker(blockId: string): string {\n return `<!-- agemon:end:${blockId} -->`;\n}\n\nfunction normalizeBlockBody(blockBody: string): string {\n return blockBody.replace(/\\s+$/u, \"\");\n}\n\nfunction buildManagedBlock(blockId: string, blockBody: string): string {\n const body = normalizeBlockBody(blockBody);\n if (body.length === 0) {\n return `${startMarker(blockId)}\\n${endMarker(blockId)}`;\n }\n return `${startMarker(blockId)}\\n${body}\\n${endMarker(blockId)}`;\n}\n\nfunction findManagedBlockRange(\n content: string,\n blockId: string,\n): {\n start: number;\n end: number;\n} | null {\n const start = content.indexOf(startMarker(blockId));\n if (start < 0) {\n return null;\n }\n\n const endTag = endMarker(blockId);\n const endTagIndex = content.indexOf(endTag, start);\n if (endTagIndex < 0) {\n throw new Error(\n `Found start marker without matching end marker for '${blockId}'.`,\n );\n }\n\n return { start, end: endTagIndex + endTag.length };\n}\n\nexport function upsertManagedMarkdownBlock(\n content: string,\n blockId: string,\n blockBody: string,\n): { nextContent: string; changed: boolean } {\n const managedBlock = buildManagedBlock(blockId, blockBody);\n const range = findManagedBlockRange(content, blockId);\n\n if (range) {\n const current = content.slice(range.start, range.end);\n if (current === managedBlock) {\n return { nextContent: content, changed: false };\n }\n\n const next =\n content.slice(0, range.start) + managedBlock + content.slice(range.end);\n return { nextContent: next, changed: true };\n }\n\n if (content.length === 0) {\n return { nextContent: `${managedBlock}\\n`, changed: true };\n }\n\n const separator = content.endsWith(\"\\n\\n\")\n ? \"\"\n : content.endsWith(\"\\n\")\n ? \"\\n\"\n : \"\\n\\n\";\n\n return {\n nextContent: `${content}${separator}${managedBlock}\\n`,\n changed: true,\n };\n}\n\nexport function removeManagedMarkdownBlock(\n content: string,\n blockId: string,\n): { nextContent: string; changed: boolean } {\n const range = findManagedBlockRange(content, blockId);\n if (!range) {\n return { nextContent: content, changed: false };\n }\n\n const before = content.slice(0, range.start).replace(/\\n+$/u, \"\");\n const after = content.slice(range.end).replace(/^\\n+/u, \"\");\n\n let next: string;\n if (before.length === 0) {\n next = after;\n } else if (after.length === 0) {\n next = `${before}\\n`;\n } else {\n next = `${before}\\n\\n${after}`;\n }\n\n return { nextContent: next, changed: true };\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { isPlainSkillName } from \"../../core/config.js\";\nimport { CUSTOM_SKILL_GROUP_RESOURCE_PREFIX } from \"../../core/consent.js\";\nimport type { Context } from \"../../core/context.js\";\nimport { RefusedPathError, readRegularFileIfExists } from \"../../core/files.js\";\nimport { fingerprintJson } from \"../../core/fingerprint.js\";\nimport {\n ensureGitignoreEntry,\n SKILLS_LOCK_GITIGNORE_ENTRY,\n} from \"../../core/gitignore.js\";\nimport type { LedgerEntry } from \"../../core/state-manifest.js\";\nimport { withAgemonStateLock } from \"../../core/state-root.js\";\nimport { describeSubprocessFailure } from \"../../core/subprocess-runner.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport {\n recordCreatedDirectories,\n recordGitignoreLine,\n} from \"../../core/workspace-footprint.js\";\nimport { describeOperation } from \"../proposed-operation.js\";\nimport type {\n AgemonPlugin,\n CapabilityState,\n CapabilityStateRow,\n PluginPresence,\n PluginVerificationResult,\n ProposedOperation,\n SkillUpdate,\n} from \"../types.js\";\nimport {\n buildCustomSkillGroups,\n SKILL_GROUPS,\n type SkillBundleEntry,\n type SkillGroup,\n} from \"./catalog.js\";\nimport {\n type GroupSelection,\n selectGroupsForFreshInstall,\n selectNewlyOfferedGroups,\n} from \"./group-selection.js\";\nimport {\n ACTION_TYPE_DECLINED_SKILL_GROUP,\n ACTION_TYPE_INSTALLED_SKILL,\n ACTION_TYPE_PREEXISTING_SKILL,\n confirmedRecordedSkillNames,\n declinedSkillGroupIds,\n recordedSkillNames,\n SKILL_GROUP_RESOURCE_PREFIX,\n SKILLS_PLUGIN_ID,\n skillsLedgerEntries,\n} from \"./ledger-view.js\";\nimport {\n readLocalSkill,\n withSkillsStage,\n writeStagedSkill,\n} from \"./local-source.js\";\nimport {\n fetchPinnedSkillsSource,\n type PinnedSkillsRepository,\n resolvePinnedSkillPath,\n} from \"./pinned-source.js\";\nimport { assertSkillManifestName } from \"./skill-manifest.js\";\nimport {\n removeAgemonSkillCopy,\n removeSkillsFromLock,\n reportLeftCanonicalCopy,\n} from \"./skill-removal.js\";\nimport {\n classifyInstalledSkill,\n classifyInstalledSkillForReport,\n currentSkillFingerprint,\n fingerprintsAgemonInstalled,\n forgetSkillClassifications,\n installedSkillFingerprint,\n shippedFingerprints,\n verifiedCustomInstallFingerprint,\n} from \"./skill-revisions.js\";\nimport { runSkillsCli } from \"./skills-cli.js\";\nimport {\n CANONICAL_SKILLS_DIRECTORY,\n CLAUDE_SKILLS_DIRECTORY,\n prepareSkillsCliTargets,\n removeInstalledSkillCopy,\n SKILLS_LOCK_FILE,\n} from \"./skills-cli-targets.js\";\n\nconst PLUGIN_ID = SKILLS_PLUGIN_ID;\n\nconst ACTION_TYPE_GENERATED_SKILLS_LOCK = \"generated-skills-lock\";\nconst ACTION_TYPE_OFFERED_SKILL_GROUP = \"offered-skill-group\";\nconst BUILT_IN_SOURCE_DESCRIPTION = \"bundled with agemon\";\nconst DECLINED_GROUP_PREVIEW = \"declined — agemon will not offer it again\";\nconst SKILL_MANIFEST_PATH = \"SKILL.md\";\nconst ORPHANED_SKILLS_RESOURCE_ID = \"skill-groups:orphaned\";\nconst UPDATE_PREVIEW_NOTE = \" — update (bundled content changed)\";\n\nconst SKILLS_LIST_TIMEOUT_MS = 30_000;\nconst SKILLS_ADD_TIMEOUT_MS = 180_000;\nconst SKILLS_SOURCE_LOCK_WAIT_MS = 30 * 60_000;\n\ninterface SkillsListEntry {\n name: string;\n}\n\nfunction flattenSkills(groups: SkillGroup[]): SkillBundleEntry[] {\n return groups.flatMap((group) => group.skills);\n}\n\nfunction getCustomGroups(ctx: Context): SkillGroup[] {\n return buildCustomSkillGroups(ctx.customSkillGroups ?? []);\n}\n\nfunction getAvailableGroups(ctx: Context): SkillGroup[] {\n return [...SKILL_GROUPS, ...getCustomGroups(ctx)];\n}\n\nfunction getRecordedGroups(ctx: Context): SkillGroup[] {\n const skillNames = recordedSkillNames(ctx);\n const confirmedSkillNames = confirmedRecordedSkillNames(ctx);\n return getAvailableGroups(ctx).filter((group) => {\n const namesThatCount = group.definedByRepository\n ? confirmedSkillNames\n : skillNames;\n return group.skills.some((skill) => namesThatCount.has(skill.skillName));\n });\n}\nfunction getOfferedGroupIds(ctx: Context): Set<string> {\n return new Set(\n skillsLedgerEntries(ctx)\n .filter((action) => action.type === ACTION_TYPE_OFFERED_SKILL_GROUP)\n .map((action) => action.target),\n );\n}\n\nfunction getUnofferedGroups(ctx: Context): SkillGroup[] {\n const decidedGroupIds = new Set(getRecordedGroups(ctx).map((g) => g.id));\n const offeredGroupIds = getOfferedGroupIds(ctx);\n return getAvailableGroups(ctx).filter(\n (group) => !offeredGroupIds.has(group.id) && !decidedGroupIds.has(group.id),\n );\n}\n\nfunction hasManagedInstallRecord(ctx: Context, skillName: string): boolean {\n return skillsLedgerEntries(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_SKILL &&\n action.target === skillName &&\n action.preExisting === false,\n );\n}\n\nfunction hasPreexistingRecord(ctx: Context, skillName: string): boolean {\n return skillsLedgerEntries(ctx).some(\n (action) =>\n action.type === ACTION_TYPE_PREEXISTING_SKILL &&\n action.target === skillName &&\n action.preExisting === true,\n );\n}\n\nfunction hasAnyRecordForSkill(ctx: Context, skillName: string): boolean {\n return (\n hasManagedInstallRecord(ctx, skillName) ||\n hasPreexistingRecord(ctx, skillName)\n );\n}\n\nfunction getSkillsLockPath(cwd: string): string {\n return join(cwd, SKILLS_LOCK_FILE);\n}\n\nfunction isManagedSkillsLockEntry(action: LedgerEntry): boolean {\n return (\n action.type === ACTION_TYPE_GENERATED_SKILLS_LOCK &&\n action.target === SKILLS_LOCK_FILE &&\n action.preExisting === false\n );\n}\n\nfunction hasManagedSkillsLockRecord(ctx: Context): boolean {\n return skillsLedgerEntries(ctx).some(\n (action) =>\n isManagedSkillsLockEntry(action) && ctx.manifest.isConfirmed(action),\n );\n}\n\nasync function listInstalledSkillNames(ctx: Context): Promise<Set<string>> {\n const listResult = await runSkillsCli(\n ctx,\n [\"list\", \"--json\"],\n SKILLS_LIST_TIMEOUT_MS,\n );\n if (listResult.code !== 0) {\n throw new Error(\n `skills list failed: ${describeSubprocessFailure(listResult, \"skills list\")}`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(listResult.stdout || \"[]\");\n } catch {\n const stdoutPreview = printable(listResult.stdout.trim().slice(0, 200));\n const detail = listResult.stderr.trim()\n ? describeSubprocessFailure(listResult, \"skills list\")\n : stdoutPreview || \"no command output\";\n throw new Error(`skills list returned invalid JSON: ${detail}`);\n }\n\n if (!Array.isArray(parsed)) {\n throw new Error(\"skills list returned non-array JSON\");\n }\n\n const installedSkillNames = new Set<string>();\n for (const item of parsed) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const typedItem = item as SkillsListEntry;\n if (typeof typedItem.name === \"string\" && typedItem.name.length > 0) {\n installedSkillNames.add(typedItem.name);\n }\n }\n\n return installedSkillNames;\n}\n\nasync function detectSkills(ctx: Context): Promise<PluginPresence> {\n const recordedGroups = getRecordedGroups(ctx);\n if (recordedGroups.length === 0) {\n return { present: false, preExisting: false };\n }\n\n const recordedEntries = flattenSkills(recordedGroups);\n const installedSkillNames = await listInstalledSkillNames(ctx);\n const allRecordedSkillsPresent = recordedEntries.every((entry) =>\n installedSkillNames.has(entry.skillName),\n );\n if (!allRecordedSkillsPresent) {\n return { present: false, preExisting: false };\n }\n\n const allManaged = recordedEntries.every((entry) =>\n hasManagedInstallRecord(ctx, entry.skillName),\n );\n return { present: true, preExisting: !allManaged };\n}\n\nfunction getReportableGroups(ctx: Context): SkillGroup[] {\n const recordedGroups = getRecordedGroups(ctx);\n const declinedGroupIds = declinedSkillGroupIds(ctx);\n const combinedGroups = new Map(\n recordedGroups.map((group) => [group.id, group]),\n );\n for (const group of getAvailableGroups(ctx)) {\n if (declinedGroupIds.has(group.id)) {\n combinedGroups.set(group.id, group);\n }\n }\n return [...combinedGroups.values()];\n}\n\nfunction latestConfirmedSkillRecord(\n ctx: Context,\n skillName: string,\n): LedgerEntry | undefined {\n return skillsLedgerEntries(ctx)\n .filter(\n (action) =>\n action.target === skillName &&\n (action.type === ACTION_TYPE_INSTALLED_SKILL ||\n action.type === ACTION_TYPE_PREEXISTING_SKILL) &&\n ctx.manifest.isConfirmed(action),\n )\n .at(-1);\n}\n\nfunction isUpdatableBundledSkill(\n ctx: Context,\n group: SkillGroup,\n entry: SkillBundleEntry,\n): boolean {\n return (\n !group.definedByRepository &&\n hasManagedInstallRecord(ctx, entry.skillName) &&\n latestConfirmedSkillRecord(ctx, entry.skillName)?.type !==\n ACTION_TYPE_PREEXISTING_SKILL\n );\n}\n\ninterface KeptSkill {\n name: string;\n reason: string;\n}\n\ninterface GroupRevisionReport {\n outdatedNames: string[];\n kept: KeptSkill[];\n}\n\nasync function reportGroupRevisions(\n ctx: Context,\n group: SkillGroup,\n): Promise<GroupRevisionReport> {\n const report: GroupRevisionReport = { outdatedNames: [], kept: [] };\n for (const entry of group.skills) {\n if (!isUpdatableBundledSkill(ctx, group, entry)) {\n continue;\n }\n const classification = await classifyInstalledSkillForReport(ctx, entry);\n if (classification.kind === \"outdated\") {\n report.outdatedNames.push(entry.skillName);\n } else if (classification.kind === \"kept\") {\n report.kept.push({\n name: entry.skillName,\n reason: classification.reason,\n });\n }\n }\n return report;\n}\n\nfunction describeGroupRevisions(report: GroupRevisionReport): string[] {\n const fragments: string[] = [];\n if (report.outdatedNames.length > 0) {\n fragments.push(\n `update available for ${report.outdatedNames.length} skill(s)`,\n );\n }\n if (report.kept.length > 0) {\n fragments.push(\n `agemon keeps ${report.kept.map(({ name }) => name).join(\", \")}`,\n );\n }\n return fragments;\n}\n\nfunction describeKeptSkill({ name, reason }: KeptSkill): string {\n return `skills: agemon keeps ${name} (${reason}); to get agemon's version, delete ${CLAUDE_SKILLS_DIRECTORY}/${name} and run agemon`;\n}\n\nfunction presentGroupState(\n ctx: Context,\n group: SkillGroup,\n revisions: GroupRevisionReport,\n): CapabilityState {\n if (revisions.kept.length > 0) {\n return \"present-modified\";\n }\n const allManaged = group.skills.every((skill) =>\n hasManagedInstallRecord(ctx, skill.skillName),\n );\n return allManaged ? \"present-managed\" : \"present-adopted\";\n}\n\nfunction orphanedSkillEntries(ctx: Context): LedgerEntry[] {\n const groupSkillNames = new Set(\n flattenSkills(getAvailableGroups(ctx)).map((entry) => entry.skillName),\n );\n return skillsLedgerEntries(ctx).filter(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_SKILL &&\n action.preExisting === false &&\n isPlainSkillName(action.target) &&\n !groupSkillNames.has(action.target),\n );\n}\n\nfunction describeOrphanedSkills(ctx: Context): CapabilityStateRow[] {\n const orphanedEntries = orphanedSkillEntries(ctx);\n const names = [...new Set(orphanedEntries.map((entry) => entry.target))];\n if (names.length === 0) {\n return [];\n }\n const confirmedNames = new Set(\n orphanedEntries\n .filter((entry) => ctx.manifest.isConfirmed(entry))\n .map((entry) => entry.target),\n );\n const unconfirmedCount = names.filter(\n (name) => !confirmedNames.has(name),\n ).length;\n const claimNote =\n unconfirmedCount === 0\n ? \"\"\n : ` (${unconfirmedCount} not recorded on this machine; nuke keeps those)`;\n return [\n {\n capabilityId: PLUGIN_ID,\n resourceId: ORPHANED_SKILLS_RESOURCE_ID,\n label: \"skills of removed groups\",\n state: unconfirmedCount === 0 ? \"present-managed\" : \"present-adopted\",\n detail: `${names.join(\", \")}: their skill group is no longer defined; 'agemon nuke --only skills' removes them${claimNote}`,\n },\n ];\n}\n\nasync function describeSkillsState(\n ctx: Context,\n): Promise<CapabilityStateRow[]> {\n const reportableGroups = getReportableGroups(ctx);\n const orphanedRows = describeOrphanedSkills(ctx);\n if (reportableGroups.length === 0) {\n return orphanedRows.length > 0\n ? orphanedRows\n : [\n {\n capabilityId: PLUGIN_ID,\n resourceId: \"skill-groups:none\",\n label: \"skill groups\",\n state: \"absent\",\n detail: null,\n },\n ];\n }\n\n let installedSkillNames: Set<string>;\n try {\n installedSkillNames = await listInstalledSkillNames(ctx);\n } catch (error) {\n const detail =\n error instanceof Error ? error.message : \"skills list failed\";\n return reportableGroups.map((group) => ({\n capabilityId: PLUGIN_ID,\n resourceId: groupResourceId(group),\n label: group.label,\n state: \"unknown\" as const,\n detail,\n }));\n }\n\n const declinedGroupIds = declinedSkillGroupIds(ctx);\n\n const groupRows: CapabilityStateRow[] = [];\n for (const group of reportableGroups) {\n const resourceId = groupResourceId(group);\n const installedCount = group.skills.filter((skill) =>\n installedSkillNames.has(skill.skillName),\n ).length;\n\n if (installedCount < group.skills.length) {\n groupRows.push({\n capabilityId: PLUGIN_ID,\n resourceId,\n label: group.label,\n state:\n installedCount === 0 && declinedGroupIds.has(group.id)\n ? \"declined\"\n : \"absent\",\n detail: `${installedCount}/${group.skills.length} skills installed`,\n });\n continue;\n }\n\n const revisions = await reportGroupRevisions(ctx, group);\n groupRows.push({\n capabilityId: PLUGIN_ID,\n resourceId,\n label: group.label,\n state: presentGroupState(ctx, group, revisions),\n detail: [\n `${group.skills.length} skill(s)`,\n ...describeGroupRevisions(revisions),\n ].join(\"; \"),\n });\n }\n return [...groupRows, ...orphanedRows];\n}\n\nfunction describeSkillSource(entry: SkillBundleEntry): string {\n if (entry.pinnedRepository) {\n return `${entry.pinnedRepository.url} at ${entry.pinnedRepository.commit}`;\n }\n return entry.localSourcePath ?? BUILT_IN_SOURCE_DESCRIPTION;\n}\n\nasync function fingerprintLocalSkills(\n ctx: Context,\n group: SkillGroup,\n): Promise<Map<string, string>> {\n const fingerprints = new Map<string, string>();\n for (const entry of group.skills) {\n if (entry.localSourcePath !== undefined) {\n const localSkill = await readLocalSkill(\n ctx.cwd,\n entry.localSourcePath,\n entry.skillName,\n );\n fingerprints.set(entry.skillName, localSkill.fingerprint);\n }\n }\n return fingerprints;\n}\n\nfunction combineLocalFingerprints(\n fingerprints: Map<string, string>,\n): string | null {\n return fingerprints.size === 0\n ? null\n : fingerprintJson([...fingerprints.entries()]);\n}\n\nfunction groupResourceId(group: SkillGroup): string {\n return `${\n group.definedByRepository\n ? CUSTOM_SKILL_GROUP_RESOURCE_PREFIX\n : SKILL_GROUP_RESOURCE_PREFIX\n }${group.id}`;\n}\n\nfunction skillUpdatesFingerprint(updates: SkillUpdate[]): string {\n return fingerprintJson(\n updates.map((update) => [\n update.name,\n update.installedFingerprint,\n update.currentFingerprint,\n ]),\n );\n}\n\nasync function findSkillUpdates(\n ctx: Context,\n group: SkillGroup,\n classify: typeof classifyInstalledSkill,\n): Promise<SkillUpdate[]> {\n const updates: SkillUpdate[] = [];\n for (const entry of group.skills) {\n if (!isUpdatableBundledSkill(ctx, group, entry)) {\n continue;\n }\n const classification = await classify(ctx, entry);\n if (classification.kind === \"outdated\") {\n updates.push({\n name: entry.skillName,\n installedFingerprint: classification.installedFingerprint,\n currentFingerprint: classification.currentFingerprint,\n });\n }\n }\n return updates;\n}\n\nasync function describeGroupInstall(\n ctx: Context,\n group: SkillGroup,\n updates: SkillUpdate[],\n): Promise<ProposedOperation> {\n const localFingerprints = await fingerprintLocalSkills(ctx, group);\n const updatedNames = new Set(updates.map((update) => update.name));\n const skillLines = group.skills.map((entry) => {\n const localFingerprint = localFingerprints.get(entry.skillName);\n const contentNote =\n localFingerprint === undefined\n ? \"\"\n : ` in this repository, content sha256 ${localFingerprint.slice(0, 16)}`;\n const updateNote = updatedNames.has(entry.skillName)\n ? UPDATE_PREVIEW_NOTE\n : \"\";\n return `${entry.skillName} — ${describeSkillSource(entry)}${contentNote}${updateNote}`;\n });\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: groupResourceId(group),\n targetPath: \"\",\n action: \"install-package\",\n riskClass: \"executes\",\n requiresConsent: true,\n expectedFingerprint:\n updates.length > 0\n ? skillUpdatesFingerprint(updates)\n : combineLocalFingerprints(localFingerprints),\n preview: {\n kind: \"note\",\n text: [`${group.label}:`, ...skillLines].join(\"\\n\"),\n },\n ...(updates.length > 0 ? { updates } : {}),\n });\n}\n\nfunction describeGroupDecline(group: SkillGroup): ProposedOperation {\n return describeOperation({\n capabilityId: PLUGIN_ID,\n resourceId: groupResourceId(group),\n targetPath: \"\",\n action: \"skip\",\n riskClass: \"inert\",\n requiresConsent: true,\n preview: { kind: \"note\", text: DECLINED_GROUP_PREVIEW },\n });\n}\n\nasync function findGroupsMissingSkills(\n ctx: Context,\n recordedGroups: SkillGroup[],\n): Promise<SkillGroup[]> {\n if (recordedGroups.length === 0) {\n return [];\n }\n const installedSkillNames = await listInstalledSkillNames(ctx);\n return recordedGroups.filter((group) =>\n group.skills.some((entry) => !installedSkillNames.has(entry.skillName)),\n );\n}\n\nfunction selectGroups(\n ctx: Context,\n recordedGroups: SkillGroup[],\n): Promise<GroupSelection> {\n const customGroups = getCustomGroups(ctx);\n return recordedGroups.length === 0\n ? selectGroupsForFreshInstall(ctx, customGroups)\n : selectNewlyOfferedGroups(ctx, customGroups, getUnofferedGroups(ctx));\n}\n\nasync function planSkills(ctx: Context): Promise<ProposedOperation[]> {\n const recordedGroups = getRecordedGroups(ctx);\n const selection = await selectGroups(ctx, recordedGroups);\n const updatesByGroupId = new Map<string, SkillUpdate[]>();\n for (const group of recordedGroups) {\n const updates = await findSkillUpdates(\n ctx,\n group,\n classifyInstalledSkillForReport,\n );\n if (updates.length > 0) {\n updatesByGroupId.set(group.id, updates);\n }\n }\n const groupIdsToInstall = new Set([\n ...[\n ...(await findGroupsMissingSkills(ctx, recordedGroups)),\n ...selection.chosen,\n ].map((group) => group.id),\n ...updatesByGroupId.keys(),\n ]);\n const availableGroups = getAvailableGroups(ctx);\n const groupsToInstall = availableGroups.filter((group) =>\n groupIdsToInstall.has(group.id),\n );\n const declinedGroups = selection.offered.filter(\n (group) => !groupIdsToInstall.has(group.id),\n );\n\n const operations: ProposedOperation[] = [];\n for (const group of groupsToInstall) {\n operations.push(\n await describeGroupInstall(\n ctx,\n group,\n updatesByGroupId.get(group.id) ?? [],\n ),\n );\n }\n operations.push(...declinedGroups.map(describeGroupDecline));\n return operations;\n}\n\nasync function recordDeclinedGroups(\n ctx: Context,\n declinedGroups: SkillGroup[],\n): Promise<void> {\n for (const group of declinedGroups) {\n for (const type of [\n ACTION_TYPE_OFFERED_SKILL_GROUP,\n ACTION_TYPE_DECLINED_SKILL_GROUP,\n ]) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type,\n target: group.id,\n preExisting: false,\n });\n }\n }\n}\n\nasync function fetchPinnedSources(\n ctx: Context,\n entries: SkillBundleEntry[],\n): Promise<void> {\n const fetchesByCommit = new Map<\n string,\n { repository: PinnedSkillsRepository; skillNames: string[] }\n >();\n for (const { pinnedRepository, skillName } of entries) {\n if (pinnedRepository) {\n const pendingFetch = fetchesByCommit.get(pinnedRepository.commit) ?? {\n repository: pinnedRepository,\n skillNames: [],\n };\n pendingFetch.skillNames.push(skillName);\n fetchesByCommit.set(pinnedRepository.commit, pendingFetch);\n }\n }\n for (const { repository, skillNames } of fetchesByCommit.values()) {\n await fetchPinnedSkillsSource(ctx, repository, skillNames);\n }\n}\n\nasync function assertFetchedSkillNames(\n entries: SkillBundleEntry[],\n): Promise<void> {\n for (const { pinnedRepository, skillName } of entries) {\n if (pinnedRepository) {\n const manifest = await readRegularFileIfExists(\n join(\n resolvePinnedSkillPath(pinnedRepository, skillName),\n SKILL_MANIFEST_PATH,\n ),\n );\n assertSkillManifestName(\n manifest ?? \"\",\n skillName,\n `${pinnedRepository.url} at ${pinnedRepository.commit}`,\n );\n }\n }\n}\n\ninterface GroupInstall {\n group: SkillGroup;\n operation: ProposedOperation;\n}\n\nasync function stageLocalSkills(\n ctx: Context,\n stageDirectory: string,\n { group, operation }: GroupInstall,\n): Promise<Map<string, string>> {\n const stagedPaths = new Map<string, string>();\n const fingerprints = new Map<string, string>();\n for (const entry of group.skills) {\n if (entry.localSourcePath !== undefined) {\n const localSkill = await readLocalSkill(\n ctx.cwd,\n entry.localSourcePath,\n entry.skillName,\n );\n fingerprints.set(entry.skillName, localSkill.fingerprint);\n stagedPaths.set(\n entry.skillName,\n await writeStagedSkill(stageDirectory, entry.skillName, localSkill),\n );\n }\n }\n if (\n group.definedByRepository &&\n combineLocalFingerprints(fingerprints) !== operation.expectedFingerprint\n ) {\n throw new Error(\n `The custom skill group '${group.id}' changed since it was planned. Re-run 'agemon plan' and review it again.`,\n );\n }\n return stagedPaths;\n}\n\ninterface PlannedSkillUpdate {\n group: SkillGroup;\n entry: SkillBundleEntry;\n update: SkillUpdate;\n}\n\nfunction changedSincePlanned(group: SkillGroup): Error {\n return new Error(\n `The skill group '${group.id}' changed since it was planned. Re-run 'agemon plan' and review it again.`,\n );\n}\n\nasync function confirmPlannedUpdates({\n ctx,\n group,\n operation,\n}: GroupInstall & { ctx: Context }): Promise<PlannedSkillUpdate[]> {\n if ((operation.updates ?? []).length === 0) {\n return [];\n }\n const updates = await findSkillUpdates(ctx, group, classifyInstalledSkill);\n if (skillUpdatesFingerprint(updates) !== operation.expectedFingerprint) {\n throw changedSincePlanned(group);\n }\n return updates.flatMap((update) => {\n const entry = group.skills.find(\n (candidate) => candidate.skillName === update.name,\n );\n return entry === undefined ? [] : [{ group, entry, update }];\n });\n}\n\nasync function assertStillOutdatedAsPlanned(\n ctx: Context,\n { group, entry, update }: PlannedSkillUpdate,\n): Promise<void> {\n const classification = await classifyInstalledSkill(ctx, entry);\n if (\n classification.kind !== \"outdated\" ||\n classification.installedFingerprint !== update.installedFingerprint\n ) {\n throw changedSincePlanned(group);\n }\n}\n\nasync function discardHalfWrittenCopy(\n ctx: Context,\n { update }: PlannedSkillUpdate,\n): Promise<string> {\n const installed = await installedSkillFingerprint(ctx, update.name);\n if (installed === update.installedFingerprint) {\n return `${CLAUDE_SKILLS_DIRECTORY}/${update.name} is unchanged`;\n }\n await removeInstalledSkillCopy(ctx.cwd, update.name);\n return `agemon removed ${CLAUDE_SKILLS_DIRECTORY}/${update.name} so the next run reinstalls it`;\n}\n\nasync function updateSkills(\n ctx: Context,\n plannedUpdates: PlannedSkillUpdate[],\n): Promise<void> {\n if (plannedUpdates.length === 0) {\n return;\n }\n const entriesToUpdate = plannedUpdates.map(({ entry }) => entry);\n await fetchPinnedSources(ctx, entriesToUpdate);\n await prepareSkillsCliTargets(\n ctx.cwd,\n entriesToUpdate.map((entry) => entry.skillName),\n );\n for (const plannedUpdate of plannedUpdates) {\n const { entry } = plannedUpdate;\n await assertStillOutdatedAsPlanned(ctx, plannedUpdate);\n const addResult = await runSkillsCli(\n ctx,\n [\n \"add\",\n entry.source,\n \"--skill\",\n entry.skillName,\n \"--agent\",\n entry.agent,\n \"--yes\",\n ],\n SKILLS_ADD_TIMEOUT_MS,\n );\n if (addResult.code !== 0) {\n const outcome = await discardHalfWrittenCopy(ctx, plannedUpdate);\n throw new Error(\n `skills add failed for ${printable(entry.skillName)}: ${describeSubprocessFailure(addResult, \"skills add\")}. ${outcome}.`,\n );\n }\n const installed = await installedSkillFingerprint(ctx, entry.skillName);\n if (installed !== (await currentSkillFingerprint(entry))) {\n await removeInstalledSkillCopy(ctx.cwd, entry.skillName);\n throw new Error(\n `The skills CLI installed ${entry.skillName} with different content than agemon bundles; agemon removed ${CLAUDE_SKILLS_DIRECTORY}/${entry.skillName} so the next run reinstalls it.`,\n );\n }\n ctx.ui.info(\n `Updated skill ${entry.skillName} to the version bundled with this agemon`,\n );\n }\n}\n\nasync function addSkills(\n ctx: Context,\n entriesToAdd: SkillBundleEntry[],\n stagedPaths: Map<string, string>,\n): Promise<void> {\n await fetchPinnedSources(ctx, entriesToAdd);\n await assertFetchedSkillNames(\n entriesToAdd.filter((entry) => customSkillNames(ctx).has(entry.skillName)),\n );\n await recordCreatedDirectories(\n ctx,\n await prepareSkillsCliTargets(\n ctx.cwd,\n entriesToAdd.map((entry) => entry.skillName),\n ),\n );\n for (const entry of entriesToAdd) {\n const addResult = await runSkillsCli(\n ctx,\n [\n \"add\",\n stagedPaths.get(entry.skillName) ?? entry.source,\n \"--skill\",\n entry.skillName,\n \"--agent\",\n entry.agent,\n \"--yes\",\n ],\n SKILLS_ADD_TIMEOUT_MS,\n );\n if (addResult.code !== 0) {\n throw new Error(\n `skills add failed for ${printable(entry.skillName)}: ${describeSubprocessFailure(addResult, \"skills add\")}`,\n );\n }\n\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_INSTALLED_SKILL,\n target: entry.skillName,\n preExisting: false,\n fingerprintAfter: customSkillNames(ctx).has(entry.skillName)\n ? await verifiedCustomInstallFingerprint(\n ctx,\n entry,\n stagedPaths.get(entry.skillName),\n )\n : null,\n });\n }\n}\n\nfunction customSkillNames(ctx: Context): Set<string> {\n return new Set(\n flattenSkills(getCustomGroups(ctx)).map((entry) => entry.skillName),\n );\n}\n\nasync function installGroups(\n ctx: Context,\n groupInstalls: GroupInstall[],\n stageDirectory: string,\n): Promise<void> {\n const stagedPaths = new Map<string, string>();\n for (const groupInstall of groupInstalls) {\n for (const [skillName, path] of await stageLocalSkills(\n ctx,\n stageDirectory,\n groupInstall,\n )) {\n stagedPaths.set(skillName, path);\n }\n }\n\n const plannedUpdates: PlannedSkillUpdate[] = [];\n for (const groupInstall of groupInstalls) {\n plannedUpdates.push(\n ...(await confirmPlannedUpdates({ ...groupInstall, ctx })),\n );\n }\n\n const skillsLockPreviouslyExisted = existsSync(getSkillsLockPath(ctx.cwd));\n const installedSkillNames = await listInstalledSkillNames(ctx);\n const entriesToAdd: SkillBundleEntry[] = [];\n for (const entry of flattenSkills(groupInstalls.map(({ group }) => group))) {\n if (!installedSkillNames.has(entry.skillName)) {\n entriesToAdd.push(entry);\n } else if (!hasAnyRecordForSkill(ctx, entry.skillName)) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_PREEXISTING_SKILL,\n target: entry.skillName,\n preExisting: true,\n });\n }\n }\n\n try {\n await withAgemonStateLock(\n \"skills-src.lock\",\n async () => {\n await addSkills(ctx, entriesToAdd, stagedPaths);\n await updateSkills(ctx, plannedUpdates);\n },\n SKILLS_SOURCE_LOCK_WAIT_MS,\n );\n } finally {\n forgetSkillClassifications(ctx);\n }\n\n const skillsLockExistsAfterInstall = existsSync(getSkillsLockPath(ctx.cwd));\n if (\n !skillsLockPreviouslyExisted &&\n skillsLockExistsAfterInstall &&\n !hasManagedSkillsLockRecord(ctx)\n ) {\n await ctx.manifest.recordAction({\n plugin: PLUGIN_ID,\n type: ACTION_TYPE_GENERATED_SKILLS_LOCK,\n target: SKILLS_LOCK_FILE,\n preExisting: false,\n });\n await recordGitignoreLine(\n ctx,\n SKILLS_LOCK_GITIGNORE_ENTRY,\n await ensureGitignoreEntry(ctx.cwd, SKILLS_LOCK_GITIGNORE_ENTRY),\n );\n }\n}\n\nfunction findOperationGroup(\n availableGroups: SkillGroup[],\n operation: ProposedOperation,\n): SkillGroup {\n const group = availableGroups.find(\n (candidate) => groupResourceId(candidate) === operation.resourceId,\n );\n if (group === undefined) {\n throw new Error(\n `The plan names skill group resource '${printable(operation.resourceId)}', which agemon does not know. Re-run 'agemon plan'.`,\n );\n }\n return group;\n}\n\nasync function applySkills(\n ctx: Context,\n operations: ProposedOperation[],\n): Promise<undefined> {\n const availableGroups = getAvailableGroups(ctx);\n const groupInstalls: GroupInstall[] = [];\n const declinedGroups: SkillGroup[] = [];\n for (const operation of operations) {\n const group = findOperationGroup(availableGroups, operation);\n if (operation.action === \"install-package\") {\n groupInstalls.push({ group, operation });\n } else if (operation.action === \"skip\") {\n declinedGroups.push(group);\n } else {\n throw new Error(\n `The skills capability does not ${operation.action} '${printable(operation.resourceId)}'.`,\n );\n }\n }\n\n await recordDeclinedGroups(ctx, declinedGroups);\n if (groupInstalls.length > 0) {\n await withSkillsStage((stageDirectory) =>\n installGroups(ctx, groupInstalls, stageDirectory),\n );\n }\n}\n\nasync function verifySkills(ctx: Context): Promise<PluginVerificationResult> {\n if (ctx.dryRun) {\n return { ok: true, detail: \"dry-run\" };\n }\n\n const recordedGroups = getRecordedGroups(ctx);\n const recordedEntries = flattenSkills(recordedGroups);\n if (recordedEntries.length === 0) {\n return { ok: false, detail: \"No skill groups installed yet\" };\n }\n\n const installedSkillNames = await listInstalledSkillNames(ctx);\n const missingSkillNames = recordedEntries\n .map((entry) => entry.skillName)\n .filter((skillName) => !installedSkillNames.has(skillName));\n\n if (missingSkillNames.length > 0) {\n return {\n ok: false,\n detail: `Missing skill(s): ${missingSkillNames.join(\", \")}`,\n };\n }\n\n const outdatedNames: string[] = [];\n for (const group of recordedGroups) {\n const revisions = await reportGroupRevisions(ctx, group);\n outdatedNames.push(...revisions.outdatedNames);\n for (const keptSkill of revisions.kept) {\n ctx.ui.info(printable(describeKeptSkill(keptSkill)));\n }\n }\n return {\n ok: true,\n detail: `${recordedGroups.length} skill group(s), ${recordedEntries.length} skill(s) present`,\n ...(outdatedNames.length > 0\n ? {\n attention: `a newer bundled version of ${outdatedNames.join(\", \")} is available; run agemon`,\n }\n : {}),\n };\n}\n\nfunction reportUnconfirmedSkills(\n ctx: Context,\n installEntries: LedgerEntry[],\n confirmedEntries: LedgerEntry[],\n): void {\n const confirmedNames = new Set(confirmedEntries.map((entry) => entry.target));\n const presentSkillDirectories = (name: string) =>\n [CLAUDE_SKILLS_DIRECTORY, CANONICAL_SKILLS_DIRECTORY]\n .map((directory) => `${directory}/${name}`)\n .filter((directory) => existsSync(join(ctx.cwd, directory)));\n const keptNames = [\n ...new Set(\n installEntries\n .map((entry) => entry.target)\n .filter(\n (name) =>\n !confirmedNames.has(name) &&\n isPlainSkillName(name) &&\n presentSkillDirectories(name).length > 0,\n ),\n ),\n ];\n if (keptNames.length === 0) {\n return;\n }\n const directories = keptNames.flatMap(presentSkillDirectories);\n ctx.ui.info(\n `${ctx.dryRun ? \"Would keep\" : \"Keeping\"} skills that agemon has no record of installing in this repository on this machine: ${keptNames.join(\", \")}. If you don't need them, delete ${directories.join(\", \")}.`,\n );\n}\n\nfunction recordedInstallFingerprints(\n confirmedInstallEntries: LedgerEntry[],\n skillName: string,\n): string[] {\n return confirmedInstallEntries\n .filter((action) => action.target === skillName)\n .map((action) => action.fingerprintAfter)\n .filter((fingerprint) => fingerprint !== null);\n}\n\nasync function revertSkills(\n ctx: Context,\n entries: LedgerEntry[],\n): Promise<void> {\n const installEntries = entries.filter(\n (action) =>\n action.type === ACTION_TYPE_INSTALLED_SKILL &&\n action.preExisting === false,\n );\n const managedActions = installEntries.filter((action) =>\n ctx.manifest.isConfirmed(action),\n );\n const lockEntries = entries.filter(isManagedSkillsLockEntry);\n const shouldRemoveManagedSkillsLock = lockEntries.some((action) =>\n ctx.manifest.isConfirmed(action),\n );\n reportUnconfirmedSkills(ctx, installEntries, managedActions);\n if (lockEntries.length > 0 && !shouldRemoveManagedSkillsLock) {\n ctx.ui.info(\n `${ctx.dryRun ? \"Would keep\" : \"Keeping\"} ${SKILLS_LOCK_FILE}: agemon has no record on this machine that it created it.`,\n );\n }\n\n const managedSkillNames = new Set(\n managedActions.map((action) => action.target),\n );\n const forgedName = [...managedSkillNames].find(\n (skillName) => !isPlainSkillName(skillName),\n );\n if (forgedName !== undefined) {\n throw new RefusedPathError(\n `Refusing to remove the skill '${printable(forgedName)}': it is not a plain skill name. The ledger in .agemon/state.json may have been edited; check it before running agemon again.`,\n );\n }\n\n const removedNames: string[] = [];\n const failures: string[] = [];\n for (const skillName of managedSkillNames) {\n const entry = flattenSkills(getAvailableGroups(ctx)).find(\n (candidate) => candidate.skillName === skillName,\n );\n const agemonFingerprints = await fingerprintsAgemonInstalled(\n skillName,\n entry,\n recordedInstallFingerprints(managedActions, skillName),\n );\n const removal = await removeAgemonSkillCopy(ctx, skillName, (fingerprint) =>\n agemonFingerprints.has(fingerprint),\n );\n if (removal.kind === \"failed\") {\n failures.push(removal.detail);\n continue;\n }\n if (removal.kind === \"removed\" || removal.kind === \"gone\") {\n removedNames.push(skillName);\n const shipped = new Set(shippedFingerprints(skillName));\n await reportLeftCanonicalCopy(ctx, skillName, (fingerprint) =>\n shipped.has(fingerprint),\n );\n }\n }\n await removeSkillsFromLock(ctx, removedNames, shouldRemoveManagedSkillsLock);\n if (failures.length > 0) {\n throw new Error(\n `Could not remove skill copies — ${failures.join(\"; \")}. Fix the cause and run 'agemon nuke' again.`,\n );\n }\n}\n\nasync function uninstallSkills(ctx: Context): Promise<void> {\n await revertSkills(ctx, skillsLedgerEntries(ctx));\n}\n\nasync function describeKeptUpdates(\n ctx: Context,\n operations: ProposedOperation[],\n): Promise<string[]> {\n const lines: string[] = [];\n for (const update of operations.flatMap(\n (operation) => operation.updates ?? [],\n )) {\n const installed = await installedSkillFingerprint(ctx, update.name);\n if (\n installed === update.currentFingerprint &&\n installed !== update.installedFingerprint\n ) {\n lines.push(`updated skill ${update.name} (agemon's newer version)`);\n }\n }\n return lines;\n}\n\nexport const skillsPlugin: AgemonPlugin = {\n id: PLUGIN_ID,\n riskClass: \"executes\",\n detect: detectSkills,\n describeState: describeSkillsState,\n plan: planSkills,\n apply: applySkills,\n verify: verifySkills,\n revert: revertSkills,\n describeKeptAfterRollback: describeKeptUpdates,\n uninstall: uninstallSkills,\n};\n","import { multiselect } from \"@clack/prompts\";\nimport type { Context } from \"../../core/context.js\";\nimport { assertNotCancelled } from \"../../core/prompt-clack.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport { SKILL_GROUPS, type SkillGroup } from \"./catalog.js\";\n\nconst ALL_GROUPS_KEYWORD = \"all\";\nconst NO_GROUPS_KEYWORD = \"none\";\n\nexport interface GroupSelection {\n chosen: SkillGroup[];\n offered: SkillGroup[];\n}\n\nfunction parseExplicitGroupIds(raw: string): string[] {\n return raw\n .split(\",\")\n .map((id) => id.trim())\n .filter((id) => id.length > 0);\n}\n\nfunction defaultGroups(): SkillGroup[] {\n return SKILL_GROUPS.filter((group) => group.defaultSelected);\n}\n\nfunction optionalGroups(customGroups: SkillGroup[]): SkillGroup[] {\n return [\n ...SKILL_GROUPS.filter((group) => !group.defaultSelected),\n ...customGroups,\n ];\n}\n\nfunction isKeyword(skillGroupsOption: string): boolean {\n const keyword = skillGroupsOption.trim().toLowerCase();\n return keyword === ALL_GROUPS_KEYWORD || keyword === NO_GROUPS_KEYWORD;\n}\n\nfunction resolveNamedGroups(\n skillGroupsOption: string,\n customGroups: SkillGroup[],\n): SkillGroup[] {\n const groupById = new Map(\n [...SKILL_GROUPS, ...customGroups].map((group) => [group.id, group]),\n );\n const requestedIds = parseExplicitGroupIds(skillGroupsOption);\n const unknownIds = requestedIds.filter((id) => !groupById.has(id));\n if (unknownIds.length > 0) {\n throw new Error(`Unknown skill group id(s): ${unknownIds.join(\", \")}`);\n }\n return requestedIds.map((id) => groupById.get(id) as SkillGroup);\n}\n\nfunction resolveExplicitGroups(\n skillGroupsOption: string,\n customGroups: SkillGroup[],\n): SkillGroup[] {\n const keyword = skillGroupsOption.trim().toLowerCase();\n if (keyword === NO_GROUPS_KEYWORD) {\n return defaultGroups();\n }\n if (keyword === ALL_GROUPS_KEYWORD) {\n return SKILL_GROUPS;\n }\n\n const combinedGroups = new Map(\n [\n ...defaultGroups(),\n ...resolveNamedGroups(skillGroupsOption, customGroups),\n ].map((group) => [group.id, group]),\n );\n return [...combinedGroups.values()];\n}\n\nasync function promptForOptionalGroups(\n message: string,\n groupsToOffer: SkillGroup[],\n): Promise<SkillGroup[]> {\n const selectedIds = assertNotCancelled(\n await multiselect<string>({\n message,\n options: groupsToOffer.map((group) => ({\n value: group.id,\n label: `${printable(group.label)} (${group.skills.length})`,\n hint: group.description,\n })),\n required: false,\n initialValues: [],\n }),\n );\n\n return groupsToOffer.filter((group) => selectedIds.includes(group.id));\n}\n\nexport async function selectGroupsForFreshInstall(\n ctx: Context,\n customGroups: SkillGroup[],\n): Promise<GroupSelection> {\n if (ctx.skillGroupsOption !== undefined) {\n return {\n chosen: resolveExplicitGroups(ctx.skillGroupsOption, customGroups),\n offered: [],\n };\n }\n\n if (ctx.dryRun) {\n return { chosen: defaultGroups(), offered: [] };\n }\n\n if (ctx.yes) {\n return { chosen: [...SKILL_GROUPS], offered: [] };\n }\n\n if (!ctx.interactive) {\n return { chosen: defaultGroups(), offered: [] };\n }\n\n const groupsToOffer = optionalGroups(customGroups);\n const selected = await promptForOptionalGroups(\n \"Optional skill groups to install\",\n groupsToOffer,\n );\n return { chosen: [...defaultGroups(), ...selected], offered: groupsToOffer };\n}\n\nexport async function selectNewlyOfferedGroups(\n ctx: Context,\n customGroups: SkillGroup[],\n unofferedGroups: SkillGroup[],\n): Promise<GroupSelection> {\n const option = ctx.skillGroupsOption;\n const namedIds = new Set(\n option === undefined || isKeyword(option)\n ? []\n : resolveNamedGroups(option, customGroups).map((group) => group.id),\n );\n const named = unofferedGroups.filter((group) => namedIds.has(group.id));\n const remaining = unofferedGroups.filter((group) => !namedIds.has(group.id));\n const remainingBuiltIn = remaining.filter(\n (group) => !customGroups.includes(group),\n );\n\n if (remaining.length === 0 || ctx.dryRun) {\n return { chosen: named, offered: [] };\n }\n\n if (!ctx.interactive) {\n return { chosen: named, offered: ctx.yes ? remainingBuiltIn : [] };\n }\n\n if (ctx.yes) {\n return { chosen: [...named, ...remainingBuiltIn], offered: [] };\n }\n\n const selected = await promptForOptionalGroups(\n \"New optional skill groups to install\",\n remaining,\n );\n return { chosen: [...named, ...selected], offered: remaining };\n}\n","import { mkdir, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n resolveInsideRepo,\n resolveRepoDirectory,\n} from \"../../core/repo-paths.js\";\nimport { preparePrivateStateDirectory } from \"../../core/state-root.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport { assertSkillManifestName } from \"./skill-manifest.js\";\nimport {\n fingerprintSkillTree,\n readSkillTree,\n type SkillTreeEntry,\n SkillTreeRefusal,\n} from \"./skill-tree.js\";\n\nconst SKILL_MANIFEST_FILE = \"SKILL.md\";\nconst STAGE_DIRECTORY_NAME = \"skills-stage\";\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\n\nexport interface LocalSkill {\n entries: SkillTreeEntry[];\n fingerprint: string;\n}\n\nfunction refuseLocalSkill(sourcePath: string, reason: string): never {\n throw new Error(\n `Refusing to install the custom skill ${printable(sourcePath)}: ${reason}.`,\n );\n}\n\nasync function readLocalSkillTree(\n sourcePath: string,\n directory: string,\n): Promise<SkillTreeEntry[]> {\n try {\n return await readSkillTree(directory);\n } catch (error) {\n if (error instanceof SkillTreeRefusal) {\n refuseLocalSkill(sourcePath, error.message);\n }\n throw error;\n }\n}\n\nexport async function readLocalSkill(\n repoRoot: string,\n sourcePath: string,\n skillName: string,\n): Promise<LocalSkill> {\n const repoRelativePath = sourcePath.slice(\"./\".length);\n await resolveInsideRepo(repoRoot, repoRelativePath);\n const directory = await resolveRepoDirectory(repoRoot, repoRelativePath);\n if (directory === null) {\n refuseLocalSkill(sourcePath, \"the directory does not exist\");\n }\n\n const entries = await readLocalSkillTree(sourcePath, directory);\n const manifest = entries.find(\n (entry) => entry.relativePath === SKILL_MANIFEST_FILE,\n );\n if (manifest?.contents == null) {\n refuseLocalSkill(sourcePath, `it has no ${SKILL_MANIFEST_FILE}`);\n }\n assertSkillManifestName(\n manifest.contents.toString(\"utf8\"),\n skillName,\n sourcePath,\n );\n return { entries, fingerprint: fingerprintSkillTree(entries) };\n}\n\nexport async function writeStagedSkill(\n stageDirectory: string,\n skillName: string,\n skill: LocalSkill,\n): Promise<string> {\n const skillDirectory = join(stageDirectory, skillName);\n await mkdir(skillDirectory, { mode: PRIVATE_DIRECTORY_MODE });\n for (const entry of skill.entries) {\n const targetPath = join(skillDirectory, entry.relativePath);\n if (entry.contents === null) {\n await mkdir(targetPath, { mode: PRIVATE_DIRECTORY_MODE });\n } else {\n await writeFile(targetPath, entry.contents, {\n flag: \"wx\",\n mode: PRIVATE_FILE_MODE,\n });\n }\n }\n return skillDirectory;\n}\n\nexport async function withSkillsStage<Result>(\n work: (stageDirectory: string) => Promise<Result>,\n): Promise<Result> {\n const stageRoot = await preparePrivateStateDirectory(STAGE_DIRECTORY_NAME);\n const stageDirectory = await mkdtemp(join(stageRoot, \"run-\"));\n try {\n return await work(stageDirectory);\n } finally {\n await rm(stageDirectory, { recursive: true, force: true });\n }\n}\n","import { printable } from \"../../core/untrusted-text.js\";\n\nconst FRONTMATTER_PATTERN = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/u;\nconst NAME_LINE_PATTERN = /^name:[ \\t]*([\"']?)(.*?)\\1[ \\t]*$/gmu;\n\nexport function skillFrontmatter(manifest: string): string | undefined {\n return FRONTMATTER_PATTERN.exec(manifest)?.[1];\n}\n\nexport function declaredSkillName(manifest: string): string | null {\n const frontmatter = skillFrontmatter(manifest);\n const nameLines =\n frontmatter === undefined\n ? []\n : [...frontmatter.matchAll(NAME_LINE_PATTERN)];\n return nameLines.length === 1 ? nameLines[0][2] : null;\n}\n\nexport function assertSkillManifestName(\n manifest: string,\n expectedName: string,\n sourceLabel: string,\n): void {\n const declaredName = declaredSkillName(manifest);\n if (declaredName !== expectedName) {\n throw new Error(\n `Refusing to install the custom skill ${printable(sourceLabel)}: its SKILL.md names it '${printable(declaredName ?? \"(no single name)\")}', but agemon.toml expects '${expectedName}'. Make them match.`,\n );\n }\n}\n","import { randomBytes } from \"node:crypto\";\nimport type { Stats } from \"node:fs\";\nimport { lstat, realpath, rename, rm, unlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport {\n FileTooLargeError,\n MAX_READ_FILE_LABEL,\n RefusedFileError,\n readRegularFileIfExists,\n writeFileAtomic,\n} from \"../../core/files.js\";\nimport { resolveRepoDirectory } from \"../../core/repo-paths.js\";\nimport { printable } from \"../../core/untrusted-text.js\";\nimport { fingerprintInstalledSkill } from \"./skill-tree.js\";\nimport {\n CANONICAL_SKILLS_DIRECTORY,\n CLAUDE_SKILLS_DIRECTORY,\n SKILLS_LOCK_FILE,\n} from \"./skills-cli-targets.js\";\n\nconst DIFFERS_FROM_INSTALLED =\n \"it differs from every version agemon installed; delete it if you no longer need it.\";\nconst CHANGED_DURING_REMOVAL = \"it changed while agemon was removing it.\";\nconst QUARANTINE_PREFIX = \".agemon-removing-\";\nconst QUARANTINE_SUFFIX_BYTES = 8;\nconst SUPPORTED_LOCK_VERSION = 1;\n\nexport type SkillRemoval =\n | { kind: \"removed\" }\n | { kind: \"gone\" }\n | { kind: \"kept\" }\n | { kind: \"failed\"; detail: string };\n\ntype IsAgemonContent = (fingerprint: string) => boolean;\n\nasync function lstatIfPresent(path: string) {\n try {\n return await lstat(path);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nfunction keep(ctx: Context, skillName: string, reason: string): SkillRemoval {\n ctx.ui.info(\n `${ctx.dryRun ? \"Would keep\" : \"Keeping\"} ${CLAUDE_SKILLS_DIRECTORY}/${printable(skillName)}: ${reason}`,\n );\n return { kind: \"kept\" };\n}\n\nfunction removed(ctx: Context, skillName: string): SkillRemoval {\n if (ctx.dryRun) {\n ctx.ui.info(`Would remove skill ${printable(skillName)}`);\n }\n return { kind: \"removed\" };\n}\n\nasync function resolveSkillsDirectory(\n ctx: Context,\n relativeDirectory: string,\n): Promise<string | null | \"refused\"> {\n try {\n return await resolveRepoDirectory(ctx.cwd, relativeDirectory);\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return \"refused\";\n }\n throw error;\n }\n}\n\nasync function fingerprintIfReadable(\n directory: string,\n): Promise<string | null> {\n try {\n return await fingerprintInstalledSkill(directory);\n } catch {\n return null;\n }\n}\n\nasync function verifiedSkillsDirectory(ctx: Context): Promise<string | null> {\n const expected = join(await realpath(ctx.cwd), CLAUDE_SKILLS_DIRECTORY);\n const resolved = await resolveSkillsDirectory(ctx, CLAUDE_SKILLS_DIRECTORY);\n if (resolved === null || resolved === \"refused\") {\n return null;\n }\n return (await realpath(resolved)) === expected ? expected : null;\n}\n\nfunction isSameEntry(expected: Stats, actual: Stats | null): boolean {\n return (\n actual !== null &&\n actual.dev === expected.dev &&\n actual.ino === expected.ino\n );\n}\n\nfunction quarantineName(skillName: string): string {\n return `${QUARANTINE_PREFIX}${skillName}-${randomBytes(QUARANTINE_SUFFIX_BYTES).toString(\"hex\")}`;\n}\n\nasync function unlinkSymlinkedCopy(\n ctx: Context,\n skillName: string,\n linkStats: Stats,\n): Promise<SkillRemoval> {\n if (!ctx.dryRun) {\n const skillsDirectory = await verifiedSkillsDirectory(ctx);\n const linkPath =\n skillsDirectory === null ? null : join(skillsDirectory, skillName);\n if (\n linkPath === null ||\n !isSameEntry(linkStats, await lstatIfPresent(linkPath))\n ) {\n return keep(ctx, skillName, CHANGED_DURING_REMOVAL);\n }\n await unlink(linkPath);\n }\n ctx.ui.info(\n ctx.dryRun\n ? `Would remove the symlink ${CLAUDE_SKILLS_DIRECTORY}/${printable(skillName)}; its target is left alone.`\n : `Removed the symlink ${CLAUDE_SKILLS_DIRECTORY}/${printable(skillName)}; its target was left alone.`,\n );\n return { kind: \"removed\" };\n}\n\nasync function removeDirectoryCopy(\n ctx: Context,\n skillName: string,\n copyPath: string,\n copyStats: Stats,\n isAgemonContent: IsAgemonContent,\n): Promise<SkillRemoval> {\n const fingerprint = await fingerprintIfReadable(copyPath);\n if (fingerprint === null || !isAgemonContent(fingerprint)) {\n return keep(ctx, skillName, DIFFERS_FROM_INSTALLED);\n }\n if (ctx.dryRun) {\n return removed(ctx, skillName);\n }\n const skillsDirectory = await verifiedSkillsDirectory(ctx);\n if (skillsDirectory === null) {\n return keep(ctx, skillName, CHANGED_DURING_REMOVAL);\n }\n const verifiedCopyPath = join(skillsDirectory, skillName);\n const quarantine = quarantineName(skillName);\n const quarantinePath = join(skillsDirectory, quarantine);\n await rename(verifiedCopyPath, quarantinePath);\n const restoreCopy = () => rename(quarantinePath, verifiedCopyPath);\n try {\n const quarantinedStats = await lstatIfPresent(quarantinePath);\n const stillTheClassifiedCopy =\n quarantinedStats?.isDirectory() === true &&\n isSameEntry(copyStats, quarantinedStats) &&\n (await fingerprintIfReadable(quarantinePath)) === fingerprint;\n if (\n !stillTheClassifiedCopy ||\n (await verifiedSkillsDirectory(ctx)) !== skillsDirectory\n ) {\n await restoreCopy();\n return keep(ctx, skillName, CHANGED_DURING_REMOVAL);\n }\n await rm(quarantinePath, { recursive: true, force: true });\n } catch (error) {\n const restored = await restoreCopy().then(\n () => true,\n () => false,\n );\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n restored\n ? message\n : `${message}; agemon left the copy at ${CLAUDE_SKILLS_DIRECTORY}/${quarantine}`,\n );\n }\n return removed(ctx, skillName);\n}\n\nexport async function removeAgemonSkillCopy(\n ctx: Context,\n skillName: string,\n isAgemonContent: IsAgemonContent,\n): Promise<SkillRemoval> {\n try {\n const skillsDirectory = await resolveSkillsDirectory(\n ctx,\n CLAUDE_SKILLS_DIRECTORY,\n );\n if (skillsDirectory === \"refused\") {\n return keep(\n ctx,\n skillName,\n `${CLAUDE_SKILLS_DIRECTORY} is a symlink or not a real directory; agemon leaves it alone.`,\n );\n }\n if (skillsDirectory === null) {\n return { kind: \"gone\" };\n }\n const copyPath = join(skillsDirectory, skillName);\n const stats = await lstatIfPresent(copyPath);\n if (stats === null) {\n return { kind: \"gone\" };\n }\n if (stats.isSymbolicLink()) {\n return await unlinkSymlinkedCopy(ctx, skillName, stats);\n }\n if (!stats.isDirectory()) {\n return keep(\n ctx,\n skillName,\n \"it is not a directory; agemon leaves it alone.\",\n );\n }\n return await removeDirectoryCopy(\n ctx,\n skillName,\n copyPath,\n stats,\n isAgemonContent,\n );\n } catch (error) {\n return {\n kind: \"failed\",\n detail: `${CLAUDE_SKILLS_DIRECTORY}/${printable(skillName)}: ${printable(error instanceof Error ? error.message : String(error))}`,\n };\n }\n}\n\nexport async function reportLeftCanonicalCopy(\n ctx: Context,\n skillName: string,\n isShippedContent: IsAgemonContent,\n): Promise<void> {\n try {\n const canonicalDirectory = await resolveSkillsDirectory(\n ctx,\n CANONICAL_SKILLS_DIRECTORY,\n );\n if (canonicalDirectory === null || canonicalDirectory === \"refused\") {\n return;\n }\n const copyPath = join(canonicalDirectory, skillName);\n if (!(await lstatIfPresent(copyPath))?.isDirectory()) {\n return;\n }\n const fingerprint = await fingerprintIfReadable(copyPath);\n if (fingerprint !== null && isShippedContent(fingerprint)) {\n ctx.ui.info(\n `Left ${CANONICAL_SKILLS_DIRECTORY}/${printable(skillName)}: agemon's skills CLI no longer writes it; remove it if you no longer need it.`,\n );\n }\n } catch {\n // The note is informational; a .agents copy agemon can't read is simply not mentioned.\n }\n}\n\ninterface SkillsLock {\n version: number;\n skills: Record<string, unknown>;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction parseSkillsLock(contents: string): SkillsLock | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch {\n return null;\n }\n if (\n !isPlainObject(parsed) ||\n typeof parsed.version !== \"number\" ||\n parsed.version !== SUPPORTED_LOCK_VERSION ||\n !isPlainObject(parsed.skills)\n ) {\n return null;\n }\n return parsed as unknown as SkillsLock;\n}\n\nexport async function removeSkillsFromLock(\n ctx: Context,\n removedNames: string[],\n agemonOwnsLock: boolean,\n): Promise<void> {\n if (removedNames.length === 0 && !agemonOwnsLock) {\n return;\n }\n const lockPath = join(ctx.cwd, SKILLS_LOCK_FILE);\n const stats = await lstatIfPresent(lockPath);\n if (stats === null) {\n return;\n }\n if (!stats.isFile()) {\n ctx.ui.info(`Keeping ${SKILLS_LOCK_FILE}: it is not a regular file.`);\n return;\n }\n let contents: string | null;\n try {\n contents = await readRegularFileIfExists(lockPath);\n } catch (error) {\n if (!(error instanceof RefusedFileError)) {\n throw error;\n }\n ctx.ui.info(\n error instanceof FileTooLargeError\n ? `Keeping ${SKILLS_LOCK_FILE}: it is too large for agemon to read (over ${MAX_READ_FILE_LABEL}).`\n : `Keeping ${SKILLS_LOCK_FILE}: it is not a regular file.`,\n );\n return;\n }\n const lock = contents === null ? null : parseSkillsLock(contents);\n if (lock === null) {\n ctx.ui.info(\n removedNames.length === 0\n ? `Keeping ${SKILLS_LOCK_FILE}: it has a format agemon doesn't know.`\n : `${SKILLS_LOCK_FILE} has a format agemon doesn't know; it may still list ${removedNames.map(printable).join(\", \")}.`,\n );\n return;\n }\n\n const listedNames = removedNames.filter((name) =>\n Object.hasOwn(lock.skills, name),\n );\n for (const name of listedNames) {\n delete lock.skills[name];\n }\n const deletesFile = agemonOwnsLock && Object.keys(lock.skills).length === 0;\n if (listedNames.length === 0 && !deletesFile) {\n return;\n }\n if (ctx.dryRun) {\n ctx.ui.info(\n deletesFile\n ? `Would delete ${SKILLS_LOCK_FILE}`\n : `Would remove ${listedNames.map(printable).join(\", \")} from ${SKILLS_LOCK_FILE}`,\n );\n return;\n }\n if (deletesFile) {\n if ((await lstatIfPresent(lockPath))?.isFile()) {\n await rm(lockPath, { force: true });\n }\n return;\n }\n await writeFileAtomic(lockPath, `${JSON.stringify(lock, null, 2)}\\n`);\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Context } from \"../../core/context.js\";\nimport {\n fakePinnedSkillFingerprint,\n fakeSubprocessesActive,\n} from \"../../core/fake-pinned-skills.js\";\nimport { RefusedFileError } from \"../../core/files.js\";\nimport { resolveRepoDirectory } from \"../../core/repo-paths.js\";\nimport { ESSENTIALS_SKILLS_COMMIT } from \"../pins.js\";\nimport { BUNDLE_FINGERPRINTS } from \"./bundle-fingerprints.js\";\nimport type { SkillBundleEntry } from \"./catalog.js\";\nimport {\n isPristinePinnedCheckout,\n resolvePinnedSkillPath,\n} from \"./pinned-source.js\";\nimport {\n fingerprintInstalledSkill,\n fingerprintSkillSource,\n SkillTreeRefusal,\n} from \"./skill-tree.js\";\nimport {\n CANONICAL_SKILLS_DIRECTORY,\n CLAUDE_SKILLS_DIRECTORY,\n} from \"./skills-cli-targets.js\";\n\nexport type SkillClassification =\n | { kind: \"current\" }\n | {\n kind: \"outdated\";\n installedFingerprint: string;\n currentFingerprint: string;\n }\n | { kind: \"kept\"; reason: string };\n\nconst DIFFERS_FROM_EVERY_VERSION = \"differs from every version agemon shipped\";\n\nconst vendoredFingerprintsBySource = new Map<string, Promise<string | null>>();\nconst reportClassifications = new WeakMap<\n Context,\n Map<string, Promise<SkillClassification>>\n>();\n\nfunction kept(reason: string): SkillClassification {\n return { kind: \"kept\", reason };\n}\n\nfunction vendoredSourceFingerprint(source: string): Promise<string | null> {\n let pending = vendoredFingerprintsBySource.get(source);\n if (pending === undefined) {\n pending = fingerprintSkillSource(source).catch(() => null);\n vendoredFingerprintsBySource.set(source, pending);\n }\n return pending;\n}\n\nexport async function currentSkillFingerprint(\n entry: SkillBundleEntry,\n): Promise<string | null> {\n if (entry.localSourcePath !== undefined) {\n return null;\n }\n if (entry.pinnedRepository !== undefined) {\n const isEssentialsPin =\n entry.pinnedRepository.commit === ESSENTIALS_SKILLS_COMMIT;\n if (isEssentialsPin && fakeSubprocessesActive()) {\n return fakePinnedSkillFingerprint(entry.skillName);\n }\n const pinnedCommit = ownValue(\n BUNDLE_FINGERPRINTS.pinned,\n entry.pinnedRepository.commit,\n );\n return pinnedCommit === undefined\n ? null\n : (ownValue(pinnedCommit, entry.skillName) ?? null);\n }\n let source: string;\n try {\n source = entry.source;\n } catch {\n return null;\n }\n return vendoredSourceFingerprint(source);\n}\n\nfunction ownValue<Value>(\n record: Record<string, Value>,\n key: string,\n): Value | undefined {\n return Object.hasOwn(record, key) ? record[key] : undefined;\n}\n\nexport function shippedFingerprints(skillName: string): readonly string[] {\n return ownValue(BUNDLE_FINGERPRINTS.history, skillName) ?? [];\n}\n\nexport async function fingerprintsAgemonInstalled(\n skillName: string,\n entry: SkillBundleEntry | undefined,\n recordedInstallFingerprints: string[],\n): Promise<Set<string>> {\n const fingerprints = new Set([\n ...shippedFingerprints(skillName),\n ...recordedInstallFingerprints,\n ]);\n const current =\n entry === undefined ? null : await currentSkillFingerprint(entry);\n if (current !== null) {\n fingerprints.add(current);\n }\n return fingerprints;\n}\n\nasync function pristineCheckoutSkillPath(\n ctx: Context,\n entry: SkillBundleEntry,\n): Promise<string | null> {\n const repository = entry.pinnedRepository;\n return repository !== undefined &&\n (await isPristinePinnedCheckout(ctx, repository))\n ? resolvePinnedSkillPath(repository, entry.skillName)\n : null;\n}\n\nexport async function verifiedCustomInstallFingerprint(\n ctx: Context,\n entry: SkillBundleEntry,\n stagedSourcePath: string | undefined,\n): Promise<string | null> {\n const sourcePath =\n stagedSourcePath ?? (await pristineCheckoutSkillPath(ctx, entry));\n if (sourcePath === null) {\n return null;\n }\n const sourceFingerprint = await fingerprintSkillSource(sourcePath).catch(\n () => null,\n );\n const installed = await installedSkillFingerprint(ctx, entry.skillName);\n return sourceFingerprint !== null && sourceFingerprint === installed\n ? installed\n : null;\n}\n\nfunction describeReadFailure(error: unknown): string {\n if (error instanceof SkillTreeRefusal) {\n return error.message;\n }\n if (error instanceof RefusedFileError) {\n return \"it is a symlink or sits under a symlinked directory\";\n }\n const code = (error as NodeJS.ErrnoException).code;\n return `agemon could not read it (${code ?? \"unknown error\"})`;\n}\n\nasync function linkedCanonicalFingerprint(\n ctx: Context,\n skillName: string,\n copyPath: string,\n): Promise<string | SkillClassification> {\n const canonicalDirectory = await resolveRepoDirectory(\n ctx.cwd,\n `${CANONICAL_SKILLS_DIRECTORY}/${skillName}`,\n );\n const expectedTarget = join(\n await realpath(ctx.cwd),\n CANONICAL_SKILLS_DIRECTORY,\n skillName,\n );\n if (\n canonicalDirectory === null ||\n (await realpath(copyPath)) !== expectedTarget\n ) {\n return kept(\n `it is a symlink that does not point to ${CANONICAL_SKILLS_DIRECTORY}/${skillName}`,\n );\n }\n const fingerprint = await fingerprintInstalledSkill(canonicalDirectory);\n return shippedFingerprints(skillName).includes(fingerprint)\n ? fingerprint\n : kept(`it is a symlink to a copy that ${DIFFERS_FROM_EVERY_VERSION}`);\n}\n\nasync function installedFingerprint(\n ctx: Context,\n skillName: string,\n): Promise<string | SkillClassification> {\n const notThere = kept(`not at ${CLAUDE_SKILLS_DIRECTORY}/${skillName}`);\n const skillsDirectory = await resolveRepoDirectory(\n ctx.cwd,\n CLAUDE_SKILLS_DIRECTORY,\n );\n if (skillsDirectory === null) {\n return notThere;\n }\n const copyPath = join(skillsDirectory, skillName);\n const stats = await lstat(copyPath).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n if (stats === null) {\n return notThere;\n }\n if (stats.isSymbolicLink()) {\n return linkedCanonicalFingerprint(ctx, skillName, copyPath);\n }\n if (!stats.isDirectory()) {\n return kept(\"it is not a directory\");\n }\n return fingerprintInstalledSkill(copyPath);\n}\n\nexport async function classifyInstalledSkill(\n ctx: Context,\n entry: SkillBundleEntry,\n): Promise<SkillClassification> {\n const current = await currentSkillFingerprint(entry);\n if (current === null) {\n return kept(\"agemon can't tell which version it ships\");\n }\n let installed: string | SkillClassification;\n try {\n installed = await installedFingerprint(ctx, entry.skillName);\n } catch (error) {\n return kept(describeReadFailure(error));\n }\n if (typeof installed !== \"string\") {\n return installed;\n }\n if (installed === current) {\n return { kind: \"current\" };\n }\n return shippedFingerprints(entry.skillName).includes(installed)\n ? {\n kind: \"outdated\",\n installedFingerprint: installed,\n currentFingerprint: current,\n }\n : kept(DIFFERS_FROM_EVERY_VERSION);\n}\n\nexport async function installedSkillFingerprint(\n ctx: Context,\n skillName: string,\n): Promise<string | null> {\n try {\n const installed = await installedFingerprint(ctx, skillName);\n return typeof installed === \"string\" ? installed : null;\n } catch {\n return null;\n }\n}\n\nexport function classifyInstalledSkillForReport(\n ctx: Context,\n entry: SkillBundleEntry,\n): Promise<SkillClassification> {\n let classifications = reportClassifications.get(ctx);\n if (classifications === undefined) {\n classifications = new Map();\n reportClassifications.set(ctx, classifications);\n }\n let pending = classifications.get(entry.skillName);\n if (pending === undefined) {\n pending = classifyInstalledSkill(ctx, entry);\n classifications.set(entry.skillName, pending);\n }\n return pending;\n}\n\nexport function forgetSkillClassifications(ctx: Context): void {\n reportClassifications.delete(ctx);\n}\n","// Generated by scripts/skill-fingerprints.ts; run `npm run skills:fingerprints` instead of editing.\n\nexport interface BundleFingerprints {\n history: Readonly<Record<string, readonly string[]>>;\n pinned: Readonly<Record<string, Readonly<Record<string, string>>>>;\n}\n\nexport const BUNDLE_FINGERPRINTS: BundleFingerprints = {\n history: {\n \"agemon-architecture\": [\n \"8e1ddcdd2151bdade02e05d777ee72dd0caf6faaa1179b1ce5e50eb3a502fccc\",\n ],\n \"agemon-clean-code\": [\n \"55bec196d836688e9b7902808b925bcbf78c68ff840e44dcf67eff45679d6db8\",\n \"5bbcd2f0f4a4ea9a4c9aa84e39aff06d26142b9bdaafa4c3124673cca0e115d8\",\n \"e2b338dd07e4c880f6494eb98f972d7012fe09b251158cf878575249a520d838\",\n ],\n \"agemon-commit\": [\n \"c2d556dfcf60f81b2f7638717b436e99d5c77df15f668c05f9604c4187dd07ae\",\n ],\n \"agemon-design\": [\n \"3581e052b7effcfe82b98c788dbed81023a6d59b5806e69d74270049458a1d5b\",\n \"5e565bfdd50ec5bf4dc1480fea3f5f6cea0b9ff0f3e98ccad5fcdaefdc09ab99\",\n ],\n \"agemon-design-dashboard\": [\n \"2aa150cda2ef3c89f49f94c6968c0c40e5a1e8fa4c484ea22946c88ece88dee7\",\n \"7bcad52ed8be11ff4a997fe116ddc887d82f6362ed90a8bc5f3491d5b4bc8a94\",\n ],\n \"agemon-design-editorial\": [\n \"e53b30cb26028ce06df368741bd6ce58de9bf73fe54b7f71d7f755e9cd3a427d\",\n \"feac8e930ca0a9c6bb009dd41966d0d267738c937f458d7ff33f3d797d3e63c3\",\n ],\n \"agemon-design-minimal\": [\n \"8beab51f4b504308a3ce6b892698633f4f193ee62909ff5be8abf35c489519ce\",\n \"bdca09c04f653546d9fb786f7cf7a662e6ebb68454e61f85962dddfdb5b6ae4f\",\n ],\n \"agemon-house-rules\": [\n \"380dc8813cc2c06b767d79d0216a42e965a48fff01de8dfabe8976aca0f22721\",\n \"b127f8a1c793cefced3460873ce68290e78eb50a238c1aa94d819c9d9667b087\",\n ],\n \"agemon-performance\": [\n \"2b5c74be35fd534c403f7876fe31fd6e29e653015de91def940fc8a3777f89fd\",\n ],\n \"agemon-plan-rfc\": [\n \"9d02d046d4b4c41748bff437934e3dfbac960b594d06f546ab291cc3b9f2b764\",\n ],\n \"agemon-review-intake\": [\n \"d85f7b21d80d39dcd58a0136291055966592e7afabefdca3d963acd4117f70af\",\n ],\n \"agemon-review-request\": [\n \"9c7810ab2019dbde757a92e3736581fdf4391d55f8376b2e58c2a214eb4360e9\",\n \"c77b023384613551ba51a3f823650a145444dc01b790b571f02fec9acb987ee3\",\n ],\n \"agemon-root-cause\": [\n \"1ee5fb794fb89b1773450995c86aaa52d8f3a4e2572d2a73ac7893734c83b582\",\n \"aec7bf1fcb3b12df1a1209cd79d763115f6099d1055706369ad9fdf979b70673\",\n ],\n \"agemon-security\": [\n \"141926995a259f6747f01b2dfd0962bcab6f53ba23f7d77a2518a80abae27754\",\n ],\n \"agemon-verify-before-done\": [\n \"dde468e926ec0e96cbeb45ce5b854e964980da8f1329a3743bd7f789bc576903\",\n ],\n geo: [\"3a5a25124529e97f9a195e40df3f735e358c548a8907f88f9675d5690a7781d5\"],\n \"geo-audit\": [\n \"72bfdf439f3dfd71170ae0e2a9320ac552d5f61843fd9efe0d41c16bf7009eac\",\n \"7f6c862c2a9c1bbd51fdb5a75b54fbd5f5170e2136c0a6fd4f1e794b16116743\",\n ],\n \"geo-brand-mentions\": [\n \"bb000b3c6f6a0e26be341baee21bb54f9041ddf965c60260c75123562d34ff49\",\n ],\n \"geo-citability\": [\n \"040b19d1d7ee0b5fd38ec3df8cc9e9a4ea3766ab1afd9bdfffc6cbe45663db32\",\n ],\n \"geo-content\": [\n \"13804f98ed20fc527641c1658b9d11f2327d71768903cbd1ee99b47a64d166e5\",\n ],\n \"geo-crawlers\": [\n \"c3fab560ea269c8052186122e857666904a8b766904a7629c2ab8445492393a3\",\n ],\n \"geo-llmstxt\": [\n \"dd383170165a9f45ec9ac2ab8f37d1a9ccea775c7fbc6568a7cc39b113fc94c9\",\n ],\n \"geo-platform-optimizer\": [\n \"9e099ac9ff188f671e866a2dd76422b06a90bcdaf9061d551508121935bffa9d\",\n ],\n \"geo-report\": [\n \"de11503b697d01657bc2c51bc03456affe1e5adcd3d6c763a99abe1e84312189\",\n ],\n \"geo-report-pdf\": [\n \"a9861200629160bb48d631a2865c4cbd6f18aa56747e7b0c10667c728a10eef3\",\n \"f40cd0c6fb018e562b9d5a61ad7273d52abb722de6a2d8ca15451434befae5fe\",\n \"fee4f7966765236e5c870df551d75752c10c8f49b218422bdeebf1812c616897\",\n ],\n \"geo-schema\": [\n \"84f5bb8ec4fa00759c07a12072bf05d1c5afa1ff5bc22b031b7e77d462b0fb09\",\n ],\n \"geo-technical\": [\n \"ee348dfe187f5baf8ef4fe9ceade06567f06b100c62400e07f79ace9ff7bf795\",\n ],\n \"prd-generator\": [\n \"3e4987b4e79c912559ac8991bd4b9cb38ed4dc3a3690933b6c142bea8803c2b2\",\n ],\n \"skill-headofit-audit\": [\n \"d8ae9f2eb38fb0bffba3bc268341ebf905f375798c05c1ff85a771093263a86e\",\n ],\n \"skill-incident-rca\": [\n \"9edc2e62832617684811594df95fbd345866d55d55e0a9e0eb918bd50508ba1c\",\n ],\n \"skill-meeting-lifecycle\": [\n \"50eff047eb54e144065303758bf103264b834dcd6a6d078886ce189e2404da09\",\n ],\n \"skill-obsidian-vault-sync\": [\n \"0d6edc43c071fa974e7a8d734f4ec667432d392d5b3d107628d2937438de5dfb\",\n ],\n \"skill-prd-decomposer\": [\n \"0dced7d3423f90f5d22d76e421f1b12629913a86c4c1dc8c8b2ed589838bde6b\",\n ],\n \"skill-sec-check\": [\n \"570dcd1e2ddb1fa12ee6be97273cab2904d2b1275ac6626e5a44e144be7a6692\",\n ],\n \"skill-task-extractor\": [\n \"9aa2b61bf359694a2aa9677fa376161be34d3821a48db655db76adfe41cf0ee7\",\n ],\n \"skill-tech-spike\": [\n \"08dd1b54821fe36e5ca936d717d25c4bf9b22debdcd13409c4aac1336275d3b6\",\n ],\n \"skill-techlead-reviewer\": [\n \"383c8c3314f8f284f23675fb8aaf874d0808f1dcce2b87b0bfc4637af0a55ee1\",\n ],\n \"web-design-guidelines\": [\n \"704b816d2449e11d04327b17b4bdebce8a8787e59b4a7a05e6ee8ba48fec2237\",\n ],\n \"writing-guidelines\": [\n \"8c753b9c3106e707440525798a6185d2807ced7ff35bdd0b9a544a120871cb9d\",\n ],\n },\n pinned: {\n \"063bee94c3f4df8453406c830b0a7df0f2860278\": {\n \"web-design-guidelines\":\n \"704b816d2449e11d04327b17b4bdebce8a8787e59b4a7a05e6ee8ba48fec2237\",\n \"writing-guidelines\":\n \"8c753b9c3106e707440525798a6185d2807ced7ff35bdd0b9a544a120871cb9d\",\n },\n },\n};\n","import { agentsPlugin } from \"./agents/index.js\";\nimport { cliToolPlugin } from \"./cli-tool/index.js\";\nimport { crgPlugin } from \"./crg/index.js\";\nimport { daemonPlugin } from \"./daemon/index.js\";\nimport { masterPromptPlugin } from \"./master-prompt/index.js\";\nimport { skillsPlugin } from \"./skills/index.js\";\nimport type { AgemonPlugin } from \"./types.js\";\n\nconst capabilityRegistry: AgemonPlugin[] = [\n crgPlugin,\n daemonPlugin,\n skillsPlugin,\n agentsPlugin,\n cliToolPlugin,\n masterPromptPlugin,\n];\n\nexport const CORE_CAPABILITY_IDS: string[] = capabilityRegistry.map(\n (plugin) => plugin.id,\n);\n\nexport function getRegisteredPlugins(): AgemonPlugin[] {\n return [...capabilityRegistry];\n}\n","import type { Plan } from \"../core/plan-store.js\";\nimport { styleUnifiedDiff } from \"../core/text-diff.js\";\nimport { describeUntrustedGitConfig } from \"../core/untrusted-git-config.js\";\nimport { printable } from \"../core/untrusted-text.js\";\nimport type {\n ProposedOperation,\n ProposedOperationAction,\n RiskClass,\n UntrustedGitConfig,\n} from \"../plugins/types.js\";\nimport { type CountPart, countLine, indent, section } from \"./format.js\";\nimport { type SymbolName, symbol } from \"./symbols.js\";\nimport { theme } from \"./theme.js\";\n\nconst ACTION_GLYPH: Record<ProposedOperationAction, SymbolName> = {\n create: \"add\",\n \"merge-block\": \"mod\",\n \"merge-key\": \"mod\",\n replace: \"mod\",\n adopt: \"adopt\",\n \"install-package\": \"install\",\n \"register-service\": \"install\",\n \"use-shared\": \"adopt\",\n conflict: \"conflict\",\n skip: \"pending\",\n};\n\nconst ACTION_LABEL: Record<ProposedOperationAction, string> = {\n create: \"create\",\n \"merge-block\": \"merge\",\n \"merge-key\": \"merge\",\n replace: \"replace\",\n adopt: \"adopt\",\n \"install-package\": \"install\",\n \"register-service\": \"register\",\n \"use-shared\": \"use\",\n conflict: \"conflict\",\n skip: \"skip\",\n};\n\nconst RISK_LABEL: Record<RiskClass, string> = {\n inert: \"inert\",\n \"writes-config\": \"writes-config\",\n executes: \"executes\",\n \"credential-adjacent\": \"credential-adjacent\",\n};\n\nfunction groupByCapability(\n operations: ProposedOperation[],\n): Map<string, ProposedOperation[]> {\n const grouped = new Map<string, ProposedOperation[]>();\n for (const operation of operations) {\n const bucket = grouped.get(operation.capabilityId);\n if (bucket) {\n bucket.push(operation);\n } else {\n grouped.set(operation.capabilityId, [operation]);\n }\n }\n return grouped;\n}\n\nfunction renderPreview(operation: ProposedOperation): string {\n const previewText = printable(operation.preview.text);\n if (operation.preview.kind === \"diff\") {\n return indent(\n styleUnifiedDiff(previewText, { color: true, context: 3 }),\n 7,\n );\n }\n return indent(theme.dim(previewText), 7);\n}\n\nfunction describeGitConfigInPlan(field: UntrustedGitConfig): string {\n return field.kind === \"pairs\"\n ? `needs approval or --trust-repo-git-config: ${field.pairs.join(\"; \")}`\n : `skipped: ${describeUntrustedGitConfig(field)}`;\n}\n\nfunction renderOperation(operation: ProposedOperation): string {\n const glyph = symbol(ACTION_GLYPH[operation.action]);\n const badgeText = theme.dim(`[${RISK_LABEL[operation.riskClass]}]`);\n const target = operation.targetPath || operation.resourceId;\n const heading = ` ${glyph} ${target.padEnd(24)} ${badgeText}`;\n const untrustedGitConfigLine =\n operation.untrustedGitConfig === undefined\n ? \"\"\n : `\\n${indent(theme.warn(printable(describeGitConfigInPlan(operation.untrustedGitConfig))), 7)}`;\n return `${heading}\\n${renderPreview(operation)}${untrustedGitConfigLine}`;\n}\n\nfunction planFooter(operations: ProposedOperation[]): string {\n const counts = new Map<string, number>();\n for (const operation of operations) {\n const skippedBeforeConsent =\n operation.untrustedGitConfig !== undefined &&\n operation.untrustedGitConfig.kind !== \"pairs\";\n const label = skippedBeforeConsent\n ? ACTION_LABEL.skip\n : ACTION_LABEL[operation.action];\n counts.set(label, (counts.get(label) ?? 0) + 1);\n }\n const parts: CountPart[] = [...counts].map(([label, n]) => ({ label, n }));\n return countLine(parts);\n}\n\nexport function renderPlan(plan: Plan): string {\n const header = `${theme.heading(`Plan ${plan.id}`)} ${theme.dim(\"·\")} ${theme.dim(\n `agemon ${plan.agemonVersion}`,\n )}`;\n\n if (plan.operations.length === 0) {\n return `${header}\\n\\n nothing to do — desired state already reached`;\n }\n\n const blocks: string[] = [header];\n for (const [capabilityId, operations] of groupByCapability(plan.operations)) {\n const body = operations.map(renderOperation).join(\"\\n\");\n blocks.push(`${section(capabilityId)}\\n${body}`);\n }\n blocks.push(`${section(\"Summary\")}\\n ${planFooter(plan.operations)}`);\n\n return blocks.join(\"\\n\");\n}\n","const CAPABILITY_LABELS: Record<string, string> = {\n daemon: \"Background service\",\n skills: \"Skills\",\n agents: \"Subagents\",\n \"master-prompt\": \"Instruction files\",\n crg: \"code-review-graph\",\n \"cli-tool\": \"CLI tools\",\n};\n\nexport function capabilityLabel(capabilityId: string): string {\n return CAPABILITY_LABELS[capabilityId] ?? capabilityId;\n}\n","import { printable } from \"../core/untrusted-text.js\";\nimport type { ProposedOperation } from \"../plugins/types.js\";\nimport { box } from \"./box.js\";\nimport { indent } from \"./format.js\";\nimport { capabilityLabel } from \"./labels.js\";\nimport { symbol } from \"./symbols.js\";\nimport { theme } from \"./theme.js\";\n\nexport interface SummarySkip {\n label: string;\n reason: string;\n}\n\nexport type RunSummary =\n | { kind: \"success\"; applied: ProposedOperation[]; nextSteps: string[] }\n | { kind: \"declined\"; skipped: SummarySkip[] }\n | { kind: \"partial\"; appliedCount: number; problems: string[] }\n | {\n kind: \"failure\";\n message: string;\n restored: string[];\n reverted: string[];\n kept: string[];\n manualCleanup: string[];\n };\n\nfunction printableLines(lines: string[]): string {\n return lines.map(printable).join(\"\\n\");\n}\n\nfunction pluralize(count: number, noun: string): string {\n return `${count} ${noun}${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction capabilityLines(applied: ProposedOperation[]): string[] {\n const byCapability = new Map<string, number>();\n for (const operation of applied) {\n byCapability.set(\n operation.capabilityId,\n (byCapability.get(operation.capabilityId) ?? 0) + 1,\n );\n }\n const rows = [...byCapability].map(([capabilityId, count]) => ({\n label: capabilityLabel(capabilityId),\n count,\n }));\n const labelWidth = Math.max(...rows.map((row) => row.label.length));\n return rows.map(\n (row) =>\n ` ${row.label.padEnd(labelWidth)} ${pluralize(row.count, \"operation\")}`,\n );\n}\n\nexport function renderRunSummary(summary: RunSummary): string {\n if (summary.kind === \"success\") {\n const title = `${symbol(\"ok\")} Applied ${pluralize(\n summary.applied.length,\n \"operation\",\n )} · environment verified`;\n const lines = capabilityLines(summary.applied);\n if (summary.nextSteps.length > 0) {\n lines.push(\"\", theme.heading(\"Next steps\"));\n for (const step of summary.nextSteps) {\n lines.push(` ${symbol(\"arrow\")} ${printable(step)}`);\n }\n }\n return box({ title, body: lines.join(\"\\n\"), tone: \"ok\" });\n }\n\n if (summary.kind === \"declined\") {\n const title = `${symbol(\"warn\")} Nothing applied — every operation was declined or skipped`;\n const body =\n summary.skipped.length === 0\n ? \"No operations were proposed.\"\n : summary.skipped\n .map(\n (skip) =>\n ` ${printable(skip.label)} — ${theme.dim(printable(skip.reason))}`,\n )\n .join(\"\\n\");\n return box({ title, body, tone: \"warn\" });\n }\n\n if (summary.kind === \"partial\") {\n const title = `${symbol(\"warn\")} Applied ${pluralize(\n summary.appliedCount,\n \"operation\",\n )}, then verification found problems`;\n const body = summary.problems\n .map((problem) => ` ${symbol(\"warn\")} ${printable(problem)}`)\n .join(\"\\n\");\n return box({ title, body, tone: \"warn\" });\n }\n\n const title =\n summary.kept.length === 0\n ? `${symbol(\"fail\")} Rolled back — repo and machine left as they started`\n : `${symbol(\"fail\")} Rolled back — except the changes listed under Kept`;\n const blocks: string[] = [theme.dim(printable(summary.message))];\n if (summary.kept.length > 0) {\n blocks.push(\n `${theme.heading(\"Kept\")}\\n${indent(printableLines(summary.kept))}`,\n );\n }\n if (summary.restored.length > 0) {\n blocks.push(\n `${theme.heading(\"Restored\")}\\n${indent(printableLines(summary.restored))}`,\n );\n }\n if (summary.reverted.length > 0) {\n blocks.push(\n `${theme.heading(\"Reverted\")}\\n${indent(printableLines(summary.reverted))}`,\n );\n }\n if (summary.manualCleanup.length > 0) {\n blocks.push(\n `${theme.danger(\"Manual cleanup needed\")}\\n${indent(printableLines(summary.manualCleanup))}`,\n );\n }\n return box({ title, body: blocks.join(\"\\n\\n\"), tone: \"danger\" });\n}\n","import { join } from \"node:path\";\nimport type { IsolationStatus } from \"../inspect/discover.js\";\nimport type {\n AgemonPlugin,\n ProposedOperation,\n SkippedPluginOperation,\n StagedFile,\n} from \"../plugins/types.js\";\nimport { capabilityLabel } from \"../ui/labels.js\";\nimport { SILENT_PROGRESS } from \"../ui/progress.js\";\nimport {\n type ApplyJournal,\n deleteJournal,\n type JournalSnapshot,\n writeJournal,\n} from \"./apply-journal.js\";\nimport type { Context } from \"./context.js\";\nimport { errorMessage } from \"./error-message.js\";\nimport { readRegularFileIfExists, writeFileAtomic } from \"./files.js\";\nimport { fingerprintContent, sha256Hex } from \"./fingerprint.js\";\nimport {\n AGEMON_GITIGNORE_ENTRY,\n writeAgemonGitignoreEntry,\n} from \"./gitignore.js\";\nimport {\n type ExitProcess,\n type InterruptionWatch,\n ignoringTerminalErrors,\n watchForInterruption,\n} from \"./interruption.js\";\nimport { PLAN_SEGMENTS, type Plan, writePlan } from \"./plan-store.js\";\nimport { resolveInsideRepo, resolveStateDirectory } from \"./repo-paths.js\";\nimport { rollBackApply } from \"./rollback.js\";\nimport { printable } from \"./untrusted-text.js\";\nimport { recordGitignoreLine } from \"./workspace-footprint.js\";\n\nexport const FILE_TARGETING_ACTIONS: ReadonlySet<ProposedOperation[\"action\"]> =\n new Set([\"create\", \"replace\", \"merge-block\", \"merge-key\", \"adopt\"]);\n\nconst STAGED_FILE_NAME_LENGTH = 16;\nconst STAGED_MANIFEST_FILE = \"manifest.json\";\nconst INTERRUPTED_MESSAGE =\n \"Interrupted — rolling back after the current step (press Ctrl-C again to stop now, then run 'agemon recover').\";\n\nexport interface ApplyPlanInput {\n plan: Plan;\n approved: ProposedOperation[];\n workspaceIsolationApproved: boolean | null;\n isolationStatus: IsolationStatus;\n allowUnignoredState: boolean;\n exitProcess?: ExitProcess;\n}\n\nexport interface SkippedAppliedOperation {\n operation: ProposedOperation;\n reason: string;\n}\n\nexport interface ApplyPlanResult {\n applied: ProposedOperation[];\n skipped: SkippedAppliedOperation[];\n}\n\nexport interface RollbackDetail {\n message: string;\n restored: string[];\n reverted: string[];\n kept: string[];\n manualCleanup: string[];\n}\n\nexport class ApplyRollbackError extends Error {\n readonly rollback: RollbackDetail;\n\n constructor(rollback: RollbackDetail, cause: unknown) {\n super(rollback.message, { cause });\n this.name = \"ApplyRollbackError\";\n this.rollback = rollback;\n }\n}\n\nfunction stagedFileName(targetPath: string): string {\n return sha256Hex(targetPath).slice(0, STAGED_FILE_NAME_LENGTH);\n}\n\nfunction validateManagedMarkerBalance(staged: StagedFile): string | null {\n const markerPattern = /<!-- agemon:(start|end):([A-Za-z0-9_-]+) -->/gu;\n const startCounts = new Map<string, number>();\n const endCounts = new Map<string, number>();\n const seenStart = new Set<string>();\n\n for (\n let match = markerPattern.exec(staged.contents);\n match !== null;\n match = markerPattern.exec(staged.contents)\n ) {\n const [, kind, blockId] = match;\n if (kind === \"start\") {\n startCounts.set(blockId, (startCounts.get(blockId) ?? 0) + 1);\n seenStart.add(blockId);\n } else {\n if (!seenStart.has(blockId)) {\n return `${staged.targetPath}: agemon end marker for '${blockId}' precedes its start marker`;\n }\n endCounts.set(blockId, (endCounts.get(blockId) ?? 0) + 1);\n }\n }\n\n for (const [blockId, starts] of startCounts) {\n const ends = endCounts.get(blockId) ?? 0;\n if (starts !== 1 || ends !== 1) {\n return `${staged.targetPath}: agemon block '${blockId}' markers unbalanced (${starts} start, ${ends} end)`;\n }\n }\n\n return null;\n}\n\nfunction validateStagedFile(staged: StagedFile): string | null {\n if (staged.kind === \"json\") {\n try {\n JSON.parse(staged.contents);\n } catch (error) {\n return `${staged.targetPath}: invalid JSON — ${errorMessage(error)}`;\n }\n return null;\n }\n if (staged.kind === \"markdown\") {\n return validateManagedMarkerBalance(staged);\n }\n return null;\n}\n\nasync function stageApprovedFiles(\n ctx: Context,\n pluginById: Map<string, AgemonPlugin>,\n planId: string,\n approvedByCapability: Map<string, ProposedOperation[]>,\n): Promise<Map<string, StagedFile[]>> {\n const stagedByCapability = new Map<string, StagedFile[]>();\n const stagedTargetsByFileName: Record<string, string> = {};\n let stagedRoot: string | null = null;\n\n for (const [capabilityId, operations] of approvedByCapability) {\n const plugin = pluginById.get(capabilityId);\n if (!plugin?.materialize) {\n continue;\n }\n\n const stagedFiles = await plugin.materialize(ctx, operations);\n if (stagedFiles.length === 0) {\n continue;\n }\n\n stagedRoot ??= await resolveStateDirectory(\n ctx.cwd,\n [...PLAN_SEGMENTS, planId, \"staged\"],\n { create: true },\n );\n\n for (const staged of stagedFiles) {\n const fileName = stagedFileName(staged.targetPath);\n stagedTargetsByFileName[fileName] = staged.targetPath;\n await writeFileAtomic(join(stagedRoot, fileName), staged.contents);\n const problem = validateStagedFile(staged);\n if (problem !== null) {\n throw new Error(\n `Refusing to apply plan ${planId}: staged file failed validation — ${problem}`,\n );\n }\n }\n\n stagedByCapability.set(capabilityId, stagedFiles);\n }\n\n if (stagedRoot !== null) {\n await writeFileAtomic(\n join(stagedRoot, STAGED_MANIFEST_FILE),\n `${JSON.stringify(stagedTargetsByFileName, null, 2)}\\n`,\n );\n }\n return stagedByCapability;\n}\n\nfunction fileTargetingOperations(\n operations: ProposedOperation[],\n): ProposedOperation[] {\n return operations.filter((operation) =>\n FILE_TARGETING_ACTIONS.has(operation.action),\n );\n}\n\nasync function enforceWorkspaceIsolation(\n ctx: Context,\n input: ApplyPlanInput,\n): Promise<void> {\n if (input.isolationStatus === \"ignored\") {\n return;\n }\n if (input.allowUnignoredState) {\n ctx.ui.info(\n \"Writing .agemon/ state without a .gitignore entry (--allow-unignored-state).\",\n );\n return;\n }\n if (input.workspaceIsolationApproved === true) {\n await recordGitignoreLine(\n ctx,\n AGEMON_GITIGNORE_ENTRY,\n await writeAgemonGitignoreEntry(ctx.cwd),\n );\n return;\n }\n throw new Error(\n \"Refusing to write .agemon/ state: /.agemon/ is not git-ignored. Re-run \" +\n \"interactively (or with --yes) so agemon can add it, or pass \" +\n \"--allow-unignored-state to override.\",\n );\n}\n\nasync function assertPlanIsFresh(\n ctx: Context,\n planId: string,\n operations: ProposedOperation[],\n): Promise<void> {\n for (const operation of fileTargetingOperations(operations)) {\n const currentContents = await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, operation.targetPath),\n );\n const actualFingerprint =\n currentContents === null ? null : fingerprintContent(currentContents);\n if (actualFingerprint !== operation.expectedFingerprint) {\n throw new Error(\n `Plan ${planId} is stale: ${operation.targetPath} changed since it was planned. Re-run 'agemon plan'.`,\n );\n }\n }\n}\n\nfunction stagedFingerprintsByTarget(\n stagedByCapability: Map<string, StagedFile[]>,\n): Map<string, string> {\n const fingerprints = new Map<string, string>();\n for (const stagedFiles of stagedByCapability.values()) {\n for (const staged of stagedFiles) {\n fingerprints.set(staged.targetPath, fingerprintContent(staged.contents));\n }\n }\n return fingerprints;\n}\n\nasync function captureRollbackSnapshots(\n ctx: Context,\n operations: ProposedOperation[],\n stagedByCapability: Map<string, StagedFile[]>,\n): Promise<JournalSnapshot[]> {\n const stagedFingerprints = stagedFingerprintsByTarget(stagedByCapability);\n const snapshots: JournalSnapshot[] = [];\n for (const operation of fileTargetingOperations(operations)) {\n const previousContents = await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, operation.targetPath),\n );\n snapshots.push({\n targetPath: operation.targetPath,\n previousContents,\n stagedFingerprint: stagedFingerprints.get(operation.targetPath) ?? null,\n });\n }\n return snapshots;\n}\n\nfunction groupApprovedByCapability(\n plan: Plan,\n approved: ProposedOperation[],\n): Map<string, ProposedOperation[]> {\n const approvedById = new Map(\n approved.map((operation) => [operation.id, operation] as const),\n );\n const grouped = new Map<string, ProposedOperation[]>();\n for (const planned of plan.operations) {\n const operation = approvedById.get(planned.id);\n if (operation === undefined) {\n continue;\n }\n const bucket = grouped.get(operation.capabilityId);\n if (bucket) {\n bucket.push(operation);\n } else {\n grouped.set(operation.capabilityId, [operation]);\n }\n }\n return grouped;\n}\n\nasync function runCapabilityWork(\n ctx: Context,\n plugin: AgemonPlugin,\n operations: ProposedOperation[],\n staged: StagedFile[] | undefined,\n): Promise<SkippedAppliedOperation[]> {\n let skippedByPlugin: SkippedPluginOperation[] = [];\n if (plugin.apply) {\n skippedByPlugin =\n (await plugin.apply(ctx, operations, staged))?.skipped ?? [];\n } else if (plugin.install) {\n const presence = await plugin.detect(ctx);\n if (presence.present) {\n ctx.ui.info(`${plugin.id} already present — nothing to install`);\n } else {\n await plugin.install(ctx);\n }\n } else {\n throw new Error(`Capability '${plugin.id}' has neither apply nor install.`);\n }\n\n const verification = await plugin.verify(ctx);\n if (!verification.ok) {\n throw new Error(\n verification.detail ??\n `Verification failed for '${plugin.id}' after apply.`,\n );\n }\n if (verification.attention) {\n ctx.ui.info(`${plugin.id}: ${printable(verification.attention)}`);\n }\n\n const skipReasonById = new Map(\n skippedByPlugin.map((skip) => [skip.operationId, skip.reason] as const),\n );\n const skipped: SkippedAppliedOperation[] = [];\n for (const operation of operations) {\n const skipReason = skipReasonById.get(operation.id);\n if (skipReason === undefined) {\n await ctx.manifest.updateResourceEntry(operation.resourceId, {\n validation: { ok: true },\n });\n } else {\n skipped.push({ operation, reason: skipReason });\n }\n }\n return skipped;\n}\n\nasync function rollBackInProcess(\n ctx: Context,\n pluginById: Map<string, AgemonPlugin>,\n journalPath: string,\n journal: ApplyJournal,\n cause: unknown,\n): Promise<never> {\n const outcome = await rollBackApply(ctx, pluginById, journal, {\n saveFailedRestores: false,\n });\n const manualCleanup = [...outcome.manualCleanup];\n if (manualCleanup.length === 0) {\n try {\n await deleteJournal(journalPath);\n } catch (journalError) {\n manualCleanup.push(`journal: ${errorMessage(journalError)}`);\n }\n }\n\n const causeMessage = printable(errorMessage(cause));\n const rolledBackMessage =\n outcome.kept.length === 0\n ? `apply rolled back — repo left as it started (${causeMessage})`\n : `apply rolled back — repo left as it started, except the changes kept below (${causeMessage})`;\n ignoringTerminalErrors(() => {\n ctx.ui.fail(\n manualCleanup.length === 0\n ? rolledBackMessage\n : `apply partly rolled back — the journal is kept; fix the items below, then run 'agemon recover' (${causeMessage})`,\n );\n for (const line of outcome.kept) {\n ctx.ui.info(printable(line));\n }\n for (const detail of manualCleanup) {\n ctx.ui.fail(`manual cleanup needed: ${printable(detail)}`);\n }\n });\n throw new ApplyRollbackError(\n {\n message: errorMessage(cause),\n restored: outcome.restored,\n reverted: outcome.reverted,\n kept: outcome.kept,\n manualCleanup,\n },\n cause,\n );\n}\n\nasync function deleteJournalAfterSuccess(\n ctx: Context,\n journalPath: string,\n): Promise<void> {\n try {\n await deleteJournal(journalPath);\n } catch (journalError) {\n ignoringTerminalErrors(() =>\n ctx.ui.fail(\n `Applied, but could not delete the rollback journal ${journalPath} (${errorMessage(journalError)}). Delete it by hand; do not run 'agemon recover', which would undo this apply.`,\n ),\n );\n }\n}\n\nasync function runJournalledCapabilities(\n ctx: Context,\n pluginById: Map<string, AgemonPlugin>,\n approvedByCapability: Map<string, ProposedOperation[]>,\n stagedByCapability: Map<string, StagedFile[]>,\n interruption: InterruptionWatch,\n { path: journalPath, journal }: { path: string; journal: ApplyJournal },\n): Promise<ApplyPlanResult> {\n const progress = ctx.progress ?? SILENT_PROGRESS;\n const capabilityCount = approvedByCapability.size;\n const applied: ProposedOperation[] = [];\n const skipped: SkippedAppliedOperation[] = [];\n progress.start(\"Applying capabilities\", capabilityCount);\n try {\n for (const [capabilityId, operations] of approvedByCapability) {\n interruption.throwIfInterrupted();\n const plugin = pluginById.get(capabilityId);\n if (!plugin) {\n throw new Error(\n `Plan references capability '${capabilityId}', which is not registered.`,\n );\n }\n const skippedOfCapability = await runCapabilityWork(\n ctx,\n plugin,\n operations,\n stagedByCapability.get(capabilityId),\n );\n progress.advance(`Applied ${capabilityLabel(capabilityId)}`);\n const skippedIds = new Set(\n skippedOfCapability.map((skip) => skip.operation.id),\n );\n applied.push(\n ...operations.filter((operation) => !skippedIds.has(operation.id)),\n );\n skipped.push(...skippedOfCapability);\n }\n interruption.throwIfInterrupted();\n progress.stop(\n `Applied ${capabilityCount} ${\n capabilityCount === 1 ? \"capability\" : \"capabilities\"\n }`,\n );\n } catch (error) {\n progress.stop();\n return rollBackInProcess(\n ctx,\n pluginById,\n journalPath,\n journal,\n interruption.causeOf(error),\n );\n }\n\n await deleteJournalAfterSuccess(ctx, journalPath);\n return { applied, skipped };\n}\n\nasync function applyApprovedOperations(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n input: ApplyPlanInput,\n): Promise<ApplyPlanResult> {\n const pluginById = new Map(\n allPlugins.map((plugin) => [plugin.id, plugin] as const),\n );\n const approvedByCapability = groupApprovedByCapability(\n input.plan,\n input.approved,\n );\n\n await assertPlanIsFresh(ctx, input.plan.id, input.approved);\n await enforceWorkspaceIsolation(ctx, input);\n await writePlan(ctx.cwd, input.plan);\n\n const stagedByCapability = await stageApprovedFiles(\n ctx,\n pluginById,\n input.plan.id,\n approvedByCapability,\n );\n const snapshots = await captureRollbackSnapshots(\n ctx,\n input.approved,\n stagedByCapability,\n );\n\n const interruption = watchForInterruption(() => {\n ctx.progress?.stop();\n ctx.ui.fail(INTERRUPTED_MESSAGE);\n }, input.exitProcess ?? process.exit);\n try {\n const storedJournal = await writeJournal(ctx.cwd, {\n planId: input.plan.id,\n startedAt: new Date().toISOString(),\n capabilityOrder: [...approvedByCapability.keys()],\n ledgerBefore: structuredClone(ctx.manifest.getActions()),\n snapshots,\n });\n return await runJournalledCapabilities(\n ctx,\n pluginById,\n approvedByCapability,\n stagedByCapability,\n interruption,\n storedJournal,\n );\n } finally {\n interruption.dispose();\n }\n}\n\nexport async function applyPlan(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n input: ApplyPlanInput,\n): Promise<ApplyPlanResult> {\n ctx.manifest.setRecordingAgemonVersion(input.plan.agemonVersion);\n ctx.manifest.setRecordingPlanId(input.plan.id);\n try {\n return await applyApprovedOperations(ctx, allPlugins, input);\n } finally {\n ctx.manifest.setRecordingAgemonVersion(null);\n ctx.manifest.setRecordingPlanId(null);\n }\n}\n","import { progress } from \"@clack/prompts\";\n\nexport interface StepProgress {\n start(label: string, max: number): void;\n advance(label?: string): void;\n stop(label?: string): void;\n}\n\nexport const SILENT_PROGRESS: StepProgress = {\n start() {},\n advance() {},\n stop() {},\n};\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\n}\n\nexport function createStepProgress(): StepProgress {\n if (!isInteractive()) {\n return SILENT_PROGRESS;\n }\n\n let bar: ReturnType<typeof progress> | undefined;\n return {\n start(label, max) {\n bar = progress({ style: \"heavy\", max });\n bar.start(label);\n },\n advance(label) {\n bar?.advance(1, label);\n },\n stop(label) {\n bar?.stop(label);\n bar = undefined;\n },\n };\n}\n","import { join, posix } from \"node:path\";\nimport {\n PROPOSED_OPERATION_ACTIONS,\n type ProposedOperation,\n RISK_CLASSES,\n type SkillUpdate,\n} from \"../plugins/types.js\";\nimport { isPlainSkillName } from \"./config.js\";\nimport { readRegularFileIfExists, writeFileAtomic } from \"./files.js\";\nimport { fingerprintJson } from \"./fingerprint.js\";\nimport { AGEMON_STATE_DIRECTORY, resolveStateDirectory } from \"./repo-paths.js\";\nimport { validateUntrustedGitConfig } from \"./untrusted-git-config.js\";\nimport { isSafeIdentifier, printable } from \"./untrusted-text.js\";\n\nexport const PLAN_SEGMENTS = [\"plans\"] as const;\nconst PLAN_ID_LENGTH = 16;\nconst PLAN_ID_PATTERN = /^[0-9a-f]{16}$/u;\nconst SKILL_FINGERPRINT_PATTERN = /^[0-9a-f]{64}$/u;\n\nexport interface PlanInputs {\n capabilityIds: string[];\n skillGroups: string | null;\n}\n\nexport interface Plan {\n id: string;\n agemonVersion: string;\n desiredStateHash: string;\n inputs: PlanInputs;\n createdAt: string;\n operations: ProposedOperation[];\n}\n\ninterface PlanIdentityInput {\n agemonVersion: string;\n desiredStateHash: string;\n operations: ProposedOperation[];\n}\n\nexport function resolveDesiredStateHash(inputs: PlanInputs): string {\n return fingerprintJson(inputs);\n}\n\nexport function planContentFingerprint(input: PlanIdentityInput): string {\n return fingerprintJson({\n agemonVersion: input.agemonVersion,\n desiredStateHash: input.desiredStateHash,\n operations: input.operations,\n });\n}\n\nexport function computePlanId(input: PlanIdentityInput): string {\n return planContentFingerprint(input).slice(0, PLAN_ID_LENGTH);\n}\n\nexport function assertValidPlanId(planId: string): void {\n if (!PLAN_ID_PATTERN.test(planId)) {\n throw new Error(\n `Invalid plan id '${printable(planId)}': expected 16 lowercase hex characters, as printed by 'agemon plan'.`,\n );\n }\n}\n\nexport function resolvePlanPath(cwd: string, planId: string): string {\n assertValidPlanId(planId);\n return join(cwd, AGEMON_STATE_DIRECTORY, ...PLAN_SEGMENTS, `${planId}.json`);\n}\n\nexport async function writePlan(cwd: string, plan: Plan): Promise<string> {\n const planPath = resolvePlanPath(cwd, plan.id);\n const payload = `${JSON.stringify(plan, null, 2)}\\n`;\n\n await resolveStateDirectory(cwd, [...PLAN_SEGMENTS], { create: true });\n await writeFileAtomic(planPath, payload);\n return planPath;\n}\n\nfunction isCanonicalTargetPath(targetPath: string): boolean {\n return (\n targetPath === \"\" ||\n (posix.normalize(targetPath) === targetPath &&\n !posix.isAbsolute(targetPath) &&\n targetPath !== \".\" &&\n targetPath !== \"..\" &&\n !targetPath.startsWith(\"../\") &&\n !targetPath.startsWith(\"./\") &&\n !targetPath.endsWith(\"/\"))\n );\n}\n\nfunction validateSkillUpdates(\n value: unknown,\n field: string,\n fail: (detail: string) => never,\n): SkillUpdate[] {\n if (!Array.isArray(value) || value.length === 0) {\n return fail(`'${field}' must be a non-empty array`);\n }\n const seenNames = new Set<string>();\n return value.map((update: unknown, index) => {\n const record =\n typeof update === \"object\" && update !== null\n ? (update as Record<string, unknown>)\n : {};\n const { name, installedFingerprint, currentFingerprint } = record;\n if (\n typeof name !== \"string\" ||\n !isPlainSkillName(name) ||\n typeof installedFingerprint !== \"string\" ||\n !SKILL_FINGERPRINT_PATTERN.test(installedFingerprint) ||\n typeof currentFingerprint !== \"string\" ||\n !SKILL_FINGERPRINT_PATTERN.test(currentFingerprint)\n ) {\n return fail(\n `'${field}[${index}]' must name a plain skill and two 64-character hex fingerprints`,\n );\n }\n if (seenNames.has(name)) {\n return fail(`'${field}[${index}]' names ${name} a second time`);\n }\n seenNames.add(name);\n return { name, installedFingerprint, currentFingerprint };\n });\n}\n\nfunction validatePlan(parsed: unknown, planId: string): Plan {\n const fail = (detail: string): never => {\n throw new Error(`Plan ${planId} is invalid: ${detail}`);\n };\n const asRecord = (value: unknown, field: string): Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : fail(`'${field}' must be an object`);\n const identifier = (value: unknown, field: string): string =>\n typeof value === \"string\" && isSafeIdentifier(value)\n ? value\n : fail(`'${field}' must be a string without control characters`);\n const oneOf = <Value extends string>(\n allowed: readonly Value[],\n value: unknown,\n field: string,\n ): Value =>\n allowed.includes(value as Value)\n ? (value as Value)\n : fail(`'${field}' must be one of ${allowed.join(\", \")}`);\n\n const plan = asRecord(parsed, \"plan\");\n if (plan.id !== planId) {\n fail(\"its id does not match the requested plan id\");\n }\n if (plan.inputs === undefined) {\n fail(\n \"it has no 'inputs'; it was made before this agemon. Re-run 'agemon plan'\",\n );\n }\n const inputs = asRecord(plan.inputs, \"inputs\");\n if (!Array.isArray(inputs.capabilityIds)) {\n fail(\"'inputs.capabilityIds' must be an array\");\n }\n const capabilityIds = (inputs.capabilityIds as unknown[]).map(\n (capabilityId, index) =>\n identifier(capabilityId, `inputs.capabilityIds[${index}]`),\n );\n const skillGroups =\n inputs.skillGroups === null\n ? null\n : identifier(inputs.skillGroups, \"inputs.skillGroups\");\n if (!Array.isArray(plan.operations)) {\n fail(\"'operations' must be an array\");\n }\n\n const operations = (plan.operations as unknown[]).map((value, index) => {\n const field = (name: string) => `operations[${index}].${name}`;\n const operation = asRecord(value, `operations[${index}]`);\n const preview = asRecord(operation.preview, field(\"preview\"));\n const targetPath = identifier(operation.targetPath, field(\"targetPath\"));\n if (!isCanonicalTargetPath(targetPath)) {\n fail(`'${field(\"targetPath\")}' is not a canonical relative path`);\n }\n const expectedFingerprint =\n operation.expectedFingerprint === null\n ? null\n : identifier(\n operation.expectedFingerprint,\n field(\"expectedFingerprint\"),\n );\n if (typeof operation.requiresConsent !== \"boolean\") {\n fail(`'${field(\"requiresConsent\")}' must be a boolean`);\n }\n if (typeof preview.text !== \"string\") {\n fail(`'${field(\"preview.text\")}' must be a string`);\n }\n const action = oneOf(\n PROPOSED_OPERATION_ACTIONS,\n operation.action,\n field(\"action\"),\n );\n const riskClass = oneOf(\n RISK_CLASSES,\n operation.riskClass,\n field(\"riskClass\"),\n );\n const needsNoConsent = riskClass === \"inert\" && !operation.requiresConsent;\n if (action === \"use-shared\" && !needsNoConsent) {\n fail(\n `'operations[${index}]' is a use-shared operation, which must be inert and need no consent`,\n );\n }\n if (action !== \"use-shared\" && needsNoConsent) {\n fail(\n `'operations[${index}]' marks ${action} as needing no consent; re-run 'agemon plan'`,\n );\n }\n const untrustedGitConfig =\n operation.untrustedGitConfig === undefined\n ? undefined\n : validateUntrustedGitConfig(\n operation.untrustedGitConfig,\n field(\"untrustedGitConfig\"),\n fail,\n );\n const updates =\n operation.updates === undefined\n ? undefined\n : validateSkillUpdates(operation.updates, field(\"updates\"), fail);\n return {\n ...(untrustedGitConfig === undefined ? {} : { untrustedGitConfig }),\n ...(updates === undefined ? {} : { updates }),\n id: identifier(operation.id, field(\"id\")),\n capabilityId: identifier(operation.capabilityId, field(\"capabilityId\")),\n resourceId: identifier(operation.resourceId, field(\"resourceId\")),\n targetPath,\n action,\n riskClass,\n requiresConsent: operation.requiresConsent as boolean,\n expectedFingerprint,\n preview: {\n kind: oneOf(\n [\"diff\", \"note\"] as const,\n preview.kind,\n field(\"preview.kind\"),\n ),\n text: preview.text as string,\n },\n };\n });\n\n return {\n id: planId,\n agemonVersion: identifier(plan.agemonVersion, \"agemonVersion\"),\n desiredStateHash: identifier(plan.desiredStateHash, \"desiredStateHash\"),\n inputs: { capabilityIds, skillGroups },\n createdAt: identifier(plan.createdAt, \"createdAt\"),\n operations,\n };\n}\n\nexport async function readPlan(cwd: string, planId: string): Promise<Plan> {\n const planPath = resolvePlanPath(cwd, planId);\n const plansDirectory = await resolveStateDirectory(cwd, [...PLAN_SEGMENTS], {\n create: false,\n });\n const contents =\n plansDirectory === null ? null : await readRegularFileIfExists(planPath);\n if (contents === null) {\n throw new Error(\n `No plan ${planId} in .agemon/plans/. Run 'agemon plan' first.`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch (error) {\n throw new Error(\n `Plan ${planId} is invalid: not valid JSON (${printable((error as Error).message)})`,\n );\n }\n return validatePlan(parsed, planId);\n}\n","import { rm } from \"node:fs/promises\";\nimport { relative } from \"node:path\";\nimport type { AgemonPlugin, ProposedOperation } from \"../plugins/types.js\";\nimport type { ApplyJournal, JournalSnapshot } from \"./apply-journal.js\";\nimport type { Context } from \"./context.js\";\nimport { errorMessage } from \"./error-message.js\";\nimport {\n RefusedFileError,\n readRegularFileIfExists,\n saveVerifiedCopyBeside,\n writeFileAtomic,\n} from \"./files.js\";\nimport { fingerprintContent } from \"./fingerprint.js\";\nimport { readPlan } from \"./plan-store.js\";\nimport { resolveInsideRepo } from \"./repo-paths.js\";\nimport type { LedgerEntry } from \"./state-manifest.js\";\nimport { printable } from \"./untrusted-text.js\";\nimport {\n removeEmptyDirectories,\n WORKSPACE_PLUGIN_ID,\n} from \"./workspace-footprint.js\";\n\nexport type SnapshotState = \"unchanged\" | \"restore\" | \"changed-since\";\n\nexport interface ClassifiedSnapshot {\n snapshot: JournalSnapshot;\n state: SnapshotState;\n}\n\nexport interface RollbackOutcome {\n restored: string[];\n reverted: string[];\n kept: string[];\n manualCleanup: string[];\n unsavedCount: number;\n}\n\ninterface NewEntries {\n toRevertByCapability: Map<string, LedgerEntry[]>;\n kept: LedgerEntry[];\n workspace: LedgerEntry[];\n}\n\nasync function classifySnapshot(\n ctx: Context,\n snapshot: JournalSnapshot,\n): Promise<SnapshotState> {\n let currentContents: string | null;\n try {\n currentContents = await readRegularFileIfExists(\n await resolveInsideRepo(ctx.cwd, snapshot.targetPath),\n );\n } catch (error) {\n if (error instanceof RefusedFileError) {\n return \"changed-since\";\n }\n throw error;\n }\n if (currentContents === snapshot.previousContents) {\n return \"unchanged\";\n }\n if (\n currentContents === null ||\n fingerprintContent(currentContents) === snapshot.stagedFingerprint\n ) {\n return \"restore\";\n }\n return \"changed-since\";\n}\n\nexport async function classifySnapshots(\n ctx: Context,\n journal: ApplyJournal,\n): Promise<ClassifiedSnapshot[]> {\n const classified: ClassifiedSnapshot[] = [];\n for (const snapshot of [...journal.snapshots].reverse()) {\n classified.push({ snapshot, state: await classifySnapshot(ctx, snapshot) });\n }\n return classified;\n}\n\nasync function restoreSnapshot(\n ctx: Context,\n snapshot: JournalSnapshot,\n): Promise<string> {\n const absolutePath = await resolveInsideRepo(ctx.cwd, snapshot.targetPath);\n if (snapshot.previousContents === null) {\n await rm(absolutePath, { force: true });\n return `removed ${snapshot.targetPath}`;\n }\n await writeFileAtomic(absolutePath, snapshot.previousContents);\n return `restored ${snapshot.targetPath}`;\n}\n\nasync function preservePreApplyContents(\n ctx: Context,\n snapshot: JournalSnapshot,\n problem: string,\n outcome: RollbackOutcome,\n): Promise<void> {\n const target = printable(snapshot.targetPath);\n if (snapshot.previousContents === null) {\n outcome.manualCleanup.push(`${target}: ${problem}`);\n return;\n }\n try {\n const savedPath = await saveVerifiedCopyBeside(\n await resolveInsideRepo(ctx.cwd, snapshot.targetPath),\n snapshot.previousContents,\n );\n outcome.manualCleanup.push(\n `${target}: ${problem}; its pre-apply contents are saved as ${printable(relative(ctx.cwd, savedPath))}`,\n );\n } catch (saveError) {\n outcome.unsavedCount += 1;\n outcome.manualCleanup.push(\n `${target}: ${problem}; could not save its pre-apply contents (${errorMessage(saveError)})`,\n );\n }\n}\n\nfunction describeFailedRestoreForRetry(\n snapshot: JournalSnapshot,\n error: unknown,\n): string {\n const failure =\n snapshot.previousContents === null\n ? `could not remove it (${errorMessage(error)})`\n : `could not restore its pre-apply contents (${errorMessage(error)})`;\n return `${printable(snapshot.targetPath)}: ${failure}; run 'agemon recover' to retry.`;\n}\n\nasync function rollBackSnapshots(\n ctx: Context,\n classified: ClassifiedSnapshot[],\n options: { saveFailedRestores: boolean },\n outcome: RollbackOutcome,\n): Promise<Set<string>> {\n const unrestoredTargets = new Set<string>();\n for (const { snapshot, state } of classified) {\n if (state === \"unchanged\") {\n continue;\n }\n if (state === \"changed-since\") {\n unrestoredTargets.add(snapshot.targetPath);\n await preservePreApplyContents(\n ctx,\n snapshot,\n \"changed since the apply started — kept as is\",\n outcome,\n );\n continue;\n }\n try {\n outcome.restored.push(await restoreSnapshot(ctx, snapshot));\n } catch (restoreError) {\n unrestoredTargets.add(snapshot.targetPath);\n if (options.saveFailedRestores) {\n await preservePreApplyContents(\n ctx,\n snapshot,\n `could not restore it (${errorMessage(restoreError)})`,\n outcome,\n );\n } else {\n outcome.manualCleanup.push(\n describeFailedRestoreForRetry(snapshot, restoreError),\n );\n }\n }\n }\n return unrestoredTargets;\n}\n\nexport function partitionNewEntries(\n ledger: LedgerEntry[],\n journal: ApplyJournal,\n pluginById: Map<string, AgemonPlugin>,\n unrestoredTargets: ReadonlySet<string>,\n): NewEntries {\n const entryIdsBefore = new Set(journal.ledgerBefore.map((entry) => entry.id));\n const newEntriesOf = (plugin: string) =>\n ledger.filter(\n (entry) =>\n entry.plugin === plugin &&\n entry.planId === journal.planId &&\n !entryIdsBefore.has(entry.id),\n );\n const newEntries: NewEntries = {\n toRevertByCapability: new Map(),\n kept: [],\n workspace: newEntriesOf(WORKSPACE_PLUGIN_ID),\n };\n for (const capabilityId of [...journal.capabilityOrder].reverse()) {\n const entriesOfCapability = newEntriesOf(capabilityId);\n const toRevert = entriesOfCapability.filter(\n (entry) => !unrestoredTargets.has(entry.target),\n );\n newEntries.kept.push(\n ...entriesOfCapability.filter((entry) =>\n unrestoredTargets.has(entry.target),\n ),\n );\n if (toRevert.length > 0 && pluginById.get(capabilityId)?.revert) {\n newEntries.toRevertByCapability.set(capabilityId, toRevert);\n }\n }\n return newEntries;\n}\n\nexport async function rollBackApply(\n ctx: Context,\n pluginById: Map<string, AgemonPlugin>,\n journal: ApplyJournal,\n options: { saveFailedRestores: boolean },\n): Promise<RollbackOutcome> {\n const outcome: RollbackOutcome = {\n restored: [],\n reverted: [],\n kept: [],\n manualCleanup: [],\n unsavedCount: 0,\n };\n const unrestoredTargets = await rollBackSnapshots(\n ctx,\n await classifySnapshots(ctx, journal),\n options,\n outcome,\n );\n\n const { toRevertByCapability, kept, workspace } = partitionNewEntries(\n ctx.manifest.getActions(),\n journal,\n pluginById,\n unrestoredTargets,\n );\n for (const [capabilityId, entries] of toRevertByCapability) {\n try {\n await pluginById.get(capabilityId)?.revert?.(ctx, entries);\n outcome.reverted.push(capabilityId);\n } catch (revertError) {\n outcome.manualCleanup.push(\n `${capabilityId}: ${printable(errorMessage(revertError))}`,\n );\n kept.push(...entries);\n }\n }\n const removedDirectoryEntryIds = await removeEmptyDirectories(\n ctx,\n workspace.filter((entry) => ctx.manifest.isConfirmed(entry)),\n );\n kept.push(\n ...workspace.filter((entry) => !removedDirectoryEntryIds.has(entry.id)),\n );\n\n try {\n await ctx.manifest.restoreActions([...journal.ledgerBefore, ...kept]);\n } catch (ledgerError) {\n outcome.manualCleanup.push(`ledger: ${errorMessage(ledgerError)}`);\n }\n outcome.kept = await describeKeptChanges(ctx, pluginById, journal);\n return outcome;\n}\n\nasync function describeKeptChanges(\n ctx: Context,\n pluginById: Map<string, AgemonPlugin>,\n journal: ApplyJournal,\n): Promise<string[]> {\n return (await describeKeptSubjects(ctx, pluginById, journal)).map(\n (subject) => `Kept ${subject}`,\n );\n}\n\nexport async function describeKeptSubjects(\n ctx: Context,\n pluginById: Map<string, AgemonPlugin>,\n journal: ApplyJournal,\n): Promise<string[]> {\n let operations: ProposedOperation[];\n try {\n operations = (await readPlan(ctx.cwd, journal.planId)).operations;\n } catch {\n return [];\n }\n const lines: string[] = [];\n for (const capabilityId of journal.capabilityOrder) {\n const describeKept =\n pluginById.get(capabilityId)?.describeKeptAfterRollback;\n if (describeKept === undefined) {\n continue;\n }\n try {\n lines.push(\n ...(await describeKept(\n ctx,\n operations.filter(\n (operation) => operation.capabilityId === capabilityId,\n ),\n )),\n );\n } catch {\n // A kept-changes note is informational; the rollback itself already finished.\n }\n }\n return lines;\n}\n","import type { AgemonPlugin } from \"../plugins/types.js\";\nimport {\n type ApplyJournal,\n deleteJournal,\n invalidJournalError,\n readJournals,\n} from \"./apply-journal.js\";\nimport type { Context } from \"./context.js\";\nimport {\n type ClassifiedSnapshot,\n classifySnapshots,\n describeKeptSubjects,\n partitionNewEntries,\n rollBackApply,\n} from \"./rollback.js\";\nimport { checkAgemonStateDirectoryBeforeRun } from \"./state-root.js\";\nimport { printable } from \"./untrusted-text.js\";\nimport {\n describeDirectoryRemoval,\n isCreatedDirectoryEntry,\n} from \"./workspace-footprint.js\";\n\nexport const RECOVER_LIMIT_NOTE =\n \"Work a capability had started but not yet recorded when the apply was interrupted is not undone. Check 'agemon status' for tools the interrupted apply may have installed.\";\nconst TEMPORARY_FILES_NOTE =\n \"Interrupted writes may leave '<file>.tmp-<pid>-<id>' files next to the targets; delete them if present.\";\n\nfunction describeSnapshotStep({ snapshot, state }: ClassifiedSnapshot): string {\n const target = printable(snapshot.targetPath);\n if (state === \"restore\") {\n return snapshot.previousContents === null\n ? `remove ${target}`\n : `restore ${target}`;\n }\n const keep = `keep ${target} and agemon's ledger entry for it (changed since the interrupted apply)`;\n return snapshot.previousContents === null\n ? keep\n : `${keep}; save its pre-apply contents beside it (${target}.agemon-original, or a timestamped name if that exists)`;\n}\n\nfunction assertCapabilitiesAreRegistered(\n journalPath: string,\n journal: ApplyJournal,\n pluginById: Map<string, AgemonPlugin>,\n): void {\n const unknownCapabilityIds = journal.capabilityOrder.filter(\n (capabilityId) => !pluginById.has(capabilityId),\n );\n if (unknownCapabilityIds.length > 0) {\n throw invalidJournalError(\n journalPath,\n `it names unknown capabilities: ${unknownCapabilityIds.map(printable).join(\", \")}`,\n );\n }\n}\n\nfunction buildRecoverySteps(\n ctx: Context,\n journal: ApplyJournal,\n pluginById: Map<string, AgemonPlugin>,\n classified: ClassifiedSnapshot[],\n): string[] {\n const steps = classified\n .filter(({ state }) => state !== \"unchanged\")\n .map(describeSnapshotStep);\n const changedTargets = new Set(\n classified\n .filter(({ state }) => state === \"changed-since\")\n .map(({ snapshot }) => snapshot.targetPath),\n );\n const { toRevertByCapability, kept, workspace } = partitionNewEntries(\n ctx.manifest.getActions(),\n journal,\n pluginById,\n changedTargets,\n );\n for (const [capabilityId, entries] of toRevertByCapability) {\n steps.push(\n `revert ${capabilityId}: ${entries.map((entry) => printable(entry.target)).join(\", \")}`,\n );\n }\n steps.push(\n ...describeDirectoryRemoval(\n workspace.filter((entry) => ctx.manifest.isConfirmed(entry)),\n ),\n );\n const ledgerAfterRecovery = [\n ...journal.ledgerBefore,\n ...kept,\n ...workspace.filter(\n (entry) =>\n !isCreatedDirectoryEntry(entry) || !ctx.manifest.isConfirmed(entry),\n ),\n ];\n if (\n JSON.stringify(ctx.manifest.getActions()) !==\n JSON.stringify(ledgerAfterRecovery)\n ) {\n steps.push(\n journal.ledgerBefore.length === 0\n ? \"ledger: remove the entries the apply added\"\n : `ledger: reset to its ${journal.ledgerBefore.length} pre-apply entries`,\n );\n }\n return steps;\n}\n\nasync function selectSingleJournal(\n ctx: Context,\n): Promise<{ path: string; journal: ApplyJournal } | null> {\n const journals = await readJournals(ctx.cwd);\n if (journals.length > 1) {\n throw new Error(\n `Found ${journals.length} interrupted-apply journals for this repository, so agemon cannot tell which to restore first:\\n${journals\n .map((stored) => ` ${stored.path}`)\n .join(\n \"\\n\",\n )}\\nMove all but one aside, run 'agemon recover', then put the next one back.`,\n );\n }\n return journals[0] ?? null;\n}\n\nexport async function recoverInterruptedApply(\n ctx: Context,\n allPlugins: AgemonPlugin[],\n options: { dryRun: boolean },\n): Promise<void> {\n await checkAgemonStateDirectoryBeforeRun(options.dryRun, (line) =>\n ctx.ui.info(line),\n );\n const stored = await selectSingleJournal(ctx);\n if (stored === null) {\n ctx.log.log(\"Nothing to recover.\");\n return;\n }\n const { path: journalPath, journal } = stored;\n const pluginById = new Map(\n allPlugins.map((plugin) => [plugin.id, plugin] as const),\n );\n assertCapabilitiesAreRegistered(journalPath, journal, pluginById);\n\n const classified = await classifySnapshots(ctx, journal);\n const steps = buildRecoverySteps(ctx, journal, pluginById, classified);\n const keptSubjects = await describeKeptSubjects(ctx, pluginById, journal);\n if (steps.length === 0) {\n if (!options.dryRun) {\n await deleteJournal(journalPath);\n }\n ctx.log.log(\n keptSubjects.length === 0\n ? `Nothing to recover: the files and the ledger already match their state before plan ${journal.planId}.\\n${RECOVER_LIMIT_NOTE}`\n : `Nothing to undo for plan ${journal.planId}; agemon keeps what it already finished:\\n${keptSubjects\n .map((subject) => ` - Kept ${printable(subject)}`)\n .join(\"\\n\")}\\n${RECOVER_LIMIT_NOTE}`,\n );\n return;\n }\n\n const plannedSteps = [\n ...steps,\n ...keptSubjects.map((subject) => `keep ${printable(subject)}`),\n ];\n ctx.log.log(\n `The apply of plan ${journal.planId} (started ${journal.startedAt}) was interrupted. Recovering it will:\\n${plannedSteps\n .map((step) => ` - ${step}`)\n .join(\"\\n\")}\\n${RECOVER_LIMIT_NOTE}`,\n );\n if (options.dryRun) {\n return;\n }\n if (!ctx.yes && !ctx.interactive) {\n throw new Error(\"Nothing restored: re-run interactively or with --yes.\");\n }\n if (!(await ctx.confirm(\"Restore these changes?\"))) {\n throw new Error(\n \"Nothing restored. agemon stays blocked in this repository until 'agemon recover' completes.\",\n );\n }\n\n const outcome = await rollBackApply(ctx, pluginById, journal, {\n saveFailedRestores: true,\n });\n for (const line of outcome.restored) {\n ctx.ui.succeed(line);\n }\n for (const capabilityId of outcome.reverted) {\n ctx.ui.succeed(`reverted ${capabilityId}`);\n }\n for (const line of outcome.kept) {\n ctx.ui.info(printable(line));\n }\n for (const detail of outcome.manualCleanup) {\n ctx.ui.fail(`manual cleanup needed: ${detail}`);\n }\n ctx.log.log(TEMPORARY_FILES_NOTE);\n\n if (outcome.unsavedCount > 0) {\n throw new Error(\n `Kept the journal ${journalPath}, because it holds the only copy of ${outcome.unsavedCount} file(s) agemon could not restore or save. Fix the problem above and re-run 'agemon recover'. Deleting the journal unblocks agemon but discards those contents.`,\n );\n }\n await deleteJournal(journalPath);\n if (outcome.manualCleanup.length > 0) {\n throw new Error(\n \"Recovery finished, but some changes need manual cleanup (listed above).\",\n );\n }\n ctx.ui.succeed(`Recovered the interrupted apply of plan ${journal.planId}.`);\n}\n","import { constants } from \"node:fs\";\nimport { access, lstat, readdir, realpath, rm, rmdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { resolveHomeDirectory } from \"../platform/home.js\";\nimport { theme } from \"../ui/theme.js\";\nimport { withFileLock } from \"./file-lock.js\";\nimport {\n assertCurrentUserOwns,\n assertRootUsesItsOwnEnvironment,\n currentUid,\n isProtectedInstallDirectory,\n readInstallTreeVersion,\n} from \"./install-location.js\";\nimport type { InstallMethod } from \"./install-method.js\";\nimport {\n readMachineLedger,\n type SharedResourceId,\n withMachineLedgerLock,\n withoutMissingHolders,\n} from \"./machine-ledger.js\";\nimport { confirmOrPreview, shellQuoted } from \"./self-upgrade.js\";\nimport { resolveAgemonStateDirectory } from \"./state-root.js\";\nimport { printable } from \"./untrusted-text.js\";\nimport { resolveAgemonCacheDirectory } from \"./update-check.js\";\n\nconst BIN_LINK_CANDIDATES = (home: string) => [\n join(home, \".local\", \"bin\", \"agemon\"),\n \"/usr/local/bin/agemon\",\n];\nconst PREVIOUS_INSTALL_SUFFIX = \".prev\";\nconst MACHINE_LOCK_FILE_NAME = \"machine.lock\";\nconst GROUP_AND_OTHER_WRITE_BITS = 0o022;\nconst UPDATE_CHECK_CACHE_FILE_NAME = \"update-check.json\";\nconst LEDGER_KEY_FILE_NAME = \"ledger-key\";\nconst LEDGER_KEY_REMOVAL_NOTE =\n \"agemon's ledger key is removed too: if you install agemon again, it treats what it recorded in repositories before as unconfirmed and leaves it alone.\";\nconst ENTRIES_AGEMON_CREATES_IN_ITS_STATE =\n /^((machine\\.json|ledger-key)(\\.tmp-.+)?|(machine|tools|skills-src|ledger-key)\\.lock(\\.break)?|tools|skills-src|journals|runs)$/;\n\nexport interface SharedToolRemoval {\n id: SharedResourceId;\n toolName: string;\n manualRemoveCommand: string;\n}\n\nexport interface SelfUninstallRequest {\n method: InstallMethod;\n yes: boolean;\n dryRun: boolean;\n sharedTools: SharedToolRemoval[];\n}\n\ninterface MachineStateUse {\n blockers: string[];\n repositoriesWithState: string[];\n unusedSharedToolCommands: string[];\n}\n\ninterface RemovalPlan {\n binLinks: string[];\n previousInstall: string | null;\n machineState: string | null;\n removesLedgerKey: boolean;\n cacheDirectory: string | null;\n installDir: string;\n kept: string[];\n problems: string[];\n machineStateUse: MachineStateUse;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readEntriesUnlessMissing(\n directory: string,\n options: { recursive: boolean },\n) {\n try {\n return await readdir(directory, {\n recursive: options.recursive,\n withFileTypes: true,\n });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n}\n\nasync function hasAnyFile(directory: string): Promise<boolean> {\n return (await readEntriesUnlessMissing(directory, { recursive: true })).some(\n (entry) => !entry.isDirectory(),\n );\n}\n\nasync function isAnyRunLockHeld(stateDirectory: string): Promise<boolean> {\n const runsDirectory = join(stateDirectory, \"runs\");\n const lockNames = (\n await readEntriesUnlessMissing(runsDirectory, { recursive: false })\n )\n .map((entry) => entry.name)\n .filter((name) => name.endsWith(\".lock\"));\n for (const lockName of lockNames) {\n try {\n await withFileLock(join(runsDirectory, lockName), async () => {}, {\n waitMs: 0,\n });\n } catch {\n return true;\n }\n }\n return false;\n}\n\nasync function unknownStateEntries(stateDirectory: string): Promise<string[]> {\n return (await readdir(stateDirectory)).filter(\n (entry) => !ENTRIES_AGEMON_CREATES_IN_ITS_STATE.test(entry),\n );\n}\n\nasync function describeMachineStateUse(\n stateDirectory: string,\n sharedTools: SharedToolRemoval[],\n): Promise<MachineStateUse> {\n const ledger = await readMachineLedger();\n const blockers: string[] = [];\n const repositories = new Set<string>();\n const unusedSharedToolCommands: string[] = [];\n for (const [id, record] of Object.entries(ledger.resources)) {\n const tool = sharedTools.find((candidate) => candidate.id === id) ?? {\n toolName: id,\n manualRemoveCommand: `remove ${id} yourself`,\n };\n const liveHolders = await withoutMissingHolders(record.holders, () => {});\n if (liveHolders.length > 0) {\n blockers.push(\n `${tool.toolName} is still used by ${liveHolders.map(printable).join(\", \")}`,\n );\n for (const holder of liveHolders) {\n repositories.add(holder);\n }\n } else if (record.origin === \"installed\") {\n unusedSharedToolCommands.push(tool.manualRemoveCommand);\n } else if (record.origin === \"migrated\") {\n unusedSharedToolCommands.push(\n `${tool.manualRemoveCommand} (it may have been installed by an older agemon)`,\n );\n }\n }\n if (await hasAnyFile(join(stateDirectory, \"journals\"))) {\n blockers.push(\"an interrupted apply can still be recovered\");\n }\n if (await isAnyRunLockHeld(stateDirectory)) {\n blockers.push(\"agemon is running in another repository\");\n }\n const unknownEntries = await unknownStateEntries(stateDirectory);\n if (unknownEntries.length > 0) {\n blockers.push(\n `it holds ${unknownEntries.map(printable).join(\", \")}, which agemon does not create`,\n );\n }\n const repositoriesWithState: string[] = [];\n for (const repository of repositories) {\n if (await pathExists(join(repository, \".agemon\", \"state.json\"))) {\n repositoriesWithState.push(repository);\n }\n }\n return {\n blockers,\n repositoriesWithState,\n unusedSharedToolCommands,\n };\n}\n\nasync function linksToInstall(\n linkPath: string,\n installDir: string,\n): Promise<boolean> {\n try {\n return (\n (await lstat(linkPath)).isSymbolicLink() &&\n (await realpath(linkPath)) === join(installDir, \"bin\", \"agemon.js\")\n );\n } catch {\n return false;\n }\n}\n\nasync function checkRemovable(path: string, problems: string[]): Promise<void> {\n try {\n await assertCurrentUserOwns(path);\n } catch (error) {\n problems.push((error as Error).message);\n }\n}\n\nasync function isPrivateDirectoryOfThisUser(path: string): Promise<boolean> {\n try {\n const stats = await lstat(path);\n return (\n stats.isDirectory() &&\n stats.uid === currentUid() &&\n (stats.mode & GROUP_AND_OTHER_WRITE_BITS) === 0\n );\n } catch {\n return false;\n }\n}\n\nasync function planInstallScriptRemoval(\n installDir: string,\n sharedTools: SharedToolRemoval[],\n): Promise<RemovalPlan> {\n if ((await readInstallTreeVersion(installDir)) === null) {\n throw new Error(\n `${printable(installDir)} has no .agemon-install marker from the install script; remove it by hand if it is agemon.`,\n );\n }\n if (await isProtectedInstallDirectory(installDir)) {\n throw new Error(\n `${printable(installDir)} is a system or home directory; refusing to remove it.`,\n );\n }\n const kept: string[] = [];\n const problems: string[] = [];\n await checkRemovable(installDir, problems);\n\n const binLinks: string[] = [];\n for (const linkPath of BIN_LINK_CANDIDATES(resolveHomeDirectory())) {\n if (await linksToInstall(linkPath, installDir)) {\n try {\n await access(dirname(linkPath), constants.W_OK);\n binLinks.push(linkPath);\n } catch {\n problems.push(`${linkPath} is in a directory you cannot write to.`);\n }\n }\n }\n\n const previousDir = `${installDir}${PREVIOUS_INSTALL_SUFFIX}`;\n let previousInstall: string | null = null;\n if ((await readInstallTreeVersion(previousDir)) !== null) {\n await checkRemovable(previousDir, problems);\n previousInstall = previousDir;\n } else if (await pathExists(previousDir)) {\n kept.push(`${printable(previousDir)}: not created by the agemon installer`);\n }\n\n let machineState: string | null = null;\n let removesLedgerKey = false;\n let machineStateUse: MachineStateUse = {\n blockers: [],\n repositoriesWithState: [],\n unusedSharedToolCommands: [],\n };\n try {\n const stateDirectory = (await resolveAgemonStateDirectory(\"check\")).path;\n if (await pathExists(stateDirectory)) {\n if (await hasAnyFile(join(stateDirectory, \"journals\"))) {\n problems.push(\n \"An interrupted apply can still be recovered: run 'agemon recover' in that repository before removing agemon.\",\n );\n }\n machineStateUse = await describeMachineStateUse(\n stateDirectory,\n sharedTools,\n );\n if (machineStateUse.blockers.length === 0) {\n await checkRemovable(stateDirectory, problems);\n machineState = stateDirectory;\n removesLedgerKey = await pathExists(\n join(stateDirectory, LEDGER_KEY_FILE_NAME),\n );\n } else {\n kept.push(\n `${printable(stateDirectory)}: ${machineStateUse.blockers.join(\"; \")}`,\n );\n }\n }\n } catch (error) {\n kept.push(`agemon's machine state: ${(error as Error).message}`);\n }\n\n const cacheDirectory = resolveAgemonCacheDirectory();\n let removableCache: string | null = null;\n if (!(await pathExists(cacheDirectory))) {\n removableCache = null;\n } else if (!(await isPrivateDirectoryOfThisUser(cacheDirectory))) {\n kept.push(\n `${printable(cacheDirectory)}: not a private directory owned by you`,\n );\n } else if (\n (await readdir(cacheDirectory)).some(\n (entry) => entry !== UPDATE_CHECK_CACHE_FILE_NAME,\n )\n ) {\n kept.push(\n `${printable(cacheDirectory)}: it holds files agemon does not create`,\n );\n } else {\n await checkRemovable(cacheDirectory, problems);\n removableCache = cacheDirectory;\n }\n\n return {\n binLinks,\n previousInstall,\n machineState,\n removesLedgerKey,\n cacheDirectory: removableCache,\n installDir,\n kept,\n problems,\n machineStateUse,\n };\n}\n\nfunction printRepositoryNotes(use: MachineStateUse): void {\n if (use.repositoriesWithState.length > 0) {\n console.log(\n [\n \"These repositories still have agemon-managed files; run 'agemon nuke' in each first.\",\n \"(Only repositories that use a shared tool are known to agemon.)\",\n ...use.repositoriesWithState.map((path) => ` ${printable(path)}`),\n ].join(\"\\n\"),\n );\n }\n if (use.unusedSharedToolCommands.length > 0) {\n console.log(\n [\n \"Shared tools no repository uses any more; remove them yourself if nothing else needs them:\",\n ...use.unusedSharedToolCommands.map((command) => ` ${command}`),\n ].join(\"\\n\"),\n );\n }\n}\n\nfunction removalTargets(plan: RemovalPlan): string[] {\n return [\n ...plan.binLinks,\n ...(plan.previousInstall ? [plan.previousInstall] : []),\n ...(plan.machineState ? [plan.machineState] : []),\n ...(plan.cacheDirectory ? [plan.cacheDirectory] : []),\n plan.installDir,\n ];\n}\n\nfunction printPlan(plan: RemovalPlan): void {\n console.log(\n [\n \"agemon self-uninstall removes:\",\n ...removalTargets(plan).map((path) => ` ${printable(path)}`),\n ...(plan.kept.length > 0\n ? [\"and keeps:\", ...plan.kept.map((reason) => ` ${reason}`)]\n : []),\n \"It never changes files inside repositories.\",\n ...(plan.removesLedgerKey ? [LEDGER_KEY_REMOVAL_NOTE] : []),\n ].join(\"\\n\"),\n );\n printRepositoryNotes(plan.machineStateUse);\n}\n\nasync function removeMachineState(\n stateDirectory: string,\n sharedTools: SharedToolRemoval[],\n): Promise<string | null> {\n const blockers = await withMachineLedgerLock(async () => {\n const use = await describeMachineStateUse(stateDirectory, sharedTools);\n if (use.blockers.length > 0) {\n return use.blockers;\n }\n for (const entry of await readdir(stateDirectory)) {\n if (entry !== MACHINE_LOCK_FILE_NAME) {\n await rm(join(stateDirectory, entry), { recursive: true, force: true });\n }\n }\n return [];\n });\n if (blockers.length > 0) {\n return `${printable(stateDirectory)}: ${blockers.join(\"; \")}`;\n }\n try {\n await rmdir(stateDirectory);\n return null;\n } catch {\n return `${printable(stateDirectory)}: another agemon run wrote to it while it was being removed`;\n }\n}\n\nasync function removeAll(\n plan: RemovalPlan,\n sharedTools: SharedToolRemoval[],\n): Promise<string[]> {\n const leftBehind: string[] = [];\n const attempt = async (path: string, removal: () => Promise<unknown>) => {\n try {\n await removal();\n } catch (error) {\n leftBehind.push(`${printable(path)}: ${(error as Error).message}`);\n }\n };\n for (const linkPath of plan.binLinks) {\n await attempt(linkPath, () => rm(linkPath));\n }\n if (plan.previousInstall) {\n const previousInstall = plan.previousInstall;\n await attempt(previousInstall, () =>\n rm(previousInstall, { recursive: true, force: true }),\n );\n }\n if (plan.machineState) {\n const machineState = plan.machineState;\n await attempt(machineState, async () => {\n const keptReason = await removeMachineState(machineState, sharedTools);\n if (keptReason !== null) {\n leftBehind.push(keptReason);\n }\n });\n }\n if (plan.cacheDirectory) {\n const cacheDirectory = plan.cacheDirectory;\n await attempt(cacheDirectory, async () => {\n await rm(join(cacheDirectory, UPDATE_CHECK_CACHE_FILE_NAME), {\n force: true,\n });\n await rmdir(cacheDirectory);\n });\n }\n await attempt(plan.installDir, () =>\n rm(plan.installDir, { recursive: true, force: true }),\n );\n return leftBehind;\n}\n\nasync function printNonScriptGuidance(\n request: SelfUninstallRequest & {\n method: Exclude<InstallMethod, { kind: \"install-script\" }>;\n },\n): Promise<number> {\n const { method } = request;\n switch (method.kind) {\n case \"npm-global\":\n console.log(\n `agemon was installed with npm. Remove it with: npm uninstall --global --prefix ${shellQuoted(printable(method.prefix))} agemon`,\n );\n try {\n const stateDirectory = (await resolveAgemonStateDirectory(\"check\"))\n .path;\n if (await pathExists(stateDirectory)) {\n printRepositoryNotes(\n await describeMachineStateUse(stateDirectory, request.sharedTools),\n );\n }\n } catch (error) {\n console.log(\n `(Could not read agemon's machine state to list repositories: ${(error as Error).message})`,\n );\n }\n return 0;\n case \"npx\":\n console.log(\n \"agemon is running through npx; there is no install to remove (npx keeps it only in its cache).\",\n );\n return 0;\n case \"dev\":\n throw new Error(\n \"This is a source checkout; agemon will not delete it. Remove it yourself.\",\n );\n case \"unknown\":\n throw new Error(\n `agemon cannot tell how ${printable(method.packageRoot)} was installed, so it will not remove it. Uninstall it the way you installed it.`,\n );\n }\n}\n\nexport async function runSelfUninstall(\n request: SelfUninstallRequest,\n): Promise<number> {\n const { method } = request;\n if (method.kind !== \"install-script\") {\n return printNonScriptGuidance({ ...request, method });\n }\n assertRootUsesItsOwnEnvironment();\n const plan = await planInstallScriptRemoval(\n method.installDir,\n request.sharedTools,\n );\n if (plan.problems.length > 0) {\n throw new Error(\n `Nothing was removed:\\n${plan.problems.map((problem) => ` ${problem}`).join(\"\\n\")}`,\n );\n }\n printPlan(plan);\n if (request.dryRun) {\n return 0;\n }\n if (!(await confirmOrPreview(\"Remove agemon from this machine?\", request))) {\n return 0;\n }\n const leftBehind = await removeAll(plan, request.sharedTools);\n if (leftBehind.length > 0) {\n console.error(\n theme.danger(\n [\n \"agemon was only partly removed. Still present:\",\n ...leftBehind.map((line) => ` ${line}`),\n ].join(\"\\n\"),\n ),\n );\n return 1;\n }\n console.log(theme.ok(\"agemon is removed from this machine.\"));\n return 0;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdtemp, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { theme } from \"../ui/theme.js\";\nimport { sha256Hex } from \"./fingerprint.js\";\nimport {\n CHECKSUMS_ASSET_NAME,\n compareReleaseVersions,\n downloadReleaseAsset,\n fetchLatestReleaseVersion,\n GITHUB_REPOSITORY,\n parseReleaseVersion,\n RELEASE_WORKFLOW,\n readExpectedChecksum,\n releaseAssetUrl,\n} from \"./github-release.js\";\nimport {\n assertCurrentUserOwns,\n assertRootUsesItsOwnEnvironment,\n isDefaultInstallDirectory,\n readInstallTreeVersion,\n} from \"./install-location.js\";\nimport type { InstallMethod } from \"./install-method.js\";\nimport { isInteractiveTerminal, promptYesNo } from \"./prompt.js\";\nimport {\n agemonSubprocessEnvironment,\n describeSubprocessFailure,\n runSubprocess,\n} from \"./subprocess-runner.js\";\nimport { printable } from \"./untrusted-text.js\";\n\nconst INSTALLER_ASSET_NAME = \"install.sh\";\nconst TARBALL_ASSET_NAME = \"agemon.tgz\";\nconst MAX_SCRIPT_ASSET_BYTES = 1024 * 1024;\nconst MAX_TARBALL_ASSET_BYTES = 20 * 1024 * 1024;\nconst LATEST_LOOKUP_TIMEOUT_MS = 20_000;\nconst NPM_INSTALL_TIMEOUT_MS = 300_000;\nconst ATTESTATION_TIMEOUT_MS = 120_000;\nconst VERSION_PROBE_TIMEOUT_MS = 20_000;\nconst PRIVATE_FILE_MODE = 0o600;\nconst PREVIOUS_INSTALL_SUFFIX = \".prev\";\n\ntype ReleaseInstallMethod = Extract<\n InstallMethod,\n { kind: \"install-script\" | \"npm-global\" }\n>;\n\nasync function withPrivateTempDirectory<Result>(\n work: (directory: string) => Promise<Result>,\n): Promise<Result> {\n const directory = await mkdtemp(join(tmpdir(), \"agemon-upgrade-\"));\n try {\n return await work(directory);\n } finally {\n await rm(directory, { recursive: true, force: true });\n }\n}\n\nasync function downloadVerifiedAsset(\n version: string,\n assetName: string,\n maxBytes: number,\n directory: string,\n): Promise<string> {\n const [asset, checksums] = await Promise.all([\n downloadReleaseAsset(version, assetName, maxBytes),\n downloadReleaseAsset(version, CHECKSUMS_ASSET_NAME, MAX_SCRIPT_ASSET_BYTES),\n ]);\n const expectedChecksum = readExpectedChecksum(\n checksums.toString(\"utf8\"),\n assetName,\n );\n const assetPath = join(directory, assetName);\n await writeFile(assetPath, asset, { mode: PRIVATE_FILE_MODE });\n if (sha256Hex(await readFile(assetPath)) !== expectedChecksum) {\n throw new Error(\n `${assetName} does not match the release's ${CHECKSUMS_ASSET_NAME}`,\n );\n }\n return assetPath;\n}\n\nasync function installThroughScript(\n installDir: string,\n targetVersion: string,\n installerVersion: string,\n): Promise<void> {\n const environment: Record<string, string> = {\n ...agemonSubprocessEnvironment(),\n AGEMON_VERSION: targetVersion,\n };\n delete environment.AGEMON_INSTALL_DIR;\n if (!(await isDefaultInstallDirectory(installDir))) {\n environment.AGEMON_INSTALL_DIR = installDir;\n }\n await withPrivateTempDirectory(async (directory) => {\n const scriptPath = await downloadVerifiedAsset(\n installerVersion,\n INSTALLER_ASSET_NAME,\n MAX_SCRIPT_ASSET_BYTES,\n directory,\n );\n await verifyAttestationIfRequested(scriptPath);\n execFileSync(\"sh\", [scriptPath], { stdio: \"inherit\", env: environment });\n });\n}\n\nasync function verifyAttestationIfRequested(assetPath: string): Promise<void> {\n if (process.env.AGEMON_VERIFY_ATTESTATION !== \"1\") {\n return;\n }\n const result = await runSubprocess(\n \"gh\",\n [\n \"attestation\",\n \"verify\",\n assetPath,\n \"--repo\",\n GITHUB_REPOSITORY,\n \"--signer-workflow\",\n RELEASE_WORKFLOW,\n \"--deny-self-hosted-runners\",\n ],\n { timeoutMs: ATTESTATION_TIMEOUT_MS },\n );\n if (result.code !== 0) {\n throw new Error(\n `Build provenance verification failed (gh must be logged in): ${describeSubprocessFailure(result, \"gh attestation verify\")}`,\n );\n }\n}\n\nasync function installThroughNpm(\n prefix: string,\n targetVersion: string,\n): Promise<void> {\n await withPrivateTempDirectory(async (directory) => {\n const tarballPath = await downloadVerifiedAsset(\n targetVersion,\n TARBALL_ASSET_NAME,\n MAX_TARBALL_ASSET_BYTES,\n directory,\n );\n await verifyAttestationIfRequested(tarballPath);\n const installResult = await runSubprocess(\n \"npm\",\n [\n \"install\",\n \"--global\",\n \"--ignore-scripts\",\n \"--no-audit\",\n \"--no-fund\",\n \"--prefix\",\n prefix,\n tarballPath,\n ],\n { cwd: directory, timeoutMs: NPM_INSTALL_TIMEOUT_MS },\n );\n if (installResult.code !== 0) {\n throw new Error(\n `npm install failed: ${describeSubprocessFailure(installResult, \"npm install\")}`,\n );\n }\n });\n const probe = await runSubprocess(\n join(prefix, \"bin\", \"agemon\"),\n [\"--version\"],\n { timeoutMs: VERSION_PROBE_TIMEOUT_MS },\n );\n if (probe.stdout.trim() !== targetVersion) {\n throw new Error(\n `${printable(join(prefix, \"bin\", \"agemon\"))} reports '${printable(probe.stdout.trim())}' after the install, expected ${targetVersion}.`,\n );\n }\n}\n\nfunction newerOf(version: string, other: string | undefined): string {\n return other !== undefined && compareReleaseVersions(other, version) > 0\n ? other\n : version;\n}\n\nexport async function installRelease(\n method: ReleaseInstallMethod,\n targetVersion: string,\n latestVersion: string | undefined,\n): Promise<void> {\n assertRootUsesItsOwnEnvironment();\n if (method.kind === \"install-script\") {\n await assertCurrentUserOwns(method.installDir);\n await installThroughScript(\n method.installDir,\n targetVersion,\n newerOf(targetVersion, latestVersion),\n );\n return;\n }\n await assertCurrentUserOwns(join(method.prefix, \"lib\", \"node_modules\"));\n await installThroughNpm(method.prefix, targetVersion);\n}\n\nexport function shellQuoted(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction printNpmSteps(prefix: string, version: string): void {\n console.log(\n [\n `cd \"$(mktemp -d)\"`,\n `curl -fsSLO ${releaseAssetUrl(version, TARBALL_ASSET_NAME)}`,\n `curl -fsSLO ${releaseAssetUrl(version, CHECKSUMS_ASSET_NAME)}`,\n `grep ' ${TARBALL_ASSET_NAME}$' ${CHECKSUMS_ASSET_NAME} | sha256sum -c - # macOS: shasum -a 256 -c -`,\n `gh attestation verify ${TARBALL_ASSET_NAME} --repo ${GITHUB_REPOSITORY} --signer-workflow ${RELEASE_WORKFLOW} --deny-self-hosted-runners # optional`,\n `npm install --global --ignore-scripts --prefix ${shellQuoted(printable(prefix))} ./${TARBALL_ASSET_NAME}`,\n ].join(\"\\n\"),\n );\n}\n\nasync function lookUpLatestVersion(): Promise<string | undefined> {\n try {\n return await fetchLatestReleaseVersion(\n AbortSignal.timeout(LATEST_LOOKUP_TIMEOUT_MS),\n );\n } catch {\n return undefined;\n }\n}\n\nexport async function confirmOrPreview(\n question: string,\n options: { yes: boolean },\n): Promise<boolean> {\n if (options.yes) {\n return true;\n }\n if (!isInteractiveTerminal()) {\n console.log(`${question} Re-run with --yes to go ahead.`);\n return false;\n }\n return promptYesNo(question);\n}\n\nfunction refuseOtherMethods(\n method: InstallMethod,\n requestedVersion: string | undefined,\n): ReleaseInstallMethod | null {\n switch (method.kind) {\n case \"install-script\":\n case \"npm-global\":\n return method;\n case \"npx\":\n console.log(\n `npx runs the version you ask for; use 'npx agemon@${requestedVersion ?? \"latest\"}'.`,\n );\n return null;\n case \"dev\":\n throw new Error(\"This is a source checkout; update it with git.\");\n case \"unknown\":\n throw new Error(\n `agemon cannot tell how ${printable(method.packageRoot)} was installed. Update it the way you installed it, or reinstall with 'npm install --global agemon' or the install script.`,\n );\n }\n}\n\nexport interface UpgradeRequest {\n method: InstallMethod;\n runningVersion: string;\n version?: string;\n print: boolean;\n yes: boolean;\n}\n\nfunction parseRequestedVersion(\n version: string | undefined,\n): string | undefined {\n if (version === undefined) {\n return undefined;\n }\n const parsed = parseReleaseVersion(version);\n if (parsed === undefined) {\n throw new Error(\n `${printable(version)} is not a release version; use one such as 4.8.0 or v4.8.0-rc.1.`,\n );\n }\n return parsed;\n}\n\nexport async function runUpgrade(request: UpgradeRequest): Promise<number> {\n const requestedVersion = parseRequestedVersion(request.version);\n const method = refuseOtherMethods(request.method, requestedVersion);\n if (method === null) {\n return 0;\n }\n if (request.print && method.kind !== \"npm-global\") {\n throw new Error(\n \"--print applies only to npm installs; this copy was installed by the install script.\",\n );\n }\n const latestVersion = await lookUpLatestVersion();\n const targetVersion = requestedVersion ?? latestVersion;\n if (targetVersion === undefined) {\n throw new Error(\n \"Could not look up the latest agemon release on GitHub. Retry later, or name the version: 'agemon upgrade <version>'.\",\n );\n }\n\n const runningVersion = parseReleaseVersion(request.runningVersion);\n if (runningVersion === undefined && requestedVersion === undefined) {\n throw new Error(\n `The running agemon reports ${printable(request.runningVersion)}, which is not a release version; name the version to install: 'agemon upgrade <version>'.`,\n );\n }\n const direction =\n runningVersion === undefined\n ? -1\n : compareReleaseVersions(targetVersion, runningVersion);\n if (direction === 0 || (requestedVersion === undefined && direction < 0)) {\n console.log(\n theme.ok(\n requestedVersion === undefined\n ? `agemon ${request.runningVersion} is up to date (latest release: ${targetVersion}).`\n : `agemon ${request.runningVersion} is already installed.`,\n ),\n );\n return 0;\n }\n if (request.print && method.kind === \"npm-global\") {\n printNpmSteps(method.prefix, targetVersion);\n return 0;\n }\n if (direction < 0) {\n if (latestVersion === undefined) {\n throw new Error(\n \"Could not confirm the newest installer on GitHub, which a downgrade runs. Retry later.\",\n );\n }\n const confirmed = await confirmOrPreview(\n `Downgrade agemon ${request.runningVersion} -> ${targetVersion}?`,\n request,\n );\n if (!confirmed) {\n return 0;\n }\n }\n\n console.log(\n theme.accent(\n `Installing agemon ${targetVersion} (running ${request.runningVersion})...`,\n ),\n );\n await installRelease(method, targetVersion, latestVersion);\n console.log(theme.ok(`agemon ${targetVersion} is installed.`));\n return 0;\n}\n\nasync function assertPreviousInstallRuns(\n previousDir: string,\n previousVersion: string,\n): Promise<void> {\n const probe = await runSubprocess(\n process.execPath,\n [join(previousDir, \"bin\", \"agemon.js\"), \"--version\"],\n { timeoutMs: VERSION_PROBE_TIMEOUT_MS },\n );\n if (probe.stdout.trim() !== previousVersion) {\n throw new Error(\n `${printable(previousDir)} reports '${printable(probe.stdout.trim())}', not the ${printable(previousVersion)} its marker names; it cannot be rolled back to.`,\n );\n }\n}\n\nasync function swapWithPreviousInstall(\n installDir: string,\n previousDir: string,\n): Promise<void> {\n const asideDir = `${installDir}.rollback-${randomUUID().slice(0, 8)}`;\n await rename(installDir, asideDir);\n try {\n await rename(previousDir, installDir);\n } catch (error) {\n try {\n await rename(asideDir, installDir);\n } catch {\n throw new Error(\n `Rollback failed and the current install could not be put back. Move ${printable(asideDir)} back to ${printable(installDir)} by hand.`,\n );\n }\n throw error;\n }\n try {\n await rename(asideDir, previousDir);\n } catch {\n console.error(\n theme.danger(\n `Rolled back, but the replaced install stays at ${printable(asideDir)}; move it to ${printable(previousDir)} to be able to switch back.`,\n ),\n );\n }\n}\n\nexport async function runRollback(request: {\n method: InstallMethod;\n yes: boolean;\n}): Promise<number> {\n if (request.method.kind !== \"install-script\") {\n throw new Error(\n request.method.kind === \"npm-global\"\n ? \"--rollback is only for install-script installs. With npm, run 'agemon upgrade <previous version>'.\"\n : \"--rollback is only for install-script installs.\",\n );\n }\n assertRootUsesItsOwnEnvironment();\n const { installDir } = request.method;\n const previousDir = `${installDir}${PREVIOUS_INSTALL_SUFFIX}`;\n const currentVersion = await readInstallTreeVersion(installDir);\n const previousVersion = await readInstallTreeVersion(previousDir);\n if (previousVersion === null || currentVersion === null) {\n throw new Error(\n `No previous install was kept at ${printable(previousDir)}. Install a specific version with 'agemon upgrade <version>'.`,\n );\n }\n await assertCurrentUserOwns(installDir);\n await assertCurrentUserOwns(previousDir);\n await assertPreviousInstallRuns(previousDir, previousVersion);\n\n const confirmed = await confirmOrPreview(\n `Switch agemon ${currentVersion} -> ${previousVersion} (the previous install at ${printable(previousDir)})?`,\n request,\n );\n if (!confirmed) {\n return 0;\n }\n await swapWithPreviousInstall(installDir, previousDir);\n console.log(\n theme.ok(\n `Switched to agemon ${previousVersion}. ${currentVersion} is kept as ${printable(previousDir)}; run 'agemon upgrade --rollback' again to switch back.`,\n ),\n );\n return 0;\n}\n","import { readBoundedBody } from \"./bounded-response.js\";\n\nexport const GITHUB_REPOSITORY = \"Korak-997/agemon\";\nexport const RELEASE_WORKFLOW = `${GITHUB_REPOSITORY}/.github/workflows/release.yml`;\nconst LATEST_RELEASE_API_URL = `https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/latest`;\nconst RELEASE_DOWNLOAD_BASE_URL = `https://github.com/${GITHUB_REPOSITORY}/releases/download`;\nexport const CHECKSUMS_ASSET_NAME = \"SHA256SUMS\";\nconst RELEASE_VERSION_PATTERN = /^\\d+\\.\\d+\\.\\d+(-(alpha|beta|rc)\\.\\d+)?$/;\nconst SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/;\nconst PRERELEASE_CHANNEL_ORDER = [\"alpha\", \"beta\", \"rc\"];\nconst RELEASE_DOWNLOAD_TIMEOUT_MS = 30_000;\nconst USER_AGENT = \"agemon-update-check\";\nconst MAX_LATEST_RELEASE_RESPONSE_BYTES = 1024 * 1024;\n\nexport function parseReleaseVersion(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const version = value.replace(/^v/, \"\");\n return RELEASE_VERSION_PATTERN.test(version) ? version : undefined;\n}\n\ninterface ReleaseVersionParts {\n core: number[];\n prerelease: [channel: number, number: number] | null;\n}\n\nfunction splitReleaseVersion(version: string): ReleaseVersionParts {\n const [core, prerelease] = version.split(\"-\");\n if (prerelease === undefined) {\n return { core: core.split(\".\").map(Number), prerelease: null };\n }\n const [channel, number] = prerelease.split(\".\");\n return {\n core: core.split(\".\").map(Number),\n prerelease: [PRERELEASE_CHANNEL_ORDER.indexOf(channel), Number(number)],\n };\n}\n\nexport function compareReleaseVersions(left: string, right: string): number {\n const leftParts = splitReleaseVersion(left);\n const rightParts = splitReleaseVersion(right);\n for (let index = 0; index < 3; index += 1) {\n const difference = leftParts.core[index] - rightParts.core[index];\n if (difference !== 0) {\n return Math.sign(difference);\n }\n }\n if (leftParts.prerelease === null || rightParts.prerelease === null) {\n return (\n Number(leftParts.prerelease === null) -\n Number(rightParts.prerelease === null)\n );\n }\n const channelDifference = leftParts.prerelease[0] - rightParts.prerelease[0];\n return Math.sign(\n channelDifference || leftParts.prerelease[1] - rightParts.prerelease[1],\n );\n}\n\nexport async function fetchLatestReleaseVersion(\n signal: AbortSignal,\n): Promise<string | undefined> {\n const response = await fetch(LATEST_RELEASE_API_URL, {\n headers: { \"User-Agent\": USER_AGENT },\n signal,\n });\n if (!response.ok || !response.body) {\n return undefined;\n }\n const bodyBytes = await readBoundedBody(\n response.body,\n MAX_LATEST_RELEASE_RESPONSE_BYTES,\n () => new Error(\"the latest-release response is larger than expected\"),\n );\n const body = JSON.parse(bodyBytes.toString(\"utf8\")) as {\n tag_name?: unknown;\n };\n return parseReleaseVersion(body.tag_name);\n}\n\nexport function releaseAssetUrl(version: string, assetName: string): string {\n return `${RELEASE_DOWNLOAD_BASE_URL}/v${version}/${assetName}`;\n}\n\nexport async function downloadReleaseAsset(\n version: string,\n assetName: string,\n maxBytes: number,\n): Promise<Buffer> {\n const response = await fetch(releaseAssetUrl(version, assetName), {\n headers: { \"User-Agent\": USER_AGENT },\n signal: AbortSignal.timeout(RELEASE_DOWNLOAD_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(\n `downloading ${assetName} failed with HTTP ${response.status}`,\n );\n }\n if (!response.body) {\n throw new Error(`downloading ${assetName} returned no body`);\n }\n const declaredBytes = Number(response.headers.get(\"content-length\") ?? 0);\n if (declaredBytes > maxBytes) {\n throw new Error(`${assetName} is larger than expected`);\n }\n return readBoundedBody(\n response.body,\n maxBytes,\n () => new Error(`${assetName} is larger than expected`),\n );\n}\n\nexport function readExpectedChecksum(\n checksums: string,\n assetName: string,\n): string {\n const assetLines = checksums\n .split(\"\\n\")\n .map((line) => line.replace(/\\r$/, \"\"))\n .filter((line) => {\n const listedName = line.split(/\\s+/).at(-1);\n return listedName === assetName || listedName === `*${assetName}`;\n });\n const [hash] = assetLines.length === 1 ? assetLines[0].split(\" \") : [];\n if (\n !hash ||\n !SHA256_HEX_PATTERN.test(hash) ||\n assetLines[0] !== `${hash} ${assetName}`\n ) {\n throw new Error(\n `${CHECKSUMS_ASSET_NAME} has no single valid entry for ${assetName}`,\n );\n }\n return hash;\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join } from \"node:path\";\nimport { theme } from \"../ui/theme.js\";\nimport { isDevMode } from \"./dev-mode.js\";\nimport {\n compareReleaseVersions,\n fetchLatestReleaseVersion,\n parseReleaseVersion,\n} from \"./github-release.js\";\nimport { assertRootUsesItsOwnEnvironment } from \"./install-location.js\";\nimport { type InstallMethod, resolveInstallMethod } from \"./install-method.js\";\nimport { isInteractiveTerminal, promptYesNo } from \"./prompt.js\";\nimport { installRelease } from \"./self-upgrade.js\";\n\nconst UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;\nconst UPDATE_CHECK_TIMEOUT_MS = 3_000;\n\ninterface UpdateCheckCache {\n lastCheckedAt: string;\n latestVersion: string;\n}\n\nexport function resolveAgemonCacheDirectory(): string {\n const configuredCacheHome = process.env.XDG_CACHE_HOME;\n const cacheHome =\n configuredCacheHome && isAbsolute(configuredCacheHome)\n ? configuredCacheHome\n : join(homedir(), \".cache\");\n return join(cacheHome, \"agemon\");\n}\n\nfunction resolveCachePath(): string {\n return join(resolveAgemonCacheDirectory(), \"update-check.json\");\n}\n\nfunction isUpdateCheckCache(value: unknown): value is UpdateCheckCache {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const { lastCheckedAt, latestVersion } = value as Record<string, unknown>;\n return (\n typeof lastCheckedAt === \"string\" &&\n !Number.isNaN(Date.parse(lastCheckedAt)) &&\n parseReleaseVersion(latestVersion) === latestVersion\n );\n}\n\nfunction readCache(cachePath: string): UpdateCheckCache | undefined {\n try {\n const cache: unknown = JSON.parse(readFileSync(cachePath, \"utf8\"));\n return isUpdateCheckCache(cache) ? cache : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeCache(cachePath: string, cache: UpdateCheckCache): void {\n try {\n mkdirSync(dirname(cachePath), { recursive: true });\n writeFileSync(cachePath, JSON.stringify(cache), \"utf8\");\n } catch {\n // Caching is a pure optimization — a failure here must never block the CLI.\n }\n}\n\nasync function resolveLatestVersion(\n signal: AbortSignal,\n): Promise<string | undefined> {\n const cachePath = resolveCachePath();\n const cached = readCache(cachePath);\n const cacheAge = cached\n ? Date.now() - Date.parse(cached.lastCheckedAt)\n : Infinity;\n\n if (cached && cacheAge < UPDATE_CHECK_INTERVAL_MS) {\n return cached.latestVersion;\n }\n\n try {\n const fetchedVersion = await fetchLatestReleaseVersion(\n AbortSignal.any([signal, AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS)]),\n );\n if (fetchedVersion) {\n writeCache(cachePath, {\n lastCheckedAt: new Date().toISOString(),\n latestVersion: fetchedVersion,\n });\n return fetchedVersion;\n }\n } catch {\n // Offline, rate-limited, or GitHub unreachable — fall through to any\n // stale cached value rather than failing the whole command.\n }\n\n return cached?.latestVersion;\n}\n\nexport interface UpdateCheckInput {\n currentVersion: string;\n dryRun: boolean;\n quiet: boolean;\n}\n\nexport type UpdateCheckOutcome = \"updated\" | \"update-failed\" | \"not-updated\";\n\nexport interface PendingUpdateCheck {\n finish(options: { yes: boolean }): Promise<UpdateCheckOutcome>;\n abort(): void;\n}\n\nconst CI_DISABLED_VALUES: readonly string[] = [\"\", \"0\", \"false\"];\n\nfunction isRunningInCi(): boolean {\n const ci = process.env.CI;\n return ci !== undefined && !CI_DISABLED_VALUES.includes(ci.toLowerCase());\n}\n\nfunction isUpdateCheckDisabled(input: UpdateCheckInput): boolean {\n return (\n input.dryRun ||\n input.quiet ||\n isRunningInCi() ||\n isDevMode() ||\n process.env.AGEMON_NO_UPDATE_CHECK === \"1\"\n );\n}\n\nfunction runsWithItsOwnEnvironment(): boolean {\n try {\n assertRootUsesItsOwnEnvironment();\n return true;\n } catch {\n return false;\n }\n}\n\nfunction upgradeHint(\n kind: InstallMethod[\"kind\"],\n latestVersion: string,\n): string {\n switch (kind) {\n case \"install-script\":\n return \"Run 'agemon upgrade' to install it.\";\n case \"npm-global\":\n return `Run 'agemon upgrade' (or 'npm install --global agemon@${latestVersion}').`;\n case \"npx\":\n return \"Run 'npx agemon@latest' to use it.\";\n default:\n return \"Update this copy the way you installed it.\";\n }\n}\n\nasync function offerUpdate(\n latestVersion: string | undefined,\n currentVersion: string,\n options: { yes: boolean },\n): Promise<UpdateCheckOutcome> {\n const runningVersion = parseReleaseVersion(currentVersion);\n if (\n !latestVersion ||\n !runningVersion ||\n compareReleaseVersions(latestVersion, runningVersion) <= 0\n ) {\n return \"not-updated\";\n }\n\n const updateNotice = `A new version of agemon is available: ${currentVersion} -> ${latestVersion}.`;\n if (!runsWithItsOwnEnvironment()) {\n console.log(\n theme.accent(`${updateNotice} Run 'agemon upgrade' to install it.`),\n );\n return \"not-updated\";\n }\n const method = await resolveInstallMethod();\n const canInstallHere =\n method.kind === \"install-script\" || method.kind === \"npm-global\";\n\n if (options.yes || !isInteractiveTerminal() || !canInstallHere) {\n console.log(\n theme.accent(\n `${updateNotice} ${upgradeHint(method.kind, latestVersion)}`,\n ),\n );\n return \"not-updated\";\n }\n\n const shouldUpdate = await promptYesNo(`${updateNotice} Install it now?`);\n if (!shouldUpdate) {\n return \"not-updated\";\n }\n\n console.log(theme.accent(\"Updating agemon...\"));\n try {\n await installRelease(method, latestVersion, latestVersion);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n console.error(\n theme.danger(\n `Automatic update failed (${reason}). Run 'agemon upgrade' to retry.`,\n ),\n );\n return \"update-failed\";\n }\n\n console.log(theme.ok(`Updated to ${latestVersion}.`));\n return \"updated\";\n}\n\nexport function startUpdateCheck(\n input: UpdateCheckInput,\n): PendingUpdateCheck | null {\n if (isUpdateCheckDisabled(input)) {\n return null;\n }\n\n const controller = new AbortController();\n let lookup: { latestVersion: string | undefined } | null = null;\n resolveLatestVersion(controller.signal).then(\n (latestVersion) => {\n lookup = { latestVersion };\n },\n () => {\n lookup = { latestVersion: undefined };\n },\n );\n\n return {\n async finish(options) {\n if (lookup === null) {\n controller.abort();\n return \"not-updated\";\n }\n return offerUpdate(lookup.latestVersion, input.currentVersion, options);\n },\n abort() {\n controller.abort();\n },\n };\n}\n","import type { AgentDetectionRow } from \"../adapters/types.js\";\nimport { printable } from \"../core/untrusted-text.js\";\nimport type { ClassifiedResource, ResourceState } from \"../inspect/classify.js\";\nimport { describeOverlap } from \"../inspect/duplication.js\";\nimport type { InspectReport } from \"../inspect/index.js\";\nimport type { CapabilityState } from \"../plugins/types.js\";\nimport { badge, section } from \"./format.js\";\nimport { renderTable } from \"./table.js\";\nimport { theme } from \"./theme.js\";\n\nconst RESOURCE_STATE_TONE: Record<ResourceState, Parameters<typeof badge>[1]> =\n {\n absent: \"neutral\",\n equivalent: \"ok\",\n \"managed-current\": \"ok\",\n \"managed-drifted\": \"warn\",\n mergeable: \"warn\",\n conflict: \"danger\",\n unmanaged: \"neutral\",\n invalid: \"danger\",\n };\n\nconst CAPABILITY_STATE_LABEL: Record<CapabilityState, string> = {\n \"present-managed\": \"present · managed\",\n \"present-adopted\": \"present · adopted\",\n \"present-modified\": \"present · changed\",\n absent: \"absent\",\n declined: \"absent · declined\",\n unknown: \"unknown\",\n};\n\nconst CAPABILITY_STATE_TONE: Record<\n CapabilityState,\n Parameters<typeof badge>[1]\n> = {\n \"present-managed\": \"ok\",\n \"present-adopted\": \"warn\",\n \"present-modified\": \"warn\",\n absent: \"neutral\",\n declined: \"neutral\",\n unknown: \"warn\",\n};\n\nfunction resourceRow(resource: ClassifiedResource): string[] {\n return [\n printable(resource.path),\n badge(resource.state, RESOURCE_STATE_TONE[resource.state]),\n printable(resource.detail ?? \"\"),\n ];\n}\n\nfunction agentStateLabel(row: AgentDetectionRow): string {\n const parts = [row.configured ? \"configured\" : \"not configured\"];\n if (row.installation.level !== \"configured\") {\n parts.push(row.installation.level);\n }\n return parts.join(\", \");\n}\n\nfunction agentStateTone(row: AgentDetectionRow): Parameters<typeof badge>[1] {\n if (\n row.installation.level === \"installed\" ||\n row.installation.level === \"usable\"\n ) {\n return \"ok\";\n }\n return row.configured ? \"warn\" : \"neutral\";\n}\n\nfunction agentDetail(row: AgentDetectionRow): string {\n const { installation } = row;\n if (installation.executablePath) {\n return `${installation.executablePath}${\n installation.version ? ` v${installation.version}` : \"\"\n }`;\n }\n if (installation.evidence.length > 0) {\n return installation.evidence.join(\"; \");\n }\n return row.configured ? \"not probed\" : \"\";\n}\n\nfunction agentRow(row: AgentDetectionRow): string[] {\n return [\n row.displayName,\n badge(agentStateLabel(row), agentStateTone(row)),\n agentDetail(row),\n ];\n}\n\nexport function renderInspectReport(report: InspectReport): string {\n const blocks: string[] = [];\n\n blocks.push(section(\"Workspace isolation\").trimStart());\n blocks.push(` .agemon/ gitignore status: ${report.isolation.status}`);\n if (report.isolation.trackedAgemonPaths.length > 0) {\n blocks.push(\n ` ${theme.warn(\n `tracked .agemon/ paths: ${report.isolation.trackedAgemonPaths.join(\", \")}`,\n )}`,\n );\n }\n if (report.isolation.trackingCheckError !== null) {\n blocks.push(` ${theme.warn(report.isolation.trackingCheckError)}`);\n }\n if (report.configError !== null) {\n blocks.push(` ${theme.warn(report.configError)}`);\n }\n\n blocks.push(section(\"Resources\"));\n blocks.push(\n renderTable([\n [\"RESOURCE\", \"STATE\", \"DETAIL\"],\n ...report.resources.map(resourceRow),\n ]),\n );\n\n blocks.push(section(\"Capabilities\"));\n if (report.capabilities.length === 0) {\n blocks.push(\" no capability reports state in this repo\");\n } else {\n blocks.push(\n renderTable([\n [\"CAPABILITY\", \"RESOURCE\", \"STATE\", \"DETAIL\"],\n ...report.capabilities.map((row) => [\n row.capabilityId,\n row.resourceId,\n badge(\n CAPABILITY_STATE_LABEL[row.state],\n CAPABILITY_STATE_TONE[row.state],\n ),\n printable(row.detail ?? \"\"),\n ]),\n ]),\n );\n }\n\n blocks.push(section(\"Structured config\"));\n blocks.push(\n renderTable([\n [\"FILE\", \"STATUS\", \"REDACTED\"],\n ...report.structuredConfig.map((config) => [\n config.path,\n config.status,\n String(config.redactedPaths.length),\n ]),\n ]),\n );\n\n blocks.push(section(\"Machine capabilities\"));\n blocks.push(\n renderTable([\n [\"BINARY\", \"PRESENT\"],\n ...report.binaries.map((binary) => [\n binary.name,\n binary.present ? \"yes\" : \"no\",\n ]),\n ]),\n );\n\n blocks.push(section(\"Agents\"));\n blocks.push(\n renderTable([[\"AGENT\", \"STATE\", \"DETAIL\"], ...report.agents.map(agentRow)]),\n );\n\n blocks.push(section(\"Duplication\"));\n if (report.duplication.overlaps.length === 0) {\n blocks.push(\" no overlapping instruction content detected\");\n } else {\n blocks.push(\n ...report.duplication.overlaps.map(\n (overlap) => ` ${describeOverlap(overlap)}`,\n ),\n );\n }\n\n return blocks.join(\"\\n\");\n}\n","import { detectAgents } from \"../adapters/detect.js\";\nimport type { AgentDetectionRow } from \"../adapters/types.js\";\nimport type { Context } from \"../core/context.js\";\nimport { resolveCurrentDesiredRevision } from \"../plugins/desired-revision.js\";\nimport { getRegisteredPlugins } from \"../plugins/index.js\";\nimport type { AgemonPlugin, CapabilityStateRow } from \"../plugins/types.js\";\nimport { renderInspectReport } from \"../ui/inspect-view.js\";\nimport { collectCapabilityStates } from \"./capabilities.js\";\nimport { type ClassifiedResource, classifyResources } from \"./classify.js\";\nimport { discoverRepository } from \"./discover.js\";\nimport { type DuplicationReport, detectDuplication } from \"./duplication.js\";\nimport { redactJsonValue } from \"./redact.js\";\n\nexport type StructuredConfigStatus =\n | \"present\"\n | \"absent\"\n | \"invalid\"\n | \"excluded\";\n\nexport interface RedactedStructuredConfig {\n path: string;\n status: StructuredConfigStatus;\n redacted: unknown;\n redactedPaths: string[];\n detail: string | null;\n}\n\nexport interface InspectReport {\n isolation: {\n status: string;\n trackedAgemonPaths: string[];\n trackingCheckError: string | null;\n };\n configError: string | null;\n resources: ClassifiedResource[];\n capabilities: CapabilityStateRow[];\n structuredConfig: RedactedStructuredConfig[];\n binaries: { name: string; present: boolean }[];\n duplication: DuplicationReport;\n agents: AgentDetectionRow[];\n}\n\nexport interface InspectOptions {\n checkAgentsUsable?: boolean;\n configError?: string | null;\n}\n\nexport async function inspectRepository(\n ctx: Context,\n plugins: AgemonPlugin[] = getRegisteredPlugins(),\n options: InspectOptions = {},\n): Promise<InspectReport> {\n const discovery = await discoverRepository(ctx);\n const agents = await detectAgents(ctx, discovery, {\n checkUsable: options.checkAgentsUsable,\n });\n const resources = classifyResources(\n discovery,\n ctx.manifest.getActions(),\n (resourceId) => resolveCurrentDesiredRevision(plugins, ctx, resourceId),\n );\n const capabilities = await collectCapabilityStates(ctx, plugins);\n\n const structuredConfig: RedactedStructuredConfig[] =\n discovery.structuredConfigs.map((resource) => {\n if (resource.denylisted) {\n return {\n path: resource.path,\n status: \"excluded\",\n redacted: null,\n redactedPaths: [],\n detail: \"private local config\",\n };\n }\n if (!resource.exists) {\n return {\n path: resource.path,\n status: \"absent\",\n redacted: null,\n redactedPaths: [],\n detail: null,\n };\n }\n if (resource.parseError !== null) {\n return {\n path: resource.path,\n status: \"invalid\",\n redacted: null,\n redactedPaths: [],\n detail: resource.parseError,\n };\n }\n const { value, redactedPaths } = redactJsonValue(resource.parsed);\n return {\n path: resource.path,\n status: \"present\",\n redacted: value,\n redactedPaths,\n detail: null,\n };\n });\n\n const duplication = detectDuplication(\n discovery.ruleFiles.map((file) => ({\n path: file.path,\n contents: file.contents,\n })),\n );\n\n return {\n isolation: {\n status: discovery.isolation.status,\n trackedAgemonPaths: discovery.isolation.trackedAgemonPaths,\n trackingCheckError: discovery.isolation.trackingCheckError,\n },\n configError: options.configError ?? null,\n resources,\n capabilities,\n structuredConfig,\n binaries: discovery.binaries.map((binary) => ({\n name: binary.name,\n present: binary.present,\n })),\n duplication,\n agents,\n };\n}\n\nexport async function runInspect(\n ctx: Context,\n options: InspectOptions & { json: boolean },\n): Promise<void> {\n const report = await inspectRepository(ctx, undefined, options);\n\n if (options.json) {\n ctx.log.log(JSON.stringify(report, null, 2));\n return;\n }\n\n ctx.log.log(renderInspectReport(report));\n}\n","import boxen from \"boxen\";\nimport { theme } from \"./theme.js\";\n\nexport function renderBanner(title: string, message: string): string {\n return boxen(`${theme.heading(title)}\\n\\n${message}`, {\n padding: 1,\n borderColor: \"cyan\",\n borderStyle: \"round\",\n });\n}\n","import { log as clackLog, spinner as clackSpinner } from \"@clack/prompts\";\nimport { symbol } from \"./symbols.js\";\nimport { theme } from \"./theme.js\";\n\nexport interface StepOptions {\n step?: number;\n total?: number;\n}\n\nexport interface StepSpinner {\n start(label: string, options?: StepOptions): void;\n succeed(label?: string): void;\n fail(label?: string): void;\n info(label: string): void;\n}\n\ninterface StepSpinnerOptions {\n animated?: boolean;\n}\n\nfunction isAnimatedTerminal(): boolean {\n return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;\n}\n\nfunction formatElapsed(startedAt: number): string {\n const seconds = (Date.now() - startedAt) / 1000;\n return `${seconds.toFixed(1)}s`;\n}\n\nexport function createStepSpinner(\n spinnerOptions: StepSpinnerOptions = {},\n): StepSpinner {\n const isInteractive = (): boolean =>\n spinnerOptions.animated !== false && isAnimatedTerminal();\n let autoStep = 0;\n let active: ReturnType<typeof clackSpinner> | undefined;\n let currentLabel = \"\";\n let startedAt = Date.now();\n let stepActive = false;\n\n const prefix = (options?: StepOptions): string => {\n autoStep += 1;\n const step = options?.step ?? autoStep;\n return options?.total ? `[${step}/${options.total}] ` : `[${step}] `;\n };\n\n return {\n start(label, options) {\n currentLabel = label;\n startedAt = Date.now();\n stepActive = true;\n const line = `${prefix(options)}${label}`;\n if (isInteractive()) {\n active = clackSpinner({ indicator: \"timer\" });\n active.start(line);\n } else {\n console.log(line);\n }\n },\n succeed(label) {\n const text = label ?? currentLabel;\n stepActive = false;\n if (isInteractive() && active) {\n active.stop(theme.ok(text));\n active = undefined;\n } else {\n const elapsed = theme.dim(` ${formatElapsed(startedAt)}`);\n console.log(`${theme.ok(`${symbol(\"ok\")} ${text}`)}${elapsed}`);\n }\n },\n fail(label) {\n const text = label ?? currentLabel;\n stepActive = false;\n if (isInteractive() && active) {\n active.error(text);\n active = undefined;\n } else {\n console.log(theme.danger(`${symbol(\"fail\")} ${text}`));\n }\n },\n info(label) {\n if (isInteractive()) {\n if (active) {\n active.message(label);\n } else {\n clackLog.info(label);\n }\n } else {\n console.log(theme.accent(stepActive ? ` ${label}` : label));\n }\n },\n };\n}\n"],"mappings":"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K,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAA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","names":["ESC","CSI","cursor","y","erase","i","env","cursor","cliBoxes","ansiRegex","stripAnsi","stringWidth","i","stringWidth","ansiAlign","relative","ELLIPSIS","i","l","NO_TRUNCATION","dist_default","dist_default","i","l","r","t","n","n","n","i","t","r","a","c","m","h","i","t","l","t","styleText","import_sisteransi","styleText","r","l","i","m","a","c","W","y","t","n","h","u","styleText","i","u","t","a","r","n","l","h","styleText","r","m","l","c","t","u","i","y","l","styleText","h","n","m","I","u","r","a","i","y","t","c","styleText","process","stripVTControlCharacters","stripVTControlCharacters","cmd","a","visibleWidth","str","a","i","process","stripVTControlCharacters","regex","m","i","option","path","join","join","exists","join","path","join","dirname","constants","access","realpath","stat","dirname","join","join","realpath","path","stat","access","constants","dirname","markerPath","readdir","join","join","readdir","dirname","existsSync","mkdir","readdir","readFile","rm","join","join","readFile","mkdir","rm","readdir","existsSync","mkdir","readFile","rm","dirname","join","readdir","join","join","readdir","resolveUser","join","readFile","rm","mkdir","dirname","pc","symbol","symbol","createInterface","beforeIndex","afterIndex","useColor","tools","log","lstat","realpath","rm","join","realpath","stdout","path","lstat","join","depth","section","rm","randomUUID","rm","dirname","join","lstat","rm","writeFile","join","path","join","lstat","writeFile","rm","lstat","realpath","rm","join","resolve","path","resolve","lstat","realpath","join","rm","lstat","rm","join","SKILLS_LOCK_FILE","path","removesLastCapability","lstat","join","rm","join","randomUUID","dirname","rm","chmod","lstat","mkdtemp","readFile","realpath","rm","writeFile","tmpdir","join","mkdtemp","join","writeFile","lstat","chmod","rm","readFile","path","readPackageVersion","realpath","tmpdir","constants","constants","access","rm","relative","constants","access","delimiter","join","stdout","delimiter","join","access","constants","mkdir","readdir","realpath","rm","join","join","realpath","mkdir","path","rm","readdir","realpath","path","realpath","unregisteredResourceMayNeedRemoval","path","process","i","isFullWidth","isFullWidth","process","styles","chalk","styles","segmenter","defaultIgnorableCodePointRegex","stringWidth","stringWidth","preserveConsecutiveUppercase","segmenter","defaultIgnorableCodePointRegex","stringWidth","ANSI_BACKGROUND_OFFSET","wrapAnsi16","wrapAnsi256","wrapAnsi16m","styles","modifierNames","foregroundColorNames","backgroundColorNames","colorNames","assembleStyles","ansiStyles","ansi_styles_default","END_CODE","ANSI_ESCAPE_BELL","ANSI_CSI","ANSI_OSC","ANSI_SGR_TERMINATOR","ANSI_ESCAPE_LINK","wrapAnsiCode","wrapAnsiHyperlink","stringWidth","wrapWord","stringVisibleTrimSpacesRight","exec","code","ansi_styles_default","wrapAnsi","import_cli_boxes","env","stdout","process","cliBoxes","ansiAlign","wrapAnsi","content","segmenter","stringWidth","stringWidth","cursor","path","symbol","a","CANONICAL_RULE_FILE","POINTER_MAX_NORMALIZED_LENGTH","detail","readFile","join","relative","rm","relative","rm","relative","FRONTMATTER_FENCE","readFile","relative","detectAgents","path","join","lstat","join","PLUGIN_ID","join","lstat","lstat","rm","join","readFile","join","readFile","join","join","join","lstat","readdir","join","path","join","readdir","lstat","constants","access","realpath","stat","basename","delimiter","dirname","isAbsolute","join","resolve","VERSION_CHECK_TIMEOUT_MS","pathExists","path","stat","join","isAbsolute","resolve","dirname","basename","realpath","access","constants","delimiter","PLUGIN_ID","UNINSTALL_TIMEOUT_MS","getPluginActions","confirmedPluginActions","lstat","join","rm","createHash","realpath","stat","basename","isAbsolute","join","PLUGIN_ID","realpath","createHash","basename","getPluginActions","path","stat","isAbsolute","join","mkdir","dirname","join","PLUGIN_ID","POINTER_MAX_NORMALIZED_LENGTH","pluginActions","classifyRuleFile","join","mkdir","dirname","existsSync","join","mkdir","mkdtemp","rm","writeFile","join","sourceLabel","join","mkdir","writeFile","mkdtemp","rm","randomBytes","lstat","realpath","rename","rm","join","path","lstat","join","realpath","randomBytes","rename","rm","lstat","realpath","join","recordedInstallFingerprints","join","realpath","lstat","PLUGIN_ID","hasManagedInstallRecord","join","classify","path","existsSync","symbol","n","title","symbol","join","join","join","installedFingerprint","oneOf","rm","relative","rm","relative","kept","join","skipReason","progress","path","access","relative","rm","keep","kept","constants","access","lstat","readdir","realpath","rm","rmdir","dirname","join","randomUUID","mkdtemp","readFile","rename","rm","writeFile","tmpdir","join","NPM_INSTALL_TIMEOUT_MS","PRIVATE_FILE_MODE","mkdtemp","join","tmpdir","rm","writeFile","readFile","randomUUID","rename","homedir","dirname","isAbsolute","join","isAbsolute","join","homedir","dirname","join","PREVIOUS_INSTALL_SUFFIX","MACHINE_LOCK_FILE_NAME","LEDGER_KEY_FILE_NAME","pathExists","path","lstat","readdir","realpath","kept","access","dirname","constants","rm","rmdir","CAPABILITY_STATE_LABEL","CAPABILITY_STATE_TONE","isInteractive","symbol","symbol","relative","spinner","exitCodeFor","program"]}