nightralph 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.claude/settings.local.json +5 -0
  2. package/AGENTS.md +60 -0
  3. package/CLAUDE.md +1 -0
  4. package/PROMPT.md +95 -0
  5. package/README.md +138 -0
  6. package/WIP.md +5 -0
  7. package/dist/docs-templates/domain.md +36 -0
  8. package/dist/docs-templates/issue-tracker-github.md +228 -0
  9. package/dist/docs-templates/issue-tracker.md +30 -0
  10. package/dist/docs-templates/triage-labels.md +15 -0
  11. package/dist/index.js +154 -0
  12. package/dist/index.js.map +7 -0
  13. package/dist/meta.json +207 -0
  14. package/dist/orchestrator.js +273 -0
  15. package/dist/orchestrator.js.map +7 -0
  16. package/dist/resolve.js +71 -0
  17. package/dist/resolve.js.map +7 -0
  18. package/dist/setup.js +151 -0
  19. package/dist/setup.js.map +7 -0
  20. package/dist/skills/domain-modeling/ADR-FORMAT.md +47 -0
  21. package/dist/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  22. package/dist/skills/domain-modeling/SKILL.md +74 -0
  23. package/dist/skills/domain-modeling/agents/openai.yaml +3 -0
  24. package/dist/skills/grill/SKILL.md +7 -0
  25. package/dist/skills/grill/agents/openai.yaml +5 -0
  26. package/dist/skills/grilling/SKILL.md +28 -0
  27. package/dist/skills/grilling/agents/openai.yaml +3 -0
  28. package/dist/skills/tdd/SKILL.md +38 -0
  29. package/dist/skills/tdd/agents/openai.yaml +3 -0
  30. package/dist/skills/tdd/mocking.md +59 -0
  31. package/dist/skills/tdd/tests.md +77 -0
  32. package/dist/skills/to-spec/SKILL.md +75 -0
  33. package/dist/skills/to-spec/agents/openai.yaml +5 -0
  34. package/dist/skills/to-tickets/SKILL.md +105 -0
  35. package/dist/skills/to-tickets/agents/openai.yaml +5 -0
  36. package/dist/skills/upstream.json +5 -0
  37. package/dist/src/index.d.ts +4 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/orchestrator.d.ts +31 -0
  40. package/dist/src/orchestrator.d.ts.map +1 -0
  41. package/dist/src/resolve.d.ts +10 -0
  42. package/dist/src/resolve.d.ts.map +1 -0
  43. package/dist/src/setup.d.ts +13 -0
  44. package/dist/src/setup.d.ts.map +1 -0
  45. package/dist/test/integration.test.js +848 -0
  46. package/dist/test/integration.test.js.map +7 -0
  47. package/dist/test/orchestrator.test.js +749 -0
  48. package/dist/test/orchestrator.test.js.map +7 -0
  49. package/dist/test/setup.test.js +574 -0
  50. package/dist/test/setup.test.js.map +7 -0
  51. package/docs/README.md +12 -0
  52. package/docs/agents/domain.md +36 -0
  53. package/docs/agents/issue-tracker.md +30 -0
  54. package/docs/agents/triage-labels.md +15 -0
  55. package/docs/implementation-plans/2026-08-27-issue-tracker-choice/phase-2-future-work.md +144 -0
  56. package/docs/implementation-plans/2026-08-27-issue-tracker-choice/phase_01.md +292 -0
  57. package/docs/implementation-plans/2026-08-27-issue-tracker-choice/phase_02.md +212 -0
  58. package/docs/implementation-plans/2026-08-27-issue-tracker-choice/test-requirements.md +203 -0
  59. package/docs/skills.md +58 -0
  60. package/docs/test-plans/2026-08-27-issue-tracker-choice.md +95 -0
  61. package/eslint.config.js +142 -0
  62. package/lib.es5.d.ts +19 -0
  63. package/package.json +36 -0
  64. package/progress.log +190 -0
  65. package/ralph_claude.sh +263 -0
  66. package/scripts/clone-skills.sh +52 -0
  67. package/specs/prd.json +172 -0
  68. package/src/docs-templates/domain.md +36 -0
  69. package/src/docs-templates/issue-tracker-github.md +228 -0
  70. package/src/docs-templates/issue-tracker.md +30 -0
  71. package/src/docs-templates/triage-labels.md +15 -0
  72. package/src/index.ts +184 -0
  73. package/src/orchestrator.ts +324 -0
  74. package/src/resolve.ts +73 -0
  75. package/src/setup.ts +157 -0
  76. package/src/skills/domain-modeling/ADR-FORMAT.md +47 -0
  77. package/src/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  78. package/src/skills/domain-modeling/SKILL.md +74 -0
  79. package/src/skills/domain-modeling/agents/openai.yaml +3 -0
  80. package/src/skills/grill/SKILL.md +7 -0
  81. package/src/skills/grill/agents/openai.yaml +5 -0
  82. package/src/skills/grilling/SKILL.md +28 -0
  83. package/src/skills/grilling/agents/openai.yaml +3 -0
  84. package/src/skills/tdd/SKILL.md +38 -0
  85. package/src/skills/tdd/agents/openai.yaml +3 -0
  86. package/src/skills/tdd/mocking.md +59 -0
  87. package/src/skills/tdd/tests.md +77 -0
  88. package/src/skills/to-spec/SKILL.md +75 -0
  89. package/src/skills/to-spec/agents/openai.yaml +5 -0
  90. package/src/skills/to-tickets/SKILL.md +105 -0
  91. package/src/skills/to-tickets/agents/openai.yaml +5 -0
  92. package/src/skills/upstream.json +5 -0
  93. package/tasks/prd-integration-test-coverage.md +243 -0
  94. package/test/integration.test.ts +636 -0
  95. package/test/mock-agent-echo-args.js +4 -0
  96. package/test/mock-agent-fail.js +3 -0
  97. package/test/mock-agent-pass.js +3 -0
  98. package/test/orchestrator.test.ts +609 -0
  99. package/test/setup.test.ts +417 -0
  100. package/tsconfig.build.json +7 -0
  101. package/tsconfig.json +31 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../test/integration.test.ts", "../../src/resolve.ts", "../../src/setup.ts"],
