@jigyasudham/veto 3.3.0 → 3.4.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.
Files changed (148) hide show
  1. package/README.md +53 -7
  2. package/dist/adapters/index.d.ts.map +1 -1
  3. package/dist/adapters/index.js +1 -0
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/agents/llm-runner.d.ts.map +1 -1
  6. package/dist/agents/llm-runner.js +17 -4
  7. package/dist/agents/llm-runner.js.map +1 -1
  8. package/dist/cli/context-guidance.d.ts +16 -0
  9. package/dist/cli/context-guidance.d.ts.map +1 -0
  10. package/dist/cli/context-guidance.js +20 -0
  11. package/dist/cli/context-guidance.js.map +1 -0
  12. package/dist/cli/leftover-guides.d.ts +38 -0
  13. package/dist/cli/leftover-guides.d.ts.map +1 -0
  14. package/dist/cli/leftover-guides.js +135 -0
  15. package/dist/cli/leftover-guides.js.map +1 -0
  16. package/dist/cli/statusline-hosts.d.ts +36 -0
  17. package/dist/cli/statusline-hosts.d.ts.map +1 -0
  18. package/dist/cli/statusline-hosts.js +212 -0
  19. package/dist/cli/statusline-hosts.js.map +1 -0
  20. package/dist/cli/statusline.d.ts +6 -0
  21. package/dist/cli/statusline.d.ts.map +1 -1
  22. package/dist/cli/statusline.js +51 -10
  23. package/dist/cli/statusline.js.map +1 -1
  24. package/dist/cli.js +104 -47
  25. package/dist/cli.js.map +1 -1
  26. package/dist/council/llm-council.d.ts.map +1 -1
  27. package/dist/council/llm-council.js +13 -8
  28. package/dist/council/llm-council.js.map +1 -1
  29. package/dist/lessons/adapters/claude.d.ts +10 -0
  30. package/dist/lessons/adapters/claude.d.ts.map +1 -0
  31. package/dist/lessons/adapters/claude.js +18 -0
  32. package/dist/lessons/adapters/claude.js.map +1 -0
  33. package/dist/lessons/adapters/codex.d.ts +7 -0
  34. package/dist/lessons/adapters/codex.d.ts.map +1 -0
  35. package/dist/lessons/adapters/codex.js +9 -0
  36. package/dist/lessons/adapters/codex.js.map +1 -0
  37. package/dist/lessons/adapters/gemini.d.ts +4 -0
  38. package/dist/lessons/adapters/gemini.d.ts.map +1 -0
  39. package/dist/lessons/adapters/gemini.js +44 -0
  40. package/dist/lessons/adapters/gemini.js.map +1 -0
  41. package/dist/lessons/adapters/index.d.ts +6 -0
  42. package/dist/lessons/adapters/index.d.ts.map +1 -0
  43. package/dist/lessons/adapters/index.js +14 -0
  44. package/dist/lessons/adapters/index.js.map +1 -0
  45. package/dist/lessons/adapters/markdown.d.ts +16 -0
  46. package/dist/lessons/adapters/markdown.d.ts.map +1 -0
  47. package/dist/lessons/adapters/markdown.js +130 -0
  48. package/dist/lessons/adapters/markdown.js.map +1 -0
  49. package/dist/lessons/adapters/types.d.ts +27 -0
  50. package/dist/lessons/adapters/types.d.ts.map +1 -0
  51. package/dist/lessons/adapters/types.js +2 -0
  52. package/dist/lessons/adapters/types.js.map +1 -0
  53. package/dist/lessons/classify.d.ts +30 -0
  54. package/dist/lessons/classify.d.ts.map +1 -0
  55. package/dist/lessons/classify.js +101 -0
  56. package/dist/lessons/classify.js.map +1 -0
  57. package/dist/lessons/discover.d.ts +19 -0
  58. package/dist/lessons/discover.d.ts.map +1 -0
  59. package/dist/lessons/discover.js +65 -0
  60. package/dist/lessons/discover.js.map +1 -0
  61. package/dist/lessons/harvest.d.ts +48 -0
  62. package/dist/lessons/harvest.d.ts.map +1 -0
  63. package/dist/lessons/harvest.js +96 -0
  64. package/dist/lessons/harvest.js.map +1 -0
  65. package/dist/lessons/identity.d.ts +23 -0
  66. package/dist/lessons/identity.d.ts.map +1 -0
  67. package/dist/lessons/identity.js +81 -0
  68. package/dist/lessons/identity.js.map +1 -0
  69. package/dist/lessons/mask.d.ts +6 -0
  70. package/dist/lessons/mask.d.ts.map +1 -0
  71. package/dist/lessons/mask.js +22 -0
  72. package/dist/lessons/mask.js.map +1 -0
  73. package/dist/lessons/select.d.ts +23 -0
  74. package/dist/lessons/select.d.ts.map +1 -0
  75. package/dist/lessons/select.js +134 -0
  76. package/dist/lessons/select.js.map +1 -0
  77. package/dist/lessons/source-project.d.ts +9 -0
  78. package/dist/lessons/source-project.d.ts.map +1 -0
  79. package/dist/lessons/source-project.js +149 -0
  80. package/dist/lessons/source-project.js.map +1 -0
  81. package/dist/lessons/store.d.ts +56 -0
  82. package/dist/lessons/store.d.ts.map +1 -0
  83. package/dist/lessons/store.js +85 -0
  84. package/dist/lessons/store.js.map +1 -0
  85. package/dist/memory/config.d.ts +14 -0
  86. package/dist/memory/config.d.ts.map +1 -1
  87. package/dist/memory/config.js +43 -0
  88. package/dist/memory/config.js.map +1 -1
  89. package/dist/memory/local.d.ts.map +1 -1
  90. package/dist/memory/local.js +16 -1
  91. package/dist/memory/local.js.map +1 -1
  92. package/dist/memory/schema.d.ts +1 -1
  93. package/dist/memory/schema.d.ts.map +1 -1
  94. package/dist/memory/schema.js +54 -0
  95. package/dist/memory/schema.js.map +1 -1
  96. package/dist/server/handlers/council.d.ts.map +1 -1
  97. package/dist/server/handlers/council.js +4 -1
  98. package/dist/server/handlers/council.js.map +1 -1
  99. package/dist/server/handlers/memory.d.ts.map +1 -1
  100. package/dist/server/handlers/memory.js +13 -3
  101. package/dist/server/handlers/memory.js.map +1 -1
  102. package/dist/server/handlers/session.d.ts.map +1 -1
  103. package/dist/server/handlers/session.js +51 -21
  104. package/dist/server/handlers/session.js.map +1 -1
  105. package/dist/server.d.ts.map +1 -1
  106. package/dist/server.js +12 -3
  107. package/dist/server.js.map +1 -1
  108. package/dist/transcripts/cache.d.ts +1 -0
  109. package/dist/transcripts/cache.d.ts.map +1 -1
  110. package/dist/transcripts/cache.js +0 -0
  111. package/dist/transcripts/cache.js.map +1 -1
  112. package/dist/transcripts/claude-paths.d.ts +5 -0
  113. package/dist/transcripts/claude-paths.d.ts.map +1 -0
  114. package/dist/transcripts/claude-paths.js +21 -0
  115. package/dist/transcripts/claude-paths.js.map +1 -0
  116. package/dist/transcripts/context.d.ts +41 -0
  117. package/dist/transcripts/context.d.ts.map +1 -0
  118. package/dist/transcripts/context.js +144 -0
  119. package/dist/transcripts/context.js.map +1 -0
  120. package/dist/transcripts/discover.d.ts +12 -2
  121. package/dist/transcripts/discover.d.ts.map +1 -1
  122. package/dist/transcripts/discover.js +55 -7
  123. package/dist/transcripts/discover.js.map +1 -1
  124. package/dist/transcripts/manage.d.ts +8 -0
  125. package/dist/transcripts/manage.d.ts.map +1 -1
  126. package/dist/transcripts/manage.js +28 -13
  127. package/dist/transcripts/manage.js.map +1 -1
  128. package/dist/transcripts/mapping.d.ts.map +1 -1
  129. package/dist/transcripts/mapping.js +4 -2
  130. package/dist/transcripts/mapping.js.map +1 -1
  131. package/dist/transcripts/on-save.d.ts +9 -0
  132. package/dist/transcripts/on-save.d.ts.map +1 -1
  133. package/dist/transcripts/on-save.js +36 -9
  134. package/dist/transcripts/on-save.js.map +1 -1
  135. package/dist/transcripts/project-key.d.ts +4 -0
  136. package/dist/transcripts/project-key.d.ts.map +1 -0
  137. package/dist/transcripts/project-key.js +30 -0
  138. package/dist/transcripts/project-key.js.map +1 -0
  139. package/dist/transcripts/recall.d.ts +4 -0
  140. package/dist/transcripts/recall.d.ts.map +1 -1
  141. package/dist/transcripts/recall.js +6 -5
  142. package/dist/transcripts/recall.js.map +1 -1
  143. package/dist/transcripts/stopwords.d.ts +2 -0
  144. package/dist/transcripts/stopwords.d.ts.map +1 -0
  145. package/dist/transcripts/stopwords.js +8 -0
  146. package/dist/transcripts/stopwords.js.map +1 -0
  147. package/package.json +1 -1
  148. 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,46 +344,42 @@ Recommended start sequence:
