nightralph 0.0.48 → 0.0.52

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/progress.ts"],
4
- "sourcesContent": ["import { execFile } from 'node:child_process'\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { promisify } from 'node:util'\nimport type { Ticket } from './orchestrator.js'\n\nconst TICKET_FILENAME_RE = /^(\\d+)-(.+)\\.md$/\n\nconst execFileAsync = promisify(execFile)\n\nexport type TicketProgress = {\n num:number\n slug:string\n filename:string\n done:boolean\n branch:string|null\n exitCode:number|null\n completedAt:string|null\n}\n\nexport type ProgressData = {\n feature:string\n startedAt:string\n tickets:Array<TicketProgress>\n}\n\nexport function generateProgress (\n feature:string,\n tickets:ReadonlyArray<Ticket>\n):ProgressData {\n return {\n feature,\n startedAt:new Date().toISOString(),\n tickets:tickets.map((ticket) => ({\n num:ticket.num,\n slug:ticket.slug,\n filename:ticket.filename,\n done:false,\n branch:null,\n exitCode:null,\n completedAt:null,\n })),\n }\n}\n\nexport function readProgress (\n progressPath:string\n):ProgressData|null {\n let content:string\n try {\n content = readFileSync(progressPath, 'utf8')\n } catch {\n return null\n }\n\n const featureMatch = content.match(/^# Progress: (.*)$/m)\n const startedMatch = content.match(/^Started: (.*)$/m)\n\n const tickets:Array<TicketProgress> = []\n let current:TicketProgress|null = null\n\n for (const line of content.split('\\n')) {\n const ticketMatch = line.match(/^- \\[( |x)\\] (.+)$/)\n if (ticketMatch) {\n if (current) tickets.push(current)\n const filename = ticketMatch[2]\n const parsed = filename.match(TICKET_FILENAME_RE)\n current = {\n num:parsed ? Number(parsed[1]) : NaN,\n slug:parsed ? parsed[2] : '',\n filename,\n done:ticketMatch[1] === 'x',\n branch:null,\n exitCode:null,\n completedAt:null,\n }\n continue\n }\n if (!current) continue\n\n const branchMatch = line.match(/^ {2}branch: (.*)$/)\n if (branchMatch) {\n current.branch = branchMatch[1]\n continue\n }\n const exitMatch = line.match(/^ {2}exit: (-?\\d+)$/)\n if (exitMatch) {\n current.exitCode = Number(exitMatch[1])\n continue\n }\n const completedMatch = line.match(/^ {2}completed: (.*)$/)\n if (completedMatch) {\n current.completedAt = completedMatch[1]\n continue\n }\n }\n if (current) tickets.push(current)\n\n return {\n feature:featureMatch ? featureMatch[1] : '',\n startedAt:startedMatch ? startedMatch[1] : '',\n tickets,\n }\n}\n\nexport function mergeProgress (\n fresh:ProgressData,\n existing:ProgressData|null\n):ProgressData {\n if (!existing) return fresh\n\n const existingByFilename = new Map(\n existing.tickets.map((t) => [t.filename, t])\n )\n\n return {\n ...fresh,\n tickets:fresh.tickets.map((ticket) => {\n const prior = existingByFilename.get(ticket.filename)\n return (prior && prior.done) ? { ...prior } : ticket\n }),\n }\n}\n\nexport function renderProgress (data:ProgressData):string {\n const lines:Array<string> = [\n `# Progress: ${data.feature}`,\n '',\n `Started: ${data.startedAt}`,\n '',\n ]\n\n for (const ticket of data.tickets) {\n const checkbox = ticket.done ? '[x]' : '[ ]'\n lines.push(`- ${checkbox} ${ticket.filename}`)\n\n if (ticket.done || ticket.exitCode !== null) {\n if (ticket.branch) {\n lines.push(\n ` branch: ${ticket.branch}`\n )\n }\n if (ticket.exitCode !== null) {\n lines.push(\n ` exit: ${ticket.exitCode}`\n )\n }\n if (ticket.completedAt) {\n lines.push(\n ` completed: ${ticket.completedAt}`\n )\n }\n }\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function checkTicket (\n data:ProgressData,\n ticketNum:number,\n result:{ branch:string; exitCode:number; done?:boolean }\n):void {\n const ticket = data.tickets.find(\n (t) => t.num === ticketNum\n )\n if (!ticket) return\n\n ticket.done = result.done ?? true\n ticket.branch = result.branch\n ticket.exitCode = result.exitCode\n if (ticket.done) {\n ticket.completedAt = new Date().toISOString()\n }\n}\n\nexport function writeProgress (\n progressPath:string,\n data:ProgressData\n):void {\n writeFileSync(\n progressPath,\n renderProgress(data)\n )\n}\n\nexport async function commitProgress (\n repoRoot:string,\n progressPath:string,\n message:string\n):Promise<boolean> {\n await execFileAsync(\n 'git',\n ['add', '--force', progressPath],\n { cwd:repoRoot }\n )\n\n try {\n await execFileAsync(\n 'git',\n ['diff', '--cached', '--quiet', '--', progressPath],\n { cwd:repoRoot }\n )\n return false\n } catch {\n // non-zero exit means the staged file differs from HEAD\n }\n\n await execFileAsync(\n 'git',\n ['commit', '-m', message, '--', progressPath],\n { cwd:repoRoot }\n )\n return true\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { execFile } from 'node:child_process'\nimport { readFileSync, writeFileSync } from 'node:fs'\nimport { promisify } from 'node:util'\nimport type { Ticket } from './orchestrator.js'\n\nconst TICKET_FILENAME_RE = /^(\\d+)-(.+)\\.md$/\n\nconst execFileAsync = promisify(execFile)\n\nexport type TicketProgress = {\n num:number\n slug:string\n filename:string\n done:boolean\n branch:string|null\n exitCode:number|null\n completedAt:string|null\n}\n\nexport type ProgressData = {\n feature:string\n startedAt:string\n tickets:Array<TicketProgress>\n}\n\nexport function generateProgress (\n feature:string,\n tickets:ReadonlyArray<Ticket>\n):ProgressData {\n return {\n feature,\n startedAt:new Date().toISOString(),\n tickets:tickets.map((ticket) => ({\n num:ticket.num,\n slug:ticket.slug,\n filename:ticket.filename,\n done:false,\n branch:null,\n exitCode:null,\n completedAt:null,\n })),\n }\n}\n\nexport function generateMultiFeatureProgress (\n tickets:ReadonlyArray<Ticket>\n):Map<string, ProgressData> {\n const byFeature = new Map<string, Ticket[]>()\n for (const t of tickets) {\n const key = t.feature || ''\n const arr = byFeature.get(key) ?? []\n arr.push(t)\n byFeature.set(key, arr)\n }\n const result = new Map<string, ProgressData>()\n for (const [feat, ft] of byFeature) {\n result.set(feat, generateProgress(feat, ft))\n }\n return result\n}\n\nexport type ProgressTracker = {\n dataFor:(feature:string) => ProgressData\n pathFor:(feature:string) => string\n}\n\nexport function createProgressTracker (opts:{\n progressPaths:Map<string, string>\n dataMap:Map<string, ProgressData>\n fallbackPath:string\n fallbackData:ProgressData\n}):ProgressTracker {\n return {\n dataFor (feature:string):ProgressData {\n return opts.dataMap.get(feature) ??\n opts.fallbackData\n },\n pathFor (feature:string):string {\n return opts.progressPaths.get(feature) ??\n opts.fallbackPath\n },\n }\n}\n\nexport function isSpecComplete (\n progressPath:string\n):boolean {\n const data = readProgress(progressPath)\n if (!data) return false\n if (data.tickets.length === 0) return false\n return data.tickets.every(t => t.done)\n}\n\nexport function readProgress (\n progressPath:string\n):ProgressData|null {\n let content:string\n try {\n content = readFileSync(progressPath, 'utf8')\n } catch {\n return null\n }\n\n const featureMatch = content.match(/^# Progress: (.*)$/m)\n const startedMatch = content.match(/^Started: (.*)$/m)\n\n const tickets:Array<TicketProgress> = []\n let current:TicketProgress|null = null\n\n for (const line of content.split('\\n')) {\n const ticketMatch = line.match(/^- \\[( |x)\\] (.+)$/)\n if (ticketMatch) {\n if (current) tickets.push(current)\n const filename = ticketMatch[2]\n const parsed = filename.match(TICKET_FILENAME_RE)\n current = {\n num:parsed ? Number(parsed[1]) : NaN,\n slug:parsed ? parsed[2] : '',\n filename,\n done:ticketMatch[1] === 'x',\n branch:null,\n exitCode:null,\n completedAt:null,\n }\n continue\n }\n if (!current) continue\n\n const branchMatch = line.match(/^ {2}branch: (.*)$/)\n if (branchMatch) {\n current.branch = branchMatch[1]\n continue\n }\n const exitMatch = line.match(/^ {2}exit: (-?\\d+)$/)\n if (exitMatch) {\n current.exitCode = Number(exitMatch[1])\n continue\n }\n const completedMatch = line.match(/^ {2}completed: (.*)$/)\n if (completedMatch) {\n current.completedAt = completedMatch[1]\n continue\n }\n }\n if (current) tickets.push(current)\n\n return {\n feature:featureMatch ? featureMatch[1] : '',\n startedAt:startedMatch ? startedMatch[1] : '',\n tickets,\n }\n}\n\nexport function mergeProgress (\n fresh:ProgressData,\n existing:ProgressData|null\n):ProgressData {\n if (!existing) return fresh\n\n const existingByFilename = new Map(\n existing.tickets.map((t) => [t.filename, t])\n )\n\n return {\n ...fresh,\n tickets:fresh.tickets.map((ticket) => {\n const prior = existingByFilename.get(ticket.filename)\n return (prior && prior.done) ? { ...prior } : ticket\n }),\n }\n}\n\nexport function renderProgress (data:ProgressData):string {\n const lines:Array<string> = [\n `# Progress: ${data.feature}`,\n '',\n `Started: ${data.startedAt}`,\n '',\n ]\n\n for (const ticket of data.tickets) {\n const checkbox = ticket.done ? '[x]' : '[ ]'\n lines.push(`- ${checkbox} ${ticket.filename}`)\n\n if (ticket.done || ticket.exitCode !== null) {\n if (ticket.branch) {\n lines.push(\n ` branch: ${ticket.branch}`\n )\n }\n if (ticket.exitCode !== null) {\n lines.push(\n ` exit: ${ticket.exitCode}`\n )\n }\n if (ticket.completedAt) {\n lines.push(\n ` completed: ${ticket.completedAt}`\n )\n }\n }\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function checkTicket (\n data:ProgressData,\n ticketNum:number,\n result:{ branch:string; exitCode:number; done?:boolean }\n):void {\n const ticket = data.tickets.find(\n (t) => t.num === ticketNum\n )\n if (!ticket) return\n\n ticket.done = result.done ?? true\n ticket.branch = result.branch\n ticket.exitCode = result.exitCode\n if (ticket.done) {\n ticket.completedAt = new Date().toISOString()\n }\n}\n\nexport function writeProgress (\n progressPath:string,\n data:ProgressData\n):void {\n writeFileSync(\n progressPath,\n renderProgress(data)\n )\n}\n\nexport async function commitProgress (\n repoRoot:string,\n progressPath:string,\n message:string\n):Promise<boolean> {\n await execFileAsync(\n 'git',\n ['add', '--force', progressPath],\n { cwd:repoRoot }\n )\n\n try {\n await execFileAsync(\n 'git',\n ['diff', '--cached', '--quiet', '--', progressPath],\n { cwd:repoRoot }\n )\n return false\n } catch {\n // non-zero exit means the staged file differs from HEAD\n }\n\n await execFileAsync(\n 'git',\n ['commit', '-m', message, '--', progressPath],\n { cwd:repoRoot }\n )\n return true\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/resolve.js CHANGED
@@ -3,7 +3,9 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
3
3
  import { existsSync, readdirSync } from "node:fs";
4
4
  import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
- import { select } from "@inquirer/prompts";
6
+ import { checkbox, Separator } from "@inquirer/prompts";
7
+ import { isSpecComplete } from "./progress.js";
8
+ import { scanTickets, findReadyTickets } from "./orchestrator.js";
7
9
  function getScriptDir(metaUrl) {
8
10
  return dirname(fileURLToPath(metaUrl));
9
11
  }
@@ -28,24 +30,32 @@ function findFeatureDirs(cwd) {
28
30
  entry.name,
29
31
  "spec.md"
30
32
  );
31
- if (existsSync(issuesDir)) {
32
- results.push({
33
- name: entry.name,
34
- dir: issuesDir,
35
- spec: specFile
36
- });
37
- }
33
+ if (!existsSync(issuesDir)) continue;
34
+ const progressFile = join(
35
+ scratchDir,
36
+ entry.name,
37
+ "progress.md"
38
+ );
39
+ if (isSpecComplete(progressFile)) continue;
40
+ results.push({
41
+ name: entry.name,
42
+ dir: issuesDir,
43
+ spec: specFile
44
+ });
38
45
  }
