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.
- package/README.md +399 -633
- package/dist/analytics/CrossProjectAnalytics.js +65 -65
- package/dist/cli/index.js +255 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/tokens.js +173 -173
- package/dist/db/cloud.d.ts +1 -0
- package/dist/db/cloud.d.ts.map +1 -1
- package/dist/db/migrations.js +256 -256
- package/dist/db/turso-client.js +2 -2
- package/dist/db/upstash-client.d.ts +9 -0
- package/dist/db/upstash-client.d.ts.map +1 -1
- package/dist/db/upstash-client.js +11 -0
- package/dist/db/upstash-client.js.map +1 -1
- package/dist/eslint/rules/no-async-useeffect.js +6 -6
- package/dist/experts/ExpertVotePersistence.js +9 -9
- package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -1
- package/dist/hooks/cloud-post-tool-use.js +72 -10
- package/dist/hooks/cloud-post-tool-use.js.map +1 -1
- package/dist/hooks/cloud-pre-tool-use.d.ts +12 -9
- package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -1
- package/dist/hooks/cloud-pre-tool-use.js +227 -99
- package/dist/hooks/cloud-pre-tool-use.js.map +1 -1
- package/dist/hooks/cloud-session-start.js +5 -5
- package/dist/hooks/resilient-hook-runner.d.ts +78 -0
- package/dist/hooks/resilient-hook-runner.d.ts.map +1 -0
- package/dist/hooks/resilient-hook-runner.js +201 -0
- package/dist/hooks/resilient-hook-runner.js.map +1 -0
- package/dist/hooks/session-end.js +14 -14
- package/dist/patterns/registry.js +90 -90
- package/dist/schema/codewiki-types.d.ts +10 -10
- package/dist/schema/docs-types.d.ts +8 -8
- package/dist/schema/ecosystem-types.d.ts +12 -12
- package/dist/services/BootstrapService.d.ts +123 -0
- package/dist/services/BootstrapService.d.ts.map +1 -0
- package/dist/services/BootstrapService.js +309 -0
- package/dist/services/BootstrapService.js.map +1 -0
- package/dist/services/CodeWikiIndexer.js +3 -3
- package/dist/services/ContextGenerator.js +7 -7
- package/dist/services/FeedbackCollector.js +11 -11
- package/dist/services/GitIntegration.js +9 -9
- package/dist/services/HookVerifier.js +70 -70
- package/dist/services/KnowledgeGapDetector.d.ts +122 -0
- package/dist/services/KnowledgeGapDetector.d.ts.map +1 -0
- package/dist/services/KnowledgeGapDetector.js +530 -0
- package/dist/services/KnowledgeGapDetector.js.map +1 -0
- package/dist/services/ProjectScaffold.d.ts.map +1 -1
- package/dist/services/ProjectScaffold.js +79 -78
- package/dist/services/ProjectScaffold.js.map +1 -1
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +6 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/knowledge-graph.d.ts +121 -0
- package/dist/services/knowledge-graph.d.ts.map +1 -0
- package/dist/services/knowledge-graph.js +446 -0
- package/dist/services/knowledge-graph.js.map +1 -0
- package/dist/services/memory-router.d.ts +25 -0
- package/dist/services/memory-router.d.ts.map +1 -1
- package/dist/services/memory-router.js +236 -98
- package/dist/services/memory-router.js.map +1 -1
- package/dist/services/pattern-learning.d.ts +79 -0
- package/dist/services/pattern-learning.d.ts.map +1 -0
- package/dist/services/pattern-learning.js +312 -0
- package/dist/services/pattern-learning.js.map +1 -0
- package/dist/services/pattern-tracker.js +95 -95
- package/dist/services/semantic-search.js +2 -2
- package/package.json +124 -116
- package/standards/README.md +94 -50
- package/standards/experts/expert-routing.md +215 -215
- package/standards/general/code-quality.md +86 -86
- package/standards/general/ecosystem.md +243 -0
- package/standards/general/learning-loop.md +192 -0
- package/standards/general/memory-usage.md +205 -205
- package/standards/general/project-onboarding.md +339 -0
- package/standards/general/sync-workflow.md +235 -235
- package/standards/general/workflow.md +82 -82
- package/standards/hooks/mandatory-tracking.md +446 -446
- package/standards/infrastructure/cloud-database.md +287 -287
- package/standards/mcp/server-design.md +243 -243
- package/standards/mcp/tool-patterns.md +354 -354
- package/standards/skills/skill-structure.md +286 -286
- package/standards/skills/workflow-design.md +323 -323
- package/standards/tools/tool-design.md +297 -297
- package/templates/agents/architecture-expert.md +61 -61
- package/templates/agents/database-expert.md +62 -62
- package/templates/agents/documentation-expert.md +57 -57
- package/templates/agents/ecosystem-expert.md +104 -0
- package/templates/agents/memory-expert.md +88 -88
- package/templates/agents/performance-expert.md +61 -61
- package/templates/agents/security-expert.md +59 -59
- package/templates/agents/ux-expert.md +63 -63
- package/templates/agents/worker.md +75 -75
- package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
- package/templates/claude-settings.json +72 -72
- package/templates/commands/experts.md +138 -138
- package/templates/hooks/README.md +158 -158
- package/templates/hooks/project.config.json.template +77 -77
- package/templates/hooks/settings.local.json.template +57 -57
- package/templates/hooks.config.json +21 -0
- package/templates/memory-config.json +56 -56
- package/templates/memory-config.schema.json +212 -212
- package/templates/settings.json +58 -58
- package/templates/skills/continue.md +205 -205
- package/templates/workflows/business-improvement.md +264 -264
- package/templates/workflows/expert-review.md +153 -153
- package/templates/workflows/internal-app.md +245 -245
- package/templates/workflows/sync-docs.md +187 -187
package/dist/db/migrations.js
CHANGED
|
@@ -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: [] };
|