@jigyasudham/veto 3.3.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -7
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/agents/llm-runner.d.ts.map +1 -1
- package/dist/agents/llm-runner.js +78 -8
- package/dist/agents/llm-runner.js.map +1 -1
- package/dist/cli/context-guidance.d.ts +16 -0
- package/dist/cli/context-guidance.d.ts.map +1 -0
- package/dist/cli/context-guidance.js +20 -0
- package/dist/cli/context-guidance.js.map +1 -0
- package/dist/cli/leftover-guides.d.ts +38 -0
- package/dist/cli/leftover-guides.d.ts.map +1 -0
- package/dist/cli/leftover-guides.js +135 -0
- package/dist/cli/leftover-guides.js.map +1 -0
- package/dist/cli/lessons.d.ts +17 -0
- package/dist/cli/lessons.d.ts.map +1 -0
- package/dist/cli/lessons.js +448 -0
- package/dist/cli/lessons.js.map +1 -0
- package/dist/cli/statusline-hosts.d.ts +36 -0
- package/dist/cli/statusline-hosts.d.ts.map +1 -0
- package/dist/cli/statusline-hosts.js +212 -0
- package/dist/cli/statusline-hosts.js.map +1 -0
- package/dist/cli/statusline.d.ts +7 -0
- package/dist/cli/statusline.d.ts.map +1 -1
- package/dist/cli/statusline.js +69 -11
- package/dist/cli/statusline.js.map +1 -1
- package/dist/cli.js +114 -47
- package/dist/cli.js.map +1 -1
- package/dist/council/llm-council.d.ts.map +1 -1
- package/dist/council/llm-council.js +13 -8
- package/dist/council/llm-council.js.map +1 -1
- package/dist/lessons/adapters/claude.d.ts +10 -0
- package/dist/lessons/adapters/claude.d.ts.map +1 -0
- package/dist/lessons/adapters/claude.js +18 -0
- package/dist/lessons/adapters/claude.js.map +1 -0
- package/dist/lessons/adapters/codex.d.ts +7 -0
- package/dist/lessons/adapters/codex.d.ts.map +1 -0
- package/dist/lessons/adapters/codex.js +9 -0
- package/dist/lessons/adapters/codex.js.map +1 -0
- package/dist/lessons/adapters/gemini.d.ts +4 -0
- package/dist/lessons/adapters/gemini.d.ts.map +1 -0
- package/dist/lessons/adapters/gemini.js +44 -0
- package/dist/lessons/adapters/gemini.js.map +1 -0
- package/dist/lessons/adapters/index.d.ts +6 -0
- package/dist/lessons/adapters/index.d.ts.map +1 -0
- package/dist/lessons/adapters/index.js +14 -0
- package/dist/lessons/adapters/index.js.map +1 -0
- package/dist/lessons/adapters/markdown.d.ts +16 -0
- package/dist/lessons/adapters/markdown.d.ts.map +1 -0
- package/dist/lessons/adapters/markdown.js +130 -0
- package/dist/lessons/adapters/markdown.js.map +1 -0
- package/dist/lessons/adapters/types.d.ts +27 -0
- package/dist/lessons/adapters/types.d.ts.map +1 -0
- package/dist/lessons/adapters/types.js +2 -0
- package/dist/lessons/adapters/types.js.map +1 -0
- package/dist/lessons/classify.d.ts +33 -0
- package/dist/lessons/classify.d.ts.map +1 -0
- package/dist/lessons/classify.js +108 -0
- package/dist/lessons/classify.js.map +1 -0
- package/dist/lessons/consent.d.ts +30 -0
- package/dist/lessons/consent.d.ts.map +1 -0
- package/dist/lessons/consent.js +86 -0
- package/dist/lessons/consent.js.map +1 -0
- package/dist/lessons/discover.d.ts +26 -0
- package/dist/lessons/discover.d.ts.map +1 -0
- package/dist/lessons/discover.js +65 -0
- package/dist/lessons/discover.js.map +1 -0
- package/dist/lessons/harvest.d.ts +84 -0
- package/dist/lessons/harvest.d.ts.map +1 -0
- package/dist/lessons/harvest.js +271 -0
- package/dist/lessons/harvest.js.map +1 -0
- package/dist/lessons/identity.d.ts +23 -0
- package/dist/lessons/identity.d.ts.map +1 -0
- package/dist/lessons/identity.js +81 -0
- package/dist/lessons/identity.js.map +1 -0
- package/dist/lessons/manage.d.ts +163 -0
- package/dist/lessons/manage.d.ts.map +1 -0
- package/dist/lessons/manage.js +337 -0
- package/dist/lessons/manage.js.map +1 -0
- package/dist/lessons/mask.d.ts +6 -0
- package/dist/lessons/mask.d.ts.map +1 -0
- package/dist/lessons/mask.js +22 -0
- package/dist/lessons/mask.js.map +1 -0
- package/dist/lessons/on-save.d.ts +18 -0
- package/dist/lessons/on-save.d.ts.map +1 -0
- package/dist/lessons/on-save.js +53 -0
- package/dist/lessons/on-save.js.map +1 -0
- package/dist/lessons/select.d.ts +23 -0
- package/dist/lessons/select.d.ts.map +1 -0
- package/dist/lessons/select.js +136 -0
- package/dist/lessons/select.js.map +1 -0
- package/dist/lessons/source-project.d.ts +9 -0
- package/dist/lessons/source-project.d.ts.map +1 -0
- package/dist/lessons/source-project.js +149 -0
- package/dist/lessons/source-project.js.map +1 -0
- package/dist/lessons/store.d.ts +135 -0
- package/dist/lessons/store.d.ts.map +1 -0
- package/dist/lessons/store.js +222 -0
- package/dist/lessons/store.js.map +1 -0
- package/dist/memory/config.d.ts +27 -0
- package/dist/memory/config.d.ts.map +1 -1
- package/dist/memory/config.js +67 -0
- package/dist/memory/config.js.map +1 -1
- package/dist/memory/local.d.ts.map +1 -1
- package/dist/memory/local.js +19 -1
- package/dist/memory/local.js.map +1 -1
- package/dist/memory/schema.d.ts +1 -1
- package/dist/memory/schema.d.ts.map +1 -1
- package/dist/memory/schema.js +104 -0
- package/dist/memory/schema.js.map +1 -1
- package/dist/server/handlers/council.d.ts.map +1 -1
- package/dist/server/handlers/council.js +40 -4
- package/dist/server/handlers/council.js.map +1 -1
- package/dist/server/handlers/memory.d.ts.map +1 -1
- package/dist/server/handlers/memory.js +13 -3
- package/dist/server/handlers/memory.js.map +1 -1
- package/dist/server/handlers/session.d.ts.map +1 -1
- package/dist/server/handlers/session.js +61 -21
- package/dist/server/handlers/session.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -3
- package/dist/server.js.map +1 -1
- package/dist/transcripts/cache.d.ts +1 -0
- package/dist/transcripts/cache.d.ts.map +1 -1
- package/dist/transcripts/cache.js +0 -0
- package/dist/transcripts/cache.js.map +1 -1
- package/dist/transcripts/claude-paths.d.ts +5 -0
- package/dist/transcripts/claude-paths.d.ts.map +1 -0
- package/dist/transcripts/claude-paths.js +21 -0
- package/dist/transcripts/claude-paths.js.map +1 -0
- package/dist/transcripts/context.d.ts +41 -0
- package/dist/transcripts/context.d.ts.map +1 -0
- package/dist/transcripts/context.js +144 -0
- package/dist/transcripts/context.js.map +1 -0
- package/dist/transcripts/discover.d.ts +12 -2
- package/dist/transcripts/discover.d.ts.map +1 -1
- package/dist/transcripts/discover.js +55 -7
- package/dist/transcripts/discover.js.map +1 -1
- package/dist/transcripts/manage.d.ts +8 -0
- package/dist/transcripts/manage.d.ts.map +1 -1
- package/dist/transcripts/manage.js +28 -13
- package/dist/transcripts/manage.js.map +1 -1
- package/dist/transcripts/mapping.d.ts.map +1 -1
- package/dist/transcripts/mapping.js +4 -2
- package/dist/transcripts/mapping.js.map +1 -1
- package/dist/transcripts/on-save.d.ts +9 -0
- package/dist/transcripts/on-save.d.ts.map +1 -1
- package/dist/transcripts/on-save.js +36 -9
- package/dist/transcripts/on-save.js.map +1 -1
- package/dist/transcripts/project-key.d.ts +4 -0
- package/dist/transcripts/project-key.d.ts.map +1 -0
- package/dist/transcripts/project-key.js +30 -0
- package/dist/transcripts/project-key.js.map +1 -0
- package/dist/transcripts/recall.d.ts +4 -0
- package/dist/transcripts/recall.d.ts.map +1 -1
- package/dist/transcripts/recall.js +6 -5
- package/dist/transcripts/recall.js.map +1 -1
- package/dist/transcripts/stopwords.d.ts +2 -0
- package/dist/transcripts/stopwords.d.ts.map +1 -0
- package/dist/transcripts/stopwords.js +8 -0
- package/dist/transcripts/stopwords.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
// Suppress Node experimental warnings (node:sqlite) for clean UX
|
|
4
4
|
process.removeAllListeners('warning');
|
|
5
5
|
import { mkdirSync, existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
6
|
-
import { join, dirname, resolve } from 'node:path';
|
|
6
|
+
import { join, dirname, resolve, basename } from 'node:path';
|
|
7
7
|
import { execSync } from 'node:child_process';
|
|
8
8
|
import { homedir } from 'node:os';
|
|
9
9
|
import { fileURLToPath } from 'node:url';
|
|
10
10
|
import { repairBrokenClaudeEntry } from './cli/claude-repair.js';
|
|
11
|
+
import { writeContextGuidance } from './cli/context-guidance.js';
|
|
11
12
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
13
|
const { version: VERSION } = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
|
|
13
14
|
const TAGLINE = '93 agentic tools. 49 specialists. Every major AI CLI. Self-learning. Zero extra cost on subscriptions.';
|
|
@@ -343,45 +344,41 @@ Recommended start sequence:
|
|
|
343
344
|
5. veto_session_save — checkpoint before context fills
|
|
344
345
|
`;
|
|
345
346
|
let ctxWritten = 0;
|
|
346
|
-
//
|
|
347
|
+
// Native AI memory files are deliberately never written by Veto. Their
|
|
348
|
+
// respective CLIs own those files; replacing them would hide user knowledge.
|
|
347
349
|
const geminiDir = join(HOME, '.gemini');
|
|
348
|
-
|
|
349
|
-
try {
|
|
350
|
-
writeFileSync(join(geminiDir, 'GEMINI.md'), VETO_GUIDE, 'utf8');
|
|
351
|
-
console.log(c.green(' ✓ ') + 'Gemini/Antigravity CLI — wrote ~/.gemini/GEMINI.md');
|
|
352
|
-
ctxWritten++;
|
|
353
|
-
}
|
|
354
|
-
catch {
|
|
355
|
-
console.log(c.yellow(' ⚠ ') + 'Gemini/Antigravity CLI — could not write GEMINI.md');
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
// Codex CLI: project AGENTS.md + global ~/.codex/AGENTS.override.md
|
|
350
|
+
// Codex gets an optional project guide only when no user guide exists.
|
|
359
351
|
const codexDir2 = join(HOME, '.codex');
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
try {
|
|
365
|
-
writeFileSync(projectAgents, VETO_GUIDE, 'utf8');
|
|
366
|
-
console.log(c.green(' ✓ ') + `Codex CLI — wrote AGENTS.md in ${cwd}`);
|
|
367
|
-
ctxWritten++;
|
|
368
|
-
}
|
|
369
|
-
catch {
|
|
370
|
-
console.log(c.yellow(' ⚠ ') + 'Codex CLI — could not write AGENTS.md');
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
else {
|
|
374
|
-
console.log(c.dim(' · ') + c.dim('Codex CLI — AGENTS.md already exists, skipping'));
|
|
352
|
+
try {
|
|
353
|
+
const guidance = writeContextGuidance({ cwd, geminiDir, codexDir: codexDir2, guide: VETO_GUIDE });
|
|
354
|
+
if (guidance.geminiMemorySkipped) {
|
|
355
|
+
console.log(c.dim(' · ') + c.dim("Gemini/Antigravity CLI — Veto does not write GEMINI.md (it is Gemini's own memory file)"));
|
|
375
356
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
writeFileSync(join(codexDir2, 'AGENTS.override.md'), VETO_GUIDE, 'utf8');
|
|
379
|
-
console.log(c.green(' ✓ ') + 'Codex CLI — wrote ~/.codex/AGENTS.override.md');
|
|
357
|
+
if (guidance.projectAgents === 'created') {
|
|
358
|
+
console.log(c.green(' ✓ ') + `Codex CLI — wrote AGENTS.md in ${cwd}`);
|
|
380
359
|
ctxWritten++;
|
|
381
360
|
}
|
|
382
|
-
|
|
383
|
-
console.log(c.
|
|
361
|
+
else if (guidance.projectAgents === 'existing') {
|
|
362
|
+
console.log(c.dim(' · ') + c.dim('Codex CLI — AGENTS.md already exists, skipping'));
|
|
384
363
|
}
|
|
364
|
+
if (guidance.codexOverrideSkipped) {
|
|
365
|
+
console.log(c.dim(' · ') + c.dim("Codex CLI — Veto does not write ~/.codex/AGENTS.override.md (it would hide your AGENTS.md)"));
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
console.log(c.yellow(' ⚠ ') + 'Codex CLI — could not write project AGENTS.md');
|
|
370
|
+
}
|
|
371
|
+
// Older inits wrote Veto's guide INTO those native files. Copies that are
|
|
372
|
+
// nothing but a guide Veto wrote are renamed aside; anything else is left alone.
|
|
373
|
+
const { moveAsideLeftoverGuides, describeLeftover } = await import('./cli/leftover-guides.js');
|
|
374
|
+
const leftovers = moveAsideLeftoverGuides(HOME);
|
|
375
|
+
for (const moved of leftovers.moved) {
|
|
376
|
+
console.log(c.green(' ✓ ') + `${describeLeftover(moved, HOME)} — renamed to ${basename(moved.backupPath)}`);
|
|
377
|
+
}
|
|
378
|
+
for (const kept of leftovers.kept) {
|
|
379
|
+
console.log(c.yellow(' ⚠ ') + describeLeftover(kept, HOME) + (kept.kind === 'exact'
|
|
380
|
+
? ' — could not be renamed; move it aside by hand'
|
|
381
|
+
: ' — left as is; delete the "# Veto MCP Server" block by hand if you like'));
|
|
385
382
|
}
|
|
386
383
|
// Windsurf: ~/.codeium/windsurf/rules/veto.md
|
|
387
384
|
const windsurfRulesDir = join(HOME, '.codeium', 'windsurf', 'rules');
|
|
@@ -557,7 +554,7 @@ Recommended start sequence:
|
|
|
557
554
|
}
|
|
558
555
|
}
|
|
559
556
|
// ─── Doctor Command ─────────────────────────────────────────────────────────────
|
|
560
|
-
async function doctorCommand() {
|
|
557
|
+
async function doctorCommand(fix = false) {
|
|
561
558
|
console.log('');
|
|
562
559
|
console.log(c.bold(' Veto Doctor') + c.dim(' — system health check'));
|
|
563
560
|
console.log(c.dim(' ─────────────────────────────────────────────────────'));
|
|
@@ -665,6 +662,27 @@ async function doctorCommand() {
|
|
|
665
662
|
// that fails because an optional dependency is absent.
|
|
666
663
|
console.log(` ${c.dim('·')} Semantic search unavailable ${c.dim('— recall would run keyword-only')}`);
|
|
667
664
|
}
|
|
665
|
+
// Leftovers from older inits, which wrote Veto's guide into Codex's and
|
|
666
|
+
// Gemini's own files. --fix renames copies that are nothing but that guide.
|
|
667
|
+
try {
|
|
668
|
+
const { findLeftoverGuides, moveAsideLeftoverGuides, describeLeftover } = await import('./cli/leftover-guides.js');
|
|
669
|
+
const moved = fix ? moveAsideLeftoverGuides(HOME).moved : [];
|
|
670
|
+
for (const m of moved) {
|
|
671
|
+
console.log(` ${c.green('✓')} ${describeLeftover(m, HOME)} — renamed to ${basename(m.backupPath)}`);
|
|
672
|
+
}
|
|
673
|
+
const remaining = findLeftoverGuides(HOME);
|
|
674
|
+
for (const guide of remaining) {
|
|
675
|
+
console.log(` ${c.yellow('⚠')} ${describeLeftover(guide, HOME)}`);
|
|
676
|
+
console.log(` ${c.dim(guide.kind === 'exact'
|
|
677
|
+
? ` fix: ${c.cyan('veto doctor --fix')} (renames only this Veto-written copy to ${basename(guide.path)}.veto-backup)`
|
|
678
|
+
: ' Veto will not edit a file with your own content in it; delete the "# Veto MCP Server" block by hand')}`);
|
|
679
|
+
issues++;
|
|
680
|
+
}
|
|
681
|
+
if (!remaining.length && !moved.length && (existsSync(join(HOME, '.codex')) || existsSync(join(HOME, '.gemini')))) {
|
|
682
|
+
console.log(` ${c.green('✓')} No old Veto guide in Codex or Gemini files`);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
catch { /* a health check never fails on its own checks */ }
|
|
668
686
|
console.log('');
|
|
669
687
|
console.log(' ' + c.bold('MCP Registrations'));
|
|
670
688
|
console.log(c.dim(' ─────────────────────────────────────────────────────'));
|
|
@@ -953,6 +971,32 @@ async function statuslineCommand() {
|
|
|
953
971
|
const force = args.includes('--force') || args.includes('--yes') || args.includes('-y');
|
|
954
972
|
const dryRun = args.includes('--dry-run');
|
|
955
973
|
const sl = await import('./cli/statusline.js');
|
|
974
|
+
// Codex and Gemini cannot run a status-line command, so their line is drawn by
|
|
975
|
+
// Veto itself: `watch` in a split pane, or `print --client=…` for one line
|
|
976
|
+
// (tmux status-right, scripts). Nothing here reads stdin or writes a file.
|
|
977
|
+
const hostClient = clientArg === 'codex' || clientArg === 'gemini' ? clientArg : null;
|
|
978
|
+
const projectFlag = args.find(a => a.startsWith('--dir='))?.slice('--dir='.length);
|
|
979
|
+
const projectDir = resolve(projectFlag || process.cwd());
|
|
980
|
+
if (sub === 'watch') {
|
|
981
|
+
const hosts = await import('./cli/statusline-hosts.js');
|
|
982
|
+
const explicit = args.find(a => a.startsWith('--client='))?.split('=')[1];
|
|
983
|
+
const host = explicit === 'claude' || explicit === 'codex' || explicit === 'gemini' ? explicit : undefined;
|
|
984
|
+
const seconds = Number(args.find(a => a.startsWith('--interval='))?.split('=')[1] ?? 5);
|
|
985
|
+
await hosts.watchStatusline({ host, projectDir, intervalMs: (Number.isFinite(seconds) ? seconds : 5) * 1000 });
|
|
986
|
+
process.exit(0);
|
|
987
|
+
}
|
|
988
|
+
if (sub === 'print' && hostClient) {
|
|
989
|
+
const hosts = await import('./cli/statusline-hosts.js');
|
|
990
|
+
process.stdout.write(hosts.renderHostStatusline(hostClient, projectDir) + '\n', () => process.exit(0));
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
if (sub === 'install' && hostClient) {
|
|
994
|
+
const hosts = await import('./cli/statusline-hosts.js');
|
|
995
|
+
console.log('');
|
|
996
|
+
console.log(' ' + hosts.watchSetupGuide(hostClient, projectDir).replace(/\n/g, '\n '));
|
|
997
|
+
console.log('');
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
956
1000
|
// Hot path: one line to stdout, nothing else. No banner, no colors-config noise.
|
|
957
1001
|
if (sub === 'print') {
|
|
958
1002
|
// --capture <file>: verification aid — log the raw Claude Code payload next to
|
|
@@ -994,12 +1038,14 @@ async function statuslineCommand() {
|
|
|
994
1038
|
console.log(` Settings: ${c.dim(info.settingsPath)}`);
|
|
995
1039
|
console.log(` Sample: ${info.sample}`);
|
|
996
1040
|
console.log('');
|
|
997
|
-
console.log(c.dim('
|
|
1041
|
+
console.log(c.dim(' Claude Code: veto statusline install [--force] [--dry-run]'));
|
|
1042
|
+
console.log(c.dim(' Codex / Gemini (no custom status line): veto statusline watch — runs in a pane beside the AI;'));
|
|
1043
|
+
console.log(c.dim(' setup for your terminal: veto statusline install --client=codex|gemini'));
|
|
998
1044
|
console.log('');
|
|
999
1045
|
return;
|
|
1000
1046
|
}
|
|
1001
1047
|
console.error(c.red(` Unknown statusline subcommand: ${sub}`));
|
|
1002
|
-
console.error(c.dim(' Usage: veto statusline <install|uninstall|print|status>'));
|
|
1048
|
+
console.error(c.dim(' Usage: veto statusline <install|uninstall|print|status|watch> [--client=claude|codex|gemini] [--dir=<project>] [--interval=<seconds>]'));
|
|
1003
1049
|
process.exit(1);
|
|
1004
1050
|
}
|
|
1005
1051
|
async function transcriptsCommand() {
|
|
@@ -1075,7 +1121,7 @@ async function transcriptsCommand() {
|
|
|
1075
1121
|
console.log('');
|
|
1076
1122
|
console.log(c.bold(' Transcript sources'));
|
|
1077
1123
|
console.log(c.dim(' ─────────────────────────────────────────────────────'));
|
|
1078
|
-
console.log(` ${c.cyan('claude')} ${c.dim('mapped live by the statusline
|
|
1124
|
+
console.log(` ${c.cyan('claude')} ${c.dim('mapped live by the statusline, or found in ~/.claude/projects at save time')}`);
|
|
1079
1125
|
for (const [name, find, dir] of [
|
|
1080
1126
|
['codex', discoverCodexSessions, codexSessionsDir()],
|
|
1081
1127
|
['gemini', discoverGeminiSessions, geminiTmpDir()],
|
|
@@ -1120,15 +1166,17 @@ async function transcriptsCommand() {
|
|
|
1120
1166
|
return;
|
|
1121
1167
|
}
|
|
1122
1168
|
if (sub === 'show') {
|
|
1123
|
-
|
|
1169
|
+
// Any CLI's session by default; --source=<claude|codex|gemini> narrows it.
|
|
1170
|
+
const id = args.find(a => !a.startsWith('--'));
|
|
1171
|
+
const source = args.find(a => a.startsWith('--source='))?.split('=')[1];
|
|
1124
1172
|
if (!id) {
|
|
1125
|
-
console.error(c.red(' Usage: veto transcripts show <source_session_id>'));
|
|
1173
|
+
console.error(c.red(' Usage: veto transcripts show <source_session_id> [--source=claude|codex|gemini]'));
|
|
1126
1174
|
process.exit(1);
|
|
1127
1175
|
}
|
|
1128
1176
|
const { showArchive, fmtBytes } = await import('./transcripts/manage.js');
|
|
1129
1177
|
const { renderTOC } = await import('./transcripts/toc.js');
|
|
1130
1178
|
const { renderFacts } = await import('./transcripts/pyramid.js');
|
|
1131
|
-
const d = showArchive(id);
|
|
1179
|
+
const d = showArchive(id, source);
|
|
1132
1180
|
if (!d) {
|
|
1133
1181
|
console.error(c.red(` No archive for session ${id}`));
|
|
1134
1182
|
process.exit(1);
|
|
@@ -1149,6 +1197,7 @@ async function transcriptsCommand() {
|
|
|
1149
1197
|
if (sub === 'purge') {
|
|
1150
1198
|
const { purgeSession, purgeProject, purgeAll } = await import('./transcripts/manage.js');
|
|
1151
1199
|
const projFlag = args.find(a => a.startsWith('--project='))?.split('=')[1];
|
|
1200
|
+
const source = args.find(a => a.startsWith('--source='))?.split('=')[1];
|
|
1152
1201
|
const all = args.includes('--all');
|
|
1153
1202
|
const id = args.find(a => !a.startsWith('--'));
|
|
1154
1203
|
let r;
|
|
@@ -1157,13 +1206,19 @@ async function transcriptsCommand() {
|
|
|
1157
1206
|
else if (projFlag)
|
|
1158
1207
|
r = purgeProject(projFlag);
|
|
1159
1208
|
else if (id)
|
|
1160
|
-
r = purgeSession(id);
|
|
1209
|
+
r = purgeSession(id, source);
|
|
1161
1210
|
else {
|
|
1162
|
-
console.error(c.red(' Usage: veto transcripts purge <source_session_id> | --project=<dir> | --all'));
|
|
1211
|
+
console.error(c.red(' Usage: veto transcripts purge <source_session_id> [--source=claude|codex|gemini] | --project=<dir> | --all'));
|
|
1163
1212
|
process.exit(1);
|
|
1164
1213
|
}
|
|
1165
1214
|
console.log('');
|
|
1166
|
-
|
|
1215
|
+
// Nothing matched is not a success: say so instead of a green "✓ Purged 0".
|
|
1216
|
+
if (r.archives === 0 && r.mappings === 0) {
|
|
1217
|
+
console.log(c.yellow(` ⚠ Nothing matched${id && !all && !projFlag ? ` session ${id}` : ''} — no archive was deleted. See ${c.cyan('veto transcripts list')}.`));
|
|
1218
|
+
}
|
|
1219
|
+
else {
|
|
1220
|
+
console.log(c.green(` ✓ Purged ${r.archives} archive(s): ${r.events} events, ${r.indexRows} index rows, ${r.files} file(s), ${r.mappings} mapping(s) removed.`));
|
|
1221
|
+
}
|
|
1167
1222
|
console.log('');
|
|
1168
1223
|
return;
|
|
1169
1224
|
}
|
|
@@ -1179,6 +1234,7 @@ function shortHelpCommand() {
|
|
|
1179
1234
|
console.log(c.dim(' ─────────────────────────────────────────────────────'));
|
|
1180
1235
|
console.log(` ${c.cyan('veto init')} Configure all AI tools + scan project`);
|
|
1181
1236
|
console.log(` ${c.cyan('veto doctor')} Check MCP registrations + system health`);
|
|
1237
|
+
console.log(` ${c.cyan('veto doctor --fix')} Also rename old Veto guides left in Codex/Gemini files`);
|
|
1182
1238
|
console.log(` ${c.cyan('veto status')} Version, DB path, memory/session counts`);
|
|
1183
1239
|
console.log(` ${c.cyan('veto sessions')} List last 20 saved sessions`);
|
|
1184
1240
|
console.log(` ${c.cyan('veto tools')} ${c.dim('[filter]')} List all MCP tools (--json supported)`);
|
|
@@ -1187,10 +1243,13 @@ function shortHelpCommand() {
|
|
|
1187
1243
|
console.log(` ${c.cyan('veto patterns')} ${c.dim('[prefix]')} List learned agent/routing patterns`);
|
|
1188
1244
|
console.log(` ${c.cyan('veto routing')} ${c.dim('[status|enable|disable|reset|log]')}`);
|
|
1189
1245
|
console.log(` Routing feedback loop (opt-in signal storage)`);
|
|
1190
|
-
console.log(` ${c.cyan('veto statusline')} ${c.dim('[install|uninstall|print|status]')}`);
|
|
1191
|
-
console.log(` Compact Veto line under your AI CLI prompt
|
|
1246
|
+
console.log(` ${c.cyan('veto statusline')} ${c.dim('[install|uninstall|print|status|watch]')}`);
|
|
1247
|
+
console.log(` Compact Veto line under your AI CLI prompt (Claude Code),`);
|
|
1248
|
+
console.log(` or in a pane beside Codex/Gemini: veto statusline watch`);
|
|
1192
1249
|
console.log(` ${c.cyan('veto transcripts')} ${c.dim('[enable|disable|status]')}`);
|
|
1193
1250
|
console.log(` Opt-in local session-transcript capture (off by default)`);
|
|
1251
|
+
console.log(` ${c.cyan('veto lessons')} ${c.dim('[on|list|why|forget|flows|off|exclude|include|alias|recheck]')}`);
|
|
1252
|
+
console.log(` Notes your AIs wrote in their own memory: see them, where they may go, stop them`);
|
|
1194
1253
|
console.log(` ${c.cyan('veto version')} Show version (alias for status)`);
|
|
1195
1254
|
console.log(` ${c.cyan('veto hook install')} Install pre-commit secrets scan hook`);
|
|
1196
1255
|
console.log(` ${c.cyan('veto hook remove')} Remove the veto pre-commit hook`);
|
|
@@ -1634,7 +1693,7 @@ switch (command) {
|
|
|
1634
1693
|
});
|
|
1635
1694
|
break;
|
|
1636
1695
|
case 'doctor':
|
|
1637
|
-
doctorCommand().catch((err) => {
|
|
1696
|
+
doctorCommand(process.argv.includes('--fix')).catch((err) => {
|
|
1638
1697
|
console.error(c.red(`Error: ${err.message}`));
|
|
1639
1698
|
process.exit(1);
|
|
1640
1699
|
});
|
|
@@ -1657,6 +1716,14 @@ switch (command) {
|
|
|
1657
1716
|
process.exit(1);
|
|
1658
1717
|
});
|
|
1659
1718
|
break;
|
|
1719
|
+
case 'lessons':
|
|
1720
|
+
import('./cli/lessons.js')
|
|
1721
|
+
.then(async ({ runLessonsCommand }) => { process.exitCode = await runLessonsCommand(process.argv.slice(3)); })
|
|
1722
|
+
.catch((err) => {
|
|
1723
|
+
console.error(c.red(`Error: ${err.message}`));
|
|
1724
|
+
process.exit(1);
|
|
1725
|
+
});
|
|
1726
|
+
break;
|
|
1660
1727
|
case 'hook':
|
|
1661
1728
|
hookCommand().catch((err) => {
|
|
1662
1729
|
console.error(c.red(`Error: ${err.message}`));
|