@jigyasudham/veto 1.2.0 → 1.2.2

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 CHANGED
@@ -1,8 +1,8 @@
1
1
  # veto
2
2
 
3
- > **50 agents. 34 tools. 3 AIs. Self-learning. Zero extra cost.**
3
+ > **50 agents. 41 tools. 3 AIs. Self-learning. Zero extra cost.**
4
4
 
5
- An MCP server that runs locally on your machine, plugs into Claude Code, Codex CLI, and Gemini CLI using your existing subscriptions — giving every AI a council of specialist agents, persistent cross-platform memory, a self-learning router, reactive file watching, sequential agent pipelines, and the ability to say no to bad decisions.
5
+ An MCP server that runs locally on your machine, plugs into Claude Code, Codex CLI, and Gemini CLI using your existing subscriptions — giving every AI a council of specialist agents, persistent cross-platform memory, a self-learning router, live usage tracking, CI/CD pipeline gates, live documentation fetching, and the ability to say no to bad decisions.
6
6
 
7
7
  ---
8
8
 
@@ -116,7 +116,7 @@ VS Code uses `"servers"` with `"type": "stdio"`:
116
116
 
117
117
  ---
118
118
 
119
- ## MCP Tools (34)
119
+ ## MCP Tools (41)
120
120
 
121
121
  | Category | Tools |
122
122
  |---|---|
@@ -130,6 +130,9 @@ VS Code uses `"servers"` with `"type": "stdio"`:
130
130
  | **Memory** | `veto_memory_store` · `veto_memory_search` · `veto_memory_delete` · `veto_project_map_update` · `veto_project_map_get` · `veto_pattern_store` · `veto_patterns_list` · `veto_memory_export` · `veto_memory_import` |
131
131
  | **Learning** | `veto_record_outcome` · `veto_learning_stats` · `veto_learning_apply` |
132
132
  | **Handoff** | `veto_handoff` · `veto_continue` · `veto_platform_setup` |
133
+ | **Intelligence** | `veto_docs_fetch` · `veto_context_status` · `veto_task_parse` |
134
+ | **Observability** | `veto_usage_status` · `veto_audit_log` · `veto_health` |
135
+ | **CI/CD** | `veto_ci_gate` |
133
136
  | **Plugins** | `veto_plugins` |
134
137
 
135
138
  ## MCP Resources
@@ -171,7 +174,7 @@ npx @jigyasudham/veto help # Same help output, no install needed
171
174
  npx @jigyasudham/veto status # Check status from any machine
