@su-record/vibe 2.7.14 → 2.7.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +37 -37
- package/CLAUDE.md +134 -126
- package/LICENSE +21 -21
- package/README.md +449 -449
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +94 -94
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +11 -13
- package/commands/vibe.review.md +43 -1
- package/commands/vibe.run.md +2124 -2078
- package/commands/vibe.spec.md +9 -4
- package/commands/vibe.spec.review.md +569 -565
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +33 -8
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/info.js +54 -54
- package/dist/cli/commands/init.js +5 -5
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +137 -137
- package/hooks/scripts/code-check.js +77 -70
- package/hooks/scripts/context-save.js +212 -212
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +475 -475
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +104 -104
- package/hooks/scripts/session-start.js +106 -106
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +100 -100
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +121 -121
- package/skills/agents-md/SKILL.md +120 -120
- package/skills/arch-guard/SKILL.md +180 -180
- package/skills/brand-assets/SKILL.md +146 -146
- package/skills/capability-loop/SKILL.md +167 -167
- package/skills/characterization-test/SKILL.md +206 -206
- package/skills/commerce-patterns/SKILL.md +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 -66
- 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
|
@@ -153,48 +153,48 @@ export class Provisioner {
|
|
|
153
153
|
const stateSection = details.stateManagement.length > 0
|
|
154
154
|
? details.stateManagement.join(', ')
|
|
155
155
|
: 'N/A';
|
|
156
|
-
return `# [Feature Name] SPEC
|
|
157
|
-
|
|
158
|
-
## Overview
|
|
159
|
-
<!-- Brief description of the feature -->
|
|
160
|
-
|
|
161
|
-
## Tech Stack
|
|
162
|
-
${stackList}
|
|
163
|
-
|
|
164
|
-
### Infrastructure
|
|
165
|
-
- **Databases**: ${dbSection}
|
|
166
|
-
- **State Management**: ${stateSection}
|
|
167
|
-
|
|
168
|
-
## Problem Statement
|
|
169
|
-
<!-- What problem does this solve? -->
|
|
170
|
-
|
|
171
|
-
## Proposed Solution
|
|
172
|
-
<!-- High-level approach -->
|
|
173
|
-
|
|
174
|
-
## Requirements
|
|
175
|
-
|
|
176
|
-
### Functional
|
|
177
|
-
1. <!-- Requirement 1 -->
|
|
178
|
-
|
|
179
|
-
### Non-Functional
|
|
180
|
-
1. <!-- Performance, security, accessibility -->
|
|
181
|
-
|
|
182
|
-
## API Design
|
|
183
|
-
<!-- Endpoints, request/response schemas -->
|
|
184
|
-
|
|
185
|
-
## Data Model
|
|
186
|
-
<!-- Schema changes, migrations -->
|
|
187
|
-
|
|
188
|
-
## Test Strategy
|
|
189
|
-
- Unit tests: <!-- scope -->
|
|
190
|
-
- Integration tests: <!-- scope -->
|
|
191
|
-
- E2E tests: <!-- scope -->
|
|
192
|
-
|
|
193
|
-
## Acceptance Criteria
|
|
194
|
-
- [ ] <!-- Criterion 1 -->
|
|
195
|
-
|
|
196
|
-
## References
|
|
197
|
-
<!-- Links to relevant docs, designs, PRs -->
|
|
156
|
+
return `# [Feature Name] SPEC
|
|
157
|
+
|
|
158
|
+
## Overview
|
|
159
|
+
<!-- Brief description of the feature -->
|
|
160
|
+
|
|
161
|
+
## Tech Stack
|
|
162
|
+
${stackList}
|
|
163
|
+
|
|
164
|
+
### Infrastructure
|
|
165
|
+
- **Databases**: ${dbSection}
|
|
166
|
+
- **State Management**: ${stateSection}
|
|
167
|
+
|
|
168
|
+
## Problem Statement
|
|
169
|
+
<!-- What problem does this solve? -->
|
|
170
|
+
|
|
171
|
+
## Proposed Solution
|
|
172
|
+
<!-- High-level approach -->
|
|
173
|
+
|
|
174
|
+
## Requirements
|
|
175
|
+
|
|
176
|
+
### Functional
|
|
177
|
+
1. <!-- Requirement 1 -->
|
|
178
|
+
|
|
179
|
+
### Non-Functional
|
|
180
|
+
1. <!-- Performance, security, accessibility -->
|
|
181
|
+
|
|
182
|
+
## API Design
|
|
183
|
+
<!-- Endpoints, request/response schemas -->
|
|
184
|
+
|
|
185
|
+
## Data Model
|
|
186
|
+
<!-- Schema changes, migrations -->
|
|
187
|
+
|
|
188
|
+
## Test Strategy
|
|
189
|
+
- Unit tests: <!-- scope -->
|
|
190
|
+
- Integration tests: <!-- scope -->
|
|
191
|
+
- E2E tests: <!-- scope -->
|
|
192
|
+
|
|
193
|
+
## Acceptance Criteria
|
|
194
|
+
- [ ] <!-- Criterion 1 -->
|
|
195
|
+
|
|
196
|
+
## References
|
|
197
|
+
<!-- Links to relevant docs, designs, PRs -->
|
|
198
198
|
`;
|
|
199
199
|
}
|
|
200
200
|
}
|
|
@@ -216,30 +216,30 @@ export function generateNavigationHeader(dir, rootPath) {
|
|
|
216
216
|
* Describe DeepInit workflow
|
|
217
217
|
*/
|
|
218
218
|
export function describeDeepInitWorkflow() {
|
|
219
|
-
return `
|
|
220
|
-
## DeepInit Workflow
|
|
221
|
-
|
|
222
|
-
Hierarchical AI-readable documentation generation:
|
|
223
|
-
|
|
224
|
-
\`\`\`
|
|
225
|
-
project/
|
|
226
|
-
├── AGENTS.md ← Root documentation
|
|
227
|
-
├── src/
|
|
228
|
-
│ ├── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
229
|
-
│ ├── components/
|
|
230
|
-
│ │ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
231
|
-
│ └── services/
|
|
232
|
-
│ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
233
|
-
└── tests/
|
|
234
|
-
└── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
235
|
-
\`\`\`
|
|
236
|
-
|
|
237
|
-
Features:
|
|
238
|
-
- Parent references for navigation
|
|
239
|
-
- Auto-detected purpose and conventions
|
|
240
|
-
- Preserved manual notes on regeneration
|
|
241
|
-
- Entry point identification
|
|
242
|
-
- Child module linking
|
|
219
|
+
return `
|
|
220
|
+
## DeepInit Workflow
|
|
221
|
+
|
|
222
|
+
Hierarchical AI-readable documentation generation:
|
|
223
|
+
|
|
224
|
+
\`\`\`
|
|
225
|
+
project/
|
|
226
|
+
├── AGENTS.md ← Root documentation
|
|
227
|
+
├── src/
|
|
228
|
+
│ ├── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
229
|
+
│ ├── components/
|
|
230
|
+
│ │ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
231
|
+
│ └── services/
|
|
232
|
+
│ └── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
233
|
+
└── tests/
|
|
234
|
+
└── AGENTS.md ← <!-- Parent: ../AGENTS.md -->
|
|
235
|
+
\`\`\`
|
|
236
|
+
|
|
237
|
+
Features:
|
|
238
|
+
- Parent references for navigation
|
|
239
|
+
- Auto-detected purpose and conventions
|
|
240
|
+
- Preserved manual notes on regeneration
|
|
241
|
+
- Entry point identification
|
|
242
|
+
- Child module linking
|
|
243
243
|
`.trim();
|
|
244
244
|
}
|
|
245
245
|
//# sourceMappingURL=DeepInit.js.map
|
|
@@ -108,10 +108,10 @@ export function formatProgress(state = currentState) {
|
|
|
108
108
|
* Phase 시작 배너
|
|
109
109
|
*/
|
|
110
110
|
export function formatPhaseStart(phaseNumber, phaseName, totalPhases) {
|
|
111
|
-
return `
|
|
112
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
113
|
-
🏔️ BOULDER ROLLING... Phase ${phaseNumber}/${totalPhases}
|
|
114
|
-
${phaseName}
|
|
111
|
+
return `
|
|
112
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
113
|
+
🏔️ BOULDER ROLLING... Phase ${phaseNumber}/${totalPhases}
|
|
114
|
+
${phaseName}
|
|
115
115
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`.trim();
|
|
116
116
|
}
|
|
117
117
|
/**
|
|
@@ -129,13 +129,13 @@ export function formatIterationComplete(state) {
|
|
|
129
129
|
: 0;
|
|
130
130
|
const totalRetries = state.phases.reduce((sum, p) => sum + p.retryCount, 0);
|
|
131
131
|
const retryInfo = totalRetries > 0 ? ` (${totalRetries} retries)` : '';
|
|
132
|
-
return `
|
|
133
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
134
|
-
🎉 BOULDER REACHED THE TOP!
|
|
135
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
136
|
-
Feature: ${state.featureName}
|
|
137
|
-
Phases: ${state.totalPhases}/${state.totalPhases} complete${retryInfo}
|
|
138
|
-
Time: ${duration}s
|
|
132
|
+
return `
|
|
133
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
134
|
+
🎉 BOULDER REACHED THE TOP!
|
|
135
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
136
|
+
Feature: ${state.featureName}
|
|
137
|
+
Phases: ${state.totalPhases}/${state.totalPhases} complete${retryInfo}
|
|
138
|
+
Time: ${duration}s
|
|
139
139
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`.trim();
|
|
140
140
|
}
|
|
141
141
|
/**
|
|
@@ -35,114 +35,114 @@ function getPythonCommand() {
|
|
|
35
35
|
const PYTHON_CMD = getPythonCommand();
|
|
36
36
|
export class PythonParser {
|
|
37
37
|
static cleanupRegistered = false;
|
|
38
|
-
static pythonScript = `
|
|
39
|
-
import ast
|
|
40
|
-
import sys
|
|
41
|
-
import json
|
|
42
|
-
|
|
43
|
-
def analyze_code(code):
|
|
44
|
-
try:
|
|
45
|
-
tree = ast.parse(code)
|
|
46
|
-
symbols = []
|
|
47
|
-
|
|
48
|
-
for node in ast.walk(tree):
|
|
49
|
-
if isinstance(node, ast.FunctionDef):
|
|
50
|
-
symbols.append({
|
|
51
|
-
'name': node.name,
|
|
52
|
-
'kind': 'function',
|
|
53
|
-
'line': node.lineno,
|
|
54
|
-
'column': node.col_offset,
|
|
55
|
-
'endLine': node.end_lineno,
|
|
56
|
-
'docstring': ast.get_docstring(node)
|
|
57
|
-
})
|
|
58
|
-
elif isinstance(node, ast.ClassDef):
|
|
59
|
-
symbols.append({
|
|
60
|
-
'name': node.name,
|
|
61
|
-
'kind': 'class',
|
|
62
|
-
'line': node.lineno,
|
|
63
|
-
'column': node.col_offset,
|
|
64
|
-
'endLine': node.end_lineno,
|
|
65
|
-
'docstring': ast.get_docstring(node)
|
|
66
|
-
})
|
|
67
|
-
elif isinstance(node, ast.Assign):
|
|
68
|
-
for target in node.targets:
|
|
69
|
-
if isinstance(target, ast.Name):
|
|
70
|
-
symbols.append({
|
|
71
|
-
'name': target.id,
|
|
72
|
-
'kind': 'variable',
|
|
73
|
-
'line': node.lineno,
|
|
74
|
-
'column': node.col_offset
|
|
75
|
-
})
|
|
76
|
-
elif isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
|
|
77
|
-
for alias in node.names:
|
|
78
|
-
symbols.append({
|
|
79
|
-
'name': alias.name,
|
|
80
|
-
'kind': 'import',
|
|
81
|
-
'line': node.lineno,
|
|
82
|
-
'column': node.col_offset
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
return {'success': True, 'symbols': symbols}
|
|
86
|
-
except SyntaxError as e:
|
|
87
|
-
return {'success': False, 'error': str(e)}
|
|
88
|
-
except Exception as e:
|
|
89
|
-
return {'success': False, 'error': str(e)}
|
|
90
|
-
|
|
91
|
-
def calculate_complexity(code):
|
|
92
|
-
try:
|
|
93
|
-
tree = ast.parse(code)
|
|
94
|
-
|
|
95
|
-
def cyclomatic_complexity(node):
|
|
96
|
-
complexity = 1
|
|
97
|
-
for child in ast.walk(node):
|
|
98
|
-
if isinstance(child, (ast.If, ast.For, ast.While, ast.And, ast.Or, ast.ExceptHandler)):
|
|
99
|
-
complexity += 1
|
|
100
|
-
elif isinstance(child, ast.BoolOp):
|
|
101
|
-
complexity += len(child.values) - 1
|
|
102
|
-
return complexity
|
|
103
|
-
|
|
104
|
-
functions = []
|
|
105
|
-
classes = []
|
|
106
|
-
total_complexity = 1
|
|
107
|
-
|
|
108
|
-
for node in ast.walk(tree):
|
|
109
|
-
if isinstance(node, ast.FunctionDef):
|
|
110
|
-
func_complexity = cyclomatic_complexity(node)
|
|
111
|
-
functions.append({
|
|
112
|
-
'name': node.name,
|
|
113
|
-
'complexity': func_complexity,
|
|
114
|
-
'line': node.lineno
|
|
115
|
-
})
|
|
116
|
-
total_complexity += func_complexity
|
|
117
|
-
elif isinstance(node, ast.ClassDef):
|
|
118
|
-
method_count = sum(1 for n in node.body if isinstance(n, ast.FunctionDef))
|
|
119
|
-
classes.append({
|
|
120
|
-
'name': node.name,
|
|
121
|
-
'methods': method_count,
|
|
122
|
-
'line': node.lineno
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
'success': True,
|
|
127
|
-
'cyclomaticComplexity': total_complexity,
|
|
128
|
-
'functions': functions,
|
|
129
|
-
'classes': classes
|
|
130
|
-
}
|
|
131
|
-
except Exception as e:
|
|
132
|
-
return {'success': False, 'error': str(e)}
|
|
133
|
-
|
|
134
|
-
if __name__ == '__main__':
|
|
135
|
-
code = sys.stdin.read()
|
|
136
|
-
action = sys.argv[1] if len(sys.argv) > 1 else 'symbols'
|
|
137
|
-
|
|
138
|
-
if action == 'symbols':
|
|
139
|
-
result = analyze_code(code)
|
|
140
|
-
elif action == 'complexity':
|
|
141
|
-
result = calculate_complexity(code)
|
|
142
|
-
else:
|
|
143
|
-
result = {'success': False, 'error': 'Unknown action'}
|
|
144
|
-
|
|
145
|
-
print(json.dumps(result))
|
|
38
|
+
static pythonScript = `
|
|
39
|
+
import ast
|
|
40
|
+
import sys
|
|
41
|
+
import json
|
|
42
|
+
|
|
43
|
+
def analyze_code(code):
|
|
44
|
+
try:
|
|
45
|
+
tree = ast.parse(code)
|
|
46
|
+
symbols = []
|
|
47
|
+
|
|
48
|
+
for node in ast.walk(tree):
|
|
49
|
+
if isinstance(node, ast.FunctionDef):
|
|
50
|
+
symbols.append({
|
|
51
|
+
'name': node.name,
|
|
52
|
+
'kind': 'function',
|
|
53
|
+
'line': node.lineno,
|
|
54
|
+
'column': node.col_offset,
|
|
55
|
+
'endLine': node.end_lineno,
|
|
56
|
+
'docstring': ast.get_docstring(node)
|
|
57
|
+
})
|
|
58
|
+
elif isinstance(node, ast.ClassDef):
|
|
59
|
+
symbols.append({
|
|
60
|
+
'name': node.name,
|
|
61
|
+
'kind': 'class',
|
|
62
|
+
'line': node.lineno,
|
|
63
|
+
'column': node.col_offset,
|
|
64
|
+
'endLine': node.end_lineno,
|
|
65
|
+
'docstring': ast.get_docstring(node)
|
|
66
|
+
})
|
|
67
|
+
elif isinstance(node, ast.Assign):
|
|
68
|
+
for target in node.targets:
|
|
69
|
+
if isinstance(target, ast.Name):
|
|
70
|
+
symbols.append({
|
|
71
|
+
'name': target.id,
|
|
72
|
+
'kind': 'variable',
|
|
73
|
+
'line': node.lineno,
|
|
74
|
+
'column': node.col_offset
|
|
75
|
+
})
|
|
76
|
+
elif isinstance(node, ast.Import) or isinstance(node, ast.ImportFrom):
|
|
77
|
+
for alias in node.names:
|
|
78
|
+
symbols.append({
|
|
79
|
+
'name': alias.name,
|
|
80
|
+
'kind': 'import',
|
|
81
|
+
'line': node.lineno,
|
|
82
|
+
'column': node.col_offset
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
return {'success': True, 'symbols': symbols}
|
|
86
|
+
except SyntaxError as e:
|
|
87
|
+
return {'success': False, 'error': str(e)}
|
|
88
|
+
except Exception as e:
|
|
89
|
+
return {'success': False, 'error': str(e)}
|
|
90
|
+
|
|
91
|
+
def calculate_complexity(code):
|
|
92
|
+
try:
|
|
93
|
+
tree = ast.parse(code)
|
|
94
|
+
|
|
95
|
+
def cyclomatic_complexity(node):
|
|
96
|
+
complexity = 1
|
|
97
|
+
for child in ast.walk(node):
|
|
98
|
+
if isinstance(child, (ast.If, ast.For, ast.While, ast.And, ast.Or, ast.ExceptHandler)):
|
|
99
|
+
complexity += 1
|
|
100
|
+
elif isinstance(child, ast.BoolOp):
|
|
101
|
+
complexity += len(child.values) - 1
|
|
102
|
+
return complexity
|
|
103
|
+
|
|
104
|
+
functions = []
|
|
105
|
+
classes = []
|
|
106
|
+
total_complexity = 1
|
|
107
|
+
|
|
108
|
+
for node in ast.walk(tree):
|
|
109
|
+
if isinstance(node, ast.FunctionDef):
|
|
110
|
+
func_complexity = cyclomatic_complexity(node)
|
|
111
|
+
functions.append({
|
|
112
|
+
'name': node.name,
|
|
113
|
+
'complexity': func_complexity,
|
|
114
|
+
'line': node.lineno
|
|
115
|
+
})
|
|
116
|
+
total_complexity += func_complexity
|
|
117
|
+
elif isinstance(node, ast.ClassDef):
|
|
118
|
+
method_count = sum(1 for n in node.body if isinstance(n, ast.FunctionDef))
|
|
119
|
+
classes.append({
|
|
120
|
+
'name': node.name,
|
|
121
|
+
'methods': method_count,
|
|
122
|
+
'line': node.lineno
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
'success': True,
|
|
127
|
+
'cyclomaticComplexity': total_complexity,
|
|
128
|
+
'functions': functions,
|
|
129
|
+
'classes': classes
|
|
130
|
+
}
|
|
131
|
+
except Exception as e:
|
|
132
|
+
return {'success': False, 'error': str(e)}
|
|
133
|
+
|
|
134
|
+
if __name__ == '__main__':
|
|
135
|
+
code = sys.stdin.read()
|
|
136
|
+
action = sys.argv[1] if len(sys.argv) > 1 else 'symbols'
|
|
137
|
+
|
|
138
|
+
if action == 'symbols':
|
|
139
|
+
result = analyze_code(code)
|
|
140
|
+
elif action == 'complexity':
|
|
141
|
+
result = calculate_complexity(code)
|
|
142
|
+
else:
|
|
143
|
+
result = {'success': False, 'error': 'Unknown action'}
|
|
144
|
+
|
|
145
|
+
print(json.dumps(result))
|
|
146
146
|
`;
|
|
147
147
|
// Singleton Python script path to avoid recreating it
|
|
148
148
|
static scriptPath = null;
|
|
@@ -23,90 +23,90 @@ import * as geminiApi from './gemini/index.js';
|
|
|
23
23
|
// Constants
|
|
24
24
|
// ============================================================================
|
|
25
25
|
const REVIEW_PROMPTS = {
|
|
26
|
-
security: `You are a security expert reviewing code changes.
|
|
27
|
-
Identify security vulnerabilities including:
|
|
28
|
-
- SQL injection, XSS, CSRF
|
|
29
|
-
- Authentication/authorization flaws
|
|
30
|
-
- Sensitive data exposure
|
|
31
|
-
- Insecure dependencies
|
|
32
|
-
- OWASP Top 10 issues
|
|
33
|
-
|
|
34
|
-
For each issue found, respond in this exact JSON format:
|
|
35
|
-
{
|
|
36
|
-
"issues": [
|
|
37
|
-
{
|
|
38
|
-
"id": "SEC-001",
|
|
39
|
-
"title": "Brief title",
|
|
40
|
-
"description": "Detailed description",
|
|
41
|
-
"location": "file.ts:42",
|
|
42
|
-
"severity": "critical|high|medium|low",
|
|
43
|
-
"suggestion": "How to fix"
|
|
44
|
-
}
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
|
|
26
|
+
security: `You are a security expert reviewing code changes.
|
|
27
|
+
Identify security vulnerabilities including:
|
|
28
|
+
- SQL injection, XSS, CSRF
|
|
29
|
+
- Authentication/authorization flaws
|
|
30
|
+
- Sensitive data exposure
|
|
31
|
+
- Insecure dependencies
|
|
32
|
+
- OWASP Top 10 issues
|
|
33
|
+
|
|
34
|
+
For each issue found, respond in this exact JSON format:
|
|
35
|
+
{
|
|
36
|
+
"issues": [
|
|
37
|
+
{
|
|
38
|
+
"id": "SEC-001",
|
|
39
|
+
"title": "Brief title",
|
|
40
|
+
"description": "Detailed description",
|
|
41
|
+
"location": "file.ts:42",
|
|
42
|
+
"severity": "critical|high|medium|low",
|
|
43
|
+
"suggestion": "How to fix"
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
48
|
If no issues found, respond: {"issues": []}`,
|
|
49
|
-
performance: `You are a performance expert reviewing code changes.
|
|
50
|
-
Identify performance issues including:
|
|
51
|
-
- N+1 queries
|
|
52
|
-
- Memory leaks
|
|
53
|
-
- Unnecessary re-renders
|
|
54
|
-
- Blocking operations
|
|
55
|
-
- Large bundle size impacts
|
|
56
|
-
- Missing caching opportunities
|
|
57
|
-
|
|
58
|
-
Respond in JSON format:
|
|
59
|
-
{
|
|
60
|
-
"issues": [
|
|
61
|
-
{
|
|
62
|
-
"id": "PERF-001",
|
|
63
|
-
"title": "Brief title",
|
|
64
|
-
"description": "Detailed description",
|
|
65
|
-
"location": "file.ts:42",
|
|
66
|
-
"severity": "critical|high|medium|low",
|
|
67
|
-
"suggestion": "How to fix"
|
|
68
|
-
}
|
|
69
|
-
]
|
|
49
|
+
performance: `You are a performance expert reviewing code changes.
|
|
50
|
+
Identify performance issues including:
|
|
51
|
+
- N+1 queries
|
|
52
|
+
- Memory leaks
|
|
53
|
+
- Unnecessary re-renders
|
|
54
|
+
- Blocking operations
|
|
55
|
+
- Large bundle size impacts
|
|
56
|
+
- Missing caching opportunities
|
|
57
|
+
|
|
58
|
+
Respond in JSON format:
|
|
59
|
+
{
|
|
60
|
+
"issues": [
|
|
61
|
+
{
|
|
62
|
+
"id": "PERF-001",
|
|
63
|
+
"title": "Brief title",
|
|
64
|
+
"description": "Detailed description",
|
|
65
|
+
"location": "file.ts:42",
|
|
66
|
+
"severity": "critical|high|medium|low",
|
|
67
|
+
"suggestion": "How to fix"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
70
|
}`,
|
|
71
|
-
architecture: `You are an architecture expert reviewing code changes.
|
|
72
|
-
Identify architecture issues including:
|
|
73
|
-
- Circular dependencies
|
|
74
|
-
- Layer violations (e.g., UI calling DB directly)
|
|
75
|
-
- Missing abstractions
|
|
76
|
-
- Tight coupling
|
|
77
|
-
- Single Responsibility violations
|
|
78
|
-
- DRY violations
|
|
79
|
-
|
|
71
|
+
architecture: `You are an architecture expert reviewing code changes.
|
|
72
|
+
Identify architecture issues including:
|
|
73
|
+
- Circular dependencies
|
|
74
|
+
- Layer violations (e.g., UI calling DB directly)
|
|
75
|
+
- Missing abstractions
|
|
76
|
+
- Tight coupling
|
|
77
|
+
- Single Responsibility violations
|
|
78
|
+
- DRY violations
|
|
79
|
+
|
|
80
80
|
Respond in JSON format with issues array.`,
|
|
81
|
-
complexity: `You are a code quality expert reviewing complexity.
|
|
82
|
-
Identify complexity issues including:
|
|
83
|
-
- Functions > 30 lines
|
|
84
|
-
- Nesting depth > 3 levels
|
|
85
|
-
- Cyclomatic complexity > 10
|
|
86
|
-
- Too many parameters (> 5)
|
|
87
|
-
- Long files (> 300 lines)
|
|
88
|
-
|
|
81
|
+
complexity: `You are a code quality expert reviewing complexity.
|
|
82
|
+
Identify complexity issues including:
|
|
83
|
+
- Functions > 30 lines
|
|
84
|
+
- Nesting depth > 3 levels
|
|
85
|
+
- Cyclomatic complexity > 10
|
|
86
|
+
- Too many parameters (> 5)
|
|
87
|
+
- Long files (> 300 lines)
|
|
88
|
+
|
|
89
89
|
Respond in JSON format with issues array.`,
|
|
90
|
-
'data-integrity': `You are a data integrity expert reviewing code changes.
|
|
91
|
-
Identify data integrity issues including:
|
|
92
|
-
- Missing validations
|
|
93
|
-
- Race conditions
|
|
94
|
-
- Inconsistent state handling
|
|
95
|
-
- Missing error handling
|
|
96
|
-
- Data loss scenarios
|
|
97
|
-
|
|
90
|
+
'data-integrity': `You are a data integrity expert reviewing code changes.
|
|
91
|
+
Identify data integrity issues including:
|
|
92
|
+
- Missing validations
|
|
93
|
+
- Race conditions
|
|
94
|
+
- Inconsistent state handling
|
|
95
|
+
- Missing error handling
|
|
96
|
+
- Data loss scenarios
|
|
97
|
+
|
|
98
98
|
Respond in JSON format with issues array.`,
|
|
99
|
-
'test-coverage': `You are a testing expert reviewing code changes.
|
|
100
|
-
Identify missing test coverage including:
|
|
101
|
-
- Untested edge cases
|
|
102
|
-
- Missing error case tests
|
|
103
|
-
- Missing integration tests
|
|
104
|
-
- Untested business logic
|
|
105
|
-
|
|
99
|
+
'test-coverage': `You are a testing expert reviewing code changes.
|
|
100
|
+
Identify missing test coverage including:
|
|
101
|
+
- Untested edge cases
|
|
102
|
+
- Missing error case tests
|
|
103
|
+
- Missing integration tests
|
|
104
|
+
- Untested business logic
|
|
105
|
+
|
|
106
106
|
Respond in JSON format with issues array.`,
|
|
107
|
-
general: `You are a senior code reviewer.
|
|
108
|
-
Review this code for any issues including security, performance, maintainability, and best practices.
|
|
109
|
-
|
|
107
|
+
general: `You are a senior code reviewer.
|
|
108
|
+
Review this code for any issues including security, performance, maintainability, and best practices.
|
|
109
|
+
|
|
110
110
|
Respond in JSON format with issues array.`,
|
|
111
111
|
};
|
|
112
112
|
// ============================================================================
|
|
@@ -202,15 +202,15 @@ function selectBestDescription(issues) {
|
|
|
202
202
|
async function reviewWithGPT(reviewType, code, context) {
|
|
203
203
|
const startTime = Date.now();
|
|
204
204
|
try {
|
|
205
|
-
const prompt = `${REVIEW_PROMPTS[reviewType]}
|
|
206
|
-
|
|
207
|
-
Context: ${context || 'Code review'}
|
|
208
|
-
|
|
209
|
-
Code to review:
|
|
210
|
-
\`\`\`
|
|
211
|
-
${code}
|
|
212
|
-
\`\`\`
|
|
213
|
-
|
|
205
|
+
const prompt = `${REVIEW_PROMPTS[reviewType]}
|
|
206
|
+
|
|
207
|
+
Context: ${context || 'Code review'}
|
|
208
|
+
|
|
209
|
+
Code to review:
|
|
210
|
+
\`\`\`
|
|
211
|
+
${code}
|
|
212
|
+
\`\`\`
|
|
213
|
+
|
|
214
214
|
Respond with JSON only.`;
|
|
215
215
|
const response = await gptApi.ask(prompt, {
|
|
216
216
|
model: 'gpt-5.3-codex',
|
|
@@ -238,15 +238,15 @@ Respond with JSON only.`;
|
|
|
238
238
|
async function reviewWithGemini(reviewType, code, context) {
|
|
239
239
|
const startTime = Date.now();
|
|
240
240
|
try {
|
|
241
|
-
const prompt = `${REVIEW_PROMPTS[reviewType]}
|
|
242
|
-
|
|
243
|
-
Context: ${context || 'Code review'}
|
|
244
|
-
|
|
245
|
-
Code to review:
|
|
246
|
-
\`\`\`
|
|
247
|
-
${code}
|
|
248
|
-
\`\`\`
|
|
249
|
-
|
|
241
|
+
const prompt = `${REVIEW_PROMPTS[reviewType]}
|
|
242
|
+
|
|
243
|
+
Context: ${context || 'Code review'}
|
|
244
|
+
|
|
245
|
+
Code to review:
|
|
246
|
+
\`\`\`
|
|
247
|
+
${code}
|
|
248
|
+
\`\`\`
|
|
249
|
+
|
|
250
250
|
Respond with JSON only.`;
|
|
251
251
|
const response = await geminiApi.ask(prompt, {
|
|
252
252
|
model: 'gemini-flash',
|