@jigyasudham/veto 2.0.1 → 2.0.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 +27 -365
- package/dist/cli.js +45 -6
- package/dist/cli.js.map +1 -1
- package/dist/memory/config.d.ts +1 -0
- package/dist/memory/config.d.ts.map +1 -1
- package/dist/memory/config.js +3 -2
- package/dist/memory/config.js.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,22 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
> **62 agentic tools. 50+ specialists. 4 AIs. Self-learning. Zero cost.**
|
|
4
4
|
|
|
5
|
-
An MCP server that runs locally on your machine, plugs into Claude Code, Codex CLI, Gemini CLI, Antigravity CLI, Cursor, Windsurf, Zed,
|
|
5
|
+
An MCP server that runs locally on your machine, plugs into Claude Code, Codex CLI, Gemini CLI, Antigravity CLI, Cursor, Windsurf, Zed, and JetBrains using your existing subscriptions — giving every AI a council of specialist agents, local LLM support, SDD agents, playwright automation, persistent cross-platform memory, a self-learning router, CI/CD gates, workspace discovery, and bidirectional IDE communication.
|
|
6
|
+
|
|
7
|
+
> **Billing note:** "Zero cost" applies to subscription plans (Claude Max, Gemini Advanced, etc.). If you are on API/pay-per-token billing, MCP Sampling calls made by Veto agents will count toward your token usage. `veto init` detects API key environment variables and warns you automatically.
|
|
6
8
|
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-
## How the Agents
|
|
11
|
+
## How the Agents Work
|
|
12
|
+
|
|
13
|
+
**Every tool uses a 2-phase agentic loop — no API keys required, zero extra cost.**
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
### Phase 1 — MCP Sampling
|
|
16
|
+
The tool attempts real LLM reasoning via MCP Sampling (`server.createMessage`). If your client supports it, the agent reasons deeply and returns a structured plan or analysis.
|
|
12
17
|
|
|
13
|
-
|
|
18
|
+
### Phase 2 — Agentic Fallback
|
|
19
|
+
If Sampling is unavailable, Veto returns an `llm_upgrade` prompt. The host AI reads the specialist's role, performs the reasoning itself, and passes the JSON response back to complete the operation.
|
|
14
20
|
|
|
15
|
-
|
|
16
|
-
1. **Phase 1 (Sampling):** The tool first attempts real LLM reasoning via **MCP Sampling** (the host AI's native ability to "create a message"). If supported by your client (like Claude Code or Gemini CLI), the agent performs deep reasoning and returns a structured plan or analysis instantly.
|
|
17
|
-
2. **Phase 2 (Upgrade Prompt):** If Sampling is unavailable or fails, Veto returns an `llm_upgrade` prompt. You (the host AI) read the specialist's role and task, perform the reasoning yourself, and pass the JSON response back to complete the operation.
|
|
21
|
+
Every worker agent supports both modes. When multiple agents run, they execute in parallel. LLM calls delegate back to the AI you're already using — no extra billing.
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Specialist Roles
|
|
21
26
|
|
|
22
27
|
| Agent Group | Specialist Roles |
|
|
23
28
|
|---|---|
|
|
@@ -27,10 +32,6 @@ Veto provides a council of 7 senior governance agents plus 55+ domain-specific w
|
|
|
27
32
|
| **Intelligence** | Task Planner · Researcher · Tech Advisor · Risk Assessor · Cost Analyzer · Ethics/Bias |
|
|
28
33
|
| **Workflow** | File Manager · Git Agent · Search Agent · Reporter · Automation |
|
|
29
34
|
|
|
30
|
-
### All 62 Tools are now 100% Agentic
|
|
31
|
-
|
|
32
|
-
> Pattern matching, domain heuristics, and structured templates compiled into code. Offline capable. No LLM calls.
|
|
33
|
-
|
|
34
35
|
**Development (12)**
|
|
35
36
|
`Coder` · `Code Reviewer` · `Tester` · `Debugger` · `Refactor` · `Database` · `API` · `Frontend` · `Backend` · `DevOps` · `Performance` · `Migration`
|
|
36
37
|
|
|
@@ -107,11 +108,9 @@ veto hook install # Install pre-commit secrets scan hook
|
|
|
107
108
|
veto hook remove # Remove the veto pre-commit hook
|
|
108
109
|
veto check # Scan staged changes for secrets (used by hook)
|
|
109
110
|
veto help # Commands + MCP tools reference
|
|
110
|
-
veto help --troubleshoot # Full troubleshooting guide
|
|
111
|
+
veto help --troubleshoot # Full troubleshooting guide
|
|
111
112
|
```
|
|
112
113
|
|
|
113
|
-
`veto help` shows all CLI commands, all 49 MCP tool names, MCP Resources, and MCP Prompts.
|
|
114
|
-
|
|
115
114
|
### `veto doctor`
|
|
116
115
|
|
|
117
116
|
```
|
|
@@ -128,6 +127,7 @@ veto doctor
|
|
|
128
127
|
─────────────────────────────────────────────────────
|
|
129
128
|
✓ Claude Code — registered
|
|
130
129
|
✓ Gemini CLI — registered
|
|
130
|
+
✓ Antigravity CLI — registered
|
|
131
131
|
· Codex CLI — not installed
|
|
132
132
|
· Zed — not installed
|
|
133
133
|
|
|
@@ -138,7 +138,7 @@ veto doctor
|
|
|
138
138
|
|
|
139
139
|
## Council Debate
|
|
140
140
|
|
|
141
|
-
Two-phase flow — works on Claude Code, Gemini CLI, and Codex CLI with no API keys:
|
|
141
|
+
Two-phase flow — works on Claude Code, Gemini CLI, Antigravity CLI, and Codex CLI with no API keys:
|
|
142
142
|
|
|
143
143
|
```
|
|
144
144
|
# Phase 1 — call with task, get instant deterministic result + LLM upgrade prompt
|
|
@@ -166,7 +166,7 @@ veto_council_debate {
|
|
|
166
166
|
pm: { verdict: "approve", reason: "JWT migration unblocks mobile clients", concerns: [], recommendation: "Ship behind a feature flag, roll back if logout issues" },
|
|
167
167
|
architect: { verdict: "approve", reason: "Good fit for stateless microservice boundary", concerns: ["Clock skew can break expiry across services"], recommendation: "Add NTP sync check; use relative expiry not absolute timestamps" },
|
|
168
168
|
ux: { verdict: "approve", reason: "No user-visible change if migration is seamless", concerns: [], recommendation: "Silent migration — no logout required for existing sessions" },
|
|
169
|
-
devil: { verdict: "warn", reason: "What if the refresh token store goes down at 2AM?", concerns: ["Redis outage = all users logged out"
|
|
169
|
+
devil: { verdict: "warn", reason: "What if the refresh token store goes down at 2AM?", concerns: ["Redis outage = all users logged out"], recommendation: "Fallback to session auth if Redis is down; use short rotation window" },
|
|
170
170
|
legal: { verdict: "approve", reason: "JWTs are industry standard, no new compliance risk", concerns: [], recommendation: "Document token storage in privacy policy" },
|
|
171
171
|
security: { verdict: "warn", reason: "Refresh token rotation must be atomic — TOCTOU risk", concerns: ["localStorage storage of access token is XSS-vulnerable"], recommendation: "Store access token in memory only; refresh token in httpOnly Secure SameSite=Strict cookie" }
|
|
172
172
|
}
|
|
@@ -174,312 +174,34 @@ veto_council_debate {
|
|
|
174
174
|
→ {
|
|
175
175
|
llm_backed: true,
|
|
176
176
|
final_verdict: "YELLOW",
|
|
177
|
-
block_reasons: [],
|
|
178
177
|
warnings: ["Refresh token rotation must be atomic...", "What if the refresh token store goes down..."],
|
|
179
178
|
recommended: "Proceed with JWT. Use httpOnly cookies for refresh tokens, memory-only for access tokens..."
|
|
180
179
|
}
|
|
181
180
|
```
|
|
182
181
|
|
|
183
|
-
|
|
182
|
+
### Council `strictness`
|
|
184
183
|
|
|
185
184
|
```
|
|
186
|
-
veto_council_debate {
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
→ formatted_output includes:
|
|
190
|
-
🎯 Council leans toward: "pure MCP with an external adapter" (5 agents prefer it)
|
|
191
|
-
Lead Dev: [Express HTTP vs external adapter] ... [WARN]
|
|
192
|
-
recommendation: Prefer "external adapter" — Express adds new infrastructure...
|
|
193
|
-
Security: [Express HTTP vs external adapter] ... [WARN]
|
|
194
|
-
recommendation: Prefer "external adapter" — keeps the threat model local-only...
|
|
185
|
+
veto_council_debate { task: "...", strictness: "fast" } # 3 agents, instant
|
|
186
|
+
veto_council_debate { task: "...", strictness: "standard" } # 7 agents, default
|
|
187
|
+
veto_council_debate { task: "...", strictness: "strict" } # 7 + devil rebuttal
|
|
195
188
|
```
|
|
196
189
|
|
|
197
190
|
---
|
|
198
191
|
|
|
199
192
|
## Session Tagging + Search
|
|
200
193
|
|
|
201
|
-
Tag sessions when saving to make them findable later:
|
|
202
|
-
|
|
203
194
|
```
|
|
204
|
-
# Let Veto generate the summary from conversation context
|
|
205
195
|
veto_session_save {
|
|
206
196
|
auto_summarize: true,
|
|
207
197
|
tags: ["auth", "jwt", "middleware"]
|
|
208
198
|
}
|
|
209
199
|
|
|
210
|
-
# Or write it manually
|
|
211
|
-
veto_session_save {
|
|
212
|
-
summary: "Implemented JWT auth middleware",
|
|
213
|
-
context: "...",
|
|
214
|
-
tags: ["auth", "jwt", "middleware"]
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
# Find it weeks later:
|
|
218
200
|
veto_sessions_list { query: "auth" }
|
|
219
201
|
→ sessions matching "auth" in summary, context, tags, or project_dir
|
|
220
202
|
```
|
|
221
203
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
## New in v1.4.4
|
|
225
|
-
|
|
226
|
-
### Token count now updates from `veto_session_save`
|
|
227
|
-
|
|
228
|
-
Previously, token count and context window usage only updated when `veto_status { token_count: N }` was called. Saving a session without calling status first left the VS Code extension and autosave status showing stale or zero values.
|
|
229
|
-
|
|
230
|
-
Now `veto_session_save { token_count: N }` directly:
|
|
231
|
-
- Calls `trackTokens()` to update the daily rate tracker
|
|
232
|
-
- Upserts into the new `context_usage` table with `usage_pct` computed from the model's actual context window
|
|
233
|
-
|
|
234
|
-
```
|
|
235
|
-
veto_session_save {
|
|
236
|
-
summary: "...",
|
|
237
|
-
context: "...",
|
|
238
|
-
token_count: 45000, ← now updates live display immediately
|
|
239
|
-
platform: "claude",
|
|
240
|
-
model: "claude-sonnet-4-6" ← resolves exact 1M window for accurate %
|
|
241
|
-
}
|
|
242
|
-
→ { usage_pct: 4.5, auto_summarized: false, ... }
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### `context_usage` table — live DB polling for VS Code extension
|
|
246
|
-
|
|
247
|
-
A new single-row-per-platform table in `~/.veto/veto.db` that always holds the latest known context state. Your VS Code extension can poll or watch this table directly:
|
|
248
|
-
|
|
249
|
-
```sql
|
|
250
|
-
SELECT platform, model, token_count, context_window, usage_pct, updated_at
|
|
251
|
-
FROM context_usage
|
|
252
|
-
ORDER BY updated_at DESC
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
Updated by both `veto_session_save` and `veto_status` whenever `token_count > 0` is passed. `veto_autosave_status` now includes `live_context_usage` in its response.
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
## New in v1.4.3
|
|
260
|
-
|
|
261
|
-
### Council debate + session save — work on Gemini CLI and Codex CLI
|
|
262
|
-
|
|
263
|
-
MCP Sampling (`server.createMessage`) is not yet implemented by any of the four CLI hosts. Previously this meant the council always used deterministic fallbacks and `auto_summarize` never ran on any platform.
|
|
264
|
-
|
|
265
|
-
**v1.4.3 introduces the agentic loop pattern** — no API keys, no sampling dependency, works on all four platforms identically.
|
|
266
|
-
|
|
267
|
-
#### Council debate — two-phase LLM upgrade
|
|
268
|
-
|
|
269
|
-
```
|
|
270
|
-
# Phase 1 — always returns an instant deterministic result
|
|
271
|
-
veto_council_debate { task: "migrate auth to JWT" }
|
|
272
|
-
→ {
|
|
273
|
-
llm_backed: false,
|
|
274
|
-
final_verdict: "YELLOW",
|
|
275
|
-
votes: { ... }, ← deterministic agent analysis
|
|
276
|
-
llm_upgrade: {
|
|
277
|
-
available: true,
|
|
278
|
-
instruction: "Read debate_prompt, reason as all 7 agents, call again with agent_responses",
|
|
279
|
-
debate_prompt: "You are running a Veto Council debate. Analyze the task as each specialist..."
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
# Phase 2 — call again with your agent_responses → get the LLM-backed verdict
|
|
284
|
-
veto_council_debate {
|
|
285
|
-
task: "migrate auth to JWT",
|
|
286
|
-
agent_responses: {
|
|
287
|
-
lead_dev: { verdict: "warn", reason: "...", concerns: [], recommendation: "..." },
|
|
288
|
-
pm: { verdict: "approve", ... },
|
|
289
|
-
architect: { verdict: "warn", ... },
|
|
290
|
-
ux: { verdict: "approve", ... },
|
|
291
|
-
devil: { verdict: "warn", ... },
|
|
292
|
-
legal: { verdict: "warn", ... },
|
|
293
|
-
security: { verdict: "warn", ... }
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
→ { llm_backed: true, final_verdict: "YELLOW", votes: { ... } }
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
The host AI (Claude, Gemini, or Codex) reads the `debate_prompt`, reasons as all 7 specialists, and passes the structured JSON back. Veto runs the verdict engine on the real LLM output.
|
|
300
|
-
|
|
301
|
-
#### Session save — agentic fallback
|
|
302
|
-
|
|
303
|
-
When `auto_summarize: true` and MCP Sampling is unavailable, `veto_session_save` now returns a structured template and instructions for the calling AI to fill in and call again — instead of silently saving nothing:
|
|
304
|
-
|
|
305
|
-
```
|
|
306
|
-
veto_session_save { auto_summarize: true }
|
|
307
|
-
→ {
|
|
308
|
-
mode: "agentic",
|
|
309
|
-
instruction: "Generate the session summary yourself from the conversation above, then call veto_session_save again with the filled-in fields.",
|
|
310
|
-
summarize_prompt: "Review the conversation above and produce a session checkpoint...",
|
|
311
|
-
template: {
|
|
312
|
-
auto_summarize: false,
|
|
313
|
-
summary: "<one sentence describing what was accomplished>",
|
|
314
|
-
context: "{ task, decisions[], findings[] with file:line }",
|
|
315
|
-
task_state: "{ completed[], remaining[], nextAction: 'Edit src/X.ts line N — ...' }"
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## New in v1.4.2
|
|
323
|
-
|
|
324
|
-
### `veto_session_save` — LLM auto-summarization
|
|
325
|
-
|
|
326
|
-
Pass `auto_summarize: true` and Veto reads the full conversation via MCP Sampling, then generates an accurate, structured session checkpoint itself — you don't write summary, context, or task_state manually.
|
|
327
|
-
|
|
328
|
-
```
|
|
329
|
-
# Simplest possible save — Veto does the work
|
|
330
|
-
veto_session_save {
|
|
331
|
-
auto_summarize: true,
|
|
332
|
-
project_dir: "/your/project",
|
|
333
|
-
tags: ["auth", "migration"]
|
|
334
|
-
}
|
|
335
|
-
→ {
|
|
336
|
-
success: true,
|
|
337
|
-
auto_summarized: true,
|
|
338
|
-
session_id: "abc-123",
|
|
339
|
-
summary: "Implemented JWT auth middleware with refresh token rotation",
|
|
340
|
-
context: {
|
|
341
|
-
task: "migrate session auth to JWT",
|
|
342
|
-
decisions: [{ decision: "store refresh token in httpOnly cookie", rationale: "XSS protection" }],
|
|
343
|
-
findings: ["src/auth.ts:142 — refreshToken handler, needs rotation logic next"]
|
|
344
|
-
},
|
|
345
|
-
task_state: {
|
|
346
|
-
completed: ["access token generation", "middleware wiring"],
|
|
347
|
-
remaining: ["refresh token rotation", "logout blocklist"],
|
|
348
|
-
nextAction: "Edit src/auth.ts line 142 — implement rotation: invalidate old refresh token, issue new one, update DB row"
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
Veto generates `nextAction` as a **concrete, file+line instruction** the next AI can execute without re-reading any source files. On restore, the `resume_instructions` field tells the AI to trust this and start immediately.
|
|
354
|
-
|
|
355
|
-
When MCP Sampling is unavailable (all platforms currently), returns an agentic template asking the host AI to generate the summary from the conversation and call back with filled-in fields — see v1.4.3.
|
|
356
|
-
|
|
357
|
-
---
|
|
358
|
-
|
|
359
|
-
## New in v1.4.1
|
|
360
|
-
|
|
361
|
-
### Council debate — decision-aware verdicts
|
|
362
|
-
|
|
363
|
-
When your task presents a binary architectural choice ("should we X or Y", "A vs B"), every council agent now identifies which option it prefers and names it explicitly. The output includes a `🎯 Council leans toward:` line counting how many agents favour each option.
|
|
364
|
-
|
|
365
|
-
Before — agents fired generic keyword-matched concerns unrelated to the choice:
|
|
366
|
-
```
|
|
367
|
-
Lead Dev: "Persistent memory stores grow unbounded..." ← nothing to do with the question
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
After — agents address the specific choice:
|
|
371
|
-
```
|
|
372
|
-
Lead Dev: [Express-bundled vs external-adapter] reason [WARN]
|
|
373
|
-
recommendation: Prefer "external-adapter" — "Express-bundled" adds new
|
|
374
|
-
infrastructure to maintain; validate real demand before building.
|
|
375
|
-
🎯 Council leans toward: "external adapter pattern" (4 agents prefer it)
|
|
376
|
-
```
|
|
377
|
-
|
|
378
|
-
In the agentic loop (phase 2), the host AI is explicitly instructed to name the preferred option in its recommendation for each agent role.
|
|
379
|
-
|
|
380
|
-
### `veto_session_restore` — resume instructions
|
|
381
|
-
|
|
382
|
-
The restore response now includes a `resume_instructions` field that tells the AI exactly what to do:
|
|
383
|
-
|
|
384
|
-
```
|
|
385
|
-
veto_session_restore { session_id: "..." }
|
|
386
|
-
→ {
|
|
387
|
-
resume_instructions: "Context restored. Trust the summary, context, and task_state
|
|
388
|
-
above. Do NOT re-read source files to orient yourself — only open a file if you
|
|
389
|
-
are about to EDIT it. Start immediately with: [nextAction from task_state].",
|
|
390
|
-
session_id: "...",
|
|
391
|
-
summary: "...",
|
|
392
|
-
context: { ... },
|
|
393
|
-
task_state: { nextAction: "Edit src/server.ts line 302, add zod validation..." },
|
|
394
|
-
...
|
|
395
|
-
}
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
This fixes the core issue where AI sessions were re-reading the entire codebase on restore instead of trusting the saved context.
|
|
399
|
-
|
|
400
|
-
### `veto_session_save` — input validation
|
|
401
|
-
|
|
402
|
-
`summary`, `context`, and `task_state` now have enforced size limits. Oversized inputs are truncated with a warning rather than silently stored or crashing.
|
|
403
|
-
|
|
404
|
-
| Field | Limit |
|
|
405
|
-
|---|---|
|
|
406
|
-
| `summary` | 2,000 chars |
|
|
407
|
-
| `context` | 50,000 chars |
|
|
408
|
-
| `task_state` | 20,000 chars |
|
|
409
|
-
|
|
410
|
-
```
|
|
411
|
-
veto_session_save { summary: "...(very long)..." }
|
|
412
|
-
→ { success: true, truncation_warnings: ["summary truncated to 2000 chars (was 8432)"] }
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
---
|
|
416
|
-
|
|
417
|
-
## New in v1.4.0
|
|
418
|
-
|
|
419
|
-
### `veto_metrics` — usage dashboard
|
|
420
|
-
|
|
421
|
-
```
|
|
422
|
-
veto_metrics {}
|
|
423
|
-
→ {
|
|
424
|
-
sessions: { total: 45, today: 2, this_week: 8 },
|
|
425
|
-
council: { total: 24, today: 1, by_verdict: { GREEN: 12, YELLOW: 9, RED: 3 } },
|
|
426
|
-
agents: [ { agent: "coder", calls: 38, avg_quality: 86 }, ... ],
|
|
427
|
-
quality: { overall_avg: 86, trend: [{ date: "2026-05-17", avg: 89, count: 5 }] },
|
|
428
|
-
knowledge:{ total_entries: 12, by_type: { solution: 6, decision: 4, pattern: 2 } },
|
|
429
|
-
patterns: { total: 10 }
|
|
430
|
-
}
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
### `veto_changelog` — git changelog
|
|
434
|
-
|
|
435
|
-
```
|
|
436
|
-
veto_changelog { project_dir: "/your/project" }
|
|
437
|
-
→ {
|
|
438
|
-
since_tag: "v1.3.0",
|
|
439
|
-
total_commits: 23,
|
|
440
|
-
sections: [
|
|
441
|
-
{ section: "Features", items: [{ message: "Add council strictness param", hash: "a3f2b1c0", ... }] },
|
|
442
|
-
{ section: "Bug Fixes", items: [...] },
|
|
443
|
-
{ section: "Refactoring", items: [...] }
|
|
444
|
-
]
|
|
445
|
-
}
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
### `veto_git_blame` — ownership data
|
|
449
|
-
|
|
450
|
-
```
|
|
451
|
-
veto_git_blame { file_path: "/your/project/src/auth.ts" }
|
|
452
|
-
→ {
|
|
453
|
-
path: "/your/project/src/auth.ts",
|
|
454
|
-
total_commits: 14,
|
|
455
|
-
contributors: [
|
|
456
|
-
{ commits: 9, author: "Jigyasu Dham" },
|
|
457
|
-
{ commits: 5, author: "contributor" }
|
|
458
|
-
],
|
|
459
|
-
last_modified_at: "2026-05-16 18:30:00 +0530",
|
|
460
|
-
last_author: "Jigyasu Dham",
|
|
461
|
-
last_commit_message: "fix: JWT expiry check for clock skew"
|
|
462
|
-
}
|
|
463
|
-
```
|
|
464
|
-
|
|
465
|
-
### `veto_explain` — now accepts raw text
|
|
466
|
-
|
|
467
|
-
```
|
|
468
|
-
# Error message / stack trace
|
|
469
|
-
veto_explain { text: "TypeError: Cannot read properties of undefined (reading 'id')\n at auth.ts:42" }
|
|
470
|
-
→ debugger agent explains the error and suggests root causes
|
|
471
|
-
|
|
472
|
-
# Still works for files
|
|
473
|
-
veto_explain { file_path: "/your/project/src/auth.ts", depth: "detailed" }
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
### Council `strictness` parameter
|
|
477
|
-
|
|
478
|
-
```
|
|
479
|
-
veto_council_debate { task: "...", strictness: "fast" } # 3 agents, instant
|
|
480
|
-
veto_council_debate { task: "...", strictness: "standard" } # 7 agents, default
|
|
481
|
-
veto_council_debate { task: "...", strictness: "strict" } # 7 + devil rebuttal
|
|
482
|
-
```
|
|
204
|
+
Token usage is manually reported — pass `token_count` to `veto_status` or `veto_session_save` and Veto stores it per platform per day. `veto_rate_status` shows what you've reported; nothing is counted automatically.
|
|
483
205
|
|
|
484
206
|
---
|
|
485
207
|
|
|
@@ -569,10 +291,13 @@ Open Gemini → veto_continue { resuming_as: "gemini" }
|
|
|
569
291
|
Full context restored. Continue exactly where you stopped.
|
|
570
292
|
```
|
|
571
293
|
|
|
294
|
+
Platform switching is manual — Veto surfaces which platform has budget remaining via `veto_rate_status`, you decide when to switch.
|
|
295
|
+
|
|
572
296
|
| Platform | Support |
|
|
573
297
|
|---|---|
|
|
574
298
|
| Claude Code | ✅ Native MCP |
|
|
575
299
|
| Gemini CLI | ✅ MCP support |
|
|
300
|
+
| Antigravity CLI | ✅ MCP support |
|
|
576
301
|
| Codex CLI | ✅ MCP support |
|
|
577
302
|
| Cursor | ✅ MCP support |
|
|
578
303
|
| Windsurf | ✅ MCP support |
|
|
@@ -580,76 +305,13 @@ Full context restored. Continue exactly where you stopped.
|
|
|
580
305
|
|
|
581
306
|
---
|
|
582
307
|
|
|
583
|
-
## Roadmap
|
|
584
|
-
|
|
585
|
-
| Phase | Status | Version |
|
|
586
|
-
|---|---|---|
|
|
587
|
-
| 1–12 — Foundation through CLI + Diff Review | ✅ Complete | v0.1.0 – v1.0.0 |
|
|
588
|
-
| 13 — Developer Intelligence + Auto Docs | ✅ Complete | v1.1.0 |
|
|
589
|
-
| 14 — Observability + Usage Stats + Audit Log | ✅ Complete | v1.2.0 |
|
|
590
|
-
| 15 — CI/CD Gates + GitHub PR Review | ✅ Complete | v1.2.5 |
|
|
591
|
-
| 16 — Workspace Discovery + Summarization + Doctor | ✅ Complete | v1.2.8 |
|
|
592
|
-
| 17 — VS Code Extension + Token Budget + Risk Annotations | ✅ Complete | v1.2.14 |
|
|
593
|
-
| 18 — Extension Upgrades | ✅ Complete | veto-vscode v0.6.0 |
|
|
594
|
-
| 19 — Auto-Learning Hooks | ✅ Complete | v1.2.15 |
|
|
595
|
-
| 20 — Auto-Store Memory on RED | ✅ Complete | v1.2.16 |
|
|
596
|
-
| 21 — Closing the Loop (auto-thresholds, pre-commit hook, benchmark) | ✅ Complete | v1.2.18 |
|
|
597
|
-
| 22 — LLM Council (MCP Sampling, per-model context windows) | ✅ Complete | v1.3.0 |
|
|
598
|
-
| 23 — Quality + Features (TTL cache, metrics, git blame, changelog, Zed, session tags) | ✅ Complete | v1.4.0 |
|
|
599
|
-
|
|
600
|
-
---
|
|
601
|
-
|
|
602
|
-
## Changelog
|
|
603
|
-
|
|
604
|
-
### v1.4.0
|
|
605
|
-
- **feat:** `veto_metrics` — live usage dashboard (sessions, council verdicts, top agents, quality trend, knowledge stats). Pure SQLite reads, zero cost.
|
|
606
|
-
- **feat:** `veto_changelog` — structured changelog from git history since last tag, grouped by conventional commit type.
|
|
607
|
-
- **feat:** `veto_git_blame` — file/directory ownership data from local git (contributors, commit counts, last-modified metadata).
|
|
608
|
-
- **feat:** Council `strictness` param — `fast` (3 core agents, instant) / `standard` (7 agents, default) / `strict` (7 + Devil's Advocate rebuttal round on most critical blocker).
|
|
609
|
-
- **feat:** Session tagging — `veto_session_save` accepts `tags: string[]`; `veto_sessions_list` accepts `query` for full-text search across summary, context, tags, and project_dir.
|
|
610
|
-
- **feat:** Zed editor support — `veto init` now auto-configures Zed via `~/.config/zed/settings.json` (`context_servers` key).
|
|
611
|
-
- **feat:** `veto_explain` accepts raw `text` — error messages, stack traces, and compiler output are auto-routed to the debugger agent.
|
|
612
|
-
- **fix:** `task_plans` TTL — cached plans older than 7 days are no longer returned; `veto_task_parse` checks cache before running the planner agent.
|
|
613
|
-
- **fix:** Complexity scorer — word-count cap raised from 20→25 pts; +5 bonus for tasks over 60 words.
|
|
614
|
-
- **fix:** Path sanitization — `readProjectContext` now validates that the resolved path is a directory before running any `git` commands.
|
|
615
|
-
- **refactor:** Tool definitions extracted from `server.ts` into `src/tools/definitions.ts` (49 tools, grouped by category). `server.ts` reduced from 2640 → 1907 lines.
|
|
616
|
-
|
|
617
|
-
### v1.3.0
|
|
618
|
-
- **feat:** Council agents are now LLM-backed via MCP Sampling — all 7 agents call the host LLM in parallel and return real reasoning, not deterministic templates. Deterministic fallback per agent if sampling is unavailable.
|
|
619
|
-
- **feat:** Full agent reasoning returned — `votes` now includes each agent's complete `reason`, `concerns`, and `recommendation`.
|
|
620
|
-
- **feat:** Knowledge retrieval pre-hook — council searches `knowledge_base` for similar past decisions before each debate.
|
|
621
|
-
- **feat:** `veto_benchmark` runs two LLM council debates in parallel.
|
|
622
|
-
- **feat:** Auto-store on YELLOW — significant YELLOW verdicts now stored in knowledge base with per-agent reasoning.
|
|
623
|
-
- **feat:** Per-model context windows — `veto_status` and `veto_session_save` accept `model` param for exact window resolution.
|
|
624
|
-
|
|
625
|
-
### v1.2.19
|
|
626
|
-
- **fix:** `veto_session_save` accepts optional `session_id` — updates that row in-place instead of inserting a new one.
|
|
627
|
-
|
|
628
|
-
### v1.2.18
|
|
629
|
-
- **feat:** Auto-apply learned thresholds after every 20 `autoRecord()` calls.
|
|
630
|
-
- **feat:** `veto hook install` / `veto hook remove` — pre-commit secrets scan hook.
|
|
631
|
-
- **feat:** `veto check` — fast secrets scan on staged changes.
|
|
632
|
-
- **feat:** `veto_benchmark` (tool #46) — two approaches → two parallel council debates → structured winner.
|
|
633
|
-
|
|
634
|
-
### v1.2.17
|
|
635
|
-
- **fix:** `veto version` no longer shows "Unknown command".
|
|
636
|
-
- **fix:** Unknown commands show a short 2-line error.
|
|
637
|
-
- **fix:** `veto help` is now ~50 lines; full troubleshooting moved to `veto help --troubleshoot`.
|
|
638
|
-
- **feat:** Sessions track `save_type` (`manual` | `auto`); `veto sessions --clean` removes old auto-saves.
|
|
639
|
-
|
|
640
|
-
### v1.2.15 – v1.2.16
|
|
641
|
-
- Auto-learning hooks — `learning_data` fills automatically from every agent-producing tool.
|
|
642
|
-
- Auto-store knowledge entries on RED council verdict and critical scan failures.
|
|
643
|
-
|
|
644
|
-
---
|
|
645
|
-
|
|
646
308
|
## Tech Stack
|
|
647
309
|
|
|
648
310
|
- **Language:** TypeScript (strict mode)
|
|
649
311
|
- **Runtime:** Node.js 22.5+ (built-in `node:sqlite` — no native compilation)
|
|
650
312
|
- **Dependencies:** `@modelcontextprotocol/sdk` only — one package, zero native addons
|
|
651
313
|
- **Memory:** Local SQLite — zero config, works offline, portable via JSON export
|
|
652
|
-
- **Platforms:** Claude Code · Gemini CLI · Codex CLI · Cursor · Windsurf · Zed
|
|
314
|
+
- **Platforms:** Claude Code · Gemini CLI · Antigravity CLI · Codex CLI · Cursor · Windsurf · Zed
|
|
653
315
|
|
|
654
316
|
---
|
|
655
317
|
|
package/dist/cli.js
CHANGED
|
@@ -307,7 +307,7 @@ async function initCommand() {
|
|
|
307
307
|
console.log('');
|
|
308
308
|
const VETO_GUIDE = `# Veto MCP Server
|
|
309
309
|
|
|
310
|
-
Veto is active.
|
|
310
|
+
Veto is active. 62 tools across 6 categories:
|
|
311
311
|
|
|
312
312
|
**Session & Context** — veto_status · veto_session_save · veto_continue · veto_handoff
|
|
313
313
|
Save work at 60–70% context capacity. veto_status triggers auto-save above 70%.
|
|
@@ -468,7 +468,7 @@ Recommended start sequence:
|
|
|
468
468
|
}
|
|
469
469
|
if (configured === 0 && skipped === 0) {
|
|
470
470
|
console.log(c.yellow(' ⚠ No AI tools detected.'));
|
|
471
|
-
console.log(' Install Claude Code, Gemini CLI, or Codex CLI and run veto init again.');
|
|
471
|
+
console.log(' Install Claude Code, Gemini CLI, Antigravity CLI, or Codex CLI and run veto init again.');
|
|
472
472
|
console.log('');
|
|
473
473
|
}
|
|
474
474
|
else {
|
|
@@ -484,6 +484,28 @@ Recommended start sequence:
|
|
|
484
484
|
console.log(c.dim(' Tip: run `veto init` again anytime to install newly-added AI tools.'));
|
|
485
485
|
console.log('');
|
|
486
486
|
}
|
|
487
|
+
// ── Billing mode detection ──────────────────────────────────────────────────
|
|
488
|
+
// Check for API key env vars as a signal the user may be on pay-per-token billing.
|
|
489
|
+
const apiKeyEnvVars = ['ANTHROPIC_API_KEY', 'GEMINI_API_KEY', 'GOOGLE_API_KEY', 'OPENAI_API_KEY'];
|
|
490
|
+
const detectedKeys = apiKeyEnvVars.filter(k => !!process.env[k]);
|
|
491
|
+
const { setConfig: setVetoConfig } = await import('./memory/config.js');
|
|
492
|
+
if (detectedKeys.length > 0) {
|
|
493
|
+
setVetoConfig({ billing_mode: 'api' });
|
|
494
|
+
console.log(c.yellow(' ⚠ API key environment variables detected:') + c.dim(` ${detectedKeys.join(', ')}`));
|
|
495
|
+
console.log(c.yellow(' Veto has set billing_mode = api in ~/.veto/config.json.'));
|
|
496
|
+
console.log('');
|
|
497
|
+
console.log(' ' + c.bold('Important — cost warning:'));
|
|
498
|
+
console.log(' Veto\'s "zero cost" claim applies to subscription plans (Claude Max, Gemini');
|
|
499
|
+
console.log(' Advanced, etc.). On API/pay-per-token billing, any MCP Sampling calls made');
|
|
500
|
+
console.log(' by Veto agents will count toward your token usage and be billed accordingly.');
|
|
501
|
+
console.log('');
|
|
502
|
+
console.log(c.dim(' To silence this warning if you are on a subscription:'));
|
|
503
|
+
console.log(c.dim(' Edit ~/.veto/config.json and set "billing_mode": "subscription"'));
|
|
504
|
+
console.log('');
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
setVetoConfig({ billing_mode: 'subscription' });
|
|
508
|
+
}
|
|
487
509
|
}
|
|
488
510
|
// ─── Doctor Command ─────────────────────────────────────────────────────────────
|
|
489
511
|
async function doctorCommand() {
|
|
@@ -637,6 +659,23 @@ async function doctorCommand() {
|
|
|
637
659
|
issues++;
|
|
638
660
|
}
|
|
639
661
|
}
|
|
662
|
+
// Billing mode
|
|
663
|
+
console.log('');
|
|
664
|
+
console.log(' ' + c.bold('Billing'));
|
|
665
|
+
console.log(c.dim(' ─────────────────────────────────────────────────────'));
|
|
666
|
+
const { getConfig: getVetoConfig } = await import('./memory/config.js');
|
|
667
|
+
const vetoConfig = getVetoConfig();
|
|
668
|
+
const apiKeyEnvVarsDoctor = ['ANTHROPIC_API_KEY', 'GEMINI_API_KEY', 'GOOGLE_API_KEY', 'OPENAI_API_KEY'];
|
|
669
|
+
const detectedKeysDoctor = apiKeyEnvVarsDoctor.filter(k => !!process.env[k]);
|
|
670
|
+
if (vetoConfig.billing_mode === 'api' || detectedKeysDoctor.length > 0) {
|
|
671
|
+
console.log(` ${c.yellow('⚠')} billing_mode: ${c.yellow('api')} — MCP Sampling calls count toward your token usage`);
|
|
672
|
+
console.log(` ${c.dim(' Veto\'s "zero cost" claim applies to subscription plans only.')}`);
|
|
673
|
+
console.log(` ${c.dim(' To update: edit ~/.veto/config.json → "billing_mode": "subscription"')}`);
|
|
674
|
+
issues++;
|
|
675
|
+
}
|
|
676
|
+
else {
|
|
677
|
+
console.log(` ${c.green('✓')} billing_mode: subscription — zero extra cost`);
|
|
678
|
+
}
|
|
640
679
|
console.log('');
|
|
641
680
|
if (issues === 0) {
|
|
642
681
|
console.log(c.green(' ✓ All checks passed — Veto is healthy!'));
|
|
@@ -891,10 +930,10 @@ function troubleshootCommand() {
|
|
|
891
930
|
console.log(` ${c.dim('→')} Use ${c.cyan('veto_rate_status')} tool to check current usage`);
|
|
892
931
|
console.log(` ${c.dim('→')} Wait a moment, then retry — limits reset per minute`);
|
|
893
932
|
console.log('');
|
|
894
|
-
console.log(` ${c.yellow('veto init fails
|
|
895
|
-
console.log(` ${c.dim('→')}
|
|
896
|
-
console.log(` ${c.dim('→')}
|
|
897
|
-
console.log(` ${c.dim('→')}
|
|
933
|
+
console.log(` ${c.yellow('veto init fails on first run')}`);
|
|
934
|
+
console.log(` ${c.dim('→')} Veto does not require an API key — it uses your existing AI subscriptions via MCP`);
|
|
935
|
+
console.log(` ${c.dim('→')} Ensure Node.js >= 22 and run ${c.cyan('veto init')} from your project directory`);
|
|
936
|
+
console.log(` ${c.dim('→')} Check that your AI client (Claude Code / Gemini / Codex / Antigravity) is installed`);
|
|
898
937
|
console.log('');
|
|
899
938
|
console.log(` ${c.yellow('veto_health shows degraded / components failing')}`);
|
|
900
939
|
console.log(` ${c.dim('→')} Run ${c.cyan('veto status')} for a summary of all components`);
|