musubi-sdd 5.1.0 → 5.6.1
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/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- package/src/validators/traceability-validator.js +7 -11
|
@@ -17,7 +17,7 @@ const GEN_MODE = {
|
|
|
17
17
|
CREATE: 'create',
|
|
18
18
|
MODIFY: 'modify',
|
|
19
19
|
EXTEND: 'extend',
|
|
20
|
-
REFACTOR: 'refactor'
|
|
20
|
+
REFACTOR: 'refactor',
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -30,7 +30,7 @@ const LANGUAGE = {
|
|
|
30
30
|
PYTHON: 'python',
|
|
31
31
|
JSON: 'json',
|
|
32
32
|
MARKDOWN: 'markdown',
|
|
33
|
-
YAML: 'yaml'
|
|
33
|
+
YAML: 'yaml',
|
|
34
34
|
};
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -134,9 +134,9 @@ describe('{testSubject}', () => {
|
|
|
134
134
|
{beforeEach}
|
|
135
135
|
|
|
136
136
|
{testCases}
|
|
137
|
-
})
|
|
137
|
+
});`,
|
|
138
138
|
},
|
|
139
|
-
|
|
139
|
+
|
|
140
140
|
typescript: {
|
|
141
141
|
interface: `/**
|
|
142
142
|
* {description}
|
|
@@ -169,9 +169,9 @@ export class {name} {
|
|
|
169
169
|
*/
|
|
170
170
|
export function {name}({paramNames}): {returnType} {
|
|
171
171
|
{body}
|
|
172
|
-
}
|
|
172
|
+
}`,
|
|
173
173
|
},
|
|
174
|
-
|
|
174
|
+
|
|
175
175
|
python: {
|
|
176
176
|
class: `"""
|
|
177
177
|
{description}
|
|
@@ -210,8 +210,8 @@ class {name}:
|
|
|
210
210
|
Returns:
|
|
211
211
|
{returnDoc}
|
|
212
212
|
"""
|
|
213
|
-
{body}
|
|
214
|
-
}
|
|
213
|
+
{body}`,
|
|
214
|
+
},
|
|
215
215
|
};
|
|
216
216
|
|
|
217
217
|
/**
|
|
@@ -225,19 +225,19 @@ class CodeGenerator extends EventEmitter {
|
|
|
225
225
|
*/
|
|
226
226
|
constructor(options = {}) {
|
|
227
227
|
super();
|
|
228
|
-
|
|
228
|
+
|
|
229
229
|
this.templates = { ...TEMPLATES, ...(options.templates || {}) };
|
|
230
230
|
this.addComments = options.addComments ?? true;
|
|
231
231
|
this.addTyping = options.addTyping ?? true;
|
|
232
232
|
this.style = options.style || 'standard';
|
|
233
233
|
this.indentSize = options.indentSize ?? 2;
|
|
234
234
|
this.useTabs = options.useTabs ?? false;
|
|
235
|
-
|
|
235
|
+
|
|
236
236
|
// State
|
|
237
237
|
this.history = [];
|
|
238
238
|
this.generationCounter = 0;
|
|
239
239
|
}
|
|
240
|
-
|
|
240
|
+
|
|
241
241
|
/**
|
|
242
242
|
* Generate code from request
|
|
243
243
|
* @param {GenerationRequest} request - Generation request
|
|
@@ -246,13 +246,13 @@ class CodeGenerator extends EventEmitter {
|
|
|
246
246
|
async generate(request) {
|
|
247
247
|
const id = this.generateId();
|
|
248
248
|
const startTime = Date.now();
|
|
249
|
-
|
|
249
|
+
|
|
250
250
|
this.emit('generation:start', { id, request });
|
|
251
|
-
|
|
251
|
+
|
|
252
252
|
try {
|
|
253
253
|
// Determine language
|
|
254
254
|
const language = request.language || this.detectLanguage(request);
|
|
255
|
-
|
|
255
|
+
|
|
256
256
|
// Select generation strategy
|
|
257
257
|
let code;
|
|
258
258
|
switch (request.mode || GEN_MODE.CREATE) {
|
|
@@ -271,10 +271,10 @@ class CodeGenerator extends EventEmitter {
|
|
|
271
271
|
default:
|
|
272
272
|
code = await this.generateNew(request, language);
|
|
273
273
|
}
|
|
274
|
-
|
|
274
|
+
|
|
275
275
|
// Apply formatting
|
|
276
276
|
code = this.format(code, language);
|
|
277
|
-
|
|
277
|
+
|
|
278
278
|
const result = {
|
|
279
279
|
id,
|
|
280
280
|
success: true,
|
|
@@ -284,18 +284,17 @@ class CodeGenerator extends EventEmitter {
|
|
|
284
284
|
metadata: {
|
|
285
285
|
mode: request.mode || GEN_MODE.CREATE,
|
|
286
286
|
duration: Date.now() - startTime,
|
|
287
|
-
linesOfCode: code.split('\n').length
|
|
287
|
+
linesOfCode: code.split('\n').length,
|
|
288
288
|
},
|
|
289
|
-
warnings: []
|
|
289
|
+
warnings: [],
|
|
290
290
|
};
|
|
291
|
-
|
|
291
|
+
|
|
292
292
|
// Store in history
|
|
293
293
|
this.history.push(result);
|
|
294
|
-
|
|
294
|
+
|
|
295
295
|
this.emit('generation:complete', { result });
|
|
296
|
-
|
|
296
|
+
|
|
297
297
|
return result;
|
|
298
|
-
|
|
299
298
|
} catch (error) {
|
|
300
299
|
const result = {
|
|
301
300
|
id,
|
|
@@ -306,24 +305,24 @@ class CodeGenerator extends EventEmitter {
|
|
|
306
305
|
metadata: {
|
|
307
306
|
mode: request.mode || GEN_MODE.CREATE,
|
|
308
307
|
duration: Date.now() - startTime,
|
|
309
|
-
error: error.message
|
|
308
|
+
error: error.message,
|
|
310
309
|
},
|
|
311
|
-
warnings: [error.message]
|
|
310
|
+
warnings: [error.message],
|
|
312
311
|
};
|
|
313
|
-
|
|
312
|
+
|
|
314
313
|
this.emit('generation:error', { id, error: error.message });
|
|
315
|
-
|
|
314
|
+
|
|
316
315
|
return result;
|
|
317
316
|
}
|
|
318
317
|
}
|
|
319
|
-
|
|
318
|
+
|
|
320
319
|
/**
|
|
321
320
|
* Generate new code
|
|
322
321
|
* @private
|
|
323
322
|
*/
|
|
324
323
|
async generateNew(request, language) {
|
|
325
324
|
const description = request.description.toLowerCase();
|
|
326
|
-
|
|
325
|
+
|
|
327
326
|
// Detect what to generate
|
|
328
327
|
if (description.includes('class')) {
|
|
329
328
|
return this.generateClass(request, language);
|
|
@@ -340,66 +339,66 @@ class CodeGenerator extends EventEmitter {
|
|
|
340
339
|
return this.generateFunction(request, language);
|
|
341
340
|
}
|
|
342
341
|
}
|
|
343
|
-
|
|
342
|
+
|
|
344
343
|
/**
|
|
345
344
|
* Generate modification code
|
|
346
345
|
* @private
|
|
347
346
|
*/
|
|
348
347
|
async generateModification(request, language) {
|
|
349
348
|
const { context } = request;
|
|
350
|
-
|
|
349
|
+
|
|
351
350
|
if (!context || !context.existingCode) {
|
|
352
351
|
throw new Error('Modification requires existing code in context');
|
|
353
352
|
}
|
|
354
|
-
|
|
353
|
+
|
|
355
354
|
// Simple modification: add or update based on description
|
|
356
355
|
let modified = context.existingCode;
|
|
357
|
-
|
|
356
|
+
|
|
358
357
|
// Add comments if requested
|
|
359
358
|
if (this.addComments && request.description.includes('document')) {
|
|
360
359
|
modified = this.addDocumentation(modified, language);
|
|
361
360
|
}
|
|
362
|
-
|
|
361
|
+
|
|
363
362
|
return modified;
|
|
364
363
|
}
|
|
365
|
-
|
|
364
|
+
|
|
366
365
|
/**
|
|
367
366
|
* Generate extension code
|
|
368
367
|
* @private
|
|
369
368
|
*/
|
|
370
369
|
async generateExtension(request, language) {
|
|
371
370
|
const { context } = request;
|
|
372
|
-
|
|
371
|
+
|
|
373
372
|
if (!context || !context.existingCode) {
|
|
374
373
|
throw new Error('Extension requires existing code in context');
|
|
375
374
|
}
|
|
376
|
-
|
|
375
|
+
|
|
377
376
|
const existing = context.existingCode;
|
|
378
377
|
const extension = await this.generateNew(request, language);
|
|
379
|
-
|
|
378
|
+
|
|
380
379
|
return `${existing}\n\n${extension}`;
|
|
381
380
|
}
|
|
382
|
-
|
|
381
|
+
|
|
383
382
|
/**
|
|
384
383
|
* Generate refactoring
|
|
385
384
|
* @private
|
|
386
385
|
*/
|
|
387
386
|
async generateRefactoring(request, language) {
|
|
388
387
|
const { context } = request;
|
|
389
|
-
|
|
388
|
+
|
|
390
389
|
if (!context || !context.existingCode) {
|
|
391
390
|
throw new Error('Refactoring requires existing code in context');
|
|
392
391
|
}
|
|
393
|
-
|
|
392
|
+
|
|
394
393
|
// Simple refactoring: improve structure
|
|
395
394
|
let refactored = context.existingCode;
|
|
396
|
-
|
|
395
|
+
|
|
397
396
|
// Add proper indentation
|
|
398
397
|
refactored = this.format(refactored, language);
|
|
399
|
-
|
|
398
|
+
|
|
400
399
|
return refactored;
|
|
401
400
|
}
|
|
402
|
-
|
|
401
|
+
|
|
403
402
|
/**
|
|
404
403
|
* Generate a class
|
|
405
404
|
* @private
|
|
@@ -407,22 +406,20 @@ class CodeGenerator extends EventEmitter {
|
|
|
407
406
|
generateClass(request, language) {
|
|
408
407
|
const className = this.extractName(request.description, 'Class');
|
|
409
408
|
const template = this.templates[language]?.class || this.templates.javascript.class;
|
|
410
|
-
|
|
409
|
+
|
|
411
410
|
let code = template
|
|
412
411
|
.replace(/{name}/g, className)
|
|
413
412
|
.replace(/{description}/g, request.description)
|
|
414
413
|
.replace(/{properties}/g, this.generateProperties(request, language))
|
|
415
414
|
.replace(/{methods}/g, this.generateMethods(request, language));
|
|
416
|
-
|
|
415
|
+
|
|
417
416
|
if (language === LANGUAGE.TYPESCRIPT) {
|
|
418
|
-
code = code
|
|
419
|
-
.replace(/{constructorParams}/g, '')
|
|
420
|
-
.replace(/{constructorBody}/g, '');
|
|
417
|
+
code = code.replace(/{constructorParams}/g, '').replace(/{constructorBody}/g, '');
|
|
421
418
|
}
|
|
422
|
-
|
|
419
|
+
|
|
423
420
|
return code;
|
|
424
421
|
}
|
|
425
|
-
|
|
422
|
+
|
|
426
423
|
/**
|
|
427
424
|
* Generate a function
|
|
428
425
|
* @private
|
|
@@ -430,12 +427,13 @@ class CodeGenerator extends EventEmitter {
|
|
|
430
427
|
generateFunction(request, language) {
|
|
431
428
|
const funcName = this.extractName(request.description, 'function');
|
|
432
429
|
const isAsync = request.description.toLowerCase().includes('async');
|
|
433
|
-
|
|
430
|
+
|
|
434
431
|
const templateKey = isAsync ? 'asyncFunction' : 'function';
|
|
435
|
-
const template =
|
|
436
|
-
|
|
432
|
+
const template =
|
|
433
|
+
this.templates[language]?.[templateKey] || this.templates.javascript[templateKey];
|
|
434
|
+
|
|
437
435
|
const params = this.extractParams(request.description);
|
|
438
|
-
|
|
436
|
+
|
|
439
437
|
let code = template
|
|
440
438
|
.replace(/{name}/g, funcName)
|
|
441
439
|
.replace(/{description}/g, request.description)
|
|
@@ -446,10 +444,10 @@ class CodeGenerator extends EventEmitter {
|
|
|
446
444
|
.replace(/{body}/g, '// TODO: Implement')
|
|
447
445
|
.replace(/{argDocs}/g, params.map(p => `${p.name}: ${p.type}`).join('\n '))
|
|
448
446
|
.replace(/{returnDoc}/g, 'Result');
|
|
449
|
-
|
|
447
|
+
|
|
450
448
|
return code;
|
|
451
449
|
}
|
|
452
|
-
|
|
450
|
+
|
|
453
451
|
/**
|
|
454
452
|
* Generate an interface (TypeScript)
|
|
455
453
|
* @private
|
|
@@ -458,42 +456,45 @@ class CodeGenerator extends EventEmitter {
|
|
|
458
456
|
if (language !== LANGUAGE.TYPESCRIPT) {
|
|
459
457
|
throw new Error('Interfaces are only supported in TypeScript');
|
|
460
458
|
}
|
|
461
|
-
|
|
459
|
+
|
|
462
460
|
const interfaceName = this.extractName(request.description, 'Interface');
|
|
463
461
|
const template = this.templates.typescript.interface;
|
|
464
|
-
|
|
462
|
+
|
|
465
463
|
return template
|
|
466
464
|
.replace(/{name}/g, interfaceName)
|
|
467
465
|
.replace(/{description}/g, request.description)
|
|
468
466
|
.replace(/{properties}/g, ' // TODO: Add properties');
|
|
469
467
|
}
|
|
470
|
-
|
|
468
|
+
|
|
471
469
|
/**
|
|
472
470
|
* Generate test code
|
|
473
471
|
* @private
|
|
474
472
|
*/
|
|
475
|
-
generateTest(request,
|
|
473
|
+
generateTest(request, _language) {
|
|
476
474
|
const template = this.templates.javascript.test;
|
|
477
475
|
const testSubject = this.extractName(request.description, 'Subject');
|
|
478
476
|
const fileName = request.filePath ? path.basename(request.filePath) : 'test.test.js';
|
|
479
|
-
|
|
477
|
+
|
|
480
478
|
return template
|
|
481
479
|
.replace(/{filename}/g, fileName)
|
|
482
480
|
.replace(/{testSubject}/g, testSubject)
|
|
483
481
|
.replace(/{imports}/g, testSubject)
|
|
484
482
|
.replace(/{importPath}/g, `./${testSubject.toLowerCase()}`)
|
|
485
|
-
.replace(
|
|
483
|
+
.replace(
|
|
484
|
+
/{beforeEach}/g,
|
|
485
|
+
`let instance;\n \n beforeEach(() => {\n instance = new ${testSubject}();\n });`
|
|
486
|
+
)
|
|
486
487
|
.replace(/{testCases}/g, this.generateTestCases(testSubject));
|
|
487
488
|
}
|
|
488
|
-
|
|
489
|
+
|
|
489
490
|
/**
|
|
490
491
|
* Generate module code
|
|
491
492
|
* @private
|
|
492
493
|
*/
|
|
493
|
-
generateModule(request,
|
|
494
|
+
generateModule(request, _language) {
|
|
494
495
|
const template = this.templates.javascript.module;
|
|
495
496
|
const fileName = request.filePath ? path.basename(request.filePath) : 'module.js';
|
|
496
|
-
|
|
497
|
+
|
|
497
498
|
return template
|
|
498
499
|
.replace(/{filename}/g, fileName)
|
|
499
500
|
.replace(/{description}/g, request.description)
|
|
@@ -501,30 +502,30 @@ class CodeGenerator extends EventEmitter {
|
|
|
501
502
|
.replace(/{body}/g, '// TODO: Implement module')
|
|
502
503
|
.replace(/{exports}/g, '');
|
|
503
504
|
}
|
|
504
|
-
|
|
505
|
+
|
|
505
506
|
/**
|
|
506
507
|
* Generate class properties
|
|
507
508
|
* @private
|
|
508
509
|
*/
|
|
509
|
-
generateProperties(request,
|
|
510
|
+
generateProperties(request, _language) {
|
|
510
511
|
const constraints = request.constraints || {};
|
|
511
512
|
const props = constraints.properties || [];
|
|
512
|
-
|
|
513
|
+
|
|
513
514
|
if (props.length === 0) {
|
|
514
515
|
return 'this.options = options;';
|
|
515
516
|
}
|
|
516
|
-
|
|
517
|
+
|
|
517
518
|
return props.map(p => `this.${p} = options.${p};`).join('\n ');
|
|
518
519
|
}
|
|
519
|
-
|
|
520
|
+
|
|
520
521
|
/**
|
|
521
522
|
* Generate class methods
|
|
522
523
|
* @private
|
|
523
524
|
*/
|
|
524
|
-
generateMethods(request,
|
|
525
|
+
generateMethods(request, _language) {
|
|
525
526
|
const constraints = request.constraints || {};
|
|
526
527
|
const methods = constraints.methods || [];
|
|
527
|
-
|
|
528
|
+
|
|
528
529
|
if (methods.length === 0) {
|
|
529
530
|
return `/**
|
|
530
531
|
* Main method
|
|
@@ -533,20 +534,24 @@ class CodeGenerator extends EventEmitter {
|
|
|
533
534
|
// TODO: Implement
|
|
534
535
|
}`;
|
|
535
536
|
}
|
|
536
|
-
|
|
537
|
-
return methods
|
|
537
|
+
|
|
538
|
+
return methods
|
|
539
|
+
.map(
|
|
540
|
+
m => `/**
|
|
538
541
|
* ${m.description || m.name}
|
|
539
542
|
*/
|
|
540
543
|
${m.name}() {
|
|
541
544
|
// TODO: Implement
|
|
542
|
-
}`
|
|
545
|
+
}`
|
|
546
|
+
)
|
|
547
|
+
.join('\n \n ');
|
|
543
548
|
}
|
|
544
|
-
|
|
549
|
+
|
|
545
550
|
/**
|
|
546
551
|
* Generate test cases
|
|
547
552
|
* @private
|
|
548
553
|
*/
|
|
549
|
-
generateTestCases(
|
|
554
|
+
generateTestCases(_subject) {
|
|
550
555
|
return `describe('constructor', () => {
|
|
551
556
|
it('should create instance', () => {
|
|
552
557
|
expect(instance).toBeDefined();
|
|
@@ -559,7 +564,7 @@ class CodeGenerator extends EventEmitter {
|
|
|
559
564
|
});
|
|
560
565
|
});`;
|
|
561
566
|
}
|
|
562
|
-
|
|
567
|
+
|
|
563
568
|
/**
|
|
564
569
|
* Extract name from description
|
|
565
570
|
* @private
|
|
@@ -568,42 +573,44 @@ class CodeGenerator extends EventEmitter {
|
|
|
568
573
|
// Look for quoted names
|
|
569
574
|
const quotedMatch = description.match(/['"]([^'"]+)['"]/);
|
|
570
575
|
if (quotedMatch) return quotedMatch[1];
|
|
571
|
-
|
|
576
|
+
|
|
572
577
|
// Look for "called X" or "named X"
|
|
573
578
|
const namedMatch = description.match(/(?:called|named)\s+([a-zA-Z_][a-zA-Z0-9_]*)/i);
|
|
574
579
|
if (namedMatch) return namedMatch[1];
|
|
575
|
-
|
|
580
|
+
|
|
576
581
|
// Look for capitalized word after "a" or "an"
|
|
577
582
|
const articleMatch = description.match(/(?:a|an)\s+([A-Z][a-zA-Z0-9_]*)/);
|
|
578
583
|
if (articleMatch) return articleMatch[1];
|
|
579
|
-
|
|
584
|
+
|
|
580
585
|
return defaultName;
|
|
581
586
|
}
|
|
582
|
-
|
|
587
|
+
|
|
583
588
|
/**
|
|
584
589
|
* Extract parameters from description
|
|
585
590
|
* @private
|
|
586
591
|
*/
|
|
587
592
|
extractParams(description) {
|
|
588
593
|
const params = [];
|
|
589
|
-
|
|
594
|
+
|
|
590
595
|
// Look for "with parameters X, Y, Z"
|
|
591
596
|
const paramMatch = description.match(/(?:with\s+)?param(?:eter)?s?\s+([^.]+)/i);
|
|
592
597
|
if (paramMatch) {
|
|
593
598
|
const paramList = paramMatch[1].split(/[,\s]+/).filter(p => p && !['and', 'or'].includes(p));
|
|
594
599
|
params.push(...paramList.map(name => ({ name, type: 'any' })));
|
|
595
600
|
}
|
|
596
|
-
|
|
601
|
+
|
|
597
602
|
// Look for "takes X and Y"
|
|
598
603
|
const takesMatch = description.match(/takes\s+([^.]+)/i);
|
|
599
604
|
if (takesMatch && params.length === 0) {
|
|
600
|
-
const paramList = takesMatch[1]
|
|
605
|
+
const paramList = takesMatch[1]
|
|
606
|
+
.split(/[,\s]+/)
|
|
607
|
+
.filter(p => p && !['and', 'or', 'a', 'an'].includes(p));
|
|
601
608
|
params.push(...paramList.map(name => ({ name, type: 'any' })));
|
|
602
609
|
}
|
|
603
|
-
|
|
610
|
+
|
|
604
611
|
return params;
|
|
605
612
|
}
|
|
606
|
-
|
|
613
|
+
|
|
607
614
|
/**
|
|
608
615
|
* Detect language from request
|
|
609
616
|
* @private
|
|
@@ -618,38 +625,41 @@ class CodeGenerator extends EventEmitter {
|
|
|
618
625
|
'.json': LANGUAGE.JSON,
|
|
619
626
|
'.md': LANGUAGE.MARKDOWN,
|
|
620
627
|
'.yaml': LANGUAGE.YAML,
|
|
621
|
-
'.yml': LANGUAGE.YAML
|
|
628
|
+
'.yml': LANGUAGE.YAML,
|
|
622
629
|
};
|
|
623
630
|
return langMap[ext] || LANGUAGE.JAVASCRIPT;
|
|
624
631
|
}
|
|
625
|
-
|
|
632
|
+
|
|
626
633
|
// Check description for language hints
|
|
627
634
|
const desc = request.description.toLowerCase();
|
|
628
635
|
if (desc.includes('typescript') || desc.includes('ts')) return LANGUAGE.TYPESCRIPT;
|
|
629
636
|
if (desc.includes('python') || desc.includes('py')) return LANGUAGE.PYTHON;
|
|
630
|
-
|
|
637
|
+
|
|
631
638
|
return LANGUAGE.JAVASCRIPT;
|
|
632
639
|
}
|
|
633
|
-
|
|
640
|
+
|
|
634
641
|
/**
|
|
635
642
|
* Format code
|
|
636
643
|
* @private
|
|
637
644
|
*/
|
|
638
|
-
format(code,
|
|
639
|
-
const
|
|
640
|
-
|
|
645
|
+
format(code, _language) {
|
|
646
|
+
const _indent = this.useTabs ? '\t' : ' '.repeat(this.indentSize);
|
|
647
|
+
|
|
641
648
|
// Normalize line endings
|
|
642
649
|
code = code.replace(/\r\n/g, '\n');
|
|
643
|
-
|
|
650
|
+
|
|
644
651
|
// Remove trailing whitespace
|
|
645
|
-
code = code
|
|
646
|
-
|
|
652
|
+
code = code
|
|
653
|
+
.split('\n')
|
|
654
|
+
.map(line => line.trimEnd())
|
|
655
|
+
.join('\n');
|
|
656
|
+
|
|
647
657
|
// Ensure single newline at end
|
|
648
658
|
code = code.trimEnd() + '\n';
|
|
649
|
-
|
|
659
|
+
|
|
650
660
|
return code;
|
|
651
661
|
}
|
|
652
|
-
|
|
662
|
+
|
|
653
663
|
/**
|
|
654
664
|
* Add documentation to code
|
|
655
665
|
* @private
|
|
@@ -665,10 +675,10 @@ class CodeGenerator extends EventEmitter {
|
|
|
665
675
|
code = '# Auto-documented code\n' + code;
|
|
666
676
|
}
|
|
667
677
|
}
|
|
668
|
-
|
|
678
|
+
|
|
669
679
|
return code;
|
|
670
680
|
}
|
|
671
|
-
|
|
681
|
+
|
|
672
682
|
/**
|
|
673
683
|
* Generate unique ID
|
|
674
684
|
* @private
|
|
@@ -676,7 +686,7 @@ class CodeGenerator extends EventEmitter {
|
|
|
676
686
|
generateId() {
|
|
677
687
|
return `gen-${++this.generationCounter}-${Date.now().toString(36)}`;
|
|
678
688
|
}
|
|
679
|
-
|
|
689
|
+
|
|
680
690
|
/**
|
|
681
691
|
* Get generation history
|
|
682
692
|
* @param {number} [count] - Number of items to return
|
|
@@ -688,14 +698,14 @@ class CodeGenerator extends EventEmitter {
|
|
|
688
698
|
}
|
|
689
699
|
return [...this.history];
|
|
690
700
|
}
|
|
691
|
-
|
|
701
|
+
|
|
692
702
|
/**
|
|
693
703
|
* Clear history
|
|
694
704
|
*/
|
|
695
705
|
clearHistory() {
|
|
696
706
|
this.history = [];
|
|
697
707
|
}
|
|
698
|
-
|
|
708
|
+
|
|
699
709
|
/**
|
|
700
710
|
* Get statistics
|
|
701
711
|
* @returns {Object}
|
|
@@ -705,13 +715,13 @@ class CodeGenerator extends EventEmitter {
|
|
|
705
715
|
const byLanguage = {};
|
|
706
716
|
const byMode = {};
|
|
707
717
|
let totalLines = 0;
|
|
708
|
-
|
|
718
|
+
|
|
709
719
|
for (const result of this.history) {
|
|
710
720
|
byLanguage[result.language] = (byLanguage[result.language] || 0) + 1;
|
|
711
721
|
byMode[result.metadata.mode] = (byMode[result.metadata.mode] || 0) + 1;
|
|
712
722
|
totalLines += result.metadata.linesOfCode || 0;
|
|
713
723
|
}
|
|
714
|
-
|
|
724
|
+
|
|
715
725
|
return {
|
|
716
726
|
totalGenerations: this.history.length,
|
|
717
727
|
successful,
|
|
@@ -719,10 +729,10 @@ class CodeGenerator extends EventEmitter {
|
|
|
719
729
|
successRate: this.history.length > 0 ? successful / this.history.length : 0,
|
|
720
730
|
byLanguage,
|
|
721
731
|
byMode,
|
|
722
|
-
totalLinesGenerated: totalLines
|
|
732
|
+
totalLinesGenerated: totalLines,
|
|
723
733
|
};
|
|
724
734
|
}
|
|
725
|
-
|
|
735
|
+
|
|
726
736
|
/**
|
|
727
737
|
* Add custom template
|
|
728
738
|
* @param {string} language - Language
|
|
@@ -763,5 +773,5 @@ module.exports = {
|
|
|
763
773
|
generateCode,
|
|
764
774
|
GEN_MODE,
|
|
765
775
|
LANGUAGE,
|
|
766
|
-
TEMPLATES
|
|
776
|
+
TEMPLATES,
|
|
767
777
|
};
|