@jigyasudham/veto 0.8.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 (198) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/README.md +190 -0
  3. package/dist/adapters/claude.js +57 -0
  4. package/dist/adapters/codex.js +58 -0
  5. package/dist/adapters/gemini.js +58 -0
  6. package/dist/adapters/index.js +156 -0
  7. package/dist/agents/development/api.js +116 -0
  8. package/dist/agents/development/backend.js +82 -0
  9. package/dist/agents/development/coder.js +207 -0
  10. package/dist/agents/development/database.js +81 -0
  11. package/dist/agents/development/debugger.js +234 -0
  12. package/dist/agents/development/devops.js +84 -0
  13. package/dist/agents/development/frontend.js +83 -0
  14. package/dist/agents/development/migration.js +141 -0
  15. package/dist/agents/development/performance.js +142 -0
  16. package/dist/agents/development/refactor.js +85 -0
  17. package/dist/agents/development/reviewer.js +260 -0
  18. package/dist/agents/development/tester.js +143 -0
  19. package/dist/agents/executor.js +144 -0
  20. package/dist/agents/memory/context-manager.js +167 -0
  21. package/dist/agents/memory/decision-logger.js +157 -0
  22. package/dist/agents/memory/knowledge-base.js +120 -0
  23. package/dist/agents/memory/pattern-learner.js +140 -0
  24. package/dist/agents/memory/project-mapper.js +114 -0
  25. package/dist/agents/quality/accessibility.js +89 -0
  26. package/dist/agents/quality/code-quality.js +109 -0
  27. package/dist/agents/quality/compatibility.js +55 -0
  28. package/dist/agents/quality/documentation.js +95 -0
  29. package/dist/agents/quality/error-handling.js +87 -0
  30. package/dist/agents/research/competitor-analyzer.js +44 -0
  31. package/dist/agents/research/cost-analyzer.js +51 -0
  32. package/dist/agents/research/estimator.js +57 -0
  33. package/dist/agents/research/ethics-bias.js +111 -0
  34. package/dist/agents/research/researcher.js +112 -0
  35. package/dist/agents/research/risk-assessor.js +61 -0
  36. package/dist/agents/research/tech-advisor.js +52 -0
  37. package/dist/agents/security/auth.js +269 -0
  38. package/dist/agents/security/dependency-audit.js +273 -0
  39. package/dist/agents/security/penetration.js +245 -0
  40. package/dist/agents/security/privacy.js +259 -0
  41. package/dist/agents/security/scanner.js +288 -0
  42. package/dist/agents/security/secrets.js +212 -0
  43. package/dist/agents/types.js +2 -0
  44. package/dist/agents/workflow/automation.js +56 -0
  45. package/dist/agents/workflow/file-manager.js +49 -0
  46. package/dist/agents/workflow/git-agent.js +52 -0
  47. package/dist/agents/workflow/reporter.js +48 -0
  48. package/dist/agents/workflow/search-agent.js +39 -0
  49. package/dist/agents/workflow/task-coordinator.js +40 -0
  50. package/dist/agents/workflow/task-planner.js +46 -0
  51. package/dist/cli.js +132 -0
  52. package/dist/council/decision-engine.js +136 -0
  53. package/dist/council/devil-advocate.js +106 -0
  54. package/dist/council/index.js +37 -0
  55. package/dist/council/lead-developer.js +108 -0
  56. package/dist/council/legal-compliance.js +142 -0
  57. package/dist/council/product-manager.js +92 -0
  58. package/dist/council/security.js +162 -0
  59. package/dist/council/system-architect.js +122 -0
  60. package/dist/council/types.js +2 -0
  61. package/dist/council/ux-designer.js +109 -0
  62. package/dist/memory/local.js +182 -0
  63. package/dist/memory/schema.js +116 -0
  64. package/dist/memory/sync.js +199 -0
  65. package/dist/router/complexity-scorer.js +78 -0
  66. package/dist/router/context-compressor.js +58 -0
  67. package/dist/router/index.js +29 -0
  68. package/dist/router/learning-updater.js +186 -0
  69. package/dist/router/model-selector.js +51 -0
  70. package/dist/router/rate-monitor.js +73 -0
  71. package/dist/server.js +949 -0
  72. package/dist/skills/development/skill-api-design.js +313 -0
  73. package/dist/skills/development/skill-auth.js +255 -0
  74. package/dist/skills/development/skill-ci-cd.js +2 -0
  75. package/dist/skills/development/skill-crud.js +193 -0
  76. package/dist/skills/development/skill-db-schema.js +2 -0
  77. package/dist/skills/development/skill-docker.js +2 -0
  78. package/dist/skills/development/skill-env-setup.js +2 -0
  79. package/dist/skills/development/skill-scaffold.js +299 -0
  80. package/dist/skills/intelligence/skill-complexity-score.js +66 -0
  81. package/dist/skills/intelligence/skill-cost-track.js +36 -0
  82. package/dist/skills/intelligence/skill-learning-loop.js +66 -0
  83. package/dist/skills/intelligence/skill-pattern-detect.js +35 -0
  84. package/dist/skills/intelligence/skill-rate-watch.js +58 -0
  85. package/dist/skills/memory/skill-context-compress.js +82 -0
  86. package/dist/skills/memory/skill-cross-sync.js +88 -0
  87. package/dist/skills/memory/skill-decision-log.js +103 -0
  88. package/dist/skills/memory/skill-session-restore.js +44 -0
  89. package/dist/skills/memory/skill-session-save.js +78 -0
  90. package/dist/skills/quality/skill-accessibility.js +2 -0
  91. package/dist/skills/quality/skill-code-review.js +60 -0
  92. package/dist/skills/quality/skill-docs-gen.js +2 -0
  93. package/dist/skills/quality/skill-perf-audit.js +2 -0
  94. package/dist/skills/quality/skill-security-scan.js +67 -0
  95. package/dist/skills/quality/skill-test-suite.js +274 -0
  96. package/dist/skills/workflow/skill-deploy.js +2 -0
  97. package/dist/skills/workflow/skill-git-workflow.js +2 -0
  98. package/dist/skills/workflow/skill-rollback.js +2 -0
  99. package/dist/skills/workflow/skill-task-breakdown.js +2 -0
  100. package/package.json +30 -0
  101. package/src/adapters/claude.ts +70 -0
  102. package/src/adapters/codex.ts +71 -0
  103. package/src/adapters/gemini.ts +71 -0
  104. package/src/adapters/index.ts +217 -0
  105. package/src/agents/development/api.ts +120 -0
  106. package/src/agents/development/backend.ts +85 -0
  107. package/src/agents/development/coder.ts +213 -0
  108. package/src/agents/development/database.ts +83 -0
  109. package/src/agents/development/debugger.ts +238 -0
  110. package/src/agents/development/devops.ts +86 -0
  111. package/src/agents/development/frontend.ts +85 -0
  112. package/src/agents/development/migration.ts +144 -0
  113. package/src/agents/development/performance.ts +144 -0
  114. package/src/agents/development/refactor.ts +86 -0
  115. package/src/agents/development/reviewer.ts +268 -0
  116. package/src/agents/development/tester.ts +151 -0
  117. package/src/agents/executor.ts +158 -0
  118. package/src/agents/memory/context-manager.ts +171 -0
  119. package/src/agents/memory/decision-logger.ts +160 -0
  120. package/src/agents/memory/knowledge-base.ts +124 -0
  121. package/src/agents/memory/pattern-learner.ts +143 -0
  122. package/src/agents/memory/project-mapper.ts +118 -0
  123. package/src/agents/quality/accessibility.ts +99 -0
  124. package/src/agents/quality/code-quality.ts +115 -0
  125. package/src/agents/quality/compatibility.ts +58 -0
  126. package/src/agents/quality/documentation.ts +105 -0
  127. package/src/agents/quality/error-handling.ts +96 -0
  128. package/src/agents/research/competitor-analyzer.ts +45 -0
  129. package/src/agents/research/cost-analyzer.ts +54 -0
  130. package/src/agents/research/estimator.ts +60 -0
  131. package/src/agents/research/ethics-bias.ts +113 -0
  132. package/src/agents/research/researcher.ts +114 -0
  133. package/src/agents/research/risk-assessor.ts +63 -0
  134. package/src/agents/research/tech-advisor.ts +55 -0
  135. package/src/agents/security/auth.ts +287 -0
  136. package/src/agents/security/dependency-audit.ts +337 -0
  137. package/src/agents/security/penetration.ts +262 -0
  138. package/src/agents/security/privacy.ts +285 -0
  139. package/src/agents/security/scanner.ts +322 -0
  140. package/src/agents/security/secrets.ts +249 -0
  141. package/src/agents/types.ts +66 -0
  142. package/src/agents/workflow/automation.ts +59 -0
  143. package/src/agents/workflow/file-manager.ts +52 -0
  144. package/src/agents/workflow/git-agent.ts +55 -0
  145. package/src/agents/workflow/reporter.ts +51 -0
  146. package/src/agents/workflow/search-agent.ts +40 -0
  147. package/src/agents/workflow/task-coordinator.ts +41 -0
  148. package/src/agents/workflow/task-planner.ts +47 -0
  149. package/src/cli.ts +143 -0
  150. package/src/council/decision-engine.ts +171 -0
  151. package/src/council/devil-advocate.ts +116 -0
  152. package/src/council/index.ts +44 -0
  153. package/src/council/lead-developer.ts +118 -0
  154. package/src/council/legal-compliance.ts +152 -0
  155. package/src/council/product-manager.ts +102 -0
  156. package/src/council/security.ts +172 -0
  157. package/src/council/system-architect.ts +132 -0
  158. package/src/council/types.ts +33 -0
  159. package/src/council/ux-designer.ts +121 -0
  160. package/src/memory/local.ts +305 -0
  161. package/src/memory/schema.ts +174 -0
  162. package/src/memory/sync.ts +274 -0
  163. package/src/router/complexity-scorer.ts +96 -0
  164. package/src/router/context-compressor.ts +74 -0
  165. package/src/router/index.ts +60 -0
  166. package/src/router/learning-updater.ts +271 -0
  167. package/src/router/model-selector.ts +83 -0
  168. package/src/router/rate-monitor.ts +103 -0
  169. package/src/server.ts +1038 -0
  170. package/src/skills/development/skill-api-design.ts +329 -0
  171. package/src/skills/development/skill-auth.ts +271 -0
  172. package/src/skills/development/skill-ci-cd.ts +0 -0
  173. package/src/skills/development/skill-crud.ts +209 -0
  174. package/src/skills/development/skill-db-schema.ts +0 -0
  175. package/src/skills/development/skill-docker.ts +0 -0
  176. package/src/skills/development/skill-env-setup.ts +0 -0
  177. package/src/skills/development/skill-scaffold.ts +323 -0
  178. package/src/skills/intelligence/skill-complexity-score.ts +69 -0
  179. package/src/skills/intelligence/skill-cost-track.ts +39 -0
  180. package/src/skills/intelligence/skill-learning-loop.ts +69 -0
  181. package/src/skills/intelligence/skill-pattern-detect.ts +38 -0
  182. package/src/skills/intelligence/skill-rate-watch.ts +61 -0
  183. package/src/skills/memory/skill-context-compress.ts +98 -0
  184. package/src/skills/memory/skill-cross-sync.ts +104 -0
  185. package/src/skills/memory/skill-decision-log.ts +119 -0
  186. package/src/skills/memory/skill-session-restore.ts +59 -0
  187. package/src/skills/memory/skill-session-save.ts +94 -0
  188. package/src/skills/quality/skill-accessibility.ts +0 -0
  189. package/src/skills/quality/skill-code-review.ts +84 -0
  190. package/src/skills/quality/skill-docs-gen.ts +0 -0
  191. package/src/skills/quality/skill-perf-audit.ts +0 -0
  192. package/src/skills/quality/skill-security-scan.ts +91 -0
  193. package/src/skills/quality/skill-test-suite.ts +290 -0
  194. package/src/skills/workflow/skill-deploy.ts +0 -0
  195. package/src/skills/workflow/skill-git-workflow.ts +0 -0
  196. package/src/skills/workflow/skill-rollback.ts +0 -0
  197. package/src/skills/workflow/skill-task-breakdown.ts +0 -0
  198. package/tsconfig.json +20 -0
