@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.
Files changed (231) hide show
  1. package/CLAUDE.md +96 -267
  2. package/LICENSE +21 -21
  3. package/README.md +262 -262
  4. package/agents/architect-low.md +41 -41
  5. package/agents/architect-medium.md +59 -59
  6. package/agents/architect.md +80 -80
  7. package/agents/build-error-resolver.md +115 -115
  8. package/agents/compounder.md +261 -261
  9. package/agents/diagrammer.md +178 -178
  10. package/agents/e2e-tester.md +266 -266
  11. package/agents/explorer-low.md +42 -42
  12. package/agents/explorer-medium.md +59 -59
  13. package/agents/explorer.md +48 -48
  14. package/agents/implementer-low.md +43 -43
  15. package/agents/implementer-medium.md +52 -52
  16. package/agents/implementer.md +54 -54
  17. package/agents/refactor-cleaner.md +143 -143
  18. package/agents/research/best-practices-agent.md +199 -189
  19. package/agents/research/codebase-patterns-agent.md +157 -147
  20. package/agents/research/framework-docs-agent.md +188 -178
  21. package/agents/research/security-advisory-agent.md +213 -203
  22. package/agents/review/architecture-reviewer.md +107 -107
  23. package/agents/review/complexity-reviewer.md +116 -116
  24. package/agents/review/data-integrity-reviewer.md +88 -88
  25. package/agents/review/git-history-reviewer.md +103 -103
  26. package/agents/review/performance-reviewer.md +86 -86
  27. package/agents/review/python-reviewer.md +150 -150
  28. package/agents/review/rails-reviewer.md +139 -139
  29. package/agents/review/react-reviewer.md +144 -144
  30. package/agents/review/security-reviewer.md +80 -80
  31. package/agents/review/simplicity-reviewer.md +140 -140
  32. package/agents/review/test-coverage-reviewer.md +116 -116
  33. package/agents/review/typescript-reviewer.md +127 -127
  34. package/agents/searcher.md +54 -54
  35. package/agents/simplifier.md +120 -120
  36. package/agents/tester.md +49 -49
  37. package/agents/ui-previewer.md +129 -129
  38. package/commands/vibe.analyze.md +356 -356
  39. package/commands/vibe.reason.md +329 -329
  40. package/commands/vibe.review.md +326 -326
  41. package/commands/vibe.run.md +1117 -1117
  42. package/commands/vibe.spec.md +1066 -1058
  43. package/commands/vibe.utils.md +353 -353
  44. package/commands/vibe.verify.md +375 -375
  45. package/dist/cli/collaborator.js +52 -52
  46. package/dist/cli/detect.js +32 -32
  47. package/dist/cli/index.d.ts.map +1 -1
  48. package/dist/cli/index.js +109 -108
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/llm.js +144 -144
  51. package/dist/lib/DeepInit.js +24 -24
  52. package/dist/lib/FrameworkDetector.d.ts +56 -0
  53. package/dist/lib/FrameworkDetector.d.ts.map +1 -0
  54. package/dist/lib/FrameworkDetector.js +287 -0
  55. package/dist/lib/FrameworkDetector.js.map +1 -0
  56. package/dist/lib/IterationTracker.js +11 -11
  57. package/dist/lib/PythonParser.js +108 -108
  58. package/dist/lib/RuleBuildSystem.d.ts +117 -0
  59. package/dist/lib/RuleBuildSystem.d.ts.map +1 -0
  60. package/dist/lib/RuleBuildSystem.js +402 -0
  61. package/dist/lib/RuleBuildSystem.js.map +1 -0
  62. package/dist/lib/SkillFrontmatter.js +28 -28
  63. package/dist/lib/SkillQualityGate.js +9 -9
  64. package/dist/lib/SkillRepository.js +159 -159
  65. package/dist/lib/UltraQA.js +77 -77
  66. package/dist/lib/gpt-api.js +4 -4
  67. package/dist/lib/memory/KnowledgeGraph.js +4 -4
  68. package/dist/lib/memory/MemorySearch.js +20 -20
  69. package/dist/lib/memory/MemoryStorage.js +64 -64
  70. package/dist/orchestrator/AgentManager.js +12 -12
  71. package/dist/orchestrator/MultiLlmResearch.js +8 -8
  72. package/dist/orchestrator/SmartRouter.js +11 -11
  73. package/dist/orchestrator/parallelResearch.js +24 -24
  74. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  75. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  76. package/dist/tools/index.d.ts +4 -0
  77. package/dist/tools/index.d.ts.map +1 -1
  78. package/dist/tools/index.js +4 -0
  79. package/dist/tools/index.js.map +1 -1
  80. package/hooks/hooks.json +222 -222
  81. package/hooks/scripts/code-check.js +22 -22
  82. package/hooks/scripts/code-review.js +22 -22
  83. package/hooks/scripts/complexity.js +22 -22
  84. package/hooks/scripts/compound.js +23 -23
  85. package/hooks/scripts/context-save.js +33 -33
  86. package/hooks/scripts/generate-brand-assets.js +472 -472
  87. package/hooks/scripts/hud-multiline.js +262 -262
  88. package/hooks/scripts/hud-status.js +291 -291
  89. package/hooks/scripts/keyword-detector.js +214 -214
  90. package/hooks/scripts/llm-orchestrate.js +171 -171
  91. package/hooks/scripts/post-edit.js +97 -97
  92. package/hooks/scripts/post-tool-verify.js +210 -210
  93. package/hooks/scripts/pre-tool-guard.js +125 -125
  94. package/hooks/scripts/recall.js +22 -22
  95. package/hooks/scripts/session-start.js +30 -30
  96. package/hooks/scripts/skill-injector.js +191 -191
  97. package/hooks/scripts/utils.js +97 -97
  98. package/languages/csharp-unity.md +515 -515
  99. package/languages/gdscript-godot.md +470 -470
  100. package/languages/ruby-rails.md +489 -489
  101. package/languages/typescript-angular.md +433 -433
  102. package/languages/typescript-astro.md +416 -416
  103. package/languages/typescript-electron.md +406 -406
  104. package/languages/typescript-nestjs.md +524 -524
  105. package/languages/typescript-svelte.md +407 -407
  106. package/languages/typescript-tauri.md +365 -365
  107. package/package.json +83 -83
  108. package/skills/brand-assets.md +141 -141
  109. package/skills/commerce-patterns.md +361 -361
  110. package/skills/context7-usage.md +102 -102
  111. package/skills/e2e-commerce.md +304 -304
  112. package/skills/frontend-design.md +92 -92
  113. package/skills/git-worktree.md +181 -181
  114. package/skills/parallel-research.md +77 -77
  115. package/skills/priority-todos.md +239 -239
  116. package/skills/seo-checklist.md +244 -244
  117. package/skills/tool-fallback.md +190 -190
  118. package/skills/vibe-capabilities.md +161 -161
  119. package/vibe/constitution.md +227 -227
  120. package/vibe/rules/core/communication-guide.md +98 -98
  121. package/vibe/rules/core/development-philosophy.md +52 -52
  122. package/vibe/rules/core/quick-start.md +102 -102
  123. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  124. package/vibe/rules/quality/checklist.md +276 -276
  125. package/vibe/rules/quality/testing-strategy.md +440 -440
  126. package/vibe/rules/standards/anti-patterns.md +541 -541
  127. package/vibe/rules/standards/code-structure.md +291 -291
  128. package/vibe/rules/standards/complexity-metrics.md +313 -313
  129. package/vibe/rules/standards/naming-conventions.md +198 -198
  130. package/vibe/setup.sh +31 -31
  131. package/vibe/templates/constitution-template.md +252 -252
  132. package/vibe/templates/contract-backend-template.md +526 -526
  133. package/vibe/templates/contract-frontend-template.md +599 -599
  134. package/vibe/templates/feature-template.md +96 -96
  135. package/vibe/templates/spec-template.md +221 -221
  136. package/dist/cli/mcp.d.ts +0 -49
  137. package/dist/cli/mcp.d.ts.map +0 -1
  138. package/dist/cli/mcp.js +0 -169
  139. package/dist/cli/mcp.js.map +0 -1
  140. package/dist/lib/gemini-mcp.d.ts +0 -10
  141. package/dist/lib/gemini-mcp.d.ts.map +0 -1
  142. package/dist/lib/gemini-mcp.js +0 -353
  143. package/dist/lib/gemini-mcp.js.map +0 -1
  144. package/dist/lib/gpt-mcp.d.ts +0 -10
  145. package/dist/lib/gpt-mcp.d.ts.map +0 -1
  146. package/dist/lib/gpt-mcp.js +0 -352
  147. package/dist/lib/gpt-mcp.js.map +0 -1
  148. package/dist/tools/analytics/getUsageAnalytics.d.ts +0 -10
  149. package/dist/tools/analytics/getUsageAnalytics.d.ts.map +0 -1
  150. package/dist/tools/analytics/getUsageAnalytics.js +0 -246
  151. package/dist/tools/analytics/getUsageAnalytics.js.map +0 -1
  152. package/dist/tools/analytics/index.d.ts +0 -5
  153. package/dist/tools/analytics/index.d.ts.map +0 -1
  154. package/dist/tools/analytics/index.js +0 -5
  155. package/dist/tools/analytics/index.js.map +0 -1
  156. package/dist/tools/convention/getCodingGuide.d.ts +0 -7
  157. package/dist/tools/convention/getCodingGuide.d.ts.map +0 -1
  158. package/dist/tools/convention/getCodingGuide.js +0 -69
  159. package/dist/tools/convention/getCodingGuide.js.map +0 -1
  160. package/dist/tools/planning/analyzeRequirements.d.ts +0 -9
  161. package/dist/tools/planning/analyzeRequirements.d.ts.map +0 -1
  162. package/dist/tools/planning/analyzeRequirements.js +0 -171
  163. package/dist/tools/planning/analyzeRequirements.js.map +0 -1
  164. package/dist/tools/planning/createUserStories.d.ts +0 -9
  165. package/dist/tools/planning/createUserStories.d.ts.map +0 -1
  166. package/dist/tools/planning/createUserStories.js +0 -124
  167. package/dist/tools/planning/createUserStories.js.map +0 -1
  168. package/dist/tools/planning/featureRoadmap.d.ts +0 -10
  169. package/dist/tools/planning/featureRoadmap.d.ts.map +0 -1
  170. package/dist/tools/planning/featureRoadmap.js +0 -207
  171. package/dist/tools/planning/featureRoadmap.js.map +0 -1
  172. package/dist/tools/planning/generatePrd.d.ts +0 -11
  173. package/dist/tools/planning/generatePrd.d.ts.map +0 -1
  174. package/dist/tools/planning/generatePrd.js +0 -161
  175. package/dist/tools/planning/generatePrd.js.map +0 -1
  176. package/dist/tools/planning/index.d.ts +0 -8
  177. package/dist/tools/planning/index.d.ts.map +0 -1
  178. package/dist/tools/planning/index.js +0 -8
  179. package/dist/tools/planning/index.js.map +0 -1
  180. package/dist/tools/prompt/analyzePrompt.d.ts +0 -7
  181. package/dist/tools/prompt/analyzePrompt.d.ts.map +0 -1
  182. package/dist/tools/prompt/analyzePrompt.js +0 -150
  183. package/dist/tools/prompt/analyzePrompt.js.map +0 -1
  184. package/dist/tools/prompt/enhancePrompt.d.ts +0 -8
  185. package/dist/tools/prompt/enhancePrompt.d.ts.map +0 -1
  186. package/dist/tools/prompt/enhancePrompt.js +0 -110
  187. package/dist/tools/prompt/enhancePrompt.js.map +0 -1
  188. package/dist/tools/prompt/enhancePromptGemini.d.ts +0 -8
  189. package/dist/tools/prompt/enhancePromptGemini.d.ts.map +0 -1
  190. package/dist/tools/prompt/enhancePromptGemini.js +0 -332
  191. package/dist/tools/prompt/enhancePromptGemini.js.map +0 -1
  192. package/dist/tools/prompt/index.d.ts +0 -7
  193. package/dist/tools/prompt/index.d.ts.map +0 -1
  194. package/dist/tools/prompt/index.js +0 -7
  195. package/dist/tools/prompt/index.js.map +0 -1
  196. package/dist/tools/reasoning/applyReasoningFramework.d.ts +0 -8
  197. package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +0 -1
  198. package/dist/tools/reasoning/applyReasoningFramework.js +0 -266
  199. package/dist/tools/reasoning/applyReasoningFramework.js.map +0 -1
  200. package/dist/tools/reasoning/index.d.ts +0 -5
  201. package/dist/tools/reasoning/index.d.ts.map +0 -1
  202. package/dist/tools/reasoning/index.js +0 -5
  203. package/dist/tools/reasoning/index.js.map +0 -1
  204. package/dist/tools/thinking/analyzeProblem.d.ts +0 -7
  205. package/dist/tools/thinking/analyzeProblem.d.ts.map +0 -1
  206. package/dist/tools/thinking/analyzeProblem.js +0 -55
  207. package/dist/tools/thinking/analyzeProblem.js.map +0 -1
  208. package/dist/tools/thinking/breakDownProblem.d.ts +0 -8
  209. package/dist/tools/thinking/breakDownProblem.d.ts.map +0 -1
  210. package/dist/tools/thinking/breakDownProblem.js +0 -145
  211. package/dist/tools/thinking/breakDownProblem.js.map +0 -1
  212. package/dist/tools/thinking/createThinkingChain.d.ts +0 -7
  213. package/dist/tools/thinking/createThinkingChain.d.ts.map +0 -1
  214. package/dist/tools/thinking/createThinkingChain.js +0 -44
  215. package/dist/tools/thinking/createThinkingChain.js.map +0 -1
  216. package/dist/tools/thinking/formatAsPlan.d.ts +0 -9
  217. package/dist/tools/thinking/formatAsPlan.d.ts.map +0 -1
  218. package/dist/tools/thinking/formatAsPlan.js +0 -78
  219. package/dist/tools/thinking/formatAsPlan.js.map +0 -1
  220. package/dist/tools/thinking/index.d.ts +0 -10
  221. package/dist/tools/thinking/index.d.ts.map +0 -1
  222. package/dist/tools/thinking/index.js +0 -10
  223. package/dist/tools/thinking/index.js.map +0 -1
  224. package/dist/tools/thinking/stepByStepAnalysis.d.ts +0 -8
  225. package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +0 -1
  226. package/dist/tools/thinking/stepByStepAnalysis.js +0 -63
  227. package/dist/tools/thinking/stepByStepAnalysis.js.map +0 -1
  228. package/dist/tools/thinking/thinkAloudProcess.d.ts +0 -8
  229. package/dist/tools/thinking/thinkAloudProcess.d.ts.map +0 -1
  230. package/dist/tools/thinking/thinkAloudProcess.js +0 -80
  231. 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