@su-record/vibe 4.2.35 → 4.2.37

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 (222) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/dist/cli/common.js +4 -1
  5. package/dist/cli/common.js.map +1 -1
  6. package/dist/cli/heldout.js +10 -4
  7. package/dist/cli/heldout.js.map +1 -1
  8. package/dist/cli/human.js +8 -4
  9. package/dist/cli/human.js.map +1 -1
  10. package/dist/cli/internal.js +37 -24
  11. package/dist/cli/internal.js.map +1 -1
  12. package/dist/cli/ledger.js +67 -0
  13. package/dist/cli/ledger.js.map +1 -0
  14. package/dist/cli/map.js +5 -3
  15. package/dist/cli/map.js.map +1 -1
  16. package/dist/cli/memory.js +104 -74
  17. package/dist/cli/memory.js.map +1 -1
  18. package/dist/cli/mutate.js +20 -0
  19. package/dist/cli/mutate.js.map +1 -0
  20. package/dist/cli/risks.js +20 -3
  21. package/dist/cli/risks.js.map +1 -1
  22. package/dist/cli/session.js +4 -2
  23. package/dist/cli/session.js.map +1 -1
  24. package/dist/cli/setup.js +44 -13
  25. package/dist/cli/setup.js.map +1 -1
  26. package/dist/cli/work.js +73 -21
  27. package/dist/cli/work.js.map +1 -1
  28. package/dist/cli.js +19 -6
  29. package/dist/cli.js.map +1 -1
  30. package/dist/core/analyze.js +21 -7
  31. package/dist/core/analyze.js.map +1 -1
  32. package/dist/core/artifact-paths.js +14 -3
  33. package/dist/core/artifact-paths.js.map +1 -1
  34. package/dist/core/capabilities.js +69 -15
  35. package/dist/core/capabilities.js.map +1 -1
  36. package/dist/core/check-authorization.js +37 -0
  37. package/dist/core/check-authorization.js.map +1 -0
  38. package/dist/core/check-process.js +12 -4
  39. package/dist/core/check-process.js.map +1 -1
  40. package/dist/core/check-report.js +66 -0
  41. package/dist/core/check-report.js.map +1 -0
  42. package/dist/core/check.js +59 -71
  43. package/dist/core/check.js.map +1 -1
  44. package/dist/core/checks/changed.js +20 -6
  45. package/dist/core/checks/changed.js.map +1 -1
  46. package/dist/core/checks/eval.js +35 -10
  47. package/dist/core/checks/eval.js.map +1 -1
  48. package/dist/core/checks/file.js +26 -23
  49. package/dist/core/checks/file.js.map +1 -1
  50. package/dist/core/checks/fileRules.js +42 -16
  51. package/dist/core/checks/fileRules.js.map +1 -1
  52. package/dist/core/checks/http.js +35 -34
  53. package/dist/core/checks/http.js.map +1 -1
  54. package/dist/core/checks/packs.js +1 -1
  55. package/dist/core/checks/packs.js.map +1 -1
  56. package/dist/core/checks/review.js +75 -40
  57. package/dist/core/checks/review.js.map +1 -1
  58. package/dist/core/checks/run.js +5 -2
  59. package/dist/core/checks/run.js.map +1 -1
  60. package/dist/core/checks/schema.js +25 -0
  61. package/dist/core/checks/schema.js.map +1 -0
  62. package/dist/core/checks/source.js +11 -6
  63. package/dist/core/checks/source.js.map +1 -1
  64. package/dist/core/config.js +9 -2
  65. package/dist/core/config.js.map +1 -1
  66. package/dist/core/consent.js +24 -16
  67. package/dist/core/consent.js.map +1 -1
  68. package/dist/core/context-notes.js +15 -7
  69. package/dist/core/context-notes.js.map +1 -1
  70. package/dist/core/context.js +24 -12
  71. package/dist/core/context.js.map +1 -1
  72. package/dist/core/conventions.js +22 -9
  73. package/dist/core/conventions.js.map +1 -1
  74. package/dist/core/docs/cfb.js +81 -45
  75. package/dist/core/docs/cfb.js.map +1 -1
  76. package/dist/core/docs/html.js +14 -3
  77. package/dist/core/docs/html.js.map +1 -1
  78. package/dist/core/docs/hwp.js +44 -22
  79. package/dist/core/docs/hwp.js.map +1 -1
  80. package/dist/core/docs/office.js +20 -10
  81. package/dist/core/docs/office.js.map +1 -1
  82. package/dist/core/docs/pdf.js +10 -4
  83. package/dist/core/docs/pdf.js.map +1 -1
  84. package/dist/core/docs/read.js +32 -24
  85. package/dist/core/docs/read.js.map +1 -1
  86. package/dist/core/docs/zip.js +32 -15
  87. package/dist/core/docs/zip.js.map +1 -1
  88. package/dist/core/evidence.js +17 -7
  89. package/dist/core/evidence.js.map +1 -1
  90. package/dist/core/failure-message.js +35 -13
  91. package/dist/core/failure-message.js.map +1 -1
  92. package/dist/core/failure.js +49 -14
  93. package/dist/core/failure.js.map +1 -1
  94. package/dist/core/github.js +3 -1
  95. package/dist/core/github.js.map +1 -1
  96. package/dist/core/handoff.js +20 -7
  97. package/dist/core/handoff.js.map +1 -1
  98. package/dist/core/heldout-run.js +6 -3
  99. package/dist/core/heldout-run.js.map +1 -1
  100. package/dist/core/heldout.js +24 -13
  101. package/dist/core/heldout.js.map +1 -1
  102. package/dist/core/inbox.js +3 -1
  103. package/dist/core/inbox.js.map +1 -1
  104. package/dist/core/inputs.js +6 -3
  105. package/dist/core/inputs.js.map +1 -1
  106. package/dist/core/inspect.js +61 -20
  107. package/dist/core/inspect.js.map +1 -1
  108. package/dist/core/intent.js +35 -13
  109. package/dist/core/intent.js.map +1 -1
  110. package/dist/core/knowledge-find.js +31 -12
  111. package/dist/core/knowledge-find.js.map +1 -1
  112. package/dist/core/knowledge.js +22 -12
  113. package/dist/core/knowledge.js.map +1 -1
  114. package/dist/core/lang.js +5 -2
  115. package/dist/core/lang.js.map +1 -1
  116. package/dist/core/ledger.js +44 -20
  117. package/dist/core/ledger.js.map +1 -1
  118. package/dist/core/locations.js +12 -0
  119. package/dist/core/locations.js.map +1 -0
  120. package/dist/core/map/imports.js +20 -9
  121. package/dist/core/map/imports.js.map +1 -1
  122. package/dist/core/map/index.js +28 -13
  123. package/dist/core/map/index.js.map +1 -1
  124. package/dist/core/map/symbols.js +27 -12
  125. package/dist/core/map/symbols.js.map +1 -1
  126. package/dist/core/mutate.js +107 -0
  127. package/dist/core/mutate.js.map +1 -0
  128. package/dist/core/output-capture.js +7 -4
  129. package/dist/core/output-capture.js.map +1 -1
  130. package/dist/core/paths.js +2 -1
  131. package/dist/core/paths.js.map +1 -1
  132. package/dist/core/performance.js +43 -17
  133. package/dist/core/performance.js.map +1 -1
  134. package/dist/core/profile.js +6 -3
  135. package/dist/core/profile.js.map +1 -1
  136. package/dist/core/reader.js +32 -16
  137. package/dist/core/reader.js.map +1 -1
  138. package/dist/core/readerSession.js +34 -14
  139. package/dist/core/readerSession.js.map +1 -1
  140. package/dist/core/recent.js +20 -6
  141. package/dist/core/recent.js.map +1 -1
  142. package/dist/core/regress.js +21 -12
  143. package/dist/core/regress.js.map +1 -1
  144. package/dist/core/repair.js +22 -4
  145. package/dist/core/repair.js.map +1 -1
  146. package/dist/core/research-queries.js +85 -0
  147. package/dist/core/research-queries.js.map +1 -0
  148. package/dist/core/research.js +89 -88
  149. package/dist/core/research.js.map +1 -1
  150. package/dist/core/results.js +15 -6
  151. package/dist/core/results.js.map +1 -1
  152. package/dist/core/risk-signals.js +53 -15
  153. package/dist/core/risk-signals.js.map +1 -1
  154. package/dist/core/run-id.js +10 -6
  155. package/dist/core/run-id.js.map +1 -1
  156. package/dist/core/scenarios.js +91 -60
  157. package/dist/core/scenarios.js.map +1 -1
  158. package/dist/core/session.js +3 -2
  159. package/dist/core/session.js.map +1 -1
  160. package/dist/core/size.js +28 -8
  161. package/dist/core/size.js.map +1 -1
  162. package/dist/core/skills.js +66 -28
  163. package/dist/core/skills.js.map +1 -1
  164. package/dist/core/skillsmp.js +26 -12
  165. package/dist/core/skillsmp.js.map +1 -1
  166. package/dist/core/source-basis.js +21 -9
  167. package/dist/core/source-basis.js.map +1 -1
  168. package/dist/core/status.js +26 -13
  169. package/dist/core/status.js.map +1 -1
  170. package/dist/core/table.js +8 -1
  171. package/dist/core/table.js.map +1 -1
  172. package/dist/core/tokens.js +20 -10
  173. package/dist/core/tokens.js.map +1 -1
  174. package/dist/core/tree.js +26 -16
  175. package/dist/core/tree.js.map +1 -1
  176. package/dist/core/verification-plan.js +24 -8
  177. package/dist/core/verification-plan.js.map +1 -1
  178. package/dist/core/verification.js +14 -7
  179. package/dist/core/verification.js.map +1 -1
  180. package/dist/core/view.js +93 -44
  181. package/dist/core/view.js.map +1 -1
  182. package/dist/install/global.js +37 -18
  183. package/dist/install/global.js.map +1 -1
  184. package/dist/install/hooks.js +17 -8
  185. package/dist/install/hooks.js.map +1 -1
  186. package/dist/install/manifest.js +11 -0
  187. package/dist/install/manifest.js.map +1 -0
  188. package/dist/install/mcpb.js +52 -23
  189. package/dist/install/mcpb.js.map +1 -1
  190. package/dist/install/plugin.js +73 -33
  191. package/dist/install/plugin.js.map +1 -1
  192. package/dist/install/project.js +8 -7
  193. package/dist/install/project.js.map +1 -1
  194. package/dist/install/register.js +83 -48
  195. package/dist/install/register.js.map +1 -1
  196. package/dist/install/tree.js +27 -11
  197. package/dist/install/tree.js.map +1 -1
  198. package/dist/install/update.js +46 -20
  199. package/dist/install/update.js.map +1 -1
  200. package/hooks/code-map.cjs +22 -9
  201. package/hooks/journal.cjs +18 -16
  202. package/hooks/knowledge-auto.cjs +55 -21
  203. package/hooks/knowledge-journal.cjs +47 -20
  204. package/hooks/knowledge-projects.cjs +50 -21
  205. package/hooks/knowledge-recall.cjs +16 -6
  206. package/hooks/knowledge-upkeep.cjs +22 -5
  207. package/hooks/locations.cjs +35 -0
  208. package/hooks/notify.js +52 -24
  209. package/hooks/obsidian.cjs +17 -7
  210. package/hooks/private-store.cjs +25 -10
  211. package/hooks/retest.cjs +39 -16
  212. package/hooks/session-context.cjs +30 -13
  213. package/hooks/session-files.cjs +44 -21
  214. package/hooks/session-repair.cjs +26 -11
  215. package/hooks/session-state.cjs +78 -38
  216. package/hooks/session.js +19 -8
  217. package/hooks/slice-command.cjs +38 -17
  218. package/hooks/slice-guard.cjs +20 -6
  219. package/hooks/slice-store.cjs +25 -12
  220. package/internal/guides/code.md +2 -0
  221. package/mcpb/server/index.js +40 -12
  222. package/package.json +1 -1
