@on-par/factory-cli 0.0.0-stage → 0.9.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -2
  3. package/dist/cli/admission.d.ts +17 -0
  4. package/dist/cli/admission.d.ts.map +1 -0
  5. package/dist/cli/admission.js +37 -0
  6. package/dist/cli/admission.js.map +1 -0
  7. package/dist/cli/branch-prefix.d.ts +8 -0
  8. package/dist/cli/branch-prefix.d.ts.map +1 -0
  9. package/dist/cli/branch-prefix.js +16 -0
  10. package/dist/cli/branch-prefix.js.map +1 -0
  11. package/dist/cli/classifier-backtest.d.ts +50 -0
  12. package/dist/cli/classifier-backtest.d.ts.map +1 -0
  13. package/dist/cli/classifier-backtest.js +112 -0
  14. package/dist/cli/classifier-backtest.js.map +1 -0
  15. package/dist/cli/cost-json.d.ts +37 -0
  16. package/dist/cli/cost-json.d.ts.map +1 -0
  17. package/dist/cli/cost-json.js +48 -0
  18. package/dist/cli/cost-json.js.map +1 -0
  19. package/dist/cli/daemon.d.ts +113 -0
  20. package/dist/cli/daemon.d.ts.map +1 -0
  21. package/dist/cli/daemon.js +282 -0
  22. package/dist/cli/daemon.js.map +1 -0
  23. package/dist/cli/doctor.d.ts +127 -0
  24. package/dist/cli/doctor.d.ts.map +1 -0
  25. package/dist/cli/doctor.js +400 -0
  26. package/dist/cli/doctor.js.map +1 -0
  27. package/dist/cli/feedback.d.ts +74 -0
  28. package/dist/cli/feedback.d.ts.map +1 -0
  29. package/dist/cli/feedback.js +180 -0
  30. package/dist/cli/feedback.js.map +1 -0
  31. package/dist/cli/filing.d.ts +22 -0
  32. package/dist/cli/filing.d.ts.map +1 -0
  33. package/dist/cli/filing.js +53 -0
  34. package/dist/cli/filing.js.map +1 -0
  35. package/dist/cli/first-run.d.ts +9 -0
  36. package/dist/cli/first-run.d.ts.map +1 -0
  37. package/dist/cli/first-run.js +34 -0
  38. package/dist/cli/first-run.js.map +1 -0
  39. package/dist/cli/help-groups.d.ts +17 -0
  40. package/dist/cli/help-groups.d.ts.map +1 -0
  41. package/dist/cli/help-groups.js +50 -0
  42. package/dist/cli/help-groups.js.map +1 -0
  43. package/dist/cli/hosted-queue.d.ts +45 -0
  44. package/dist/cli/hosted-queue.d.ts.map +1 -0
  45. package/dist/cli/hosted-queue.js +74 -0
  46. package/dist/cli/hosted-queue.js.map +1 -0
  47. package/dist/cli/hosted-runner.d.ts +44 -0
  48. package/dist/cli/hosted-runner.d.ts.map +1 -0
  49. package/dist/cli/hosted-runner.js +68 -0
  50. package/dist/cli/hosted-runner.js.map +1 -0
  51. package/dist/cli/hosted.d.ts +38 -0
  52. package/dist/cli/hosted.d.ts.map +1 -0
  53. package/dist/cli/hosted.js +82 -0
  54. package/dist/cli/hosted.js.map +1 -0
  55. package/dist/cli/index.d.ts +656 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +4801 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/init-files.d.ts +8 -0
  60. package/dist/cli/init-files.d.ts.map +1 -0
  61. package/dist/cli/init-files.js +45 -0
  62. package/dist/cli/init-files.js.map +1 -0
  63. package/dist/cli/logs.d.ts +27 -0
  64. package/dist/cli/logs.d.ts.map +1 -0
  65. package/dist/cli/logs.js +52 -0
  66. package/dist/cli/logs.js.map +1 -0
  67. package/dist/cli/merge-scope.d.ts +7 -0
  68. package/dist/cli/merge-scope.d.ts.map +1 -0
  69. package/dist/cli/merge-scope.js +14 -0
  70. package/dist/cli/merge-scope.js.map +1 -0
  71. package/dist/cli/octokit.d.ts +43 -0
  72. package/dist/cli/octokit.d.ts.map +1 -0
  73. package/dist/cli/octokit.js +87 -0
  74. package/dist/cli/octokit.js.map +1 -0
  75. package/dist/cli/queue-add-json.d.ts +25 -0
  76. package/dist/cli/queue-add-json.d.ts.map +1 -0
  77. package/dist/cli/queue-add-json.js +24 -0
  78. package/dist/cli/queue-add-json.js.map +1 -0
  79. package/dist/cli/queue-clear.d.ts +15 -0
  80. package/dist/cli/queue-clear.d.ts.map +1 -0
  81. package/dist/cli/queue-clear.js +58 -0
  82. package/dist/cli/queue-clear.js.map +1 -0
  83. package/dist/cli/queue-list.d.ts +24 -0
  84. package/dist/cli/queue-list.d.ts.map +1 -0
  85. package/dist/cli/queue-list.js +25 -0
  86. package/dist/cli/queue-list.js.map +1 -0
  87. package/dist/cli/ready-check.d.ts +98 -0
  88. package/dist/cli/ready-check.d.ts.map +1 -0
  89. package/dist/cli/ready-check.js +169 -0
  90. package/dist/cli/ready-check.js.map +1 -0
  91. package/dist/cli/reset.d.ts +40 -0
  92. package/dist/cli/reset.d.ts.map +1 -0
  93. package/dist/cli/reset.js +215 -0
  94. package/dist/cli/reset.js.map +1 -0
  95. package/dist/cli/run-children.d.ts +24 -0
  96. package/dist/cli/run-children.d.ts.map +1 -0
  97. package/dist/cli/run-children.js +73 -0
  98. package/dist/cli/run-children.js.map +1 -0
  99. package/dist/cli/run-flags.d.ts +14 -0
  100. package/dist/cli/run-flags.d.ts.map +1 -0
  101. package/dist/cli/run-flags.js +43 -0
  102. package/dist/cli/run-flags.js.map +1 -0
  103. package/dist/cli/runs-diffstat.d.ts +43 -0
  104. package/dist/cli/runs-diffstat.d.ts.map +1 -0
  105. package/dist/cli/runs-diffstat.js +91 -0
  106. package/dist/cli/runs-diffstat.js.map +1 -0
  107. package/dist/cli/runs.d.ts +36 -0
  108. package/dist/cli/runs.d.ts.map +1 -0
  109. package/dist/cli/runs.js +102 -0
  110. package/dist/cli/runs.js.map +1 -0
  111. package/dist/cli/staleness.d.ts +30 -0
  112. package/dist/cli/staleness.d.ts.map +1 -0
  113. package/dist/cli/staleness.js +132 -0
  114. package/dist/cli/staleness.js.map +1 -0
  115. package/dist/cli/status-json.d.ts +45 -0
  116. package/dist/cli/status-json.d.ts.map +1 -0
  117. package/dist/cli/status-json.js +22 -0
  118. package/dist/cli/status-json.js.map +1 -0
  119. package/dist/cli/stop-resume-json.d.ts +18 -0
  120. package/dist/cli/stop-resume-json.d.ts.map +1 -0
  121. package/dist/cli/stop-resume-json.js +10 -0
  122. package/dist/cli/stop-resume-json.js.map +1 -0
  123. package/dist/cli/stop-sentinel.d.ts +23 -0
  124. package/dist/cli/stop-sentinel.d.ts.map +1 -0
  125. package/dist/cli/stop-sentinel.js +61 -0
  126. package/dist/cli/stop-sentinel.js.map +1 -0
  127. package/dist/cli/sweep-heartbeat.d.ts +33 -0
  128. package/dist/cli/sweep-heartbeat.d.ts.map +1 -0
  129. package/dist/cli/sweep-heartbeat.js +65 -0
  130. package/dist/cli/sweep-heartbeat.js.map +1 -0
  131. package/dist/cli/unpark.d.ts +28 -0
  132. package/dist/cli/unpark.d.ts.map +1 -0
  133. package/dist/cli/unpark.js +68 -0
  134. package/dist/cli/unpark.js.map +1 -0
  135. package/dist/cli/usage-json.d.ts +20 -0
  136. package/dist/cli/usage-json.d.ts.map +1 -0
  137. package/dist/cli/usage-json.js +36 -0
  138. package/dist/cli/usage-json.js.map +1 -0
  139. package/dist/cli.d.ts +3 -0
  140. package/dist/cli.d.ts.map +1 -0
  141. package/dist/cli.js +6 -0
  142. package/dist/cli.js.map +1 -0
  143. package/dist/entry.d.ts +6 -0
  144. package/dist/entry.d.ts.map +1 -0
  145. package/dist/entry.js +13 -0
  146. package/dist/entry.js.map +1 -0
  147. package/package.json +48 -4
