@su-record/vibe 2.7.14 → 2.7.16
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/.env.example +37 -37
- package/CLAUDE.md +134 -126
- package/LICENSE +21 -21
- package/README.md +449 -449
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +94 -94
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +11 -13
- package/commands/vibe.review.md +43 -1
- package/commands/vibe.run.md +2124 -2078
- package/commands/vibe.spec.md +9 -4
- package/commands/vibe.spec.review.md +569 -565
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +33 -8
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +51 -55
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.js +5 -5
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +7 -8
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +137 -137
- package/hooks/scripts/code-check.js +77 -70
- package/hooks/scripts/context-save.js +212 -212
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +475 -475
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +104 -104
- package/hooks/scripts/session-start.js +106 -106
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +100 -100
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +121 -121
- package/skills/agents-md/SKILL.md +120 -120
- package/skills/arch-guard/SKILL.md +180 -180
- package/skills/brand-assets/SKILL.md +146 -146
- package/skills/capability-loop/SKILL.md +167 -167
- package/skills/characterization-test/SKILL.md +206 -206
- package/skills/commerce-patterns/SKILL.md +63 -59
- package/skills/commit-push-pr/SKILL.md +75 -75
- package/skills/context7-usage/SKILL.md +105 -105
- package/skills/core-capabilities/SKILL.md +13 -48
- package/skills/e2e-commerce/SKILL.md +61 -57
- package/skills/exec-plan/SKILL.md +147 -147
- package/skills/frontend-design/SKILL.md +12 -73
- package/skills/git-worktree/SKILL.md +72 -72
- package/skills/handoff/SKILL.md +109 -109
- package/skills/parallel-research/SKILL.md +87 -87
- package/skills/priority-todos/SKILL.md +63 -63
- package/skills/seo-checklist/SKILL.md +57 -57
- package/skills/techdebt/SKILL.md +122 -122
- package/skills/tool-fallback/SKILL.md +103 -103
- package/skills/typescript-advanced-types/SKILL.md +66 -66
- package/skills/ui-ux-pro-max/SKILL.md +221 -206
- package/skills/vercel-react-best-practices/SKILL.md +59 -59
- package/skills/video-production/SKILL.md +51 -51
- package/vibe/config.json +29 -29
- package/vibe/constitution.md +227 -227
- package/vibe/rules/principles/communication-guide.md +98 -98
- package/vibe/rules/principles/development-philosophy.md +52 -52
- package/vibe/rules/principles/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/performance.md +236 -236
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/git-workflow.md +237 -237
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/rules/standards/security.md +305 -305
- package/vibe/rules/writing/document-style.md +74 -74
- package/vibe/setup.sh +31 -31
- package/vibe/templates/constitution-template.md +252 -252
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/spec-template.md +221 -221
- package/vibe/ui-ux-data/charts.csv +26 -26
- package/vibe/ui-ux-data/colors.csv +97 -97
- package/vibe/ui-ux-data/icons.csv +101 -101
- package/vibe/ui-ux-data/landing.csv +31 -31
- package/vibe/ui-ux-data/products.csv +96 -96
- package/vibe/ui-ux-data/react-performance.csv +45 -45
- package/vibe/ui-ux-data/stacks/astro.csv +54 -54
- package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
- package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
- package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
- package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
- package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
- package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
- package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
- package/vibe/ui-ux-data/stacks/react.csv +54 -54
- package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
- package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
- package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
- package/vibe/ui-ux-data/stacks/vue.csv +50 -50
- package/vibe/ui-ux-data/styles.csv +68 -68
- package/vibe/ui-ux-data/typography.csv +57 -57
- package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
- package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
- package/vibe/ui-ux-data/version.json +31 -31
- package/vibe/ui-ux-data/web-interface.csv +31 -31
|
@@ -16,92 +16,92 @@ export class SessionRAGStore {
|
|
|
16
16
|
// Schema Initialization
|
|
17
17
|
// ==========================================================================
|
|
18
18
|
initializeTables() {
|
|
19
|
-
this.db.exec(`
|
|
20
|
-
CREATE TABLE IF NOT EXISTS session_decisions (
|
|
21
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
22
|
-
sessionId TEXT,
|
|
23
|
-
title TEXT NOT NULL,
|
|
24
|
-
description TEXT,
|
|
25
|
-
rationale TEXT,
|
|
26
|
-
alternatives TEXT,
|
|
27
|
-
impact TEXT,
|
|
28
|
-
status TEXT DEFAULT 'active' CHECK(status IN ('active','superseded','cancelled')),
|
|
29
|
-
priority INTEGER DEFAULT 1,
|
|
30
|
-
relatedFiles TEXT,
|
|
31
|
-
tags TEXT,
|
|
32
|
-
timestamp TEXT NOT NULL
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
CREATE INDEX IF NOT EXISTS idx_sdec_session ON session_decisions(sessionId);
|
|
36
|
-
CREATE INDEX IF NOT EXISTS idx_sdec_status ON session_decisions(status);
|
|
37
|
-
CREATE INDEX IF NOT EXISTS idx_sdec_priority ON session_decisions(priority);
|
|
38
|
-
CREATE INDEX IF NOT EXISTS idx_sdec_timestamp ON session_decisions(timestamp);
|
|
19
|
+
this.db.exec(`
|
|
20
|
+
CREATE TABLE IF NOT EXISTS session_decisions (
|
|
21
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
22
|
+
sessionId TEXT,
|
|
23
|
+
title TEXT NOT NULL,
|
|
24
|
+
description TEXT,
|
|
25
|
+
rationale TEXT,
|
|
26
|
+
alternatives TEXT,
|
|
27
|
+
impact TEXT,
|
|
28
|
+
status TEXT DEFAULT 'active' CHECK(status IN ('active','superseded','cancelled')),
|
|
29
|
+
priority INTEGER DEFAULT 1,
|
|
30
|
+
relatedFiles TEXT,
|
|
31
|
+
tags TEXT,
|
|
32
|
+
timestamp TEXT NOT NULL
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_sdec_session ON session_decisions(sessionId);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_sdec_status ON session_decisions(status);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_sdec_priority ON session_decisions(priority);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_sdec_timestamp ON session_decisions(timestamp);
|
|
39
39
|
`);
|
|
40
|
-
this.db.exec(`
|
|
41
|
-
CREATE TABLE IF NOT EXISTS session_constraints (
|
|
42
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
43
|
-
sessionId TEXT,
|
|
44
|
-
title TEXT NOT NULL,
|
|
45
|
-
description TEXT,
|
|
46
|
-
type TEXT NOT NULL CHECK(type IN ('technical','business','resource','quality')),
|
|
47
|
-
severity TEXT DEFAULT 'medium' CHECK(severity IN ('low','medium','high','critical')),
|
|
48
|
-
scope TEXT,
|
|
49
|
-
timestamp TEXT NOT NULL
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
CREATE INDEX IF NOT EXISTS idx_scon_session ON session_constraints(sessionId);
|
|
53
|
-
CREATE INDEX IF NOT EXISTS idx_scon_type ON session_constraints(type);
|
|
54
|
-
CREATE INDEX IF NOT EXISTS idx_scon_severity ON session_constraints(severity);
|
|
40
|
+
this.db.exec(`
|
|
41
|
+
CREATE TABLE IF NOT EXISTS session_constraints (
|
|
42
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
43
|
+
sessionId TEXT,
|
|
44
|
+
title TEXT NOT NULL,
|
|
45
|
+
description TEXT,
|
|
46
|
+
type TEXT NOT NULL CHECK(type IN ('technical','business','resource','quality')),
|
|
47
|
+
severity TEXT DEFAULT 'medium' CHECK(severity IN ('low','medium','high','critical')),
|
|
48
|
+
scope TEXT,
|
|
49
|
+
timestamp TEXT NOT NULL
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_scon_session ON session_constraints(sessionId);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_scon_type ON session_constraints(type);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_scon_severity ON session_constraints(severity);
|
|
55
55
|
`);
|
|
56
|
-
this.db.exec(`
|
|
57
|
-
CREATE TABLE IF NOT EXISTS session_goals (
|
|
58
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
59
|
-
sessionId TEXT,
|
|
60
|
-
parentId INTEGER,
|
|
61
|
-
title TEXT NOT NULL,
|
|
62
|
-
description TEXT,
|
|
63
|
-
status TEXT DEFAULT 'active' CHECK(status IN ('active','completed','blocked','cancelled')),
|
|
64
|
-
priority INTEGER DEFAULT 1,
|
|
65
|
-
progressPercent INTEGER DEFAULT 0 CHECK(progressPercent >= 0 AND progressPercent <= 100),
|
|
66
|
-
successCriteria TEXT,
|
|
67
|
-
timestamp TEXT NOT NULL,
|
|
68
|
-
completedAt TEXT,
|
|
69
|
-
FOREIGN KEY(parentId) REFERENCES session_goals(id)
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
CREATE INDEX IF NOT EXISTS idx_sgoal_session ON session_goals(sessionId);
|
|
73
|
-
CREATE INDEX IF NOT EXISTS idx_sgoal_status ON session_goals(status);
|
|
74
|
-
CREATE INDEX IF NOT EXISTS idx_sgoal_priority ON session_goals(priority);
|
|
75
|
-
CREATE INDEX IF NOT EXISTS idx_sgoal_parent ON session_goals(parentId);
|
|
56
|
+
this.db.exec(`
|
|
57
|
+
CREATE TABLE IF NOT EXISTS session_goals (
|
|
58
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
59
|
+
sessionId TEXT,
|
|
60
|
+
parentId INTEGER,
|
|
61
|
+
title TEXT NOT NULL,
|
|
62
|
+
description TEXT,
|
|
63
|
+
status TEXT DEFAULT 'active' CHECK(status IN ('active','completed','blocked','cancelled')),
|
|
64
|
+
priority INTEGER DEFAULT 1,
|
|
65
|
+
progressPercent INTEGER DEFAULT 0 CHECK(progressPercent >= 0 AND progressPercent <= 100),
|
|
66
|
+
successCriteria TEXT,
|
|
67
|
+
timestamp TEXT NOT NULL,
|
|
68
|
+
completedAt TEXT,
|
|
69
|
+
FOREIGN KEY(parentId) REFERENCES session_goals(id)
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_sgoal_session ON session_goals(sessionId);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_sgoal_status ON session_goals(status);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_sgoal_priority ON session_goals(priority);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_sgoal_parent ON session_goals(parentId);
|
|
76
76
|
`);
|
|
77
|
-
this.db.exec(`
|
|
78
|
-
CREATE TABLE IF NOT EXISTS session_evidence (
|
|
79
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
80
|
-
sessionId TEXT,
|
|
81
|
-
type TEXT NOT NULL CHECK(type IN ('test','build','lint','coverage','hud','review')),
|
|
82
|
-
title TEXT NOT NULL,
|
|
83
|
-
status TEXT NOT NULL CHECK(status IN ('pass','fail','warning','info')),
|
|
84
|
-
details TEXT,
|
|
85
|
-
metrics TEXT,
|
|
86
|
-
relatedGoals TEXT,
|
|
87
|
-
timestamp TEXT NOT NULL
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
CREATE INDEX IF NOT EXISTS idx_sevi_session ON session_evidence(sessionId);
|
|
91
|
-
CREATE INDEX IF NOT EXISTS idx_sevi_type ON session_evidence(type);
|
|
92
|
-
CREATE INDEX IF NOT EXISTS idx_sevi_status ON session_evidence(status);
|
|
93
|
-
CREATE INDEX IF NOT EXISTS idx_sevi_timestamp ON session_evidence(timestamp);
|
|
77
|
+
this.db.exec(`
|
|
78
|
+
CREATE TABLE IF NOT EXISTS session_evidence (
|
|
79
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
80
|
+
sessionId TEXT,
|
|
81
|
+
type TEXT NOT NULL CHECK(type IN ('test','build','lint','coverage','hud','review')),
|
|
82
|
+
title TEXT NOT NULL,
|
|
83
|
+
status TEXT NOT NULL CHECK(status IN ('pass','fail','warning','info')),
|
|
84
|
+
details TEXT,
|
|
85
|
+
metrics TEXT,
|
|
86
|
+
relatedGoals TEXT,
|
|
87
|
+
timestamp TEXT NOT NULL
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE INDEX IF NOT EXISTS idx_sevi_session ON session_evidence(sessionId);
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_sevi_type ON session_evidence(type);
|
|
92
|
+
CREATE INDEX IF NOT EXISTS idx_sevi_status ON session_evidence(status);
|
|
93
|
+
CREATE INDEX IF NOT EXISTS idx_sevi_timestamp ON session_evidence(timestamp);
|
|
94
94
|
`);
|
|
95
95
|
// Phase 5: Conversation history table
|
|
96
|
-
this.db.exec(`
|
|
97
|
-
CREATE TABLE IF NOT EXISTS conversation_history (
|
|
98
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
99
|
-
chatId TEXT NOT NULL,
|
|
100
|
-
role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
|
|
101
|
-
content TEXT NOT NULL,
|
|
102
|
-
timestamp TEXT NOT NULL DEFAULT (datetime('now'))
|
|
103
|
-
);
|
|
104
|
-
CREATE INDEX IF NOT EXISTS idx_conv_chat_time ON conversation_history(chatId, timestamp);
|
|
96
|
+
this.db.exec(`
|
|
97
|
+
CREATE TABLE IF NOT EXISTS conversation_history (
|
|
98
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
99
|
+
chatId TEXT NOT NULL,
|
|
100
|
+
role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
|
|
101
|
+
content TEXT NOT NULL,
|
|
102
|
+
timestamp TEXT NOT NULL DEFAULT (datetime('now'))
|
|
103
|
+
);
|
|
104
|
+
CREATE INDEX IF NOT EXISTS idx_conv_chat_time ON conversation_history(chatId, timestamp);
|
|
105
105
|
`);
|
|
106
106
|
// Schema migration: add taskId column to all session tables
|
|
107
107
|
const tables = [
|
|
@@ -125,84 +125,84 @@ export class SessionRAGStore {
|
|
|
125
125
|
return;
|
|
126
126
|
try {
|
|
127
127
|
// Decisions FTS
|
|
128
|
-
this.db.exec(`
|
|
129
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS session_decisions_fts
|
|
130
|
-
USING fts5(title, description, rationale, content=session_decisions, content_rowid=id);
|
|
131
|
-
|
|
132
|
-
CREATE TRIGGER IF NOT EXISTS sdec_fts_ai AFTER INSERT ON session_decisions BEGIN
|
|
133
|
-
INSERT INTO session_decisions_fts(rowid, title, description, rationale)
|
|
134
|
-
VALUES (new.id, new.title, new.description, new.rationale);
|
|
135
|
-
END;
|
|
136
|
-
CREATE TRIGGER IF NOT EXISTS sdec_fts_ad AFTER DELETE ON session_decisions BEGIN
|
|
137
|
-
INSERT INTO session_decisions_fts(session_decisions_fts, rowid, title, description, rationale)
|
|
138
|
-
VALUES('delete', old.id, old.title, old.description, old.rationale);
|
|
139
|
-
END;
|
|
140
|
-
CREATE TRIGGER IF NOT EXISTS sdec_fts_au AFTER UPDATE ON session_decisions BEGIN
|
|
141
|
-
INSERT INTO session_decisions_fts(session_decisions_fts, rowid, title, description, rationale)
|
|
142
|
-
VALUES('delete', old.id, old.title, old.description, old.rationale);
|
|
143
|
-
INSERT INTO session_decisions_fts(rowid, title, description, rationale)
|
|
144
|
-
VALUES (new.id, new.title, new.description, new.rationale);
|
|
145
|
-
END;
|
|
128
|
+
this.db.exec(`
|
|
129
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS session_decisions_fts
|
|
130
|
+
USING fts5(title, description, rationale, content=session_decisions, content_rowid=id);
|
|
131
|
+
|
|
132
|
+
CREATE TRIGGER IF NOT EXISTS sdec_fts_ai AFTER INSERT ON session_decisions BEGIN
|
|
133
|
+
INSERT INTO session_decisions_fts(rowid, title, description, rationale)
|
|
134
|
+
VALUES (new.id, new.title, new.description, new.rationale);
|
|
135
|
+
END;
|
|
136
|
+
CREATE TRIGGER IF NOT EXISTS sdec_fts_ad AFTER DELETE ON session_decisions BEGIN
|
|
137
|
+
INSERT INTO session_decisions_fts(session_decisions_fts, rowid, title, description, rationale)
|
|
138
|
+
VALUES('delete', old.id, old.title, old.description, old.rationale);
|
|
139
|
+
END;
|
|
140
|
+
CREATE TRIGGER IF NOT EXISTS sdec_fts_au AFTER UPDATE ON session_decisions BEGIN
|
|
141
|
+
INSERT INTO session_decisions_fts(session_decisions_fts, rowid, title, description, rationale)
|
|
142
|
+
VALUES('delete', old.id, old.title, old.description, old.rationale);
|
|
143
|
+
INSERT INTO session_decisions_fts(rowid, title, description, rationale)
|
|
144
|
+
VALUES (new.id, new.title, new.description, new.rationale);
|
|
145
|
+
END;
|
|
146
146
|
`);
|
|
147
147
|
// Constraints FTS
|
|
148
|
-
this.db.exec(`
|
|
149
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS session_constraints_fts
|
|
150
|
-
USING fts5(title, description, content=session_constraints, content_rowid=id);
|
|
151
|
-
|
|
152
|
-
CREATE TRIGGER IF NOT EXISTS scon_fts_ai AFTER INSERT ON session_constraints BEGIN
|
|
153
|
-
INSERT INTO session_constraints_fts(rowid, title, description)
|
|
154
|
-
VALUES (new.id, new.title, new.description);
|
|
155
|
-
END;
|
|
156
|
-
CREATE TRIGGER IF NOT EXISTS scon_fts_ad AFTER DELETE ON session_constraints BEGIN
|
|
157
|
-
INSERT INTO session_constraints_fts(session_constraints_fts, rowid, title, description)
|
|
158
|
-
VALUES('delete', old.id, old.title, old.description);
|
|
159
|
-
END;
|
|
160
|
-
CREATE TRIGGER IF NOT EXISTS scon_fts_au AFTER UPDATE ON session_constraints BEGIN
|
|
161
|
-
INSERT INTO session_constraints_fts(session_constraints_fts, rowid, title, description)
|
|
162
|
-
VALUES('delete', old.id, old.title, old.description);
|
|
163
|
-
INSERT INTO session_constraints_fts(rowid, title, description)
|
|
164
|
-
VALUES (new.id, new.title, new.description);
|
|
165
|
-
END;
|
|
148
|
+
this.db.exec(`
|
|
149
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS session_constraints_fts
|
|
150
|
+
USING fts5(title, description, content=session_constraints, content_rowid=id);
|
|
151
|
+
|
|
152
|
+
CREATE TRIGGER IF NOT EXISTS scon_fts_ai AFTER INSERT ON session_constraints BEGIN
|
|
153
|
+
INSERT INTO session_constraints_fts(rowid, title, description)
|
|
154
|
+
VALUES (new.id, new.title, new.description);
|
|
155
|
+
END;
|
|
156
|
+
CREATE TRIGGER IF NOT EXISTS scon_fts_ad AFTER DELETE ON session_constraints BEGIN
|
|
157
|
+
INSERT INTO session_constraints_fts(session_constraints_fts, rowid, title, description)
|
|
158
|
+
VALUES('delete', old.id, old.title, old.description);
|
|
159
|
+
END;
|
|
160
|
+
CREATE TRIGGER IF NOT EXISTS scon_fts_au AFTER UPDATE ON session_constraints BEGIN
|
|
161
|
+
INSERT INTO session_constraints_fts(session_constraints_fts, rowid, title, description)
|
|
162
|
+
VALUES('delete', old.id, old.title, old.description);
|
|
163
|
+
INSERT INTO session_constraints_fts(rowid, title, description)
|
|
164
|
+
VALUES (new.id, new.title, new.description);
|
|
165
|
+
END;
|
|
166
166
|
`);
|
|
167
167
|
// Goals FTS
|
|
168
|
-
this.db.exec(`
|
|
169
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS session_goals_fts
|
|
170
|
-
USING fts5(title, description, content=session_goals, content_rowid=id);
|
|
171
|
-
|
|
172
|
-
CREATE TRIGGER IF NOT EXISTS sgoal_fts_ai AFTER INSERT ON session_goals BEGIN
|
|
173
|
-
INSERT INTO session_goals_fts(rowid, title, description)
|
|
174
|
-
VALUES (new.id, new.title, new.description);
|
|
175
|
-
END;
|
|
176
|
-
CREATE TRIGGER IF NOT EXISTS sgoal_fts_ad AFTER DELETE ON session_goals BEGIN
|
|
177
|
-
INSERT INTO session_goals_fts(session_goals_fts, rowid, title, description)
|
|
178
|
-
VALUES('delete', old.id, old.title, old.description);
|
|
179
|
-
END;
|
|
180
|
-
CREATE TRIGGER IF NOT EXISTS sgoal_fts_au AFTER UPDATE ON session_goals BEGIN
|
|
181
|
-
INSERT INTO session_goals_fts(session_goals_fts, rowid, title, description)
|
|
182
|
-
VALUES('delete', old.id, old.title, old.description);
|
|
183
|
-
INSERT INTO session_goals_fts(rowid, title, description)
|
|
184
|
-
VALUES (new.id, new.title, new.description);
|
|
185
|
-
END;
|
|
168
|
+
this.db.exec(`
|
|
169
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS session_goals_fts
|
|
170
|
+
USING fts5(title, description, content=session_goals, content_rowid=id);
|
|
171
|
+
|
|
172
|
+
CREATE TRIGGER IF NOT EXISTS sgoal_fts_ai AFTER INSERT ON session_goals BEGIN
|
|
173
|
+
INSERT INTO session_goals_fts(rowid, title, description)
|
|
174
|
+
VALUES (new.id, new.title, new.description);
|
|
175
|
+
END;
|
|
176
|
+
CREATE TRIGGER IF NOT EXISTS sgoal_fts_ad AFTER DELETE ON session_goals BEGIN
|
|
177
|
+
INSERT INTO session_goals_fts(session_goals_fts, rowid, title, description)
|
|
178
|
+
VALUES('delete', old.id, old.title, old.description);
|
|
179
|
+
END;
|
|
180
|
+
CREATE TRIGGER IF NOT EXISTS sgoal_fts_au AFTER UPDATE ON session_goals BEGIN
|
|
181
|
+
INSERT INTO session_goals_fts(session_goals_fts, rowid, title, description)
|
|
182
|
+
VALUES('delete', old.id, old.title, old.description);
|
|
183
|
+
INSERT INTO session_goals_fts(rowid, title, description)
|
|
184
|
+
VALUES (new.id, new.title, new.description);
|
|
185
|
+
END;
|
|
186
186
|
`);
|
|
187
187
|
// Evidence FTS
|
|
188
|
-
this.db.exec(`
|
|
189
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS session_evidence_fts
|
|
190
|
-
USING fts5(title, details, content=session_evidence, content_rowid=id);
|
|
191
|
-
|
|
192
|
-
CREATE TRIGGER IF NOT EXISTS sevi_fts_ai AFTER INSERT ON session_evidence BEGIN
|
|
193
|
-
INSERT INTO session_evidence_fts(rowid, title, details)
|
|
194
|
-
VALUES (new.id, new.title, new.details);
|
|
195
|
-
END;
|
|
196
|
-
CREATE TRIGGER IF NOT EXISTS sevi_fts_ad AFTER DELETE ON session_evidence BEGIN
|
|
197
|
-
INSERT INTO session_evidence_fts(session_evidence_fts, rowid, title, details)
|
|
198
|
-
VALUES('delete', old.id, old.title, old.details);
|
|
199
|
-
END;
|
|
200
|
-
CREATE TRIGGER IF NOT EXISTS sevi_fts_au AFTER UPDATE ON session_evidence BEGIN
|
|
201
|
-
INSERT INTO session_evidence_fts(session_evidence_fts, rowid, title, details)
|
|
202
|
-
VALUES('delete', old.id, old.title, old.details);
|
|
203
|
-
INSERT INTO session_evidence_fts(rowid, title, details)
|
|
204
|
-
VALUES (new.id, new.title, new.details);
|
|
205
|
-
END;
|
|
188
|
+
this.db.exec(`
|
|
189
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS session_evidence_fts
|
|
190
|
+
USING fts5(title, details, content=session_evidence, content_rowid=id);
|
|
191
|
+
|
|
192
|
+
CREATE TRIGGER IF NOT EXISTS sevi_fts_ai AFTER INSERT ON session_evidence BEGIN
|
|
193
|
+
INSERT INTO session_evidence_fts(rowid, title, details)
|
|
194
|
+
VALUES (new.id, new.title, new.details);
|
|
195
|
+
END;
|
|
196
|
+
CREATE TRIGGER IF NOT EXISTS sevi_fts_ad AFTER DELETE ON session_evidence BEGIN
|
|
197
|
+
INSERT INTO session_evidence_fts(session_evidence_fts, rowid, title, details)
|
|
198
|
+
VALUES('delete', old.id, old.title, old.details);
|
|
199
|
+
END;
|
|
200
|
+
CREATE TRIGGER IF NOT EXISTS sevi_fts_au AFTER UPDATE ON session_evidence BEGIN
|
|
201
|
+
INSERT INTO session_evidence_fts(session_evidence_fts, rowid, title, details)
|
|
202
|
+
VALUES('delete', old.id, old.title, old.details);
|
|
203
|
+
INSERT INTO session_evidence_fts(rowid, title, details)
|
|
204
|
+
VALUES (new.id, new.title, new.details);
|
|
205
|
+
END;
|
|
206
206
|
`);
|
|
207
207
|
}
|
|
208
208
|
catch {
|
|
@@ -214,9 +214,9 @@ export class SessionRAGStore {
|
|
|
214
214
|
// ==========================================================================
|
|
215
215
|
addDecision(input) {
|
|
216
216
|
const timestamp = new Date().toISOString();
|
|
217
|
-
const stmt = this.db.prepare(`
|
|
218
|
-
INSERT INTO session_decisions (sessionId, taskId, title, description, rationale, alternatives, impact, status, priority, relatedFiles, tags, timestamp)
|
|
219
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
217
|
+
const stmt = this.db.prepare(`
|
|
218
|
+
INSERT INTO session_decisions (sessionId, taskId, title, description, rationale, alternatives, impact, status, priority, relatedFiles, tags, timestamp)
|
|
219
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
220
220
|
`);
|
|
221
221
|
const result = stmt.run(input.sessionId || null, input.taskId || null, input.title, input.description || null, input.rationale || null, input.alternatives ? JSON.stringify(input.alternatives) : null, input.impact || null, input.status || 'active', input.priority ?? 1, input.relatedFiles ? JSON.stringify(input.relatedFiles) : null, input.tags ? JSON.stringify(input.tags) : null, timestamp);
|
|
222
222
|
return result.lastInsertRowid;
|
|
@@ -289,13 +289,13 @@ export class SessionRAGStore {
|
|
|
289
289
|
searchDecisions(query, limit = 20) {
|
|
290
290
|
if (this.fts5Available) {
|
|
291
291
|
try {
|
|
292
|
-
const rows = this.db.prepare(`
|
|
293
|
-
SELECT d.*, bm25(session_decisions_fts) as rank
|
|
294
|
-
FROM session_decisions_fts fts
|
|
295
|
-
JOIN session_decisions d ON d.id = fts.rowid
|
|
296
|
-
WHERE session_decisions_fts MATCH ?
|
|
297
|
-
ORDER BY rank
|
|
298
|
-
LIMIT ?
|
|
292
|
+
const rows = this.db.prepare(`
|
|
293
|
+
SELECT d.*, bm25(session_decisions_fts) as rank
|
|
294
|
+
FROM session_decisions_fts fts
|
|
295
|
+
JOIN session_decisions d ON d.id = fts.rowid
|
|
296
|
+
WHERE session_decisions_fts MATCH ?
|
|
297
|
+
ORDER BY rank
|
|
298
|
+
LIMIT ?
|
|
299
299
|
`).all(MemoryStorage.sanitizeFTS5Query(query), limit);
|
|
300
300
|
return rows.map(this.rowToDecision);
|
|
301
301
|
}
|
|
@@ -304,10 +304,10 @@ export class SessionRAGStore {
|
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
const pattern = `%${query}%`;
|
|
307
|
-
const rows = this.db.prepare(`
|
|
308
|
-
SELECT * FROM session_decisions
|
|
309
|
-
WHERE title LIKE ? OR description LIKE ? OR rationale LIKE ?
|
|
310
|
-
ORDER BY priority DESC, timestamp DESC LIMIT ?
|
|
307
|
+
const rows = this.db.prepare(`
|
|
308
|
+
SELECT * FROM session_decisions
|
|
309
|
+
WHERE title LIKE ? OR description LIKE ? OR rationale LIKE ?
|
|
310
|
+
ORDER BY priority DESC, timestamp DESC LIMIT ?
|
|
311
311
|
`).all(pattern, pattern, pattern, limit);
|
|
312
312
|
return rows.map(this.rowToDecision);
|
|
313
313
|
}
|
|
@@ -336,9 +336,9 @@ export class SessionRAGStore {
|
|
|
336
336
|
// ==========================================================================
|
|
337
337
|
addConstraint(input) {
|
|
338
338
|
const timestamp = new Date().toISOString();
|
|
339
|
-
const stmt = this.db.prepare(`
|
|
340
|
-
INSERT INTO session_constraints (sessionId, taskId, title, description, type, severity, scope, timestamp)
|
|
341
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
339
|
+
const stmt = this.db.prepare(`
|
|
340
|
+
INSERT INTO session_constraints (sessionId, taskId, title, description, type, severity, scope, timestamp)
|
|
341
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
342
342
|
`);
|
|
343
343
|
const result = stmt.run(input.sessionId || null, input.taskId || null, input.title, input.description || null, input.type, input.severity || 'medium', input.scope || null, timestamp);
|
|
344
344
|
return result.lastInsertRowid;
|
|
@@ -399,13 +399,13 @@ export class SessionRAGStore {
|
|
|
399
399
|
searchConstraints(query, limit = 20) {
|
|
400
400
|
if (this.fts5Available) {
|
|
401
401
|
try {
|
|
402
|
-
const rows = this.db.prepare(`
|
|
403
|
-
SELECT c.*, bm25(session_constraints_fts) as rank
|
|
404
|
-
FROM session_constraints_fts fts
|
|
405
|
-
JOIN session_constraints c ON c.id = fts.rowid
|
|
406
|
-
WHERE session_constraints_fts MATCH ?
|
|
407
|
-
ORDER BY rank
|
|
408
|
-
LIMIT ?
|
|
402
|
+
const rows = this.db.prepare(`
|
|
403
|
+
SELECT c.*, bm25(session_constraints_fts) as rank
|
|
404
|
+
FROM session_constraints_fts fts
|
|
405
|
+
JOIN session_constraints c ON c.id = fts.rowid
|
|
406
|
+
WHERE session_constraints_fts MATCH ?
|
|
407
|
+
ORDER BY rank
|
|
408
|
+
LIMIT ?
|
|
409
409
|
`).all(MemoryStorage.sanitizeFTS5Query(query), limit);
|
|
410
410
|
return rows.map(this.rowToConstraint);
|
|
411
411
|
}
|
|
@@ -414,10 +414,10 @@ export class SessionRAGStore {
|
|
|
414
414
|
}
|
|
415
415
|
}
|
|
416
416
|
const pattern = `%${query}%`;
|
|
417
|
-
const rows = this.db.prepare(`
|
|
418
|
-
SELECT * FROM session_constraints
|
|
419
|
-
WHERE title LIKE ? OR description LIKE ?
|
|
420
|
-
ORDER BY timestamp DESC LIMIT ?
|
|
417
|
+
const rows = this.db.prepare(`
|
|
418
|
+
SELECT * FROM session_constraints
|
|
419
|
+
WHERE title LIKE ? OR description LIKE ?
|
|
420
|
+
ORDER BY timestamp DESC LIMIT ?
|
|
421
421
|
`).all(pattern, pattern, limit);
|
|
422
422
|
return rows.map(this.rowToConstraint);
|
|
423
423
|
}
|
|
@@ -442,9 +442,9 @@ export class SessionRAGStore {
|
|
|
442
442
|
// ==========================================================================
|
|
443
443
|
addGoal(input) {
|
|
444
444
|
const timestamp = new Date().toISOString();
|
|
445
|
-
const stmt = this.db.prepare(`
|
|
446
|
-
INSERT INTO session_goals (sessionId, taskId, parentId, title, description, status, priority, progressPercent, successCriteria, timestamp, completedAt)
|
|
447
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
445
|
+
const stmt = this.db.prepare(`
|
|
446
|
+
INSERT INTO session_goals (sessionId, taskId, parentId, title, description, status, priority, progressPercent, successCriteria, timestamp, completedAt)
|
|
447
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
448
448
|
`);
|
|
449
449
|
const result = stmt.run(input.sessionId || null, input.taskId || null, input.parentId || null, input.title, input.description || null, input.status || 'active', input.priority ?? 1, input.progressPercent ?? 0, input.successCriteria ? JSON.stringify(input.successCriteria) : null, timestamp, null);
|
|
450
450
|
return result.lastInsertRowid;
|
|
@@ -511,41 +511,41 @@ export class SessionRAGStore {
|
|
|
511
511
|
return rows.map(this.rowToGoal);
|
|
512
512
|
}
|
|
513
513
|
getActiveGoals(limit = 10) {
|
|
514
|
-
const rows = this.db.prepare(`
|
|
515
|
-
SELECT * FROM session_goals
|
|
516
|
-
WHERE status = 'active'
|
|
517
|
-
ORDER BY priority DESC, timestamp DESC
|
|
518
|
-
LIMIT ?
|
|
514
|
+
const rows = this.db.prepare(`
|
|
515
|
+
SELECT * FROM session_goals
|
|
516
|
+
WHERE status = 'active'
|
|
517
|
+
ORDER BY priority DESC, timestamp DESC
|
|
518
|
+
LIMIT ?
|
|
519
519
|
`).all(limit);
|
|
520
520
|
return rows.map(this.rowToGoal);
|
|
521
521
|
}
|
|
522
522
|
getGoalHierarchy(rootId) {
|
|
523
523
|
if (rootId) {
|
|
524
524
|
// Get root + all descendants (max 3 levels)
|
|
525
|
-
const rows = this.db.prepare(`
|
|
526
|
-
SELECT * FROM session_goals
|
|
527
|
-
WHERE id = ? OR parentId = ?
|
|
528
|
-
ORDER BY parentId NULLS FIRST, priority DESC
|
|
525
|
+
const rows = this.db.prepare(`
|
|
526
|
+
SELECT * FROM session_goals
|
|
527
|
+
WHERE id = ? OR parentId = ?
|
|
528
|
+
ORDER BY parentId NULLS FIRST, priority DESC
|
|
529
529
|
`).all(rootId, rootId);
|
|
530
530
|
return rows.map(this.rowToGoal);
|
|
531
531
|
}
|
|
532
532
|
// Get all top-level goals with children
|
|
533
|
-
const rows = this.db.prepare(`
|
|
534
|
-
SELECT * FROM session_goals
|
|
535
|
-
ORDER BY parentId NULLS FIRST, priority DESC, timestamp DESC
|
|
533
|
+
const rows = this.db.prepare(`
|
|
534
|
+
SELECT * FROM session_goals
|
|
535
|
+
ORDER BY parentId NULLS FIRST, priority DESC, timestamp DESC
|
|
536
536
|
`).all();
|
|
537
537
|
return rows.map(this.rowToGoal);
|
|
538
538
|
}
|
|
539
539
|
searchGoals(query, limit = 20) {
|
|
540
540
|
if (this.fts5Available) {
|
|
541
541
|
try {
|
|
542
|
-
const rows = this.db.prepare(`
|
|
543
|
-
SELECT g.*, bm25(session_goals_fts) as rank
|
|
544
|
-
FROM session_goals_fts fts
|
|
545
|
-
JOIN session_goals g ON g.id = fts.rowid
|
|
546
|
-
WHERE session_goals_fts MATCH ?
|
|
547
|
-
ORDER BY rank
|
|
548
|
-
LIMIT ?
|
|
542
|
+
const rows = this.db.prepare(`
|
|
543
|
+
SELECT g.*, bm25(session_goals_fts) as rank
|
|
544
|
+
FROM session_goals_fts fts
|
|
545
|
+
JOIN session_goals g ON g.id = fts.rowid
|
|
546
|
+
WHERE session_goals_fts MATCH ?
|
|
547
|
+
ORDER BY rank
|
|
548
|
+
LIMIT ?
|
|
549
549
|
`).all(MemoryStorage.sanitizeFTS5Query(query), limit);
|
|
550
550
|
return rows.map(this.rowToGoal);
|
|
551
551
|
}
|
|
@@ -554,10 +554,10 @@ export class SessionRAGStore {
|
|
|
554
554
|
}
|
|
555
555
|
}
|
|
556
556
|
const pattern = `%${query}%`;
|
|
557
|
-
const rows = this.db.prepare(`
|
|
558
|
-
SELECT * FROM session_goals
|
|
559
|
-
WHERE title LIKE ? OR description LIKE ?
|
|
560
|
-
ORDER BY priority DESC, timestamp DESC LIMIT ?
|
|
557
|
+
const rows = this.db.prepare(`
|
|
558
|
+
SELECT * FROM session_goals
|
|
559
|
+
WHERE title LIKE ? OR description LIKE ?
|
|
560
|
+
ORDER BY priority DESC, timestamp DESC LIMIT ?
|
|
561
561
|
`).all(pattern, pattern, limit);
|
|
562
562
|
return rows.map(this.rowToGoal);
|
|
563
563
|
}
|
|
@@ -585,9 +585,9 @@ export class SessionRAGStore {
|
|
|
585
585
|
// ==========================================================================
|
|
586
586
|
addEvidence(input) {
|
|
587
587
|
const timestamp = new Date().toISOString();
|
|
588
|
-
const stmt = this.db.prepare(`
|
|
589
|
-
INSERT INTO session_evidence (sessionId, taskId, type, title, status, details, metrics, relatedGoals, timestamp)
|
|
590
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
588
|
+
const stmt = this.db.prepare(`
|
|
589
|
+
INSERT INTO session_evidence (sessionId, taskId, type, title, status, details, metrics, relatedGoals, timestamp)
|
|
590
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
591
591
|
`);
|
|
592
592
|
const result = stmt.run(input.sessionId || null, input.taskId || null, input.type, input.title, input.status, input.details ? JSON.stringify(input.details) : null, input.metrics ? JSON.stringify(input.metrics) : null, input.relatedGoals ? JSON.stringify(input.relatedGoals) : null, timestamp);
|
|
593
593
|
return result.lastInsertRowid;
|
|
@@ -617,23 +617,23 @@ export class SessionRAGStore {
|
|
|
617
617
|
return rows.map(this.rowToEvidence);
|
|
618
618
|
}
|
|
619
619
|
getRecentEvidence(limit = 10) {
|
|
620
|
-
const rows = this.db.prepare(`
|
|
621
|
-
SELECT * FROM session_evidence
|
|
622
|
-
ORDER BY timestamp DESC
|
|
623
|
-
LIMIT ?
|
|
620
|
+
const rows = this.db.prepare(`
|
|
621
|
+
SELECT * FROM session_evidence
|
|
622
|
+
ORDER BY timestamp DESC
|
|
623
|
+
LIMIT ?
|
|
624
624
|
`).all(limit);
|
|
625
625
|
return rows.map(this.rowToEvidence);
|
|
626
626
|
}
|
|
627
627
|
searchEvidence(query, limit = 20) {
|
|
628
628
|
if (this.fts5Available) {
|
|
629
629
|
try {
|
|
630
|
-
const rows = this.db.prepare(`
|
|
631
|
-
SELECT e.*, bm25(session_evidence_fts) as rank
|
|
632
|
-
FROM session_evidence_fts fts
|
|
633
|
-
JOIN session_evidence e ON e.id = fts.rowid
|
|
634
|
-
WHERE session_evidence_fts MATCH ?
|
|
635
|
-
ORDER BY rank
|
|
636
|
-
LIMIT ?
|
|
630
|
+
const rows = this.db.prepare(`
|
|
631
|
+
SELECT e.*, bm25(session_evidence_fts) as rank
|
|
632
|
+
FROM session_evidence_fts fts
|
|
633
|
+
JOIN session_evidence e ON e.id = fts.rowid
|
|
634
|
+
WHERE session_evidence_fts MATCH ?
|
|
635
|
+
ORDER BY rank
|
|
636
|
+
LIMIT ?
|
|
637
637
|
`).all(MemoryStorage.sanitizeFTS5Query(query), limit);
|
|
638
638
|
return rows.map(this.rowToEvidence);
|
|
639
639
|
}
|
|
@@ -642,10 +642,10 @@ export class SessionRAGStore {
|
|
|
642
642
|
}
|
|
643
643
|
}
|
|
644
644
|
const pattern = `%${query}%`;
|
|
645
|
-
const rows = this.db.prepare(`
|
|
646
|
-
SELECT * FROM session_evidence
|
|
647
|
-
WHERE title LIKE ? OR details LIKE ?
|
|
648
|
-
ORDER BY timestamp DESC LIMIT ?
|
|
645
|
+
const rows = this.db.prepare(`
|
|
646
|
+
SELECT * FROM session_evidence
|
|
647
|
+
WHERE title LIKE ? OR details LIKE ?
|
|
648
|
+
ORDER BY timestamp DESC LIMIT ?
|
|
649
649
|
`).all(pattern, pattern, limit);
|
|
650
650
|
return rows.map(this.rowToEvidence);
|
|
651
651
|
}
|
|
@@ -13,10 +13,10 @@ export class SessionSummarizer {
|
|
|
13
13
|
*/
|
|
14
14
|
saveSummary(input) {
|
|
15
15
|
const timestamp = new Date().toISOString();
|
|
16
|
-
const stmt = this.db.prepare(`
|
|
17
|
-
INSERT OR REPLACE INTO session_summaries
|
|
18
|
-
(sessionId, request, investigated, learned, completed, nextSteps, filesRead, filesEdited, timestamp)
|
|
19
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
16
|
+
const stmt = this.db.prepare(`
|
|
17
|
+
INSERT OR REPLACE INTO session_summaries
|
|
18
|
+
(sessionId, request, investigated, learned, completed, nextSteps, filesRead, filesEdited, timestamp)
|
|
19
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
20
20
|
`);
|
|
21
21
|
const result = stmt.run(input.sessionId, input.request || null, input.investigated || null, input.learned || null, input.completed || null, input.nextSteps || null, input.filesRead ? JSON.stringify(input.filesRead) : null, input.filesEdited ? JSON.stringify(input.filesEdited) : null, timestamp);
|
|
22
22
|
return result.lastInsertRowid;
|
|
@@ -25,9 +25,9 @@ export class SessionSummarizer {
|
|
|
25
25
|
* Get recent session summaries
|
|
26
26
|
*/
|
|
27
27
|
getRecentSummaries(limit = 3) {
|
|
28
|
-
const rows = this.db.prepare(`
|
|
29
|
-
SELECT * FROM session_summaries
|
|
30
|
-
ORDER BY timestamp DESC LIMIT ?
|
|
28
|
+
const rows = this.db.prepare(`
|
|
29
|
+
SELECT * FROM session_summaries
|
|
30
|
+
ORDER BY timestamp DESC LIMIT ?
|
|
31
31
|
`).all(limit);
|
|
32
32
|
return rows.map(this.rowToSummary);
|
|
33
33
|
}
|
|
@@ -35,8 +35,8 @@ export class SessionSummarizer {
|
|
|
35
35
|
* Get summary for a specific session
|
|
36
36
|
*/
|
|
37
37
|
getSummary(sessionId) {
|
|
38
|
-
const row = this.db.prepare(`
|
|
39
|
-
SELECT * FROM session_summaries WHERE sessionId = ?
|
|
38
|
+
const row = this.db.prepare(`
|
|
39
|
+
SELECT * FROM session_summaries WHERE sessionId = ?
|
|
40
40
|
`).get(sessionId);
|
|
41
41
|
return row ? this.rowToSummary(row) : null;
|
|
42
42
|
}
|
|
@@ -151,18 +151,18 @@ export class AgentManager {
|
|
|
151
151
|
* 리뷰 프롬프트 생성
|
|
152
152
|
*/
|
|
153
153
|
buildReviewPrompt(agent, filePaths) {
|
|
154
|
-
return `You are a ${agent.name}. Review the following files for issues in your domain:
|
|
155
|
-
|
|
156
|
-
Files to review:
|
|
157
|
-
${filePaths.map(f => `- ${f}`).join('\n')}
|
|
158
|
-
|
|
159
|
-
${agent.content}
|
|
160
|
-
|
|
161
|
-
Provide findings in this format:
|
|
162
|
-
- Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
|
|
163
|
-
- Category: Your specialty area
|
|
164
|
-
- Location: file:line
|
|
165
|
-
- Issue: Description
|
|
154
|
+
return `You are a ${agent.name}. Review the following files for issues in your domain:
|
|
155
|
+
|
|
156
|
+
Files to review:
|
|
157
|
+
${filePaths.map(f => `- ${f}`).join('\n')}
|
|
158
|
+
|
|
159
|
+
${agent.content}
|
|
160
|
+
|
|
161
|
+
Provide findings in this format:
|
|
162
|
+
- Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
|
|
163
|
+
- Category: Your specialty area
|
|
164
|
+
- Location: file:line
|
|
165
|
+
- Issue: Description
|
|
166
166
|
- Fix: Recommendation`;
|
|
167
167
|
}
|
|
168
168
|
/**
|