@@ -6,7 +6,16 @@ import { readText } from './store.js';
6
6
  * scenario that answers no bullet is `unrequested`, and a `human` check standing for a bullet that
7
7
  * names a file or a command is `weak` — a claim with no machine verdict behind it.
8
8
  */
9
- const STOP_TERMS = new Set(['then', 'with', 'that', 'this', 'from', 'into', 'have', 'will', 'only', 'when', 'also', 'every', 'which', 'their', 'there', 'these', 'those', 'should', 'would', 'could', 'about', 'being', 'after', 'before']);
9
+ export const STOP_TERMS = new Set([
10
+ 'then', 'with', 'that', 'this', 'from', 'into', 'have', 'will', 'only', 'when', 'also', 'every',
11
+ 'which', 'their', 'there', 'these', 'those', 'should', 'would', 'could', 'about', 'being', 'after', 'before',
12
+ ]);
13
+ const EXCERPT_MAX = 80;
14
+ const ELLIPSIS = '...';
15
+ /** Scenarios sharing this many terms with a bullet answer it; one shared term is enough only when it was backticked. */
16
+ const MIN_SHARED_TERMS = 2;
17
+ const STATUS_WIDTH = 11;
18
+ const SCENARIOS_WIDTH = 20;
10
19
  function tokenize(text) {
11
20
  const backticks = new Set();
12
21
  for (const m of text.matchAll(/`([^`]+)`/g))
@@ -40,18 +49,18 @@ function namesFileOrCommand(text) {
40
49
  return true;
41
50
  return /\b[\w./-]+\.[a-z]{1,5}\b/.test(text);
42
51
  }
43
- /** Scenarios sharing ≥ 2 terms with the bullet, or 1 shared term that came from a backticked name. */
52
+ /** Scenarios sharing enough terms with the bullet, or 1 shared term that came from a backticked name. */
44
53
  function coveringScenarios(bullet, scenarios) {
45
54
  const out = [];
46
55
  for (const { scenario, terms } of scenarios) {
47
56
  const shared = [...bullet.terms].filter((t) => terms.has(t));
48
- if (shared.length >= 2 || (shared.length === 1 && bullet.backticks.has(shared[0])))
57
+ if (shared.length >= MIN_SHARED_TERMS || (shared.length === 1 && bullet.backticks.has(shared[0])))
49
58
  out.push(scenario);
50
59
  }
51
60
  return out;
52
61
  }
53
62
  function excerptOf(text) {
54
- return text.length > 80 ? `${text.slice(0, 77)}...` : text;
63
+ return text.length > EXCERPT_MAX ? `${text.slice(0, EXCERPT_MAX - ELLIPSIS.length)}${ELLIPSIS}` : text;
55
64
  }
56
65
  export function analyzeIntent(root) {
57
66
  const intentText = readText(intentPath(root)) ?? '';
@@ -74,9 +83,14 @@ export function analyzeIntent(root) {
74
83
  }
75
84
  const STATUS_MARK = { covered: '✔ covered', uncovered: '✘ uncovered', weak: '! weak' };
76
85
  export function renderAnalysis(a) {
77
- const rows = a.bullets.map((b) => `${STATUS_MARK[b.status].padEnd(11)} ${(b.scenarios.join(',') || '-').padEnd(20)} ${b.excerpt}`);
86
+ const rows = a.bullets.map((b) => {
87
+ const scenarios = (b.scenarios.join(',') || '-').padEnd(SCENARIOS_WIDTH);
88
+ return `${STATUS_MARK[b.status].padEnd(STATUS_WIDTH)} ${scenarios} ${b.excerpt}`;
89
+ });
78
90
  const unrequestedRows = a.unrequested.map((id) => `unrequested ${id}`);
79
- const verdict = `covered ${a.verdict.covered}/${a.verdict.total} · uncovered ${a.verdict.uncovered} · unrequested ${a.verdict.unrequested} · weak ${a.verdict.weak}`;
80
- return ['status scenarios bullet', ...rows, ...unrequestedRows, verdict].join('\n');
91
+ const { covered, total, uncovered, unrequested, weak } = a.verdict;
92
+ const verdict = `covered ${covered}/${total} · uncovered ${uncovered} · unrequested ${unrequested} · weak ${weak}`;
93
+ const header = `${'status'.padEnd(STATUS_WIDTH)} ${'scenarios'.padEnd(SCENARIOS_WIDTH)} bullet`;
94
+ return [header, ...rows, ...unrequestedRows, verdict].join('\n');
81
95
  }
82
96
  //# sourceMappingURL=analyze.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/core/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/core/analyze.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,17 @@
1
+ const MAX_ARTIFACT_FILES = 16;
2
+ const MAX_ARTIFACT_PATH_CHARS = 500;
3
+ /** Backslash, drive colon and control characters make a path ambiguous across platforms. */
4
+ const UNSAFE_PATH_CHARS = /[\\:\x00-\x1f]/;
5
+ /** Trailing dots and spaces are dropped by Windows, so two names could be one file. */
6
+ const WINDOWS_TRAILING = /[. ]$/;
7
+ /** The harness's own folders are never output evidence. */
8
+ const RESERVED_ROOTS = ['.git', '.vibe'];
9
+ function safeSegments(file) {
10
+ return file.split('/').every((part) => part && part !== '.' && part !== '..' && !WINDOWS_TRAILING.test(part));
11
+ }
1
12
  export function artifactPathsValid(value) {
2
- return Array.isArray(value) && value.length > 0 && value.length <= 16 && value.every(file => typeof file === 'string' && file.length <= 500 && !/[\\:\x00-\x1f]/.test(file)
3
- && !file.startsWith('/') && file.split('/').every(part => part && part !== '.' && part !== '..' && !/[. ]$/.test(part))
4
- && !['.git', '.vibe'].includes(file.split('/')[0].toLowerCase()));
13
+ return Array.isArray(value) && value.length > 0 && value.length <= MAX_ARTIFACT_FILES && value.every((file) => typeof file === 'string' && file.length <= MAX_ARTIFACT_PATH_CHARS && !UNSAFE_PATH_CHARS.test(file)
14
+ && !file.startsWith('/') && safeSegments(file)
15
+ && !RESERVED_ROOTS.includes(file.split('/')[0].toLowerCase()));
5
16
  }
6
17
  //# sourceMappingURL=artifact-paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-paths.js","sourceRoot":"","sources":["../../src/core/artifact-paths.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAC1F,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;WAC3E,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;WACpH,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"artifact-paths.js","sourceRoot":"","sources":["../../src/core/artifact-paths.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,4FAA4F;AAC5F,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,uFAAuF;AACvF,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACjC,2DAA2D;AAC3D,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzC,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,kBAAkB,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5G,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,uBAAuB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;WAChG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;WAC3C,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -1,24 +1,74 @@
1
1
  import { spawnSync } from 'node:child_process';
2
2
  import fs from 'node:fs';
3
- import os from 'node:os';
4
3
  import path from 'node:path';
4
+ import { defaultHome } from './locations.js';
5
+ const READER_REVIEWER_FALLBACK = 'VIBE_READER_CMD / VIBE_REVIEW_CMD';
6
+ const NO_SCREENSHOT_FALLBACK = 'the design review judges the source alone';
5
7
  export const CAPABILITIES = [
6
- { tool: 'graft', probe: { command: ['graft', '--version'] }, serves: ['map', 'callers', 'blast'], fallback: 'vibe map — regex lexers, one hop of imports', install: 'npm i -g @nanonets/graft && graft init && graft build' },
7
- { tool: 'trace', probe: { command: ['trace', '--version'] }, serves: ['blast'], fallback: 'vibe blast — symbols from git hunks and callers by name', install: 'npm i -g trace-mcp && trace init && trace add' },
8
- { tool: 'claude', probe: { command: ['claude', '--version'] }, serves: ['reader', 'reviewer'], fallback: 'codex, or VIBE_READER_CMD / VIBE_REVIEW_CMD', install: 'npm i -g @anthropic-ai/claude-code' },
9
- { tool: 'codex', probe: { command: ['codex', '--version'] }, serves: ['reader', 'reviewer'], fallback: 'claude, or VIBE_READER_CMD / VIBE_REVIEW_CMD', install: 'npm i -g @openai/codex' },
10
- { tool: 'pdftotext', probe: { command: ['pdftotext', '-v'] }, serves: ['read pdf'], fallback: 'the built-in pdf reader', install: 'apt install poppler-utils · brew install poppler' },
11
- { tool: 'agent-browser', probe: { command: ['agent-browser', '--version'] }, serves: ['screenshot'], fallback: 'the design review judges the source alone', install: 'npm i -g agent-browser' },
12
- { tool: 'playwright', probe: { command: ['playwright', '--version'] }, serves: ['screenshot'], fallback: 'the design review judges the source alone', install: 'npm i -g playwright && playwright install chromium' },
8
+ {
9
+ tool: 'graft',
10
+ probe: { command: ['graft', '--version'] },
11
+ serves: ['map', 'callers', 'blast'],
12
+ fallback: 'vibe map — regex lexers, one hop of imports',
13
+ install: 'npm i -g @nanonets/graft && graft init && graft build',
14
+ },
15
+ {
16
+ tool: 'trace',
17
+ probe: { command: ['trace', '--version'] },
18
+ serves: ['blast'],
19
+ fallback: 'vibe blast — symbols from git hunks and callers by name',
20
+ install: 'npm i -g trace-mcp && trace init && trace add',
21
+ },
22
+ {
23
+ tool: 'claude',
24
+ probe: { command: ['claude', '--version'] },
25
+ serves: ['reader', 'reviewer'],
26
+ fallback: `codex, or ${READER_REVIEWER_FALLBACK}`,
27
+ install: 'npm i -g @anthropic-ai/claude-code',
28
+ },
29
+ {
30
+ tool: 'codex',
31
+ probe: { command: ['codex', '--version'] },
32
+ serves: ['reader', 'reviewer'],
33
+ fallback: `claude, or ${READER_REVIEWER_FALLBACK}`,
34
+ install: 'npm i -g @openai/codex',
35
+ },
36
+ {
37
+ tool: 'pdftotext',
38
+ probe: { command: ['pdftotext', '-v'] },
39
+ serves: ['read pdf'],
40
+ fallback: 'the built-in pdf reader',
41
+ install: 'apt install poppler-utils · brew install poppler',
42
+ },
43
+ {
44
+ tool: 'agent-browser',
45
+ probe: { command: ['agent-browser', '--version'] },
46
+ serves: ['screenshot'],
47
+ fallback: NO_SCREENSHOT_FALLBACK,
48
+ install: 'npm i -g agent-browser',
49
+ },
50
+ {
51
+ tool: 'playwright',
52
+ probe: { command: ['playwright', '--version'] },
53
+ serves: ['screenshot'],
54
+ fallback: NO_SCREENSHOT_FALLBACK,
55
+ install: 'npm i -g playwright && playwright install chromium',
56
+ },
13
57
  ];
58
+ /** A probe that hangs must not hold the CLI. */
59
+ const PROBE_TIMEOUT_MS = 10_000;
60
+ const DETAIL_MAX_CHARS = 60;
61
+ /** From this many source files a symbol graph pays for itself. */
62
+ const GRAPH_PROPOSAL_FILES = 200;
63
+ const installOf = (tool) => CAPABILITIES.find((c) => c.tool === tool).install;
14
64
  const cache = new Map();
15
65
  function probeCommand(command) {
16
66
  if (process.env['VIBE_NO_TOOLS'])
17
67
  return { present: false, detail: 'VIBE_NO_TOOLS' };
18
68
  const [cmd, ...args] = command;
19
- const r = spawnSync(cmd, args, { encoding: 'utf-8', timeout: 10_000, shell: process.platform === 'win32' });
69
+ const r = spawnSync(cmd, args, { encoding: 'utf-8', timeout: PROBE_TIMEOUT_MS, shell: process.platform === 'win32' });
20
70
  const line = `${r.stdout ?? ''}${r.stderr ?? ''}`.trim().split('\n')[0] ?? '';
21
- return r.status === 0 ? { present: true, detail: line.slice(0, 60) } : { present: false, detail: 'not on PATH' };
71
+ return r.status === 0 ? { present: true, detail: line.slice(0, DETAIL_MAX_CHARS) } : { present: false, detail: 'not on PATH' };
22
72
  }
23
73
  function probeDirs(dirs, root, home) {
24
74
  for (const d of dirs)
@@ -28,7 +78,7 @@ function probeDirs(dirs, root, home) {
28
78
  return { present: false, detail: 'not installed' };
29
79
  }
30
80
  /** Every capability with whether it is present; probes are cached for the life of the process. */
31
- export function detectCapabilities(root, home = process.env['VIBE_HOME_DIR'] ?? os.homedir()) {
81
+ export function detectCapabilities(root, home = defaultHome()) {
32
82
  return CAPABILITIES.map((c) => {
33
83
  const key = `${c.tool}:${root}`;
34
84
  let hit = cache.get(key);
@@ -46,10 +96,14 @@ export function hasTool(tool, root = process.cwd()) {
46
96
  export function proposeTools(root, signals) {
47
97
  const out = [];
48
98
  const present = new Set(detectCapabilities(root).filter((c) => c.present).map((c) => c.tool));
49
- if (signals.files > 200 && !present.has('graft') && !present.has('trace'))
50
- out.push({ tool: 'graft', why: `${signals.files} source files — a symbol graph makes \`changed\` reviews and \`callers\` symbol-level`, install: CAPABILITIES[0].install });
51
- if (signals.design && !present.has('agent-browser') && !present.has('playwright'))
52
- out.push({ tool: 'agent-browser', why: 'a design review with a screenshot lets the art director see the render', install: CAPABILITIES[5].install });
99
+ if (signals.files > GRAPH_PROPOSAL_FILES && !present.has('graft') && !present.has('trace')) {
100
+ const why = `${signals.files} source files — a symbol graph makes \`changed\` reviews and \`callers\` symbol-level`;
101
+ out.push({ tool: 'graft', why, install: installOf('graft') });
102
+ }
103
+ if (signals.design && !present.has('agent-browser') && !present.has('playwright')) {
104
+ const why = 'a design review with a screenshot lets the art director see the render';
105
+ out.push({ tool: 'agent-browser', why, install: installOf('agent-browser') });
106
+ }
53
107
  return out;
