cmp-standards 3.5.1 → 3.7.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 (107) hide show
  1. package/README.md +399 -633
  2. package/dist/analytics/CrossProjectAnalytics.js +65 -65
  3. package/dist/cli/index.js +255 -12
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/dashboard/tokens.js +173 -173
  6. package/dist/db/cloud.d.ts +1 -0
  7. package/dist/db/cloud.d.ts.map +1 -1
  8. package/dist/db/migrations.js +256 -256
  9. package/dist/db/turso-client.js +2 -2
  10. package/dist/db/upstash-client.d.ts +9 -0
  11. package/dist/db/upstash-client.d.ts.map +1 -1
  12. package/dist/db/upstash-client.js +11 -0
  13. package/dist/db/upstash-client.js.map +1 -1
  14. package/dist/eslint/rules/no-async-useeffect.js +6 -6
  15. package/dist/experts/ExpertVotePersistence.js +9 -9
  16. package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -1
  17. package/dist/hooks/cloud-post-tool-use.js +72 -10
  18. package/dist/hooks/cloud-post-tool-use.js.map +1 -1
  19. package/dist/hooks/cloud-pre-tool-use.d.ts +12 -9
  20. package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -1
  21. package/dist/hooks/cloud-pre-tool-use.js +227 -99
  22. package/dist/hooks/cloud-pre-tool-use.js.map +1 -1
  23. package/dist/hooks/cloud-session-start.js +5 -5
  24. package/dist/hooks/resilient-hook-runner.d.ts +78 -0
  25. package/dist/hooks/resilient-hook-runner.d.ts.map +1 -0
  26. package/dist/hooks/resilient-hook-runner.js +201 -0
  27. package/dist/hooks/resilient-hook-runner.js.map +1 -0
  28. package/dist/hooks/session-end.js +14 -14
  29. package/dist/patterns/registry.js +90 -90
  30. package/dist/schema/codewiki-types.d.ts +10 -10
  31. package/dist/schema/docs-types.d.ts +8 -8
  32. package/dist/schema/ecosystem-types.d.ts +12 -12
  33. package/dist/services/BootstrapService.d.ts +123 -0
  34. package/dist/services/BootstrapService.d.ts.map +1 -0
  35. package/dist/services/BootstrapService.js +309 -0
  36. package/dist/services/BootstrapService.js.map +1 -0
  37. package/dist/services/CodeWikiIndexer.js +3 -3
  38. package/dist/services/ContextGenerator.js +7 -7
  39. package/dist/services/FeedbackCollector.js +11 -11
  40. package/dist/services/GitIntegration.js +9 -9
  41. package/dist/services/HookVerifier.js +70 -70
  42. package/dist/services/KnowledgeGapDetector.d.ts +122 -0
  43. package/dist/services/KnowledgeGapDetector.d.ts.map +1 -0
  44. package/dist/services/KnowledgeGapDetector.js +530 -0
  45. package/dist/services/KnowledgeGapDetector.js.map +1 -0
  46. package/dist/services/ProjectScaffold.d.ts.map +1 -1
  47. package/dist/services/ProjectScaffold.js +79 -78
  48. package/dist/services/ProjectScaffold.js.map +1 -1
  49. package/dist/services/index.d.ts +4 -0
  50. package/dist/services/index.d.ts.map +1 -1
  51. package/dist/services/index.js +6 -0
  52. package/dist/services/index.js.map +1 -1
  53. package/dist/services/knowledge-graph.d.ts +121 -0
  54. package/dist/services/knowledge-graph.d.ts.map +1 -0
  55. package/dist/services/knowledge-graph.js +446 -0
  56. package/dist/services/knowledge-graph.js.map +1 -0
  57. package/dist/services/memory-router.d.ts +25 -0
  58. package/dist/services/memory-router.d.ts.map +1 -1
  59. package/dist/services/memory-router.js +236 -98
  60. package/dist/services/memory-router.js.map +1 -1
  61. package/dist/services/pattern-learning.d.ts +79 -0
  62. package/dist/services/pattern-learning.d.ts.map +1 -0
  63. package/dist/services/pattern-learning.js +312 -0
  64. package/dist/services/pattern-learning.js.map +1 -0
  65. package/dist/services/pattern-tracker.js +95 -95
  66. package/dist/services/semantic-search.js +2 -2
  67. package/package.json +124 -116
  68. package/standards/README.md +94 -50
  69. package/standards/experts/expert-routing.md +215 -215
  70. package/standards/general/code-quality.md +86 -86
  71. package/standards/general/ecosystem.md +243 -0
  72. package/standards/general/learning-loop.md +192 -0
  73. package/standards/general/memory-usage.md +205 -205
  74. package/standards/general/project-onboarding.md +339 -0
  75. package/standards/general/sync-workflow.md +235 -235
  76. package/standards/general/workflow.md +82 -82
  77. package/standards/hooks/mandatory-tracking.md +446 -446
  78. package/standards/infrastructure/cloud-database.md +287 -287
  79. package/standards/mcp/server-design.md +243 -243
  80. package/standards/mcp/tool-patterns.md +354 -354
  81. package/standards/skills/skill-structure.md +286 -286
  82. package/standards/skills/workflow-design.md +323 -323
  83. package/standards/tools/tool-design.md +297 -297
  84. package/templates/agents/architecture-expert.md +61 -61
  85. package/templates/agents/database-expert.md +62 -62
  86. package/templates/agents/documentation-expert.md +57 -57
  87. package/templates/agents/ecosystem-expert.md +104 -0
  88. package/templates/agents/memory-expert.md +88 -88
  89. package/templates/agents/performance-expert.md +61 -61
  90. package/templates/agents/security-expert.md +59 -59
  91. package/templates/agents/ux-expert.md +63 -63
  92. package/templates/agents/worker.md +75 -75
  93. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
  94. package/templates/claude-settings.json +72 -72
  95. package/templates/commands/experts.md +138 -138
  96. package/templates/hooks/README.md +158 -158
  97. package/templates/hooks/project.config.json.template +77 -77
  98. package/templates/hooks/settings.local.json.template +57 -57
  99. package/templates/hooks.config.json +21 -0
  100. package/templates/memory-config.json +56 -56
  101. package/templates/memory-config.schema.json +212 -212
  102. package/templates/settings.json +58 -58
  103. package/templates/skills/continue.md +205 -205
  104. package/templates/workflows/business-improvement.md +264 -264
  105. package/templates/workflows/expert-review.md +153 -153
  106. package/templates/workflows/internal-app.md +245 -245
  107. package/templates/workflows/sync-docs.md +187 -187
