@telora/daemon 0.20.78 → 0.20.89

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 (84) hide show
  1. package/build-info.json +2 -2
  2. package/dist/ai-inspection-context.d.ts.map +1 -1
  3. package/dist/ai-inspection-context.js +4 -2
  4. package/dist/ai-inspection-context.js.map +1 -1
  5. package/dist/audit-prompt.d.ts.map +1 -1
  6. package/dist/audit-prompt.js +9 -5
  7. package/dist/audit-prompt.js.map +1 -1
  8. package/dist/completion/completion-decision.d.ts +3 -29
  9. package/dist/completion/completion-decision.d.ts.map +1 -1
  10. package/dist/completion/completion-decision.js +3 -15
  11. package/dist/completion/completion-decision.js.map +1 -1
  12. package/dist/completion/event-phases.d.ts +0 -8
  13. package/dist/completion/event-phases.d.ts.map +1 -1
  14. package/dist/completion/event-phases.js +4 -52
  15. package/dist/completion/event-phases.js.map +1 -1
  16. package/dist/completion/event.d.ts +1 -11
  17. package/dist/completion/event.d.ts.map +1 -1
  18. package/dist/completion/event.js +1 -3
  19. package/dist/completion/event.js.map +1 -1
  20. package/dist/delivery-artifacts.d.ts.map +1 -1
  21. package/dist/delivery-artifacts.js +9 -8
  22. package/dist/delivery-artifacts.js.map +1 -1
  23. package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
  24. package/dist/prompt-sections/execution-sections.js +44 -3
  25. package/dist/prompt-sections/execution-sections.js.map +1 -1
  26. package/dist/prompt-sections/scoping-sections.d.ts.map +1 -1
  27. package/dist/prompt-sections/scoping-sections.js +8 -0
  28. package/dist/prompt-sections/scoping-sections.js.map +1 -1
  29. package/dist/queries/deliveries.d.ts +20 -153
  30. package/dist/queries/deliveries.d.ts.map +1 -1
  31. package/dist/queries/deliveries.js +26 -0
  32. package/dist/queries/deliveries.js.map +1 -1
  33. package/dist/queries/delivery-gate-state.d.ts +192 -0
  34. package/dist/queries/delivery-gate-state.d.ts.map +1 -0
  35. package/dist/queries/delivery-gate-state.js +23 -0
  36. package/dist/queries/delivery-gate-state.js.map +1 -0
  37. package/dist/queries/holds.d.ts +52 -59
  38. package/dist/queries/holds.d.ts.map +1 -1
  39. package/dist/queries/holds.js +60 -68
  40. package/dist/queries/holds.js.map +1 -1
  41. package/dist/queries/issues.d.ts +2 -2
  42. package/dist/queries/issues.d.ts.map +1 -1
  43. package/dist/queries/issues.js +2 -2
  44. package/dist/queries/issues.js.map +1 -1
  45. package/dist/reality-pole.d.ts +5 -3
  46. package/dist/reality-pole.d.ts.map +1 -1
  47. package/dist/reality-pole.js +13 -4
  48. package/dist/reality-pole.js.map +1 -1
  49. package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
  50. package/dist/resolvers/git-diff-against-base.js +12 -5
  51. package/dist/resolvers/git-diff-against-base.js.map +1 -1
  52. package/dist/resolvers/index.d.ts +1 -1
  53. package/dist/resolvers/index.d.ts.map +1 -1
  54. package/dist/resolvers/index.js +1 -1
  55. package/dist/resolvers/index.js.map +1 -1
  56. package/dist/resolvers/shared/git-diff.d.ts +147 -26
  57. package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
  58. package/dist/resolvers/shared/git-diff.js +275 -35
  59. package/dist/resolvers/shared/git-diff.js.map +1 -1
  60. package/dist/templates/claude-md.d.ts +1 -1
  61. package/dist/templates/claude-md.d.ts.map +1 -1
  62. package/dist/templates/claude-md.js +20 -0
  63. package/dist/templates/claude-md.js.map +1 -1
  64. package/dist/verification-deps.d.ts +151 -0
  65. package/dist/verification-deps.d.ts.map +1 -0
  66. package/dist/verification-deps.js +19 -0
  67. package/dist/verification-deps.js.map +1 -0
  68. package/dist/verification-engine.d.ts +10 -112
  69. package/dist/verification-engine.d.ts.map +1 -1
  70. package/dist/verification-engine.js +84 -30
  71. package/dist/verification-engine.js.map +1 -1
  72. package/dist/verification-evidence.d.ts +33 -1
  73. package/dist/verification-evidence.d.ts.map +1 -1
  74. package/dist/verification-evidence.js +55 -13
  75. package/dist/verification-evidence.js.map +1 -1
  76. package/dist/verification-feedback.d.ts +31 -27
  77. package/dist/verification-feedback.d.ts.map +1 -1
  78. package/dist/verification-feedback.js +76 -85
  79. package/dist/verification-feedback.js.map +1 -1
  80. package/dist/verify-restatement.d.ts +12 -9
  81. package/dist/verify-restatement.d.ts.map +1 -1
  82. package/dist/verify-restatement.js +11 -9
  83. package/dist/verify-restatement.js.map +1 -1
  84. package/package.json +1 -1
@@ -116,62 +116,302 @@ export function findDeliveryMergeCommit(worktreePath, baseBranch) {
116
116
  }
117
117
  }
118
118
  /**
119
- * Verify a commit sha exists locally and, if so, return the first-parent diff
120
- * range that recovers a merge commit's second-parent contribution
121
- * (`<sha>^1...<sha>`). Returns null when the sha is empty, malformed, or not
122
- * present in the repo (e.g. not yet fetched) -- the caller then falls through
123
- * to its other evidence sources rather than diffing against a phantom ref.
119
+ * Verify a commit sha exists locally AND is a real MERGE commit (>= 2 parents),
120
+ * and if so return the first-parent diff range that recovers its second-parent
121
+ * contribution (`<sha>^1...<sha>`).
122
+ *
123
+ * Returns null when the sha is empty, malformed, not present in the repo (e.g.
124
+ * not yet fetched), OR has fewer than two parents. That last guard is
125
+ * load-bearing: the recorded merge_commit_sha was observed to be
126
+ * HEAD-at-stamp-time -- an ordinary sequential commit shared across several
127
+ * deliveries, NOT a per-delivery merge (and a FAST-FORWARDED merge-back leaves
128
+ * no merge commit at all). On such a sha `<sha>^1...<sha>` is that ONE commit's
129
+ * own diff -- WRONG attribution masquerading as a verdict, not the delivery's
130
+ * contribution. `^1...` only recovers a delivery's contribution when `<sha>` is
131
+ * a genuine merge whose non-first parent is the merged-in tip. Refusing it here
132
+ * makes the caller fall through to the recorded-commit-set range
133
+ * (resolveRecordedCommitRange) or live topology instead of judging a whole
134
+ * focus against a single trailing commit.
124
135
  */