54
108
  }
55
109
  //# sourceMappingURL=capabilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/core/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAmB7B,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,6CAA6C,EAAE,OAAO,EAAE,uDAAuD,EAAE;IAC7N,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,yDAAyD,EAAE,OAAO,EAAE,+CAA+C,EAAE;IAC/M,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,6CAA6C,EAAE,OAAO,EAAE,oCAAoC,EAAE;IACvM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,8CAA8C,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC1L,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,OAAO,EAAE,kDAAkD,EAAE;IACtL,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,2CAA2C,EAAE,OAAO,EAAE,wBAAwB,EAAE;IAC/L,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,2CAA2C,EAAE,OAAO,EAAE,oDAAoD,EAAE;CACtN,CAAC;AAOF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgD,CAAC;AAEtE,SAAS,YAAY,CAAC,OAAiB;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACrF,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAgC,CAAC;IACxD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AACnH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,IAAY,EAAE,IAAY;IAC3D,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IACnJ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AACrD,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE;IAC1G,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACjG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe,OAAO,CAAC,GAAG,EAAE;IAChE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,OAAO,IAAI,KAAK,CAAC;AACjF,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAA2C;IACpF,MAAM,GAAG,GAA0D,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,IAAI,OAAO,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,uFAAuF,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACxP,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,wEAAwE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IACzO,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/core/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { actionOf } from './checks/mutation.js';