@@ -35,16 +35,16 @@ const migrations = [
35
35
  version: 1,
36
36
  name: 'initial_schema',
37
37
  up: async (db) => {
38
- await db.execute(`
39
- CREATE TABLE IF NOT EXISTS items (
40
- id TEXT PRIMARY KEY,
41
- type TEXT NOT NULL,
42
- status TEXT NOT NULL DEFAULT 'pending',
43
- system TEXT NOT NULL,
44
- content TEXT NOT NULL,
45
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
46
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
47
- )
38
+ await db.execute(`
39
+ CREATE TABLE IF NOT EXISTS items (
40
+ id TEXT PRIMARY KEY,
41
+ type TEXT NOT NULL,
42
+ status TEXT NOT NULL DEFAULT 'pending',
43
+ system TEXT NOT NULL,
44
+ content TEXT NOT NULL,
45
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
46
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
47
+ )
48
48
  `);
49
49
  await db.execute(`CREATE INDEX IF NOT EXISTS idx_items_type ON items(type)`);
50
50
  await db.execute(`CREATE INDEX IF NOT EXISTS idx_items_status ON items(status)`);
@@ -97,56 +97,56 @@ const migrations = [
97
97
  name: 'add_constraints_and_indexes',
98
98
  up: async (db) => {
99
99
  // Add JSON validation trigger (SQLite 3.37+ supports json_valid)
100
- await db.execute(`
101
- CREATE TRIGGER IF NOT EXISTS validate_json_content
102
- BEFORE INSERT ON items
103
- FOR EACH ROW
104
- WHEN json_valid(NEW.content) = 0
105
- BEGIN
106
- SELECT RAISE(ABORT, 'Invalid JSON in content field');
107
- END
100
+ await db.execute(`
101
+ CREATE TRIGGER IF NOT EXISTS validate_json_content
102
+ BEFORE INSERT ON items
103
+ FOR EACH ROW
104
+ WHEN json_valid(NEW.content) = 0
105
+ BEGIN
106
+ SELECT RAISE(ABORT, 'Invalid JSON in content field');
107
+ END
108
108
  `);
109
- await db.execute(`
110
- CREATE TRIGGER IF NOT EXISTS validate_json_content_update
111
- BEFORE UPDATE ON items
112
- FOR EACH ROW
113
- WHEN json_valid(NEW.content) = 0
114
- BEGIN
115
- SELECT RAISE(ABORT, 'Invalid JSON in content field');
116
- END
109
+ await db.execute(`
110
+ CREATE TRIGGER IF NOT EXISTS validate_json_content_update
111
+ BEFORE UPDATE ON items
112
+ FOR EACH ROW
113
+ WHEN json_valid(NEW.content) = 0
114
+ BEGIN
115
+ SELECT RAISE(ABORT, 'Invalid JSON in content field');
116
+ END
117
117
  `);
118
118
  // Add check constraints for type and status via triggers
119
- await db.execute(`
120
- CREATE TRIGGER IF NOT EXISTS check_item_type
121
- BEFORE INSERT ON items
122
- FOR EACH ROW
123
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
124
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
125
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link')
126
- BEGIN
127
- SELECT RAISE(ABORT, 'Invalid item type');
128
- END
119
+ await db.execute(`
120
+ CREATE TRIGGER IF NOT EXISTS check_item_type
121
+ BEFORE INSERT ON items
122
+ FOR EACH ROW
123
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
124
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
125
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link')
126
+ BEGIN
127
+ SELECT RAISE(ABORT, 'Invalid item type');
128
+ END
129
129
  `);
130
- await db.execute(`
131
- CREATE TRIGGER IF NOT EXISTS check_item_status
132
- BEFORE INSERT ON items
133
- FOR EACH ROW
134
- WHEN NEW.status NOT IN ('pending', 'in_progress', 'completed', 'blocked',
135
- 'active', 'ended', 'archived', 'verified', 'triggered', 'paused',
136
- 'rejected', 'deferred', 'todo', 'done')
137
- BEGIN
138
- SELECT RAISE(ABORT, 'Invalid item status');
139
- END
130
+ await db.execute(`
131
+ CREATE TRIGGER IF NOT EXISTS check_item_status
132
+ BEFORE INSERT ON items
133
+ FOR EACH ROW
134
+ WHEN NEW.status NOT IN ('pending', 'in_progress', 'completed', 'blocked',
135
+ 'active', 'ended', 'archived', 'verified', 'triggered', 'paused',
136
+ 'rejected', 'deferred', 'todo', 'done')
137
+ BEGIN
138
+ SELECT RAISE(ABORT, 'Invalid item status');
139
+ END
140
140
  `);
141
141
  // Add composite index for common query patterns with JSON
142
- await db.execute(`
143
- CREATE INDEX IF NOT EXISTS idx_items_system_type_updated
144
- ON items(system, type, updated_at DESC)
142
+ await db.execute(`
143
+ CREATE INDEX IF NOT EXISTS idx_items_system_type_updated
144
+ ON items(system, type, updated_at DESC)
145
145
  `);
146
146
  // Add index for parent_id lookups (hierarchical queries)
147
- await db.execute(`
148
- CREATE INDEX IF NOT EXISTS idx_items_type_parent
149
- ON items(type, parent_id) WHERE parent_id IS NOT NULL
147
+ await db.execute(`
148
+ CREATE INDEX IF NOT EXISTS idx_items_type_parent
149
+ ON items(type, parent_id) WHERE parent_id IS NOT NULL
150
150
  `);
151
151
  },
152
152
  down: async (db) => {
@@ -165,32 +165,32 @@ const migrations = [
165
165
  // Drop old trigger and recreate with session_summary type
166
166
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
167
167
  // Recreate trigger with updated type list including session_summary
168
- await db.execute(`
169
- CREATE TRIGGER IF NOT EXISTS check_item_type
170
- BEFORE INSERT ON items
171
- FOR EACH ROW
172
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
173
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
174
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
175
- 'session_summary')
176
- BEGIN
177
- SELECT RAISE(ABORT, 'Invalid item type');
178
- END
168
+ await db.execute(`
169
+ CREATE TRIGGER IF NOT EXISTS check_item_type
170
+ BEFORE INSERT ON items
171
+ FOR EACH ROW
172
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
173
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
174
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
175
+ 'session_summary')
176
+ BEGIN
177
+ SELECT RAISE(ABORT, 'Invalid item type');
178
+ END
179
179
  `);
180
180
  },
181
181
  down: async (db) => {
182
182
  // Revert to old trigger without session_summary
183
183
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
184
- await db.execute(`
185
- CREATE TRIGGER IF NOT EXISTS check_item_type
186
- BEFORE INSERT ON items
187
- FOR EACH ROW
188
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
189
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
190
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link')
191
- BEGIN
192
- SELECT RAISE(ABORT, 'Invalid item type');
193
- END
184
+ await db.execute(`
185
+ CREATE TRIGGER IF NOT EXISTS check_item_type
186
+ BEFORE INSERT ON items
187
+ FOR EACH ROW
188
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
189
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
190
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link')
191
+ BEGIN
192
+ SELECT RAISE(ABORT, 'Invalid item type');
193
+ END
194
194
  `);
195
195
  }
196
196
  },
@@ -201,33 +201,33 @@ const migrations = [
201
201
  // Drop old trigger and recreate with opportunity type
202
202
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
203
203
  // Recreate trigger with updated type list including opportunity
204
- await db.execute(`
205
- CREATE TRIGGER IF NOT EXISTS check_item_type
206
- BEFORE INSERT ON items
207
- FOR EACH ROW
208
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
209
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
210
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
211
- 'session_summary', 'opportunity')
212
- BEGIN
213
- SELECT RAISE(ABORT, 'Invalid item type');
214
- END
204
+ await db.execute(`
205
+ CREATE TRIGGER IF NOT EXISTS check_item_type
206
+ BEFORE INSERT ON items
207
+ FOR EACH ROW
208
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
209
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
210
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
211
+ 'session_summary', 'opportunity')
212
+ BEGIN
213
+ SELECT RAISE(ABORT, 'Invalid item type');
214
+ END
215
215
  `);
216
216
  },
217
217
  down: async (db) => {
218
218
  // Revert to old trigger without opportunity
219
219
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
220
- await db.execute(`
221
- CREATE TRIGGER IF NOT EXISTS check_item_type
222
- BEFORE INSERT ON items
223
- FOR EACH ROW
224
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
225
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
226
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
227
- 'session_summary')
228
- BEGIN
229
- SELECT RAISE(ABORT, 'Invalid item type');
230
- END
220
+ await db.execute(`
221
+ CREATE TRIGGER IF NOT EXISTS check_item_type
222
+ BEFORE INSERT ON items
223
+ FOR EACH ROW
224
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
225
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
226
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
227
+ 'session_summary')
228
+ BEGIN
229
+ SELECT RAISE(ABORT, 'Invalid item type');
230
+ END
231
231
  `);
232
232
  }
233
233
  },
@@ -238,32 +238,32 @@ const migrations = [
238
238
  // Drop old trigger and recreate with CodeWiki types
239
239
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
240
240
  // Recreate trigger with updated type list including CodeWiki types
241
- await db.execute(`
242
- CREATE TRIGGER IF NOT EXISTS check_item_type
243
- BEFORE INSERT ON items
244
- FOR EACH ROW
245
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
246
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
247
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
248
- 'session_summary', 'opportunity',
249
- 'file_metadata', 'code_structure', 'code_dependency',
250
- 'code_analysis', 'cross_project_ref', 'index_run')
251
- BEGIN
252
- SELECT RAISE(ABORT, 'Invalid item type');
253
- END
241
+ await db.execute(`
242
+ CREATE TRIGGER IF NOT EXISTS check_item_type
243
+ BEFORE INSERT ON items
244
+ FOR EACH ROW
245
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
246
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
247
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
248
+ 'session_summary', 'opportunity',
249
+ 'file_metadata', 'code_structure', 'code_dependency',
250
+ 'code_analysis', 'cross_project_ref', 'index_run')
251
+ BEGIN
252
+ SELECT RAISE(ABORT, 'Invalid item type');
253
+ END
254
254
  `);
255
255
  // Add indexes for CodeWiki queries
256
256
  // Index for file path lookups (JSON extraction)
257
- await db.execute(`
258
- CREATE INDEX IF NOT EXISTS idx_items_codewiki_path
259
- ON items(system, type)
260
- WHERE type IN ('file_metadata', 'code_structure', 'code_dependency', 'code_analysis')
257
+ await db.execute(`
258
+ CREATE INDEX IF NOT EXISTS idx_items_codewiki_path
259
+ ON items(system, type)
260
+ WHERE type IN ('file_metadata', 'code_structure', 'code_dependency', 'code_analysis')
261
261
  `);
262
262
  // Index for run-based queries
263
- await db.execute(`
264
- CREATE INDEX IF NOT EXISTS idx_items_codewiki_run
265
- ON items(system, type, parent_id)
266
- WHERE type IN ('file_metadata', 'code_structure', 'code_dependency') AND parent_id IS NOT NULL
263
+ await db.execute(`
264
+ CREATE INDEX IF NOT EXISTS idx_items_codewiki_run
265
+ ON items(system, type, parent_id)
266
+ WHERE type IN ('file_metadata', 'code_structure', 'code_dependency') AND parent_id IS NOT NULL
267
267
  `);
268
268
  },
269
269
  down: async (db) => {
@@ -272,17 +272,17 @@ const migrations = [
272
272
  await db.execute(`DROP INDEX IF EXISTS idx_items_codewiki_run`);
273
273
  // Revert to old trigger without CodeWiki types
274
274
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
275
- await db.execute(`
276
- CREATE TRIGGER IF NOT EXISTS check_item_type
277
- BEFORE INSERT ON items
278
- FOR EACH ROW
279
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
280
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
281
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
282
- 'session_summary', 'opportunity')
283
- BEGIN
284
- SELECT RAISE(ABORT, 'Invalid item type');
285
- END
275
+ await db.execute(`
276
+ CREATE TRIGGER IF NOT EXISTS check_item_type
277
+ BEFORE INSERT ON items
278
+ FOR EACH ROW
279
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
280
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
281
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
282
+ 'session_summary', 'opportunity')
283
+ BEGIN
284
+ SELECT RAISE(ABORT, 'Invalid item type');
285
+ END
286
286
  `);
287
287
  }
288
288
  },
@@ -291,53 +291,53 @@ const migrations = [
291
291
  name: 'add_auth_and_website_types',
292
292
  up: async (db) => {
293
293
  // Create auth tables for NextAuth.js
294
- await db.execute(`
295
- CREATE TABLE IF NOT EXISTS users (
296
- id TEXT PRIMARY KEY,
297
- name TEXT,
298
- email TEXT NOT NULL UNIQUE,
299
- emailVerified INTEGER,
300
- image TEXT,
301
- isAdmin INTEGER DEFAULT 0,
302
- createdAt INTEGER DEFAULT (unixepoch()),
303
- updatedAt INTEGER DEFAULT (unixepoch())
304
- )
294
+ await db.execute(`
295
+ CREATE TABLE IF NOT EXISTS users (
296
+ id TEXT PRIMARY KEY,
297
+ name TEXT,
298
+ email TEXT NOT NULL UNIQUE,
299
+ emailVerified INTEGER,
300
+ image TEXT,
301
+ isAdmin INTEGER DEFAULT 0,
302
+ createdAt INTEGER DEFAULT (unixepoch()),
303
+ updatedAt INTEGER DEFAULT (unixepoch())
304
+ )
305
305
  `);
306
- await db.execute(`
307
- CREATE TABLE IF NOT EXISTS sessions (
308
- sessionToken TEXT PRIMARY KEY,
309
- userId TEXT NOT NULL,
310
- expires INTEGER NOT NULL,
311
- FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE
312
- )
306
+ await db.execute(`
307
+ CREATE TABLE IF NOT EXISTS sessions (
308
+ sessionToken TEXT PRIMARY KEY,
309
+ userId TEXT NOT NULL,
310
+ expires INTEGER NOT NULL,
311
+ FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE
312
+ )
313
313
  `);
314
- await db.execute(`
315
- CREATE TABLE IF NOT EXISTS verificationTokens (
316
- identifier TEXT NOT NULL,
317
- token TEXT NOT NULL UNIQUE,
318
- expires INTEGER NOT NULL,
319
- PRIMARY KEY (identifier, token)
320
- )
314
+ await db.execute(`
315
+ CREATE TABLE IF NOT EXISTS verificationTokens (
316
+ identifier TEXT NOT NULL,
317
+ token TEXT NOT NULL UNIQUE,
318
+ expires INTEGER NOT NULL,
319
+ PRIMARY KEY (identifier, token)
320
+ )
321
321
  `);
322
322
  // Create indexes for auth tables
323
323
  await db.execute(`CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)`);
324
324
  await db.execute(`CREATE INDEX IF NOT EXISTS idx_sessions_userId ON sessions(userId)`);
325
325
  // Update item type trigger to include website types
326
326
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
327
- await db.execute(`
328
- CREATE TRIGGER IF NOT EXISTS check_item_type
329
- BEFORE INSERT ON items
330
- FOR EACH ROW
331
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
332
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
333
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
334
- 'session_summary', 'opportunity',
335
- 'file_metadata', 'code_structure', 'code_dependency',
336
- 'code_analysis', 'cross_project_ref', 'index_run',
337
- 'founder_info', 'project_info')
338
- BEGIN
339
- SELECT RAISE(ABORT, 'Invalid item type');
340
- END
327
+ await db.execute(`
328
+ CREATE TRIGGER IF NOT EXISTS check_item_type
329
+ BEFORE INSERT ON items
330
+ FOR EACH ROW
331
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
332
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
333
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
334
+ 'session_summary', 'opportunity',
335
+ 'file_metadata', 'code_structure', 'code_dependency',
336
+ 'code_analysis', 'cross_project_ref', 'index_run',
337
+ 'founder_info', 'project_info')
338
+ BEGIN
339
+ SELECT RAISE(ABORT, 'Invalid item type');
340
+ END
341
341
  `);
342
342
  },
343
343
  down: async (db) => {
@@ -347,19 +347,19 @@ const migrations = [
347
347
  await db.execute(`DROP TABLE IF EXISTS users`);
348
348
  // Revert to old trigger without website types
349
349
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
350
- await db.execute(`
351
- CREATE TRIGGER IF NOT EXISTS check_item_type
352
- BEFORE INSERT ON items
353
- FOR EACH ROW
354
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
355
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
356
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
357
- 'session_summary', 'opportunity',
358
- 'file_metadata', 'code_structure', 'code_dependency',
359
- 'code_analysis', 'cross_project_ref', 'index_run')
360
- BEGIN
361
- SELECT RAISE(ABORT, 'Invalid item type');
362
- END
350
+ await db.execute(`
351
+ CREATE TRIGGER IF NOT EXISTS check_item_type
352
+ BEFORE INSERT ON items
353
+ FOR EACH ROW
354
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
355
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
356
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
357
+ 'session_summary', 'opportunity',
358
+ 'file_metadata', 'code_structure', 'code_dependency',
359
+ 'code_analysis', 'cross_project_ref', 'index_run')
360
+ BEGIN
361
+ SELECT RAISE(ABORT, 'Invalid item type');
362
+ END
363
363
  `);
364
364
  }
365
365
  },
@@ -370,27 +370,27 @@ const migrations = [
370
370
  // Drop old trigger and recreate with DocsGenerator types
371
371
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
372
372
  // Recreate trigger with updated type list including project_doc
373
- await db.execute(`
374
- CREATE TRIGGER IF NOT EXISTS check_item_type
375
- BEFORE INSERT ON items
376
- FOR EACH ROW
377
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
378
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
379
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
380
- 'session_summary', 'opportunity',
381
- 'file_metadata', 'code_structure', 'code_dependency',
382
- 'code_analysis', 'cross_project_ref', 'index_run',
383
- 'founder_info', 'project_info',
384
- 'project_doc', 'code_documentation')
385
- BEGIN
386
- SELECT RAISE(ABORT, 'Invalid item type');
387
- END
373
+ await db.execute(`
374
+ CREATE TRIGGER IF NOT EXISTS check_item_type
375
+ BEFORE INSERT ON items
376
+ FOR EACH ROW
377
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
378
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
379
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
380
+ 'session_summary', 'opportunity',
381
+ 'file_metadata', 'code_structure', 'code_dependency',
382
+ 'code_analysis', 'cross_project_ref', 'index_run',
383
+ 'founder_info', 'project_info',
384
+ 'project_doc', 'code_documentation')
385
+ BEGIN
386
+ SELECT RAISE(ABORT, 'Invalid item type');
387
+ END
388
388
  `);
389
389
  // Add index for project_doc queries
390
- await db.execute(`
391
- CREATE INDEX IF NOT EXISTS idx_items_project_doc
392
- ON items(system, type)
393
- WHERE type = 'project_doc'
390
+ await db.execute(`
391
+ CREATE INDEX IF NOT EXISTS idx_items_project_doc
392
+ ON items(system, type)
393
+ WHERE type = 'project_doc'
394
394
  `);
395
395
  },
396
396
  down: async (db) => {
@@ -398,20 +398,20 @@ const migrations = [
398
398
  await db.execute(`DROP INDEX IF EXISTS idx_items_project_doc`);
399
399
  // Revert to old trigger without DocsGenerator types
400
400
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
401
- await db.execute(`
402
- CREATE TRIGGER IF NOT EXISTS check_item_type
403
- BEFORE INSERT ON items
404
- FOR EACH ROW
405
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
406
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
407
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
408
- 'session_summary', 'opportunity',
409
- 'file_metadata', 'code_structure', 'code_dependency',
410
- 'code_analysis', 'cross_project_ref', 'index_run',
411
- 'founder_info', 'project_info')
412
- BEGIN
413
- SELECT RAISE(ABORT, 'Invalid item type');
414
- END
401
+ await db.execute(`
402
+ CREATE TRIGGER IF NOT EXISTS check_item_type
403
+ BEFORE INSERT ON items
404
+ FOR EACH ROW
405
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
406
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
407
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
408
+ 'session_summary', 'opportunity',
409
+ 'file_metadata', 'code_structure', 'code_dependency',
410
+ 'code_analysis', 'cross_project_ref', 'index_run',
411
+ 'founder_info', 'project_info')
412
+ BEGIN
413
+ SELECT RAISE(ABORT, 'Invalid item type');
414
+ END
415
415
  `);
416
416
  }
417
417
  },
@@ -422,28 +422,28 @@ const migrations = [
422
422
  // Drop old trigger and recreate with ecosystem_stats type
423
423
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
424
424
  // Recreate trigger with updated type list including ecosystem_stats
425
- await db.execute(`
426
- CREATE TRIGGER IF NOT EXISTS check_item_type
427
- BEFORE INSERT ON items
428
- FOR EACH ROW
429
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
430
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
431
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
432
- 'session_summary', 'opportunity',
433
- 'file_metadata', 'code_structure', 'code_dependency',
434
- 'code_analysis', 'cross_project_ref', 'index_run',
435
- 'founder_info', 'project_info',
436
- 'project_doc', 'code_documentation',
437
- 'ecosystem_stats')
438
- BEGIN
439
- SELECT RAISE(ABORT, 'Invalid item type');
440
- END
425
+ await db.execute(`
426
+ CREATE TRIGGER IF NOT EXISTS check_item_type
427
+ BEFORE INSERT ON items
428
+ FOR EACH ROW
429
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
430
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
431
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
432
+ 'session_summary', 'opportunity',
433
+ 'file_metadata', 'code_structure', 'code_dependency',
434
+ 'code_analysis', 'cross_project_ref', 'index_run',
435
+ 'founder_info', 'project_info',
436
+ 'project_doc', 'code_documentation',
437
+ 'ecosystem_stats')
438
+ BEGIN
439
+ SELECT RAISE(ABORT, 'Invalid item type');
440
+ END
441
441
  `);
442
442
  // Add index for ecosystem_stats queries
443
- await db.execute(`
444
- CREATE INDEX IF NOT EXISTS idx_items_ecosystem_stats
445
- ON items(system, type)
446
- WHERE type = 'ecosystem_stats'
443
+ await db.execute(`
444
+ CREATE INDEX IF NOT EXISTS idx_items_ecosystem_stats
445
+ ON items(system, type)
446
+ WHERE type = 'ecosystem_stats'
447
447
  `);
448
448
  },
449
449
  down: async (db) => {
@@ -451,21 +451,21 @@ const migrations = [
451
451
  await db.execute(`DROP INDEX IF EXISTS idx_items_ecosystem_stats`);
452
452
  // Revert to old trigger without ecosystem_stats type
453
453
  await db.execute(`DROP TRIGGER IF EXISTS check_item_type`);
454
- await db.execute(`
455
- CREATE TRIGGER IF NOT EXISTS check_item_type
456
- BEFORE INSERT ON items
457
- FOR EACH ROW
458
- WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
459
- 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
460
- 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
461
- 'session_summary', 'opportunity',
462
- 'file_metadata', 'code_structure', 'code_dependency',
463
- 'code_analysis', 'cross_project_ref', 'index_run',
464
- 'founder_info', 'project_info',
465
- 'project_doc', 'code_documentation')
466
- BEGIN
467
- SELECT RAISE(ABORT, 'Invalid item type');
468
- END
454
+ await db.execute(`
455
+ CREATE TRIGGER IF NOT EXISTS check_item_type
456
+ BEFORE INSERT ON items
457
+ FOR EACH ROW
458
+ WHEN NEW.type NOT IN ('task', 'improvement', 'session', 'plan', 'plan_checkpoint',
459
+ 'expert_decision', 'pattern', 'memory', 'knowledge', 'agent_session',
460
+ 'skill_registry', 'auto_improvement', 'pattern_stat', 'memory_link',
461
+ 'session_summary', 'opportunity',
462
+ 'file_metadata', 'code_structure', 'code_dependency',
463
+ 'code_analysis', 'cross_project_ref', 'index_run',
464
+ 'founder_info', 'project_info',
465
+ 'project_doc', 'code_documentation')
466
+ BEGIN
467
+ SELECT RAISE(ABORT, 'Invalid item type');
468
+ END
469
469
  `);
470
470
  }
471
471
  }
@@ -479,12 +479,12 @@ const migrations = [
479
479
  export async function runMigrations() {
480
480
  const db = getTurso();
481
481
  // Create migrations tracking table
482
- await db.execute(`
483
- CREATE TABLE IF NOT EXISTS schema_migrations (
484
- version INTEGER PRIMARY KEY,
485
- name TEXT NOT NULL,
486
- applied_at TEXT NOT NULL DEFAULT (datetime('now'))
487
- )
482
+ await db.execute(`
483
+ CREATE TABLE IF NOT EXISTS schema_migrations (
484
+ version INTEGER PRIMARY KEY,
485
+ name TEXT NOT NULL,
486
+ applied_at TEXT NOT NULL DEFAULT (datetime('now'))
487
+ )
488
488
  `);
489
489
  // Get current version
490
490
  const result = await db.execute('SELECT MAX(version) as version FROM schema_migrations');
@@ -521,9 +521,9 @@ export async function runMigrations() {
521
521
  export async function getMigrationStatus() {
522
522
  const db = getTurso();
523
523
  // Check if migrations table exists
524
- const tables = await db.execute(`
525
- SELECT name FROM sqlite_master
526
- WHERE type='table' AND name='schema_migrations'
524
+ const tables = await db.execute(`
525
+ SELECT name FROM sqlite_master
526
+ WHERE type='table' AND name='schema_migrations'
527
527
  `);
528
528
  if (tables.rows.length === 0) {
529
529
  return { current: 0, pending: migrations.length, applied: [] };