agentloopkit 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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/dist/cli/index.d.ts +2 -0
  4. package/dist/cli/index.js +1144 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/schema/agentloop.config.schema.json +142 -0
  7. package/dist/templates/agents/claude-code.md +18 -0
  8. package/dist/templates/agents/codex.md +27 -0
  9. package/dist/templates/agents/cursor.md +17 -0
  10. package/dist/templates/agents/gemini-cli.md +19 -0
  11. package/dist/templates/agents/generic.md +27 -0
  12. package/dist/templates/agents/github-copilot-cli.md +18 -0
  13. package/dist/templates/agents/opencode.md +18 -0
  14. package/dist/templates/gates/dependency-gate.md +24 -0
  15. package/dist/templates/gates/docs-gate.md +24 -0
  16. package/dist/templates/gates/implementation-gate.md +28 -0
  17. package/dist/templates/gates/regression-gate.md +25 -0
  18. package/dist/templates/gates/review-gate.md +24 -0
  19. package/dist/templates/gates/security-gate.md +26 -0
  20. package/dist/templates/gates/test-gate.md +24 -0
  21. package/dist/templates/handoffs/decision-log.md +13 -0
  22. package/dist/templates/handoffs/pr-summary.md +36 -0
  23. package/dist/templates/handoffs/release-notes.md +15 -0
  24. package/dist/templates/handoffs/reviewer-brief.md +13 -0
  25. package/dist/templates/handoffs/rollback-plan.md +11 -0
  26. package/dist/templates/handoffs/verification-report.md +13 -0
  27. package/dist/templates/harness/autonomous-work-rules.md +22 -0
  28. package/dist/templates/harness/commands.md +16 -0
  29. package/dist/templates/harness/definition-of-done.md +16 -0
  30. package/dist/templates/harness/release-checklist.md +11 -0
  31. package/dist/templates/harness/repo-map.md +16 -0
  32. package/dist/templates/harness/review-checklist.md +9 -0
  33. package/dist/templates/harness/working-agreement.md +11 -0
  34. package/dist/templates/loops/bugfix.md +36 -0
  35. package/dist/templates/loops/dependency-upgrade.md +34 -0
  36. package/dist/templates/loops/docs.md +35 -0
  37. package/dist/templates/loops/feature.md +38 -0
  38. package/dist/templates/loops/migration.md +35 -0
  39. package/dist/templates/loops/refactor.md +35 -0
  40. package/dist/templates/loops/release.md +35 -0
  41. package/dist/templates/loops/security-review.md +35 -0
  42. package/dist/templates/loops/test-generation.md +34 -0
  43. package/dist/templates/policies/database-change-policy.md +11 -0
  44. package/dist/templates/policies/dependency-change-policy.md +11 -0
  45. package/dist/templates/policies/git-policy.md +11 -0
  46. package/dist/templates/policies/no-destructive-actions.md +17 -0
  47. package/dist/templates/policies/public-api-change-policy.md +11 -0
  48. package/dist/templates/policies/secrets-policy.md +11 -0
  49. package/dist/templates/policies/security-policy.md +11 -0
  50. package/dist/templates/policies/ui-change-policy.md +11 -0
  51. package/dist/templates/root/AGENTLOOP.md +39 -0
  52. package/dist/templates/root/AGENTS.md +24 -0
  53. package/dist/templates/root/agentloop-directory-readme.md +36 -0
  54. package/dist/templates/root/agentloop.config.json +37 -0
  55. package/dist/templates/tasks/README.md +9 -0
  56. package/package.json +71 -0
  57. package/schema/agentloop.config.schema.json +142 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/core/init.ts","../../src/core/constants.ts","../../src/core/config.ts","../../src/core/errors.ts","../../src/core/file-system.ts","../../src/core/package-manager.ts","../../src/core/project-detection.ts","../../src/core/template-renderer.ts","../../src/core/logger.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor.ts","../../src/core/git.ts","../../src/core/safety.ts","../../src/cli/commands/create-task.ts","../../src/core/task-contract.ts","../../src/core/dates.ts","../../src/core/slug.ts","../../src/cli/commands/verify.ts","../../src/core/verification.ts","../../src/cli/commands/summarize.ts","../../src/core/pr-summary.ts","../../src/cli/commands/install-agent.ts","../../src/core/agent-installation.ts","../../src/cli/commands/list-templates.ts","../../src/cli/commands/version.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from './commands/init.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { createTaskCommand } from './commands/create-task.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { summarizeCommand } from './commands/summarize.js';\nimport { installAgentCommand } from './commands/install-agent.js';\nimport { listTemplatesCommand } from './commands/list-templates.js';\nimport { versionCommand } from './commands/version.js';\n\nconst program = new Command();\n\nprogram\n .name('agentloop')\n .description('A drop-in engineering loop for coding agents.')\n .version('0.1.0', '-V, --version', 'print CLI version');\n\nprogram.addCommand(initCommand());\nprogram.addCommand(doctorCommand());\nprogram.addCommand(createTaskCommand());\nprogram.addCommand(verifyCommand());\nprogram.addCommand(summarizeCommand());\nprogram.addCommand(installAgentCommand());\nprogram.addCommand(listTemplatesCommand());\nprogram.addCommand(versionCommand());\n\nprogram.parseAsync(process.argv).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`agentloop: ${message}`);\n process.exitCode = 1;\n});\n","import { Command } from 'commander';\nimport { initializeAgentLoop } from '../../core/init.js';\nimport { consoleLogger as logger } from '../../core/logger.js';\n\nexport function initCommand() {\n return new Command('init')\n .description('Initialize AgentLoopKit in the current repository')\n .option('--dry-run', 'show planned changes without writing files')\n .option('--json', 'print machine-readable output')\n .action(async (options: { dryRun?: boolean; json?: boolean }) => {\n const result = await initializeAgentLoop({ cwd: process.cwd(), dryRun: options.dryRun });\n if (options.json) {\n logger.info(JSON.stringify(result, null, 2));\n return;\n }\n logger.info(\n options.dryRun ? 'AgentLoopKit init dry run complete.' : 'AgentLoopKit initialized.',\n );\n logger.info(`Created: ${result.created.length}`);\n logger.info(`Updated: ${result.updated.length}`);\n logger.info(`Skipped: ${result.skipped.length}`);\n if (!options.dryRun) {\n logger.info('\\nNext steps:');\n logger.info('- Review AGENTS.md and AGENTLOOP.md');\n logger.info('- Run agentloop doctor');\n logger.info('- Create a task with agentloop create-task');\n }\n });\n}\n","import path from 'node:path';\nimport { readdir } from 'node:fs/promises';\nimport {\n AGENTLOOP_DIR,\n AGENTLOOP_FILE,\n AGENTS_FILE,\n CONFIG_FILE,\n TEMPLATE_GROUPS,\n} from './constants.js';\nimport { createDefaultConfig } from './config.js';\nimport { pathExists, readTextIfExists, writeTextFile } from './file-system.js';\nimport { detectPackageManager } from './package-manager.js';\nimport { detectPackageScripts, detectProjectName, detectProjectType } from './project-detection.js';\nimport { getTemplateRoot, readTemplate, TemplateValues } from './template-renderer.js';\n\nexport type InitResult = {\n created: string[];\n updated: string[];\n skipped: string[];\n dryRun: boolean;\n};\n\nasync function writeGeneratedFile(filePath: string, content: string, result: InitResult) {\n if (await pathExists(filePath)) {\n result.skipped.push(filePath);\n return;\n }\n if (result.dryRun) {\n result.created.push(filePath);\n return;\n }\n await writeTextFile(filePath, content);\n result.created.push(filePath);\n}\n\nasync function writeRenderedTemplateGroup(\n cwd: string,\n group: string,\n values: TemplateValues,\n result: InitResult,\n) {\n const templateDir = path.join(getTemplateRoot(), group);\n const entries = await readdir(templateDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const relative = `${group}/${entry.name}`;\n await writeGeneratedFile(\n path.join(cwd, AGENTLOOP_DIR, group, entry.name),\n await readTemplate(relative, values),\n result,\n );\n }\n}\n\nasync function upsertAgentsFile(cwd: string, content: string, result: InitResult) {\n const filePath = path.join(cwd, AGENTS_FILE);\n const existing = await readTextIfExists(filePath);\n const marker = '<!-- agentloopkit:start -->';\n if (!existing) {\n if (result.dryRun) {\n result.created.push(filePath);\n return;\n }\n await writeTextFile(filePath, content);\n result.created.push(filePath);\n return;\n }\n if (existing.includes(marker)) {\n result.skipped.push(filePath);\n return;\n }\n const section = content\n .replace(/^# AGENTS\\s*/i, '## AgentLoopKit\\n\\n')\n .replace('<!-- agentloopkit:start -->', marker);\n if (result.dryRun) {\n result.updated.push(filePath);\n return;\n }\n await writeTextFile(filePath, `${existing.trimEnd()}\\n\\n${section.trim()}\\n`);\n result.updated.push(filePath);\n}\n\nexport async function initializeAgentLoop(options: {\n cwd: string;\n dryRun?: boolean;\n}): Promise<InitResult> {\n const result: InitResult = {\n created: [],\n updated: [],\n skipped: [],\n dryRun: Boolean(options.dryRun),\n };\n const cwd = options.cwd;\n const packageManager = await detectPackageManager(cwd);\n const projectType = await detectProjectType(cwd);\n const projectName = await detectProjectName(cwd);\n const commands = await detectPackageScripts(cwd, packageManager);\n const config = createDefaultConfig({\n name: projectName,\n type: projectType,\n packageManager,\n commands,\n });\n const values = {\n projectName,\n projectType,\n packageManager,\n testCommand: commands.test || 'not configured',\n lintCommand: commands.lint || 'not configured',\n typecheckCommand: commands.typecheck || 'not configured',\n buildCommand: commands.build || 'not configured',\n formatCommand: commands.format || 'not configured',\n };\n\n for (const group of TEMPLATE_GROUPS) {\n if (group === 'tasks') continue;\n await writeRenderedTemplateGroup(cwd, group, values, result);\n }\n\n await writeGeneratedFile(\n path.join(cwd, AGENTLOOP_DIR, 'README.md'),\n await readTemplate('root/agentloop-directory-readme.md', values),\n result,\n );\n await writeGeneratedFile(\n path.join(cwd, AGENTLOOP_DIR, 'tasks', 'README.md'),\n await readTemplate('tasks/README.md', values),\n result,\n );\n await writeGeneratedFile(\n path.join(cwd, AGENTLOOP_DIR, 'reports', 'README.md'),\n '# Verification Reports\\n\\nAgentLoopKit writes verification reports here when you run `agentloop verify`.\\n',\n result,\n );\n\n const agentsContent = await readTemplate('root/AGENTS.md', values);\n await upsertAgentsFile(cwd, agentsContent, result);\n await writeGeneratedFile(\n path.join(cwd, AGENTLOOP_FILE),\n await readTemplate('root/AGENTLOOP.md', values),\n result,\n );\n\n const configPath = path.join(cwd, CONFIG_FILE);\n if (await pathExists(configPath)) {\n result.skipped.push(configPath);\n } else if (result.dryRun) {\n result.created.push(configPath);\n } else {\n await writeTextFile(configPath, `${JSON.stringify(config, null, 2)}\\n`);\n result.created.push(configPath);\n }\n\n return result;\n}\n","export const PRODUCT_NAME = 'AgentLoopKit';\nexport const PACKAGE_NAME = 'agentloopkit';\nexport const CLI_NAME = 'agentloop';\nexport const TAGLINE = 'A drop-in engineering loop for coding agents.';\nexport const CONFIG_FILE = 'agentloop.config.json';\nexport const AGENTLOOP_DIR = '.agentloop';\nexport const AGENTS_FILE = 'AGENTS.md';\nexport const AGENTLOOP_FILE = 'AGENTLOOP.md';\n\nexport const LOOP_STEPS = [\n 'Specify',\n 'Constrain',\n 'Plan',\n 'Implement',\n 'Verify',\n 'Review',\n 'Handoff',\n] as const;\n\nexport const TEMPLATE_GROUPS = [\n 'loops',\n 'gates',\n 'handoffs',\n 'agents',\n 'policies',\n 'tasks',\n 'harness',\n] as const;\n\nexport const SUPPORTED_AGENTS = [\n 'codex',\n 'claude-code',\n 'cursor',\n 'opencode',\n 'gemini-cli',\n 'github-copilot-cli',\n 'generic',\n] as const;\n\nexport const TASK_TYPES = [\n 'feature',\n 'bugfix',\n 'refactor',\n 'tests',\n 'docs',\n 'release',\n 'security-review',\n 'dependency-upgrade',\n 'migration',\n] as const;\n\nexport const DEFAULT_COMMAND_KEYS = ['test', 'lint', 'typecheck', 'build', 'format'] as const;\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { CONFIG_FILE } from './constants.js';\nimport { ConfigError } from './errors.js';\n\nexport const ProjectTypeSchema = z.enum([\n 'nextjs',\n 'react-vite',\n 'node',\n 'typescript-package',\n 'python',\n 'docs-only',\n 'generic',\n]);\n\nexport const PackageManagerSchema = z.enum(['pnpm', 'npm', 'yarn', 'bun']);\n\nexport const CommandConfigSchema = z.object({\n test: z.string().default(''),\n lint: z.string().default(''),\n typecheck: z.string().default(''),\n build: z.string().default(''),\n format: z.string().default(''),\n});\n\nexport const AgentLoopConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.literal(1),\n project: z.object({\n name: z.string(),\n type: ProjectTypeSchema,\n packageManager: PackageManagerSchema,\n }),\n paths: z.object({\n root: z.string(),\n agentloopDir: z.string(),\n tasksDir: z.string(),\n reportsDir: z.string(),\n handoffsDir: z.string(),\n }),\n commands: CommandConfigSchema,\n safety: z.object({\n requireCleanWorkingTree: z.boolean(),\n warnOnDirtyWorkingTree: z.boolean(),\n protectEnvFiles: z.boolean(),\n protectMigrations: z.boolean(),\n protectLockfiles: z.boolean(),\n }),\n summary: z.object({\n includeDiffStats: z.boolean(),\n includeChangedFiles: z.boolean(),\n includeVerification: z.boolean(),\n includeRisks: z.boolean(),\n includeRollback: z.boolean(),\n }),\n});\n\nexport type ProjectType = z.infer<typeof ProjectTypeSchema>;\nexport type PackageManager = z.infer<typeof PackageManagerSchema>;\nexport type CommandConfig = z.infer<typeof CommandConfigSchema>;\nexport type AgentLoopConfig = z.infer<typeof AgentLoopConfigSchema>;\n\nexport type DefaultConfigInput = {\n name?: string;\n type?: ProjectType;\n packageManager?: PackageManager;\n commands?: Partial<CommandConfig>;\n};\n\nexport function createDefaultConfig(input: DefaultConfigInput = {}): AgentLoopConfig {\n return {\n $schema: 'https://agentloopkit.dev/schema/agentloop.config.schema.json',\n version: 1,\n project: {\n name: input.name ?? '',\n type: input.type ?? 'generic',\n packageManager: input.packageManager ?? 'npm',\n },\n paths: {\n root: '.',\n agentloopDir: '.agentloop',\n tasksDir: '.agentloop/tasks',\n reportsDir: '.agentloop/reports',\n handoffsDir: '.agentloop/handoffs',\n },\n commands: {\n test: input.commands?.test ?? '',\n lint: input.commands?.lint ?? '',\n typecheck: input.commands?.typecheck ?? '',\n build: input.commands?.build ?? '',\n format: input.commands?.format ?? '',\n },\n safety: {\n requireCleanWorkingTree: false,\n warnOnDirtyWorkingTree: true,\n protectEnvFiles: true,\n protectMigrations: true,\n protectLockfiles: false,\n },\n summary: {\n includeDiffStats: true,\n includeChangedFiles: true,\n includeVerification: true,\n includeRisks: true,\n includeRollback: true,\n },\n };\n}\n\nexport function parseAgentLoopConfig(value: unknown): AgentLoopConfig {\n const parsed = AgentLoopConfigSchema.safeParse(value);\n if (!parsed.success) {\n throw new ConfigError(`Invalid AgentLoopKit config: ${parsed.error.message}`);\n }\n return parsed.data;\n}\n\nexport async function loadAgentLoopConfig(cwd: string): Promise<AgentLoopConfig> {\n const filePath = path.join(cwd, CONFIG_FILE);\n const raw = await readFile(filePath, 'utf8');\n return parseAgentLoopConfig(JSON.parse(raw));\n}\n","export class AgentLoopError extends Error {\n constructor(\n message: string,\n public readonly code = 'AGENTLOOP_ERROR',\n ) {\n super(message);\n this.name = 'AgentLoopError';\n }\n}\n\nexport class ConfigError extends AgentLoopError {\n constructor(message: string) {\n super(message, 'CONFIG_ERROR');\n this.name = 'ConfigError';\n }\n}\n","import { access, mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function pathExists(filePath: string) {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTextIfExists(filePath: string) {\n if (!(await pathExists(filePath))) return '';\n return readFile(filePath, 'utf8');\n}\n\nexport async function writeFileIfMissing(filePath: string, content: string) {\n if (await pathExists(filePath)) return false;\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n return true;\n}\n\nexport async function writeTextFile(filePath: string, content: string) {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n}\n\nexport async function listFilesRecursive(root: string, options: { ignore?: string[] } = {}) {\n const ignore = new Set(\n options.ignore ?? ['.git', '.agentloop', 'node_modules', 'dist', 'coverage'],\n );\n const files: string[] = [];\n\n async function walk(current: string) {\n if (!(await pathExists(current))) return;\n const entries = await readdir(current, { withFileTypes: true });\n for (const entry of entries) {\n if (ignore.has(entry.name)) continue;\n const absolute = path.join(current, entry.name);\n if (entry.isDirectory()) {\n await walk(absolute);\n } else if (entry.isFile()) {\n files.push(absolute);\n }\n }\n }\n\n const rootStat = await stat(root).catch(() => undefined);\n if (!rootStat?.isDirectory()) return [];\n await walk(root);\n return files;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PackageManager, PackageManagerSchema } from './config.js';\nimport { pathExists } from './file-system.js';\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n if (await pathExists(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (await pathExists(path.join(cwd, 'bun.lockb'))) return 'bun';\n if (await pathExists(path.join(cwd, 'bun.lock'))) return 'bun';\n if (await pathExists(path.join(cwd, 'yarn.lock'))) return 'yarn';\n if (await pathExists(path.join(cwd, 'package-lock.json'))) return 'npm';\n\n const packageJsonPath = path.join(cwd, 'package.json');\n if (await pathExists(packageJsonPath)) {\n const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8')) as {\n packageManager?: string;\n };\n const manager = packageJson.packageManager?.split('@')[0];\n const parsed = PackageManagerSchema.safeParse(manager);\n if (parsed.success) return parsed.data;\n }\n\n return 'npm';\n}\n\nexport function packageManagerRunCommand(manager: PackageManager, scriptName: string) {\n return `${manager} run ${scriptName}`;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { CommandConfig, PackageManager, ProjectType } from './config.js';\nimport { DEFAULT_COMMAND_KEYS } from './constants.js';\nimport { listFilesRecursive, pathExists } from './file-system.js';\nimport { packageManagerRunCommand } from './package-manager.js';\n\ntype PackageJson = {\n name?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n};\n\nexport async function readPackageJson(cwd: string): Promise<PackageJson | undefined> {\n const filePath = path.join(cwd, 'package.json');\n if (!(await pathExists(filePath))) return undefined;\n return JSON.parse(await readFile(filePath, 'utf8')) as PackageJson;\n}\n\nexport async function detectProjectName(cwd: string) {\n const packageJson = await readPackageJson(cwd);\n if (packageJson?.name) return packageJson.name;\n return path.basename(cwd);\n}\n\nexport async function detectProjectType(cwd: string): Promise<ProjectType> {\n const packageJson = await readPackageJson(cwd);\n const deps = { ...packageJson?.dependencies, ...packageJson?.devDependencies };\n\n if (deps.next) return 'nextjs';\n if (deps.vite && deps.react) return 'react-vite';\n if (deps.typescript && packageJson) return 'typescript-package';\n if (packageJson) return 'node';\n if (\n (await pathExists(path.join(cwd, 'pyproject.toml'))) ||\n (await pathExists(path.join(cwd, 'requirements.txt')))\n ) {\n return 'python';\n }\n\n const files = await listFilesRecursive(cwd);\n const relativeFiles = files.map((file) => path.relative(cwd, file));\n const hasCode = relativeFiles.some((file) =>\n /\\.(ts|tsx|js|jsx|py|go|rs|java|rb|php|cs)$/.test(file),\n );\n const hasDocs = relativeFiles.some((file) => file.endsWith('.md') || file.startsWith('docs/'));\n if (hasDocs && !hasCode) return 'docs-only';\n\n return 'generic';\n}\n\nexport async function detectPackageScripts(\n cwd: string,\n packageManager: PackageManager,\n): Promise<CommandConfig> {\n const packageJson = await readPackageJson(cwd);\n const commands: CommandConfig = { test: '', lint: '', typecheck: '', build: '', format: '' };\n for (const key of DEFAULT_COMMAND_KEYS) {\n if (packageJson?.scripts?.[key]) {\n commands[key] = packageManagerRunCommand(packageManager, key);\n }\n }\n return commands;\n}\n","import { cp, readFile, readdir } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport type TemplateValues = Record<string, string | number | boolean | undefined>;\n\nexport function renderTemplateString(template: string, values: TemplateValues) {\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (match, key: string) => {\n const value = values[key];\n return value === undefined ? match : String(value);\n });\n}\n\nexport function getTemplateRoot() {\n return fileURLToPath(new URL('../templates', import.meta.url));\n}\n\nexport async function readTemplate(relativePath: string, values: TemplateValues = {}) {\n const raw = await readFile(path.join(getTemplateRoot(), relativePath), 'utf8');\n return renderTemplateString(raw, values);\n}\n\nexport async function copyTemplateFile(\n relativePath: string,\n targetPath: string,\n values: TemplateValues = {},\n) {\n const content = await readTemplate(relativePath, values);\n await import('node:fs/promises').then(({ mkdir, writeFile }) =>\n mkdir(path.dirname(targetPath), { recursive: true }).then(() => writeFile(targetPath, content)),\n );\n}\n\nexport async function copyTemplateDirectory(sourceRelative: string, target: string) {\n await cp(path.join(getTemplateRoot(), sourceRelative), target, { recursive: true, force: true });\n}\n\nexport async function listTemplateFiles() {\n const root = getTemplateRoot();\n const groups = await readdir(root, { withFileTypes: true });\n const result: Record<string, string[]> = {};\n\n for (const group of groups) {\n if (!group.isDirectory()) continue;\n const entries = await readdir(path.join(root, group.name), { withFileTypes: true });\n result[group.name] = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .sort();\n }\n\n return result;\n}\n","type Logger = {\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n};\n\nexport const consoleLogger: Logger = {\n info: (message) => console.log(message),\n warn: (message) => console.warn(message),\n error: (message) => console.error(message),\n};\n","import { Command } from 'commander';\nimport { runDoctor } from '../../core/doctor.js';\n\nexport function doctorCommand() {\n return new Command('doctor')\n .description('Check whether this repo is ready for agentic engineering')\n .option('--json', 'print machine-readable output')\n .action(async (options: { json?: boolean }) => {\n const result = await runDoctor({ cwd: process.cwd() });\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(result.markdown);\n }\n if (result.serious.length > 0) process.exitCode = 1;\n });\n}\n","import path from 'node:path';\nimport { CONFIG_FILE } from './constants.js';\nimport { loadAgentLoopConfig } from './config.js';\nimport { pathExists, readTextIfExists } from './file-system.js';\nimport { commandExists, getGitStatus, isInsideGitRepo } from './git.js';\nimport { detectPackageManager } from './package-manager.js';\nimport { detectPackageScripts, detectProjectType } from './project-detection.js';\nimport { detectRiskFiles } from './safety.js';\n\nexport type DoctorCheck = {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n};\n\nexport type DoctorResult = {\n checks: DoctorCheck[];\n warnings: DoctorCheck[];\n serious: DoctorCheck[];\n markdown: string;\n};\n\nfunction check(name: string, status: DoctorCheck['status'], message: string): DoctorCheck {\n return { name, status, message };\n}\n\nexport async function runDoctor(options: { cwd: string }): Promise<DoctorResult> {\n const cwd = options.cwd;\n const checks: DoctorCheck[] = [];\n\n checks.push(check('Current directory', 'pass', cwd));\n const gitInstalled = await commandExists('git');\n checks.push(\n check(\n 'Git installed',\n gitInstalled ? 'pass' : 'warn',\n gitInstalled ? 'git is available' : 'git not found',\n ),\n );\n const inGit = gitInstalled ? await isInsideGitRepo(cwd) : false;\n checks.push(\n check(\n 'Git repository',\n inGit ? 'pass' : 'warn',\n inGit ? 'inside a git repo' : 'not inside a git repo',\n ),\n );\n\n const status = inGit ? await getGitStatus(cwd) : '';\n checks.push(\n check(\n 'Working tree',\n status.trim() ? 'warn' : 'pass',\n status.trim() ? 'working tree has changes' : 'clean',\n ),\n );\n\n for (const file of ['AGENTS.md', 'AGENTLOOP.md', '.agentloop']) {\n const exists = await pathExists(path.join(cwd, file));\n checks.push(check(file, exists ? 'pass' : 'warn', exists ? 'found' : 'missing'));\n }\n\n try {\n await loadAgentLoopConfig(cwd);\n checks.push(check(CONFIG_FILE, 'pass', 'valid'));\n } catch (error) {\n checks.push(\n check(CONFIG_FILE, 'fail', error instanceof Error ? error.message : 'invalid config'),\n );\n }\n\n const agents = await readTextIfExists(path.join(cwd, 'AGENTS.md'));\n if (agents && !agents.includes('AgentLoopKit')) {\n checks.push(\n check('AGENTS.md AgentLoopKit section', 'warn', 'AGENTS.md does not mention AgentLoopKit'),\n );\n }\n\n const packageManager = await detectPackageManager(cwd);\n const projectType = await detectProjectType(cwd);\n const commands = await detectPackageScripts(cwd, packageManager);\n checks.push(check('Package manager', 'pass', packageManager));\n checks.push(check('Project type', 'pass', projectType));\n\n for (const key of ['test', 'lint', 'typecheck', 'build'] as const) {\n checks.push(\n check(`${key} command`, commands[key] ? 'pass' : 'warn', commands[key] || 'not detected'),\n );\n }\n\n const risks = await detectRiskFiles(cwd);\n const riskCount = Object.values(risks).reduce((count, files) => count + files.length, 0);\n checks.push(\n check(\n 'Potential risk files',\n riskCount ? 'warn' : 'pass',\n riskCount ? `${riskCount} risk file(s) detected` : 'none detected',\n ),\n );\n if (!commands.test) {\n checks.push(check('Tests', 'warn', 'no test command detected'));\n }\n\n const warnings = checks.filter((item) => item.status === 'warn');\n const serious = checks.filter((item) => item.status === 'fail');\n const markdown = `# AgentLoopKit Doctor\n\n${checks\n .map((item) => {\n const icon = item.status === 'pass' ? '[pass]' : item.status === 'warn' ? '[warn]' : '[fail]';\n return `- ${icon} ${item.name}: ${item.message}`;\n })\n .join('\\n')}\n`;\n\n return { checks, warnings, serious, markdown };\n}\n","import { execa } from 'execa';\n\nexport type GitFileStatus = {\n status: string;\n path: string;\n};\n\nexport async function commandExists(command: string) {\n const result = await execa(command, ['--version'], { reject: false });\n return result.exitCode === 0;\n}\n\nexport async function isInsideGitRepo(cwd: string) {\n const result = await execa('git', ['rev-parse', '--is-inside-work-tree'], { cwd, reject: false });\n return result.exitCode === 0 && result.stdout.trim() === 'true';\n}\n\nexport async function getGitBranch(cwd: string) {\n const result = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, reject: false });\n return result.exitCode === 0 ? result.stdout.trim() : '';\n}\n\nexport async function getGitCommit(cwd: string) {\n const result = await execa('git', ['rev-parse', '--short', 'HEAD'], { cwd, reject: false });\n return result.exitCode === 0 ? result.stdout.trim() : '';\n}\n\nexport async function getGitStatus(cwd: string) {\n const result = await execa('git', ['status', '--short'], { cwd, reject: false });\n return result.exitCode === 0 ? result.stdout : '';\n}\n\nexport async function getGitDiffStat(cwd: string) {\n const result = await execa('git', ['diff', '--stat'], { cwd, reject: false });\n return result.exitCode === 0 ? result.stdout : '';\n}\n\nexport async function parseGitStatus(status: string): Promise<GitFileStatus[]> {\n return status\n .split('\\n')\n .map((line) => line.trimEnd())\n .filter(Boolean)\n .map((line) => ({\n status: line.slice(0, 2).trim() || '?',\n path: line.slice(3).trim(),\n }));\n}\n","import path from 'node:path';\nimport { listFilesRecursive } from './file-system.js';\n\nexport type RiskFiles = {\n migrations: string[];\n auth: string[];\n security: string[];\n billing: string[];\n deployment: string[];\n lockfiles: string[];\n envFiles: string[];\n};\n\nfunction relative(cwd: string, file: string) {\n return path.relative(cwd, file).replaceAll(path.sep, '/');\n}\n\nexport async function detectRiskFiles(cwd: string): Promise<RiskFiles> {\n const files = (await listFilesRecursive(cwd)).map((file) => relative(cwd, file));\n const includes = (needles: string[]) =>\n files.filter((file) => needles.some((needle) => file.toLowerCase().includes(needle)));\n\n return {\n migrations: includes(['migration', 'migrations/']),\n auth: includes(['auth', 'oauth', 'session', 'passport']),\n security: includes(['security', 'crypto', 'secret', 'permission', 'policy']),\n billing: includes(['billing', 'stripe', 'payment', 'invoice']),\n deployment: files.filter((file) =>\n /(^|\\/)(Dockerfile|docker-compose|vercel\\.json|netlify\\.toml|fly\\.toml|render\\.yaml|\\.github\\/workflows\\/)/i.test(\n file,\n ),\n ),\n lockfiles: files.filter((file) =>\n ['pnpm-lock.yaml', 'package-lock.json', 'yarn.lock', 'bun.lock', 'bun.lockb'].includes(\n path.basename(file),\n ),\n ),\n envFiles: files.filter((file) => /^\\.env($|\\.)|\\/\\.env($|\\.)/.test(file)),\n };\n}\n","import { Command } from 'commander';\nimport prompts from 'prompts';\nimport { TASK_TYPES } from '../../core/constants.js';\nimport { loadAgentLoopConfig } from '../../core/config.js';\nimport { createTaskContractFile, TaskType } from '../../core/task-contract.js';\n\nfunction lines(value: string | undefined) {\n return value\n ? value\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n : [];\n}\n\nasync function collectInteractive(initial: { title?: string; type?: TaskType }) {\n const answers = await prompts([\n {\n type: initial.title ? null : 'text',\n name: 'title',\n message: 'Task title',\n },\n {\n type: initial.type ? null : 'select',\n name: 'type',\n message: 'Task type',\n choices: TASK_TYPES.map((type) => ({ title: type, value: type })),\n },\n { type: 'text', name: 'problemStatement', message: 'Problem statement' },\n { type: 'text', name: 'desiredOutcome', message: 'Desired outcome' },\n { type: 'text', name: 'constraints', message: 'Constraints (separate with semicolons)' },\n { type: 'text', name: 'nonGoals', message: 'Non-goals (separate with semicolons)' },\n {\n type: 'text',\n name: 'likelyFiles',\n message: 'Likely files or areas (separate with semicolons)',\n },\n {\n type: 'text',\n name: 'forbiddenFiles',\n message: 'Files or areas not to touch (separate with semicolons)',\n },\n {\n type: 'text',\n name: 'acceptanceCriteria',\n message: 'Acceptance criteria (separate with semicolons)',\n },\n {\n type: 'text',\n name: 'verificationCommands',\n message: 'Verification commands (separate with semicolons)',\n },\n { type: 'text', name: 'rollbackNotes', message: 'Rollback notes' },\n ]);\n\n return {\n title: initial.title ?? answers.title,\n type: initial.type ?? answers.type,\n problemStatement: answers.problemStatement,\n desiredOutcome: answers.desiredOutcome,\n constraints: String(answers.constraints ?? '')\n .split(';')\n .filter(Boolean),\n nonGoals: String(answers.nonGoals ?? '')\n .split(';')\n .filter(Boolean),\n likelyFiles: String(answers.likelyFiles ?? '')\n .split(';')\n .filter(Boolean),\n forbiddenFiles: String(answers.forbiddenFiles ?? '')\n .split(';')\n .filter(Boolean),\n acceptanceCriteria: String(answers.acceptanceCriteria ?? '')\n .split(';')\n .filter(Boolean),\n verificationCommands: String(answers.verificationCommands ?? '')\n .split(';')\n .filter(Boolean),\n rollbackNotes: answers.rollbackNotes,\n };\n}\n\nexport function createTaskCommand() {\n return new Command('create-task')\n .description('Create a task contract for an agentic coding session')\n .option('--title <title>', 'task title')\n .option('--type <type>', 'task type')\n .option('--out <path>', 'output file path')\n .option('--problem <text>', 'problem statement')\n .option('--outcome <text>', 'desired outcome')\n .option('--constraint <text>', 'constraint; repeat or use newlines', lines, [])\n .option('--non-goal <text>', 'non-goal; repeat or use newlines', lines, [])\n .option('--acceptance <text>', 'acceptance criterion; repeat or use newlines', lines, [])\n .option('--verify-command <command>', 'verification command; repeat or use newlines', lines, [])\n .action(async (options: Record<string, unknown>) => {\n const type =\n typeof options.type === 'string' && TASK_TYPES.includes(options.type as TaskType)\n ? (options.type as TaskType)\n : undefined;\n const title = typeof options.title === 'string' ? options.title : undefined;\n const config = await loadAgentLoopConfig(process.cwd());\n const input =\n title && type\n ? {\n title,\n type,\n problemStatement: String(options.problem ?? ''),\n desiredOutcome: String(options.outcome ?? ''),\n constraints: options.constraint as string[],\n nonGoals: options.nonGoal as string[],\n acceptanceCriteria: options.acceptance as string[],\n verificationCommands: options.verifyCommand as string[],\n }\n : await collectInteractive({ title, type });\n const result = await createTaskContractFile({\n cwd: process.cwd(),\n config,\n input,\n out: typeof options.out === 'string' ? options.out : undefined,\n });\n console.log(`Task contract created: ${result.path}`);\n });\n}\n","import path from 'node:path';\nimport { AgentLoopConfig } from './config.js';\nimport { formatDate } from './dates.js';\nimport { writeTextFile } from './file-system.js';\nimport { slugify } from './slug.js';\n\nexport type TaskType =\n | 'feature'\n | 'bugfix'\n | 'refactor'\n | 'tests'\n | 'docs'\n | 'release'\n | 'security-review'\n | 'dependency-upgrade'\n | 'migration';\n\nexport type TaskContractInput = {\n title: string;\n type: TaskType;\n createdDate?: string;\n problemStatement?: string;\n desiredOutcome?: string;\n constraints?: string[];\n nonGoals?: string[];\n assumptions?: string[];\n likelyFiles?: string[];\n forbiddenFiles?: string[];\n acceptanceCriteria?: string[];\n verificationCommands?: string[];\n rollbackNotes?: string;\n};\n\nfunction list(values: string[] | undefined, fallback = 'None recorded yet.') {\n const clean = values?.map((value) => value.trim()).filter(Boolean) ?? [];\n if (clean.length === 0) return `- ${fallback}`;\n return clean.map((value) => `- ${value}`).join('\\n');\n}\n\nexport function generateTaskContract(input: TaskContractInput) {\n const createdDate = input.createdDate ?? formatDate();\n return `# ${input.title}\n\n- Created date: ${createdDate}\n- Task type: ${input.type}\n- Status: proposed\n\n## Problem Statement\n${input.problemStatement || 'Describe the problem this task should solve.'}\n\n## Desired Outcome\n${input.desiredOutcome || 'Describe the concrete result expected from this task.'}\n\n## Constraints\n${list(input.constraints)}\n\n## Non-Goals\n${list(input.nonGoals)}\n\n## Assumptions\n${list(input.assumptions)}\n\n## Likely Files or Areas\n${list(input.likelyFiles)}\n\n## Files or Areas Not to Touch\n${list(input.forbiddenFiles)}\n\n## Acceptance Criteria\n${list(input.acceptanceCriteria, 'Add acceptance criteria before implementation starts.')}\n\n## Verification Commands\n${list(input.verificationCommands, 'No verification command recorded.')}\n\n## Implementation Plan\n- Inspect relevant files before editing.\n- Keep changes focused on this contract.\n- Record any architecture decision in DECISIONS.md.\n\n## Risk Notes\n- Re-check protected areas before changing migrations, auth, secrets, billing, deployment, or public APIs.\n\n## Rollback Notes\n${input.rollbackNotes || 'Document how to revert or disable this change.'}\n\n## Handoff Requirements\n- Summarize files changed.\n- Include verification commands and results.\n- State unverified areas honestly.\n- Include risks, rollback notes, and reviewer checklist.\n`;\n}\n\nexport async function createTaskContractFile(options: {\n cwd: string;\n config: AgentLoopConfig;\n input: TaskContractInput;\n out?: string;\n}) {\n const createdDate = options.input.createdDate ?? formatDate();\n const relativePath =\n options.out ??\n path.join(options.config.paths.tasksDir, `${createdDate}-${slugify(options.input.title)}.md`);\n const absolutePath = path.isAbsolute(relativePath)\n ? relativePath\n : path.join(options.cwd, relativePath);\n const markdown = generateTaskContract({ ...options.input, createdDate });\n await writeTextFile(absolutePath, markdown);\n return { path: absolutePath, markdown };\n}\n","function pad(value: number) {\n return String(value).padStart(2, '0');\n}\n\nexport function formatDate(date = new Date()) {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n}\n\nexport function formatTimestamp(date = new Date()) {\n return `${formatDate(date)}-${pad(date.getHours())}-${pad(date.getMinutes())}`;\n}\n","export function slugify(value: string) {\n const slug = value\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-{2,}/g, '-');\n\n return slug || 'task';\n}\n","import { Command } from 'commander';\nimport { loadAgentLoopConfig } from '../../core/config.js';\nimport { runVerification } from '../../core/verification.js';\n\nfunction collect(value: string, previous: string[]) {\n previous.push(value);\n return previous;\n}\n\nexport function verifyCommand() {\n return new Command('verify')\n .description('Run configured verification commands and write a report')\n .option('--task <path>', 'task contract path for humans to cross-reference')\n .option('--json', 'print machine-readable output')\n .option('--no-build', 'skip build command')\n .option('--no-test', 'skip test command')\n .option('--no-lint', 'skip lint command')\n .option('--no-typecheck', 'skip typecheck command')\n .option('--command <command>', 'custom command to run', collect, [])\n .action(async (options: Record<string, unknown>) => {\n const config = await loadAgentLoopConfig(process.cwd());\n const result = await runVerification({\n cwd: process.cwd(),\n config,\n skip: {\n build: options.build === false,\n test: options.test === false,\n lint: options.lint === false,\n typecheck: options.typecheck === false,\n },\n customCommands: options.command as string[],\n });\n if (options.json) console.log(JSON.stringify(result, null, 2));\n else\n console.log(\n `Verification report written: ${result.reportPath}\\nOverall status: ${result.overallStatus}`,\n );\n if (result.overallStatus === 'fail') process.exitCode = 1;\n });\n}\n","import path from 'node:path';\nimport { execa } from 'execa';\nimport { AgentLoopConfig } from './config.js';\nimport { formatTimestamp } from './dates.js';\nimport { getGitBranch, getGitCommit, getGitStatus } from './git.js';\nimport { writeTextFile } from './file-system.js';\n\nexport type VerificationCommandKey = 'test' | 'lint' | 'typecheck' | 'build' | 'custom';\n\nexport type VerificationCommandResult = {\n key: VerificationCommandKey;\n command: string;\n exitCode: number;\n passed: boolean;\n output: string;\n};\n\nexport type VerificationOptions = {\n cwd: string;\n config: AgentLoopConfig;\n reportTimestamp?: string;\n nowIso?: string;\n skip?: Partial<Record<'test' | 'lint' | 'typecheck' | 'build', boolean>>;\n customCommands?: string[];\n};\n\nexport type VerificationResult = {\n overallStatus: 'pass' | 'fail' | 'not-run';\n commands: VerificationCommandResult[];\n notRun: string[];\n markdown: string;\n reportPath: string;\n};\n\nfunction excerpt(output: string, limit = 5000) {\n if (output.length <= limit) return output;\n return `${output.slice(0, limit)}\\n\\n[output truncated to ${limit} characters]`;\n}\n\nfunction commandEntries(config: AgentLoopConfig, options: VerificationOptions) {\n const configured: Array<[VerificationCommandKey, string]> = [\n ['test', config.commands.test],\n ['lint', config.commands.lint],\n ['typecheck', config.commands.typecheck],\n ['build', config.commands.build],\n ];\n\n const active = configured.filter(([key, command]) => {\n if (key === 'custom') return false;\n return command && !options.skip?.[key as 'test' | 'lint' | 'typecheck' | 'build'];\n });\n\n for (const command of options.customCommands ?? []) {\n if (command.trim()) active.push(['custom', command.trim()]);\n }\n\n return active;\n}\n\nexport async function runVerification(options: VerificationOptions): Promise<VerificationResult> {\n const timestamp = options.reportTimestamp ?? formatTimestamp();\n const nowIso = options.nowIso ?? new Date().toISOString();\n const commands = commandEntries(options.config, options);\n const notRun = [\n ...(['test', 'lint', 'typecheck', 'build'] as const).filter((key) => {\n if (options.skip?.[key]) return true;\n return !options.config.commands[key];\n }),\n ];\n\n const results: VerificationCommandResult[] = [];\n for (const [key, command] of commands) {\n const result = await execa(command, {\n cwd: options.cwd,\n shell: true,\n all: true,\n reject: false,\n env: { ...process.env, FORCE_COLOR: '0' },\n });\n results.push({\n key,\n command,\n exitCode: result.exitCode ?? 1,\n passed: result.exitCode === 0,\n output: result.all ?? result.stdout ?? result.stderr ?? '',\n });\n }\n\n const overallStatus =\n results.length === 0 ? 'not-run' : results.every((result) => result.passed) ? 'pass' : 'fail';\n const reportPath = path.join(\n options.cwd,\n options.config.paths.reportsDir,\n `${timestamp}-verification-report.md`,\n );\n const branch = await getGitBranch(options.cwd);\n const commit = await getGitCommit(options.cwd);\n const status = await getGitStatus(options.cwd);\n\n const markdown = `# Verification Report\n\n- Timestamp: ${nowIso}\n- Repo: ${path.basename(options.cwd)}\n- Git branch: ${branch || 'not available'}\n- Git commit: ${commit || 'not available'}\n- Working tree: ${status.trim() ? 'dirty' : 'clean or unavailable'}\n- Overall status: ${overallStatus}\n\n## Commands Run\n${\n results.length === 0\n ? 'No verification commands were configured or selected.'\n : results\n .map(\n (result) => `### ${result.key}: \\`${result.command}\\`\n\n- Exit code: ${result.exitCode}\n- Status: ${result.passed ? 'pass' : 'fail'}\n\n\\`\\`\\`text\n${excerpt(result.output || '(no output)')}\n\\`\\`\\``,\n )\n .join('\\n\\n')\n}\n\n## Not Run\n${notRun.length ? notRun.map((item) => `- ${item}`).join('\\n') : '- Nothing skipped.'}\n\n## Recommended Next Actions\n${\n overallStatus === 'pass'\n ? '- Review the diff and prepare a handoff summary.'\n : overallStatus === 'fail'\n ? '- Fix failing commands before claiming completion.'\n : '- Add test, lint, typecheck, or build commands to agentloop.config.json.'\n}\n`;\n\n await writeTextFile(reportPath, markdown);\n return { overallStatus, commands: results, notRun, markdown, reportPath };\n}\n","import { Command } from 'commander';\nimport { loadAgentLoopConfig } from '../../core/config.js';\nimport { summarizeRepository } from '../../core/pr-summary.js';\n\nexport function summarizeCommand() {\n return new Command('summarize')\n .description('Generate a deterministic PR/reviewer summary')\n .option('--task <path>', 'task contract path')\n .option('--report <path>', 'verification report path')\n .option('--format <format>', 'markdown or json', 'markdown')\n .option('--write', 'write summary to .agentloop/handoffs')\n .option('--json', 'print JSON output')\n .action(async (options: Record<string, unknown>) => {\n const config = await loadAgentLoopConfig(process.cwd());\n const result = await summarizeRepository({\n cwd: process.cwd(),\n config,\n taskPath: typeof options.task === 'string' ? options.task : undefined,\n reportPath: typeof options.report === 'string' ? options.report : undefined,\n write: Boolean(options.write),\n });\n if (options.json || options.format === 'json') {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(result.markdown);\n if (options.write) console.log(`\\nSummary written: ${result.outPath}`);\n }\n });\n}\n","import path from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { AgentLoopConfig } from './config.js';\nimport { formatTimestamp } from './dates.js';\nimport { getGitDiffStat, getGitStatus, parseGitStatus, GitFileStatus } from './git.js';\nimport { pathExists, writeTextFile } from './file-system.js';\n\nexport type PrSummaryInput = {\n timestamp: string;\n status: string;\n changedFiles: GitFileStatus[];\n taskMarkdown?: string;\n verificationMarkdown?: string;\n diffStat?: string;\n};\n\nfunction extractLine(markdown: string | undefined, pattern: RegExp, fallback: string) {\n if (!markdown) return fallback;\n const match = markdown.match(pattern);\n return match?.[1]?.trim() || fallback;\n}\n\nexport function generatePrSummary(input: PrSummaryInput) {\n const taskTitle = extractLine(input.taskMarkdown, /^#\\s+(.+)$/m, 'No task contract found.');\n const verification = extractLine(\n input.verificationMarkdown,\n /Overall status:\\s*([a-z-]+)/i,\n 'No verification report found.',\n );\n const verificationLine =\n verification === 'No verification report found.'\n ? verification\n : `Overall status: ${verification}`;\n\n const markdown = `# PR Summary\n\n- Generated: ${input.timestamp}\n- Task context: ${taskTitle}\n- Verification status: ${verificationLine}\n\n## Summary\nThis summary was generated deterministically from git status, the latest task contract, and the latest verification report.\n\n## Changed Files\n${\n input.changedFiles.length\n ? input.changedFiles.map((file) => `- ${file.status} \\`${file.path}\\``).join('\\n')\n : '- No changed files detected.'\n}\n\n## Diff Stats\n${input.diffStat?.trim() || 'No diff stats available.'}\n\n## Behaviour Changed\n- Review changed files and task contract to confirm intended behavior.\n\n## Verification Performed\n- ${verificationLine}\n\n## Verification Not Performed\n- Check the verification report for skipped commands.\n\n## Risks\n- Re-check protected files such as migrations, secrets, auth, billing, deployment, and public APIs before merge.\n\n## Rollback Notes\n- Revert the changed files or revert the merge commit if this lands as a PR.\n\n## Reviewer Checklist\n- [ ] Acceptance criteria match the task contract.\n- [ ] Verification evidence is adequate for the change.\n- [ ] Risk areas have been reviewed.\n- [ ] Rollback plan is clear.\n\n## Follow-Ups\n- Capture any deferred work in ROADMAP.md or a new task contract.\n`;\n\n return { markdown };\n}\n\nasync function latestMarkdownFile(dir: string) {\n if (!(await pathExists(dir))) return undefined;\n const entries = (await readdir(dir, { withFileTypes: true }))\n .filter(\n (entry) =>\n entry.isFile() && entry.name.endsWith('.md') && entry.name.toLowerCase() !== 'readme.md',\n )\n .map((entry) => entry.name)\n .sort();\n const latest = entries.at(-1);\n return latest ? path.join(dir, latest) : undefined;\n}\n\nexport async function summarizeRepository(options: {\n cwd: string;\n config: AgentLoopConfig;\n taskPath?: string;\n reportPath?: string;\n timestamp?: string;\n write?: boolean;\n}) {\n const timestamp = options.timestamp ?? formatTimestamp();\n const status = await getGitStatus(options.cwd);\n const changedFiles = await parseGitStatus(status);\n const diffStat = await getGitDiffStat(options.cwd);\n const taskPath =\n options.taskPath ??\n (await latestMarkdownFile(path.join(options.cwd, options.config.paths.tasksDir)));\n const reportPath =\n options.reportPath ??\n (await latestMarkdownFile(path.join(options.cwd, options.config.paths.reportsDir)));\n const taskMarkdown =\n taskPath && (await pathExists(taskPath)) ? await readFile(taskPath, 'utf8') : undefined;\n const verificationMarkdown =\n reportPath && (await pathExists(reportPath)) ? await readFile(reportPath, 'utf8') : undefined;\n const summary = generatePrSummary({\n timestamp,\n status,\n changedFiles,\n taskMarkdown,\n verificationMarkdown,\n diffStat,\n });\n const outPath = path.join(\n options.cwd,\n options.config.paths.handoffsDir,\n `${timestamp}-pr-summary.md`,\n );\n if (options.write) await writeTextFile(outPath, summary.markdown);\n return { ...summary, outPath, changedFiles };\n}\n","import { Command } from 'commander';\nimport {\n installAgentInstructions,\n installAllAgentInstructions,\n isSupportedAgent,\n} from '../../core/agent-installation.js';\nimport { SUPPORTED_AGENTS } from '../../core/constants.js';\n\nexport function installAgentCommand() {\n return new Command('install-agent')\n .description('Install agent-specific instruction files')\n .argument('<agent>', `one of: ${SUPPORTED_AGENTS.join(', ')}, all`)\n .action(async (agent: string) => {\n if (agent === 'all') {\n const results = await installAllAgentInstructions({ cwd: process.cwd() });\n console.log(`Agent instructions written: ${results.length}`);\n console.log('AGENTS.md now references all bundled agent instructions.');\n return;\n }\n if (!isSupportedAgent(agent)) {\n throw new Error(\n `Unsupported agent \"${agent}\". Supported agents: ${SUPPORTED_AGENTS.join(', ')}, all`,\n );\n }\n const result = await installAgentInstructions({ cwd: process.cwd(), agent });\n console.log(`Agent instructions written: ${result.agentFilePath}`);\n console.log('AGENTS.md now references the agent instructions.');\n });\n}\n","import path from 'node:path';\nimport { SUPPORTED_AGENTS } from './constants.js';\nimport { readTextIfExists, writeTextFile } from './file-system.js';\nimport { readTemplate } from './template-renderer.js';\n\nexport type SupportedAgent = (typeof SUPPORTED_AGENTS)[number];\n\nexport function isSupportedAgent(value: string): value is SupportedAgent {\n return (SUPPORTED_AGENTS as readonly string[]).includes(value);\n}\n\nconst displayNames: Record<SupportedAgent, string> = {\n codex: 'Codex',\n 'claude-code': 'Claude Code',\n cursor: 'Cursor',\n opencode: 'OpenCode',\n 'gemini-cli': 'Gemini CLI',\n 'github-copilot-cli': 'GitHub Copilot CLI',\n generic: 'Generic Coding Agent',\n};\n\nexport async function installAgentInstructions(options: { cwd: string; agent: SupportedAgent }) {\n const agentFilePath = path.join(options.cwd, '.agentloop', 'agents', `${options.agent}.md`);\n const content = await readTemplate(`agents/${options.agent}.md`, {\n agentName: displayNames[options.agent],\n });\n await writeTextFile(agentFilePath, content);\n\n const agentsPath = path.join(options.cwd, 'AGENTS.md');\n const existing = await readTextIfExists(agentsPath);\n const marker = `<!-- agentloopkit-agent:${options.agent} -->`;\n if (!existing.includes(marker)) {\n const block = `\n\n${marker}\n## AgentLoopKit: ${displayNames[options.agent]}\n\n- Agent instructions: .agentloop/agents/${options.agent}.md\n- Read AGENTLOOP.md before changing code.\n- Use task contracts, verification reports, and handoff summaries.\n<!-- /agentloopkit-agent:${options.agent} -->\n`;\n await writeTextFile(\n agentsPath,\n existing ? `${existing.trimEnd()}\\n${block}` : block.trimStart(),\n );\n }\n\n return { agentFilePath, agentsPath };\n}\n\nexport async function installAllAgentInstructions(options: { cwd: string }) {\n const results = [];\n for (const agent of SUPPORTED_AGENTS) {\n results.push(await installAgentInstructions({ cwd: options.cwd, agent }));\n }\n return results;\n}\n","import { Command } from 'commander';\nimport { listTemplateFiles } from '../../core/template-renderer.js';\n\nexport function listTemplatesCommand() {\n return new Command('list-templates')\n .description('List available AgentLoopKit templates')\n .action(async () => {\n const templates = await listTemplateFiles();\n for (const [group, files] of Object.entries(templates)) {\n console.log(`${group}:`);\n for (const file of files) console.log(` - ${file}`);\n }\n });\n}\n","import { Command } from 'commander';\n\nexport function versionCommand() {\n return new Command('version').description('Print CLI version').action(() => {\n console.log('0.1.0');\n });\n}\n"],"mappings":"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","names":["Command","path","readdir","readFile","path","path","readFile","path","path","readFile","readFile","path","path","readFile","readFile","readdir","path","readdir","path","path","readdir","relative","Command","path","path","path","path","Command","Command","path","path","Command","Command","path","execa","execa","path","Command","Command","path","readdir","readFile","readdir","path","readFile","Command","Command","path","path","Command","Command","Command","Command","Command"]}
@@ -0,0 +1,142 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://agentloopkit.dev/schema/agentloop.config.schema.json",
4
+ "title": "AgentLoopKit Configuration",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["version", "project", "paths", "commands", "safety", "summary"],
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string"
11
+ },
12
+ "version": {
13
+ "const": 1
14
+ },
15
+ "project": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": ["name", "type", "packageManager"],
19
+ "properties": {
20
+ "name": {
21
+ "type": "string"
22
+ },
23
+ "type": {
24
+ "type": "string",
25
+ "enum": [
26
+ "nextjs",
27
+ "react-vite",
28
+ "node",
29
+ "typescript-package",
30
+ "python",
31
+ "docs-only",
32
+ "generic"
33
+ ]
34
+ },
35
+ "packageManager": {
36
+ "type": "string",
37
+ "enum": ["pnpm", "npm", "yarn", "bun"]
38
+ }
39
+ }
40
+ },
41
+ "paths": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["root", "agentloopDir", "tasksDir", "reportsDir", "handoffsDir"],
45
+ "properties": {
46
+ "root": {
47
+ "type": "string"
48
+ },
49
+ "agentloopDir": {
50
+ "type": "string"
51
+ },
52
+ "tasksDir": {
53
+ "type": "string"
54
+ },
55
+ "reportsDir": {
56
+ "type": "string"
57
+ },
58
+ "handoffsDir": {
59
+ "type": "string"
60
+ }
61
+ }
62
+ },
63
+ "commands": {
64
+ "type": "object",
65
+ "additionalProperties": false,
66
+ "required": ["test", "lint", "typecheck", "build", "format"],
67
+ "properties": {
68
+ "test": {
69
+ "type": "string"
70
+ },
71
+ "lint": {
72
+ "type": "string"
73
+ },
74
+ "typecheck": {
75
+ "type": "string"
76
+ },
77
+ "build": {
78
+ "type": "string"
79
+ },
80
+ "format": {
81
+ "type": "string"
82
+ }
83
+ }
84
+ },
85
+ "safety": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "required": [
89
+ "requireCleanWorkingTree",
90
+ "warnOnDirtyWorkingTree",
91
+ "protectEnvFiles",
92
+ "protectMigrations",
93
+ "protectLockfiles"
94
+ ],
95
+ "properties": {
96
+ "requireCleanWorkingTree": {
97
+ "type": "boolean"
98
+ },
99
+ "warnOnDirtyWorkingTree": {
100
+ "type": "boolean"
101
+ },
102
+ "protectEnvFiles": {
103
+ "type": "boolean"
104
+ },
105
+ "protectMigrations": {
106
+ "type": "boolean"
107
+ },
108
+ "protectLockfiles": {
109
+ "type": "boolean"
110
+ }
111
+ }
112
+ },
113
+ "summary": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "required": [
117
+ "includeDiffStats",
118
+ "includeChangedFiles",
119
+ "includeVerification",
120
+ "includeRisks",
121
+ "includeRollback"
122
+ ],
123
+ "properties": {
124
+ "includeDiffStats": {
125
+ "type": "boolean"
126
+ },
127
+ "includeChangedFiles": {
128
+ "type": "boolean"
129
+ },
130
+ "includeVerification": {
131
+ "type": "boolean"
132
+ },
133
+ "includeRisks": {
134
+ "type": "boolean"
135
+ },
136
+ "includeRollback": {
137
+ "type": "boolean"
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
@@ -0,0 +1,18 @@
1
+ # Claude Code Agent Instructions
2
+
3
+ Use AgentLoopKit task contracts and verification reports.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md and AGENTLOOP.md.
8
+ - Read harness files under .agentloop/harness/.
9
+ - Check .agentloop/tasks/ for current work.
10
+
11
+ Rules:
12
+
13
+ - Avoid broad unrelated refactors.
14
+ - Preserve existing user changes.
15
+ - Run verification commands before handoff.
16
+ - Produce reviewer-friendly summaries.
17
+
18
+ If exact tooling behavior is uncertain, write instructions rather than fabricating config conventions.
@@ -0,0 +1,27 @@
1
+ # Codex Agent Instructions
2
+
3
+ Use the AgentLoopKit harness in this repo.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md.
8
+ - Read AGENTLOOP.md.
9
+ - Check .agentloop/tasks/ for the active task contract.
10
+ - Review .agentloop/harness/commands.md.
11
+
12
+ Work loop:
13
+
14
+ - Specify the requested outcome.
15
+ - Constrain protected areas.
16
+ - Plan a focused diff.
17
+ - Implement only the scoped change.
18
+ - Verify with configured commands.
19
+ - Review git diff.
20
+ - Handoff with verification evidence.
21
+
22
+ Codex-specific expectations:
23
+
24
+ - Keep changes small.
25
+ - Update DECISIONS.md when architecture changes.
26
+ - Do not claim success without verification evidence.
27
+ - Do not run destructive commands unless explicitly requested.
@@ -0,0 +1,17 @@
1
+ # Cursor Agent Instructions
2
+
3
+ Use this file as repo-level guidance for Cursor-assisted work.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md and AGENTLOOP.md.
8
+ - Use the active task contract when present.
9
+ - Keep diffs focused on acceptance criteria.
10
+
11
+ Verification:
12
+
13
+ - Run configured commands from agentloop.config.json.
14
+ - Record failures honestly.
15
+ - Generate or update a handoff summary before stopping.
16
+
17
+ If Cursor workspace rules are configured elsewhere, link this guidance there.
@@ -0,0 +1,19 @@
1
+ # Gemini CLI Agent Instructions
2
+
3
+ Use AgentLoopKit task contracts, harness files, and verification reports.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md.
8
+ - Read AGENTLOOP.md.
9
+ - Read .agentloop/harness/commands.md.
10
+ - Check .agentloop/tasks/ for active work.
11
+
12
+ Rules:
13
+
14
+ - Keep changes focused.
15
+ - Treat migrations, auth, secrets, billing, deployment, and public APIs as protected.
16
+ - Run configured checks.
17
+ - Produce a reviewer handoff.
18
+
19
+ If your Gemini CLI setup has a separate instruction file, paste or link this content there.
@@ -0,0 +1,27 @@
1
+ # Generic Coding Agent Instructions
2
+
3
+ Use AgentLoopKit for disciplined repo work.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md.
8
+ - Read AGENTLOOP.md.
9
+ - Check .agentloop/tasks/.
10
+
11
+ Loop:
12
+
13
+ 1. Specify
14
+ 2. Constrain
15
+ 3. Plan
16
+ 4. Implement
17
+ 5. Verify
18
+ 6. Review
19
+ 7. Handoff
20
+
21
+ Rules:
22
+
23
+ - Preserve user work.
24
+ - Avoid destructive commands.
25
+ - Keep diffs focused.
26
+ - Run verification commands.
27
+ - State what was not verified.
@@ -0,0 +1,18 @@
1
+ # GitHub Copilot CLI Agent Instructions
2
+
3
+ Use AgentLoopKit as the engineering loop for this repo.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md.
8
+ - Read AGENTLOOP.md.
9
+ - Check task contracts in .agentloop/tasks/.
10
+
11
+ Rules:
12
+
13
+ - Do not overwrite existing instructions.
14
+ - Avoid unrelated refactors.
15
+ - Run verification commands before handoff.
16
+ - Include risks and rollback notes in summaries.
17
+
18
+ If exact Copilot CLI instruction conventions change, prefer linking this file from the supported location.
@@ -0,0 +1,18 @@
1
+ # OpenCode Agent Instructions
2
+
3
+ Use AgentLoopKit as the working loop for this repository.
4
+
5
+ Before editing:
6
+
7
+ - Read AGENTS.md.
8
+ - Read AGENTLOOP.md.
9
+ - Check .agentloop/tasks/.
10
+
11
+ Rules:
12
+
13
+ - Do not take destructive actions without explicit approval.
14
+ - Prefer small diffs.
15
+ - Verify before completion.
16
+ - Summarize changed files, tests, risks, and rollback notes.
17
+
18
+ If OpenCode config conventions differ in your setup, paste or link this file into the appropriate agent instructions.
@@ -0,0 +1,24 @@
1
+ # Dependency Gate
2
+
3
+ Purpose: keep package changes intentional.
4
+
5
+ Checklist:
6
+
7
+ - Reason for dependency change is documented.
8
+ - Package manager and lockfile changes are consistent.
9
+ - No install scripts are added.
10
+ - Verification ran after install.
11
+
12
+ Pass criteria:
13
+
14
+ - Dependency change is scoped and reviewed.
15
+
16
+ Fail criteria:
17
+
18
+ - Lockfile churn is unexplained.
19
+
20
+ Escalation triggers:
21
+
22
+ - New runtime dependency
23
+ - Package with postinstall behavior
24
+ - Security advisory
@@ -0,0 +1,24 @@
1
+ # Docs Gate
2
+
3
+ Purpose: keep docs aligned with behavior.
4
+
5
+ Checklist:
6
+
7
+ - README is updated when user-facing commands change.
8
+ - Docs mention new limitations or risks.
9
+ - Examples still match CLI behavior.
10
+ - Links and command names are checked.
11
+
12
+ Pass criteria:
13
+
14
+ - Docs help the next user run the feature.
15
+
16
+ Fail criteria:
17
+
18
+ - Docs claim support that the code does not implement.
19
+
20
+ Escalation triggers:
21
+
22
+ - Publishing instructions
23
+ - Security guidance
24
+ - Third-party agent conventions
@@ -0,0 +1,28 @@
1
+ # Implementation Gate
2
+
3
+ Purpose: prevent vague work from turning into broad diffs.
4
+
5
+ Checklist:
6
+
7
+ - Task contract exists or the request is small enough to state inline.
8
+ - Files in scope are identified.
9
+ - Files not to touch are identified.
10
+ - Protected areas are called out.
11
+ - Plan has no unrelated refactors.
12
+
13
+ Pass criteria:
14
+
15
+ - The intended change is concrete.
16
+ - The implementation path is narrow.
17
+
18
+ Fail criteria:
19
+
20
+ - The task requires guessing product behavior.
21
+ - The agent needs to change protected areas without approval.
22
+
23
+ Escalation triggers:
24
+
25
+ - Public API change
26
+ - Dependency change
27
+ - Migration
28
+ - Secret or auth handling
@@ -0,0 +1,25 @@
1
+ # Regression Gate
2
+
3
+ Purpose: catch nearby breakage.
4
+
5
+ Checklist:
6
+
7
+ - Identify nearby modules.
8
+ - Run targeted tests for changed areas.
9
+ - Run broader verification when configured.
10
+ - Record untested paths.
11
+
12
+ Pass criteria:
13
+
14
+ - Reasonable regression surface was checked.
15
+
16
+ Fail criteria:
17
+
18
+ - Only the happy path was checked for a shared change.
19
+
20
+ Escalation triggers:
21
+
22
+ - Shared utilities
23
+ - Public APIs
24
+ - State management
25
+ - Build or deployment behavior
@@ -0,0 +1,24 @@
1
+ # Review Gate
2
+
3
+ Purpose: make the diff reviewer-ready.
4
+
5
+ Checklist:
6
+
7
+ - Diff matches acceptance criteria.
8
+ - Unrelated changes are removed.
9
+ - Risk files are reviewed.
10
+ - Handoff includes tests, risks, and rollback notes.
11
+
12
+ Pass criteria:
13
+
14
+ - A reviewer can understand the change without reconstructing the session.
15
+
16
+ Fail criteria:
17
+
18
+ - Summary omits verification or changed behavior.
19
+
20
+ Escalation triggers:
21
+
22
+ - Large diff
23
+ - Ambiguous acceptance criteria
24
+ - Conflicting requirements
@@ -0,0 +1,26 @@
1
+ # Security Gate
2
+
3
+ Purpose: force caution around sensitive changes.
4
+
5
+ Checklist:
6
+
7
+ - Secrets are not read or printed.
8
+ - Env files are only reported by path.
9
+ - Command execution is explicit and user-triggered.
10
+ - Auth, permission, and crypto changes are reviewed.
11
+
12
+ Pass criteria:
13
+
14
+ - Sensitive behavior is clear and verified.
15
+
16
+ Fail criteria:
17
+
18
+ - The change adds hidden network calls, telemetry, or credential access.
19
+
20
+ Escalation triggers:
21
+
22
+ - Secrets
23
+ - Auth
24
+ - Shell execution
25
+ - File deletion
26
+ - Network behavior