2
+ import { ask, hasOpenQuestion, openQuestions, resolve as resolveQuestion } from './inbox.js';
3
+ import { summarizeFailure, failureLine } from './failure.js';
4
+ import { recentAuthorize } from './ledger.js';
5
+ const OUTSIDE_AUTHORITY_PREFIX = 'Outside authority:';
6
+ const CODE_AUTHORIZATION_REQUIRED = 'authorization-required';
7
+ function isOutsideAuthorityQuestion(q, scenarioId) {
8
+ return q.scenario === scenarioId && q.question.startsWith(OUTSIDE_AUTHORITY_PREFIX);
9
+ }
10
+ /** An irreversible scenario runs only behind an authorize record: the harness never re-executes a mutation on its own. */
11
+ export function unauthorized(root, scenario) {
12
+ if (!scenario.irreversible)
13
+ return null;
14
+ const action = actionOf(scenario.irreversible);
15
+ if (recentAuthorize(root, action)) {
16
+ for (const q of openQuestions(root))
17
+ if (isOutsideAuthorityQuestion(q, scenario.id))
18
+ resolveQuestion(root, q.id);
19
+ return null;
20
+ }
21
+ const reason = `irreversible (${action}) — vibe authorize --action ${action} first; check --all never runs it on its own`;
22
+ const outcome = { id: scenario.id, type: scenario.check.type, status: 'blocked', exit: null, ms: 0, tail: '', reason };
23
+ outcome.failureCode = CODE_AUTHORIZATION_REQUIRED;
24
+ outcome.failure = summarizeFailure(root, scenario, { pass: false, exit: null, ms: 0, tail: '', failureCode: CODE_AUTHORIZATION_REQUIRED });
25
+ if (!hasOpenQuestion(root, (q) => isOutsideAuthorityQuestion(q, scenario.id))) {
26
+ const question = [
27
+ `${OUTSIDE_AUTHORITY_PREFIX} ${failureLine(outcome.failure)}.`,
28
+ `Irreversible action ${action} needs authorization; no action was attempted.`,
29
+ 'Will you authorize it or revise the scope?',
30
+ ].join(' ');
31
+ ask(root, { scenario: scenario.id, question, options: ['authorize the action', 'revise scope', 'handoff'] });
32
+ }
33
+ if (scenario.regression)
34
+ outcome.regression = true;
35
+ return outcome;
36
+ }
37
+ //# sourceMappingURL=check-authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-authorization.js","sourceRoot":"","sources":["../../src/core/check-authorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AACtD,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAE7D,SAAS,0BAA0B,CAAC,CAA0C,EAAE,UAAkB;IAChG,OAAO,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;AACtF,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,QAA6C;IACtF,IAAI,CAAC,QAAQ,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC/C,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,IAAI,0BAA0B,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAAE,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACjH,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,MAAM,+BAA+B,MAAM,8CAA8C,CAAC;IAC1H,MAAM,OAAO,GAAoB,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACxI,OAAO,CAAC,WAAW,GAAG,2BAA2B,CAAC;IAClD,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC,CAAC;IAC3I,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG;YACf,GAAG,wBAAwB,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG;YAC9D,uBAAuB,MAAM,gDAAgD;YAC7E,4CAA4C;SAC7C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,sBAAsB,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU;QAAE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,8 +1,15 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { executionShell } from './inspect.js';
3
3
  import { outputCapture, CAPTURE_GRACE_MS } from './output-capture.js';
