@zhixuan92/multi-model-agent-core 5.0.3 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/events/plain-log-entry.d.ts +1 -1
- package/dist/events/plain-log-entry.d.ts.map +1 -1
- package/dist/events/plain-log-entry.js +5 -1
- package/dist/events/plain-log-entry.js.map +1 -1
- package/dist/events/wire-schema.d.ts +4 -4
- package/dist/lifecycle/derive-completion.d.ts +4 -0
- package/dist/lifecycle/derive-completion.d.ts.map +1 -1
- package/dist/lifecycle/derive-completion.js +14 -1
- package/dist/lifecycle/derive-completion.js.map +1 -1
- package/dist/lifecycle/git-exec.d.ts +62 -0
- package/dist/lifecycle/git-exec.d.ts.map +1 -0
- package/dist/lifecycle/git-exec.js +135 -0
- package/dist/lifecycle/git-exec.js.map +1 -0
- package/dist/lifecycle/goal-builder.d.ts +35 -0
- package/dist/lifecycle/goal-builder.d.ts.map +1 -0
- package/dist/lifecycle/goal-builder.js +56 -0
- package/dist/lifecycle/goal-builder.js.map +1 -0
- package/dist/lifecycle/goal-preconditions.d.ts +21 -0
- package/dist/lifecycle/goal-preconditions.d.ts.map +1 -0
- package/dist/lifecycle/goal-preconditions.js +33 -0
- package/dist/lifecycle/goal-preconditions.js.map +1 -0
- package/dist/lifecycle/goal-prompts.d.ts +27 -0
- package/dist/lifecycle/goal-prompts.d.ts.map +1 -0
- package/dist/lifecycle/goal-prompts.js +204 -0
- package/dist/lifecycle/goal-prompts.js.map +1 -0
- package/dist/lifecycle/goal-report.d.ts +42 -0
- package/dist/lifecycle/goal-report.d.ts.map +1 -0
- package/dist/lifecycle/goal-report.js +125 -0
- package/dist/lifecycle/goal-report.js.map +1 -0
- package/dist/lifecycle/handlers/annotate-stage.d.ts.map +1 -1
- package/dist/lifecycle/handlers/annotate-stage.js +27 -0
- package/dist/lifecycle/handlers/annotate-stage.js.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts +3 -3
- package/dist/lifecycle/handlers/prepare-execution-context-handler.d.ts.map +1 -1
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js +3 -25
- package/dist/lifecycle/handlers/prepare-execution-context-handler.js.map +1 -1
- package/dist/lifecycle/handlers/review-fix-stage.d.ts +9 -0
- package/dist/lifecycle/handlers/review-fix-stage.d.ts.map +1 -0
- package/dist/lifecycle/handlers/review-fix-stage.js +75 -0
- package/dist/lifecycle/handlers/review-fix-stage.js.map +1 -0
- package/dist/lifecycle/handlers/terminal-handlers.d.ts.map +1 -1
- package/dist/lifecycle/handlers/terminal-handlers.js +15 -3
- package/dist/lifecycle/handlers/terminal-handlers.js.map +1 -1
- package/dist/lifecycle/stage-io.d.ts +0 -23
- package/dist/lifecycle/stage-io.d.ts.map +1 -1
- package/dist/lifecycle/stage-io.js +0 -11
- package/dist/lifecycle/stage-io.js.map +1 -1
- package/dist/lifecycle/stage-plan-builder.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-builder.js +42 -49
- package/dist/lifecycle/stage-plan-builder.js.map +1 -1
- package/dist/lifecycle/stage-plan-types.d.ts +8 -8
- package/dist/lifecycle/stage-plan-types.d.ts.map +1 -1
- package/dist/lifecycle/stage-plan-types.js.map +1 -1
- package/dist/lifecycle/task-executor.d.ts.map +1 -1
- package/dist/lifecycle/task-executor.js +46 -1
- package/dist/lifecycle/task-executor.js.map +1 -1
- package/dist/lifecycle/task-runner.d.ts.map +1 -1
- package/dist/lifecycle/task-runner.js +3 -1
- package/dist/lifecycle/task-runner.js.map +1 -1
- package/dist/lifecycle/write-goal-lock.d.ts +29 -0
- package/dist/lifecycle/write-goal-lock.d.ts.map +1 -0
- package/dist/lifecycle/write-goal-lock.js +70 -0
- package/dist/lifecycle/write-goal-lock.js.map +1 -0
- package/dist/providers/claude-session.d.ts.map +1 -1
- package/dist/providers/claude-session.js +14 -0
- package/dist/providers/claude-session.js.map +1 -1
- package/dist/research/adapters/arxiv.d.ts.map +1 -1
- package/dist/research/adapters/arxiv.js +6 -1
- package/dist/research/adapters/arxiv.js.map +1 -1
- package/dist/tools/delegate/brief-slot.d.ts +14 -11
- package/dist/tools/delegate/brief-slot.d.ts.map +1 -1
- package/dist/tools/delegate/brief-slot.js +29 -53
- package/dist/tools/delegate/brief-slot.js.map +1 -1
- package/dist/tools/delegate/schema.d.ts +0 -4
- package/dist/tools/delegate/schema.d.ts.map +1 -1
- package/dist/tools/delegate/schema.js +3 -2
- package/dist/tools/delegate/schema.js.map +1 -1
- package/dist/tools/delegate/tool-config.d.ts.map +1 -1
- package/dist/tools/delegate/tool-config.js +20 -17
- package/dist/tools/delegate/tool-config.js.map +1 -1
- package/dist/tools/execute-plan/brief-slot.d.ts +11 -5
- package/dist/tools/execute-plan/brief-slot.d.ts.map +1 -1
- package/dist/tools/execute-plan/brief-slot.js +57 -13
- package/dist/tools/execute-plan/brief-slot.js.map +1 -1
- package/dist/tools/execute-plan/tool-config.d.ts.map +1 -1
- package/dist/tools/execute-plan/tool-config.js +18 -67
- package/dist/tools/execute-plan/tool-config.js.map +1 -1
- package/dist/tools/journal/record/brief-slot.d.ts +9 -6
- package/dist/tools/journal/record/brief-slot.d.ts.map +1 -1
- package/dist/tools/journal/record/brief-slot.js +18 -14
- package/dist/tools/journal/record/brief-slot.js.map +1 -1
- package/dist/tools/journal/record/tool-config.d.ts.map +1 -1
- package/dist/tools/journal/record/tool-config.js +18 -11
- package/dist/tools/journal/record/tool-config.js.map +1 -1
- package/dist/tools/retry/brief-slot.d.ts +1 -1
- package/dist/tools/retry/brief-slot.d.ts.map +1 -1
- package/dist/tools/retry/brief-slot.js +2 -1
- package/dist/tools/retry/brief-slot.js.map +1 -1
- package/dist/tools/retry/schema.d.ts +0 -1
- package/dist/tools/retry/schema.d.ts.map +1 -1
- package/dist/tools/retry/schema.js +6 -6
- package/dist/tools/retry/schema.js.map +1 -1
- package/dist/tools/retry/tool-config.d.ts.map +1 -1
- package/dist/tools/retry/tool-config.js +23 -28
- package/dist/tools/retry/tool-config.js.map +1 -1
- package/dist/types/goal.d.ts +47 -0
- package/dist/types/goal.d.ts.map +1 -0
- package/dist/types/goal.js +2 -0
- package/dist/types/goal.js.map +1 -0
- package/dist/types/task-spec.d.ts +11 -0
- package/dist/types/task-spec.d.ts.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/lifecycle/diff-tracker.d.ts +0 -88
- package/dist/lifecycle/diff-tracker.d.ts.map +0 -1
- package/dist/lifecycle/diff-tracker.js +0 -429
- package/dist/lifecycle/diff-tracker.js.map +0 -1
- package/dist/lifecycle/handlers/compose-commit-message.d.ts +0 -15
- package/dist/lifecycle/handlers/compose-commit-message.d.ts.map +0 -1
- package/dist/lifecycle/handlers/compose-commit-message.js +0 -227
- package/dist/lifecycle/handlers/compose-commit-message.js.map +0 -1
- package/dist/lifecycle/handlers/git-commit-handler.d.ts +0 -4
- package/dist/lifecycle/handlers/git-commit-handler.d.ts.map +0 -1
- package/dist/lifecycle/handlers/git-commit-handler.js +0 -202
- package/dist/lifecycle/handlers/git-commit-handler.js.map +0 -1
- package/dist/lifecycle/handlers/journal-review-prompt.d.ts +0 -7
- package/dist/lifecycle/handlers/journal-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/journal-review-prompt.js +0 -54
- package/dist/lifecycle/handlers/journal-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/parse-review-report.d.ts +0 -15
- package/dist/lifecycle/handlers/parse-review-report.d.ts.map +0 -1
- package/dist/lifecycle/handlers/parse-review-report.js +0 -40
- package/dist/lifecycle/handlers/parse-review-report.js.map +0 -1
- package/dist/lifecycle/handlers/quality-review-prompt.d.ts +0 -7
- package/dist/lifecycle/handlers/quality-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/quality-review-prompt.js +0 -50
- package/dist/lifecycle/handlers/quality-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/review-stage.d.ts +0 -4
- package/dist/lifecycle/handlers/review-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/review-stage.js +0 -277
- package/dist/lifecycle/handlers/review-stage.js.map +0 -1
- package/dist/lifecycle/handlers/rework-prompt.d.ts +0 -6
- package/dist/lifecycle/handlers/rework-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/rework-prompt.js +0 -18
- package/dist/lifecycle/handlers/rework-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/rework-stage.d.ts +0 -4
- package/dist/lifecycle/handlers/rework-stage.d.ts.map +0 -1
- package/dist/lifecycle/handlers/rework-stage.js +0 -191
- package/dist/lifecycle/handlers/rework-stage.js.map +0 -1
- package/dist/lifecycle/handlers/spec-review-prompt.d.ts +0 -8
- package/dist/lifecycle/handlers/spec-review-prompt.d.ts.map +0 -1
- package/dist/lifecycle/handlers/spec-review-prompt.js +0 -47
- package/dist/lifecycle/handlers/spec-review-prompt.js.map +0 -1
- package/dist/lifecycle/handlers/tier-policy.d.ts +0 -11
- package/dist/lifecycle/handlers/tier-policy.d.ts.map +0 -1
- package/dist/lifecycle/handlers/tier-policy.js +0 -12
- package/dist/lifecycle/handlers/tier-policy.js.map +0 -1
- package/dist/lifecycle/repo-commit-lock.d.ts +0 -20
- package/dist/lifecycle/repo-commit-lock.d.ts.map +0 -1
- package/dist/lifecycle/repo-commit-lock.js +0 -40
- package/dist/lifecycle/repo-commit-lock.js.map +0 -1
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { LifecycleState } from '../stage-plan-types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Deterministic commit-message composition per spec Fix A.
|
|
4
|
-
*
|
|
5
|
-
* Derives a conventional-commit message from:
|
|
6
|
-
* - Subject: execute-plan heading or delegate/retry prompt first line
|
|
7
|
-
* - Type: inferred from leading verb (feat/fix/chore)
|
|
8
|
-
* - Scope: most-common first-segment-after-src/ from filesChanged, omitted if tied or zero
|
|
9
|
-
* - (Task N) trailer: execute-plan only, when present in heading
|
|
10
|
-
* - Body: worker summary, only when summaryTrustworthy === true
|
|
11
|
-
* - Plan footer: execute-plan only
|
|
12
|
-
* - Rework annotation: preserved when review.verdict === 'changes_required' and unaddressedFindingIds non-empty
|
|
13
|
-
*/
|
|
14
|
-
export declare function composeCommitMessage(state: LifecycleState, filesChanged: string[], cwd: string): string;
|
|
15
|
-
//# sourceMappingURL=compose-commit-message.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compose-commit-message.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/compose-commit-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,GAAG,EAAE,MAAM,GACV,MAAM,CA4GR"}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { currentWork } from '../stage-io.js';
|
|
2
|
-
/**
|
|
3
|
-
* Deterministic commit-message composition per spec Fix A.
|
|
4
|
-
*
|
|
5
|
-
* Derives a conventional-commit message from:
|
|
6
|
-
* - Subject: execute-plan heading or delegate/retry prompt first line
|
|
7
|
-
* - Type: inferred from leading verb (feat/fix/chore)
|
|
8
|
-
* - Scope: most-common first-segment-after-src/ from filesChanged, omitted if tied or zero
|
|
9
|
-
* - (Task N) trailer: execute-plan only, when present in heading
|
|
10
|
-
* - Body: worker summary, only when summaryTrustworthy === true
|
|
11
|
-
* - Plan footer: execute-plan only
|
|
12
|
-
* - Rework annotation: preserved when review.verdict === 'changes_required' and unaddressedFindingIds non-empty
|
|
13
|
-
*/
|
|
14
|
-
export function composeCommitMessage(state, filesChanged, cwd) {
|
|
15
|
-
const work = state.gates ? currentWork(state) : null;
|
|
16
|
-
const route = state.route;
|
|
17
|
-
const isExecutePlan = route === 'execute-plan';
|
|
18
|
-
const task = state.task;
|
|
19
|
-
// ─── Step 1: Extract source text (heading or prompt) ───────────────────
|
|
20
|
-
let sourceText = '';
|
|
21
|
-
let taskNumber = null;
|
|
22
|
-
// taskDescriptor is the clean subject source for ANY write route (it carries
|
|
23
|
-
// the raw task intent — plan heading for execute-plan, the caller's task text
|
|
24
|
-
// for delegate, the learning for journal-record). Falling back to task.prompt
|
|
25
|
-
// is wrong for routes whose prompt is a COMPILED prompt led by orientation
|
|
26
|
-
// boilerplate (delegate/retry/journal-record), so prefer taskDescriptor first.
|
|
27
|
-
if (task?.taskDescriptor) {
|
|
28
|
-
sourceText = task.taskDescriptor;
|
|
29
|
-
// Extract Task N if present (only execute-plan headings carry it; the
|
|
30
|
-
// trailer below is still execute-plan-gated regardless).
|
|
31
|
-
const taskMatch = sourceText.match(/Task\s+(\d+)/i);
|
|
32
|
-
if (taskMatch) {
|
|
33
|
-
taskNumber = taskMatch[1];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
else if (task?.prompt) {
|
|
37
|
-
sourceText = task.prompt;
|
|
38
|
-
}
|
|
39
|
-
// ─── Step 2: Resolve to first usable line ────────────────────────────
|
|
40
|
-
const subjectLine = resolveSubjectLine(sourceText);
|
|
41
|
-
const isUsingFallback = subjectLine === 'feat: update requested files';
|
|
42
|
-
// ─── Early return if using fallback (no scope/trailer recomposition) ──
|
|
43
|
-
if (isUsingFallback) {
|
|
44
|
-
// Body and annotation are not included in fallback case
|
|
45
|
-
return subjectLine;
|
|
46
|
-
}
|
|
47
|
-
// ─── Step 3: Clean and normalize subject ─────────────────────────────
|
|
48
|
-
let cleanSubject = cleanSubjectText(subjectLine);
|
|
49
|
-
// ─── Step 4: Infer type from leading verb ────────────────────────────
|
|
50
|
-
const type = inferType(cleanSubject);
|
|
51
|
-
// ─── Step 5: Derive scope from filesChanged ──────────────────────────
|
|
52
|
-
const scope = deriveScope(filesChanged, cwd);
|
|
53
|
-
// ─── Step 6: Build subject line (type, scope, subject) ──────────────
|
|
54
|
-
let subjectLine_ = scope ? `${type}(${scope}): ${cleanSubject}` : `${type}: ${cleanSubject}`;
|
|
55
|
-
// Add (Task N) trailer if execute-plan and present in heading
|
|
56
|
-
if (isExecutePlan && taskNumber) {
|
|
57
|
-
subjectLine_ += ` (Task ${taskNumber})`;
|
|
58
|
-
}
|
|
59
|
-
// Trim to 72 chars
|
|
60
|
-
if (subjectLine_.length > 72) {
|
|
61
|
-
subjectLine_ = subjectLine_.slice(0, 72);
|
|
62
|
-
}
|
|
63
|
-
// ─── Step 7: Build body (summary only when trustworthy) ──────────────
|
|
64
|
-
let body = '';
|
|
65
|
-
if (work && work.summary && work.summaryTrustworthy === true) {
|
|
66
|
-
body = work.summary;
|
|
67
|
-
}
|
|
68
|
-
// ─── Step 8: Build footer (Plan: basename for execute-plan only) ────
|
|
69
|
-
let footer = '';
|
|
70
|
-
if (isExecutePlan && task?.planBasename) {
|
|
71
|
-
footer = `Plan: ${task.planBasename}`;
|
|
72
|
-
}
|
|
73
|
-
// ─── Step 9: Rework annotation (preserve when applicable) ────────────
|
|
74
|
-
let annotation = '';
|
|
75
|
-
const reviewGate = state.gates?.['review'];
|
|
76
|
-
const reviewVerdict = reviewGate?.payload?.verdict;
|
|
77
|
-
const unaddressed = work?.unaddressedFindingIds ?? [];
|
|
78
|
-
if (reviewVerdict === 'changes_required' && unaddressed.length > 0) {
|
|
79
|
-
annotation = `Rework left ${unaddressed.length} findings unaddressed: ${unaddressed.join(', ')}.`;
|
|
80
|
-
}
|
|
81
|
-
// ─── Step 10: Assemble message ──────────────────────────────────────
|
|
82
|
-
let message = subjectLine_;
|
|
83
|
-
if (body) {
|
|
84
|
-
message += `\n\n${body}`;
|
|
85
|
-
}
|
|
86
|
-
if (annotation) {
|
|
87
|
-
message += `\n\n${annotation}`;
|
|
88
|
-
}
|
|
89
|
-
if (footer) {
|
|
90
|
-
message += `\n\n${footer}`;
|
|
91
|
-
}
|
|
92
|
-
return message;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Resolve to first usable line.
|
|
96
|
-
* Usable = after stripping Task N: / # / ## / >, contains [A-Za-z].
|
|
97
|
-
* Falls through: source → first usable after skipping empty/quote → "feat: update requested files".
|
|
98
|
-
*/
|
|
99
|
-
function resolveSubjectLine(sourceText) {
|
|
100
|
-
if (!sourceText) {
|
|
101
|
-
return 'feat: update requested files';
|
|
102
|
-
}
|
|
103
|
-
const lines = sourceText.split('\n');
|
|
104
|
-
for (let i = 0; i < lines.length; i++) {
|
|
105
|
-
const line = lines[i].trim();
|
|
106
|
-
// Skip empty
|
|
107
|
-
if (!line)
|
|
108
|
-
continue;
|
|
109
|
-
// Check if this line is usable
|
|
110
|
-
const usable = isUsable(line);
|
|
111
|
-
if (usable) {
|
|
112
|
-
return line;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// No usable line found
|
|
116
|
-
return 'feat: update requested files';
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* A line is usable if, after stripping Task N: / # / ## / >, it contains [A-Za-z].
|
|
120
|
-
*/
|
|
121
|
-
function isUsable(line) {
|
|
122
|
-
let cleaned = line;
|
|
123
|
-
// Strip leading markdown/task markers
|
|
124
|
-
cleaned = cleaned.replace(/^#+\s*/, ''); // Strip # and ##
|
|
125
|
-
cleaned = cleaned.replace(/^>\s*/, ''); // Strip >
|
|
126
|
-
cleaned = cleaned.replace(/^Task\s+\d+:\s*/i, ''); // Strip Task N:
|
|
127
|
-
cleaned = cleaned.trim();
|
|
128
|
-
// Check for at least one letter
|
|
129
|
-
return /[A-Za-z]/.test(cleaned);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Clean subject text:
|
|
133
|
-
* - Strip Task N: / # / ## / > markers
|
|
134
|
-
* - Lowercase first letter
|
|
135
|
-
* - Return trimmed result
|
|
136
|
-
*/
|
|
137
|
-
function cleanSubjectText(line) {
|
|
138
|
-
let cleaned = line;
|
|
139
|
-
// Strip leading markers
|
|
140
|
-
cleaned = cleaned.replace(/^#+\s*/, '');
|
|
141
|
-
cleaned = cleaned.replace(/^>\s*/, '');
|
|
142
|
-
cleaned = cleaned.replace(/^Task\s+\d+:\s*/i, '');
|
|
143
|
-
cleaned = cleaned.trim();
|
|
144
|
-
// Lowercase first letter
|
|
145
|
-
if (cleaned.length > 0) {
|
|
146
|
-
cleaned = cleaned[0].toLowerCase() + cleaned.slice(1);
|
|
147
|
-
}
|
|
148
|
-
return cleaned;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Infer type from leading verb.
|
|
152
|
-
* - add/implement/create → feat
|
|
153
|
-
* - fix/correct/repair → fix
|
|
154
|
-
* - remove/delete/drop → chore
|
|
155
|
-
* - else → feat
|
|
156
|
-
*/
|
|
157
|
-
function inferType(subject) {
|
|
158
|
-
const firstWord = subject.split(/\s+/)[0].toLowerCase();
|
|
159
|
-
if (/^(add|implement|create)/.test(firstWord)) {
|
|
160
|
-
return 'feat';
|
|
161
|
-
}
|
|
162
|
-
if (/^(fix|correct|repair)/.test(firstWord)) {
|
|
163
|
-
return 'fix';
|
|
164
|
-
}
|
|
165
|
-
if (/^(remove|delete|drop)/.test(firstWord)) {
|
|
166
|
-
return 'chore';
|
|
167
|
-
}
|
|
168
|
-
return 'feat';
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Derive scope from filesChanged.
|
|
172
|
-
* - Consider only paths that contain a "src/" directory segment
|
|
173
|
-
* - For each match, take first segment after src/ (e.g., packages/core/src/lifecycle/… → lifecycle)
|
|
174
|
-
* - Pick most common segment
|
|
175
|
-
* - Omit scope if zero matches, or if top scopes are tied
|
|
176
|
-
* - Return scope string or empty string
|
|
177
|
-
*/
|
|
178
|
-
function deriveScope(filesChanged, cwd) {
|
|
179
|
-
// Find all segments (first after src/)
|
|
180
|
-
const segments = [];
|
|
181
|
-
for (const file of filesChanged) {
|
|
182
|
-
// Resolve to relative path if absolute
|
|
183
|
-
const rel = file.startsWith('/') ? file : `${cwd}/${file}`;
|
|
184
|
-
// Check if path matches */src/*
|
|
185
|
-
if (!rel.includes('/src/')) {
|
|
186
|
-
continue;
|
|
187
|
-
}
|
|
188
|
-
// Extract segment: text after /src/ and before next /
|
|
189
|
-
const srcIdx = rel.indexOf('/src/');
|
|
190
|
-
const afterSrc = rel.slice(srcIdx + 5); // +5 to skip '/src/'
|
|
191
|
-
const segment = afterSrc.split('/')[0];
|
|
192
|
-
if (segment) {
|
|
193
|
-
segments.push(segment);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
// No matching paths
|
|
197
|
-
if (segments.length === 0) {
|
|
198
|
-
return '';
|
|
199
|
-
}
|
|
200
|
-
// Count occurrences
|
|
201
|
-
const counts = new Map();
|
|
202
|
-
for (const seg of segments) {
|
|
203
|
-
counts.set(seg, (counts.get(seg) ?? 0) + 1);
|
|
204
|
-
}
|
|
205
|
-
// Find max count
|
|
206
|
-
let maxCount = 0;
|
|
207
|
-
for (const count of counts.values()) {
|
|
208
|
-
if (count > maxCount) {
|
|
209
|
-
maxCount = count;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
// Count how many have max count (check for tie)
|
|
213
|
-
let tiedCount = 0;
|
|
214
|
-
let topSegment = '';
|
|
215
|
-
for (const [seg, count] of counts.entries()) {
|
|
216
|
-
if (count === maxCount) {
|
|
217
|
-
tiedCount++;
|
|
218
|
-
topSegment = seg;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
// Omit scope if tied
|
|
222
|
-
if (tiedCount > 1) {
|
|
223
|
-
return '';
|
|
224
|
-
}
|
|
225
|
-
return topSegment;
|
|
226
|
-
}
|
|
227
|
-
//# sourceMappingURL=compose-commit-message.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compose-commit-message.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/compose-commit-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAqB,EACrB,YAAsB,EACtB,GAAW;IAEX,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,MAAM,KAAK,GAAG,KAAK,CAAC,KAA2B,CAAC;IAChD,MAAM,aAAa,GAAG,KAAK,KAAK,cAAc,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuF,CAAC;IAE3G,0EAA0E;IAE1E,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,6EAA6E;IAC7E,8EAA8E;IAC9E,8EAA8E;IAC9E,2EAA2E;IAC3E,+EAA+E;IAC/E,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC;QACjC,sEAAsE;QACtE,yDAAyD;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACpD,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACxB,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,wEAAwE;IAExE,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,WAAW,KAAK,8BAA8B,CAAC;IAEvE,yEAAyE;IAEzE,IAAI,eAAe,EAAE,CAAC;QACpB,wDAAwD;QACxD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,wEAAwE;IAExE,IAAI,YAAY,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAEjD,wEAAwE;IAExE,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IAErC,wEAAwE;IAExE,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAE7C,uEAAuE;IAEvE,IAAI,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,MAAM,YAAY,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,YAAY,EAAE,CAAC;IAE7F,8DAA8D;IAC9D,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;QAChC,YAAY,IAAI,UAAU,UAAU,GAAG,CAAC;IAC1C,CAAC;IAED,mBAAmB;IACnB,IAAI,YAAY,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC7B,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,wEAAwE;IAExE,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAC7D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,uEAAuE;IAEvE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,aAAa,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;QACxC,MAAM,GAAG,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAED,wEAAwE;IAExE,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAmD,CAAC;IAC7F,MAAM,aAAa,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC;IACnD,MAAM,WAAW,GAAI,IAAY,EAAE,qBAAqB,IAAI,EAAE,CAAC;IAE/D,IAAI,aAAa,KAAK,kBAAkB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,UAAU,GAAG,eAAe,WAAW,CAAC,MAAM,0BAA0B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACpG,CAAC;IAED,uEAAuE;IAEvE,IAAI,OAAO,GAAG,YAAY,CAAC;IAE3B,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,OAAO,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,OAAO,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,OAAO,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,8BAA8B,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7B,aAAa;QACb,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,+BAA+B;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,8BAA8B,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,sCAAsC;IACtC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB;IAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU;IAClD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB;IACnE,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzB,gCAAgC;IAChC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,wBAAwB;IACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzB,yBAAyB;IACzB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAExD,IAAI,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,WAAW,CAAC,YAAsB,EAAE,GAAW;IACtD,uCAAuC;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,uCAAuC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAE3D,gCAAgC;QAChC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,sDAAsD;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvC,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,iBAAiB;IACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,SAAS,EAAE,CAAC;YACZ,UAAU,GAAG,GAAG,CAAC;QACnB,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { LifecycleState } from '../stage-plan-types.js';
|
|
2
|
-
import type { StageGate, CommitPayload } from '../stage-io.js';
|
|
3
|
-
export declare function commitHandler(state: LifecycleState): Promise<StageGate<CommitPayload>>;
|
|
4
|
-
//# sourceMappingURL=git-commit-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-commit-handler.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/git-commit-handler.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA8G/D,wBAAsB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CA4F5F"}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
// Stage I/O standardization — commitHandler emits StageGate<CommitPayload>.
|
|
2
|
-
//
|
|
3
|
-
// Gate logic per the spec:
|
|
4
|
-
// no_repo, no_diff, validation_failed, validation_stale, hook_failed
|
|
5
|
-
//
|
|
6
|
-
// The spec (Step 13) supersedes the v4.4.x behavior:
|
|
7
|
-
// - Returns StageGate<CommitPayload> (tagged union { committed | no_op })
|
|
8
|
-
// - Detached HEAD maps to kind: 'no_op', reason: 'no_repo'
|
|
9
|
-
// - Commit message includes 'rework left N findings unaddressed' annotation
|
|
10
|
-
// when applicable
|
|
11
|
-
// - Does NOT mutate state.lastRunResult or state.commits (those are retired from active use).
|
|
12
|
-
// - Downstream consumers (annotate-parser, annotate-prompts, seal handler) read state.gates.commit.payload.kind
|
|
13
|
-
// directly via deriveCompletion() — the legacy state.commits[] mirror is dead.
|
|
14
|
-
import { execFile } from 'node:child_process';
|
|
15
|
-
import { promisify } from 'node:util';
|
|
16
|
-
import { isAbsolute, join, relative } from 'node:path';
|
|
17
|
-
import { existsSync } from 'node:fs';
|
|
18
|
-
import { withRepoCommitLock } from '../repo-commit-lock.js';
|
|
19
|
-
import { resolveGitToplevel } from '../git-toplevel.js';
|
|
20
|
-
import { composeCommitMessage } from './compose-commit-message.js';
|
|
21
|
-
const execFileP = promisify(execFile);
|
|
22
|
-
/**
|
|
23
|
-
* The files THIS worker actually wrote, resolved to absolute paths inside cwd.
|
|
24
|
-
*
|
|
25
|
-
* Source is the harness-tracked tool writes (lastRunResult.filesWritten — unioned
|
|
26
|
-
* across implement+rework by replaceLastRunResultPreservingTrackers), NOT a
|
|
27
|
-
* repo-wide `git diff`. Under concurrency (multiple workers in the same repo at
|
|
28
|
-
* once) a git diff would see every worker's changes; sourcing from this worker's
|
|
29
|
-
* own tracked writes guarantees we commit only its own work. Paths the worker
|
|
30
|
-
* passed that fall outside cwd or never landed on disk (e.g. a hallucinated
|
|
31
|
-
* `/workspace/x` or `/x`) are dropped.
|
|
32
|
-
*/
|
|
33
|
-
function workerWrittenFiles(state, cwd) {
|
|
34
|
-
const raw = (state.lastRunResult?.filesWritten) ?? [];
|
|
35
|
-
const seen = new Set();
|
|
36
|
-
const out = [];
|
|
37
|
-
for (const w of raw) {
|
|
38
|
-
if (!w || typeof w !== 'string')
|
|
39
|
-
continue;
|
|
40
|
-
const abs = isAbsolute(w) ? w : join(cwd, w);
|
|
41
|
-
const rel = relative(cwd, abs);
|
|
42
|
-
if (rel === '' || rel.startsWith('..') || isAbsolute(rel))
|
|
43
|
-
continue; // outside cwd
|
|
44
|
-
if (!existsSync(abs))
|
|
45
|
-
continue; // bogus path or never written
|
|
46
|
-
if (seen.has(abs))
|
|
47
|
-
continue;
|
|
48
|
-
seen.add(abs);
|
|
49
|
-
out.push(abs);
|
|
50
|
-
}
|
|
51
|
-
return out;
|
|
52
|
-
}
|
|
53
|
-
async function gitC(cwd, args) {
|
|
54
|
-
try {
|
|
55
|
-
const { stdout, stderr } = await execFileP('git', ['-C', cwd, ...args], { windowsHide: true });
|
|
56
|
-
return { stdout, stderr, code: 0 };
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
const e = err;
|
|
60
|
-
return {
|
|
61
|
-
stdout: e.stdout ?? '',
|
|
62
|
-
stderr: e.stderr ?? e.message ?? String(err),
|
|
63
|
-
code: typeof e.code === 'number' ? e.code : 1,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
async function isInsideWorkTree(cwd) {
|
|
68
|
-
const r = await gitC(cwd, ['rev-parse', '--is-inside-work-tree']);
|
|
69
|
-
return r.code === 0 && r.stdout.trim() === 'true';
|
|
70
|
-
}
|
|
71
|
-
async function currentHead(cwd) {
|
|
72
|
-
const r = await gitC(cwd, ['rev-parse', 'HEAD']);
|
|
73
|
-
return r.code === 0 ? r.stdout.trim() : null;
|
|
74
|
-
}
|
|
75
|
-
// ─── Payload helpers ─────────────────────────────────────────────────────────
|
|
76
|
-
function advanceNoOp(reason, t0, detail) {
|
|
77
|
-
return {
|
|
78
|
-
outcome: 'advance',
|
|
79
|
-
payload: { kind: 'no_op', reason, detail },
|
|
80
|
-
telemetry: {
|
|
81
|
-
stageLabel: 'committing',
|
|
82
|
-
durationMs: Date.now() - t0,
|
|
83
|
-
costUSD: 0,
|
|
84
|
-
turnsUsed: 0,
|
|
85
|
-
stopReason: 'normal',
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
function haltCommit(comment, t0) {
|
|
90
|
-
return {
|
|
91
|
-
outcome: 'halt',
|
|
92
|
-
comment,
|
|
93
|
-
payload: { kind: 'no_op', reason: 'no_diff' }, // placeholder; halt path
|
|
94
|
-
telemetry: {
|
|
95
|
-
stageLabel: 'committing',
|
|
96
|
-
durationMs: Date.now() - t0,
|
|
97
|
-
costUSD: 0,
|
|
98
|
-
turnsUsed: 0,
|
|
99
|
-
stopReason: 'transport_error',
|
|
100
|
-
},
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
function isHookFailure(err) {
|
|
104
|
-
if (err instanceof Error) {
|
|
105
|
-
return /pre-commit hook|hook failed|hook rejected/i.test(err.message);
|
|
106
|
-
}
|
|
107
|
-
// gitC result shape: { code, stdout, stderr }
|
|
108
|
-
if (typeof err === 'object' && err !== null) {
|
|
109
|
-
const r = err;
|
|
110
|
-
const text = `${r.stderr ?? ''} ${r.stdout ?? ''}`;
|
|
111
|
-
return /pre-commit hook|hook failed|hook rejected|hook script|\.git\/hooks\//i.test(text);
|
|
112
|
-
}
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
// ─── Main handler ─────────────────────────────────────────────────────────────
|
|
116
|
-
export async function commitHandler(state) {
|
|
117
|
-
const t0 = Date.now();
|
|
118
|
-
const cwd = state.cwd ?? state.executionContext?.cwd;
|
|
119
|
-
if (!cwd) {
|
|
120
|
-
return advanceNoOp('no_repo', t0, 'no cwd available');
|
|
121
|
-
}
|
|
122
|
-
// Gate 1: no_repo
|
|
123
|
-
if (!await isInsideWorkTree(cwd)) {
|
|
124
|
-
return advanceNoOp('no_repo', t0);
|
|
125
|
-
}
|
|
126
|
-
// Gate 2: detached HEAD / no branch → no_repo
|
|
127
|
-
const head = await currentHead(cwd);
|
|
128
|
-
if (!head) {
|
|
129
|
-
return advanceNoOp('no_repo', t0, 'detached HEAD or no branch');
|
|
130
|
-
}
|
|
131
|
-
// Concurrency-safe attribution: commit ONLY the files THIS worker wrote,
|
|
132
|
-
// resolved to cwd from the harness-tracked tool writes. A repo-wide git diff
|
|
133
|
-
// would, under concurrent same-repo tasks, sweep in other workers' changes.
|
|
134
|
-
const ownFiles = workerWrittenFiles(state, cwd);
|
|
135
|
-
if (ownFiles.length === 0) {
|
|
136
|
-
return advanceNoOp('no_diff', t0);
|
|
137
|
-
}
|
|
138
|
-
const filesChanged = ownFiles;
|
|
139
|
-
// Per-repo commit mutex: serialize the staging+commit section against any
|
|
140
|
-
// other worker committing to the SAME repo so concurrent same-repo tasks
|
|
141
|
-
// never collide on `.git/index.lock`. Distinct repos run concurrently.
|
|
142
|
-
// Read-only probes above (worktree check, HEAD) run outside the lock.
|
|
143
|
-
const repoKey = (await resolveGitToplevel(cwd)) ?? cwd;
|
|
144
|
-
return withRepoCommitLock(repoKey, async () => {
|
|
145
|
-
// Stage ONLY this worker's files.
|
|
146
|
-
const addR = await gitC(cwd, ['add', '--', ...ownFiles]);
|
|
147
|
-
if (addR.code !== 0) {
|
|
148
|
-
return advanceNoOp('hook_failed', t0, addR.stderr || 'git add failed');
|
|
149
|
-
}
|
|
150
|
-
// Confirm THESE paths have staged changes (scoped — ignores anything a
|
|
151
|
-
// concurrent worker may have staged). Exits 0 when nothing staged for them.
|
|
152
|
-
const diffR = await gitC(cwd, ['diff', '--cached', '--quiet', '--', ...ownFiles]);
|
|
153
|
-
if (diffR.code === 0) {
|
|
154
|
-
return advanceNoOp('no_diff', t0);
|
|
155
|
-
}
|
|
156
|
-
const commitMessage = composeCommitMessage(state, filesChanged, cwd);
|
|
157
|
-
try {
|
|
158
|
-
// Pathspec-scoped commit: commits ONLY ownFiles, even if a concurrent
|
|
159
|
-
// worker has other paths staged in the same index.
|
|
160
|
-
const commitR = await gitC(cwd, ['commit', '-m', commitMessage, '--', ...ownFiles]);
|
|
161
|
-
if (commitR.code !== 0) {
|
|
162
|
-
// Hook failure is the dominant case: we've already validated repo,
|
|
163
|
-
// diff, and HEAD; if `git commit` still fails, the most likely cause
|
|
164
|
-
// is a pre-commit hook (or other policy hook) rejecting the commit.
|
|
165
|
-
// We treat non-zero exit as hook_failed unless the stderr indicates
|
|
166
|
-
// something structurally worse (corrupted index, fs errors).
|
|
167
|
-
const stderr = commitR.stderr ?? '';
|
|
168
|
-
const looksStructural = /index|object|corrupt|permission denied|read-only/i.test(stderr);
|
|
169
|
-
if (!looksStructural) {
|
|
170
|
-
return advanceNoOp('hook_failed', t0, stderr || 'commit rejected (likely pre-commit hook)');
|
|
171
|
-
}
|
|
172
|
-
return haltCommit(`commit_failed: ${stderr || 'unknown error'}`, t0);
|
|
173
|
-
}
|
|
174
|
-
const sha = (await currentHead(cwd)) ?? '';
|
|
175
|
-
const authoredAt = new Date().toISOString();
|
|
176
|
-
return {
|
|
177
|
-
outcome: 'advance',
|
|
178
|
-
payload: {
|
|
179
|
-
kind: 'committed',
|
|
180
|
-
commitSha: sha,
|
|
181
|
-
commitMessage,
|
|
182
|
-
filesChanged,
|
|
183
|
-
authoredAt,
|
|
184
|
-
},
|
|
185
|
-
telemetry: {
|
|
186
|
-
stageLabel: 'committing',
|
|
187
|
-
durationMs: Date.now() - t0,
|
|
188
|
-
costUSD: 0,
|
|
189
|
-
turnsUsed: 0,
|
|
190
|
-
stopReason: 'normal',
|
|
191
|
-
},
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
if (isHookFailure(err)) {
|
|
196
|
-
return advanceNoOp('hook_failed', t0, err instanceof Error ? err.message : String(err));
|
|
197
|
-
}
|
|
198
|
-
return haltCommit(`commit_failed: ${err instanceof Error ? err.message : String(err)}`, t0);
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=git-commit-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-commit-handler.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/git-commit-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"journal-review-prompt.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/journal-review-prompt.ts"],"names":[],"mappings":"AA2BA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA2BhI"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// Dedicated cross-agent review for the journal-record write route. Its
|
|
2
|
-
// "diff" is markdown ADR nodes under .mmagent/journal/, NOT source code, so
|
|
3
|
-
// the generic spec/quality code-review prompts mis-fit (they can produce a
|
|
4
|
-
// degenerate `changes_required` with no findings). This validates the NODE on
|
|
5
|
-
// its own terms. Output format is identical to the quality reviewer so
|
|
6
|
-
// parse-review-report.ts parses it unchanged.
|
|
7
|
-
const OUTPUT_FORMAT = `Output format (mandatory):
|
|
8
|
-
|
|
9
|
-
## Verdict
|
|
10
|
-
approved | changes_required
|
|
11
|
-
|
|
12
|
-
## Finding N: <one-line claim for this finding>
|
|
13
|
-
- Severity: critical | high | medium | low
|
|
14
|
-
- Category: frontmatter | edges | schema | confinement | dedup | content
|
|
15
|
-
- Evidence: <quote the offending frontmatter / line>
|
|
16
|
-
- Suggestion: <specific, actionable fix>
|
|
17
|
-
|
|
18
|
-
## Outcome
|
|
19
|
-
found | clean
|
|
20
|
-
|
|
21
|
-
Rules:
|
|
22
|
-
- "approved" when the node is well-formed and faithfully records the learning. Minor wording is NOT a blocker.
|
|
23
|
-
- "changes_required" ONLY for real schema/correctness problems below — and when you do, you MUST enumerate at least one ## Finding. Never return changes_required with no findings.
|
|
24
|
-
- If approved: write "## Verdict\\napproved", omit the ## Finding sections, then "## Outcome\\nclean".
|
|
25
|
-
- Read-only investigation; do NOT use editor tools.`;
|
|
26
|
-
export function journalReviewPrompt(ctx) {
|
|
27
|
-
const diffContent = ctx.diff && ctx.diff.trim() ? ctx.diff : '(no diff available)';
|
|
28
|
-
return `You are the journal reviewer. You are validating a change to a project's
|
|
29
|
-
learnings journal — markdown ADR "node" files under \`.mmagent/journal/\`, NOT
|
|
30
|
-
source code. Judge the node on its own terms; do not apply code-quality criteria.
|
|
31
|
-
|
|
32
|
-
Brief: ${ctx.brief}
|
|
33
|
-
|
|
34
|
-
Worker said: ${ctx.workerSummary}
|
|
35
|
-
|
|
36
|
-
Files changed: ${ctx.filesChanged.join(', ') || '(none)'}
|
|
37
|
-
|
|
38
|
-
Diff (authoritative — what actually changed on disk):
|
|
39
|
-
${diffContent}
|
|
40
|
-
|
|
41
|
-
Validate the node(s):
|
|
42
|
-
1. FRONTMATTER well-formed: id (zero-padded 4-digit string, e.g. "0007"), title, status ∈ {adopted, dropped, inconclusive, superseded}, tags (lowercase kebab-case), date (ISO YYYY-MM-DD), links (array of {type, target}), supersededBy (an id or null).
|
|
43
|
-
2. EDGES use only: supersedes, refines, relates, depends-on, contradicts, parent.
|
|
44
|
-
3. CONTENT: the body has "## Context" and "## Consequences" sections, coherent and faithful to the learning in the brief.
|
|
45
|
-
4. CONFINEMENT: all changed paths are under \`.mmagent/journal/\` (nodes/, index.md, log.md, schema.md). Flag any file written outside it.
|
|
46
|
-
5. DEDUP integrity: on a supersede, the superseded node's status is "superseded" with supersededBy set; index.md gained the row and log.md gained exactly one line.
|
|
47
|
-
|
|
48
|
-
Guardrails:
|
|
49
|
-
- the diff above is ground truth — do NOT claim files are missing/untracked
|
|
50
|
-
- this is markdown/docs, not code — judge the node's correctness, not code style
|
|
51
|
-
|
|
52
|
-
${OUTPUT_FORMAT}`;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=journal-review-prompt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"journal-review-prompt.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/journal-review-prompt.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,4EAA4E;AAC5E,2EAA2E;AAC3E,8EAA8E;AAC9E,uEAAuE;AACvE,8CAA8C;AAE9C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;oDAkB8B,CAAC;AAErD,MAAM,UAAU,mBAAmB,CAAC,GAAoF;IACtH,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACnF,OAAO;;;;SAIA,GAAG,CAAC,KAAK;;eAEH,GAAG,CAAC,aAAa;;iBAEf,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ;;;EAGtD,WAAW;;;;;;;;;;;;;EAaX,aAAa,EAAE,CAAC;AAClB,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { FindingsOutcomeKind } from '../../reporting/findings-outcome.js';
|
|
2
|
-
export interface ParsedReviewReport {
|
|
3
|
-
verdict: 'approved' | 'changes_required';
|
|
4
|
-
findings: Array<{
|
|
5
|
-
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
6
|
-
category: string;
|
|
7
|
-
claim: string;
|
|
8
|
-
evidence?: string;
|
|
9
|
-
suggestion?: string;
|
|
10
|
-
}>;
|
|
11
|
-
}
|
|
12
|
-
type WarnSink = (event: string, data: Record<string, unknown>) => void;
|
|
13
|
-
export declare function parseReviewReport(text: string, legalOutcomes?: readonly FindingsOutcomeKind[], warnSink?: WarnSink): ParsedReviewReport;
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=parse-review-report.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-review-report.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/parse-review-report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACzC,QAAQ,EAAE,KAAK,CAAC;QACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;QACjD,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAKD,KAAK,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAEvE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,SAAS,mBAAmB,EAAyC,EACpF,QAAQ,CAAC,EAAE,QAAQ,GAClB,kBAAkB,CAsCpB"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { parseFindings } from '../findings-parser.js';
|
|
2
|
-
const VERDICT_HEADER = /^##\s*verdict\s*$/im;
|
|
3
|
-
const FINDINGS_HEADER = /^##\s*findings\s*$/im;
|
|
4
|
-
export function parseReviewReport(text, legalOutcomes = ['found', 'clean', 'not_applicable'], warnSink) {
|
|
5
|
-
const safe = (text ?? '').toString();
|
|
6
|
-
const verdictMatch = safe.match(VERDICT_HEADER);
|
|
7
|
-
const findingsMatch = safe.match(FINDINGS_HEADER);
|
|
8
|
-
let verdict = 'changes_required';
|
|
9
|
-
if (verdictMatch) {
|
|
10
|
-
const after = safe.slice(verdictMatch.index + verdictMatch[0].length);
|
|
11
|
-
const firstLine = after.split('\n').map(s => s.trim()).find(s => s.length > 0) ?? '';
|
|
12
|
-
if (/approved/i.test(firstLine) && !/changes/i.test(firstLine)) {
|
|
13
|
-
verdict = 'approved';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
else if (/\bapproved\b/i.test(safe) && !/changes[\s_-]?required/i.test(safe)) {
|
|
17
|
-
verdict = 'approved';
|
|
18
|
-
}
|
|
19
|
-
// Delegate finding extraction to the canonical parseFindings parser.
|
|
20
|
-
// parseFindings is imported from lifecycle/findings-parser and handles the
|
|
21
|
-
// ## Finding N: block format with severity/category/claim/evidence/suggestion.
|
|
22
|
-
const findingsSection = findingsMatch
|
|
23
|
-
? safe.slice(findingsMatch.index + findingsMatch[0].length)
|
|
24
|
-
: '';
|
|
25
|
-
const result = parseFindings(findingsSection, 'reviewer', legalOutcomes, warnSink);
|
|
26
|
-
const findings = result.findings;
|
|
27
|
-
// Severity-gated verdict override. The reviewer prompt is explicit that
|
|
28
|
-
// "approved" means ship-able and that medium/low findings are nice-to-fix,
|
|
29
|
-
// not blockers (see lifecycle/handlers/quality-review-prompt.ts:23-24). A blanket
|
|
30
|
-
// "any finding flips approved → changes_required" rule contradicted that
|
|
31
|
-
// contract and triggered a full rework cycle for a single low-severity
|
|
32
|
-
// nit. Only critical/high findings are blockers, matching the ladder the
|
|
33
|
-
// LLM was instructed to use.
|
|
34
|
-
if (verdict === 'approved'
|
|
35
|
-
&& findings.some(f => f.severity === 'critical' || f.severity === 'high')) {
|
|
36
|
-
verdict = 'changes_required';
|
|
37
|
-
}
|
|
38
|
-
return { verdict, findings };
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=parse-review-report.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-review-report.js","sourceRoot":"","sources":["../../../src/lifecycle/handlers/parse-review-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AActD,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAC7C,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAI/C,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,gBAAgD,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,CAAC,EACpF,QAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,OAAO,GAAoC,kBAAkB,CAAC;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrF,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/D,OAAO,GAAG,UAAU,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;IAED,qEAAqE;IACrE,2EAA2E;IAC3E,+EAA+E;IAC/E,MAAM,eAAe,GAAG,aAAa;QACnC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEjC,wEAAwE;IACxE,2EAA2E;IAC3E,kFAAkF;IAClF,yEAAyE;IACzE,uEAAuE;IACvE,yEAAyE;IACzE,6BAA6B;IAC7B,IAAI,OAAO,KAAK,UAAU;WACnB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;QAC9E,OAAO,GAAG,kBAAkB,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quality-review-prompt.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/handlers/quality-review-prompt.ts"],"names":[],"mappings":"AA+BA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkBhI"}
|