4
+ "sourcesContent": ["import { test } from '@substrate-system/tapzero'\nimport {\n mkdtempSync, mkdirSync, writeFileSync,\n readFileSync, existsSync, rmSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { tmpdir } from 'node:os'\nimport { execFile } from 'node:child_process'\nimport {\n findFeatureDirs,\n resolveIssuesDir,\n} from '../src/resolve.js'\nimport { setup, SKILL_DIRS } from '../src/setup.js'\n\nfunction tmp ():string {\n return mkdtempSync(\n join(tmpdir(), 'nightralph-int-test-')\n )\n}\n\ntest('findFeatureDirs - no .scratch dir', t => {\n const dir = tmp()\n try {\n const result = findFeatureDirs(dir)\n t.deepEqual(result, [],\n 'returns empty array when .scratch/ missing')\n } finally {\n rmSync(dir, { recursive:true, force:true })\n }\n})\n\ntest('findFeatureDirs - dirs without issues/', t => {\n const dir = tmp()\n try {\n const scratch = join(dir, '.scratch')\n mkdirSync(join(scratch, 'feat-a'), {\n recursive:true,\n })\n mkdirSync(join(scratch, 'feat-b'), {\n recursive:true,\n })\n const result = findFeatureDirs(dir)\n t.deepEqual(result, [],\n 'returns empty when no issues/ subdirs')\n } finally {\n rmSync(dir, { recursive:true, force:true })\n }\n})\n\ntest('findFeatureDirs - valid feature dirs', t => {\n const dir = tmp()\n try {\n const scratch = join(dir, '.scratch')\n mkdirSync(\n join(scratch, 'feat-x', 'issues'),\n { recursive:true },\n )\n writeFileSync(\n join(scratch, 'feat-x', 'spec.md'),\n '# spec',\n )\n\n const result = findFeatureDirs(dir)\n t.equal(result.length, 1, 'finds one feature')\n t.equal(result[0].name, 'feat-x',\n 'correct name')\n t.equal(result[0].dir,\n join(scratch, 'feat-x', 'issues'),\n 'correct dir path')\n t.equal(result[0].spec,\n join(scratch, 'feat-x', 'spec.md'),\n 'correct spec path')\n } finally {\n rmSync(dir, { recursive:true, force:true })\n }\n})\n\ntest('findFeatureDirs - ignores non-directory entries',\n t => {\n const dir = tmp()\n try {\n const scratch = join(dir, '.scratch')\n mkdirSync(scratch, { recursive:true })\n writeFileSync(\n join(scratch, 'not-a-dir.txt'),\n 'just a file',\n )\n mkdirSync(\n join(scratch, 'real-feat', 'issues'),\n { recursive:true },\n )\n\n const result = findFeatureDirs(dir)\n t.equal(result.length, 1,\n 'only returns the directory entry')\n t.equal(result[0].name, 'real-feat',\n 'returns the valid feature')\n } finally {\n rmSync(dir, { recursive:true, force:true })\n }\n })\n\ntest('resolveIssuesDir - returns explicit flags directly',\n async t => {\n const dir = tmp()\n try {\n const result = await resolveIssuesDir(\n '/my/issues',\n '/my/spec.md',\n dir,\n )\n t.equal(result.dir, '/my/issues',\n 'dir matches the flag value')\n t.equal(result.spec, '/my/spec.md',\n 'spec matches the flag value')\n } finally {\n rmSync(dir, { recursive:true, force:true })\n }\n })\n\ntest('resolveIssuesDir - no filesystem scanning with flags',\n async t => {\n const dir = tmp()\n try {\n const flagDir = join(dir, 'explicit-issues')\n const flagSpec = join(dir, 'explicit-spec.md')\n const result = await resolveIssuesDir(\n flagDir,\n flagSpec,\n dir,\n )\n t.equal(result.dir, flagDir,\n 'returns dir without scanning')\n t.equal(result.spec, flagSpec,\n 'returns spec without scanning')\n } finally {\n rmSync(dir, { recursive:true, force:true })\n }\n })\n\n// -- subprocess CLI smoke tests --\n\nconst CLI = join(process.cwd(), 'dist', 'index.js')\nconst MOCK_AGENT = join(\n process.cwd(), 'test', 'mock-agent-pass.js'\n)\nconst MOCK_ECHO = join(\n process.cwd(), 'test', 'mock-agent-echo-args.js'\n)\n\nfunction spawnCli (args:string[]):Promise<{\n code:number\n stdout:string\n stderr:string\n}> {\n return new Promise(resolve => {\n execFile(\n process.execPath,\n [CLI, ...args],\n { timeout:30_000 },\n (err, stdout, stderr) => {\n const code = err && 'code' in err ?\n (err as { code:number }).code :\n (err ? 1 : 0)\n resolve({\n code:code as number,\n stdout,\n stderr,\n })\n },\n )\n })\n}\n\nfunction makeTicketBody (opts:{\n status:string\n blockers?:number[]\n}):string {\n const lines = [\n '# Test ticket',\n '',\n `**Status:** ${opts.status}`,\n ]\n if (opts.blockers && opts.blockers.length > 0) {\n lines.push(\n `**Blocked by:** ${opts.blockers.join(', ')}`\n )\n }\n return lines.join('\\n')\n}\n\ntest('CLI subprocess - --model flag forwarded to agent',\n async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n const logsDir = join(base, 'logs')\n mkdirSync(issuesDir, { recursive:true })\n\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Test spec')\n\n writeFileSync(\n join(issuesDir, '01-echo.md'),\n makeTicketBody({\n status:'ready-for-agent',\n }),\n )\n\n const { code } = await spawnCli([\n MOCK_ECHO,\n '--dir', issuesDir,\n '--spec', specPath,\n '--timeout-secs', '10',\n '-m', 'test-model',\n ])\n\n t.equal(code, 0, 'exit code 0')\n\n const logPath = join(logsDir, '01-echo.log')\n t.ok(\n existsSync(logPath),\n 'log file created',\n )\n\n const logContent = readFileSync(\n logPath, 'utf8'\n )\n t.ok(\n logContent.includes('--model'),\n 'log contains --model flag',\n )\n t.ok(\n logContent.includes('test-model'),\n 'log contains model value',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n })\n\ntest('CLI subprocess - --dry-run output', async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n mkdirSync(issuesDir, { recursive:true })\n\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Test spec')\n\n writeFileSync(\n join(issuesDir, '01-alpha.md'),\n makeTicketBody({ status:'ready-for-agent' }),\n )\n writeFileSync(\n join(issuesDir, '02-beta.md'),\n makeTicketBody({\n status:'ready-for-agent',\n blockers:[1],\n }),\n )\n\n const { code, stdout } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', specPath,\n '--dry-run',\n ])\n\n t.equal(code, 0, 'exit code 0')\n\n t.ok(\n stdout.includes('Wave 1:') &&\n stdout.includes('01-alpha.md'),\n 'stdout contains Wave 1 with first ticket',\n )\n t.ok(\n stdout.includes('Wave 2:') &&\n stdout.includes('02-beta.md'),\n 'stdout contains Wave 2 with second ticket',\n )\n t.ok(\n stdout.includes('AGENT INSTRUCTIONS'),\n 'stdout contains prompt preview',\n )\n\n const ticket1 = readFileSync(\n join(issuesDir, '01-alpha.md'), 'utf8'\n )\n t.ok(\n ticket1.includes('**Status:** ready-for-agent'),\n 'ticket 1 NOT modified',\n )\n const ticket2 = readFileSync(\n join(issuesDir, '02-beta.md'), 'utf8'\n )\n t.ok(\n ticket2.includes('**Status:** ready-for-agent'),\n 'ticket 2 NOT modified',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n})\n\ntest('CLI subprocess - no tickets exits gracefully',\n async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n mkdirSync(issuesDir, { recursive:true })\n\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Empty spec')\n\n const { code, stdout } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', specPath,\n ])\n\n t.equal(code, 0, 'exit code 0 (graceful)')\n t.ok(\n stdout.includes('No ticket files found'),\n 'stdout contains no-tickets message',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n })\n\ntest('CLI subprocess - error for missing --dir', async t => {\n const base = tmp()\n try {\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Valid spec')\n\n const { code, stderr } = await spawnCli([\n MOCK_AGENT,\n '--dir', '/nonexistent/path',\n '--spec', specPath,\n ])\n\n t.ok(code !== 0, 'exit code is non-zero')\n t.ok(\n stderr.includes('not found'),\n 'stderr contains not found',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n})\n\ntest('CLI subprocess - error for missing --spec', async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n mkdirSync(issuesDir, { recursive:true })\n\n const { code, stderr } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', '/nonexistent/spec.md',\n ])\n\n t.ok(code !== 0, 'exit code is non-zero')\n t.ok(\n stderr.includes('not found'),\n 'stderr contains not found',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n})\n\ntest('CLI subprocess - unknown blocker warning and stripping',\n async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n const logsDir = join(base, 'logs')\n mkdirSync(issuesDir, { recursive:true })\n\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Test spec')\n\n writeFileSync(\n join(issuesDir, '01-task.md'),\n makeTicketBody({\n status:'ready-for-agent',\n blockers:[99],\n }),\n )\n\n const { code, stdout, stderr } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', specPath,\n '--timeout-secs', '10',\n ])\n\n const combined = stdout + stderr\n t.ok(\n combined.includes('99'),\n 'output warns about blocker 99',\n )\n t.ok(\n combined.includes('not found'),\n 'output mentions blocker not found',\n )\n\n t.equal(code, 0, 'exit code 0')\n\n const ticket = readFileSync(\n join(issuesDir, '01-task.md'), 'utf8'\n )\n t.ok(\n ticket.includes('**Status:** done'),\n 'ticket completed after blocker stripped',\n )\n\n t.ok(\n existsSync(join(logsDir, '01-task.log')),\n 'log file created',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n })\n\ntest('CLI subprocess - dry-run deadlock detection',\n async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n mkdirSync(issuesDir, { recursive:true })\n\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Test spec')\n\n writeFileSync(\n join(issuesDir, '01-alpha.md'),\n makeTicketBody({\n status:'ready-for-agent',\n blockers:[2],\n }),\n )\n writeFileSync(\n join(issuesDir, '02-beta.md'),\n makeTicketBody({\n status:'ready-for-agent',\n blockers:[1],\n }),\n )\n\n const { code, stdout } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', specPath,\n '--dry-run',\n ])\n\n t.equal(code, 0, 'exit code 0')\n t.ok(\n stdout.includes('Deadlocked tickets'),\n 'output contains Deadlocked tickets',\n )\n t.ok(\n stdout.includes('01-alpha.md'),\n 'deadlock lists first ticket',\n )\n t.ok(\n stdout.includes('02-beta.md'),\n 'deadlock lists second ticket',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n })\n\ntest('CLI subprocess - execute smoke test', async t => {\n const base = tmp()\n try {\n const issuesDir = join(base, 'issues')\n const logsDir = join(base, 'logs')\n mkdirSync(issuesDir, { recursive:true })\n\n const specPath = join(base, 'spec.md')\n writeFileSync(specPath, '# Test spec\\nDo things.')\n\n writeFileSync(\n join(issuesDir, '01-first.md'),\n makeTicketBody({ status:'ready-for-agent' }),\n )\n writeFileSync(\n join(issuesDir, '02-second.md'),\n makeTicketBody({\n status:'ready-for-agent',\n blockers:[1],\n }),\n )\n\n const { code } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', specPath,\n '--timeout-secs', '10',\n ])\n\n t.equal(code, 0, 'exit code 0')\n\n const ticket1 = readFileSync(\n join(issuesDir, '01-first.md'), 'utf8'\n )\n t.ok(\n ticket1.includes('**Status:** done'),\n 'ticket 1 marked done',\n )\n\n const ticket2 = readFileSync(\n join(issuesDir, '02-second.md'), 'utf8'\n )\n t.ok(\n ticket2.includes('**Status:** done'),\n 'ticket 2 marked done',\n )\n\n t.ok(\n existsSync(join(logsDir, '01-first.log')),\n 'log file created for ticket 1',\n )\n t.ok(\n existsSync(join(logsDir, '02-second.log')),\n 'log file created for ticket 2',\n )\n } finally {\n rmSync(base, { recursive:true, force:true })\n }\n})\n\n// -- US-010: setup-then-execute composition --\n\nconst DIST_DIR = join(process.cwd(), 'dist')\n\ntest('setup-then-execute composition', async t => {\n const projectDir = tmp()\n try {\n setup({\n bundledSkillsDir:join(DIST_DIR, 'skills'),\n docsTemplatesDir:join(\n DIST_DIR, 'docs-templates'\n ),\n projectDir,\n tracker:'local',\n })\n\n const feature = 'my-feature'\n const issuesDir = join(\n projectDir, '.scratch', feature, 'issues'\n )\n const specPath = join(\n projectDir, '.scratch', feature, 'spec.md'\n )\n mkdirSync(issuesDir, { recursive:true })\n writeFileSync(specPath, '# Feature spec\\nDo things.')\n\n writeFileSync(\n join(issuesDir, '01-alpha.md'),\n makeTicketBody({ status:'ready-for-agent' }),\n )\n writeFileSync(\n join(issuesDir, '02-beta.md'),\n makeTicketBody({\n status:'ready-for-agent',\n blockers:[1],\n }),\n )\n\n const { code } = await spawnCli([\n MOCK_AGENT,\n '--dir', issuesDir,\n '--spec', specPath,\n '--timeout-secs', '10',\n ])\n\n t.equal(code, 0, 'exit code 0')\n\n const ticket1 = readFileSync(\n join(issuesDir, '01-alpha.md'), 'utf8'\n )\n t.ok(\n ticket1.includes('**Status:** done'),\n 'ticket 1 marked done',\n )\n\n const ticket2 = readFileSync(\n join(issuesDir, '02-beta.md'), 'utf8'\n )\n t.ok(\n ticket2.includes('**Status:** done'),\n 'ticket 2 marked done',\n )\n\n const logsDir = join(\n projectDir, '.scratch', feature, 'logs'\n )\n t.ok(\n existsSync(join(logsDir, '01-alpha.log')),\n 'log file created for ticket 1',\n )\n t.ok(\n existsSync(join(logsDir, '02-beta.log')),\n 'log file created for ticket 2',\n )\n\n t.ok(\n existsSync(join(\n projectDir, 'docs', 'agents',\n 'issue-tracker.md',\n )),\n 'docs/agents/issue-tracker.md exists from setup',\n )\n\n for (const skill of SKILL_DIRS) {\n t.ok(\n existsSync(join(\n projectDir, '.agents', 'skills',\n skill,\n )),\n `.agents/skills/${skill}/ exists from setup`,\n )\n }\n } finally {\n rmSync(projectDir, { recursive:true, force:true })\n }\n})\n", "import { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { select } from '@inquirer/prompts'\n\nexport function findFeatureDirs (cwd:string):{\n name:string;\n dir:string;\n spec:string\n}[] {\n const scratchDir = join(cwd, '.scratch')\n if (!existsSync(scratchDir)) return []\n const entries = readdirSync(\n scratchDir, { withFileTypes:true }\n )\n const results:{ name:string; dir:string; spec:string }[] = []\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const issuesDir = join(\n scratchDir, entry.name, 'issues'\n )\n const specFile = join(\n scratchDir, entry.name, 'spec.md'\n )\n if (existsSync(issuesDir)) {\n results.push({\n name:entry.name,\n dir:issuesDir,\n spec:specFile,\n })\n }\n }\n return results\n}\n\nexport async function resolveIssuesDir (\n dirFlag:string|undefined,\n specFlag:string|undefined,\n cwd:string = process.cwd(),\n):Promise<{ dir:string; spec:string }> {\n if (dirFlag && specFlag) {\n return { dir:dirFlag, spec:specFlag }\n }\n\n const features = findFeatureDirs(cwd)\n\n if (features.length === 0) {\n console.error(\n 'No .scratch/<feature>/issues/ directories ' +\n 'found.\\nProvide --dir and --spec explicitly.'\n )\n process.exit(2)\n }\n\n let chosen:typeof features[0]\n if (features.length === 1) {\n chosen = features[0]\n console.log(`Using feature: ${chosen.name}`)\n } else {\n const name = await select({\n message:'Which feature?',\n choices:features.map(f => ({\n name:f.name,\n value:f.name,\n })),\n })\n chosen = features.find(f => f.name === name)!\n }\n\n const dir = dirFlag ?? chosen.dir\n const spec = specFlag ?? chosen.spec\n\n return { dir, spec }\n}\n", "import {\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n symlinkSync,\n writeFileSync,\n} from 'node:fs'\nimport { join } from 'node:path'\nimport { execSync } from 'node:child_process'\n\nexport const SKILL_DIRS = [\n 'grill', 'grilling', 'domain-modeling',\n 'to-spec', 'to-tickets', 'tdd',\n] as const\n\nexport const DOC_TEMPLATES = [\n 'triage-labels.md',\n 'domain.md',\n] as const\n\nexport function checkGhAuth ():boolean {\n try {\n execSync('gh auth status', { stdio:'ignore' })\n return true\n } catch {\n return false\n }\n}\n\nexport type TrackerKind = 'github'|'local'\n\nexport type SetupOpts = {\n bundledSkillsDir:string\n docsTemplatesDir:string\n projectDir:string\n claude?:boolean\n tracker:TrackerKind\n}\n\nconst TRACKER_TEMPLATES:Record<TrackerKind, string> = {\n local:'issue-tracker.md',\n github:'issue-tracker-github.md',\n}\n\nexport function setup (opts:SetupOpts):void {\n const {\n bundledSkillsDir,\n docsTemplatesDir,\n projectDir,\n claude,\n tracker,\n } = opts\n const agentsSkillsDir = join(\n projectDir, '.agents', 'skills'\n )\n\n const upstream = JSON.parse(\n readFileSync(\n join(bundledSkillsDir, 'upstream.json'),\n 'utf8'\n )\n ) as { repo:string; commit:string }\n\n console.log('Installing skills to .agents/skills/\\n')\n\n for (const skill of SKILL_DIRS) {\n const src = join(bundledSkillsDir, skill)\n const dest = join(agentsSkillsDir, skill)\n mkdirSync(dest, { recursive:true })\n cpSync(src, dest, { recursive:true })\n const files = readdirSync(src)\n console.log(\n ` ${skill}/ (${files.join(', ')})`\n )\n }\n\n if (claude) {\n const claudeSkillsDir = join(\n projectDir, '.claude', 'skills'\n )\n mkdirSync(claudeSkillsDir, { recursive:true })\n\n for (const skill of SKILL_DIRS) {\n const linkPath = join(claudeSkillsDir, skill)\n const target = join(\n '..', '..', '.agents', 'skills', skill\n )\n if (existsSync(linkPath)) continue\n symlinkSync(target, linkPath)\n }\n\n console.log(\n '\\nCreated symlinks in .claude/skills/'\n )\n }\n\n const docsAgentsDir = join(\n projectDir, 'docs', 'agents'\n )\n mkdirSync(docsAgentsDir, { recursive:true })\n\n console.log('')\n for (const tmpl of DOC_TEMPLATES) {\n const dest = join(docsAgentsDir, tmpl)\n if (existsSync(dest)) {\n console.log(\n ` docs/agents/${tmpl} (already exists)`\n )\n continue\n }\n const src = join(docsTemplatesDir, tmpl)\n writeFileSync(dest, readFileSync(src, 'utf8'))\n console.log(` docs/agents/${tmpl} (created)`)\n }\n\n const trackerSrc = join(\n docsTemplatesDir, TRACKER_TEMPLATES[tracker]\n )\n const trackerDest = join(docsAgentsDir, 'issue-tracker.md')\n writeFileSync(trackerDest, readFileSync(trackerSrc, 'utf8'))\n console.log(\n ` docs/agents/issue-tracker.md (${tracker})`\n )\n\n const trackerLine = tracker === 'github' ?\n 'Issues are tracked via GitHub Issues using the `gh` ' +\n 'CLI.' :\n 'Issues are tracked as local markdown files under ' +\n '`.scratch/`.'\n\n const agentsMd = [\n '## Agent skills',\n '',\n '### Issue tracker',\n '',\n `${trackerLine} See \\`docs/agents/issue-tracker.md\\`.`,\n '',\n '### Triage labels',\n '',\n 'Default label vocabulary. See ' +\n '`docs/agents/triage-labels.md`.',\n '',\n '### Domain docs',\n '',\n 'Single-context layout. See `docs/agents/domain.md`.',\n '',\n ].join('\\n')\n\n writeFileSync(join(projectDir, 'AGENTS.md'), agentsMd)\n console.log('\\n AGENTS.md (updated)')\n\n console.log(\n `\\nSource: ${upstream.repo} @ ${upstream.commit}`\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["mkdirSync", "writeFileSync", "readFileSync", "existsSync", "join", "existsSync", "readdirSync", "join", "join", "readdirSync", "existsSync", "join", "mkdirSync", "writeFileSync", "existsSync", "readFileSync"]
7
+ }