172
175
  ```
173
176
 
174
- `veto help` shows all CLI commands, all 34 MCP tool names, MCP Resources, and MCP Prompts — the full reference in one place.
177
+ `veto help` shows all CLI commands, all 41 MCP tool names, MCP Resources, and MCP Prompts — the full reference in one place.
175
178
 
176
179
  ---
177
180
 
@@ -346,6 +349,9 @@ Machine B → veto_memory_import → veto_session_restore
346
349
  | 10 — Watch, Workflow, Explain, Plugins | ✅ Complete | v0.10.0 |
347
350
  | 11 — Smarter Council + Predictive Routing + Auto Project Map | ✅ Complete | v0.11.0 |
348
351
  | 12 — CLI Subcommands + Diff Review | ✅ Complete | v1.0.0 |
352
+ | 13 — Developer Intelligence + Auto Docs | ✅ Complete | v1.1.0 |
353
+ | 14 — Observability + Usage Stats + Audit Log | ✅ Complete | v1.2.0 |
354
+ | 15 — CI/CD Pipeline Gates | ✅ Complete | v1.2.0 |
349
355
 
350
356
  ---
351
357
 
package/dist/cli.js CHANGED
@@ -5,7 +5,7 @@ process.removeAllListeners('warning');
5
5
  import { mkdirSync, existsSync, readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs';
6
6
  import { join, dirname, extname, resolve } from 'node:path';
7
7
  import { homedir } from 'node:os';
8
- const VERSION = '1.0.0';
8
+ const VERSION = '1.2.2';
9
9
  const VETO_DIR = join(homedir(), '.veto');
10
10
  const HOME = homedir();
11
11
  const c = {
@@ -25,7 +25,7 @@ function printBanner() {
25
25
  console.log(c.bold(c.cyan(' ╚████╔╝ ███████╗ ██║ ╚██████╔╝')));
26
26
  console.log(c.bold(c.cyan(' ╚═══╝ ╚══════╝ ╚═╝ ╚═════╝')));
27
27
  console.log('');
28
- console.log(c.dim(` 50 agents. 33 tools. 3 AIs. Self-learning. Zero extra cost.`));
28
+ console.log(c.dim(` 50 agents. 41 tools. 3 AIs. Self-learning. Zero extra cost.`));
29
29
  console.log(c.dim(` v${VERSION}`));
30
30
  console.log('');
31
31
  }
@@ -49,12 +49,12 @@ function writeVetoConfig(configPath, format) {
49
49
  const wasEmpty = Object.keys(existing).length === 0;
50
50
  if (format === 'mcpServers') {
51
51
  const servers = existing.mcpServers ?? {};
52
- servers['veto'] = { command: 'veto-server' };
52
+ servers['veto'] = { command: 'npx', args: ['-y', '--package', '@jigyasudham/veto', 'veto-server'] };
53
53
  existing.mcpServers = servers;
54
54
  }
55
55
  else {
56
56
  const servers = existing.servers ?? {};
57
- servers['veto'] = { type: 'stdio', command: 'veto-server' };
57
+ servers['veto'] = { type: 'stdio', command: 'npx', args: ['-y', '--package', '@jigyasudham/veto', 'veto-server'] };
58
58
  existing.servers = servers;
59
59
  }
60
60
  writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n', 'utf8');
@@ -333,7 +333,7 @@ async function patternsCommand() {
333
333
  }
334
334
  function helpCommand() {
335
335
  console.log('');
336
- console.log(c.bold(c.cyan(' veto')) + c.dim(` v${VERSION}`) + c.dim(' — 50 agents. 34 tools. 3 AIs. Self-learning. Zero extra cost.'));
336
+ console.log(c.bold(c.cyan(' veto')) + c.dim(` v${VERSION}`) + c.dim(' — 50 agents. 41 tools. 3 AIs. Self-learning. Zero extra cost.'));
337
337
  console.log('');
338
338
  console.log(c.bold(' CLI Commands'));
339
339
  console.log(c.dim(' ─────────────────────────────────────────────────────'));
@@ -344,22 +344,25 @@ function helpCommand() {
344
344
  console.log(` ${c.cyan('veto patterns')} ${c.dim('[prefix]')} List learned agent/routing patterns`);
345
345
  console.log(` ${c.cyan('veto help')} Show this help`);
346
346
  console.log('');
347
- console.log(c.bold(' MCP Tools (34)'));
347
+ console.log(c.bold(' MCP Tools (41)'));
348
348
  console.log(c.dim(' ─────────────────────────────────────────────────────'));
349
- console.log(` ${c.dim('Session')} veto_status · veto_session_save · veto_session_restore · veto_sessions_list`);
350
- console.log(` ${c.dim('Router')} veto_route_task · veto_rate_status`);
351
- console.log(` ${c.dim('Council')} veto_council_debate`);
352
- console.log(` ${c.dim('Agents')} veto_agent_plan · veto_execute_parallel · veto_explain`);
353
- console.log(` ${c.dim('Review')} veto_code_review · veto_security_scan · veto_secrets_scan · veto_diff_review`);
354
- console.log(` ${c.dim('Pipeline')} veto_workflow`);
355
- console.log(` ${c.dim('Watch')} veto_watch · veto_watch_poll · veto_watch_stop`);
356
- console.log(` ${c.dim('Memory')} veto_memory_store · veto_memory_search · veto_memory_delete`);
357
- console.log(` veto_project_map_update · veto_project_map_get`);
358
- console.log(` veto_pattern_store · veto_patterns_list`);
359
- console.log(` veto_memory_export · veto_memory_import`);
360
- console.log(` ${c.dim('Learning')} veto_record_outcome · veto_learning_stats · veto_learning_apply`);
361
- console.log(` ${c.dim('Handoff')} veto_handoff · veto_continue · veto_platform_setup`);
362
- console.log(` ${c.dim('Plugins')} veto_plugins`);
349
+ console.log(` ${c.dim('Session')} veto_status · veto_session_save · veto_session_restore · veto_sessions_list`);
350
+ console.log(` ${c.dim('Router')} veto_route_task · veto_rate_status`);
351
+ console.log(` ${c.dim('Council')} veto_council_debate`);
352
+ console.log(` ${c.dim('Agents')} veto_agent_plan · veto_execute_parallel · veto_explain`);
353
+ console.log(` ${c.dim('Review')} veto_code_review · veto_security_scan · veto_secrets_scan · veto_diff_review`);
354
+ console.log(` ${c.dim('Pipeline')} veto_workflow`);
355
+ console.log(` ${c.dim('Watch')} veto_watch · veto_watch_poll · veto_watch_stop`);
356
+ console.log(` ${c.dim('Memory')} veto_memory_store · veto_memory_search · veto_memory_delete`);
357
+ console.log(` veto_project_map_update · veto_project_map_get`);
358
+ console.log(` veto_pattern_store · veto_patterns_list`);
359
+ console.log(` veto_memory_export · veto_memory_import`);
360
+ console.log(` ${c.dim('Learning')} veto_record_outcome · veto_learning_stats · veto_learning_apply`);
361
+ console.log(` ${c.dim('Handoff')} veto_handoff · veto_continue · veto_platform_setup`);
362
+ console.log(` ${c.dim('Intelligence')} veto_docs_fetch · veto_context_status · veto_task_parse`);
363
+ console.log(` ${c.dim('Observability')} veto_usage_status · veto_audit_log · veto_health`);
364
+ console.log(` ${c.dim('CI/CD')} veto_ci_gate`);
365
+ console.log(` ${c.dim('Plugins')} veto_plugins`);
363
366
  console.log('');
364
367
  console.log(c.bold(' MCP Resources'));
365
368
  console.log(c.dim(' ─────────────────────────────────────────────────────'));
@@ -372,9 +375,70 @@ function helpCommand() {
372
375
  console.log(c.dim(' ─────────────────────────────────────────────────────'));
373
376
  console.log(` ${c.cyan('code-review')} · ${c.cyan('security-audit')} · ${c.cyan('deploy-checklist')} · ${c.cyan('explain-file')}`);
374
377
  console.log('');
375
- console.log(c.bold(' Docs'));
378
+ console.log(c.bold(' Troubleshooting'));
379
+ console.log(c.dim(' ─────────────────────────────────────────────────────'));
380
+ console.log(` ${c.yellow('MCP disconnected / tools not loading')}`);
381
+ console.log(` ${c.dim('→')} Run ${c.cyan('veto init')} again, then fully restart your AI client (Claude / Gemini / Cursor)`);
382
+ console.log(` ${c.dim('→')} Verify the MCP entry in your AI client config file`);
383
+ console.log(` ${c.dim('→')} Check Node.js version: ${c.cyan('node --version')} (need >= 22)`);
384
+ console.log('');
385
+ console.log(` ${c.yellow('veto command not found after install')}`);
386
+ console.log(` ${c.dim('→')} Global install: ${c.cyan('npm install -g @jigyasudham/veto')}`);
387
+ console.log(` ${c.dim('→')} From source: ${c.cyan('npm run build && npm link')}`);
388
+ console.log(` ${c.dim('→')} Windows: restart terminal after install so PATH refreshes`);
389
+ console.log('');
390
+ console.log(` ${c.yellow('Tools missing in Claude / Gemini after install')}`);
391
+ console.log(` ${c.dim('→')} Run ${c.cyan('veto init')} to write / regenerate the MCP config`);
392
+ console.log(` ${c.dim('→')} Fully quit and reopen the AI client (not just reload)`);
393
+ console.log(` ${c.dim('→')} Claude Desktop config: ${c.dim('~/.config/claude/claude_desktop_config.json')}`);
394
+ console.log(` ${c.dim('→')} Gemini / other: check the platform docs for MCP config location`);
395
+ console.log('');
396
+ console.log(` ${c.yellow('Old version still showing after update')}`);
397
+ console.log(` ${c.dim('→')} ${c.cyan('npm install -g @jigyasudham/veto@latest')}`);
398
+ console.log(` ${c.dim('→')} From source: ${c.cyan('npm run build && npm link')}`);
399
+ console.log(` ${c.dim('→')} Confirm active binary: ${c.cyan('which veto')} / ${c.cyan('where veto')}`);
400
+ console.log('');
401
+ console.log(` ${c.yellow('Database / SQLite errors on startup')}`);
402
+ console.log(` ${c.dim('→')} Requires Node.js >= 22 (uses built-in node:sqlite)`);
403
+ console.log(` ${c.dim('→')} Check ${c.dim('~/.veto')} directory exists and is writable`);
404
+ console.log(` ${c.dim('→')} Run ${c.cyan('veto status')} to see the active DB path`);
405
+ console.log('');
406
+ console.log(` ${c.yellow('Memory or sessions not persisting between chats')}`);
407
+ console.log(` ${c.dim('→')} Run ${c.cyan('veto status')} — verify DB path and memory count`);
408
+ console.log(` ${c.dim('→')} Ensure ${c.dim('~/.veto')} is not on a read-only or temp volume`);
409
+ console.log('');
410
+ console.log(` ${c.yellow('Permission denied on Windows (PowerShell)')}`);
411
+ console.log(` ${c.dim('→')} ${c.cyan('Set-ExecutionPolicy -Scope CurrentUser RemoteSigned')}`);
412
+ console.log(` ${c.dim('→')} Or run terminal as Administrator and retry`);
413
+ console.log('');
414
+ console.log(` ${c.yellow('Rate limit / too many requests errors')}`);
415
+ console.log(` ${c.dim('→')} Use ${c.cyan('veto_rate_status')} tool to check current usage`);
416
+ console.log(` ${c.dim('→')} Wait a moment, then retry — limits reset per minute`);
417
+ console.log('');
418
+ console.log(` ${c.yellow('veto init fails / API key not found')}`);
419
+ console.log(` ${c.dim('→')} Set key in your shell: ${c.cyan('export ANTHROPIC_API_KEY=sk-...')}`);
420
+ console.log(` ${c.dim('→')} Windows: ${c.cyan('$env:ANTHROPIC_API_KEY="sk-..."')}`);
421
+ console.log(` ${c.dim('→')} Re-run ${c.cyan('veto init')} after setting the key`);
422
+ console.log('');
423
+ console.log(` ${c.yellow('veto_health shows degraded / components failing')}`);
424
+ console.log(` ${c.dim('→')} Run ${c.cyan('veto status')} for a summary of all components`);
425
+ console.log(` ${c.dim('→')} Check ${c.cyan('veto_audit_log')} for recent error events`);
426
+ console.log(` ${c.dim('→')} Re-run ${c.cyan('veto init')} to repair config and rescan project`);
427
+ console.log('');
428
+ console.log(` ${c.yellow('Installed via npx but MCP disconnects after restart')}`);
429
+ console.log(` ${c.dim('→')} npx runs temporarily — it does NOT add veto-server to PATH permanently`);
430
+ console.log(` ${c.dim('→')} Fix: run ${c.cyan('npx veto init')} again so the config is rewritten with the correct npx command`);
431
+ console.log(` ${c.dim('→')} Or install globally for a stable binary: ${c.cyan('npm install -g @jigyasudham/veto')}`);
432
+ console.log('');
433
+ console.log(` ${c.yellow('Installed on a new machine but MCP not working')}`);
434
+ console.log(` ${c.dim('→')} Run ${c.cyan('npx @jigyasudham/veto init')} on the new machine — config is not transferred`);
435
+ console.log(` ${c.dim('→')} Each machine needs its own init run to register the MCP server`);
436
+ console.log(` ${c.dim('→')} Then restart the AI client on that machine`);
437
+ console.log('');
438
+ console.log(c.bold(' Docs & Support'));
376
439
  console.log(c.dim(' ─────────────────────────────────────────────────────'));
377
440
  console.log(` ${c.dim('GitHub:')} https://github.com/jigyasudham/veto`);
