@su-record/vibe 2.7.12 → 2.7.14
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 +126 -126
- package/LICENSE +21 -21
- package/README.md +449 -580
- 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 -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/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 -260
- package/commands/vibe.analyze.md +8 -0
- package/commands/vibe.review.md +10 -3
- package/commands/vibe.run.md +2078 -2022
- package/commands/vibe.spec.md +10 -10
- package/commands/vibe.spec.review.md +565 -558
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +45 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +1 -7
- package/dist/cli/auth.js.map +1 -1
- 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 +55 -70
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +6 -7
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/setup.js +1 -1
- package/dist/cli/commands/setup.js.map +1 -1
- 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/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +3 -4
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -55
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +20 -20
- package/dist/cli/llm/config.js.map +1 -1
- package/dist/cli/llm/gemini-commands.d.ts +4 -6
- package/dist/cli/llm/gemini-commands.d.ts.map +1 -1
- package/dist/cli/llm/gemini-commands.js +52 -322
- package/dist/cli/llm/gemini-commands.js.map +1 -1
- package/dist/cli/llm/gpt-commands.js +21 -21
- package/dist/cli/llm/gpt-commands.js.map +1 -1
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/constants.js +1 -1
- 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/postinstall/inline-skills.js +1 -1
- package/dist/cli/postinstall/inline-skills.js.map +1 -1
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/cli/types.d.ts +2 -18
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/utils.d.ts +0 -9
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +0 -28
- package/dist/cli/utils.js.map +1 -1
- 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/config/GlobalConfigManager.d.ts +0 -2
- package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
- package/dist/infra/lib/config/GlobalConfigManager.js +0 -27
- package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
- 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/auth.d.ts +4 -16
- package/dist/infra/lib/gemini/auth.d.ts.map +1 -1
- package/dist/infra/lib/gemini/auth.js +10 -405
- package/dist/infra/lib/gemini/auth.js.map +1 -1
- package/dist/infra/lib/gemini/capabilities.d.ts +4 -8
- package/dist/infra/lib/gemini/capabilities.d.ts.map +1 -1
- package/dist/infra/lib/gemini/capabilities.js +8 -166
- package/dist/infra/lib/gemini/capabilities.js.map +1 -1
- package/dist/infra/lib/gemini/chat.d.ts +4 -13
- package/dist/infra/lib/gemini/chat.d.ts.map +1 -1
- package/dist/infra/lib/gemini/chat.js +10 -323
- package/dist/infra/lib/gemini/chat.js.map +1 -1
- package/dist/infra/lib/gemini/completion.d.ts +5 -15
- package/dist/infra/lib/gemini/completion.d.ts.map +1 -1
- package/dist/infra/lib/gemini/completion.js +6 -97
- package/dist/infra/lib/gemini/completion.js.map +1 -1
- package/dist/infra/lib/gemini/constants.d.ts +2 -31
- package/dist/infra/lib/gemini/constants.d.ts.map +1 -1
- package/dist/infra/lib/gemini/constants.js +2 -77
- package/dist/infra/lib/gemini/constants.js.map +1 -1
- package/dist/infra/lib/gemini/index.d.ts +5 -8
- package/dist/infra/lib/gemini/index.d.ts.map +1 -1
- package/dist/infra/lib/gemini/index.js +4 -7
- package/dist/infra/lib/gemini/index.js.map +1 -1
- package/dist/infra/lib/gemini/models.d.ts +3 -4
- package/dist/infra/lib/gemini/models.d.ts.map +1 -1
- package/dist/infra/lib/gemini/models.js +8 -84
- package/dist/infra/lib/gemini/models.js.map +1 -1
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gemini/types.d.ts +16 -44
- package/dist/infra/lib/gemini/types.d.ts.map +1 -1
- package/dist/infra/lib/gemini/types.js +1 -1
- package/dist/infra/lib/gpt/auth.d.ts +2 -5
- package/dist/infra/lib/gpt/auth.d.ts.map +1 -1
- package/dist/infra/lib/gpt/auth.js +8 -38
- package/dist/infra/lib/gpt/auth.js.map +1 -1
- package/dist/infra/lib/gpt/chat.d.ts +3 -3
- package/dist/infra/lib/gpt/chat.d.ts.map +1 -1
- package/dist/infra/lib/gpt/chat.js +37 -53
- package/dist/infra/lib/gpt/chat.js.map +1 -1
- package/dist/infra/lib/gpt/constants.d.ts +2 -5
- package/dist/infra/lib/gpt/constants.d.ts.map +1 -1
- package/dist/infra/lib/gpt/constants.js +4 -9
- package/dist/infra/lib/gpt/constants.js.map +1 -1
- package/dist/infra/lib/gpt/embedding.d.ts +1 -1
- package/dist/infra/lib/gpt/embedding.js +3 -3
- package/dist/infra/lib/gpt/embedding.js.map +1 -1
- package/dist/infra/lib/gpt/oauth.d.ts +6 -39
- package/dist/infra/lib/gpt/oauth.d.ts.map +1 -1
- package/dist/infra/lib/gpt/oauth.js +8 -340
- package/dist/infra/lib/gpt/oauth.js.map +1 -1
- package/dist/infra/lib/gpt/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js.map +1 -1
- package/dist/infra/lib/gpt/specializations.d.ts +2 -2
- package/dist/infra/lib/gpt/specializations.js +3 -3
- package/dist/infra/lib/gpt/specializations.js.map +1 -1
- package/dist/infra/lib/gpt/types.d.ts +1 -1
- package/dist/infra/lib/gpt/types.d.ts.map +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.d.ts +2 -2
- package/dist/infra/lib/llm/auth/AuthProfileManager.d.ts.map +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.js.map +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +1 -1
- package/dist/infra/lib/llm/auth/TokenRefresher.d.ts +1 -1
- package/dist/infra/lib/llm/auth/TokenRefresher.js +1 -1
- package/dist/infra/lib/llm/auth/index.d.ts +2 -12
- package/dist/infra/lib/llm/auth/index.d.ts.map +1 -1
- package/dist/infra/lib/llm/auth/index.js +5 -63
- package/dist/infra/lib/llm/auth/index.js.map +1 -1
- package/dist/infra/lib/llm/types.d.ts +1 -1
- package/dist/infra/lib/llm/types.d.ts.map +1 -1
- 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 +70 -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 -646
- 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 +59 -59
- package/skills/commit-push-pr/SKILL.md +75 -75
- package/skills/context7-usage/SKILL.md +105 -105
- package/skills/core-capabilities/SKILL.md +48 -48
- package/skills/e2e-commerce/SKILL.md +57 -57
- package/skills/exec-plan/SKILL.md +147 -147
- package/skills/frontend-design/SKILL.md +73 -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 -65
- package/skills/ui-ux-pro-max/SKILL.md +206 -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
- package/commands/vibe.voice.md +0 -79
|
@@ -57,36 +57,36 @@ export class AgentRegistry {
|
|
|
57
57
|
}
|
|
58
58
|
this.initializeSchema();
|
|
59
59
|
// Prepare statements
|
|
60
|
-
this.insertStmt = this.db.prepare(`
|
|
61
|
-
INSERT INTO agent_executions (id, task_id, agent_name, prompt, status, model, started_at, session_id, created_at)
|
|
62
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
60
|
+
this.insertStmt = this.db.prepare(`
|
|
61
|
+
INSERT INTO agent_executions (id, task_id, agent_name, prompt, status, model, started_at, session_id, created_at)
|
|
62
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
63
63
|
`);
|
|
64
|
-
this.updateCompleteStmt = this.db.prepare(`
|
|
65
|
-
UPDATE agent_executions SET status = 'completed', result = ?, duration = ?, completed_at = ? WHERE id = ?
|
|
64
|
+
this.updateCompleteStmt = this.db.prepare(`
|
|
65
|
+
UPDATE agent_executions SET status = 'completed', result = ?, duration = ?, completed_at = ? WHERE id = ?
|
|
66
66
|
`);
|
|
67
|
-
this.updateFailStmt = this.db.prepare(`
|
|
68
|
-
UPDATE agent_executions SET status = 'failed', error = ?, duration = ?, completed_at = ? WHERE id = ?
|
|
67
|
+
this.updateFailStmt = this.db.prepare(`
|
|
68
|
+
UPDATE agent_executions SET status = 'failed', error = ?, duration = ?, completed_at = ? WHERE id = ?
|
|
69
69
|
`);
|
|
70
70
|
}
|
|
71
71
|
initializeSchema() {
|
|
72
|
-
this.db.exec(`
|
|
73
|
-
CREATE TABLE IF NOT EXISTS agent_executions (
|
|
74
|
-
id TEXT PRIMARY KEY,
|
|
75
|
-
task_id TEXT NOT NULL,
|
|
76
|
-
agent_name TEXT NOT NULL,
|
|
77
|
-
prompt TEXT,
|
|
78
|
-
result TEXT,
|
|
79
|
-
status TEXT NOT NULL DEFAULT 'pending',
|
|
80
|
-
duration INTEGER,
|
|
81
|
-
model TEXT,
|
|
82
|
-
started_at INTEGER NOT NULL,
|
|
83
|
-
completed_at INTEGER,
|
|
84
|
-
session_id TEXT,
|
|
85
|
-
error TEXT,
|
|
86
|
-
created_at INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)
|
|
87
|
-
);
|
|
88
|
-
CREATE INDEX IF NOT EXISTS idx_status ON agent_executions(status);
|
|
89
|
-
CREATE INDEX IF NOT EXISTS idx_agent_name ON agent_executions(agent_name);
|
|
72
|
+
this.db.exec(`
|
|
73
|
+
CREATE TABLE IF NOT EXISTS agent_executions (
|
|
74
|
+
id TEXT PRIMARY KEY,
|
|
75
|
+
task_id TEXT NOT NULL,
|
|
76
|
+
agent_name TEXT NOT NULL,
|
|
77
|
+
prompt TEXT,
|
|
78
|
+
result TEXT,
|
|
79
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
80
|
+
duration INTEGER,
|
|
81
|
+
model TEXT,
|
|
82
|
+
started_at INTEGER NOT NULL,
|
|
83
|
+
completed_at INTEGER,
|
|
84
|
+
session_id TEXT,
|
|
85
|
+
error TEXT,
|
|
86
|
+
created_at INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)
|
|
87
|
+
);
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_status ON agent_executions(status);
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_agent_name ON agent_executions(agent_name);
|
|
90
90
|
`);
|
|
91
91
|
}
|
|
92
92
|
recordStart(execution) {
|
|
@@ -102,45 +102,45 @@ export class AgentRegistry {
|
|
|
102
102
|
this.updateFailStmt.run(maskedError, duration, Date.now(), id);
|
|
103
103
|
}
|
|
104
104
|
getIncompleteExecutions() {
|
|
105
|
-
const stmt = this.db.prepare(`
|
|
106
|
-
SELECT id, task_id as taskId, agent_name as agentName, status, duration, model,
|
|
107
|
-
started_at as startedAt, completed_at as completedAt, error, created_at as createdAt
|
|
108
|
-
FROM agent_executions WHERE status = 'running' ORDER BY started_at ASC
|
|
105
|
+
const stmt = this.db.prepare(`
|
|
106
|
+
SELECT id, task_id as taskId, agent_name as agentName, status, duration, model,
|
|
107
|
+
started_at as startedAt, completed_at as completedAt, error, created_at as createdAt
|
|
108
|
+
FROM agent_executions WHERE status = 'running' ORDER BY started_at ASC
|
|
109
109
|
`);
|
|
110
110
|
return stmt.all();
|
|
111
111
|
}
|
|
112
112
|
markOrphaned(olderThanMs) {
|
|
113
113
|
const cutoff = Date.now() - olderThanMs;
|
|
114
|
-
const stmt = this.db.prepare(`
|
|
115
|
-
UPDATE agent_executions SET status = 'failed', error = 'Orphaned (process crash)',
|
|
116
|
-
completed_at = ? WHERE status = 'running' AND started_at < ?
|
|
114
|
+
const stmt = this.db.prepare(`
|
|
115
|
+
UPDATE agent_executions SET status = 'failed', error = 'Orphaned (process crash)',
|
|
116
|
+
completed_at = ? WHERE status = 'running' AND started_at < ?
|
|
117
117
|
`);
|
|
118
118
|
const result = stmt.run(Date.now(), cutoff);
|
|
119
119
|
return result.changes;
|
|
120
120
|
}
|
|
121
121
|
getHistory(limit = 50, agentName) {
|
|
122
122
|
if (agentName) {
|
|
123
|
-
const stmt = this.db.prepare(`
|
|
124
|
-
SELECT id, task_id as taskId, agent_name as agentName, status, duration, model,
|
|
125
|
-
started_at as startedAt, completed_at as completedAt, error, created_at as createdAt
|
|
126
|
-
FROM agent_executions WHERE agent_name = ? ORDER BY created_at DESC LIMIT ?
|
|
123
|
+
const stmt = this.db.prepare(`
|
|
124
|
+
SELECT id, task_id as taskId, agent_name as agentName, status, duration, model,
|
|
125
|
+
started_at as startedAt, completed_at as completedAt, error, created_at as createdAt
|
|
126
|
+
FROM agent_executions WHERE agent_name = ? ORDER BY created_at DESC LIMIT ?
|
|
127
127
|
`);
|
|
128
128
|
return stmt.all(agentName, limit);
|
|
129
129
|
}
|
|
130
|
-
const stmt = this.db.prepare(`
|
|
131
|
-
SELECT id, task_id as taskId, agent_name as agentName, status, duration, model,
|
|
132
|
-
started_at as startedAt, completed_at as completedAt, error, created_at as createdAt
|
|
133
|
-
FROM agent_executions ORDER BY created_at DESC LIMIT ?
|
|
130
|
+
const stmt = this.db.prepare(`
|
|
131
|
+
SELECT id, task_id as taskId, agent_name as agentName, status, duration, model,
|
|
132
|
+
started_at as startedAt, completed_at as completedAt, error, created_at as createdAt
|
|
133
|
+
FROM agent_executions ORDER BY created_at DESC LIMIT ?
|
|
134
134
|
`);
|
|
135
135
|
return stmt.all(limit);
|
|
136
136
|
}
|
|
137
137
|
getAgentStats(agentName) {
|
|
138
|
-
const stmt = this.db.prepare(`
|
|
139
|
-
SELECT COUNT(*) as total,
|
|
140
|
-
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
141
|
-
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
142
|
-
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
143
|
-
FROM agent_executions WHERE agent_name = ?
|
|
138
|
+
const stmt = this.db.prepare(`
|
|
139
|
+
SELECT COUNT(*) as total,
|
|
140
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
141
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
142
|
+
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
143
|
+
FROM agent_executions WHERE agent_name = ?
|
|
144
144
|
`);
|
|
145
145
|
const row = stmt.get(agentName);
|
|
146
146
|
return {
|
|
@@ -153,21 +153,21 @@ export class AgentRegistry {
|
|
|
153
153
|
}
|
|
154
154
|
getGlobalStats() {
|
|
155
155
|
// Overall stats
|
|
156
|
-
const overallStmt = this.db.prepare(`
|
|
157
|
-
SELECT COUNT(*) as total,
|
|
158
|
-
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
159
|
-
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
160
|
-
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
161
|
-
FROM agent_executions
|
|
156
|
+
const overallStmt = this.db.prepare(`
|
|
157
|
+
SELECT COUNT(*) as total,
|
|
158
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
159
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
160
|
+
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
161
|
+
FROM agent_executions
|
|
162
162
|
`);
|
|
163
163
|
const overall = overallStmt.get();
|
|
164
164
|
// By agent
|
|
165
|
-
const byAgentStmt = this.db.prepare(`
|
|
166
|
-
SELECT agent_name as agentName, COUNT(*) as total,
|
|
167
|
-
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
168
|
-
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
169
|
-
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
170
|
-
FROM agent_executions GROUP BY agent_name
|
|
165
|
+
const byAgentStmt = this.db.prepare(`
|
|
166
|
+
SELECT agent_name as agentName, COUNT(*) as total,
|
|
167
|
+
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed,
|
|
168
|
+
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
169
|
+
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
170
|
+
FROM agent_executions GROUP BY agent_name
|
|
171
171
|
`);
|
|
172
172
|
const agentRows = byAgentStmt.all();
|
|
173
173
|
const byAgent = {};
|
|
@@ -181,10 +181,10 @@ export class AgentRegistry {
|
|
|
181
181
|
};
|
|
182
182
|
}
|
|
183
183
|
// By model
|
|
184
|
-
const byModelStmt = this.db.prepare(`
|
|
185
|
-
SELECT model, COUNT(*) as count,
|
|
186
|
-
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
187
|
-
FROM agent_executions WHERE model IS NOT NULL GROUP BY model
|
|
184
|
+
const byModelStmt = this.db.prepare(`
|
|
185
|
+
SELECT model, COUNT(*) as count,
|
|
186
|
+
AVG(CASE WHEN duration IS NOT NULL THEN duration END) as avgDuration
|
|
187
|
+
FROM agent_executions WHERE model IS NOT NULL GROUP BY model
|
|
188
188
|
`);
|
|
189
189
|
const modelRows = byModelStmt.all();
|
|
190
190
|
const byModel = {};
|
|
@@ -203,9 +203,9 @@ export class AgentRegistry {
|
|
|
203
203
|
}
|
|
204
204
|
cleanup(ttlMs = DEFAULT_CLEANUP_TTL_MS) {
|
|
205
205
|
const cutoff = Date.now() - ttlMs;
|
|
206
|
-
const stmt = this.db.prepare(`
|
|
207
|
-
DELETE FROM agent_executions
|
|
208
|
-
WHERE (status = 'completed' OR status = 'failed') AND completed_at < ?
|
|
206
|
+
const stmt = this.db.prepare(`
|
|
207
|
+
DELETE FROM agent_executions
|
|
208
|
+
WHERE (status = 'completed' OR status = 'failed') AND completed_at < ?
|
|
209
209
|
`);
|
|
210
210
|
const result = stmt.run(cutoff);
|
|
211
211
|
return result.changes;
|
|
@@ -11,19 +11,19 @@ export function createMultiLlmPrompts(feature, techStack) {
|
|
|
11
11
|
const stackStr = techStack.length > 0 ? techStack.join(', ') : 'the project';
|
|
12
12
|
return {
|
|
13
13
|
bestPractices: {
|
|
14
|
-
gpt: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
15
|
-
Focus on: architecture patterns, code conventions, design patterns.
|
|
14
|
+
gpt: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
15
|
+
Focus on: architecture patterns, code conventions, design patterns.
|
|
16
16
|
Return JSON: { patterns: string[], antiPatterns: string[], libraries: string[] }`,
|
|
17
|
-
gemini: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
18
|
-
Focus on: latest trends, framework updates, modern approaches.
|
|
17
|
+
gemini: `Best practices for implementing "${feature}" with ${stackStr}.
|
|
18
|
+
Focus on: latest trends, framework updates, modern approaches.
|
|
19
19
|
Return JSON: { patterns: string[], antiPatterns: string[], libraries: string[] }`
|
|
20
20
|
},
|
|
21
21
|
security: {
|
|
22
|
-
gpt: `Security considerations for "${feature}" with ${stackStr}.
|
|
23
|
-
Focus on: CVE database, known vulnerabilities, exploit patterns.
|
|
22
|
+
gpt: `Security considerations for "${feature}" with ${stackStr}.
|
|
23
|
+
Focus on: CVE database, known vulnerabilities, exploit patterns.
|
|
24
24
|
Return JSON: { vulnerabilities: string[], mitigations: string[], checklist: string[] }`,
|
|
25
|
-
gemini: `Security advisories for "${feature}" with ${stackStr}.
|
|
26
|
-
Focus on: latest patches, recent incidents, security best practices.
|
|
25
|
+
gemini: `Security advisories for "${feature}" with ${stackStr}.
|
|
26
|
+
Focus on: latest patches, recent incidents, security best practices.
|
|
27
27
|
Return JSON: { advisories: string[], patches: string[], incidents: string[] }`
|
|
28
28
|
}
|
|
29
29
|
};
|
|
@@ -10,14 +10,14 @@ describe('SwarmOrchestrator', () => {
|
|
|
10
10
|
expect(analysis.score).toBeLessThan(10);
|
|
11
11
|
});
|
|
12
12
|
it('복잡한 프롬프트는 높은 복잡도', async () => {
|
|
13
|
-
const complexPrompt = `
|
|
14
|
-
Implement a complete login feature:
|
|
15
|
-
1. Create the login form UI with React
|
|
16
|
-
2. Add form validation with Zod
|
|
17
|
-
3. Implement the API endpoint with authentication
|
|
18
|
-
4. Add error handling and loading states
|
|
19
|
-
5. Write unit tests for all components
|
|
20
|
-
6. Add security measures against CSRF
|
|
13
|
+
const complexPrompt = `
|
|
14
|
+
Implement a complete login feature:
|
|
15
|
+
1. Create the login form UI with React
|
|
16
|
+
2. Add form validation with Zod
|
|
17
|
+
3. Implement the API endpoint with authentication
|
|
18
|
+
4. Add error handling and loading states
|
|
19
|
+
5. Write unit tests for all components
|
|
20
|
+
6. Add security measures against CSRF
|
|
21
21
|
`;
|
|
22
22
|
const analysis = await analyzeTaskComplexity(complexPrompt);
|
|
23
23
|
expect(analysis.score).toBeGreaterThan(15);
|
|
@@ -29,10 +29,10 @@ describe('SwarmOrchestrator', () => {
|
|
|
29
29
|
expect(analysis.factors).toContain('5-files');
|
|
30
30
|
});
|
|
31
31
|
it('숫자 목록은 분할 제안 생성', async () => {
|
|
32
|
-
const prompt = `
|
|
33
|
-
1. First do this task
|
|
34
|
-
2. Then do second task
|
|
35
|
-
3. Finally do third task
|
|
32
|
+
const prompt = `
|
|
33
|
+
1. First do this task
|
|
34
|
+
2. Then do second task
|
|
35
|
+
3. Finally do third task
|
|
36
36
|
`;
|
|
37
37
|
const analysis = await analyzeTaskComplexity(prompt);
|
|
38
38
|
expect(analysis.suggestedSplits?.length).toBeGreaterThanOrEqual(2);
|
|
@@ -65,10 +65,10 @@ describe('SwarmOrchestrator', () => {
|
|
|
65
65
|
it('maxDepth 도달 시 분할 안함', async () => {
|
|
66
66
|
// maxDepth: 0으로 설정하면 분할하지 않음
|
|
67
67
|
const orchestrator = new SwarmOrchestrator({
|
|
68
|
-
prompt: `
|
|
69
|
-
1. Task one
|
|
70
|
-
2. Task two
|
|
71
|
-
3. Task three
|
|
68
|
+
prompt: `
|
|
69
|
+
1. Task one
|
|
70
|
+
2. Task two
|
|
71
|
+
3. Task three
|
|
72
72
|
`,
|
|
73
73
|
maxDepth: 0
|
|
74
74
|
});
|
|
@@ -17,45 +17,45 @@ export function createResearchTasks(feature, techStack = []) {
|
|
|
17
17
|
{
|
|
18
18
|
name: 'best-practices-agent',
|
|
19
19
|
category: 'best-practices',
|
|
20
|
-
prompt: `Research best practices for implementing "${feature}" with ${stackStr}. Focus on:
|
|
21
|
-
1. Industry-standard patterns
|
|
22
|
-
2. Common pitfalls to avoid
|
|
23
|
-
3. Recommended libraries/tools
|
|
24
|
-
4. Testing strategies
|
|
25
|
-
|
|
20
|
+
prompt: `Research best practices for implementing "${feature}" with ${stackStr}. Focus on:
|
|
21
|
+
1. Industry-standard patterns
|
|
22
|
+
2. Common pitfalls to avoid
|
|
23
|
+
3. Recommended libraries/tools
|
|
24
|
+
4. Testing strategies
|
|
25
|
+
|
|
26
26
|
Provide actionable recommendations.`
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
name: 'framework-docs-agent',
|
|
30
30
|
category: 'framework-docs',
|
|
31
|
-
prompt: `Find the latest documentation for ${stackStr} related to "${feature}". Include:
|
|
32
|
-
1. Official API references
|
|
33
|
-
2. Configuration options
|
|
34
|
-
3. Migration guides if applicable
|
|
35
|
-
4. Code examples from official docs
|
|
36
|
-
|
|
31
|
+
prompt: `Find the latest documentation for ${stackStr} related to "${feature}". Include:
|
|
32
|
+
1. Official API references
|
|
33
|
+
2. Configuration options
|
|
34
|
+
3. Migration guides if applicable
|
|
35
|
+
4. Code examples from official docs
|
|
36
|
+
|
|
37
37
|
Use context7 MCP if available for up-to-date documentation.`
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
name: 'codebase-patterns-agent',
|
|
41
41
|
category: 'codebase-patterns',
|
|
42
|
-
prompt: `Analyze the current codebase for patterns related to "${feature}". Look for:
|
|
43
|
-
1. Similar existing implementations
|
|
44
|
-
2. Established conventions
|
|
45
|
-
3. Reusable utilities
|
|
46
|
-
4. Potential conflicts or dependencies
|
|
47
|
-
|
|
42
|
+
prompt: `Analyze the current codebase for patterns related to "${feature}". Look for:
|
|
43
|
+
1. Similar existing implementations
|
|
44
|
+
2. Established conventions
|
|
45
|
+
3. Reusable utilities
|
|
46
|
+
4. Potential conflicts or dependencies
|
|
47
|
+
|
|
48
48
|
Use Glob and Grep to search the codebase.`
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
name: 'security-advisory-agent',
|
|
52
52
|
category: 'security-advisory',
|
|
53
|
-
prompt: `Review security considerations for "${feature}" with ${stackStr}. Check:
|
|
54
|
-
1. OWASP Top 10 relevance
|
|
55
|
-
2. Authentication/authorization requirements
|
|
56
|
-
3. Data validation needs
|
|
57
|
-
4. Known vulnerabilities in dependencies
|
|
58
|
-
|
|
53
|
+
prompt: `Review security considerations for "${feature}" with ${stackStr}. Check:
|
|
54
|
+
1. OWASP Top 10 relevance
|
|
55
|
+
2. Authentication/authorization requirements
|
|
56
|
+
3. Data validation needs
|
|
57
|
+
4. Known vulnerabilities in dependencies
|
|
58
|
+
|
|
59
59
|
Provide security recommendations.`
|
|
60
60
|
}
|
|
61
61
|
];
|
|
@@ -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
|