@@ -0,0 +1,305 @@
1
+ // Local SQLite memory — all operations for session save/restore
2
+ // Uses Node.js built-in node:sqlite (Node 22.5+, no native compilation needed)
3
+
4
+ import { DatabaseSync } from 'node:sqlite';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { join } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ import { mkdirSync } from 'node:fs';
9
+ import { CREATE_TABLES, type SessionRow, type KnowledgeRow, type KnowledgeType, type ProjectMapRow } from './schema.js';
10
+
11
+ const VETO_DIR = join(homedir(), '.veto');
12
+ const DB_PATH = join(VETO_DIR, 'veto.db');
13
+
14
+ let _db: DatabaseSync | null = null;
15
+
16
+ export function getDb(): DatabaseSync {
17
+ if (_db) return _db;
18
+ mkdirSync(VETO_DIR, { recursive: true });
19
+ _db = new DatabaseSync(DB_PATH);
20
+ _db.exec('PRAGMA journal_mode = WAL');
21
+ _db.exec('PRAGMA foreign_keys = ON');
22
+ _db.exec(CREATE_TABLES);
23
+ migrateCouncilOutcomes(_db);
24
+ migrateCouncilColumns(_db);
25
+ return _db;
26
+ }
27
+
28
+ // Adds legal and security columns if they don't exist (Phase 3 → Phase 3.1 migration)
29
+ function migrateCouncilColumns(db: DatabaseSync): void {
30
+ const cols = db.prepare('PRAGMA table_info(council_outcomes)').all() as Array<{ name: string }>;
31
+ const names = new Set(cols.map(c => c.name));
32
+ if (!names.has('legal')) db.exec('ALTER TABLE council_outcomes ADD COLUMN legal TEXT');
33
+ if (!names.has('security')) db.exec('ALTER TABLE council_outcomes ADD COLUMN security TEXT');
34
+ }
35
+
36
+ // Migrates council_outcomes if it was created with NOT NULL session_id (Phase 1/2 schema)
37
+ function migrateCouncilOutcomes(db: DatabaseSync): void {
38
+ const cols = db.prepare('PRAGMA table_info(council_outcomes)').all() as Array<{ name: string; notnull: number }>;
39
+ const col = cols.find(c => c.name === 'session_id');
40
+ if (!col || col.notnull !== 1) return;
41
+
42
+ db.exec(`
43
+ CREATE TABLE IF NOT EXISTS _council_outcomes_new (
44
+ id TEXT PRIMARY KEY, session_id TEXT, task TEXT NOT NULL,
45
+ verdict TEXT NOT NULL, lead_dev TEXT, pm TEXT, architect TEXT,
46
+ ux TEXT, devil TEXT, recommended TEXT, debated_at TEXT NOT NULL
47
+ );
48
+ INSERT OR IGNORE INTO _council_outcomes_new SELECT * FROM council_outcomes;
49
+ DROP TABLE council_outcomes;
50
+ ALTER TABLE _council_outcomes_new RENAME TO council_outcomes;
51
+ `);
52
+ }
53
+
54
+ export type SaveSessionInput = {
55
+ platform?: string;
56
+ project_dir?: string;
57
+ summary?: string;
58
+ context?: string;
59
+ task_state?: string;
60
+ token_count?: number;
61
+ };
62
+
63
+ export type SessionSaveResult = {
64
+ session_id: string;
65
+ saved_at: string;
66
+ };
67
+
68
+ export function saveSession(input: SaveSessionInput): SessionSaveResult {
69
+ const db = getDb();
70
+ const id = randomUUID();
71
+ const now = new Date().toISOString();
72
+
73
+ const stmt = db.prepare(`
74
+ INSERT INTO sessions (id, started_at, platform, project_dir, summary, context, task_state, token_count)
75
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
76
+ `);
77
+ stmt.run(
78
+ id,
79
+ now,
80
+ input.platform ?? 'claude',
81
+ input.project_dir ?? null,
82
+ input.summary ?? null,
83
+ input.context ? JSON.stringify(input.context) : null,
84
+ input.task_state ? JSON.stringify(input.task_state) : null,
85
+ input.token_count ?? 0
86
+ );
87
+
88
+ return { session_id: id, saved_at: now };
89
+ }
90
+
91
+ export type RestoreSessionResult = {
92
+ found: boolean;
93
+ session?: SessionRow;
94
+ };
95
+
96
+ export function restoreSession(session_id: string): RestoreSessionResult {
97
+ const db = getDb();
98
+ const row = db.prepare('SELECT * FROM sessions WHERE id = ?').get(session_id) as SessionRow | undefined;
99
+ if (!row) return { found: false };
100
+ return { found: true, session: row };
101
+ }
102
+
103
+ export function listSessions(limit = 10): SessionRow[] {
104
+ const db = getDb();
105
+ return db.prepare(
106
+ 'SELECT * FROM sessions ORDER BY created_at DESC LIMIT ?'
107
+ ).all(limit) as SessionRow[];
108
+ }
109
+
110
+ export function closeSession(session_id: string): void {
111
+ const db = getDb();
112
+ db.prepare('UPDATE sessions SET ended_at = ? WHERE id = ?')
113
+ .run(new Date().toISOString(), session_id);
114
+ }
115
+
116
+ export function getDbPath(): string {
117
+ return DB_PATH;
118
+ }
119
+
120
+ export type SaveCouncilOutcomeInput = {
121
+ session_id?: string;
122
+ task: string;
123
+ verdict: string;
124
+ lead_dev: string;
125
+ pm: string;
126
+ architect: string;
127
+ ux: string;
128
+ devil: string;
129
+ legal: string;
130
+ security: string;
131
+ recommended: string;
132
+ };
133
+
134
+ export function saveCouncilOutcome(input: SaveCouncilOutcomeInput): string {
135
+ const db = getDb();
136
+ const id = randomUUID();
137
+ const now = new Date().toISOString();
138
+ db.prepare(`
139
+ INSERT INTO council_outcomes
140
+ (id, session_id, task, verdict, lead_dev, pm, architect, ux, devil, legal, security, recommended, debated_at)
141
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
142
+ `).run(id, input.session_id ?? null, input.task, input.verdict,
143
+ input.lead_dev, input.pm, input.architect, input.ux, input.devil,
144
+ input.legal, input.security, input.recommended, now);
145
+ return id;
146
+ }
147
+
148
+ // ─── Knowledge Base ───────────────────────────────────────────────────────────
149
+
150
+ export type StoreKnowledgeInput = {
151
+ type?: KnowledgeType;
152
+ title: string;
153
+ content: string;
154
+ tags?: string[];
155
+ project_dir?: string;
156
+ session_id?: string;
157
+ relevance?: number;
158
+ };
159
+
160
+ export function storeKnowledge(input: StoreKnowledgeInput): string {
161
+ const db = getDb();
162
+ const id = randomUUID();
163
+ const now = new Date().toISOString();
164
+ db.prepare(`
165
+ INSERT INTO knowledge_base (id, type, title, content, tags, project_dir, session_id, relevance, created_at, updated_at)
166
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
167
+ `).run(
168
+ id,
169
+ input.type ?? 'solution',
170
+ input.title,
171
+ input.content,
172
+ input.tags ? JSON.stringify(input.tags) : null,
173
+ input.project_dir ?? null,
174
+ input.session_id ?? null,
175
+ input.relevance ?? 1.0,
176
+ now,
177
+ now
178
+ );
179
+ return id;
180
+ }
181
+
182
+ export type SearchKnowledgeOptions = {
183
+ query?: string;
184
+ type?: KnowledgeType;
185
+ tags?: string[];
186
+ project_dir?: string;
187
+ limit?: number;
188
+ };
189
+
190
+ export function searchKnowledge(opts: SearchKnowledgeOptions): KnowledgeRow[] {
191
+ const db = getDb();
192
+ const limit = Math.min(opts.limit ?? 10, 50);
193
+ const conditions: string[] = [];
194
+ const params: (string | number)[] = [];
195
+
196
+ if (opts.query) {
197
+ conditions.push('(title LIKE ? OR content LIKE ?)');
198
+ const q = `%${opts.query}%`;
199
+ params.push(q, q);
200
+ }
201
+ if (opts.type) {
202
+ conditions.push('type = ?');
203
+ params.push(opts.type);
204
+ }
205
+ if (opts.project_dir) {
206
+ conditions.push('project_dir = ?');
207
+ params.push(opts.project_dir);
208
+ }
209
+
210
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
211
+ const rows = db.prepare(
212
+ `SELECT * FROM knowledge_base ${where} ORDER BY relevance DESC, accessed_count DESC, created_at DESC LIMIT ?`
213
+ ).all(...params, limit) as KnowledgeRow[];
214
+
215
+ if (rows.length > 0 && opts.query) {
216
+ const ids = rows.map(r => `'${r.id}'`).join(',');
217
+ db.exec(`UPDATE knowledge_base SET accessed_count = accessed_count + 1 WHERE id IN (${ids})`);
218
+ }
219
+
220
+ return rows;
221
+ }
222
+
223
+ export function deleteKnowledge(id: string): boolean {
224
+ const db = getDb();
225
+ const result = db.prepare('DELETE FROM knowledge_base WHERE id = ?').run(id) as { changes: number };
226
+ return result.changes > 0;
227
+ }
228
+
229
+ // ─── Project Map ──────────────────────────────────────────────────────────────
230
+
231
+ export type UpdateProjectMapInput = {
232
+ project_dir: string;
233
+ structure: Record<string, unknown> | string;
234
+ key_modules?: string[];
235
+ tech_stack?: string[];
236
+ };
237
+
238
+ export function updateProjectMap(input: UpdateProjectMapInput): string {
239
+ const db = getDb();
240
+ const now = new Date().toISOString();
241
+ const existing = db.prepare('SELECT id FROM project_map WHERE project_dir = ?').get(input.project_dir) as { id: string } | undefined;
242
+
243
+ const structure = typeof input.structure === 'string' ? input.structure : JSON.stringify(input.structure);
244
+ const key_modules = input.key_modules ? JSON.stringify(input.key_modules) : null;
245
+ const tech_stack = input.tech_stack ? JSON.stringify(input.tech_stack) : null;
246
+
247
+ if (existing) {
248
+ db.prepare(`
249
+ UPDATE project_map SET structure = ?, key_modules = ?, tech_stack = ?, updated_at = ?
250
+ WHERE project_dir = ?
251
+ `).run(structure, key_modules, tech_stack, now, input.project_dir);
252
+ return existing.id;
253
+ }
254
+
255
+ const id = randomUUID();
256
+ db.prepare(`
257
+ INSERT INTO project_map (id, project_dir, structure, key_modules, tech_stack, updated_at)
258
+ VALUES (?, ?, ?, ?, ?, ?)
259
+ `).run(id, input.project_dir, structure, key_modules, tech_stack, now);
260
+ return id;
261
+ }
262
+
263
+ export function getProjectMap(project_dir: string): ProjectMapRow | null {
264
+ const db = getDb();
265
+ return db.prepare('SELECT * FROM project_map WHERE project_dir = ?').get(project_dir) as ProjectMapRow | null;
266
+ }
267
+
268
+ // ─── Pattern Operations ───────────────────────────────────────────────────────
269
+
270
+ export type UpsertPatternInput = {
271
+ pattern_key: string;
272
+ pattern_val: string;
273
+ confidence?: number;
274
+ };
275
+
276
+ export function upsertPattern(input: UpsertPatternInput): void {
277
+ const db = getDb();
278
+ const now = new Date().toISOString();
279
+ const existing = db.prepare('SELECT id, seen_count, confidence FROM patterns WHERE pattern_key = ?').get(input.pattern_key) as { id: string; seen_count: number; confidence: number } | undefined;
280
+
281
+ if (existing) {
282
+ const newConfidence = Math.min(1.0, (existing.confidence + (input.confidence ?? 1.0)) / 2);
283
+ db.prepare(`
284
+ UPDATE patterns SET pattern_val = ?, confidence = ?, seen_count = seen_count + 1, updated_at = ?
285
+ WHERE pattern_key = ?
286
+ `).run(input.pattern_val, newConfidence, now, input.pattern_key);
287
+ } else {
288
+ db.prepare(`
289
+ INSERT INTO patterns (id, pattern_key, pattern_val, confidence, seen_count, updated_at)
290
+ VALUES (?, ?, ?, ?, 1, ?)
291
+ `).run(randomUUID(), input.pattern_key, input.pattern_val, input.confidence ?? 1.0, now);
292
+ }
293
+ }
294
+
295
+ export function getPatterns(prefix?: string, limit = 20): import('./schema.js').PatternRow[] {
296
+ const db = getDb();
297
+ if (prefix) {
298
+ return db.prepare(
299
+ 'SELECT * FROM patterns WHERE pattern_key LIKE ? ORDER BY confidence DESC, seen_count DESC LIMIT ?'
300
+ ).all(`${prefix}%`, limit) as import('./schema.js').PatternRow[];
301
+ }
302
+ return db.prepare(
303
+ 'SELECT * FROM patterns ORDER BY confidence DESC, seen_count DESC LIMIT ?'
304
+ ).all(limit) as import('./schema.js').PatternRow[];
305
+ }
@@ -0,0 +1,174 @@
1
+ // Database schema definitions for veto.db
2
+ // All tables created on first run — zero setup required
3
+
4
+ export const CREATE_TABLES = `
5
+ CREATE TABLE IF NOT EXISTS sessions (
6
+ id TEXT PRIMARY KEY,
7
+ started_at TEXT NOT NULL,
8
+ ended_at TEXT,
9
+ platform TEXT NOT NULL DEFAULT 'claude',
10
+ project_dir TEXT,
11
+ summary TEXT,
12
+ context TEXT,
13
+ task_state TEXT,
14
+ token_count INTEGER DEFAULT 0,
15
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
16
+ );
17
+
18
+ CREATE TABLE IF NOT EXISTS decisions (
19
+ id TEXT PRIMARY KEY,
20
+ session_id TEXT NOT NULL,
21
+ made_at TEXT NOT NULL,
22
+ decision TEXT NOT NULL,
23
+ rationale TEXT,
24
+ council_verdict TEXT,
25
+ files_affected TEXT,
26
+ overridden INTEGER DEFAULT 0,
27
+ FOREIGN KEY (session_id) REFERENCES sessions(id)
28
+ );
29
+
30
+ CREATE TABLE IF NOT EXISTS files_modified (
31
+ id TEXT PRIMARY KEY,
32
+ session_id TEXT NOT NULL,
33
+ file_path TEXT NOT NULL,
34
+ operation TEXT NOT NULL,
35
+ modified_at TEXT NOT NULL,
36
+ FOREIGN KEY (session_id) REFERENCES sessions(id)
37
+ );
38
+
39
+ CREATE TABLE IF NOT EXISTS council_outcomes (
40
+ id TEXT PRIMARY KEY,
41
+ session_id TEXT,
42
+ task TEXT NOT NULL,
43
+ verdict TEXT NOT NULL,
44
+ lead_dev TEXT,
45
+ pm TEXT,
46
+ architect TEXT,
47
+ ux TEXT,
48
+ devil TEXT,
49
+ legal TEXT,
50
+ security TEXT,
51
+ recommended TEXT,
52
+ debated_at TEXT NOT NULL
53
+ );
54
+
55
+ CREATE TABLE IF NOT EXISTS learning_data (
56
+ id TEXT PRIMARY KEY,
57
+ task_type TEXT NOT NULL,
58
+ complexity INTEGER NOT NULL,
59
+ model_tier INTEGER NOT NULL,
60
+ output_quality INTEGER,
61
+ tokens_used INTEGER,
62
+ agent TEXT,
63
+ recorded_at TEXT NOT NULL DEFAULT (datetime('now'))
64
+ );
65
+
66
+ CREATE TABLE IF NOT EXISTS patterns (
67
+ id TEXT PRIMARY KEY,
68
+ pattern_key TEXT NOT NULL UNIQUE,
69
+ pattern_val TEXT NOT NULL,
70
+ confidence REAL DEFAULT 1.0,
71
+ seen_count INTEGER DEFAULT 1,
72
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
73
+ );
74
+
75
+ CREATE TABLE IF NOT EXISTS rate_usage (
76
+ id TEXT PRIMARY KEY,
77
+ platform TEXT NOT NULL,
78
+ date_key TEXT NOT NULL,
79
+ request_count INTEGER DEFAULT 0,
80
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
81
+ UNIQUE(platform, date_key)
82
+ );
83
+
84
+ CREATE TABLE IF NOT EXISTS knowledge_base (
85
+ id TEXT PRIMARY KEY,
86
+ type TEXT NOT NULL DEFAULT 'solution',
87
+ title TEXT NOT NULL,
88
+ content TEXT NOT NULL,
89
+ tags TEXT,
90
+ project_dir TEXT,
91
+ session_id TEXT,
92
+ relevance REAL DEFAULT 1.0,
93
+ accessed_count INTEGER DEFAULT 0,
94
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
95
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
96
+ );
97
+
98
+ CREATE TABLE IF NOT EXISTS project_map (
99
+ id TEXT PRIMARY KEY,
100
+ project_dir TEXT NOT NULL UNIQUE,
101
+ structure TEXT NOT NULL,
102
+ key_modules TEXT,
103
+ tech_stack TEXT,
104
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
105
+ );
106
+
107
+ CREATE INDEX IF NOT EXISTS idx_sessions_platform ON sessions(platform);
108
+ CREATE INDEX IF NOT EXISTS idx_decisions_session ON decisions(session_id);
109
+ CREATE INDEX IF NOT EXISTS idx_files_session ON files_modified(session_id);
110
+ CREATE INDEX IF NOT EXISTS idx_learning_task_type ON learning_data(task_type);
111
+ CREATE INDEX IF NOT EXISTS idx_patterns_key ON patterns(pattern_key);
112
+ CREATE INDEX IF NOT EXISTS idx_rate_usage_platform ON rate_usage(platform, date_key);
113
+ CREATE INDEX IF NOT EXISTS idx_knowledge_type ON knowledge_base(type);
114
+ CREATE INDEX IF NOT EXISTS idx_knowledge_project ON knowledge_base(project_dir);
115
+ CREATE INDEX IF NOT EXISTS idx_project_map_dir ON project_map(project_dir);
116
+ `;
117
+
118
+ export type SessionRow = {
119
+ id: string;
120
+ started_at: string;
121
+ ended_at: string | null;
122
+ platform: string;
123
+ project_dir: string | null;
124
+ summary: string | null;
125
+ context: string | null;
126
+ task_state: string | null;
127
+ token_count: number;
128
+ created_at: string;
129
+ };
130
+
131
+ export type DecisionRow = {
132
+ id: string;
133
+ session_id: string;
134
+ made_at: string;
135
+ decision: string;
136
+ rationale: string | null;
137
+ council_verdict: string | null;
138
+ files_affected: string | null;
139
+ overridden: number;
140
+ };
141
+
142
+ export type PatternRow = {
143
+ id: string;
144
+ pattern_key: string;
145
+ pattern_val: string;
146
+ confidence: number;
147
+ seen_count: number;
148
+ updated_at: string;
149
+ };
150
+
151
+ export type KnowledgeType = 'solution' | 'pattern' | 'context' | 'error' | 'reference' | 'decision';
152
+
153
+ export type KnowledgeRow = {
154
+ id: string;
155
+ type: KnowledgeType;
156
+ title: string;
157
+ content: string;
158
+ tags: string | null;
159
+ project_dir: string | null;
160
+ session_id: string | null;
161
+ relevance: number;
162
+ accessed_count: number;
163
+ created_at: string;
164
+ updated_at: string;
165
+ };
166
+
167
+ export type ProjectMapRow = {
168
+ id: string;
169
+ project_dir: string;
170
+ structure: string;
171
+ key_modules: string | null;
172
+ tech_stack: string | null;
173
+ updated_at: string;
174
+ };