@su-record/vibe 2.5.14 → 2.5.17
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/CLAUDE.md +96 -267
- package/LICENSE +21 -21
- package/README.md +262 -262
- 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/e2e-tester.md +266 -266
- 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/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -189
- package/agents/research/codebase-patterns-agent.md +157 -147
- package/agents/research/framework-docs-agent.md +188 -178
- package/agents/research/security-advisory-agent.md +213 -203
- 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-previewer.md +129 -129
- package/commands/vibe.analyze.md +356 -356
- package/commands/vibe.reason.md +329 -329
- package/commands/vibe.review.md +326 -326
- package/commands/vibe.run.md +1117 -1117
- package/commands/vibe.spec.md +1066 -1058
- package/commands/vibe.utils.md +353 -353
- package/commands/vibe.verify.md +375 -375
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +109 -108
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm.js +144 -144
- package/dist/lib/DeepInit.js +24 -24
- package/dist/lib/FrameworkDetector.d.ts +56 -0
- package/dist/lib/FrameworkDetector.d.ts.map +1 -0
- package/dist/lib/FrameworkDetector.js +287 -0
- package/dist/lib/FrameworkDetector.js.map +1 -0
- package/dist/lib/IterationTracker.js +11 -11
- package/dist/lib/PythonParser.js +108 -108
- package/dist/lib/RuleBuildSystem.d.ts +117 -0
- package/dist/lib/RuleBuildSystem.d.ts.map +1 -0
- package/dist/lib/RuleBuildSystem.js +402 -0
- package/dist/lib/RuleBuildSystem.js.map +1 -0
- package/dist/lib/SkillFrontmatter.js +28 -28
- package/dist/lib/SkillQualityGate.js +9 -9
- package/dist/lib/SkillRepository.js +159 -159
- package/dist/lib/UltraQA.js +77 -77
- package/dist/lib/gpt-api.js +4 -4
- package/dist/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/lib/memory/MemorySearch.js +20 -20
- package/dist/lib/memory/MemoryStorage.js +64 -64
- package/dist/orchestrator/AgentManager.js +12 -12
- package/dist/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/orchestrator/SmartRouter.js +11 -11
- package/dist/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/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/hooks/hooks.json +222 -222
- package/hooks/scripts/code-check.js +22 -22
- package/hooks/scripts/code-review.js +22 -22
- package/hooks/scripts/complexity.js +22 -22
- package/hooks/scripts/compound.js +23 -23
- package/hooks/scripts/context-save.js +33 -33
- package/hooks/scripts/generate-brand-assets.js +472 -472
- package/hooks/scripts/hud-multiline.js +262 -262
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +171 -171
- package/hooks/scripts/post-edit.js +97 -97
- package/hooks/scripts/post-tool-verify.js +210 -210
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/recall.js +22 -22
- package/hooks/scripts/session-start.js +30 -30
- package/hooks/scripts/skill-injector.js +191 -191
- package/hooks/scripts/utils.js +97 -97
- 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 +83 -83
- package/skills/brand-assets.md +141 -141
- package/skills/commerce-patterns.md +361 -361
- package/skills/context7-usage.md +102 -102
- package/skills/e2e-commerce.md +304 -304
- package/skills/frontend-design.md +92 -92
- package/skills/git-worktree.md +181 -181
- package/skills/parallel-research.md +77 -77
- package/skills/priority-todos.md +239 -239
- package/skills/seo-checklist.md +244 -244
- package/skills/tool-fallback.md +190 -190
- package/skills/vibe-capabilities.md +161 -161
- package/vibe/constitution.md +227 -227
- package/vibe/rules/core/communication-guide.md +98 -98
- package/vibe/rules/core/development-philosophy.md +52 -52
- package/vibe/rules/core/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/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/naming-conventions.md +198 -198
- 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/dist/cli/mcp.d.ts +0 -49
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -169
- package/dist/cli/mcp.js.map +0 -1
- package/dist/lib/gemini-mcp.d.ts +0 -10
- package/dist/lib/gemini-mcp.d.ts.map +0 -1
- package/dist/lib/gemini-mcp.js +0 -353
- package/dist/lib/gemini-mcp.js.map +0 -1
- package/dist/lib/gpt-mcp.d.ts +0 -10
- package/dist/lib/gpt-mcp.d.ts.map +0 -1
- package/dist/lib/gpt-mcp.js +0 -352
- package/dist/lib/gpt-mcp.js.map +0 -1
- package/dist/tools/analytics/getUsageAnalytics.d.ts +0 -10
- package/dist/tools/analytics/getUsageAnalytics.d.ts.map +0 -1
- package/dist/tools/analytics/getUsageAnalytics.js +0 -246
- package/dist/tools/analytics/getUsageAnalytics.js.map +0 -1
- package/dist/tools/analytics/index.d.ts +0 -5
- package/dist/tools/analytics/index.d.ts.map +0 -1
- package/dist/tools/analytics/index.js +0 -5
- package/dist/tools/analytics/index.js.map +0 -1
- package/dist/tools/convention/getCodingGuide.d.ts +0 -7
- package/dist/tools/convention/getCodingGuide.d.ts.map +0 -1
- package/dist/tools/convention/getCodingGuide.js +0 -69
- package/dist/tools/convention/getCodingGuide.js.map +0 -1
- package/dist/tools/planning/analyzeRequirements.d.ts +0 -9
- package/dist/tools/planning/analyzeRequirements.d.ts.map +0 -1
- package/dist/tools/planning/analyzeRequirements.js +0 -171
- package/dist/tools/planning/analyzeRequirements.js.map +0 -1
- package/dist/tools/planning/createUserStories.d.ts +0 -9
- package/dist/tools/planning/createUserStories.d.ts.map +0 -1
- package/dist/tools/planning/createUserStories.js +0 -124
- package/dist/tools/planning/createUserStories.js.map +0 -1
- package/dist/tools/planning/featureRoadmap.d.ts +0 -10
- package/dist/tools/planning/featureRoadmap.d.ts.map +0 -1
- package/dist/tools/planning/featureRoadmap.js +0 -207
- package/dist/tools/planning/featureRoadmap.js.map +0 -1
- package/dist/tools/planning/generatePrd.d.ts +0 -11
- package/dist/tools/planning/generatePrd.d.ts.map +0 -1
- package/dist/tools/planning/generatePrd.js +0 -161
- package/dist/tools/planning/generatePrd.js.map +0 -1
- package/dist/tools/planning/index.d.ts +0 -8
- package/dist/tools/planning/index.d.ts.map +0 -1
- package/dist/tools/planning/index.js +0 -8
- package/dist/tools/planning/index.js.map +0 -1
- package/dist/tools/prompt/analyzePrompt.d.ts +0 -7
- package/dist/tools/prompt/analyzePrompt.d.ts.map +0 -1
- package/dist/tools/prompt/analyzePrompt.js +0 -150
- package/dist/tools/prompt/analyzePrompt.js.map +0 -1
- package/dist/tools/prompt/enhancePrompt.d.ts +0 -8
- package/dist/tools/prompt/enhancePrompt.d.ts.map +0 -1
- package/dist/tools/prompt/enhancePrompt.js +0 -110
- package/dist/tools/prompt/enhancePrompt.js.map +0 -1
- package/dist/tools/prompt/enhancePromptGemini.d.ts +0 -8
- package/dist/tools/prompt/enhancePromptGemini.d.ts.map +0 -1
- package/dist/tools/prompt/enhancePromptGemini.js +0 -332
- package/dist/tools/prompt/enhancePromptGemini.js.map +0 -1
- package/dist/tools/prompt/index.d.ts +0 -7
- package/dist/tools/prompt/index.d.ts.map +0 -1
- package/dist/tools/prompt/index.js +0 -7
- package/dist/tools/prompt/index.js.map +0 -1
- package/dist/tools/reasoning/applyReasoningFramework.d.ts +0 -8
- package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +0 -1
- package/dist/tools/reasoning/applyReasoningFramework.js +0 -266
- package/dist/tools/reasoning/applyReasoningFramework.js.map +0 -1
- package/dist/tools/reasoning/index.d.ts +0 -5
- package/dist/tools/reasoning/index.d.ts.map +0 -1
- package/dist/tools/reasoning/index.js +0 -5
- package/dist/tools/reasoning/index.js.map +0 -1
- package/dist/tools/thinking/analyzeProblem.d.ts +0 -7
- package/dist/tools/thinking/analyzeProblem.d.ts.map +0 -1
- package/dist/tools/thinking/analyzeProblem.js +0 -55
- package/dist/tools/thinking/analyzeProblem.js.map +0 -1
- package/dist/tools/thinking/breakDownProblem.d.ts +0 -8
- package/dist/tools/thinking/breakDownProblem.d.ts.map +0 -1
- package/dist/tools/thinking/breakDownProblem.js +0 -145
- package/dist/tools/thinking/breakDownProblem.js.map +0 -1
- package/dist/tools/thinking/createThinkingChain.d.ts +0 -7
- package/dist/tools/thinking/createThinkingChain.d.ts.map +0 -1
- package/dist/tools/thinking/createThinkingChain.js +0 -44
- package/dist/tools/thinking/createThinkingChain.js.map +0 -1
- package/dist/tools/thinking/formatAsPlan.d.ts +0 -9
- package/dist/tools/thinking/formatAsPlan.d.ts.map +0 -1
- package/dist/tools/thinking/formatAsPlan.js +0 -78
- package/dist/tools/thinking/formatAsPlan.js.map +0 -1
- package/dist/tools/thinking/index.d.ts +0 -10
- package/dist/tools/thinking/index.d.ts.map +0 -1
- package/dist/tools/thinking/index.js +0 -10
- package/dist/tools/thinking/index.js.map +0 -1
- package/dist/tools/thinking/stepByStepAnalysis.d.ts +0 -8
- package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +0 -1
- package/dist/tools/thinking/stepByStepAnalysis.js +0 -63
- package/dist/tools/thinking/stepByStepAnalysis.js.map +0 -1
- package/dist/tools/thinking/thinkAloudProcess.d.ts +0 -8
- package/dist/tools/thinking/thinkAloudProcess.d.ts.map +0 -1
- package/dist/tools/thinking/thinkAloudProcess.js +0 -80
- package/dist/tools/thinking/thinkAloudProcess.js.map +0 -1
|
@@ -31,37 +31,37 @@ export class MemoryStorage {
|
|
|
31
31
|
}
|
|
32
32
|
initializeDatabase() {
|
|
33
33
|
// Create memories table
|
|
34
|
-
this.db.exec(`
|
|
35
|
-
CREATE TABLE IF NOT EXISTS memories (
|
|
36
|
-
key TEXT PRIMARY KEY,
|
|
37
|
-
value TEXT NOT NULL,
|
|
38
|
-
category TEXT NOT NULL DEFAULT 'general',
|
|
39
|
-
timestamp TEXT NOT NULL,
|
|
40
|
-
lastAccessed TEXT NOT NULL,
|
|
41
|
-
priority INTEGER DEFAULT 0
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
CREATE INDEX IF NOT EXISTS idx_category ON memories(category);
|
|
45
|
-
CREATE INDEX IF NOT EXISTS idx_timestamp ON memories(timestamp);
|
|
46
|
-
CREATE INDEX IF NOT EXISTS idx_priority ON memories(priority);
|
|
47
|
-
CREATE INDEX IF NOT EXISTS idx_lastAccessed ON memories(lastAccessed);
|
|
34
|
+
this.db.exec(`
|
|
35
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
36
|
+
key TEXT PRIMARY KEY,
|
|
37
|
+
value TEXT NOT NULL,
|
|
38
|
+
category TEXT NOT NULL DEFAULT 'general',
|
|
39
|
+
timestamp TEXT NOT NULL,
|
|
40
|
+
lastAccessed TEXT NOT NULL,
|
|
41
|
+
priority INTEGER DEFAULT 0
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_category ON memories(category);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_timestamp ON memories(timestamp);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_priority ON memories(priority);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_lastAccessed ON memories(lastAccessed);
|
|
48
48
|
`);
|
|
49
49
|
// Create memory_relations table for Knowledge Graph
|
|
50
|
-
this.db.exec(`
|
|
51
|
-
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
52
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
53
|
-
sourceKey TEXT NOT NULL,
|
|
54
|
-
targetKey TEXT NOT NULL,
|
|
55
|
-
relationType TEXT NOT NULL,
|
|
56
|
-
strength REAL DEFAULT 1.0,
|
|
57
|
-
metadata TEXT,
|
|
58
|
-
timestamp TEXT NOT NULL,
|
|
59
|
-
UNIQUE(sourceKey, targetKey, relationType)
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
CREATE INDEX IF NOT EXISTS idx_rel_source ON memory_relations(sourceKey);
|
|
63
|
-
CREATE INDEX IF NOT EXISTS idx_rel_target ON memory_relations(targetKey);
|
|
64
|
-
CREATE INDEX IF NOT EXISTS idx_rel_type ON memory_relations(relationType);
|
|
50
|
+
this.db.exec(`
|
|
51
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
52
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
53
|
+
sourceKey TEXT NOT NULL,
|
|
54
|
+
targetKey TEXT NOT NULL,
|
|
55
|
+
relationType TEXT NOT NULL,
|
|
56
|
+
strength REAL DEFAULT 1.0,
|
|
57
|
+
metadata TEXT,
|
|
58
|
+
timestamp TEXT NOT NULL,
|
|
59
|
+
UNIQUE(sourceKey, targetKey, relationType)
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_rel_source ON memory_relations(sourceKey);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_rel_target ON memory_relations(targetKey);
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_rel_type ON memory_relations(relationType);
|
|
65
65
|
`);
|
|
66
66
|
// Enable WAL mode for better concurrency
|
|
67
67
|
this.db.pragma('journal_mode = WAL');
|
|
@@ -70,10 +70,10 @@ export class MemoryStorage {
|
|
|
70
70
|
}
|
|
71
71
|
initializePreparedStatements() {
|
|
72
72
|
try {
|
|
73
|
-
this.recallStmt = this.db.prepare(`
|
|
74
|
-
UPDATE memories SET lastAccessed = ?
|
|
75
|
-
WHERE key = ?
|
|
76
|
-
RETURNING *
|
|
73
|
+
this.recallStmt = this.db.prepare(`
|
|
74
|
+
UPDATE memories SET lastAccessed = ?
|
|
75
|
+
WHERE key = ?
|
|
76
|
+
RETURNING *
|
|
77
77
|
`);
|
|
78
78
|
}
|
|
79
79
|
catch {
|
|
@@ -82,9 +82,9 @@ export class MemoryStorage {
|
|
|
82
82
|
this.recallSelectStmt = this.db.prepare(`SELECT * FROM memories WHERE key = ?`);
|
|
83
83
|
this.recallUpdateStmt = this.db.prepare(`UPDATE memories SET lastAccessed = ? WHERE key = ?`);
|
|
84
84
|
}
|
|
85
|
-
this.saveStmt = this.db.prepare(`
|
|
86
|
-
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
87
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
85
|
+
this.saveStmt = this.db.prepare(`
|
|
86
|
+
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
88
88
|
`);
|
|
89
89
|
}
|
|
90
90
|
migrateFromJSON() {
|
|
@@ -96,9 +96,9 @@ export class MemoryStorage {
|
|
|
96
96
|
const memories = JSON.parse(jsonData);
|
|
97
97
|
if (memories.length === 0)
|
|
98
98
|
return;
|
|
99
|
-
const insert = this.db.prepare(`
|
|
100
|
-
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
101
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
99
|
+
const insert = this.db.prepare(`
|
|
100
|
+
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
101
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
102
102
|
`);
|
|
103
103
|
const insertMany = this.db.transaction((items) => {
|
|
104
104
|
for (const item of items) {
|
|
@@ -121,9 +121,9 @@ export class MemoryStorage {
|
|
|
121
121
|
this.saveStmt.run(key, value, category, timestamp, timestamp, priority);
|
|
122
122
|
}
|
|
123
123
|
else {
|
|
124
|
-
const stmt = this.db.prepare(`
|
|
125
|
-
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
126
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
124
|
+
const stmt = this.db.prepare(`
|
|
125
|
+
INSERT OR REPLACE INTO memories (key, value, category, timestamp, lastAccessed, priority)
|
|
126
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
127
127
|
`);
|
|
128
128
|
stmt.run(key, value, category, timestamp, timestamp, priority);
|
|
129
129
|
}
|
|
@@ -161,10 +161,10 @@ export class MemoryStorage {
|
|
|
161
161
|
*/
|
|
162
162
|
update(key, value) {
|
|
163
163
|
const timestamp = new Date().toISOString();
|
|
164
|
-
const stmt = this.db.prepare(`
|
|
165
|
-
UPDATE memories
|
|
166
|
-
SET value = ?, timestamp = ?, lastAccessed = ?
|
|
167
|
-
WHERE key = ?
|
|
164
|
+
const stmt = this.db.prepare(`
|
|
165
|
+
UPDATE memories
|
|
166
|
+
SET value = ?, timestamp = ?, lastAccessed = ?
|
|
167
|
+
WHERE key = ?
|
|
168
168
|
`);
|
|
169
169
|
const result = stmt.run(value, timestamp, timestamp, key);
|
|
170
170
|
return result.changes > 0;
|
|
@@ -174,16 +174,16 @@ export class MemoryStorage {
|
|
|
174
174
|
*/
|
|
175
175
|
list(category) {
|
|
176
176
|
if (category) {
|
|
177
|
-
const stmt = this.db.prepare(`
|
|
178
|
-
SELECT * FROM memories WHERE category = ?
|
|
179
|
-
ORDER BY priority DESC, timestamp DESC
|
|
177
|
+
const stmt = this.db.prepare(`
|
|
178
|
+
SELECT * FROM memories WHERE category = ?
|
|
179
|
+
ORDER BY priority DESC, timestamp DESC
|
|
180
180
|
`);
|
|
181
181
|
return stmt.all(category);
|
|
182
182
|
}
|
|
183
183
|
else {
|
|
184
|
-
const stmt = this.db.prepare(`
|
|
185
|
-
SELECT * FROM memories
|
|
186
|
-
ORDER BY priority DESC, timestamp DESC
|
|
184
|
+
const stmt = this.db.prepare(`
|
|
185
|
+
SELECT * FROM memories
|
|
186
|
+
ORDER BY priority DESC, timestamp DESC
|
|
187
187
|
`);
|
|
188
188
|
return stmt.all();
|
|
189
189
|
}
|
|
@@ -192,10 +192,10 @@ export class MemoryStorage {
|
|
|
192
192
|
* Search memories by keyword
|
|
193
193
|
*/
|
|
194
194
|
search(query) {
|
|
195
|
-
const stmt = this.db.prepare(`
|
|
196
|
-
SELECT * FROM memories
|
|
197
|
-
WHERE key LIKE ? OR value LIKE ?
|
|
198
|
-
ORDER BY priority DESC, timestamp DESC
|
|
195
|
+
const stmt = this.db.prepare(`
|
|
196
|
+
SELECT * FROM memories
|
|
197
|
+
WHERE key LIKE ? OR value LIKE ?
|
|
198
|
+
ORDER BY priority DESC, timestamp DESC
|
|
199
199
|
`);
|
|
200
200
|
const pattern = `%${query}%`;
|
|
201
201
|
return stmt.all(pattern, pattern);
|
|
@@ -204,10 +204,10 @@ export class MemoryStorage {
|
|
|
204
204
|
* Get memories by priority level
|
|
205
205
|
*/
|
|
206
206
|
getByPriority(priority) {
|
|
207
|
-
const stmt = this.db.prepare(`
|
|
208
|
-
SELECT * FROM memories
|
|
209
|
-
WHERE priority = ?
|
|
210
|
-
ORDER BY timestamp DESC
|
|
207
|
+
const stmt = this.db.prepare(`
|
|
208
|
+
SELECT * FROM memories
|
|
209
|
+
WHERE priority = ?
|
|
210
|
+
ORDER BY timestamp DESC
|
|
211
211
|
`);
|
|
212
212
|
return stmt.all(priority);
|
|
213
213
|
}
|
|
@@ -223,10 +223,10 @@ export class MemoryStorage {
|
|
|
223
223
|
* Get memory statistics
|
|
224
224
|
*/
|
|
225
225
|
getStats() {
|
|
226
|
-
const categories = this.db.prepare(`
|
|
227
|
-
SELECT category, COUNT(*) as count
|
|
228
|
-
FROM memories
|
|
229
|
-
GROUP BY category
|
|
226
|
+
const categories = this.db.prepare(`
|
|
227
|
+
SELECT category, COUNT(*) as count
|
|
228
|
+
FROM memories
|
|
229
|
+
GROUP BY category
|
|
230
230
|
`).all();
|
|
231
231
|
const byCategory = {};
|
|
232
232
|
let total = 0;
|
|
@@ -152,18 +152,18 @@ export class AgentManager {
|
|
|
152
152
|
* 리뷰 프롬프트 생성
|
|
153
153
|
*/
|
|
154
154
|
buildReviewPrompt(agent, filePaths) {
|
|
155
|
-
return `You are a ${agent.name}. Review the following files for issues in your domain:
|
|
156
|
-
|
|
157
|
-
Files to review:
|
|
158
|
-
${filePaths.map(f => `- ${f}`).join('\n')}
|
|
159
|
-
|
|
160
|
-
${agent.content}
|
|
161
|
-
|
|
162
|
-
Provide findings in this format:
|
|
163
|
-
- Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
|
|
164
|
-
- Category: Your specialty area
|
|
165
|
-
- Location: file:line
|
|
166
|
-
- Issue: Description
|
|
155
|
+
return `You are a ${agent.name}. Review the following files for issues in your domain:
|
|
156
|
+
|
|
157
|
+
Files to review:
|
|
158
|
+
${filePaths.map(f => `- ${f}`).join('\n')}
|
|
159
|
+
|
|
160
|
+
${agent.content}
|
|
161
|
+
|
|
162
|
+
Provide findings in this format:
|
|
163
|
+
- Priority: P1 (Critical), P2 (Important), P3 (Nice-to-have)
|
|
164
|
+
- Category: Your specialty area
|
|
165
|
+
- Location: file:line
|
|
166
|
+
- Issue: Description
|
|
167
167
|
- Fix: Recommendation`;
|
|
168
168
|
}
|
|
169
169
|
/**
|
|
@@ -12,19 +12,19 @@ export function createMultiLlmPrompts(feature, techStack) {
|
|
|
12
12
|
const stackStr = techStack.length > 0 ? techStack.join(', ') : 'the project';
|
|
13
13
|
return {
|
|
14
14
|
bestPractices: {
|
|
15
|
-
gpt: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
16
|
-
Focus on: architecture patterns, code conventions, design patterns.
|
|
15
|
+
gpt: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
16
|
+
Focus on: architecture patterns, code conventions, design patterns.
|
|
17
17
|
Return JSON: { patterns: string[], antiPatterns: string[], libraries: string[] }`,
|
|
18
|
-
gemini: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
19
|
-
Focus on: latest trends, framework updates, modern approaches.
|
|
18
|
+
gemini: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
19
|
+
Focus on: latest trends, framework updates, modern approaches.
|
|
20
20
|
Return JSON: { patterns: string[], antiPatterns: string[], libraries: string[] }`
|
|
21
21
|
},
|
|
22
22
|
security: {
|
|
23
|
-
gpt: `Security considerations for "${feature}" with ${stackStr}.
|
|
24
|
-
Focus on: CVE database, known vulnerabilities, exploit patterns.
|
|
23
|
+
gpt: `Security considerations for "${feature}" with ${stackStr}.
|
|
24
|
+
Focus on: CVE database, known vulnerabilities, exploit patterns.
|
|
25
25
|
Return JSON: { vulnerabilities: string[], mitigations: string[], checklist: string[] }`,
|
|
26
|
-
gemini: `Security advisories for "${feature}" with ${stackStr}.
|
|
27
|
-
Focus on: latest patches, recent incidents, security best practices.
|
|
26
|
+
gemini: `Security advisories for "${feature}" with ${stackStr}.
|
|
27
|
+
Focus on: latest patches, recent incidents, security best practices.
|
|
28
28
|
Return JSON: { advisories: string[], patches: string[], incidents: string[] }`
|
|
29
29
|
}
|
|
30
30
|
};
|
|
@@ -167,17 +167,17 @@ export class SmartRouter {
|
|
|
167
167
|
const errorSummary = Object.entries(errors)
|
|
168
168
|
.map(([provider, msg]) => `- ${provider}: ${msg}`)
|
|
169
169
|
.join('\n');
|
|
170
|
-
return `[External LLM Unavailable - Claude Direct Handling]
|
|
171
|
-
|
|
172
|
-
All external LLMs failed. Claude should handle this ${type} task directly.
|
|
173
|
-
|
|
174
|
-
**Original Request:**
|
|
175
|
-
${prompt}
|
|
176
|
-
|
|
177
|
-
**Failed Providers:**
|
|
178
|
-
${errorSummary}
|
|
179
|
-
|
|
180
|
-
**Action Required:**
|
|
170
|
+
return `[External LLM Unavailable - Claude Direct Handling]
|
|
171
|
+
|
|
172
|
+
All external LLMs failed. Claude should handle this ${type} task directly.
|
|
173
|
+
|
|
174
|
+
**Original Request:**
|
|
175
|
+
${prompt}
|
|
176
|
+
|
|
177
|
+
**Failed Providers:**
|
|
178
|
+
${errorSummary}
|
|
179
|
+
|
|
180
|
+
**Action Required:**
|
|
181
181
|
Claude, please handle this task using your own capabilities. Do NOT retry external LLMs.`;
|
|
182
182
|
}
|
|
183
183
|
delay(ms) {
|
|
@@ -19,45 +19,45 @@ export function createResearchTasks(feature, techStack = []) {
|
|
|
19
19
|
{
|
|
20
20
|
name: 'best-practices-agent',
|
|
21
21
|
category: 'best-practices',
|
|
22
|
-
prompt: `Research best practices for implementing "${feature}" with ${stackStr}. Focus on:
|
|
23
|
-
1. Industry-standard patterns
|
|
24
|
-
2. Common pitfalls to avoid
|
|
25
|
-
3. Recommended libraries/tools
|
|
26
|
-
4. Testing strategies
|
|
27
|
-
|
|
22
|
+
prompt: `Research best practices for implementing "${feature}" with ${stackStr}. Focus on:
|
|
23
|
+
1. Industry-standard patterns
|
|
24
|
+
2. Common pitfalls to avoid
|
|
25
|
+
3. Recommended libraries/tools
|
|
26
|
+
4. Testing strategies
|
|
27
|
+
|
|
28
28
|
Provide actionable recommendations.`
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
name: 'framework-docs-agent',
|
|
32
32
|
category: 'framework-docs',
|
|
33
|
-
prompt: `Find the latest documentation for ${stackStr} related to "${feature}". Include:
|
|
34
|
-
1. Official API references
|
|
35
|
-
2. Configuration options
|
|
36
|
-
3. Migration guides if applicable
|
|
37
|
-
4. Code examples from official docs
|
|
38
|
-
|
|
33
|
+
prompt: `Find the latest documentation for ${stackStr} related to "${feature}". Include:
|
|
34
|
+
1. Official API references
|
|
35
|
+
2. Configuration options
|
|
36
|
+
3. Migration guides if applicable
|
|
37
|
+
4. Code examples from official docs
|
|
38
|
+
|
|
39
39
|
Use context7 MCP if available for up-to-date documentation.`
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
name: 'codebase-patterns-agent',
|
|
43
43
|
category: 'codebase-patterns',
|
|
44
|
-
prompt: `Analyze the current codebase for patterns related to "${feature}". Look for:
|
|
45
|
-
1. Similar existing implementations
|
|
46
|
-
2. Established conventions
|
|
47
|
-
3. Reusable utilities
|
|
48
|
-
4. Potential conflicts or dependencies
|
|
49
|
-
|
|
44
|
+
prompt: `Analyze the current codebase for patterns related to "${feature}". Look for:
|
|
45
|
+
1. Similar existing implementations
|
|
46
|
+
2. Established conventions
|
|
47
|
+
3. Reusable utilities
|
|
48
|
+
4. Potential conflicts or dependencies
|
|
49
|
+
|
|
50
50
|
Use Glob and Grep to search the codebase.`
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
53
|
name: 'security-advisory-agent',
|
|
54
54
|
category: 'security-advisory',
|
|
55
|
-
prompt: `Review security considerations for "${feature}" with ${stackStr}. Check:
|
|
56
|
-
1. OWASP Top 10 relevance
|
|
57
|
-
2. Authentication/authorization requirements
|
|
58
|
-
3. Data validation needs
|
|
59
|
-
4. Known vulnerabilities in dependencies
|
|
60
|
-
|
|
55
|
+
prompt: `Review security considerations for "${feature}" with ${stackStr}. Check:
|
|
56
|
+
1. OWASP Top 10 relevance
|
|
57
|
+
2. Authentication/authorization requirements
|
|
58
|
+
3. Data validation needs
|
|
59
|
+
4. Known vulnerabilities in dependencies
|
|
60
|
+
|
|
61
61
|
Provide security recommendations.`
|
|
62
62
|
}
|
|
63
63
|
];
|
|
@@ -4,10 +4,10 @@ import { analyzeComplexity } from './analyzeComplexity.js';
|
|
|
4
4
|
describe('analyzeComplexity', () => {
|
|
5
5
|
describe('code analysis', () => {
|
|
6
6
|
it('should analyze simple code', async () => {
|
|
7
|
-
const code = `
|
|
8
|
-
function add(a, b) {
|
|
9
|
-
return a + b;
|
|
10
|
-
}
|
|
7
|
+
const code = `
|
|
8
|
+
function add(a, b) {
|
|
9
|
+
return a + b;
|
|
10
|
+
}
|
|
11
11
|
`;
|
|
12
12
|
const result = await analyzeComplexity({ code });
|
|
13
13
|
expect(result.content).toBeDefined();
|
|
@@ -15,70 +15,70 @@ function add(a, b) {
|
|
|
15
15
|
expect(result.content[0].text).toContain('Complexity');
|
|
16
16
|
});
|
|
17
17
|
it('should detect high cyclomatic complexity', async () => {
|
|
18
|
-
const code = `
|
|
19
|
-
function complex(a, b, c, d) {
|
|
20
|
-
if (a > 0) {
|
|
21
|
-
if (b > 0) {
|
|
22
|
-
if (c > 0) {
|
|
23
|
-
if (d > 0) {
|
|
24
|
-
for (let i = 0; i < 10; i++) {
|
|
25
|
-
while (true) {
|
|
26
|
-
switch (i) {
|
|
27
|
-
case 1: break;
|
|
28
|
-
case 2: break;
|
|
29
|
-
case 3: break;
|
|
30
|
-
}
|
|
31
|
-
break;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
18
|
+
const code = `
|
|
19
|
+
function complex(a, b, c, d) {
|
|
20
|
+
if (a > 0) {
|
|
21
|
+
if (b > 0) {
|
|
22
|
+
if (c > 0) {
|
|
23
|
+
if (d > 0) {
|
|
24
|
+
for (let i = 0; i < 10; i++) {
|
|
25
|
+
while (true) {
|
|
26
|
+
switch (i) {
|
|
27
|
+
case 1: break;
|
|
28
|
+
case 2: break;
|
|
29
|
+
case 3: break;
|
|
30
|
+
}
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
39
|
`;
|
|
40
40
|
const result = await analyzeComplexity({ code });
|
|
41
41
|
expect(result.content[0].text).toContain('Complexity');
|
|
42
42
|
// High complexity code should have lower score or issues
|
|
43
43
|
});
|
|
44
44
|
it('should calculate cyclomatic metrics only', async () => {
|
|
45
|
-
const code = `
|
|
46
|
-
function test() {
|
|
47
|
-
if (true) return 1;
|
|
48
|
-
return 0;
|
|
49
|
-
}
|
|
45
|
+
const code = `
|
|
46
|
+
function test() {
|
|
47
|
+
if (true) return 1;
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
50
|
`;
|
|
51
51
|
const result = await analyzeComplexity({ code, metrics: 'cyclomatic' });
|
|
52
52
|
expect(result.content[0].text).toContain('Complexity');
|
|
53
53
|
});
|
|
54
54
|
it('should calculate cognitive metrics only', async () => {
|
|
55
|
-
const code = `
|
|
56
|
-
function test() {
|
|
57
|
-
if (true) {
|
|
58
|
-
for (let i = 0; i < 10; i++) {
|
|
59
|
-
console.log(i);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
55
|
+
const code = `
|
|
56
|
+
function test() {
|
|
57
|
+
if (true) {
|
|
58
|
+
for (let i = 0; i < 10; i++) {
|
|
59
|
+
console.log(i);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
63
|
`;
|
|
64
64
|
const result = await analyzeComplexity({ code, metrics: 'cognitive' });
|
|
65
65
|
expect(result.content[0].text).toContain('Complexity');
|
|
66
66
|
});
|
|
67
67
|
it('should calculate halstead metrics only', async () => {
|
|
68
|
-
const code = `
|
|
69
|
-
const x = 1 + 2 * 3 - 4 / 5;
|
|
68
|
+
const code = `
|
|
69
|
+
const x = 1 + 2 * 3 - 4 / 5;
|
|
70
70
|
`;
|
|
71
71
|
const result = await analyzeComplexity({ code, metrics: 'halstead' });
|
|
72
72
|
expect(result.content[0].text).toContain('Complexity');
|
|
73
73
|
});
|
|
74
74
|
it('should calculate all metrics', async () => {
|
|
75
|
-
const code = `
|
|
76
|
-
function calculate(a, b) {
|
|
77
|
-
if (a > b) {
|
|
78
|
-
return a - b;
|
|
79
|
-
}
|
|
80
|
-
return b - a;
|
|
81
|
-
}
|
|
75
|
+
const code = `
|
|
76
|
+
function calculate(a, b) {
|
|
77
|
+
if (a > b) {
|
|
78
|
+
return a - b;
|
|
79
|
+
}
|
|
80
|
+
return b - a;
|
|
81
|
+
}
|
|
82
82
|
`;
|
|
83
83
|
const result = await analyzeComplexity({ code, metrics: 'all' });
|
|
84
84
|
expect(result.content[0].text).toContain('Complexity');
|
|
@@ -102,18 +102,18 @@ function calculate(a, b) {
|
|
|
102
102
|
});
|
|
103
103
|
describe('Python code detection', () => {
|
|
104
104
|
it('should detect and analyze Python code', async () => {
|
|
105
|
-
const pythonCode = `
|
|
106
|
-
def calculate(a, b):
|
|
107
|
-
if a > b:
|
|
108
|
-
return a - b
|
|
109
|
-
return b - a
|
|
110
|
-
|
|
111
|
-
class Calculator:
|
|
112
|
-
def __init__(self):
|
|
113
|
-
self.value = 0
|
|
114
|
-
|
|
115
|
-
def add(self, x):
|
|
116
|
-
self.value += x
|
|
105
|
+
const pythonCode = `
|
|
106
|
+
def calculate(a, b):
|
|
107
|
+
if a > b:
|
|
108
|
+
return a - b
|
|
109
|
+
return b - a
|
|
110
|
+
|
|
111
|
+
class Calculator:
|
|
112
|
+
def __init__(self):
|
|
113
|
+
self.value = 0
|
|
114
|
+
|
|
115
|
+
def add(self, x):
|
|
116
|
+
self.value += x
|
|
117
117
|
`;
|
|
118
118
|
const result = await analyzeComplexity({ code: pythonCode });
|
|
119
119
|
expect(result.content[0].text).toContain('Python');
|
|
@@ -121,34 +121,34 @@ class Calculator:
|
|
|
121
121
|
});
|
|
122
122
|
describe('score calculation', () => {
|
|
123
123
|
it('should give high score for simple code', async () => {
|
|
124
|
-
const simpleCode = `
|
|
125
|
-
function simple() {
|
|
126
|
-
return 42;
|
|
127
|
-
}
|
|
124
|
+
const simpleCode = `
|
|
125
|
+
function simple() {
|
|
126
|
+
return 42;
|
|
127
|
+
}
|
|
128
128
|
`;
|
|
129
129
|
const result = await analyzeComplexity({ code: simpleCode });
|
|
130
130
|
// Simple code should have good score
|
|
131
131
|
expect(result.content[0].text).toContain('Score');
|
|
132
132
|
});
|
|
133
133
|
it('should give lower score for complex code', async () => {
|
|
134
|
-
const complexCode = `
|
|
135
|
-
function veryComplex(a, b, c, d, e, f, g, h) {
|
|
136
|
-
if (a && b || c && d || e && f || g && h) {
|
|
137
|
-
for (let i = 0; i < 10; i++) {
|
|
138
|
-
for (let j = 0; j < 10; j++) {
|
|
139
|
-
if (i > j) {
|
|
140
|
-
switch (i) {
|
|
141
|
-
case 1: break;
|
|
142
|
-
case 2: break;
|
|
143
|
-
case 3: break;
|
|
144
|
-
case 4: break;
|
|
145
|
-
case 5: break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
134
|
+
const complexCode = `
|
|
135
|
+
function veryComplex(a, b, c, d, e, f, g, h) {
|
|
136
|
+
if (a && b || c && d || e && f || g && h) {
|
|
137
|
+
for (let i = 0; i < 10; i++) {
|
|
138
|
+
for (let j = 0; j < 10; j++) {
|
|
139
|
+
if (i > j) {
|
|
140
|
+
switch (i) {
|
|
141
|
+
case 1: break;
|
|
142
|
+
case 2: break;
|
|
143
|
+
case 3: break;
|
|
144
|
+
case 4: break;
|
|
145
|
+
case 5: break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
152
|
`;
|
|
153
153
|
const result = await analyzeComplexity({ code: complexCode });
|
|
154
154
|
expect(result.content[0].text).toContain('Score');
|
|
@@ -157,46 +157,46 @@ function veryComplex(a, b, c, d, e, f, g, h) {
|
|
|
157
157
|
});
|
|
158
158
|
describe('TypeScript code analysis', () => {
|
|
159
159
|
it('should analyze TypeScript code', async () => {
|
|
160
|
-
const tsCode = `
|
|
161
|
-
interface User {
|
|
162
|
-
name: string;
|
|
163
|
-
age: number;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function greet(user: User): string {
|
|
167
|
-
if (user.age > 18) {
|
|
168
|
-
return \`Hello, \${user.name}!\`;
|
|
169
|
-
}
|
|
170
|
-
return 'Hello!';
|
|
171
|
-
}
|
|
160
|
+
const tsCode = `
|
|
161
|
+
interface User {
|
|
162
|
+
name: string;
|
|
163
|
+
age: number;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function greet(user: User): string {
|
|
167
|
+
if (user.age > 18) {
|
|
168
|
+
return \`Hello, \${user.name}!\`;
|
|
169
|
+
}
|
|
170
|
+
return 'Hello!';
|
|
171
|
+
}
|
|
172
172
|
`;
|
|
173
173
|
const result = await analyzeComplexity({ code: tsCode });
|
|
174
174
|
expect(result.content[0].text).toContain('Complexity');
|
|
175
175
|
});
|
|
176
176
|
it('should handle class definitions', async () => {
|
|
177
177
|
// Use explicit TypeScript syntax that won't be mistaken for Python
|
|
178
|
-
const tsCode = `
|
|
179
|
-
// TypeScript class
|
|
180
|
-
export class Calculator {
|
|
181
|
-
private value: number = 0;
|
|
182
|
-
|
|
183
|
-
public add(x: number): this {
|
|
184
|
-
this.value += x;
|
|
185
|
-
return this;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
public subtract(x: number): this {
|
|
189
|
-
if (x > this.value) {
|
|
190
|
-
throw new Error('Cannot be negative');
|
|
191
|
-
}
|
|
192
|
-
this.value -= x;
|
|
193
|
-
return this;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
public getValue(): number {
|
|
197
|
-
return this.value;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
178
|
+
const tsCode = `
|
|
179
|
+
// TypeScript class
|
|
180
|
+
export class Calculator {
|
|
181
|
+
private value: number = 0;
|
|
182
|
+
|
|
183
|
+
public add(x: number): this {
|
|
184
|
+
this.value += x;
|
|
185
|
+
return this;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public subtract(x: number): this {
|
|
189
|
+
if (x > this.value) {
|
|
190
|
+
throw new Error('Cannot be negative');
|
|
191
|
+
}
|
|
192
|
+
this.value -= x;
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public getValue(): number {
|
|
197
|
+
return this.value;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
200
|
`;
|
|
201
201
|
const result = await analyzeComplexity({ code: tsCode });
|
|
202
202
|
// Should analyze as TypeScript, not Python
|