@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/dist/cli/common.js +4 -1
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/heldout.js +10 -4
- package/dist/cli/heldout.js.map +1 -1
- package/dist/cli/human.js +8 -4
- package/dist/cli/human.js.map +1 -1
- package/dist/cli/internal.js +37 -24
- package/dist/cli/internal.js.map +1 -1
- package/dist/cli/ledger.js +67 -0
- package/dist/cli/ledger.js.map +1 -0
- package/dist/cli/map.js +5 -3
- package/dist/cli/map.js.map +1 -1
- package/dist/cli/memory.js +104 -74
- package/dist/cli/memory.js.map +1 -1
- package/dist/cli/mutate.js +20 -0
- package/dist/cli/mutate.js.map +1 -0
- package/dist/cli/risks.js +20 -3
- package/dist/cli/risks.js.map +1 -1
- package/dist/cli/session.js +4 -2
- package/dist/cli/session.js.map +1 -1
- package/dist/cli/setup.js +44 -13
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/work.js +73 -21
- package/dist/cli/work.js.map +1 -1
- package/dist/cli.js +19 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/analyze.js +21 -7
- package/dist/core/analyze.js.map +1 -1
- package/dist/core/artifact-paths.js +14 -3
- package/dist/core/artifact-paths.js.map +1 -1
- package/dist/core/capabilities.js +69 -15
- package/dist/core/capabilities.js.map +1 -1
- package/dist/core/check-authorization.js +37 -0
- package/dist/core/check-authorization.js.map +1 -0
- package/dist/core/check-process.js +12 -4
- package/dist/core/check-process.js.map +1 -1
- package/dist/core/check-report.js +66 -0
- package/dist/core/check-report.js.map +1 -0
- package/dist/core/check.js +59 -71
- package/dist/core/check.js.map +1 -1
- package/dist/core/checks/changed.js +20 -6
- package/dist/core/checks/changed.js.map +1 -1
- package/dist/core/checks/eval.js +35 -10
- package/dist/core/checks/eval.js.map +1 -1
- package/dist/core/checks/file.js +26 -23
- package/dist/core/checks/file.js.map +1 -1
- package/dist/core/checks/fileRules.js +42 -16
- package/dist/core/checks/fileRules.js.map +1 -1
- package/dist/core/checks/http.js +35 -34
- package/dist/core/checks/http.js.map +1 -1
- package/dist/core/checks/packs.js +1 -1
- package/dist/core/checks/packs.js.map +1 -1
- package/dist/core/checks/review.js +75 -40
- package/dist/core/checks/review.js.map +1 -1
- package/dist/core/checks/run.js +5 -2
- package/dist/core/checks/run.js.map +1 -1
- package/dist/core/checks/schema.js +25 -0
- package/dist/core/checks/schema.js.map +1 -0
- package/dist/core/checks/source.js +11 -6
- package/dist/core/checks/source.js.map +1 -1
- package/dist/core/config.js +9 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/consent.js +24 -16
- package/dist/core/consent.js.map +1 -1
- package/dist/core/context-notes.js +15 -7
- package/dist/core/context-notes.js.map +1 -1
- package/dist/core/context.js +24 -12
- package/dist/core/context.js.map +1 -1
- package/dist/core/conventions.js +22 -9
- package/dist/core/conventions.js.map +1 -1
- package/dist/core/docs/cfb.js +81 -45
- package/dist/core/docs/cfb.js.map +1 -1
- package/dist/core/docs/html.js +14 -3
- package/dist/core/docs/html.js.map +1 -1
- package/dist/core/docs/hwp.js +44 -22
- package/dist/core/docs/hwp.js.map +1 -1
- package/dist/core/docs/office.js +20 -10
- package/dist/core/docs/office.js.map +1 -1
- package/dist/core/docs/pdf.js +10 -4
- package/dist/core/docs/pdf.js.map +1 -1
- package/dist/core/docs/read.js +32 -24
- package/dist/core/docs/read.js.map +1 -1
- package/dist/core/docs/zip.js +32 -15
- package/dist/core/docs/zip.js.map +1 -1
- package/dist/core/evidence.js +17 -7
- package/dist/core/evidence.js.map +1 -1
- package/dist/core/failure-message.js +35 -13
- package/dist/core/failure-message.js.map +1 -1
- package/dist/core/failure.js +49 -14
- package/dist/core/failure.js.map +1 -1
- package/dist/core/github.js +3 -1
- package/dist/core/github.js.map +1 -1
- package/dist/core/handoff.js +20 -7
- package/dist/core/handoff.js.map +1 -1
- package/dist/core/heldout-run.js +6 -3
- package/dist/core/heldout-run.js.map +1 -1
- package/dist/core/heldout.js +24 -13
- package/dist/core/heldout.js.map +1 -1
- package/dist/core/inbox.js +3 -1
- package/dist/core/inbox.js.map +1 -1
- package/dist/core/inputs.js +6 -3
- package/dist/core/inputs.js.map +1 -1
- package/dist/core/inspect.js +61 -20
- package/dist/core/inspect.js.map +1 -1
- package/dist/core/intent.js +35 -13
- package/dist/core/intent.js.map +1 -1
- package/dist/core/knowledge-find.js +31 -12
- package/dist/core/knowledge-find.js.map +1 -1
- package/dist/core/knowledge.js +22 -12
- package/dist/core/knowledge.js.map +1 -1
- package/dist/core/lang.js +5 -2
- package/dist/core/lang.js.map +1 -1
- package/dist/core/ledger.js +44 -20
- package/dist/core/ledger.js.map +1 -1
- package/dist/core/locations.js +12 -0
- package/dist/core/locations.js.map +1 -0
- package/dist/core/map/imports.js +20 -9
- package/dist/core/map/imports.js.map +1 -1
- package/dist/core/map/index.js +28 -13
- package/dist/core/map/index.js.map +1 -1
- package/dist/core/map/symbols.js +27 -12
- package/dist/core/map/symbols.js.map +1 -1
- package/dist/core/mutate.js +107 -0
- package/dist/core/mutate.js.map +1 -0
- package/dist/core/output-capture.js +7 -4
- package/dist/core/output-capture.js.map +1 -1
- package/dist/core/paths.js +2 -1
- package/dist/core/paths.js.map +1 -1
- package/dist/core/performance.js +43 -17
- package/dist/core/performance.js.map +1 -1
- package/dist/core/profile.js +6 -3
- package/dist/core/profile.js.map +1 -1
- package/dist/core/reader.js +32 -16
- package/dist/core/reader.js.map +1 -1
- package/dist/core/readerSession.js +34 -14
- package/dist/core/readerSession.js.map +1 -1
- package/dist/core/recent.js +20 -6
- package/dist/core/recent.js.map +1 -1
- package/dist/core/regress.js +21 -12
- package/dist/core/regress.js.map +1 -1
- package/dist/core/repair.js +22 -4
- package/dist/core/repair.js.map +1 -1
- package/dist/core/research-queries.js +85 -0
- package/dist/core/research-queries.js.map +1 -0
- package/dist/core/research.js +89 -88
- package/dist/core/research.js.map +1 -1
- package/dist/core/results.js +15 -6
- package/dist/core/results.js.map +1 -1
- package/dist/core/risk-signals.js +53 -15
- package/dist/core/risk-signals.js.map +1 -1
- package/dist/core/run-id.js +10 -6
- package/dist/core/run-id.js.map +1 -1
- package/dist/core/scenarios.js +91 -60
- package/dist/core/scenarios.js.map +1 -1
- package/dist/core/session.js +3 -2
- package/dist/core/session.js.map +1 -1
- package/dist/core/size.js +28 -8
- package/dist/core/size.js.map +1 -1
- package/dist/core/skills.js +66 -28
- package/dist/core/skills.js.map +1 -1
- package/dist/core/skillsmp.js +26 -12
- package/dist/core/skillsmp.js.map +1 -1
- package/dist/core/source-basis.js +21 -9
- package/dist/core/source-basis.js.map +1 -1
- package/dist/core/status.js +26 -13
- package/dist/core/status.js.map +1 -1
- package/dist/core/table.js +8 -1
- package/dist/core/table.js.map +1 -1
- package/dist/core/tokens.js +20 -10
- package/dist/core/tokens.js.map +1 -1
- package/dist/core/tree.js +26 -16
- package/dist/core/tree.js.map +1 -1
- package/dist/core/verification-plan.js +24 -8
- package/dist/core/verification-plan.js.map +1 -1
- package/dist/core/verification.js +14 -7
- package/dist/core/verification.js.map +1 -1
- package/dist/core/view.js +93 -44
- package/dist/core/view.js.map +1 -1
- package/dist/install/global.js +37 -18
- package/dist/install/global.js.map +1 -1
- package/dist/install/hooks.js +17 -8
- package/dist/install/hooks.js.map +1 -1
- package/dist/install/manifest.js +11 -0
- package/dist/install/manifest.js.map +1 -0
- package/dist/install/mcpb.js +52 -23
- package/dist/install/mcpb.js.map +1 -1
- package/dist/install/plugin.js +73 -33
- package/dist/install/plugin.js.map +1 -1
- package/dist/install/project.js +8 -7
- package/dist/install/project.js.map +1 -1
- package/dist/install/register.js +83 -48
- package/dist/install/register.js.map +1 -1
- package/dist/install/tree.js +27 -11
- package/dist/install/tree.js.map +1 -1
- package/dist/install/update.js +46 -20
- package/dist/install/update.js.map +1 -1
- package/hooks/code-map.cjs +22 -9
- package/hooks/journal.cjs +18 -16
- package/hooks/knowledge-auto.cjs +55 -21
- package/hooks/knowledge-journal.cjs +47 -20
- package/hooks/knowledge-projects.cjs +50 -21
- package/hooks/knowledge-recall.cjs +16 -6
- package/hooks/knowledge-upkeep.cjs +22 -5
- package/hooks/locations.cjs +35 -0
- package/hooks/notify.js +52 -24
- package/hooks/obsidian.cjs +17 -7
- package/hooks/private-store.cjs +25 -10
- package/hooks/retest.cjs +39 -16
- package/hooks/session-context.cjs +30 -13
- package/hooks/session-files.cjs +44 -21
- package/hooks/session-repair.cjs +26 -11
- package/hooks/session-state.cjs +78 -38
- package/hooks/session.js +19 -8
- package/hooks/slice-command.cjs +38 -17
- package/hooks/slice-guard.cjs +20 -6
- package/hooks/slice-store.cjs +25 -12
- package/internal/guides/code.md +2 -0
- package/mcpb/server/index.js +40 -12
- package/package.json +1 -1
package/dist/core/analyze.js
CHANGED
|
@@ -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([
|
|
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
|
|
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 >=
|
|
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 >
|
|
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) =>
|
|
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
|
|
80
|
-
|
|
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
|
package/dist/core/analyze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/core/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,
|
|
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 <=
|
|
3
|
-
&& !file.startsWith('/') && file
|
|
4
|
-
&& !
|
|
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,
|
|
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
|
-
{
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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:
|
|
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,
|
|
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 =
|
|
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 >
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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,
|
|
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 = {
|
|
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
|
-
|
|
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(
|
|
33
|
-
grace = setTimeout(() => finish(null,
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAsE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
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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"}
|