@su-record/vibe 4.1.9 → 4.1.11
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/README.md +7 -3
- package/agents/design-art-director.md +27 -0
- package/agents/design-markup-reviewer.md +28 -0
- package/agents/en-chief-editor.md +3 -0
- package/agents/en-copy-editor.md +3 -0
- package/agents/ko-chief-editor.md +6 -0
- package/agents/ko-copy-editor.md +7 -0
- package/card.md +1 -1
- package/dist/cli/common.js +2 -1
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/work.js +17 -5
- package/dist/cli/work.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/core/checks/packs.js +27 -0
- package/dist/core/checks/packs.js.map +1 -0
- package/dist/core/checks/review.js +51 -29
- package/dist/core/checks/review.js.map +1 -1
- package/dist/core/checks/source.js +51 -0
- package/dist/core/checks/source.js.map +1 -0
- package/dist/core/config.js +2 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/reader.js +98 -0
- package/dist/core/reader.js.map +1 -0
- package/dist/core/readerSession.js +111 -0
- package/dist/core/readerSession.js.map +1 -0
- package/dist/core/regress.js +22 -6
- package/dist/core/regress.js.map +1 -1
- package/dist/core/scenarios.js +3 -0
- package/dist/core/scenarios.js.map +1 -1
- package/dist/core/view.js +2 -1
- package/dist/core/view.js.map +1 -1
- package/dist/install/hooks.js +7 -6
- package/dist/install/hooks.js.map +1 -1
- package/dist/install/plugin.js +19 -13
- package/dist/install/plugin.js.map +1 -1
- package/dist/install/tree.js +4 -1
- package/dist/install/tree.js.map +1 -1
- package/hooks/codex-hooks.json +10 -0
- package/hooks/hooks.json +10 -0
- package/hooks/notify.js +27 -1
- package/package.json +1 -1
- package/reviewers/design/1-markup-reviewer.md +21 -0
- package/reviewers/design/2-art-director.md +20 -0
- package/reviewers/en/{copy-editor.md → 1-copy-editor.md} +3 -0
- package/reviewers/en/{chief-editor.md → 2-chief-editor.md} +3 -0
- package/reviewers/ko/{copy-editor.md → 1-copy-editor.md} +7 -0
- package/reviewers/ko/{chief-editor.md → 2-chief-editor.md} +6 -0
- package/skills/antislop-design/SKILL.md +231 -0
- package/skills/antislop-design/references/catalogue.md +42 -0
- package/skills/antislop-design/references/plan.md +131 -0
- package/skills/antislop-en/SKILL.md +50 -0
- package/skills/antislop-en/references/editorial-review.md +1 -1
- package/skills/antislop-ko/SKILL.md +88 -0
- package/skills/antislop-ko/references/editorial-review.md +1 -1
- package/skills/vibe-build/SKILL.md +1 -0
- package/skills/vibe-discover/SKILL.md +1 -0
- package/skills/vibe-scope/SKILL.md +2 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { usage } from '../errors.js';
|
|
4
|
+
/** Files a design pack reads: the markup, the styles, the components, the vector art. */
|
|
5
|
+
const SOURCE_EXT = new Set(['.html', '.htm', '.css', '.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte', '.svg']);
|
|
6
|
+
function walk(dir, out) {
|
|
7
|
+
for (const name of fs.readdirSync(dir).sort()) {
|
|
8
|
+
if (name === 'node_modules' || name.startsWith('.'))
|
|
9
|
+
continue;
|
|
10
|
+
const full = path.join(dir, name);
|
|
11
|
+
if (fs.statSync(full).isDirectory())
|
|
12
|
+
walk(full, out);
|
|
13
|
+
else if (SOURCE_EXT.has(path.extname(name).toLowerCase()))
|
|
14
|
+
out.push(full);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function numberLines(text) {
|
|
18
|
+
const lines = text.replace(/\n$/, '').split('\n');
|
|
19
|
+
const width = String(lines.length).length;
|
|
20
|
+
return lines.map((line, i) => `${String(i + 1).padStart(width)}| ${line}`).join('\n');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The artifact as the reviewers see it: one file, or every source file under a directory, each
|
|
24
|
+
* numbered line by line so a finding can name `file:line`. The cap is the reviewer's context.
|
|
25
|
+
*/
|
|
26
|
+
export function collectSource(root, target, maxChars) {
|
|
27
|
+
const full = path.resolve(root, target);
|
|
28
|
+
if (!fs.existsSync(full))
|
|
29
|
+
throw usage(`no such path: ${target}`);
|
|
30
|
+
const files = [];
|
|
31
|
+
if (fs.statSync(full).isDirectory())
|
|
32
|
+
walk(full, files);
|
|
33
|
+
else
|
|
34
|
+
files.push(full);
|
|
35
|
+
if (files.length === 0)
|
|
36
|
+
throw usage(`no source files under ${target}`);
|
|
37
|
+
const blocks = [];
|
|
38
|
+
let chars = 0;
|
|
39
|
+
const listed = [];
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const rel = path.relative(root, file);
|
|
42
|
+
const body = numberLines(fs.readFileSync(file, 'utf-8'));
|
|
43
|
+
chars += body.length;
|
|
44
|
+
if (chars > maxChars)
|
|
45
|
+
break;
|
|
46
|
+
listed.push(rel);
|
|
47
|
+
blocks.push(`<file path="${rel}">\n${body}\n</file>`);
|
|
48
|
+
}
|
|
49
|
+
return { files: listed, text: blocks.join('\n\n') };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/core/checks/source.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
CHANGED
|
@@ -11,7 +11,8 @@ export function readConfig(root) {
|
|
|
11
11
|
const raw = readJson(configPath(root)) ?? {};
|
|
12
12
|
const tokens = TOKEN_POLICIES.includes(raw.tokens) ? raw.tokens : DEFAULT_TOKEN_POLICY;
|
|
13
13
|
const catalogs = Array.isArray(raw.catalogs) ? raw.catalogs.filter((c) => typeof c === 'string' && /^[\w.-]+\/[\w.-]+$/.test(c)) : [...DEFAULT_CATALOGS];
|
|
14
|
-
|
|
14
|
+
const reader = typeof raw.reader === 'string' && raw.reader.trim() ? raw.reader.trim() : undefined;
|
|
15
|
+
return reader ? { tokens, catalogs, reader } : { tokens, catalogs };
|
|
15
16
|
}
|
|
16
17
|
export function writeConfig(root, config) {
|
|
17
18
|
writeJson(configPath(root), { ...readConfig(root), ...config });
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAUjD,MAAM,CAAC,MAAM,cAAc,GAA+B,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AAC5F,MAAM,CAAC,MAAM,oBAAoB,GAAgB,cAAc,CAAC;AAEhE,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,2BAA2B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAUjD,MAAM,CAAC,MAAM,cAAc,GAA+B,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;AAC5F,MAAM,CAAC,MAAM,oBAAoB,GAAgB,cAAc,CAAC;AAEhE,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,mBAAmB,EAAE,0BAA0B,EAAE,2BAA2B,CAAC,CAAC;AAUlI,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,QAAQ,CAAkB,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAqB,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,MAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACvH,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACtK,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACnG,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAuB;IAC/D,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAoB,CAAC;QAAE,MAAM,KAAK,CAAC,kBAAkB,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChH,OAAO,KAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,OAAO,MAAM,KAAK,QAAQ,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,OAAO,MAAM,KAAK,KAAK,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readConfig } from './config.js';
|
|
2
|
+
import { readDocument } from './docs/read.js';
|
|
3
|
+
import { usage } from './errors.js';
|
|
4
|
+
import { claudeArgs, codexArgs, findSession, hasCli, parseClaude, parseCodex, readerHome, saveSession, sessionKey, spawnReader } from './readerSession.js';
|
|
5
|
+
import { ensureDir } from './store.js';
|
|
6
|
+
/**
|
|
7
|
+
* `vibe read --ask` — the harness reads for the model. The files go to a low-reasoning reader
|
|
8
|
+
* model and only its answer comes back, so the frontier model's context holds the answer, not
|
|
9
|
+
* the corpus. Text and code lines are numbered before they leave, so the answer can cite them —
|
|
10
|
+
* the part a plain summary loses. Editing and debugging still read the real file (card rule 8).
|
|
11
|
+
*/
|
|
12
|
+
export const READER_MAX_CHARS = 400_000;
|
|
13
|
+
const TIMEOUT_MS = 300_000;
|
|
14
|
+
const INSTRUCTIONS = [
|
|
15
|
+
'You are a reader. Answer the question at the end from the files below and nothing else.',
|
|
16
|
+
'Cite the file path and the line number (the number before "|") for every claim.',
|
|
17
|
+
'Be exact and brief: no preamble, no restatement of the files, no advice beyond the question.',
|
|
18
|
+
].join('\n');
|
|
19
|
+
export function numberLines(text) {
|
|
20
|
+
const lines = text.replace(/\n$/, '').split('\n');
|
|
21
|
+
const width = String(lines.length).length;
|
|
22
|
+
return lines.map((line, i) => `${String(i + 1).padStart(width)}| ${line}`).join('\n');
|
|
23
|
+
}
|
|
24
|
+
/** Every file as a `<file>` block: documents through the readers, code and text numbered line by line. */
|
|
25
|
+
export function bundleFiles(root, files, options = {}) {
|
|
26
|
+
if (files.length === 0)
|
|
27
|
+
throw usage('read <file…> --ask "<question>"');
|
|
28
|
+
const blocks = [];
|
|
29
|
+
let chars = 0;
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
const doc = readDocument(root, file, { ...options, maxChars: READER_MAX_CHARS });
|
|
32
|
+
const body = doc.format === 'text' ? numberLines(doc.sections.map((s) => s.text).join('\n')) : doc.text;
|
|
33
|
+
chars += body.length;
|
|
34
|
+
if (chars > READER_MAX_CHARS)
|
|
35
|
+
throw usage(`the files exceed ${READER_MAX_CHARS} characters at ${file} — ask about fewer files, or use --pages / --sheet`);
|
|
36
|
+
blocks.push(`<file path="${file}" format="${doc.format}">\n${body}\n</file>`);
|
|
37
|
+
}
|
|
38
|
+
return { files, chars, text: blocks.join('\n\n') };
|
|
39
|
+
}
|
|
40
|
+
export function readerPrompt(bundle, question) {
|
|
41
|
+
return `${INSTRUCTIONS}\n\n${bundle.text}\n\n## Question\n\n${question.trim()}\n`;
|
|
42
|
+
}
|
|
43
|
+
const NO_READER = 'no reader available — set VIBE_READER_CMD, put `reader` in .vibe/config.json, or have `claude` or `codex` on PATH';
|
|
44
|
+
/** The reader, in order: env, project config (both stateless shell commands), then the client CLI on PATH at its lowest reasoning. */
|
|
45
|
+
export function chooseReader(root) {
|
|
46
|
+
const custom = process.env['VIBE_READER_CMD'] || readConfig(root).reader;
|
|
47
|
+
if (custom)
|
|
48
|
+
return { client: 'custom', label: custom, cmd: custom };
|
|
49
|
+
if (hasCli('claude'))
|
|
50
|
+
return { client: 'claude', label: 'claude -p --model haiku', cmd: 'claude' };
|
|
51
|
+
if (hasCli('codex'))
|
|
52
|
+
return { client: 'codex', label: 'codex exec (reasoning low)', cmd: 'codex' };
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/** Kept for callers that only want the command string. */
|
|
56
|
+
export function readerCommand(root) {
|
|
57
|
+
return chooseReader(root)?.label ?? null;
|
|
58
|
+
}
|
|
59
|
+
function firstMessage(choice, bundle, question) {
|
|
60
|
+
const body = `${bundle.text}\n\n## Question\n\n${question.trim()}\n`;
|
|
61
|
+
return choice.client === 'claude' ? body : `${INSTRUCTIONS}\n\n${body}`; // claude carries the instructions as its system prompt
|
|
62
|
+
}
|
|
63
|
+
function followUp(question) {
|
|
64
|
+
return `Same files as before.\n\n## Question\n\n${question.trim()}\n`;
|
|
65
|
+
}
|
|
66
|
+
async function runChoice(choice, resume, stdin, root, home) {
|
|
67
|
+
if (choice.client === 'custom') {
|
|
68
|
+
const r = await spawnReader(choice.cmd, null, stdin, root, TIMEOUT_MS); // a user's command runs where the user wrote it
|
|
69
|
+
return { reply: r.out, sessionId: null, usage: null, exit: r.exit, killed: r.killed };
|
|
70
|
+
}
|
|
71
|
+
const cwd = readerHome(home); // the client CLIs run in a neutral directory: no project card, memory or hooks
|
|
72
|
+
ensureDir(cwd);
|
|
73
|
+
const args = choice.client === 'claude' ? claudeArgs(INSTRUCTIONS, resume) : codexArgs(resume);
|
|
74
|
+
const r = await spawnReader(choice.cmd, args, stdin, cwd, TIMEOUT_MS);
|
|
75
|
+
const parsed = choice.client === 'claude' ? parseClaude(r.out) : parseCodex(r.out);
|
|
76
|
+
return { ...parsed, exit: r.exit, killed: r.killed };
|
|
77
|
+
}
|
|
78
|
+
export async function askReader(root, files, question, options = {}) {
|
|
79
|
+
if (!question.trim())
|
|
80
|
+
throw usage('--ask needs a question');
|
|
81
|
+
const choice = chooseReader(root);
|
|
82
|
+
if (!choice)
|
|
83
|
+
throw usage(NO_READER);
|
|
84
|
+
const bundle = bundleFiles(root, files, options);
|
|
85
|
+
const key = sessionKey(choice.client, bundle.text);
|
|
86
|
+
const existing = choice.client === 'custom' ? null : findSession(key, options.home, options.now);
|
|
87
|
+
const started = Date.now();
|
|
88
|
+
const r = await runChoice(choice, existing?.id ?? null, existing ? followUp(question) : firstMessage(choice, bundle, question), root, options.home);
|
|
89
|
+
const ms = Date.now() - started;
|
|
90
|
+
if (r.killed)
|
|
91
|
+
throw usage(`the reader gave no answer within ${TIMEOUT_MS}ms: ${choice.label}`);
|
|
92
|
+
if (r.exit !== 0)
|
|
93
|
+
throw usage(`the reader failed (exit ${r.exit ?? 'none'}): ${choice.label}${r.reply.trim() ? `\n${r.reply.trim()}` : ''}`);
|
|
94
|
+
if (r.sessionId)
|
|
95
|
+
saveSession(key, { id: r.sessionId, client: choice.client, at: new Date(options.now ?? Date.now()).toISOString(), files: bundle.files, chars: bundle.chars }, options.home, options.now);
|
|
96
|
+
return { files: bundle.files, chars: bundle.chars, reader: choice.label, session: { id: r.sessionId, resumed: existing !== null }, usage: r.usage, reply: r.reply.trim(), ms };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/core/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { ensureDir, readJson, writeJson } from './store.js';
|
|
6
|
+
export const SESSION_TTL_MS = 60 * 60 * 1000;
|
|
7
|
+
const MAX_CAPTURE = 1024 * 1024;
|
|
8
|
+
export function readerHome(home = process.env['VIBE_HOME_DIR'] ?? os.homedir()) {
|
|
9
|
+
return path.join(home, '.config', 'vibe', 'reader');
|
|
10
|
+
}
|
|
11
|
+
export function sessionKey(client, bundleText) {
|
|
12
|
+
return createHash('sha256').update(`${client}\n${bundleText}`).digest('hex').slice(0, 24);
|
|
13
|
+
}
|
|
14
|
+
function sessionsFile(home) {
|
|
15
|
+
return path.join(readerHome(home), 'sessions.json');
|
|
16
|
+
}
|
|
17
|
+
export function findSession(key, home, now = Date.now()) {
|
|
18
|
+
const all = readJson(sessionsFile(home)) ?? {};
|
|
19
|
+
const entry = all[key];
|
|
20
|
+
if (!entry)
|
|
21
|
+
return null;
|
|
22
|
+
return now - new Date(entry.at).getTime() <= SESSION_TTL_MS ? entry : null;
|
|
23
|
+
}
|
|
24
|
+
/** Store one entry and drop every expired one on the way. */
|
|
25
|
+
export function saveSession(key, entry, home, now = Date.now()) {
|
|
26
|
+
const all = readJson(sessionsFile(home)) ?? {};
|
|
27
|
+
const kept = {};
|
|
28
|
+
for (const [k, e] of Object.entries(all))
|
|
29
|
+
if (now - new Date(e.at).getTime() <= SESSION_TTL_MS)
|
|
30
|
+
kept[k] = e;
|
|
31
|
+
kept[key] = entry;
|
|
32
|
+
ensureDir(readerHome(home));
|
|
33
|
+
writeJson(sessionsFile(home), kept);
|
|
34
|
+
}
|
|
35
|
+
export function hasCli(name) {
|
|
36
|
+
return spawnSync(name, ['--version'], { encoding: 'utf-8', timeout: 15_000, shell: process.platform === 'win32' }).status === 0;
|
|
37
|
+
}
|
|
38
|
+
/** Spawn a reader in the neutral directory with the prompt on stdin. `args` null means a shell command string. */
|
|
39
|
+
export function spawnReader(cmd, args, stdin, cwd, timeoutMs) {
|
|
40
|
+
return new Promise((resolve) => {
|
|
41
|
+
const env = { ...process.env };
|
|
42
|
+
delete env['CLAUDECODE']; // a nested client CLI must not think it is inside itself
|
|
43
|
+
const child = args === null
|
|
44
|
+
? spawn(cmd, { cwd, shell: true, env, stdio: ['pipe', 'pipe', 'pipe'] })
|
|
45
|
+
: spawn(cmd, args, { cwd, shell: process.platform === 'win32', env, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
46
|
+
let out = '';
|
|
47
|
+
let killed = false;
|
|
48
|
+
child.stdout.on('data', (chunk) => {
|
|
49
|
+
if (out.length < MAX_CAPTURE)
|
|
50
|
+
out += chunk.toString('utf-8');
|
|
51
|
+
});
|
|
52
|
+
child.stderr.on('data', () => undefined);
|
|
53
|
+
const timer = setTimeout(() => {
|
|
54
|
+
killed = true;
|
|
55
|
+
child.kill('SIGKILL');
|
|
56
|
+
}, timeoutMs);
|
|
57
|
+
child.on('error', () => resolve({ out, exit: null, killed }));
|
|
58
|
+
child.on('close', (code) => {
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
resolve({ out, exit: code, killed });
|
|
61
|
+
});
|
|
62
|
+
child.stdin.end(stdin);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const CLAUDE_SLIM = ['--output-format', 'json', '--model', 'haiku', '--tools', '', '--disable-slash-commands', '--strict-mcp-config', '--setting-sources', ''];
|
|
66
|
+
/** `claude -p` as a reader: its own system prompt, no tools, no settings, no project — the corpus is the only context. */
|
|
67
|
+
export function claudeArgs(instructions, resume) {
|
|
68
|
+
return ['-p', ...(resume ? ['--resume', resume] : []), '--system-prompt', instructions, ...CLAUDE_SLIM];
|
|
69
|
+
}
|
|
70
|
+
/** `codex exec` as a reader at its lowest reasoning; `--json` carries the thread id and the token usage. */
|
|
71
|
+
export function codexArgs(resume) {
|
|
72
|
+
const head = resume ? ['exec', '--skip-git-repo-check', 'resume', resume] : ['exec', '--skip-git-repo-check'];
|
|
73
|
+
return [...head, '--json', '-c', 'model_reasoning_effort=low', '-'];
|
|
74
|
+
}
|
|
75
|
+
export function parseClaude(out) {
|
|
76
|
+
try {
|
|
77
|
+
const j = JSON.parse(out);
|
|
78
|
+
const u = j.usage;
|
|
79
|
+
const usage = u ? { input: u.input_tokens ?? 0, cacheRead: u.cache_read_input_tokens ?? 0, cacheWrite: u.cache_creation_input_tokens ?? 0, output: u.output_tokens ?? 0 } : null;
|
|
80
|
+
return { reply: j.is_error ? '' : (j.result ?? ''), sessionId: j.session_id ?? null, usage };
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { reply: out, sessionId: null, usage: null };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function parseCodex(out) {
|
|
87
|
+
let reply = '';
|
|
88
|
+
let sessionId = null;
|
|
89
|
+
let usage = null;
|
|
90
|
+
for (const line of out.split('\n')) {
|
|
91
|
+
if (!line.trim().startsWith('{'))
|
|
92
|
+
continue;
|
|
93
|
+
let e;
|
|
94
|
+
try {
|
|
95
|
+
e = JSON.parse(line);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (e.type === 'thread.started' && e.thread_id)
|
|
101
|
+
sessionId = e.thread_id;
|
|
102
|
+
if (e.type === 'item.completed' && e.item?.type === 'agent_message' && typeof e.item.text === 'string')
|
|
103
|
+
reply = e.item.text;
|
|
104
|
+
if (e.type === 'turn.completed' && e.usage) {
|
|
105
|
+
const cached = e.usage.cached_input_tokens ?? 0;
|
|
106
|
+
usage = { input: Math.max(0, (e.usage.input_tokens ?? 0) - cached), cacheRead: cached, cacheWrite: e.usage.cache_write_input_tokens ?? 0, output: e.usage.output_tokens ?? 0 };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { reply, sessionId, usage };
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=readerSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readerSession.js","sourceRoot":"","sources":["../../src/core/readerSession.ts"],"names":[],"mappings":"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"}
|
package/dist/core/regress.js
CHANGED
|
@@ -15,10 +15,15 @@ import { ensureDir, readJson, readText, writeAtomic } from './store.js';
|
|
|
15
15
|
export function regressionsDir(root) {
|
|
16
16
|
return vibePath(root, 'regressions');
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
const ID_MAX = 40;
|
|
19
|
+
/** `r-<n>-<slug>` within the 40-character id rule — the slug gives way, the number never does. */
|
|
20
|
+
function regressionId(n, title) {
|
|
21
|
+
const prefix = `r-${n}-`;
|
|
22
|
+
const words = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
23
|
+
const slug = words.slice(0, ID_MAX - prefix.length).replace(/-+$/g, '');
|
|
24
|
+
return `${prefix}${slug || 'regression'}`.slice(0, ID_MAX).replace(/-+$/g, '');
|
|
20
25
|
}
|
|
21
|
-
|
|
26
|
+
function readRegressionFiles(root) {
|
|
22
27
|
const dir = regressionsDir(root);
|
|
23
28
|
if (!fs.existsSync(dir))
|
|
24
29
|
return [];
|
|
@@ -29,10 +34,18 @@ export function listRegressions(root) {
|
|
|
29
34
|
const text = readText(path.join(dir, name));
|
|
30
35
|
if (text === null)
|
|
31
36
|
continue;
|
|
32
|
-
|
|
37
|
+
const parsed = parseScenarios(text);
|
|
38
|
+
out.push({ name, scenarios: parsed.scenarios, rejections: parsed.rejections.map((r) => `${r.id}: ${r.reason}`) });
|
|
33
39
|
}
|
|
34
40
|
return out;
|
|
35
41
|
}
|
|
42
|
+
export function listRegressions(root) {
|
|
43
|
+
return readRegressionFiles(root).flatMap((f) => f.scenarios);
|
|
44
|
+
}
|
|
45
|
+
/** Regression files that parse to nothing — a silent gap in `check --all`, so the state view names them. */
|
|
46
|
+
export function regressionProblems(root) {
|
|
47
|
+
return readRegressionFiles(root).filter((f) => f.rejections.length > 0).map((f) => `regressions/${f.name} is not checked — ${f.rejections.join('; ')}`);
|
|
48
|
+
}
|
|
36
49
|
export function recordRegression(root, input) {
|
|
37
50
|
const source = loadScenarios(root).find((s) => s.id === input.scenario);
|
|
38
51
|
if (!source)
|
|
@@ -41,8 +54,8 @@ export function recordRegression(root, input) {
|
|
|
41
54
|
throw usage('a human scenario cannot become a regression check — it has no verdict');
|
|
42
55
|
if (!input.title.trim())
|
|
43
56
|
throw usage('--title is required');
|
|
44
|
-
const existing =
|
|
45
|
-
const id =
|
|
57
|
+
const existing = readRegressionFiles(root).length;
|
|
58
|
+
const id = regressionId(existing + 1, input.title);
|
|
46
59
|
let tail = '';
|
|
47
60
|
if (input.fromEvidence) {
|
|
48
61
|
const evidence = readJson(vibePath(root, 'evidence', `${input.fromEvidence}.json`));
|
|
@@ -56,6 +69,9 @@ export function recordRegression(root, input) {
|
|
|
56
69
|
const body = `# Regression check — ${input.title}\n# Source scenario: ${source.id}${tail ? `\n# Output at the time:\n${tail.split('\n').map((l) => `# ${l}`).join('\n')}` : ''}\n${YAML.stringify([entry])}`;
|
|
57
70
|
ensureDir(regressionsDir(root));
|
|
58
71
|
const file = path.join(regressionsDir(root), `${id}.yaml`);
|
|
72
|
+
const parsed = parseScenarios(body);
|
|
73
|
+
if (parsed.scenarios.length !== 1)
|
|
74
|
+
throw usage(`the regression would not parse: ${parsed.rejections.map((r) => r.reason).join('; ')}`);
|
|
59
75
|
writeAtomic(file, body);
|
|
60
76
|
const edges = [{ type: 'caused', from: `regression:${id}`, to: `scenario:${source.id}` }];
|
|
61
77
|
if (input.fromEvidence)
|
package/dist/core/regress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regress.js","sourceRoot":"","sources":["../../src/core/regress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAa,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC;AAQD,SAAS,
|
|
1
|
+
{"version":3,"file":"regress.js","sourceRoot":"","sources":["../../src/core/regress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAa,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC;AAQD,MAAM,MAAM,GAAG,EAAE,CAAC;AAElB,kGAAkG;AAClG,SAAS,YAAY,CAAC,CAAS,EAAE,KAAa;IAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,GAAG,MAAM,GAAG,IAAI,IAAI,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,GAAG,GAAyE,EAAE,CAAC;IACrF,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1J,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAA4B;IACzE,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM;QAAE,MAAM,KAAK,CAAC,qBAAqB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,MAAM,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACxH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAClD,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,QAAQ,CAAqD,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,YAAY,OAAO,CAAC,CAAC,CAAC;QACxI,IAAI,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,KAAK,CAAC,KAAK,aAAa,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IAC/H,IAAI,MAAM,CAAC,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC7C,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,wBAAwB,KAAK,CAAC,KAAK,wBAAwB,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,4BAA4B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC/M,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,KAAK,CAAC,mCAAmC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClG,IAAI,KAAK,CAAC,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAClH,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/core/scenarios.js
CHANGED
|
@@ -53,6 +53,9 @@ function checkReason(check) {
|
|
|
53
53
|
case 'review': {
|
|
54
54
|
if (!str(check['path']))
|
|
55
55
|
return 'review check requires path (the manuscript)';
|
|
56
|
+
const pack = check['pack'];
|
|
57
|
+
if (pack !== undefined && (typeof pack !== 'string' || !/^[a-z0-9]+(-[a-z0-9]+)*$/.test(pack)))
|
|
58
|
+
return 'review pack must be a reviewers/ directory name';
|
|
56
59
|
const lang = check['lang'];
|
|
57
60
|
return lang === undefined || lang === 'ko' || lang === 'en' ? null : 'review lang must be ko or en';
|
|
58
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../src/core/scenarios.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../src/core/scenarios.ts"],"names":[],"mappings":"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"}
|
package/dist/core/view.js
CHANGED
|
@@ -2,7 +2,7 @@ import { invalidateDoneIfEdited, readResults } from './check.js';
|
|
|
2
2
|
import { openQuestions } from './inbox.js';
|
|
3
3
|
import { hasIntent, intentPath, loadScenarios } from './intent.js';
|
|
4
4
|
import { readLedger } from './ledger.js';
|
|
5
|
-
import { listRegressions } from './regress.js';
|
|
5
|
+
import { listRegressions, regressionProblems } from './regress.js';
|
|
6
6
|
import { isHuman } from './scenarios.js';
|
|
7
7
|
import { suggestSkills } from './skills.js';
|
|
8
8
|
import { readState, stageOf } from './state.js';
|
|
@@ -51,6 +51,7 @@ export function buildStateView(root, cwd = process.cwd()) {
|
|
|
51
51
|
});
|
|
52
52
|
const lastEvent = readLedger(root).at(-1);
|
|
53
53
|
const intent = hasIntent(root) ? { title: intentTitle(root), hash: state.intentHash, approvedAt: state.approvedAt } : null;
|
|
54
|
+
notices.push(...regressionProblems(root));
|
|
54
55
|
if (state.state === 'STUCK')
|
|
55
56
|
notices.push('STUCK — the same failure twice in a row; the inbox question needs an answer');
|
|
56
57
|
if (scenarios.some(isHuman) && state.state === 'DONE')
|
package/dist/core/view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/core/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/core/view.ts"],"names":[],"mappings":"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"}
|
package/dist/install/hooks.js
CHANGED
|
@@ -10,19 +10,20 @@ function wantedHooks() {
|
|
|
10
10
|
return [
|
|
11
11
|
['PostToolUse', 'Edit|Write|MultiEdit|NotebookEdit', notifyCommand('post')],
|
|
12
12
|
['PreToolUse', 'Bash', notifyCommand('pre')],
|
|
13
|
+
['PreToolUse', 'Read', notifyCommand('pre')],
|
|
13
14
|
];
|
|
14
15
|
}
|
|
15
16
|
function isNotify(entry) {
|
|
16
17
|
return entry.hooks.some((h) => h.command.includes(NOTIFY_MARK));
|
|
17
18
|
}
|
|
18
|
-
/** Notification hook — it never judges. Other hooks in the file are left alone;
|
|
19
|
+
/** Notification hook — it never judges. Other hooks in the file are left alone; notify entries from another install path are replaced. */
|
|
19
20
|
export function installHookFile(file) {
|
|
20
21
|
const settings = readJson(file) ?? {};
|
|
21
|
-
const hooks = {
|
|
22
|
-
for (const [event,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
const hooks = {};
|
|
23
|
+
for (const [event, list] of Object.entries(settings.hooks ?? {}))
|
|
24
|
+
hooks[event] = list.filter((entry) => !isNotify(entry));
|
|
25
|
+
for (const [event, matcher, command] of wantedHooks())
|
|
26
|
+
hooks[event] = [...(hooks[event] ?? []), { matcher, hooks: [{ type: 'command', command, timeout: 20 }] }];
|
|
26
27
|
const next = { ...settings, hooks };
|
|
27
28
|
if (JSON.stringify(next) === JSON.stringify(settings))
|
|
28
29
|
return 'unchanged';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/install/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAY9E,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC,SAAS,aAAa,CAAC,IAAoB;IACzC,OAAO,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;QACL,CAAC,aAAa,EAAE,mCAAmC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgB;IAChC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/install/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/install/plugin.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
import { packStages } from '../core/checks/packs.js';
|
|
4
5
|
import { packageRoot } from '../core/paths.js';
|
|
5
6
|
import { ensureDir, readJson, writeAtomic, writeJson } from '../core/store.js';
|
|
6
7
|
import { pluginTree } from './tree.js';
|
|
@@ -45,14 +46,18 @@ function tomlString(text) {
|
|
|
45
46
|
const escaped = text.replace(/\\/g, '\\\\').replace(new RegExp(FENCE, 'g'), '\\"\\"\\"');
|
|
46
47
|
return [FENCE, escaped, FENCE].join('\n');
|
|
47
48
|
}
|
|
48
|
-
/** Codex reads custom agents as TOML (name · description · developer_instructions); one per reviewer
|
|
49
|
-
export function codexAgentToml(
|
|
50
|
-
|
|
51
|
-
if (!fs.existsSync(file))
|
|
49
|
+
/** Codex reads custom agents as TOML (name · description · developer_instructions); one per reviewer stage. */
|
|
50
|
+
export function codexAgentToml(pack, stage) {
|
|
51
|
+
if (!fs.existsSync(stage.file))
|
|
52
52
|
return null;
|
|
53
|
-
const body = fs.readFileSync(file, 'utf-8').trim();
|
|
54
|
-
const role = stage
|
|
55
|
-
|
|
53
|
+
const body = fs.readFileSync(stage.file, 'utf-8').trim();
|
|
54
|
+
const role = `stage ${stage.order} ${stage.name.replace(/-/g, ' ')}`;
|
|
55
|
+
const name = agentName(pack, stage);
|
|
56
|
+
return `# Generated by vibe from reviewers/${pack}/${stage.order}-${stage.name}.md — the ${role} of the antislop-${pack} pack.\nname = "${name}"\ndescription = "antislop-${pack} ${role}: judges the submitted artifact and returns only PASS or a REJECT list; never rewrites."\ndeveloper_instructions = ${tomlString(body)}\n`;
|
|
57
|
+
}
|
|
58
|
+
/** The agent name a client sees: the text packs keep `ko-copy-editor`, other packs read `design-art-director`. */
|
|
59
|
+
export function agentName(pack, stage) {
|
|
60
|
+
return `${pack}-${stage.name}`;
|
|
56
61
|
}
|
|
57
62
|
function packageVersion() {
|
|
58
63
|
return readJson(path.join(packageRoot(), 'package.json'))?.version ?? '0.0.0';
|
|
@@ -73,14 +78,15 @@ export function assemblePlugin(tree) {
|
|
|
73
78
|
fs.cpSync(from, path.join(tree, 'skills', name), { recursive: true });
|
|
74
79
|
written.push(`skills/${name}`);
|
|
75
80
|
}
|
|
76
|
-
for (const
|
|
77
|
-
const
|
|
78
|
-
for (const stage of
|
|
79
|
-
const toml = codexAgentToml(
|
|
81
|
+
for (const skill of languagePacks()) {
|
|
82
|
+
const pack = skill.replace('antislop-', '');
|
|
83
|
+
for (const stage of packStages(pack)) {
|
|
84
|
+
const toml = codexAgentToml(pack, stage);
|
|
80
85
|
if (!toml)
|
|
81
86
|
continue;
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
const name = `${agentName(pack, stage)}.toml`;
|
|
88
|
+
writeAtomic(path.join(tree, 'agents', name), toml);
|
|
89
|
+
written.push(`agents/${name}`);
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
92
|
writeAtomic(path.join(tree, 'hooks', 'codex-hooks.json'), generated['hooks/codex-hooks.json']);
|