441
+ console.log(` ${c.dim('Issues:')} https://github.com/jigyasudham/veto/issues`);
378
442
  console.log(` ${c.dim('npm:')} https://www.npmjs.com/package/@jigyasudham/veto`);
379
443
  console.log('');
380
444
  }
@@ -1,10 +1,13 @@
1
1
  // Local SQLite memory — all operations for session save/restore
2
2
  // Uses Node.js built-in node:sqlite (Node 22.5+, no native compilation needed)
3
- import { DatabaseSync } from 'node:sqlite';
3
+ import { createRequire } from 'node:module';
4
4
  import { randomUUID } from 'node:crypto';
5
- import { join } from 'node:path';
5
+ import { join, dirname } from 'node:path';
6
6
  import { homedir } from 'node:os';
7
7
  import { mkdirSync } from 'node:fs';
8
+ // node:sqlite is a Node 22.5+ built-in — use createRequire so bundlers (Vite/esbuild) skip it
9
+ const _require = createRequire(import.meta.url);
10
+ const DbSync = _require('node:sqlite').DatabaseSync;
8
11
  import { CREATE_TABLES } from './schema.js';
9
12
  // Context window sizes per platform (tokens)
10
13
  export const CONTEXT_WINDOWS = {
@@ -13,13 +16,20 @@ export const CONTEXT_WINDOWS = {
13
16
  codex: 128_000,
14
17
  };
15
18
  const VETO_DIR = join(homedir(), '.veto');
16
- const DB_PATH = join(VETO_DIR, 'veto.db');
19
+ const DB_PATH = process.env.VETO_TEST_DB ?? join(VETO_DIR, 'veto.db');
17
20
  let _db = null;
21
+ export function resetDb() {
22
+ if (_db) {
23
+ _db.close();
24
+ _db = null;
25
+ }
26
+ }
18
27
  export function getDb() {
19
28
  if (_db)
20
29
  return _db;
21
- mkdirSync(VETO_DIR, { recursive: true });
22
- _db = new DatabaseSync(DB_PATH);
30
+ if (DB_PATH !== ':memory:')
31
+ mkdirSync(dirname(DB_PATH), { recursive: true });
32
+ _db = new DbSync(DB_PATH);
23
33
  _db.exec('PRAGMA journal_mode = WAL');
24
34
  _db.exec('PRAGMA foreign_keys = ON');
25
35
  _db.exec(CREATE_TABLES);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jigyasudham/veto",
3
- "version": "1.2.0",
4
- "description": "50 agents. 34 tools. 3 AIs. Self-learning. Zero extra cost.",
3
+ "version": "1.2.2",
4
+ "description": "50 agents. 41 tools. 3 AIs. Self-learning. Zero extra cost.",
5
5
  "keywords": [
6
6
  "mcp",
7
7
  "ai",
@@ -34,7 +34,10 @@
34
34
  "build": "tsc",
35
35
  "dev": "tsx src/cli.ts",
36
36
  "start": "node dist/server.js",
37
- "init": "tsx src/cli.ts init"
37
+ "init": "tsx src/cli.ts init",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest",
40
+ "test:coverage": "vitest run --coverage"
38
41
  },
39
42
  "dependencies": {
40
43
  "@modelcontextprotocol/sdk": "^1.0.0"
@@ -42,6 +45,7 @@
42
45
  "devDependencies": {
43
46
  "@types/node": "^22.0.0",
44
47
  "tsx": "^4.7.0",
45
- "typescript": "^5.3.0"
48
+ "typescript": "^5.3.0",
49
+ "vitest": "^2.1.9"
46
50
  }
47
51
  }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: 'node',
6
+ pool: 'forks',
7
+ env: {
8
+ VETO_TEST_DB: ':memory:',
9
+ },
10
+ },
11
+ });