4
+ /** Tells the command it runs under a check. */
5
+ const CHECK_ENV = { VIBE_CHECK: '1' };
6
+ const KILL_SIGNAL = 'SIGKILL';
4
7
  export function checkProcess(command, options) {
5
- const spawnOptions = { cwd: options.cwd, env: options.env ?? { ...process.env, VIBE_CHECK: '1' }, shell: options.args ? process.platform === 'win32' : executionShell() };
8
+ const spawnOptions = {
9
+ cwd: options.cwd,
10
+ env: options.env ?? { ...process.env, ...CHECK_ENV },
11
+ shell: options.args ? process.platform === 'win32' : executionShell(),
12
+ };
6
13
  const child = options.args ? spawn(command, options.args, spawnOptions) : spawn(command, spawnOptions);
7
14
  return observe(child, options.timeoutMs, options.input ?? '', options.onOutput);
8
15
  }
@@ -23,14 +30,15 @@ function observe(child, timeoutMs, input, onOutput) {
23
30
  child.stdin.destroy();
24
31
  child.unref();
25
32
  }
26
- resolve({ ...streams.finish(closed && failureCode === null), exit, signal, ms: Date.now() - started, failureCode, cleanupUncertain: failureCode !== null });
33
+ const captured = streams.finish(closed && failureCode === null);
34
+ resolve({ ...captured, exit, signal, ms: Date.now() - started, failureCode, cleanupUncertain: failureCode !== null });
27
35
  };
