musubi-sdd 5.0.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.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +164 -145
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +247 -125
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +83 -80
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +53 -44
  87. package/src/monitoring/incident-manager.js +123 -103
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +82 -59
  90. package/src/monitoring/quality-dashboard.js +51 -39
  91. package/src/monitoring/release-manager.js +70 -50
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. 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 = this.templates[language]?.[templateKey] || this.templates.javascript[templateKey];
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, language) {
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(/{beforeEach}/g, `let instance;\n \n beforeEach(() => {\n instance = new ${testSubject}();\n });`)
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, language) {
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, language) {
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, language) {
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.map(m => `/**
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
- }`).join('\n \n ');
545
+ }`
546
+ )
547
+ .join('\n \n ');
543
548
  }
544
-
549
+
545
550
  /**
546
551
  * Generate test cases
547
552
  * @private
548
553
  */
549
- generateTestCases(subject) {
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].split(/[,\s]+/).filter(p => p && !['and', 'or', 'a', 'an'].includes(p));
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, language) {
639
- const indent = this.useTabs ? '\t' : ' '.repeat(this.indentSize);
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.split('\n').map(line => line.trimEnd()).join('\n');
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
  };