@@ -0,0 +1,169 @@
1
+ // packages/cli/src/cli/ready-check.ts — read-only `factory check <issue>` report (#1729)
2
+ import { findIssueDependencies, formatCostTotal, gradeIssueCriteria, gradeIssueInvest, scoreIssueReadiness, } from '@on-par/factory-core';
3
+ import { buildDecompositionPrompt, buildReadinessGapPrompt, parseDecompositionOutput, parseReadinessGapOutput, } from '@on-par/factory-core/internal';
4
+ /** Backs `--deep` with a router; captures the call's cost without writing costs.jsonl. */
5
+ export function createDeepModelRunner(router, worktree) {
6
+ let lastCost = null;
7
+ router.setCostSink((entry) => {
8
+ lastCost = entry.cost;
9
+ });
10
+ return async (task, prompt) => {
11
+ lastCost = null;
12
+ const r = await router.run(task, prompt, { worktree, timeoutSeconds: 600 });
13
+ return { model: r.model, output: r.output, cost: lastCost };
14
+ };
15
+ }
16
+ export class DeepCheckError extends Error {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = 'DeepCheckError';
20
+ }
21
+ }
22
+ export function buildIssueCheckReport(issue, readiness, criteria = null, invest = null) {
23
+ const wouldSplit = readiness.sizeOk === false;
24
+ const size = wouldSplit
25
+ ? { verdict: 'would-split', reason: readiness.sizeReason ?? 'too big' }
26
+ : { verdict: 'runs-as-is' };
27
+ const notReady = !readiness.pass || (criteria !== null && !criteria.pass);
28
+ const reasons = readiness.missing.map((field) => `missing: ${field}`);
29
+ reasons.push(...(criteria?.problems ?? []));
30
+ if (size.reason)
31
+ reasons.push(size.reason);
32
+ return {
33
+ issue,
34
+ template: readiness.template,
35
+ score: Math.round(readiness.score * 100),
36
+ fields: { pass: readiness.pass, missing: [...readiness.missing] },
37
+ criteria,
38
+ size,
39
+ invest,
40
+ reasons,
41
+ exitCode: notReady ? 1 : wouldSplit ? 3 : 0,
42
+ };
43
+ }
44
+ export function formatIssueCheckLines(report) {
45
+ const lines = [];
46
+ const state = report.exitCode === 1 ? 'is not factory-ready' : 'is factory-ready';
47
+ lines.push(`issue #${report.issue} ${state} (${report.template}, score ${report.score}%)`);
48
+ for (const field of report.fields.missing)
49
+ lines.push(` missing: ${field}`);
50
+ if (report.criteria) {
51
+ lines.push('criteria:');
52
+ for (const f of report.criteria.findings) {
53
+ lines.push(` ${f.index}. ${f.grade}${f.text ? ` — ${f.text}` : ''}${f.note ? ` (${f.note})` : ''}`);
54
+ }
55
+ for (const problem of report.criteria.problems) {
56
+ if (!/^criterion \d+ is empty$/.test(problem))
57
+ lines.push(` ${problem}`);
58
+ }
59
+ }
60
+ lines.push(report.size.verdict === 'would-split' ? `size: would split — ${report.size.reason}` : 'size: runs as-is');
61
+ if (report.invest) {
62
+ lines.push('invest:');
63
+ for (const f of report.invest.findings)
64
+ lines.push(` ${f.letter}: ${f.status} — ${f.reason}`);
65
+ }
66
+ return lines;
67
+ }
68
+ export function formatGapCriterion(c) {
69
+ return `${c.name} (When: ${c.when.join('; ')} — Then: ${c.then.join('; ')})`;
70
+ }
71
+ export async function runDeepCheck(input, runModel) {
72
+ const task = input.wouldSplit ? 'decompose' : 'triage';
73
+ const prompt = input.wouldSplit
74
+ ? buildDecompositionPrompt({ title: input.title, body: input.body })
75
+ : buildReadinessGapPrompt({ title: input.title, body: input.body });
76
+ let result;
77
+ try {
78
+ result = await runModel(task, prompt);
79
+ }
80
+ catch (err) {
81
+ throw new DeepCheckError(`model call failed: ${err instanceof Error ? err.message : String(err)}`);
82
+ }
83
+ const unpriced = result.cost === null;
84
+ if (input.wouldSplit) {
85
+ const parsed = parseDecompositionOutput(result.output);
86
+ if (!parsed.ok)
87
+ throw new DeepCheckError(`model returned invalid output: ${parsed.reason}`);
88
+ const children = parsed.decomposition.stories.map((s) => ({
89
+ title: s.title,
90
+ acceptanceCriteria: s.acceptanceCriteria.map(formatGapCriterion),
91
+ }));
92
+ return { kind: 'split', model: result.model, cost: result.cost, unpriced, children };
93
+ }
94
+ const parsed = parseReadinessGapOutput(result.output);
95
+ if (!parsed.ok)
96
+ throw new DeepCheckError(`model returned invalid output: ${parsed.reason}`);
97
+ return { kind: 'gaps', model: result.model, cost: result.cost, unpriced, gaps: parsed.gaps };
98
+ }
99
+ export function formatDeepCheckLines(deep) {
100
+ const lines = [];
101
+ if (deep.kind === 'split') {
102
+ lines.push(`deep: proposed split (preview only — nothing filed), ${deep.children.length} child stories`);
103
+ deep.children.forEach((child, i) => {
104
+ lines.push(` ${i + 1}. ${child.title}`);
105
+ for (const c of child.acceptanceCriteria)
106
+ lines.push(` - ${c}`);
107
+ });
108
+ }
109
+ else {
110
+ lines.push('deep: suggested missing criteria');
111
+ if (deep.gaps.missingCriteria.length === 0)
112
+ lines.push(' (none)');
113
+ for (const c of deep.gaps.missingCriteria)
114
+ lines.push(` - ${formatGapCriterion(c)}`);
115
+ const sections = [
116
+ ['unclear scope:', deep.gaps.unclearScope],
117
+ ['negotiable:', deep.gaps.negotiable],
118
+ ['estimable:', deep.gaps.estimable],
119
+ ];
120
+ for (const [label, items] of sections) {
121
+ if (items.length === 0)
122
+ continue;
123
+ lines.push(label);
124
+ for (const item of items)
125
+ lines.push(` - ${item}`);
126
+ }
127
+ }
128
+ lines.push(`model: ${deep.model}, cost: ${formatCostTotal(deep.cost, deep.unpriced ? 1 : 0)}`);
129
+ return lines;
130
+ }
131
+ export async function runIssueCheck(issue, opts, deps) {
132
+ const { title, body } = await deps.getIssue(issue);
133
+ const readiness = scoreIssueReadiness({ title, body: body ?? '' });
134
+ const criteria = readiness.template === 'factory-task' ? gradeIssueCriteria(body ?? '') : null;
135
+ let invest = null;
136
+ if (readiness.template === 'factory-task') {
137
+ const states = new Map();
138
+ await Promise.all(findIssueDependencies(body ?? '').map(async (n) => {
139
+ let state = 'unknown';
140
+ try {
141
+ if (deps.getIssueState)
142
+ state = await deps.getIssueState(n);
143
+ }
144
+ catch {
145
+ // a failed lookup is advisory only — leave the dependency 'unknown'
146
+ }
147
+ states.set(n, state);
148
+ }));
149
+ invest = gradeIssueInvest(body ?? '', states);
150
+ }
151
+ const report = buildIssueCheckReport(issue, readiness, criteria, invest);
152
+ if (opts.deep) {
153
+ if (!deps.runModel)
154
+ throw new DeepCheckError('no model runner configured');
155
+ report.deep = await runDeepCheck({ title, body: body ?? '', wouldSplit: report.size.verdict === 'would-split' }, deps.runModel);
156
+ }
157
+ if (opts.json) {
158
+ deps.log(JSON.stringify(report));
159
+ }
160
+ else {
161
+ for (const line of formatIssueCheckLines(report))
162
+ deps.log(line);
163
+ if (report.deep)
164
+ for (const line of formatDeepCheckLines(report.deep))
165
+ deps.log(line);
166
+ }
167
+ return report;
168
+ }
169
+ //# sourceMappingURL=ready-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ready-check.js","sourceRoot":"","sources":["../../src/cli/ready-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type PortLease } from '@on-par/factory-core';
2
+ export interface ResetDeps {
3
+ repoRoot: string;
4
+ /** process.cwd() in prod — the worktree containing it is never removed. */
5
+ cwd: string;
6
+ paths: {
7
+ plans: string;
8
+ runs: string;
9
+ logs: string;
10
+ reworkHistory: string;
11
+ laneFiles: string;
12
+ };
13
+ branchPrefix?: string;
14
+ /** Runs a shell command in repoRoot and returns stdout; throws on failure. */
15
+ git: (cmd: string) => Promise<string>;
16
+ removeWorktree: (path: string) => Promise<void>;
17
+ readLeases: () => PortLease[];
18
+ releaseLease: (worktreeId: string) => Promise<void>;
19
+ /** Runs a command (cwd defaults to repoRoot in prod); used for the read-only dirty/unpushed probes. */
20
+ runCommand: (cmd: string, opts?: {
21
+ cwd?: string;
22
+ }) => Promise<{
23
+ stdout: string;
24
+ }>;
25
+ /** Preview only: discover and report, never mutate. */
26
+ dryRun?: boolean;
27
+ /** Remove worktrees and branches even when dirty or unpushed (#1789). */
28
+ force?: boolean;
29
+ }
30
+ export interface ResetResult {
31
+ issue: number;
32
+ removed: string[];
33
+ kept: string[];
34
+ dryRun?: boolean;
35
+ }
36
+ export declare function parseResetIssues(raw: string[]): number[];
37
+ export declare function resetIssue(issue: number, deps: ResetDeps): Promise<ResetResult>;
38
+ export declare function formatResetLine(r: ResetResult): string;
39
+ export declare function runReset(issues: number[], deps: ResetDeps): Promise<string[]>;
40
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoC,KAAK,SAAS,EAAiB,MAAM,sBAAsB,CAAC;AAQvG,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,UAAU,EAAE,MAAM,SAAS,EAAE,CAAC;IAC9B,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,uGAAuG;IACvG,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClF,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQxD;AAeD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAmJrF;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAOtD;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAInF"}
@@ -0,0 +1,215 @@
1
+ // packages/cli/src/cli/reset.ts — `factory reset <issue...>`: remove an issue's local factory state (#1787);
2
+ // dirty/unpushed worktrees and branches are kept unless --force (#1789).
3
+ import { existsSync, rmSync } from 'node:fs';
4
+ import { join, resolve, sep } from 'node:path';
5
+ import { LaneFileGuard, phaseSnapshotFile, ReworkHistory } from '@on-par/factory-core';
6
+ import { countUnpushedCommits, factoryBranchIssue, isWorktreeClean, parseWorktreeList, } from '@on-par/factory-core/internal';
7
+ export function parseResetIssues(raw) {
8
+ const out = [];
9
+ for (const v of raw) {
10
+ if (!/^\d+$/.test(v) || Number(v) <= 0)
11
+ throw new Error(`factory reset: "${v}" is not an issue number`);
12
+ const n = Number(v);
13
+ if (!out.includes(n))
14
+ out.push(n);
15
+ }
16
+ return out;
17
+ }
18
+ const errText = (err) => (err instanceof Error ? err.message : String(err));
19
+ const shellQuote = (s) => `'${s.replace(/'/g, `'\\''`)}'`;
20
+ /** Why removing this worktree/branch would lose work, or null when it is safe (same probes as `worktree gc`). */
21
+ async function unsafeReason(deps, path, rev) {
22
+ if (path !== null && !(await isWorktreeClean(deps.runCommand, path)))
23
+ return 'uncommitted changes';
24
+ if (rev === null)
25
+ return 'could not verify it is pushed';
26
+ const n = await countUnpushedCommits(deps.runCommand, deps.repoRoot, rev);
27
+ if (n === null)
28
+ return 'could not verify it is pushed';
29
+ return n > 0 ? `${n} unpushed commit(s)` : null;
30
+ }
31
+ export async function resetIssue(issue, deps) {
32
+ const { paths, branchPrefix } = deps;
33
+ const dry = deps.dryRun === true;
34
+ const removed = [];
35
+ const kept = [];
36
+ const protectedBranches = new Map();
37
+ const removedWorktrees = new Set();
38
+ // 1. Worktrees
39
+ try {
40
+ const entries = parseWorktreeList(await deps.git('git worktree list --porcelain'));
41
+ for (const entry of entries) {
42
+ if (entry.branch === null || factoryBranchIssue(entry.branch, branchPrefix) !== issue)
43
+ continue;
44
+ const isMain = resolve(entry.path) === resolve(deps.repoRoot);
45
+ const hasCwd = deps.cwd === entry.path || deps.cwd.startsWith(entry.path + sep);
46
+ if (isMain || hasCwd) {
47
+ kept.push(`worktree ${entry.path} (current checkout)`);
48
+ protectedBranches.set(entry.branch, entry.path);
49
+ continue;
50
+ }
51
+ if (!deps.force) {
52
+ const why = await unsafeReason(deps, entry.path, entry.head ?? entry.branch);
53
+ if (why !== null) {
54
+ kept.push(`worktree ${entry.path} (${why}; pass --force to remove)`);
55
+ protectedBranches.set(entry.branch, entry.path);
56
+ continue;
57
+ }
58
+ }
59
+ try {
60
+ if (!dry)
61
+ await deps.removeWorktree(entry.path);
62
+ removed.push(`worktree ${entry.path}`);
63
+ removedWorktrees.add(entry.path);
64
+ }
65
+ catch (err) {
66
+ kept.push(`worktree ${entry.path} (${errText(err)})`);
67
+ protectedBranches.set(entry.branch, entry.path);
68
+ }
69
+ }
70
+ }
71
+ catch (err) {
72
+ kept.push(`worktrees (git worktree list failed: ${errText(err)})`);
73
+ }
74
+ // 2. Local branches
75
+ try {
76
+ const refs = await deps.git("git for-each-ref --format='%(refname:short)' refs/heads/");
77
+ const branches = refs
78
+ .split('\n')
79
+ .map((b) => b.trim())
80
+ .filter((b) => b && factoryBranchIssue(b, branchPrefix) === issue);
81
+ for (const b of branches) {
82
+ const where = protectedBranches.get(b);
83
+ if (where !== undefined) {
84
+ kept.push(`branch ${b} (checked out in ${where})`);
85
+ continue;
86
+ }
87
+ if (!deps.force) {
88
+ const why = await unsafeReason(deps, null, b);
89
+ if (why !== null) {
90
+ kept.push(`branch ${b} (${why}; pass --force to remove)`);
91
+ continue;
92
+ }
93
+ }
94
+ try {
95
+ if (!dry)
96
+ await deps.git(`git branch -D ${shellQuote(b)}`);
97
+ removed.push(`branch ${b}`);
98
+ }
99
+ catch (err) {
100
+ kept.push(`branch ${b} (${errText(err)})`);
101
+ }
102
+ }
103
+ }
104
+ catch (err) {
105
+ kept.push(`branches (${errText(err)})`);
106
+ }
107
+ // 3. Plan files
108
+ try {
109
+ let count = 0;
110
+ for (const ext of ['md', 'design.json', 'design.md', 'adr.json']) {
111
+ const file = join(paths.plans, `issue-${issue}.${ext}`);
112
+ if (!existsSync(file))
113
+ continue;
114
+ if (dry)
115
+ removed.push(`plan file ${file}`);
116
+ else
117
+ rmSync(file, { force: true });
118
+ count++;
119
+ }
120
+ if (!dry && count > 0)
121
+ removed.push(`plan files (${count})`);
122
+ }
123
+ catch (err) {
124
+ kept.push(`plan files (${errText(err)})`);
125
+ }
126
+ // 4. Phase file
127
+ try {
128
+ const file = phaseSnapshotFile(paths.runs, issue);
129
+ if (existsSync(file)) {
130
+ if (!dry)
131
+ rmSync(file, { force: true });
132
+ removed.push(dry ? `phase file ${file}` : 'phase file');
133
+ }
134
+ }
135
+ catch (err) {
136
+ kept.push(`phase file (${errText(err)})`);
137
+ }
138
+ // 5. Rework history
139
+ try {
140
+ const history = new ReworkHistory(paths.reworkHistory);
141
+ if (dry) {
142
+ if ((await history.priorSignature(issue)) !== undefined)
143
+ removed.push(`rework history entry #${issue}`);
144
+ }
145
+ else if (await history.clear(issue))
146
+ removed.push('rework history');
147
+ }
148
+ catch (err) {
149
+ kept.push(`rework history (${errText(err)})`);
150
+ }
151
+ // 6. Logs
152
+ try {
153
+ const dir = join(paths.logs, `issue-${issue}`);
154
+ if (existsSync(dir)) {
155
+ if (!dry)
156
+ rmSync(dir, { recursive: true, force: true });
157
+ removed.push(dry ? `logs ${dir}` : 'logs');
158
+ }
159
+ }
160
+ catch (err) {
161
+ kept.push(`logs (${errText(err)})`);
162
+ }
163
+ // 7. Lane-file claim
164
+ try {
165
+ const guard = new LaneFileGuard(paths.laneFiles);
166
+ if (dry) {
167
+ for (const c of await guard.claimsForIssue(issue))
168
+ removed.push(`lane-file claim ${c.repo}#${c.issue}`);
169
+ }
170
+ else if (await guard.releaseIssue(issue))
171
+ removed.push('lane-file claim');
172
+ }
173
+ catch (err) {
174
+ kept.push(`lane-file claim (${errText(err)})`);
175
+ }
176
+ // 8. Port leases — never for a kept worktree
177
+ try {
178
+ const keptPaths = new Set(protectedBranches.values());
179
+ for (const lease of deps.readLeases()) {
180
+ if (keptPaths.has(lease.worktreeId))
181
+ continue;
182
+ if (!removedWorktrees.has(lease.worktreeId) && factoryBranchIssue(lease.branch, branchPrefix) !== issue)
183
+ continue;
184
+ try {
185
+ if (!dry)
186
+ await deps.releaseLease(lease.worktreeId);
187
+ removed.push(`port lease ${lease.port}`);
188
+ }
189
+ catch (err) {
190
+ kept.push(`port lease ${lease.port} (${errText(err)})`);
191
+ }
192
+ }
193
+ }
194
+ catch (err) {
195
+ kept.push(`port leases (${errText(err)})`);
196
+ }
197
+ return { issue, removed, kept, ...(dry ? { dryRun: true } : {}) };
198
+ }
199
+ export function formatResetLine(r) {
200
+ if (r.dryRun) {
201
+ if (r.removed.length === 0 && r.kept.length === 0)
202
+ return `#${r.issue} (dry run): nothing to reset`;
203
+ return `#${r.issue} (dry run): would remove ${r.removed.join(', ') || 'nothing'}; would keep ${r.kept.join(', ') || 'nothing'}`;
204
+ }
205
+ if (r.removed.length === 0 && r.kept.length === 0)
206
+ return `#${r.issue}: nothing to reset`;
207
+ return `#${r.issue}: removed ${r.removed.join(', ') || 'nothing'}; kept ${r.kept.join(', ') || 'nothing'}`;
208
+ }
209
+ export async function runReset(issues, deps) {
210
+ const lines = [];
211
+ for (const issue of issues)
212
+ lines.push(formatResetLine(await resetIssue(issue, deps)));
213
+ return lines;
214
+ }
215
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** One decomposed child's outcome. `ready` means its PR is open and ready for review. */
2
+ export interface ChildRunResult {
3
+ issue: number;
4
+ status: 'ready' | 'failed' | 'not-run' | 'skipped' | 'decomposed';
5
+ prNumber?: number;
6
+ /** Failure detail for `failed`; the skip reason for `skipped`; why it did not start for `not-run`. */
7
+ detail?: string;
8
+ /** Child issues filed when this child was itself decomposed (`decomposed` only). */
9
+ children?: number[];
10
+ }
11
+ /** Runs children strictly one at a time in the given (build) order. A child that decomposes again
12
+ * is replaced in place by its fresh children, which run before the remaining siblings; issues in
13
+ * the seen set (`alreadySeen`, the initial children, anything already expanded) never run twice.
14
+ * A `skipped` or `failed` child does not stop the sequence: failures are recorded and the next
15
+ * child still runs. A `runChild` that throws is recorded as `failed` with the error message.
16
+ * `shouldStop` is consulted before each child starts; once it returns true that child and every
17
+ * later one are marked `not-run` and never run. A child already running is never interrupted. */
18
+ export declare function runChildrenInOrder(children: readonly number[], runChild: (issue: number) => Promise<ChildRunResult>, alreadySeen?: Iterable<number>, shouldStop?: (nextIssue: number) => boolean): Promise<ChildRunResult[]>;
19
+ /** True when every child that ran reached ready-for-review, was skipped as closed, or was
20
+ * replaced by its own children. */
21
+ export declare function childRunSucceeded(results: readonly ChildRunResult[]): boolean;
22
+ /** Renders the per-child summary lines; the caller colours and prints them. */
23
+ export declare function formatChildRunSummary(parent: number, results: readonly ChildRunResult[]): string[];
24
+ //# sourceMappingURL=run-children.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-children.d.ts","sourceRoot":"","sources":["../../src/cli/run-children.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAID;;;;;;kGAMkG;AAClG,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,EACpD,WAAW,GAAE,QAAQ,CAAC,MAAM,CAAM,EAClC,UAAU,GAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAqB,GACvD,OAAO,CAAC,cAAc,EAAE,CAAC,CA0B3B;AAED;oCACoC;AACpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,OAAO,CAE7E;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,EAAE,CAwBlG"}
@@ -0,0 +1,73 @@
1
+ // Sequencing and summary for `run-issue --run-children` (#1747, #1748).
2
+ const STOP_DETAIL = '.factory/STOP present';
3
+ /** Runs children strictly one at a time in the given (build) order. A child that decomposes again
4
+ * is replaced in place by its fresh children, which run before the remaining siblings; issues in
5
+ * the seen set (`alreadySeen`, the initial children, anything already expanded) never run twice.
6
+ * A `skipped` or `failed` child does not stop the sequence: failures are recorded and the next
7
+ * child still runs. A `runChild` that throws is recorded as `failed` with the error message.
8
+ * `shouldStop` is consulted before each child starts; once it returns true that child and every
9
+ * later one are marked `not-run` and never run. A child already running is never interrupted. */
10
+ export async function runChildrenInOrder(children, runChild, alreadySeen = [], shouldStop = () => false) {
11
+ const queue = [...children];
12
+ const seen = new Set([...alreadySeen, ...children]);
13
+ const results = [];
14
+ let stopped = false;
15
+ for (let i = 0; i < queue.length; i++) {
16
+ const issue = queue[i];
17
+ if (!stopped && shouldStop(issue))
18
+ stopped = true;
19
+ if (stopped) {
20
+ results.push({ issue, status: 'not-run', detail: STOP_DETAIL });
21
+ continue;
22
+ }
23
+ let result;
24
+ try {
25
+ result = await runChild(issue);
26
+ }
27
+ catch (err) {
28
+ result = { issue, status: 'failed', detail: err instanceof Error ? err.message : String(err) };
29
+ }
30
+ results.push(result);
31
+ if (result.status === 'decomposed') {
32
+ const fresh = (result.children ?? []).filter((n) => !seen.has(n));
33
+ for (const n of fresh)
34
+ seen.add(n);
35
+ queue.splice(i + 1, 0, ...fresh);
36
+ }
37
+ }
38
+ return results;
39
+ }
40
+ /** True when every child that ran reached ready-for-review, was skipped as closed, or was
41
+ * replaced by its own children. */
42
+ export function childRunSucceeded(results) {
43
+ return results.every((r) => r.status === 'ready' || r.status === 'skipped' || r.status === 'decomposed');
44
+ }
45
+ /** Renders the per-child summary lines; the caller colours and prints them. */
46
+ export function formatChildRunSummary(parent, results) {
47
+ const lines = [`Children of #${parent}:`];
48
+ for (const r of results) {
49
+ if (r.status === 'ready') {
50
+ lines.push(r.prNumber !== undefined
51
+ ? ` #${r.issue} → PR #${r.prNumber} ready for review`
52
+ : ` #${r.issue} → ready (no PR number)`);
53
+ }
54
+ else if (r.status === 'failed') {
55
+ lines.push(r.detail ? ` #${r.issue} → failed: ${r.detail}` : ` #${r.issue} → failed`);
56
+ }
57
+ else if (r.status === 'skipped') {
58
+ lines.push(r.detail ? ` #${r.issue} → skipped: ${r.detail}` : ` #${r.issue} → skipped`);
59
+ }
60
+ else if (r.status === 'decomposed') {
61
+ lines.push(` #${r.issue} → decomposed into ${(r.children ?? []).map((n) => `#${n}`).join(', ')}`);
62
+ }
63
+ else {
64
+ lines.push(r.detail ? ` #${r.issue} → not run: ${r.detail}` : ` #${r.issue} → not run`);
65
+ }
66
+ }
67
+ const leaf = results.filter((r) => r.status !== 'decomposed');
68
+ const ready = leaf.filter((r) => r.status === 'ready').length;
69
+ const skipped = leaf.filter((r) => r.status === 'skipped').length;
70
+ lines.push(`${ready}/${leaf.length} children ready for review${skipped > 0 ? `, ${skipped} skipped` : ''}`);
71
+ return lines;
72
+ }
73
+ //# sourceMappingURL=run-children.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-children.js","sourceRoot":"","sources":["../../src/cli/run-children.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Flags an operator supplied explicitly on this invocation. `undefined` = not supplied. */
2
+ export interface RunFlagOverrides {
3
+ autoMerge?: boolean;
4
+ /** `--pr-classifier` / `--no-pr-classifier` (#1724). */
5
+ prClassifier?: boolean;
6
+ }
7
+ /** Read the recorded overrides. Fails soft: a missing, unreadable, non-JSON, non-object,
8
+ * or wrongly-typed file reads as "no override" rather than throwing, so a corrupt state
9
+ * file can never break `factory status` or a run. */
10
+ export declare function readRunFlagOverrides(file: string): RunFlagOverrides;
11
+ /** Record the overrides for this invocation. Writing an all-`undefined` set removes the
12
+ * file, so a flag from an earlier run can never leak into a later flagless one. */
13
+ export declare function writeRunFlagOverrides(file: string, overrides: RunFlagOverrides): void;
14
+ //# sourceMappingURL=run-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-flags.d.ts","sourceRoot":"","sources":["../../src/cli/run-flags.ts"],"names":[],"mappings":"AAMA,4FAA4F;AAC5F,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;sDAEsD;AACtD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAcnE;AAED;oFACoF;AACpF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAUrF"}
@@ -0,0 +1,43 @@
1
+ // packages/cli/src/cli/run-flags.ts — per-invocation CLI flag overrides, recorded so a
2
+ // separate `factory status` process can attribute a run's policy to the flag (#1400).
3
+ import { existsSync, mkdirSync, rmSync, writeFileSync, readFileSync } from 'node:fs';
4
+ import { dirname } from 'node:path';
5
+ /** Read the recorded overrides. Fails soft: a missing, unreadable, non-JSON, non-object,
6
+ * or wrongly-typed file reads as "no override" rather than throwing, so a corrupt state
7
+ * file can never break `factory status` or a run. */
8
+ export function readRunFlagOverrides(file) {
9
+ if (!existsSync(file))
10
+ return {};
11
+ let raw;
12
+ try {
13
+ raw = JSON.parse(readFileSync(file, 'utf-8'));
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
19
+ return {};
20
+ const { autoMerge, prClassifier } = raw;
21
+ const overrides = {};
22
+ if (typeof autoMerge === 'boolean')
23
+ overrides.autoMerge = autoMerge;
24
+ if (typeof prClassifier === 'boolean')
25
+ overrides.prClassifier = prClassifier;
26
+ return overrides;
27
+ }
28
+ /** Record the overrides for this invocation. Writing an all-`undefined` set removes the
29
+ * file, so a flag from an earlier run can never leak into a later flagless one. */
30
+ export function writeRunFlagOverrides(file, overrides) {
31
+ const recorded = {};
32
+ if (overrides.autoMerge !== undefined)
33
+ recorded.autoMerge = overrides.autoMerge;
34
+ if (overrides.prClassifier !== undefined)
35
+ recorded.prClassifier = overrides.prClassifier;
36
+ if (Object.keys(recorded).length === 0) {
37
+ rmSync(file, { force: true });
38
+ return;
39
+ }
40
+ mkdirSync(dirname(file), { recursive: true });
41
+ writeFileSync(file, `${JSON.stringify(recorded, null, 2)}\n`);
42
+ }
43
+ //# sourceMappingURL=run-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-flags.js","sourceRoot":"","sources":["../../src/cli/run-flags.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,sFAAsF;AAEtF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC;;sDAEsD;AACtD,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7E,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,GAAsD,CAAC;IAC3F,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,IAAI,OAAO,SAAS,KAAK,SAAS;QAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;IACpE,IAAI,OAAO,YAAY,KAAK,SAAS;QAAE,SAAS,CAAC,YAAY,GAAG,YAAY,CAAC;IAC7E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;oFACoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAA2B;IAC7E,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;QAAE,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;IAChF,IAAI,SAAS,CAAC,YAAY,KAAK,SAAS;QAAE,QAAQ,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;IACzF,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}