28
36
  const stop = (code) => {
29
37
  if (failureCode)
30
38
  return;
31
39
  failureCode = code;
32
- child.kill('SIGKILL');
33
- grace = setTimeout(() => finish(null, 'SIGKILL', false), CAPTURE_GRACE_MS);
40
+ child.kill(KILL_SIGNAL);
41
+ grace = setTimeout(() => finish(null, KILL_SIGNAL, false), CAPTURE_GRACE_MS);
34
42
  };
35
43
  const timer = setTimeout(() => stop('timeout'), timeoutMs);
36
44
  for (const name of ['stdout', 'stderr'])
@@ -1 +1 @@
1
- {"version":3,"file":"check-process.js","sourceRoot":"","sources":["../../src/core/check-process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check-process.js","sourceRoot":"","sources":["../../src/core/check-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { detectClient, detectHarness, detectModel, reportedCostUsd, reportedTurns } from './client.js';
3
+ import { record } from './ledger.js';
4
+ import { writeRunEvidence } from './run-id.js';
5
+ import { readState } from './state.js';
6
+ const FAIL_HASH_LENGTH = 8;
7
+ const SCENARIO_SET_HASH_LENGTH = 12;
8
+ /** Version of the evidence file written per run; `renderEvidence` and `vibe context` read it. */
9
+ const EVIDENCE_SCHEMA_VERSION = 2;
10
+ export function failHashOf(outcomes) {
11
+ const failed = outcomes.filter((o) => o.status === 'fail').sort((a, b) => a.id.localeCompare(b.id));
12
+ if (failed.length === 0)
13
+ return null;
14
+ const hash = createHash('sha256');
15
+ for (const o of failed) {
16
+ const fields = [
17
+ o.id, o.type, o.exit, o.signal ?? '', o.failureCode ?? 'check-failed',
18
+ o.failure?.diagnosticCode ?? '', o.failure?.locations[0]?.file ?? '',
19
+ ];
20
+ hash.update(`${fields.join('|')}\n`);
21
+ }
22
+ return hash.digest('hex').slice(0, FAIL_HASH_LENGTH);
23
+ }
24
+ export function scenarioSetHash(scenarios) {
25
+ const hash = createHash('sha256');
26
+ for (const s of [...scenarios].sort((a, b) => a.id.localeCompare(b.id))) {
27
+ const definition = { check: s.check, needs: s.needs, risk: s.risk, artifacts: s.artifacts, inputs: s.inputs };
28
+ hash.update(`${s.id}|${JSON.stringify(definition)}\n`);
29
+ }
30
+ return hash.digest('hex').slice(0, SCENARIO_SET_HASH_LENGTH);
31
+ }
32
+ export function recordReport(root, report, scenarios, edges) {
33
+ const { run, at, outcomes, passed, failed, failHash } = report;
34
+ const evidence = {
35
+ schemaVersion: EVIDENCE_SCHEMA_VERSION,
36
+ run,
37
+ at,
38
+ intentHash: readState(root).intentHash,
39
+ client: detectClient(),
40
+ model: detectModel(),
41
+ scenarioSet: scenarioSetHash(scenarios),
42
+ results: outcomes.map(({ diagnostic: _private, ...outcome }) => outcome),
43
+ };
44
+ writeRunEvidence(root, run, evidence);
45
+ const scenarioMap = {};
46
+ for (const o of outcomes)
47
+ scenarioMap[o.id] = o.status;
48
+ const harness = detectHarness();
49
+ record(root, {
50
+ event: 'check',
51
+ client: evidence.client,
52
+ model: evidence.model,
53
+ ...(harness ? { harness } : {}),
54
+ run,
55
+ scenarioSet: evidence.scenarioSet,
56
+ scenarios: scenarioMap,
57
+ passed,
58
+ failed,
59
+ failHash,
60
+ turns: reportedTurns(),
61
+ costUsd: reportedCostUsd(),
62
+ ms: outcomes.reduce((a, o) => a + o.ms, 0),
63
+ edges,
64
+ });
65
+ }
66
+ //# sourceMappingURL=check-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-report.js","sourceRoot":"","sources":["../../src/core/check-report.ts"],"names":[],"mappings":"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"}