125
136
  export function resolveRecordedMergeRange(worktreePath, mergeCommitSha) {
126
137
  const sha = (mergeCommitSha ?? '').trim();
127
138
  if (sha === '')
128
139
  return null;
140
+ let parentCount;
129
141
  try {
130
- // `--verify <sha>^{commit}` confirms the object exists AND is a commit.
131
- execSync(`git rev-parse --verify --quiet ${sha}^{commit}`, {
142
+ // `--parents -n 1 <sha>^{commit}` confirms the object exists AND is a
143
+ // commit, and yields `<sha> <parent1> [<parent2> ...]` in one call.
144
+ const out = execSync(`git rev-list --parents -n 1 ${sha}^{commit}`, {
132
145
  cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8',
133
146
  });
147
+ const parts = out.trim().split(/\s+/).filter((p) => p !== '');
148
+ parentCount = Math.max(0, parts.length - 1); // first token is the commit itself
134
149
  }
135
150
  catch {
136
151
  return null;
137
152
  }
153
+ if (parentCount < 2)
154
+ return null; // not a merge commit -> `^1...` is meaningless
138
155
  return `${sha}^1...${sha}`;
139
156
  }
140
157
  /**
141
- * Resolve the git range that contains a delivery's work, robust to the focus
142
- * branch having already merged into its base:
158
+ * Derive a diff range from a delivery's RECORDED constituent commit set
159
+ * (focus_merges.commit_shas -- the durable record the daemon writes at merge
160
+ * time via extractConstituentCommits/recordFocusMerge). The set is authored by
161
+ * `git log --format=%H <preMergeRef>..<branch>`, so it is newest-first and
162
+ * forms a contiguous first-parent chain for the ff / no-ff merge-back
163
+ * strategies the daemon uses. The range is `<oldest>^1...<newest>` -- the whole
164
+ * recorded set diffed against the commit just before it.
165
+ *
166
+ * Both boundaries (and the parent of the oldest) are verified reachable in the
167
+ * worktree; returns null when the set is empty or a boundary is absent (e.g. a
168
+ * --squash merge rewrote history, breaking the recorded shas' reachability, or
169
+ * the oldest commit is a root with no parent) so the caller falls through to
170
+ * its live-topology sources. This is the record-sourced path that survives a
171
+ * FAST-FORWARD (no merge marker to search for) and a REBASE (merge-base moved),
172
+ * both of which corrupt a topology-derived range.
173
+ */
174
+ export function resolveRecordedCommitRange(worktreePath, commitShas) {
175
+ const shas = (commitShas ?? []).map((s) => s.trim()).filter((s) => s !== '');
176
+ if (shas.length === 0)
177
+ return null;
178
+ const newest = shas[0];
179
+ const oldest = shas[shas.length - 1];
180
+ try {
181
+ for (const ref of [`${newest}^{commit}`, `${oldest}^{commit}`, `${oldest}^1^{commit}`]) {
182
+ execSync(`git rev-parse --verify --quiet ${ref}`, {
183
+ cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8',
184
+ });
185
+ }
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ return `${oldest}^1...${newest}`;
191
+ }
192
+ /**
193
+ * The git trailer key that attributes a commit to the delivery whose work it is.
194
+ * Stamped by agents at commit time (see execution-sections / the agent CLAUDE.md
195
+ * template). The value is the delivery UUID. The trailer travels with the commit
196
+ * object, so it survives fast-forward and rebase exactly like the recorded commit
197
+ * set -- reading it is reading a durable fact, not re-deriving from branch topology.
198
+ */
199
+ export const DELIVERY_TRAILER_KEY = 'Telora-Delivery';
200
+ /**
201
+ * Read the `Telora-Delivery` trailer of a single commit. Returns the trimmed
202
+ * delivery id, or '' when the commit carries no such trailer (a merge-back / daemon
203
+ * commit, or an agent commit made before the convention). Empty on any git failure.
204
+ */
205
+ export function readDeliveryTrailer(worktreePath, sha) {
206
+ const clean = (sha ?? '').trim();
207
+ if (clean === '')
208
+ return '';
209
+ try {
210
+ // Single-quote the format: the `%(...)` parentheses are shell metacharacters.
211
+ const out = execSync(`git show -s '--format=%(trailers:key=${DELIVERY_TRAILER_KEY},valueonly)' ${clean}^{commit}`, { cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8' });
212
+ // A commit can in principle carry several trailer lines; take the first
213
+ // non-empty value -- attribution is single-delivery by construction.
214
+ return out.split('\n').map((l) => l.trim()).find((l) => l !== '') ?? '';
215
+ }
216
+ catch {
217
+ return '';
218
+ }
219
+ }
220
+ /**
221
+ * Partition a RECORDED batch commit set (focus_merges.commit_shas, which spans
222
+ * every delivery merged together) down to the commits attributable to ONE
223
+ * delivery, using each commit's `Telora-Delivery` trailer.
224
+ *
225
+ * This is what gives a delivery merged alongside siblings its OWN commits instead
226
+ * of the batch's combined set: the trailer is the per-commit fact that a shared
227
+ * focus branch's interleaved commits cannot otherwise be partitioned by.
228
+ *
229
+ * GRACEFUL FALLBACK: when NO commit in the set carries a Telora-Delivery trailer
230
+ * (a legacy / pre-convention batch), the set cannot be partitioned, so the whole
231
+ * set is returned unchanged -- exactly today's behavior, no regression. When ANY
232
+ * commit is trailered, the set IS partitionable and only this delivery's commits
233
+ * are returned; untrailered commits (merge-back / daemon) fall out naturally, and
234
+ * a delivery with no trailered commits of its own correctly resolves to an empty
235
+ * set (which the completeness gate then treats as nothing-to-measure).
236
+ *
237
+ * Order is preserved (newest-first), so the result still forms the contiguous
238
+ * chain resolveRecordedCommitRange expects.
239
+ */
240
+ export function filterCommitsByDelivery(worktreePath, commitShas, deliveryId) {
241
+ const shas = (commitShas ?? []).map((s) => s.trim()).filter((s) => s !== '');
242
+ if (shas.length === 0)
243
+ return [];
244
+ const wanted = (deliveryId ?? '').trim();
245
+ const trailers = shas.map((sha) => ({ sha, delivery: readDeliveryTrailer(worktreePath, sha) }));
246
+ const anyTrailered = trailers.some((t) => t.delivery !== '');
247
+ if (!anyTrailered)
248
+ return shas; // un-partitionable legacy batch -> preserve current behavior
249
+ if (wanted === '')
250
+ return shas; // no delivery to filter by -> do not silently drop work
251
+ return trailers.filter((t) => t.delivery === wanted).map((t) => t.sha);
252
+ }
253
+ /**
254
+ * The commit SHAs contained in a diff range (`git rev-list <range>`). Empty on
255
+ * failure. Used by the verify COMPLETENESS check to prove the resolved range
256
+ * actually covers a delivery's recorded commits before rendering a verdict.
257
+ */
258
+ export function listRangeCommits(worktreePath, range) {
259
+ try {
260
+ const out = execSync(`git rev-list ${range}`, { cwd: worktreePath, maxBuffer: 10 * 1024 * 1024, encoding: 'utf-8' });
261
+ return out.split('\n').map((l) => l.trim()).filter((l) => l !== '');
262
+ }
263
+ catch {
264
+ return [];
265
+ }
266
+ }
267
+ /** Confirm a sha names a commit that exists locally. */
268
+ function commitExists(worktreePath, sha) {
269
+ const clean = (sha ?? '').trim();
270
+ if (clean === '')
271
+ return false;
272
+ try {
273
+ execSync(`git rev-parse --verify --quiet ${clean}^{commit}`, {
274
+ cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8',
275
+ });
276
+ return true;
277
+ }
278
+ catch {
279
+ return false;
280
+ }
281
+ }
282
+ /**
283
+ * True when `span` (a `<oldest>^1...<newest>` range) contains EXACTLY the recorded
284
+ * set -- no interleaved foreign commits. When true the cheap span is exact; when
285
+ * false a sibling's commits sit between the endpoints and the set must be diffed
286
+ * commit-by-commit. `shas` is the delivery's own (already trailer-filtered) set.
287
+ */
288
+ function spanCoversRecordedExactly(worktreePath, span, shas) {
289
+ const inSpan = new Set(listRangeCommits(worktreePath, span));
290
+ return inSpan.size === shas.length && shas.every((s) => inSpan.has(s));
291
+ }
292
+ /**
293
+ * Resolve HOW to produce a delivery's evidence, sourced from the DURABLE recorded
294
+ * attribution first and live branch topology only as a fallback (defects #2/#3).
295
+ * Order:
296
+ *
297
+ * 1. RECORDED commit set present, CONTIGUOUS -> `{range: <oldest>^1...<newest>}`
298
+ * from focus_merges.commit_shas (the delivery's own, trailer-filtered set) --
299
+ * the exact record written at merge time, immune to fast-forward and rebase.
300
+ * 1b. RECORDED commit set present, INTERLEAVED with a sibling's commits, OR its
301
+ * span boundary is unreachable (e.g. --squash rewrote history) but the
302
+ * commits themselves survive -> `{commits}` (diffed one by one, so the span
303
+ * never re-absorbs a sibling that sits between the endpoints).
304
+ * 2. RECORDED merge commit present -> `{range: <sha>^1...<sha>}`, ONLY for a real
305
+ * >=2-parent merge (single-parent ff commits are refused -- see
306
+ * resolveRecordedMergeRange).
307
+ * 3. branch AHEAD of base -> `{range: base...HEAD}` (an unmerged branch has no
308
+ * focus_merges row; topology is correct and byte-identical to the old path).
309
+ * 4. branch LEVEL/BEHIND after merge -> `{range: <merge>^1...<merge>}` (searched
310
+ * merge commit -- last-ditch when nothing was recorded).
311
+ * 5. no attributable commits -> null (caller yields empty; instrument-fault path).
143
312
  *
144
- * - branch AHEAD of base -> `base...HEAD` (historic behaviour,
145
- * byte-identical to the old getGitDiff)
146
- * - RECORDED merge commit present -> `<sha>^1...<sha>` (the daemon already
147
- * recorded the merge sha on the delivery
148
- * row; trust it directly rather than
149
- * re-searching -- survives a stale/teamless
150
- * worktree whose integration ref is not
151
- * current, which the search-based fallback
152
- * does not)
153
- * - branch LEVEL/BEHIND after merge -> `<merge>^1...<merge>` (recovered by
154
- * SEARCHING the base for the merge commit
155
- * that brought it in -- fallback for when
156
- * no sha was recorded)
157
- * - no attributable commits -> null (caller yields empty; the
158
- * instrument-fault path handles it)
313
+ * The recorded sources are preferred over `getCommitsAhead` so a merged-back
314
+ * branch that has since taken one new commit (routine: every spawn rebases onto
315
+ * integration) is NOT truncated to that single trailing commit.
159
316
  *
160
- * `recordedMergeSha` is the delivery row's merge_commit_sha (populated by the
161
- * merge-back loop). Passing it lets a merged-back delivery in verify be judged
162
- * from its own recorded merge commit with no live search and no operator hold.
317
+ * `recordedCommitShas` is the delivery's OWN commit set (focus_merges.commit_shas
318
+ * already partitioned per-delivery by the Telora-Delivery trailer); `recordedMergeSha`
319
+ * is the row's merge_commit_sha. Callers without a record (assembly resolvers) pass
320
+ * neither and get the topology path.
163
321
  */
164
- export function resolveDeliveryDiffRange(worktreePath, baseBranch, recordedMergeSha) {
322
+ export function resolveDeliveryDiffSource(worktreePath, baseBranch, recordedMergeSha, recordedCommitShas) {
323
+ const shas = (recordedCommitShas ?? []).map((s) => s.trim()).filter((s) => s !== '');
324
+ if (shas.length > 0) {
325
+ const span = resolveRecordedCommitRange(worktreePath, shas);
326
+ if (span) {
327
+ // A span is exact only when it re-lists ONLY the delivery's own commits.
328
+ // When a sibling interleaves, the span re-absorbs it -> diff commit-by-commit.
329
+ if (spanCoversRecordedExactly(worktreePath, span, shas))
330
+ return { kind: 'range', range: span };
331
+ return { kind: 'commits', commits: shas };
332
+ }
333
+ // Span boundary unreachable (e.g. --squash, or oldest is a root): if the
334
+ // commits themselves still exist, diff them directly; else fall through to
335
+ // topology rather than fabricate a range from missing commits.
336
+ if (shas.every((s) => commitExists(worktreePath, s)))
337
+ return { kind: 'commits', commits: shas };
338
+ }
339
+ const recordedMerge = resolveRecordedMergeRange(worktreePath, recordedMergeSha);
340
+ if (recordedMerge)
341
+ return { kind: 'range', range: recordedMerge };
165
342
  if (getCommitsAhead(worktreePath, baseBranch) > 0)
166
- return `${baseBranch}...HEAD`;
167
- const recorded = resolveRecordedMergeRange(worktreePath, recordedMergeSha);
168
- if (recorded)
169
- return recorded;
343
+ return { kind: 'range', range: `${baseBranch}...HEAD` };
170
344
  const merge = findDeliveryMergeCommit(worktreePath, baseBranch);
171
345
  if (merge)
172
- return `${merge}^1...${merge}`;
346
+ return { kind: 'range', range: `${merge}^1...${merge}` };
173
347
  return null;
174
348
  }
349
+ /**
350
+ * String-range view of {@link resolveDeliveryDiffSource}, for consumers that need
351
+ * a single range expression (assembly resolvers). Those callers pass no recorded
352
+ * commit set, so they always resolve to a `range` source; a `commits` source
353
+ * (interleaved per-delivery set) degrades to its best-effort span here -- only the
354
+ * verify path, which uses the source API directly, isolates interleaved commits.
355
+ */
356
+ export function resolveDeliveryDiffRange(worktreePath, baseBranch, recordedMergeSha, recordedCommitShas) {
357
+ const source = resolveDeliveryDiffSource(worktreePath, baseBranch, recordedMergeSha, recordedCommitShas);
358
+ if (!source)
359
+ return null;
360
+ if (source.kind === 'range')
361
+ return source.range;
362
+ return resolveRecordedCommitRange(worktreePath, [...source.commits]);
363
+ }
364
+ /** The per-commit patch range (`<sha>^ <sha>`) that yields a single commit's own diff. */
365
+ function commitDiffRange(sha) {
366
+ return `${sha}^ ${sha}`;
367
+ }
368
+ /**
369
+ * The delivery's diff, from a resolved source. A `range` source diffs the span
370
+ * directly (byte-identical to the old range path). A `commits` source sums each
371
+ * commit's own patch (oldest-first for readable order), so interleaved siblings
372
+ * never appear.
373
+ */
374
+ export function getDeliveryDiffFromSource(worktreePath, source) {
375
+ if (source.kind === 'range')
376
+ return getGitDiffRange(worktreePath, source.range);
377
+ return [...source.commits]
378
+ .reverse()
379
+ .map((sha) => getGitDiffRange(worktreePath, commitDiffRange(sha)))
380
+ .filter((p) => p !== '')
381
+ .join('\n');
382
+ }
383
+ /** Changed-files for a source: the range's name-only list, or the UNION per commit. */
384
+ export function getDeliveryChangedFilesFromSource(worktreePath, source) {
385
+ if (source.kind === 'range')
386
+ return getChangedFilesRange(worktreePath, source.range);
387
+ const files = new Set();
388
+ for (const sha of source.commits) {
389
+ for (const f of getChangedFilesRange(worktreePath, commitDiffRange(sha)))
390
+ files.add(f);
391
+ }
392
+ return [...files];
393
+ }
394
+ /** Diff-stat for a source: the range's stat, or per-commit stats concatenated. */
395
+ export function getDeliveryDiffStatFromSource(worktreePath, source) {
396
+ if (source.kind === 'range')
397
+ return getDiffStatRange(worktreePath, source.range);
398
+ return [...source.commits]
399
+ .reverse()
400
+ .map((sha) => getDiffStatRange(worktreePath, commitDiffRange(sha)))
401
+ .filter((s) => s.trim() !== '')
402
+ .join('\n');
403
+ }
404
+ /**
405
+ * The commits a source actually diffs, for the completeness check. A `range`
406
+ * source lists the range; a `commits` source is exactly its (existing) commits --
407
+ * so a per-delivery commit set covers itself by construction and never reads as
408
+ * half-blind for interleaving alone.
409
+ */
410
+ export function listSourceCommits(worktreePath, source) {
411
+ if (source.kind === 'range')
412
+ return listRangeCommits(worktreePath, source.range);
413
+ return source.commits.filter((sha) => commitExists(worktreePath, sha));
414
+ }
175
415
  /**
176
416
  * The delivery's diff, resolved from the range that actually contains its work
177
417
  * (see resolveDeliveryDiffRange). For a branch still ahead of base this is
@@ -180,7 +420,7 @@ export function resolveDeliveryDiffRange(worktreePath, baseBranch, recordedMerge
180
420
  * with no attributable commits it returns ''.
181
421
  */
182
422
  export function getDeliveryDiff(worktreePath, baseBranch) {
183
- const range = resolveDeliveryDiffRange(worktreePath, baseBranch);
184
- return range ? getGitDiffRange(worktreePath, range) : '';
423
+ const source = resolveDeliveryDiffSource(worktreePath, baseBranch);
424
+ return source ? getDeliveryDiffFromSource(worktreePath, source) : '';
185
425
  }
186
426
  //# sourceMappingURL=git-diff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../src/resolvers/shared/git-diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../src/resolvers/shared/git-diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,uCAAuC;AAEhF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,KAAa;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CACnB,YAAY,KAAK,EAAE,EACnB,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,KAAa;IAClE,IAAI,CAAC;QACH,OAAO,QAAQ,CACb,mBAAmB,KAAK,EAAE,EAC1B,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACjE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,oBAAoB,CAAC,YAAoB,EAAE,KAAa;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,wBAAwB,KAAK,EAAE,EAC/B,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACjE,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,YAAoB,EAAE,UAAkB;IACjE,OAAO,eAAe,CAAC,YAAY,EAAE,GAAG,UAAU,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAAoB,EAAE,UAAkB;IACzE,OAAO,gBAAgB,CAAC,YAAY,EAAE,GAAG,UAAU,SAAS,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,UAAkB;IACtE,OAAO,oBAAoB,CAAC,YAAY,EAAE,GAAG,UAAU,SAAS,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,UAAkB;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,wBAAwB,UAAU,QAAQ,EAC1C,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACjE,CAAC;QACF,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB,CAAC,YAAoB,EAAE,UAAkB;IAC9E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,EAAE;YAC1C,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;SAC7D,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC7B,MAAM,GAAG,GAAG,QAAQ,CAClB,sCAAsC,gBAAgB,IAAI,UAAU,EAAE,EACtE,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtE,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/D,uEAAuE;YACvE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,uCAAuC;YAC/E,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,IAAI,IAAI,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB,EAAE,cAAyC;IACvG,MAAM,GAAG,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,sEAAsE;QACtE,oEAAoE;QACpE,MAAM,GAAG,GAAG,QAAQ,CAAC,+BAA+B,GAAG,WAAW,EAAE;YAClE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;SAC7D,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mCAAmC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,+CAA+C;IACjF,OAAO,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAAoB,EACpB,UAAuC;IAEvC,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,WAAW,EAAE,GAAG,MAAM,WAAW,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC;YACvF,QAAQ,CAAC,kCAAkC,GAAG,EAAE,EAAE;gBAChD,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,MAAM,QAAQ,MAAM,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAoB,EAAE,GAAW;IACnE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,8EAA8E;QAC9E,MAAM,GAAG,GAAG,QAAQ,CAClB,wCAAwC,oBAAoB,gBAAgB,KAAK,WAAW,EAC5F,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACjE,CAAC;QACF,wEAAwE;QACxE,qEAAqE;QACrE,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,UAAuC,EACvC,UAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC,CAAC,6DAA6D;IAC7F,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,wDAAwD;IACxF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,KAAa;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAClB,gBAAgB,KAAK,EAAE,EACvB,EAAE,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtE,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,SAAS,YAAY,CAAC,YAAoB,EAAE,GAAW;IACrD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,QAAQ,CAAC,kCAAkC,KAAK,WAAW,EAAE;YAC3D,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO;SAC7D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAkBD;;;;;GAKG;AACH,SAAS,yBAAyB,CAAC,YAAoB,EAAE,IAAY,EAAE,IAAc;IACnF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,yBAAyB,CACvC,YAAoB,EACpB,UAAkB,EAClB,gBAAgC,EAChC,kBAAoC;IAEpC,MAAM,IAAI,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,0BAA0B,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,IAAI,EAAE,CAAC;YACT,yEAAyE;YACzE,+EAA+E;YAC/E,IAAI,yBAAyB,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/F,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QACD,yEAAyE;QACzE,2EAA2E;QAC3E,+DAA+D;QAC/D,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClG,CAAC;IACD,MAAM,aAAa,GAAG,yBAAyB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAChF,IAAI,aAAa;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAClE,IAAI,eAAe,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,UAAU,SAAS,EAAE,CAAC;IAC3G,MAAM,KAAK,GAAG,uBAAuB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAChE,IAAI,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,QAAQ,KAAK,EAAE,EAAE,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAAoB,EACpB,UAAkB,EAClB,gBAAgC,EAChC,kBAAoC;IAEpC,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;IACzG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACjD,OAAO,0BAA0B,CAAC,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,0FAA0F;AAC1F,SAAS,eAAe,CAAC,GAAW;IAClC,OAAO,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,YAAoB,EAAE,MAA0B;IACxF,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;SACvB,OAAO,EAAE;SACT,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;SACjE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACvB,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,iCAAiC,CAAC,YAAoB,EAAE,MAA0B;IAChG,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,oBAAoB,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,6BAA6B,CAAC,YAAoB,EAAE,MAA0B;IAC5F,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;SACvB,OAAO,EAAE;SACT,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;SAClE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SAC9B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,MAA0B;IAChF,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,UAAkB;IACtE,MAAM,MAAM,GAAG,yBAAyB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC"}
@@ -29,7 +29,7 @@ export declare const TELORA_CLAUDE_MD_END = "<!-- END TELORA SEED -->";
29
29
  * For Codex: the MCP server is registered in `~/.codex/config.toml` (global).
30
30
  */
31
31
  export declare const SEED_MCP_REGISTRATION_SENTENCE = "The Telora MCP server is registered in `.mcp.json`.";
32
- export declare const SEED_BODY = "# Telora workstation context\n\nThis repo is connected to Telora -- a differential control plane for\nsoftware delivery. Intent and reality are paired signals; the meaningful\nwork happens at the difference.\n\n## Before you write any code (read this first)\n\nDEFAULT: on a Telora-connected workstation, a new capability starts as\n**declared intent** before any code. When the user says \"I want to build\nX\", your first move is NOT to scaffold X -- it is to declare it: create\n(or select) a Focus -> delivery -> issue and move an issue to **In\nProgress**. Code is written only after intent is anchored above it.\n\nThis polarity is deliberate and easy to get backwards. Building directly\nin the working tree -- scaffolding, installing dependencies, starting a\ndev server, writing application files -- is the **exception**, taken ONLY\nwhen the user explicitly asks for it. Recognized bypass phrases:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\". Absent an explicit signal like these, treat any build\nrequest as a request to declare intent in Telora first.\n\nAsking good clarifying questions about stack, scope, or dependencies is\nNOT a substitute for this step -- that is execution-layer scoping, and it\ncomes *after* the capability is declared, not instead of it. Scoping is\nagent work; declaring that a capability matters is the part that must\nland in Telora first.\n\n**Surface the fork; do not silently pick it.** The common failure is\nresolving an ambiguous request toward the path of least resistance --\ne.g. reading \"a web app I run locally on my LAN\" (a deployment target) as\n\"build locally\" (skip Telora). When intent is not already explicit, your\nFIRST response to a build request names the choice rather than assuming\nit: \"I'll scope this in Telora unless you want it built locally -- which?\"\nOne question, once, at the start. Let the user pick; never pick for them\nby starting to type code.\n\n**First action rule.** On a build / new-capability request, your first\ntool call is a Telora planning call (telora_product_focus / _delivery /\n_issue) OR the fork question above -- never Write, Edit, or a code-running\nBash command. If the first move cannot be code, building-before-intent\ncannot happen.\n\nWhy: an artifact with no declared intent above it is reality moving with\nnothing to measure it against -- pure noise to the differential loop. The\nwhole system is built to compute intent-minus-reality; code that skips\nthe intent half defeats the instrument.\n\n## Execution polarity (which path executes this?)\n\nOnce intent is declared, a second polarity governs HOW it executes -- and it\nhas the same default-and-exception shape as the intent polarity above. A\ndeclared focus is handed to the **daemon team + review loop** by default.\nTeam execution IS THE DEFAULT; building it inline yourself in this interactive\nsession is the **explicit, named bypass**, taken ONLY when the user says so.\n\nThree execution forks recur. On each, the left side is the default and the\nright side is the effortful, must-be-named bypass:\n\n- **Daemon team + review vs. inline coding.** Default: hand the focus to the\n daemon team, which executes and runs it through the review gate. Bypass:\n build it inline in this session -- only on an explicit signal.\n- **Tree-anchored delivery vs. unanchored delivery.** Default: anchor each\n delivery to a reality-tree injection. Bypass: an unanchored delivery\n (`allowUnanchored`) -- a deliberate, reason-bearing act, not a silent flag.\n- **Review-gated Done vs. self-marked Done.** Default: work is confirmed Done\n by the review gate. Bypass: marking your own work Done without review.\n\nThe recognized signal that switches execution to inline is an explicit\n\"build it now\" (and the same throwaway phrases that bypass the intent step:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\"). Absent such a signal, hand off to the team -- do not fill the\nchoice with the lowest-resistance path (typing code yourself).\n\n**Surface the fork; do not silently pick it.** When the execution path is not\nalready explicit, your response NAMES the choice rather than assuming it:\n\"I'll hand this to the daemon team + review unless you want it built inline\nnow -- which?\" One question, once. Let the user pick; never default to inline\nby starting to type code.\n\n## Planning hierarchy\n\n- **Focus** = the context that defines an area of work -- not \"one\n capability.\" All phases of building within that area belong in one\n focus; if a \"focus\" is really just one phase, fold it back in.\n- **Delivery** = a shippable phase or major component of a capability.\n- **Context Group** = optional grouping of related issues that share\n meaningful context (relevant files, architectural notes). A CG earns its\n existence by carrying context, not by being a folder.\n- **Task** = one discrete implementable unit. Bounded files, focused\n session. Multiple \"and\" clauses across different concerns means split.\n\nScope by purpose, not count. The right number of deliveries is however\nmany phases the work naturally has.\n\n## PRD: \"build a working app in one run\"\n\nA **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a\nbounded, verifiable, retire-able milestone carrying a **Prerequisite Tree**\nof `goal` / `obstacle` / `overcome` nodes. Each `overcome` materializes\nas a focus; the daemon progressively arms the **frontier** of foci as\nupstream obstacles clear. This is the entry point a user means by \"build a\nfully working app in one go.\"\n\nIt is NOT big-bang generation: you author the tree once, commit a path,\nand the differential loop walks the frontier to completion -- the execution\nunderneath is still the normal focus -> delivery -> issue + review loop.\n\nThe PRD tools are **lazy-loaded** -- they do not exist until you load the\ndomain. If you don't see `telora_prd` / `telora_prd_tree`, run:\n\n```\ntelora_discover { action: \"load\", domain: \"prd\" }\n```\n\nThen: `telora_prd` create (referencing a Vision) -> `telora_prd_tree`\nauthor nodes (an obstacle's `clearancePredicate` is OPTIONAL and advisory --\nthe frontier advances as upstream obstacles clear via focus-completion, i.e.\neach overcome's focus finishing its deliveries' verify gates, not via a\nper-obstacle predicate) + edges -> commit a pathway -> `materialize_overcome`\neach into a focus -> arm the daemon PRD loop. All authoring is harness+MCP;\nthere is no Telora authoring UI.\n\n## Issue workflow\n\n`To Do` -> `In Progress` -> `In Review` / `Blocked` -> `Done`.\n\nIssue types: **Context Group**, **Task**, **Bug**.\n\nMovement rules:\n\n- An issue MUST be set to `In Progress` before any work begins on it.\n- Never skip `In Progress`. Never move directly from `To Do` to `Done`.\n- Set status with `telora_product_issue` action=update.\n\nDelivery and focus stages advance automatically based on issue\nactivity. Agents never set delivery executionStatus directly.\n\n## MCP tool surface (what's available in this session)\n\nThe Telora MCP server is registered in `.mcp.json`. Core tool families:\n\n- `telora_product` -- list/get/create/update products\n- `telora_product_focus` -- focuses under a product\n- `telora_product_delivery` -- deliveries under a focus\n- `telora_product_issue` -- issues (Context Groups, Tasks, Bugs) under a delivery\n- `telora_agent` -- agent roles, escalation requests\n- `telora_loop_*` -- loop documents, questions, answers\n- `telora_discover` -- on-demand registration of deferred tool domains\n\nResolve the live tool list at runtime via `telora_discover` rather than\nhard-coding a list that drifts.\n\n## Human-vs-agent boundaries\n\n- Humans own **intent** and **completion**.\n - Intent: what capability matters, what changes when. Pre-handoff.\n - Completion: closing the loop on whether a focus is done. Post-handoff.\n- Agents own **scoping** and **execution**.\n - Scoping: decomposing a focus into deliveries, deliveries into\n issues, restructuring mid-flight as the agent learns more.\n - Execution: writing code, running tests, committing, reporting.\n\nDo not ask humans for operational details they expect the agent to figure\nout. Do not silently complete a focus on the human's behalf. Escalate\nwhen stuck via `telora_agent` action=escalate.\n\nWhen communicating with a human, refer to focuses, deliveries, and issues\nby their **title**, never their UUID. UUIDs are for tool calls only and must\nnot be surfaced in chat. MCP tool results carry both, so this is a\ncommunication choice, not a data-availability problem: keep the id in the\ntool call, name the work by its title in the conversation.\n\n## Differential signaling\n\nTelora is asymmetric: it moves reality toward intent, never the reverse.\nAgents do not lower the bar to make signals look better -- they escalate.\nEvery artifact (commit, work summary, gate result) is signal toward the\ndeclared intent; raw activity without intent reduction is noise.\n\nA short corrective comment from the user is high-signal -- treat brief\npushback as the most important input in the session.\n\n## Workflows and policies\n\n- **Workflow**: stage directives shape agent behavior at discrete\n transitions. What context the agent sees (assembly recipes), what tools\n it can use, how it thinks (prompt + model). Live in Telora's\n `workflow_stages.agent_directive` JSONB.\n- **Policy** (organizational, deferred): cross-cutting constraints that\n feed into stage directives.\n\nWhen you cross a stage transition, the daemon may inject context or spawn\na fresh sub-agent per the directive. Don't override that flow without a\nclear reason.\n";
32
+ export declare const SEED_BODY = "# Telora workstation context\n\nThis repo is connected to Telora -- a differential control plane for\nsoftware delivery. Intent and reality are paired signals; the meaningful\nwork happens at the difference.\n\n## Before you write any code (read this first)\n\nDEFAULT: on a Telora-connected workstation, a new capability starts as\n**declared intent** before any code. When the user says \"I want to build\nX\", your first move is NOT to scaffold X -- it is to declare it: create\n(or select) a Focus -> delivery -> issue and move an issue to **In\nProgress**. Code is written only after intent is anchored above it.\n\nThis polarity is deliberate and easy to get backwards. Building directly\nin the working tree -- scaffolding, installing dependencies, starting a\ndev server, writing application files -- is the **exception**, taken ONLY\nwhen the user explicitly asks for it. Recognized bypass phrases:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\". Absent an explicit signal like these, treat any build\nrequest as a request to declare intent in Telora first.\n\nAsking good clarifying questions about stack, scope, or dependencies is\nNOT a substitute for this step -- that is execution-layer scoping, and it\ncomes *after* the capability is declared, not instead of it. Scoping is\nagent work; declaring that a capability matters is the part that must\nland in Telora first.\n\n**Surface the fork; do not silently pick it.** The common failure is\nresolving an ambiguous request toward the path of least resistance --\ne.g. reading \"a web app I run locally on my LAN\" (a deployment target) as\n\"build locally\" (skip Telora). When intent is not already explicit, your\nFIRST response to a build request names the choice rather than assuming\nit: \"I'll scope this in Telora unless you want it built locally -- which?\"\nOne question, once, at the start. Let the user pick; never pick for them\nby starting to type code.\n\n**First action rule.** On a build / new-capability request, your first\ntool call is a Telora planning call (telora_product_focus / _delivery /\n_issue) OR the fork question above -- never Write, Edit, or a code-running\nBash command. If the first move cannot be code, building-before-intent\ncannot happen.\n\nWhy: an artifact with no declared intent above it is reality moving with\nnothing to measure it against -- pure noise to the differential loop. The\nwhole system is built to compute intent-minus-reality; code that skips\nthe intent half defeats the instrument.\n\n## Execution polarity (which path executes this?)\n\nOnce intent is declared, a second polarity governs HOW it executes -- and it\nhas the same default-and-exception shape as the intent polarity above. A\ndeclared focus is handed to the **daemon team + review loop** by default.\nTeam execution IS THE DEFAULT; building it inline yourself in this interactive\nsession is the **explicit, named bypass**, taken ONLY when the user says so.\n\nThree execution forks recur. On each, the left side is the default and the\nright side is the effortful, must-be-named bypass:\n\n- **Daemon team + review vs. inline coding.** Default: hand the focus to the\n daemon team, which executes and runs it through the review gate. Bypass:\n build it inline in this session -- only on an explicit signal.\n- **Tree-anchored delivery vs. unanchored delivery.** Default: anchor each\n delivery to a reality-tree injection. Bypass: an unanchored delivery\n (`allowUnanchored`) -- a deliberate, reason-bearing act, not a silent flag.\n- **Review-gated Done vs. self-marked Done.** Default: work is confirmed Done\n by the review gate. Bypass: marking your own work Done without review.\n\nThe recognized signal that switches execution to inline is an explicit\n\"build it now\" (and the same throwaway phrases that bypass the intent step:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\"). Absent such a signal, hand off to the team -- do not fill the\nchoice with the lowest-resistance path (typing code yourself).\n\n**Surface the fork; do not silently pick it.** When the execution path is not\nalready explicit, your response NAMES the choice rather than assuming it:\n\"I'll hand this to the daemon team + review unless you want it built inline\nnow -- which?\" One question, once. Let the user pick; never default to inline\nby starting to type code.\n\n## Planning hierarchy\n\n- **Focus** = the context that defines an area of work -- not \"one\n capability.\" All phases of building within that area belong in one\n focus; if a \"focus\" is really just one phase, fold it back in.\n- **Delivery** = a shippable phase or major component of a capability.\n- **Context Group** = optional grouping of related issues that share\n meaningful context (relevant files, architectural notes). A CG earns its\n existence by carrying context, not by being a folder.\n- **Task** = one discrete implementable unit. Bounded files, focused\n session. Multiple \"and\" clauses across different concerns means split.\n\nScope by purpose, not count. The right number of deliveries is however\nmany phases the work naturally has.\n\n## PRD: \"build a working app in one run\"\n\nA **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a\nbounded, verifiable, retire-able milestone carrying a **Prerequisite Tree**\nof `goal` / `obstacle` / `overcome` nodes. Each `overcome` materializes\nas a focus; the daemon progressively arms the **frontier** of foci as\nupstream obstacles clear. This is the entry point a user means by \"build a\nfully working app in one go.\"\n\nIt is NOT big-bang generation: you author the tree once, commit a path,\nand the differential loop walks the frontier to completion -- the execution\nunderneath is still the normal focus -> delivery -> issue + review loop.\n\nThe PRD tools are **lazy-loaded** -- they do not exist until you load the\ndomain. If you don't see `telora_prd` / `telora_prd_tree`, run:\n\n```\ntelora_discover { action: \"load\", domain: \"prd\" }\n```\n\nThen: `telora_prd` create (referencing a Vision) -> `telora_prd_tree`\nauthor nodes (an obstacle's `clearancePredicate` is OPTIONAL and advisory --\nthe frontier advances as upstream obstacles clear via focus-completion, i.e.\neach overcome's focus finishing its deliveries' verify gates, not via a\nper-obstacle predicate) + edges -> commit a pathway -> `materialize_overcome`\neach into a focus -> arm the daemon PRD loop. All authoring is harness+MCP;\nthere is no Telora authoring UI.\n\n## Issue workflow\n\n`To Do` -> `In Progress` -> `In Review` / `Blocked` -> `Done`.\n\nIssue types: **Context Group**, **Task**, **Bug**.\n\nMovement rules:\n\n- An issue MUST be set to `In Progress` before any work begins on it.\n- Never skip `In Progress`. Never move directly from `To Do` to `Done`.\n- Set status with `telora_product_issue` action=update.\n\nDelivery and focus stages advance automatically based on issue\nactivity. Agents never set delivery executionStatus directly.\n\n## MCP tool surface (what's available in this session)\n\nThe Telora MCP server is registered in `.mcp.json`. Core tool families:\n\n- `telora_product` -- list/get/create/update products\n- `telora_product_focus` -- focuses under a product\n- `telora_product_delivery` -- deliveries under a focus\n- `telora_product_issue` -- issues (Context Groups, Tasks, Bugs) under a delivery\n- `telora_agent` -- agent roles, escalation requests\n- `telora_loop_*` -- loop documents, questions, answers\n- `telora_discover` -- on-demand registration of deferred tool domains\n\nResolve the live tool list at runtime via `telora_discover` rather than\nhard-coding a list that drifts.\n\n## Human-vs-agent boundaries\n\n- Humans own **intent** and **completion**.\n - Intent: what capability matters, what changes when. Pre-handoff.\n - Completion: closing the loop on whether a focus is done. Post-handoff.\n- Agents own **scoping** and **execution**.\n - Scoping: decomposing a focus into deliveries, deliveries into\n issues, restructuring mid-flight as the agent learns more.\n - Execution: writing code, running tests, committing, reporting.\n\nDo not ask humans for operational details they expect the agent to figure\nout. Do not silently complete a focus on the human's behalf. Escalate\nwhen stuck via `telora_agent` action=escalate.\n\nWhen communicating with a human, refer to focuses, deliveries, and issues\nby their **title**, never their UUID. UUIDs are for tool calls only and must\nnot be surfaced in chat. MCP tool results carry both, so this is a\ncommunication choice, not a data-availability problem: keep the id in the\ntool call, name the work by its title in the conversation.\n\n## Commit attribution\n\nDeliveries on a focus share one branch, so their commits interleave. Every\ncommit you make for a delivery MUST carry a git trailer naming that delivery:\n\n```\nTelora-Delivery: <deliveryId>\n```\n\n- `<deliveryId>` is the delivery UUID whose work the commit advances (not the\n issue id, not the focus id). E.g.\n `git commit -m \"<subject>\" -m \"Telora-Delivery: <deliveryId>\"`.\n- One delivery per commit; split a change that spans two deliveries.\n- Merge-resolution / housekeeping commits carry no trailer.\n\nThe verify gate partitions the recorded commit set by this trailer to judge each\ndelivery against its OWN work and to prove its evidence is complete. A missing\ntrailer never corrupts a sibling -- at worst this delivery's evidence becomes\nunvouchable and the gate re-queues it instead of rendering a verdict.\n\n## Differential signaling\n\nTelora is asymmetric: it moves reality toward intent, never the reverse.\nAgents do not lower the bar to make signals look better -- they escalate.\nEvery artifact (commit, work summary, gate result) is signal toward the\ndeclared intent; raw activity without intent reduction is noise.\n\nA short corrective comment from the user is high-signal -- treat brief\npushback as the most important input in the session.\n\n## Workflows and policies\n\n- **Workflow**: stage directives shape agent behavior at discrete\n transitions. What context the agent sees (assembly recipes), what tools\n it can use, how it thinks (prompt + model). Live in Telora's\n `workflow_stages.agent_directive` JSONB.\n- **Policy** (organizational, deferred): cross-cutting constraints that\n feed into stage directives.\n\nWhen you cross a stage transition, the daemon may inject context or spawn\na fresh sub-agent per the directive. Don't override that flow without a\nclear reason.\n";
33
33
  /**
34
34
  * Render a fresh-repo CLAUDE.md.
35
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,wDACY,CAAC;AAExD,eAAO,MAAM,SAAS,8iTAmMrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASjE"}
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,wDACY,CAAC;AAExD,eAAO,MAAM,SAAS,y4UAuNrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASjE"}
@@ -202,6 +202,26 @@ not be surfaced in chat. MCP tool results carry both, so this is a
202
202
  communication choice, not a data-availability problem: keep the id in the
203
203
  tool call, name the work by its title in the conversation.
204
204
 
205
+ ## Commit attribution
206
+
207
+ Deliveries on a focus share one branch, so their commits interleave. Every
208
+ commit you make for a delivery MUST carry a git trailer naming that delivery:
209
+
210
+ \`\`\`
211
+ Telora-Delivery: <deliveryId>
212
+ \`\`\`
213
+
214
+ - \`<deliveryId>\` is the delivery UUID whose work the commit advances (not the
215
+ issue id, not the focus id). E.g.
216
+ \`git commit -m "<subject>" -m "Telora-Delivery: <deliveryId>"\`.
217
+ - One delivery per commit; split a change that spans two deliveries.
218
+ - Merge-resolution / housekeeping commits carry no trailer.
219
+
220
+ The verify gate partitions the recorded commit set by this trailer to judge each
221
+ delivery against its OWN work and to prove its evidence is complete. A missing
222
+ trailer never corrupts a sibling -- at worst this delivery's evidence becomes
223
+ unvouchable and the gate re-queues it instead of rendering a verdict.
224
+
205
225
  ## Differential signaling
206
226
 
207
227
  Telora is asymmetric: it moves reality toward intent, never the reverse.
@@ -1 +1 @@
1
- {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmMxB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,WAA0B;IACvD,MAAM,WAAW,GAAG,WAAW;QAC7B,CAAC,CAAC,kCAAkC,WAAW,SAAS;QACxD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GACT,GAAG,sBAAsB,IAAI;QAC7B,GAAG,WAAW,GAAG,SAAS,EAAE;QAC5B,GAAG,oBAAoB,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuNxB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,WAA0B;IACvD,MAAM,WAAW,GAAG,WAAW;QAC7B,CAAC,CAAC,kCAAkC,WAAW,SAAS;QACxD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GACT,GAAG,sBAAsB,IAAI;QAC7B,GAAG,WAAW,GAAG,SAAS,EAAE;QAC5B,GAAG,oBAAoB,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The verification engine's injectable dependency surface.
3
+ *
4
+ * Split out of `verification-engine.ts` (which holds the dispatch + tick logic)
5
+ * because this is a CONTRACT, not behavior: every seam the engine reaches
6
+ * reality through -- pending-verification reads, the injection flip, target
7
+ * reconciliation, escalation filing, drift emission, the three strategies, cwd
8
+ * and commit-set resolution, the security gate, and the three feedback re-entry
9
+ * paths -- is declared here, and every test that drives the engine constructs
10
+ * one of these. The wiring that fills it (`defaultDeps`) stays in the engine,
11
+ * next to the imports it binds.
12
+ *
13
+ * Type-only module: no runtime imports, so it adds no edge to the module graph
14
+ * that `import-x/no-cycle` has to reason about.
15
+ *
16
+ * @module verification-deps
17
+ */
18
+ import type { StrategyResult } from './verification-deterministic.js';
19
+ import type { runDeterministicStrategy } from './verification-deterministic.js';
20
+ import type { getPendingVerifications, PendingVerification, VerificationOutcome } from './queries/verification.js';
21
+ import type { NodeWriteback } from './reality-writeback.js';
22
+ import type { ReconcileTargetsResult, TargetRestatement, TargetShortfall, VerifyEvidence } from './verify-restatement.js';
23
+ import type { FileEscalationInput } from './escalations.js';
24
+ import type { EvidenceUnavailableDetail } from './queries/delivery-gate-state.js';
25
+ import type { DaemonConfig } from './types.js';
26
+ import type { ResolvedDefaultVerification } from './verification-config.js';
27
+ import type { getActiveFocuses, getFocusDeliveries } from './supabase.js';
28
+ import type { AiInspectionInputs } from './ai-inspection-context.js';
29
+ import type { runAiInspection as defaultRunAiInspection } from './ai-inspection-runner.js';
30
+ import type { SecurityFindingGateDeps } from './security-finding-gate.js';
31
+ import type { FailureClassification } from './verification-baseline.js';
32
+ export interface DriftProposalCreatePayload {
33
+ focusId: string | null;
34
+ productId: string | null;
35
+ injectionNodeId: string;
36
+ observation: {
37
+ nodeId: string | null;
38
+ kind: 'update_statement' | 'add_node' | 'retire_node' | 'change_node_type' | 'flip_ude_to_de';
39
+ observed: string;
40
+ suggestedCorrection: string;
41
+ };
42
+ }
43
+ export interface VerificationDeps {
44
+ getPendingVerifications: typeof getPendingVerifications;
45
+ recordOutcome: (deliveryId: string, outcome: VerificationOutcome) => Promise<void>;
46
+ verifyInjection: (injectionNodeId: string, restatements?: TargetRestatement[]) => Promise<void>;
47
+ /**
48
+ * Reconcile the declared desired effect against the achieved outcome (authored
49
+ * from the supplied EVIDENCE -- diff/tests/inspection, NOT the UDE problem text)
50
+ * for each UDE the injection targets, classifying match / legitimate_divergence
51
+ * / shortfall. match / legitimate_divergence come back in `restatements` for the
52
+ * engine to carry INTO the verify call; shortfalls come back in `shortfalls` so
53
+ * the engine can hold the gate and escalate. The edge applies the supplied prose
54
+ * + classification; it never runs the LLM.
55
+ */
56
+ authorTargetRestatements?: (injectionNodeId: string, focusId: string | null, evidence: VerifyEvidence,
57
+ /**
58
+ * True when the resolved diff range does not cover the delivery's recorded
59
+ * commit set (half-blind). Treated the same as an empty bundle: the gate
60
+ * declines to render a verdict and returns the instrument-fault signal.
61
+ */
62
+ evidenceIncomplete: boolean) => Promise<ReconcileTargetsResult>;
63
+ /**
64
+ * File a human escalation when an injection's achieved outcome falls SHORT of
65
+ * its declared desired effect. Reality is asymmetric: we never soften the
66
+ * declared DE to match a lesser achievement -- we hold the gate and hand the
67
+ * gap to the intent owner.
68
+ */
69
+ fileEscalation: (input: FileEscalationInput) => Promise<void>;
70
+ /** Org scope for filed escalations. */
71
+ organizationId: string;
72
+ /** Persist a single drift proposal observed during ai_inspection. */
73
+ emitDriftProposal: (payload: DriftProposalCreatePayload) => Promise<void>;
74
+ /**
75
+ * Surface INWARD drift proposals (TEL-4): for each target the verify path
76
+ * stamped `legitimate_divergence`, create one `update_statement` drift
77
+ * proposal flagged `inward:true` so a confident-but-wrong tree claim is
78
+ * corrected by drift rather than frozen. Best-effort + non-fatal: a failure
79
+ * here must not undo the verify flip that already landed. Defaults to the
80
+ * `emitInwardDriftProposals` seam in queries/verification.
81
+ */
82
+ emitInwardDrift: (injectionNodeId: string, writebacks: readonly NodeWriteback[], realityTreeId?: string) => Promise<void>;
83
+ runDeterministic: typeof runDeterministicStrategy;
84
+ runAiInspection: typeof defaultRunAiInspection;
85
+ resolveAiInspectionInputs: (v: PendingVerification) => Promise<AiInspectionInputs | null>;
86
+ resolveCwd: (productId: string | null) => string;
87
+ integrationBranch: string;
88
+ /**
89
+ * Security workflow verify-closed gate. Consulted before
90
+ * `verifyInjection` so a security-linked injection cannot be retired
91
+ * unless the linked finding has flipped to 'resolved'. On failure the
92
+ * gate escalates the finding (status='escalated', reason='verify_gate_failed')
93
+ * and the engine demotes the verification outcome to 'failed'.
94
+ */
95
+ securityFindingGate: SecurityFindingGateDeps;
96
+ /**
97
+ * Resolve the default-on deterministic verification config (env > file >
98
+ * default). When it yields `enabled: false` (no command configured) the
99
+ * default-on scan is a no-op and only explicit-method deliveries verify.
100
+ */
101
+ resolveDefaultVerification: (config: DaemonConfig) => ResolvedDefaultVerification;
102
+ /** Enumerate active focuses for a product (default-on candidate discovery). */
103
+ getActiveFocuses: typeof getActiveFocuses;
104
+ /** Fetch a focus's deliveries (default-on candidate discovery). */
105
+ getFocusDeliveries: typeof getFocusDeliveries;
106
+ /** Failed-run feedback (gate_state + live inject). Optional; defaultDeps provides it. */
107
+ deliverFailureFeedback?: (v: PendingVerification, result: StrategyResult) => Promise<void>;
108
+ /**
109
+ * Shortfall-origin re-work re-entry: route the delivery verify -> verify_failed
110
+ * through the single-writer reconciler (carrying the declared-vs-achieved gap in
111
+ * gate_state under the shortfall guard) so it re-enters bounded re-work instead
112
+ * of a human inbox, and live-inject the gap into a running coding team.
113
+ * Distinct from deliverFailureFeedback so a shortfall hold never reports under
114
+ * the deterministic guard. Optional; defaultDeps provides it (requeueShortfallAsRework).
115
+ */
116
+ deliverShortfallFeedback?: (v: PendingVerification, shortfalls: readonly TargetShortfall[]) => Promise<void>;
117
+ /**
118
+ * Instrument-fault re-work re-entry: the verify path was handed no evidence it
119
+ * could judge the work against (an empty bundle). Routes the delivery
120
+ * verify -> verify_failed through the single-writer reconciler (carrying the
121
+ * instrument-fault context in gate_state under the evidence-unavailable guard)
122
+ * so it re-enters the EXISTING bounded verify_failed re-work cycle, and
123
+ * live-injects the fault into a running coding team. Files NO escalation --
124
+ * "fix the diff range / confirm the merge" names no act only a human can
125
+ * perform, so an empty bundle never reaches a human inbox
126
+ * (verify_gate_unclearable, from the iteration cap, is the sole residue).
127
+ * Optional; defaultDeps provides it (requeueEvidenceUnavailableAsRework).
128
+ */
129
+ requeueEvidenceUnavailableAsRework?: (v: PendingVerification, fault: Omit<EvidenceUnavailableDetail, 'heldAt'>) => Promise<void>;
130
+ /** cwd for the HEAD run -- the focus worktree. Optional; dispatch falls back to resolveCwd. */
131
+ resolveVerificationCwd?: (v: PendingVerification) => string;
132
+ /**
133
+ * Count of commits the delivery branch is ahead of the integration base.
134
+ * Used by the evidence-integrity guard to tell a broken diff MEASUREMENT
135
+ * (commits present but diff empty -> hold) from genuine inaction (no commits
136
+ * -> a real shortfall). Optional; defaultDeps resolves it in the focus worktree.
137
+ */
138
+ resolveCommitsAhead?: (v: PendingVerification) => number;
139
+ /**
140
+ * Resolve the delivery's RECORDED constituent commit shas (focus_merges.commit_shas)
141
+ * for the merge_commit_sha the row carries -- the durable attribution written at
142
+ * merge time. The verify diff resolver prefers this over live branch topology so a
143
+ * fast-forwarded or rebased merge-back is judged against the delivery's real commit
144
+ * set, not a truncated trailing-commit range. Returns [] when no record exists (the
145
+ * resolver then falls through to topology). Optional; defaultDeps provides it.
146
+ */
147
+ resolveRecordedCommitShas?: (v: PendingVerification) => Promise<string[]>;
148
+ /** Baseline-diff attribution; null => no baseline resolvable (gate all). Optional. */
149
+ attributeFailures?: (v: PendingVerification, result: StrategyResult) => Promise<FailureClassification | null>;
150
+ }
151
+ //# sourceMappingURL=verification-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-deps.d.ts","sourceRoot":"","sources":["../src/verification-deps.ts"],"names":[],"mappings":"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"}