46
+ results.sort((a, b) => a.name.localeCompare(b.name));
39
47
  return results;
40
48
  }
41
49
  __name(findFeatureDirs, "findFeatureDirs");
50
+ const ALL_VALUE = "__all__";
42
51
  async function resolveIssuesDir(specName, cwd = process.cwd()) {
43
52
  if (specName) {
44
53
  const featureDir = join(cwd, ".scratch", specName);
45
- return {
54
+ return [{
46
55
  dir: join(featureDir, "issues"),
47
- spec: join(featureDir, "spec.md")
48
- };
56
+ spec: join(featureDir, "spec.md"),
57
+ name: specName
58
+ }];
49
59
  }
50
60
  const features = findFeatureDirs(cwd);
51
61
  if (features.length === 0) {
@@ -54,21 +64,40 @@ async function resolveIssuesDir(specName, cwd = process.cwd()) {
54
64
  );
55
65
  process.exit(2);
56
66
  }
57
- let chosen;
58
67
  if (features.length === 1) {
59
- chosen = features[0];
60
- console.log(`Using feature: ${chosen.name}`);
61
- } else {
62
- const name = await select({
63
- message: "Which feature?",
64
- choices: features.map((f) => ({
65
- name: f.name,
66
- value: f.name
67
- }))
68
+ const f = features[0];
69
+ console.log(`Using feature: ${f.name}`);
70
+ return [{ dir: f.dir, spec: f.spec, name: f.name }];
71
+ }
72
+ const featureChoices = features.map((f) => {
73
+ const tickets = scanTickets(f.dir);
74
+ const ready = findReadyTickets(tickets).length;
75
+ return {
76
+ name: `${f.name} (${ready}/${tickets.length} ready)`,
77
+ value: f.name
78
+ };
79
+ });
80
+ while (true) {
81
+ const selected = await checkbox({
82
+ message: "Which features?",
83
+ choices: [
84
+ { name: "All", value: ALL_VALUE },
85
+ new Separator(),
86
+ ...featureChoices
87
+ ]
88
+ });
89
+ if (selected.length === 0) {
90
+ console.log("Select at least one feature");
91
+ continue;
92
+ }
93
+ const names = selected.includes(ALL_VALUE) ? features.map((f) => f.name) : selected;
94
+ return names.map((name) => {
95
+ const f = features.find(
96
+ (ff) => ff.name === name
97
+ );
98
+ return { dir: f.dir, spec: f.spec, name: f.name };
68
99
  });
69
- chosen = features.find((f) => f.name === name);
70
100
  }
71
- return { dir: chosen.dir, spec: chosen.spec };
72
101
  }
73
102
  __name(resolveIssuesDir, "resolveIssuesDir");
74
103
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/resolve.ts"],
4
- "sourcesContent": ["import { existsSync, readdirSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { select } from '@inquirer/prompts'\n\nexport function getScriptDir (metaUrl:string):string {\n return dirname(fileURLToPath(metaUrl))\n}\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 specName:string|undefined,\n cwd:string = process.cwd(),\n):Promise<{ dir:string; spec:string }> {\n if (specName) {\n const featureDir = join(cwd, '.scratch', specName)\n return {\n dir:join(featureDir, 'issues'),\n spec:join(featureDir, 'spec.md'),\n }\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 --spec <feature-name>.'\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 return { dir:chosen.dir, spec:chosen.spec }\n}\n"],
5
- "mappings": ";;AAAA,SAAS,YAAY,mBAAmB;AACxC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AAEhB,SAAS,aAAc,SAAuB;AACjD,SAAO,QAAQ,cAAc,OAAO,CAAC;AACzC;AAFgB;AAIT,SAAS,gBAAiB,KAI7B;AACA,QAAM,aAAa,KAAK,KAAK,UAAU;AACvC,MAAI,CAAC,WAAW,UAAU,EAAG,QAAO,CAAC;AACrC,QAAM,UAAU;AAAA,IACZ;AAAA,IAAY,EAAE,eAAc,KAAK;AAAA,EACrC;AACA,QAAM,UAAqD,CAAC;AAC5D,aAAW,SAAS,SAAS;AACzB,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAM,YAAY;AAAA,MACd;AAAA,MAAY,MAAM;AAAA,MAAM;AAAA,IAC5B;AACA,UAAM,WAAW;AAAA,MACb;AAAA,MAAY,MAAM;AAAA,MAAM;AAAA,IAC5B;AACA,QAAI,WAAW,SAAS,GAAG;AACvB,cAAQ,KAAK;AAAA,QACT,MAAK,MAAM;AAAA,QACX,KAAI;AAAA,QACJ,MAAK;AAAA,MACT,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO;AACX;AA5BgB;AA8BhB,eAAsB,iBAClB,UACA,MAAa,QAAQ,IAAI,GACU;AACnC,MAAI,UAAU;AACV,UAAM,aAAa,KAAK,KAAK,YAAY,QAAQ;AACjD,WAAO;AAAA,MACH,KAAI,KAAK,YAAY,QAAQ;AAAA,MAC7B,MAAK,KAAK,YAAY,SAAS;AAAA,IACnC;AAAA,EACJ;AAEA,QAAM,WAAW,gBAAgB,GAAG;AAEpC,MAAI,SAAS,WAAW,GAAG;AACvB,YAAQ;AAAA,MACJ;AAAA,IAEJ;AACA,YAAQ,KAAK,CAAC;AAAA,EAClB;AAEA,MAAI;AACJ,MAAI,SAAS,WAAW,GAAG;AACvB,aAAS,SAAS,CAAC;AACnB,YAAQ,IAAI,kBAAkB,OAAO,IAAI,EAAE;AAAA,EAC/C,OAAO;AACH,UAAM,OAAO,MAAM,OAAO;AAAA,MACtB,SAAQ;AAAA,MACR,SAAQ,SAAS,IAAI,QAAM;AAAA,QACvB,MAAK,EAAE;AAAA,QACP,OAAM,EAAE;AAAA,MACZ,EAAE;AAAA,IACN,CAAC;AACD,aAAS,SAAS,KAAK,OAAK,EAAE,SAAS,IAAI;AAAA,EAC/C;AAEA,SAAO,EAAE,KAAI,OAAO,KAAK,MAAK,OAAO,KAAK;AAC9C;AAtCsB;",
4
+ "sourcesContent": ["import { existsSync, readdirSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { checkbox, Separator } from '@inquirer/prompts'\nimport { isSpecComplete } from './progress.js'\nimport { scanTickets, findReadyTickets } from './orchestrator.js'\n\nexport type FeatureSelection = {\n dir:string;\n spec:string;\n name:string;\n}\n\nexport function getScriptDir (metaUrl:string):string {\n return dirname(fileURLToPath(metaUrl))\n}\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)) continue\n const progressFile = join(\n scratchDir, entry.name, 'progress.md'\n )\n if (isSpecComplete(progressFile)) continue\n results.push({\n name:entry.name,\n dir:issuesDir,\n spec:specFile,\n })\n }\n results.sort((a, b) => a.name.localeCompare(b.name))\n return results\n}\n\nconst ALL_VALUE = '__all__'\n\nexport async function resolveIssuesDir (\n specName:string|undefined,\n cwd:string = process.cwd(),\n):Promise<FeatureSelection[]> {\n if (specName) {\n const featureDir = join(cwd, '.scratch', specName)\n return [{\n dir:join(featureDir, 'issues'),\n spec:join(featureDir, 'spec.md'),\n name:specName,\n }]\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 --spec <feature-name>.'\n )\n process.exit(2)\n }\n\n if (features.length === 1) {\n const f = features[0]\n console.log(`Using feature: ${f.name}`)\n return [{ dir:f.dir, spec:f.spec, name:f.name }]\n }\n\n const featureChoices = features.map(f => {\n const tickets = scanTickets(f.dir)\n const ready = findReadyTickets(tickets).length\n return {\n name:`${f.name} (${ready}/${tickets.length} ready)`,\n value:f.name,\n }\n })\n\n while (true) {\n const selected = await checkbox({\n message:'Which features?',\n choices:[\n { name:'All', value:ALL_VALUE },\n new Separator(),\n ...featureChoices,\n ],\n })\n\n if (selected.length === 0) {\n console.log('Select at least one feature')\n continue\n }\n\n const names = selected.includes(ALL_VALUE) ?\n features.map(f => f.name) :\n selected\n\n return names.map(name => {\n const f = features.find(\n ff => ff.name === name\n )!\n return { dir:f.dir, spec:f.spec, name:f.name }\n })\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,7 @@ export type TicketStatus = 'pending' | 'in-progress' | 'awaiting-merge' | 'done'
2
2
  export type DisplayTicket = {
3
3
  readonly num: number;
4
4
  readonly filename: string;
5
+ readonly feature?: string;
5
6
  status: TicketStatus;
6
7
  };
7
8
  export type WaveState = {
@@ -25,11 +26,13 @@ export type Display = {
25
26
  startWave(waveNum: number, totalWaves: number, tickets: ReadonlyArray<{
26
27
  num: number;
27
28
  filename: string;
29
+ feature?: string;
28
30
  }>, progress?: RunProgress, remaining?: ReadonlyArray<{
29
31
  num: number;
30
32
  filename: string;
33
+ feature?: string;
31
34
  }>): void;
32
- setTicketStatus(num: number, status: TicketStatus): void;
35
+ setTicketStatus(num: number, status: TicketStatus, feature?: string): void;
33
36
  log(message: string): void;
34
37
  cleanup(): void;
35
38
  };
@@ -76,11 +79,13 @@ export declare class StatusDisplay implements Display {
76
79
  startWave(waveNum: number, totalWaves: number, tickets: Array<Readonly<{
77
80
  num: number;
78
81
  filename: string;
82
+ feature?: string;
79
83
  }>>, progress?: RunProgress, remaining?: ReadonlyArray<{
80
84
  num: number;
81
85
  filename: string;
86
+ feature?: string;
82
87
  }>): void;
83
- setTicketStatus(num: number, status: TicketStatus): void;
88
+ setTicketStatus(num: number, status: TicketStatus, feature?: string): void;
84
89
  log(message: string): void;
85
90
  cleanup(): void;
86
91
  private render;
@@ -89,11 +94,13 @@ export declare class PlainDisplay implements Display {
89
94
  startWave(waveNum: number, _totalWaves: number, tickets: ReadonlyArray<{
90
95
  num: number;
91
96
  filename: string;
97
+ feature?: string;
92
98
  }>, progress?: RunProgress, _remaining?: ReadonlyArray<{
93
99
  num: number;
94
100
  filename: string;
101
+ feature?: string;
95
102
  }>): void;
96
- setTicketStatus(_num: number, _status: TicketStatus): void;
103
+ setTicketStatus(_num: number, _status: TicketStatus, _feature?: string): void;
97
104
  log(message: string): void;
98
105
  cleanup(): void;
99
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/display.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/display.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAClB,SAAS,GACT,aAAa,GACb,gBAAgB,GAChB,MAAM,GACN,QAAQ,CAAA;AAEd,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,GAAG,EAAC,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAC,MAAM,CAAA;IACxB,MAAM,EAAC,YAAY,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,CAAC,OAAO,EAAC,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAC,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAC,KAAK,CAAC,aAAa,CAAC,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,MAAM,EAAC,MAAM,CAAC,WAAW,CAAA;CACrC,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACtB,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAC,MAAM,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IAClB,SAAS,CACL,OAAO,EAAC,MAAM,EACd,UAAU,EAAC,MAAM,EACjB,OAAO,EAAC,aAAa,CAAC;QAClB,GAAG,EAAC,MAAM,CAAA;QACV,QAAQ,EAAC,MAAM,CAAA;QACf,OAAO,CAAC,EAAC,MAAM,CAAA;KAClB,CAAC,EACF,QAAQ,CAAC,EAAC,WAAW,EACrB,SAAS,CAAC,EAAC,aAAa,CAAC;QACrB,GAAG,EAAC,MAAM,CAAA;QACV,QAAQ,EAAC,MAAM,CAAA;QACf,OAAO,CAAC,EAAC,MAAM,CAAA;KAClB,CAAC,GACJ,IAAI,CAAA;IACN,eAAe,CACX,GAAG,EAAC,MAAM,EACV,MAAM,EAAC,YAAY,EACnB,OAAO,CAAC,EAAC,MAAM,GACjB,IAAI,CAAA;IACN,GAAG,CAAC,OAAO,EAAC,MAAM,GAAE,IAAI,CAAA;IACxB,OAAO,IAAG,IAAI,CAAA;CACjB,CAAA;AAID,eAAO,MAAM,IAAI;2BACD,MAAM,KAAE,MAAM;6BAGZ,MAAM,KAAE,MAAM;8BAGf,MAAM;6BAGL,MAAM,KAAE,MAAM;+BAQd,MAAM;+BAGN,MAAM;CAGd,CAAA;AAEV,eAAO,MAAM,KAAK;2BACF,MAAM,KAAE,MAAM;4BAGb,MAAM,KAAE,MAAM;yBAGjB,MAAM,KAAE,MAAM;0BAGb,MAAM,KAAE,MAAM;yBAGf,MAAM,KAAE,MAAM;CAGlB,CAAA;AAsBV;;;;GAIG;AACH,wBAAgB,OAAO,CAAE,IAAI,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,GAAE,MAAM,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAE,IAAI,EAAC,MAAM,EAAE,KAAK,EAAC,MAAM,GAAE,KAAK,CAAC,MAAM,CAAC,CAQjE;AAED,wBAAgB,SAAS,CAAE,MAAM,EAAC,YAAY,GAAE,MAAM,CAerD;AAED,qBAAa,aAAc,YAAW,OAAO;IACzC,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,cAAc,CAAyB;gBAElC,MAAM,CAAC,EAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAMrD,OAAO,CAAC,gBAAgB;IAOxB,SAAS,CACL,OAAO,EAAC,MAAM,EACd,UAAU,EAAC,MAAM,EACjB,OAAO,EAAC,KAAK,CAAC,QAAQ,CAAC;QACnB,GAAG,EAAC,MAAM,CAAA;QACV,QAAQ,EAAC,MAAM,CAAA;QACf,OAAO,CAAC,EAAC,MAAM,CAAA;KAClB,CAAC,CAAC,EACH,QAAQ,CAAC,EAAC,WAAW,EACrB,SAAS,CAAC,EAAC,aAAa,CAAC;QACrB,GAAG,EAAC,MAAM,CAAA;QACV,QAAQ,EAAC,MAAM,CAAA;QACf,OAAO,CAAC,EAAC,MAAM,CAAA;KAClB,CAAC,GACJ,IAAI;IAiCN,eAAe,CACX,GAAG,EAAC,MAAM,EACV,MAAM,EAAC,YAAY,EACnB,OAAO,CAAC,EAAC,MAAM,GACjB,IAAI;IAiCN,GAAG,CAAE,OAAO,EAAC,MAAM,GAAE,IAAI;IAkBzB,OAAO,IAAI,IAAI;IAQf,OAAO,CAAC,MAAM;CAyIjB;AAED,qBAAa,YAAa,YAAW,OAAO;IACxC,SAAS,CACL,OAAO,EAAC,MAAM,EACd,WAAW,EAAC,MAAM,EAClB,OAAO,EAAC,aAAa,CAAC;QAClB,GAAG,EAAC,MAAM,CAAA;QACV,QAAQ,EAAC,MAAM,CAAA;QACf,OAAO,CAAC,EAAC,MAAM,CAAA;KAClB,CAAC,EACF,QAAQ,CAAC,EAAC,WAAW,EACrB,UAAU,CAAC,EAAC,aAAa,CAAC;QACtB,GAAG,EAAC,MAAM,CAAA;QACV,QAAQ,EAAC,MAAM,CAAA;QACf,OAAO,CAAC,EAAC,MAAM,CAAA;KAClB,CAAC,GACJ,IAAI;IAUN,eAAe,CACX,IAAI,EAAC,MAAM,EACX,OAAO,EAAC,YAAY,EACpB,QAAQ,CAAC,EAAC,MAAM,GAClB,IAAI;IAIN,GAAG,CAAE,OAAO,EAAC,MAAM,GAAE,IAAI;IAIzB,OAAO,IAAI,IAAI;CAGlB;AAED,wBAAgB,aAAa,CAAE,MAAM,CAAC,EAAC,MAAM,CAAC,WAAW,GAAE,OAAO,CAOjE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAwBA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAgB,MAAM,cAAc,CAAA;AAG9E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAyBA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAgB,MAAM,cAAc,CAAA;AAG9E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAA"}
@@ -8,6 +8,7 @@ export type Ticket = {
8
8
  body: string;
9
9
  status: string;
10
10
  blockers: number[];
11
+ feature: string;
11
12
  };
12
13
  export declare function formatErrorMessage(error: unknown): string;
13
14
  export declare const TICKET_RE: RegExp;
@@ -17,13 +18,15 @@ export declare function parseTicketFilename(filename: string): {
17
18
  } | null;
18
19
  export declare function parseStatus(body: string): string;
19
20
  export declare function parseBlockers(body: string): number[];
20
- export declare function scanTickets(dir: string): Ticket[];
21
+ export declare function scanTickets(dir: string, feature?: string): Ticket[];
22
+ export declare function ticketKey(feature: string, num: number): string;
21
23
  export declare function findReadyTickets(tickets: ReadonlyArray<Ticket>): Ticket[];
22
24
  export declare const COMPLETED_RE: RegExp;
23
25
  export declare const TOOL_USE_RE: RegExp;
24
26
  export declare function checkItems(ticket: Ticket, completedItems: string[]): void;
25
27
  export declare function markDone(ticket: Ticket): void;
26
28
  export declare function stripSpecSection(specBody: string, heading: string): string;
29
+ export declare function lookupSpec(specBodies: Map<string, string> | undefined, fallback: string, feature: string): string;
27
30
  export declare function renderPrompt(specBody: string, ticket: Ticket, opts: {
28
31
  testCmd: string;
29
32
  }): string;
@@ -89,13 +92,14 @@ export declare const HUMAN_STATUS = "ready-for-human";
89
92
  * agent cannot finish them, so a run that exits with open
90
93
  * tickets never looks like it silently gave up.
91
94
  */
92
- export declare function renderFinishSummary(tickets: ReadonlyArray<Ticket>, totalCompleted: number, failedNums: ReadonlySet<number>): string;
95
+ export declare function renderFinishSummary(tickets: ReadonlyArray<Ticket>, totalCompleted: number, failedKeys: ReadonlySet<string>): string;
93
96
  export declare function runWaves(tickets: Ticket[], specBody: string, agentCmd: string, model: string | null, timeout: number, logsDir: string, testCmd: string, display?: Display, maxTurns?: number, effort?: EffortLevel, retries?: number, retryDelay?: number, concurrency?: number): Promise<{
94
97
  allDone: boolean;
95
98
  }>;
96
99
  export declare function runWavesIsolated(opts: {
97
100
  tickets: Array<Ticket>;
98
101
  specBody: string;
102
+ specBodies?: Map<string, string>;
99
103
  agentCmd: string;
100
104
  model: string | null;
101
105
  timeout: number;
@@ -109,6 +113,7 @@ export declare function runWavesIsolated(opts: {
109
113
  retries?: number;
110
114
  retryDelay?: number;
111
115
  concurrency?: number;
116
+ progressPaths?: Map<string, string>;
112
117
  }): Promise<{
113
118
  allDone: boolean;
114
119
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,18 @@ export type ProgressData = {
14
14
  tickets: Array<TicketProgress>;
15
15
  };
16
16
  export declare function generateProgress(feature: string, tickets: ReadonlyArray<Ticket>): ProgressData;
17
+ export declare function generateMultiFeatureProgress(tickets: ReadonlyArray<Ticket>): Map<string, ProgressData>;
18
+ export type ProgressTracker = {
19
+ dataFor: (feature: string) => ProgressData;
20
+ pathFor: (feature: string) => string;
21
+ };
22
+ export declare function createProgressTracker(opts: {
23
+ progressPaths: Map<string, string>;
24
+ dataMap: Map<string, ProgressData>;
25
+ fallbackPath: string;
26
+ fallbackData: ProgressData;
27
+ }): ProgressTracker;
28
+ export declare function isSpecComplete(progressPath: string): boolean;
17
29
  export declare function readProgress(progressPath: string): ProgressData | null;
18
30
  export declare function mergeProgress(fresh: ProgressData, existing: ProgressData | null): ProgressData;
19
31
  export declare function renderProgress(data: ProgressData): string;
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C,MAAM,MAAM,cAAc,GAAG;IACzB,GAAG,EAAC,MAAM,CAAA;IACV,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAC,MAAM,CAAA;IACf,IAAI,EAAC,OAAO,CAAA;IACZ,MAAM,EAAC,MAAM,GAAC,IAAI,CAAA;IAClB,QAAQ,EAAC,MAAM,GAAC,IAAI,CAAA;IACpB,WAAW,EAAC,MAAM,GAAC,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACvB,OAAO,EAAC,MAAM,CAAA;IACd,SAAS,EAAC,MAAM,CAAA;IAChB,OAAO,EAAC,KAAK,CAAC,cAAc,CAAC,CAAA;CAChC,CAAA;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,YAAY,CAcb;AAED,wBAAgB,YAAY,CACxB,YAAY,EAAC,MAAM,GACrB,YAAY,GAAC,IAAI,CAwDlB;AAED,wBAAgB,aAAa,CACzB,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAC,YAAY,GAAC,IAAI,GAC5B,YAAY,CAcb;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAC,YAAY,GAAE,MAAM,CAgCxD;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAC,YAAY,EACjB,SAAS,EAAC,MAAM,EAChB,MAAM,EAAC;IAAE,MAAM,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,IAAI,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1D,IAAI,CAYL;AAED,wBAAgB,aAAa,CACzB,YAAY,EAAC,MAAM,EACnB,IAAI,EAAC,YAAY,GACnB,IAAI,CAKL;AAED,wBAAsB,cAAc,CAChC,QAAQ,EAAC,MAAM,EACf,YAAY,EAAC,MAAM,EACnB,OAAO,EAAC,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAwBjB"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C,MAAM,MAAM,cAAc,GAAG;IACzB,GAAG,EAAC,MAAM,CAAA;IACV,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAC,MAAM,CAAA;IACf,IAAI,EAAC,OAAO,CAAA;IACZ,MAAM,EAAC,MAAM,GAAC,IAAI,CAAA;IAClB,QAAQ,EAAC,MAAM,GAAC,IAAI,CAAA;IACpB,WAAW,EAAC,MAAM,GAAC,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACvB,OAAO,EAAC,MAAM,CAAA;IACd,SAAS,EAAC,MAAM,CAAA;IAChB,OAAO,EAAC,KAAK,CAAC,cAAc,CAAC,CAAA;CAChC,CAAA;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,YAAY,CAcb;AAED,wBAAgB,4BAA4B,CACxC,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAa1B;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,OAAO,EAAC,CAAC,OAAO,EAAC,MAAM,KAAK,YAAY,CAAA;IACxC,OAAO,EAAC,CAAC,OAAO,EAAC,MAAM,KAAK,MAAM,CAAA;CACrC,CAAA;AAED,wBAAgB,qBAAqB,CAAE,IAAI,EAAC;IACxC,aAAa,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACjC,YAAY,EAAC,MAAM,CAAA;IACnB,YAAY,EAAC,YAAY,CAAA;CAC5B,GAAE,eAAe,CAWjB;AAED,wBAAgB,cAAc,CAC1B,YAAY,EAAC,MAAM,GACrB,OAAO,CAKR;AAED,wBAAgB,YAAY,CACxB,YAAY,EAAC,MAAM,GACrB,YAAY,GAAC,IAAI,CAwDlB;AAED,wBAAgB,aAAa,CACzB,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAC,YAAY,GAAC,IAAI,GAC5B,YAAY,CAcb;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAC,YAAY,GAAE,MAAM,CAgCxD;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAC,YAAY,EACjB,SAAS,EAAC,MAAM,EAChB,MAAM,EAAC;IAAE,MAAM,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,IAAI,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1D,IAAI,CAYL;AAED,wBAAgB,aAAa,CACzB,YAAY,EAAC,MAAM,EACnB,IAAI,EAAC,YAAY,GACnB,IAAI,CAKL;AAED,wBAAsB,cAAc,CAChC,QAAQ,EAAC,MAAM,EACf,YAAY,EAAC,MAAM,EACnB,OAAO,EAAC,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAwBjB"}
@@ -1,11 +1,13 @@
1
+ export type FeatureSelection = {
2
+ dir: string;
3
+ spec: string;
4
+ name: string;
5
+ };
1
6
  export declare function getScriptDir(metaUrl: string): string;
2
7
  export declare function findFeatureDirs(cwd: string): {
3
8
  name: string;
4
9
  dir: string;
5
10
  spec: string;
6
11
  }[];
7
- export declare function resolveIssuesDir(specName: string | undefined, cwd?: string): Promise<{
8
- dir: string;
9
- spec: string;
10
- }>;
12
+ export declare function resolveIssuesDir(specName: string | undefined, cwd?: string): Promise<FeatureSelection[]>;
11
13
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE;IACzC,IAAI,EAAC,MAAM,CAAC;IACZ,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAA;CACd,EAAE,CAwBF;AAED,wBAAsB,gBAAgB,CAClC,QAAQ,EAAC,MAAM,GAAC,SAAS,EACzB,GAAG,GAAC,MAAsB,GAC5B,OAAO,CAAC;IAAE,GAAG,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,MAAM,CAAA;CAAE,CAAC,CAmCrC"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAC;IACZ,IAAI,EAAC,MAAM,CAAC;CACf,CAAA;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE;IACzC,IAAI,EAAC,MAAM,CAAC;IACZ,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAA;CACd,EAAE,CA4BF;AAID,wBAAsB,gBAAgB,CAClC,QAAQ,EAAC,MAAM,GAAC,SAAS,EACzB,GAAG,GAAC,MAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6D5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/worktree.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC;AAkBD,wBAAgB,eAAe,CAC3B,QAAQ,EAAC,MAAM,EACf,MAAM,EAAC,MAAM,GACf,MAAM,CAGP;AAsED,wBAAgB,cAAc,CAC1B,IAAI,EAAC;IACD,QAAQ,EAAC,MAAM,CAAA;IACf,QAAQ,EAAC,MAAM,CAAA;IACf,UAAU,EAAC,MAAM,CAAA;IACjB,MAAM,EAAC,MAAM,CAAA;CAChB,GACH,OAAO,CAAC;IAAE,YAAY,EAAC,MAAM,CAAC;IAAC,UAAU,EAAC,MAAM,CAAA;CAAE,CAAC,CAIpD;AAeD,wBAAgB,cAAc,CAC1B,YAAY,EAAC,MAAM,EACnB,IAAI,CAAC,EAAC;IAAE,KAAK,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMd;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAC,MAAM,EACf,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,MAAM,GACf,OAAO,CAOR;AAED,wBAAgB,OAAO,CAAE,GAAG,EAAC,MAAM,GAAE,OAAO,CAO3C;AAED,wBAAsB,WAAW,CAC7B,GAAG,EAAC,MAAM,EACV,OAAO,CAAC,EAAC,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAsBjB;AAED,wBAAsB,aAAa,CAC/B,QAAQ,EAAC,MAAM,GACjB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAWvB"}
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/worktree.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC;AAkBD,wBAAgB,eAAe,CAC3B,QAAQ,EAAC,MAAM,EACf,MAAM,EAAC,MAAM,GACf,MAAM,CAMP;AAwED,wBAAgB,cAAc,CAC1B,IAAI,EAAC;IACD,QAAQ,EAAC,MAAM,CAAA;IACf,QAAQ,EAAC,MAAM,CAAA;IACf,UAAU,EAAC,MAAM,CAAA;IACjB,MAAM,EAAC,MAAM,CAAA;CAChB,GACH,OAAO,CAAC;IAAE,YAAY,EAAC,MAAM,CAAC;IAAC,UAAU,EAAC,MAAM,CAAA;CAAE,CAAC,CAIpD;AAeD,wBAAgB,cAAc,CAC1B,YAAY,EAAC,MAAM,EACnB,IAAI,CAAC,EAAC;IAAE,KAAK,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMd;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAC,MAAM,EACf,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,MAAM,GACf,OAAO,CAOR;AAED,wBAAgB,OAAO,CAAE,GAAG,EAAC,MAAM,GAAE,OAAO,CAO3C;AAED,wBAAsB,WAAW,CAC7B,GAAG,EAAC,MAAM,EACV,OAAO,CAAC,EAAC,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAsBjB;AAED,wBAAsB,aAAa,CAC/B,QAAQ,EAAC,MAAM,GACjB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAWvB"}
package/dist/worktree.js CHANGED
@@ -47,18 +47,19 @@ async function branchExists(repoRoot, branchName) {
47
47
  __name(branchExists, "branchExists");
48
48
  function buildBranchName(repoName, ticket) {
49
49
  const num = String(ticket.num).padStart(2, "0");
50
- return `${repoName}--${num}-${ticket.slug}`;
50
+ const prefix = ticket.feature ? `${ticket.feature}-` : "";
51
+ return `${repoName}--${prefix}${num}-${ticket.slug}`;
51
52
  }
52
53
  __name(buildBranchName, "buildBranchName");
53
54
  async function createWorktreeNow(opts) {
54
55
  const { repoRoot, repoName, baseBranch, ticket } = opts;
55
56
  const branchName = buildBranchName(repoName, ticket);
57
+ const num = String(ticket.num).padStart(2, "0");
58
+ const prefix = ticket.feature ? `${ticket.feature}-` : "";
56
59
  const worktreePath = join(
57
60
  repoRoot,
58
61
  "..",
59
- `${repoName}.${String(
60
- ticket.num
61
- ).padStart(2, "0")}-${ticket.slug}`
62
+ `${repoName}.${prefix}${num}-${ticket.slug}`
62
63
  );
63
64
  if (existsSync(worktreePath)) {
64
65
  try {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/worktree.ts"],
4
- "sourcesContent": ["import { execFile, execFileSync } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { basename, dirname, join, resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { Ticket } from './orchestrator.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport function getRepoRoot ():string {\n const stdout = execFileSync(\n 'git',\n ['rev-parse', '--show-toplevel'],\n { encoding:'utf8' }\n )\n return stdout.trim()\n}\n\nexport function getRepoName ():string {\n const commonDir = execFileSync(\n 'git',\n ['rev-parse', '--git-common-dir'],\n { encoding:'utf8' }\n ).trim()\n return basename(dirname(resolve(commonDir)))\n}\n\nexport function getCurrentBranch ():string {\n const stdout = execFileSync(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { encoding:'utf8' }\n )\n return stdout.trim()\n}\n\nasync function branchExists (\n repoRoot:string,\n branchName:string\n):Promise<boolean> {\n try {\n await execFileAsync(\n 'git',\n ['show-ref', '--verify', '--quiet', `refs/heads/${branchName}`],\n { cwd:repoRoot }\n )\n return true\n } catch {\n return false\n }\n}\n\nexport function buildBranchName (\n repoName:string,\n ticket:Ticket\n):string {\n const num = String(ticket.num).padStart(2, '0')\n return `${repoName}--${num}-${ticket.slug}`\n}\n\nasync function createWorktreeNow (\n opts:{\n repoRoot:string\n repoName:string\n baseBranch:string\n ticket:Ticket\n }\n):Promise<{ worktreePath:string; branchName:string }> {\n const { repoRoot, repoName, baseBranch, ticket } = opts\n const branchName = buildBranchName(repoName, ticket)\n const worktreePath = join(\n repoRoot,\n '..',\n `${repoName}.${String(\n ticket.num\n ).padStart(2, '0')}-${ticket.slug}`\n )\n\n if (existsSync(worktreePath)) {\n try {\n await execFileAsync(\n 'git',\n ['worktree', 'remove', '--force', worktreePath],\n { cwd:repoRoot }\n )\n } catch {\n // directory may not be a registered worktree anymore;\n // prune stale entries below and let worktree add fail\n // loudly if the path is still unusable\n }\n }\n\n try {\n await execFileAsync(\n 'git',\n ['worktree', 'prune'],\n { cwd:repoRoot }\n )\n } catch {\n // best-effort cleanup of stale worktree metadata\n }\n\n if (await branchExists(repoRoot, branchName)) {\n await execFileAsync(\n 'git',\n ['branch', '-D', branchName],\n { cwd:repoRoot }\n )\n }\n\n await execFileAsync(\n 'git',\n [\n 'worktree',\n 'add',\n '-b',\n branchName,\n worktreePath,\n baseBranch,\n ],\n { cwd:repoRoot }\n )\n\n return { worktreePath, branchName }\n}\n\nlet worktreeQueue:Promise<unknown> = Promise.resolve()\n\nexport function createWorktree (\n opts:{\n repoRoot:string\n repoName:string\n baseBranch:string\n ticket:Ticket\n }\n):Promise<{ worktreePath:string; branchName:string }> {\n const result = worktreeQueue.then(() => createWorktreeNow(opts))\n worktreeQueue = result.catch(() => {})\n return result\n}\n\nasync function removeWorktreeNow (\n worktreePath:string,\n opts?:{ force?:boolean }\n):Promise<void> {\n const args = [\n '-C', worktreePath,\n 'worktree', 'remove',\n ]\n if (opts?.force) args.push('--force')\n args.push(worktreePath)\n await execFileAsync('git', args)\n}\n\nexport function removeWorktree (\n worktreePath:string,\n opts?:{ force?:boolean }\n):Promise<void> {\n const result = worktreeQueue.then(\n () => removeWorktreeNow(worktreePath, opts)\n )\n worktreeQueue = result.catch(() => {})\n return result\n}\n\nexport function hasNewCommits (\n repoRoot:string,\n base:string,\n branch:string\n):boolean {\n const stdout = execFileSync(\n 'git',\n ['rev-list', '--count', `${base}..${branch}`],\n { cwd:repoRoot, encoding:'utf8' }\n )\n return Number(stdout.trim()) > 0\n}\n\nexport function isDirty (cwd:string):boolean {\n const stdout = execFileSync(\n 'git',\n ['status', '--porcelain'],\n { cwd, encoding:'utf8' }\n )\n return stdout.trim().length > 0\n}\n\nexport async function commitDirty (\n cwd:string,\n message?:string\n):Promise<boolean> {\n if (!isDirty(cwd)) return false\n await execFileAsync(\n 'git',\n ['add', '-A'],\n { cwd }\n )\n try {\n await execFileAsync(\n 'git',\n [\n 'commit', '-m',\n message ??\n 'nightralph: auto-commit ' +\n 'remaining changes',\n ],\n { cwd }\n )\n return true\n } catch {\n return false\n }\n}\n\nexport async function listWorktrees (\n repoRoot:string\n):Promise<Array<string>> {\n const { stdout } = await execFileAsync(\n 'git',\n ['worktree', 'list', '--porcelain'],\n { cwd:repoRoot }\n )\n return stdout\n .trim()\n .split('\\n')\n .filter(line => line.startsWith('worktree '))\n .map(line => line.substring('worktree '.length))\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { execFile, execFileSync } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { basename, dirname, join, resolve } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { Ticket } from './orchestrator.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport function getRepoRoot ():string {\n const stdout = execFileSync(\n 'git',\n ['rev-parse', '--show-toplevel'],\n { encoding:'utf8' }\n )\n return stdout.trim()\n}\n\nexport function getRepoName ():string {\n const commonDir = execFileSync(\n 'git',\n ['rev-parse', '--git-common-dir'],\n { encoding:'utf8' }\n ).trim()\n return basename(dirname(resolve(commonDir)))\n}\n\nexport function getCurrentBranch ():string {\n const stdout = execFileSync(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n { encoding:'utf8' }\n )\n return stdout.trim()\n}\n\nasync function branchExists (\n repoRoot:string,\n branchName:string\n):Promise<boolean> {\n try {\n await execFileAsync(\n 'git',\n ['show-ref', '--verify', '--quiet', `refs/heads/${branchName}`],\n { cwd:repoRoot }\n )\n return true\n } catch {\n return false\n }\n}\n\nexport function buildBranchName (\n repoName:string,\n ticket:Ticket\n):string {\n const num = String(ticket.num).padStart(2, '0')\n const prefix = ticket.feature ?\n `${ticket.feature}-` :\n ''\n return `${repoName}--${prefix}${num}-${ticket.slug}`\n}\n\nasync function createWorktreeNow (\n opts:{\n repoRoot:string\n repoName:string\n baseBranch:string\n ticket:Ticket\n }\n):Promise<{ worktreePath:string; branchName:string }> {\n const { repoRoot, repoName, baseBranch, ticket } = opts\n const branchName = buildBranchName(repoName, ticket)\n const num = String(ticket.num).padStart(2, '0')\n const prefix = ticket.feature ?\n `${ticket.feature}-` :\n ''\n const worktreePath = join(\n repoRoot,\n '..',\n `${repoName}.${prefix}${num}-${ticket.slug}`\n )\n\n if (existsSync(worktreePath)) {\n try {\n await execFileAsync(\n 'git',\n ['worktree', 'remove', '--force', worktreePath],\n { cwd:repoRoot }\n )\n } catch {\n // directory may not be a registered worktree anymore;\n // prune stale entries below and let worktree add fail\n // loudly if the path is still unusable\n }\n }\n\n try {\n await execFileAsync(\n 'git',\n ['worktree', 'prune'],\n { cwd:repoRoot }\n )\n } catch {\n // best-effort cleanup of stale worktree metadata\n }\n\n if (await branchExists(repoRoot, branchName)) {\n await execFileAsync(\n 'git',\n ['branch', '-D', branchName],\n { cwd:repoRoot }\n )\n }\n\n await execFileAsync(\n 'git',\n [\n 'worktree',\n 'add',\n '-b',\n branchName,\n worktreePath,\n baseBranch,\n ],\n { cwd:repoRoot }\n )\n\n return { worktreePath, branchName }\n}\n\nlet worktreeQueue:Promise<unknown> = Promise.resolve()\n\nexport function createWorktree (\n opts:{\n repoRoot:string\n repoName:string\n baseBranch:string\n ticket:Ticket\n }\n):Promise<{ worktreePath:string; branchName:string }> {\n const result = worktreeQueue.then(() => createWorktreeNow(opts))\n worktreeQueue = result.catch(() => {})\n return result\n}\n\nasync function removeWorktreeNow (\n worktreePath:string,\n opts?:{ force?:boolean }\n):Promise<void> {\n const args = [\n '-C', worktreePath,\n 'worktree', 'remove',\n ]\n if (opts?.force) args.push('--force')\n args.push(worktreePath)\n await execFileAsync('git', args)\n}\n\nexport function removeWorktree (\n worktreePath:string,\n opts?:{ force?:boolean }\n):Promise<void> {\n const result = worktreeQueue.then(\n () => removeWorktreeNow(worktreePath, opts)\n )\n worktreeQueue = result.catch(() => {})\n return result\n}\n\nexport function hasNewCommits (\n repoRoot:string,\n base:string,\n branch:string\n):boolean {\n const stdout = execFileSync(\n 'git',\n ['rev-list', '--count', `${base}..${branch}`],\n { cwd:repoRoot, encoding:'utf8' }\n )\n return Number(stdout.trim()) > 0\n}\n\nexport function isDirty (cwd:string):boolean {\n const stdout = execFileSync(\n 'git',\n ['status', '--porcelain'],\n { cwd, encoding:'utf8' }\n )\n return stdout.trim().length > 0\n}\n\nexport async function commitDirty (\n cwd:string,\n message?:string\n):Promise<boolean> {\n if (!isDirty(cwd)) return false\n await execFileAsync(\n 'git',\n ['add', '-A'],\n { cwd }\n )\n try {\n await execFileAsync(\n 'git',\n [\n 'commit', '-m',\n message ??\n 'nightralph: auto-commit ' +\n 'remaining changes',\n ],\n { cwd }\n )\n return true\n } catch {\n return false\n }\n}\n\nexport async function listWorktrees (\n repoRoot:string\n):Promise<Array<string>> {\n const { stdout } = await execFileAsync(\n 'git',\n ['worktree', 'list', '--porcelain'],\n { cwd:repoRoot }\n )\n return stdout\n .trim()\n .split('\\n')\n .filter(line => line.startsWith('worktree '))\n .map(line => line.substring('worktree '.length))\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nightralph",
3
- "version": "0.0.48",
3
+ "version": "0.0.52",
4
4
  "type": "module",
5
5
  "description": "Orchestrator that runs a single-agent session per issue.",
6
6
  "bin": {
@@ -25,7 +25,7 @@
25
25
  "version": "npm run toc && git add README.md",
26
26
  "postversion": "git push --follow-tags && npm publish",
27
27
  "demo": "npm run build && node test/demo-display.mjs",
28
- "test": "esbuild test/setup.test.ts test/orchestrator.test.ts test/worktree.test.ts test/progress.test.ts test/merge.test.ts test/display.test.ts test/testcmd.test.ts test/integration.test.ts --format=esm --bundle --packages=external --outdir=dist/test --sourcemap && node dist/test/setup.test.js && node dist/test/orchestrator.test.js && node dist/test/worktree.test.js && node dist/test/progress.test.js && node dist/test/merge.test.js && node dist/test/display.test.js && node dist/test/testcmd.test.js && node dist/test/integration.test.js"
28
+ "test": "esbuild test/setup.test.ts test/orchestrator.test.ts test/worktree.test.ts test/progress.test.ts test/merge.test.ts test/display.test.ts test/testcmd.test.ts test/resolve.test.ts test/integration.test.ts --format=esm --bundle --packages=external --outdir=dist/test --sourcemap && node dist/test/setup.test.js && node dist/test/orchestrator.test.js && node dist/test/worktree.test.js && node dist/test/progress.test.js && node dist/test/merge.test.js && node dist/test/display.test.js && node dist/test/testcmd.test.js && node dist/test/resolve.test.js && node dist/test/integration.test.js"
29
29
  },
30
30
  "dependencies": {
31
31
  "@inquirer/prompts": "^8.7.0",