343
344
  5. veto_session_save — checkpoint before context fills
344
345
  `;
345
346
  let ctxWritten = 0;
346
- // Gemini & Antigravity CLI: ~/.gemini/GEMINI.md
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
- if (existsSync(geminiDir)) {
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
- if (existsSync(codexDir2)) {
361
- // Project-level: only write if not already present (user may have customized it)
362
- const projectAgents = join(cwd, 'AGENTS.md');
363
- if (!existsSync(projectAgents)) {
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
- // Global override
377
- try {
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
- catch {
383
- console.log(c.yellow(' ') + 'Codex CLI — could not write AGENTS.override.md');
361
+ else if (guidance.projectAgents === 'existing') {
362
+ console.log(c.dim(' · ') + c.dim('Codex CLI — AGENTS.md already exists, skipping'));
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)"));
384
366
  }
385
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'));
382
+ }
386
383
  // Windsurf: ~/.codeium/windsurf/rules/veto.md
387
384
  const windsurfRulesDir = join(HOME, '.codeium', 'windsurf', 'rules');
388
385
  if (existsSync(join(HOME, '.codeium', 'windsurf'))) {
@@ -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(' Install: veto statusline install [--client=claude] [--force] [--dry-run]'));
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')} ${c.dim('(veto statusline install)')}`);
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
- const id = args[0];
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
- 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.`));
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,8 +1243,9 @@ 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)`);
1194
1251
  console.log(` ${c.cyan('veto version')} Show version (alias for status)`);
@@ -1634,7 +1691,7 @@ switch (command) {
1634
1691
  });
1635
1692
  break;
1636
1693
  case 'doctor':
1637
- doctorCommand().catch((err) => {
1694
+ doctorCommand(process.argv.includes('--fix')).catch((err) => {
1638
1695
  console.error(c.red(`Error: ${err.message}`));
1639
1696
  process.exit(1);
1640
1697
  });