agemon 0.1.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.
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "agemon",
3
+ "version": "0.1.0",
4
+ "description": "One command bootstraps an AI coding agent's working environment in any repo.",
5
+ "license": "MIT",
6
+ "author": "Korak-997",
7
+ "homepage": "https://github.com/Korak-997/agemon#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Korak-997/agemon.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Korak-997/agemon/issues"
14
+ },
15
+ "keywords": [
16
+ "cli",
17
+ "ai-agent",
18
+ "claude-code",
19
+ "agent-rules",
20
+ "bootstrap",
21
+ "code-review-graph",
22
+ "developer-tools",
23
+ "automation"
24
+ ],
25
+ "type": "module",
26
+ "bin": {
27
+ "agemon": "bin/agemon.js"
28
+ },
29
+ "files": [
30
+ "bin",
31
+ "dist"
32
+ ],
33
+ "engines": {
34
+ "node": ">=24"
35
+ },
36
+ "scripts": {
37
+ "build": "tsup",
38
+ "prepublishOnly": "npm run build",
39
+ "dev": "AGEMON_DEV=1 tsx src/cli/index.ts",
40
+ "changeset": "changeset",
41
+ "version-packages": "changeset version",
42
+ "release": "changeset publish",
43
+ "typecheck": "tsc --noEmit",
44
+ "lint": "biome check .",
45
+ "format": "biome format --write .",
46
+ "test": "vitest run",
47
+ "sandbox": "tsx scripts/sandbox.ts",
48
+ "sandbox:watch": "tsx scripts/sandbox.ts watch",
49
+ "sandbox:roundtrip": "tsx scripts/sandbox.ts roundtrip",
50
+ "sandbox:reset": "tsx scripts/sandbox.ts reset"
51
+ },
52
+ "dependencies": {
53
+ "boxen": "^8.0.1",
54
+ "commander": "^15.0.0",
55
+ "ora": "^9.4.1",
56
+ "picocolors": "^1.1.1",
57
+ "yaml": "^2.9.0"
58
+ },
59
+ "devDependencies": {
60
+ "@changesets/cli": "^2.29.7",
61
+ "@biomejs/biome": "^2.5.8",
62
+ "@types/node": "^26.2.0",
63
+ "tsup": "^8.5.1",
64
+ "tsx": "^4.23.12",
65
+ "typescript": "^7.0.2",
66
+ "vitest": "^4.1.10"
67
+ }
68
+ }