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.
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 +158 -146
  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 +241 -126
  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 +77 -81
  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 +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  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
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * MUSUBI Schema Generator
3
- *
3
+ *
4
4
  * Generates JSON Schema from various sources including
5
5
  * JavaScript functions, TypeScript types, and JSDoc comments.
6
- *
6
+ *
7
7
  * @module agents/schema-generator
8
8
  */
9
9
 
10
10
  const fs = require('fs');
11
- const path = require('path');
11
+ const _path = require('path');
12
12
 
13
13
  /**
14
14
  * @typedef {Object} SchemaGeneratorOptions
@@ -29,7 +29,7 @@ class SchemaGenerator {
29
29
  this.includeExamples = options.includeExamples ?? true;
30
30
  this.defaultType = options.defaultType ?? 'string';
31
31
  }
32
-
32
+
33
33
  /**
34
34
  * Generate schema from a function
35
35
  * @param {Function} fn
@@ -39,10 +39,10 @@ class SchemaGenerator {
39
39
  const fnString = fn.toString();
40
40
  const params = this.extractParameters(fnString);
41
41
  const jsdoc = this.extractJSDoc(fnString);
42
-
42
+
43
43
  return this.buildSchema(params, jsdoc);
44
44
  }
45
-
45
+
46
46
  /**
47
47
  * Generate schema from JSDoc comment
48
48
  * @param {string} jsdoc
@@ -52,7 +52,7 @@ class SchemaGenerator {
52
52
  const parsed = this.parseJSDoc(jsdoc);
53
53
  return this.buildSchemaFromParsed(parsed);
54
54
  }
55
-
55
+
56
56
  /**
57
57
  * Generate schema from a class method
58
58
  * @param {Object} instance - Class instance
@@ -66,7 +66,7 @@ class SchemaGenerator {
66
66
  }
67
67
  return this.fromFunction(method.bind(instance));
68
68
  }
69
-
69
+
70
70
  /**
71
71
  * Generate schema from file (extracts functions)
72
72
  * @param {string} filePath
@@ -76,14 +76,14 @@ class SchemaGenerator {
76
76
  const content = fs.readFileSync(filePath, 'utf-8');
77
77
  const functions = this.extractFunctions(content);
78
78
  const schemas = {};
79
-
79
+
80
80
  for (const fn of functions) {
81
81
  schemas[fn.name] = this.buildSchema(fn.params, fn.jsdoc);
82
82
  }
83
-
83
+
84
84
  return schemas;
85
85
  }
86
-
86
+
87
87
  /**
88
88
  * Extract function parameters from function string
89
89
  * @param {string} fnString
@@ -93,13 +93,13 @@ class SchemaGenerator {
93
93
  // Match function parameters
94
94
  const paramMatch = fnString.match(/\(([^)]*)\)/);
95
95
  if (!paramMatch) return [];
96
-
96
+
97
97
  const paramString = paramMatch[1];
98
98
  if (!paramString.trim()) return [];
99
-
99
+
100
100
  return this.parseParameterString(paramString);
101
101
  }
102
-
102
+
103
103
  /**
104
104
  * Parse parameter string into structured format
105
105
  * @param {string} paramString
@@ -109,35 +109,35 @@ class SchemaGenerator {
109
109
  const params = [];
110
110
  let depth = 0;
111
111
  let current = '';
112
- let inDefault = false;
113
-
112
+ let _inDefault = false;
113
+
114
114
  for (const char of paramString) {
115
115
  if (char === '{' || char === '[' || char === '(') depth++;
116
116
  if (char === '}' || char === ']' || char === ')') depth--;
117
-
117
+
118
118
  if (char === '=' && depth === 0) {
119
- inDefault = true;
119
+ _inDefault = true;
120
120
  }
121
-
121
+
122
122
  if (char === ',' && depth === 0) {
123
123
  if (current.trim()) {
124
124
  params.push(this.parseParameter(current.trim()));
125
125
  }
126
126
  current = '';
127
- inDefault = false;
127
+ _inDefault = false;
128
128
  continue;
129
129
  }
130
-
130
+
131
131
  current += char;
132
132
  }
133
-
133
+
134
134
  if (current.trim()) {
135
135
  params.push(this.parseParameter(current.trim()));
136
136
  }
137
-
137
+
138
138
  return params;
139
139
  }
140
-
140
+
141
141
  /**
142
142
  * Parse a single parameter
143
143
  * @param {string} param
@@ -148,34 +148,36 @@ class SchemaGenerator {
148
148
  if (param.startsWith('{')) {
149
149
  const match = param.match(/\{([^}]+)\}/);
150
150
  if (match) {
151
- const destructured = match[1].split(',').map(p => p.trim().split(':')[0].split('=')[0].trim());
151
+ const destructured = match[1]
152
+ .split(',')
153
+ .map(p => p.trim().split(':')[0].split('=')[0].trim());
152
154
  return {
153
155
  name: 'options',
154
156
  type: 'object',
155
157
  destructured,
156
- required: !param.includes('=')
158
+ required: !param.includes('='),
157
159
  };
158
160
  }
159
161
  }
160
-
162
+
161
163
  // Handle default values
162
164
  const [nameWithType, defaultValue] = param.split('=').map(p => p.trim());
163
165
  const name = nameWithType.replace(/:\s*\w+$/, '').trim();
164
-
166
+
165
167
  // Try to infer type from default value
166
168
  let type = this.defaultType;
167
169
  if (defaultValue !== undefined) {
168
170
  type = this.inferTypeFromValue(defaultValue);
169
171
  }
170
-
172
+
171
173
  return {
172
174
  name,
173
175
  type,
174
176
  required: defaultValue === undefined,
175
- default: defaultValue ? this.parseDefaultValue(defaultValue) : undefined
177
+ default: defaultValue ? this.parseDefaultValue(defaultValue) : undefined,
176
178
  };
177
179
  }
178
-
180
+
179
181
  /**
180
182
  * Infer type from a default value string
181
183
  * @param {string} valueStr
@@ -183,7 +185,7 @@ class SchemaGenerator {
183
185
  */
184
186
  inferTypeFromValue(valueStr) {
185
187
  valueStr = valueStr.trim();
186
-
188
+
187
189
  if (valueStr === 'true' || valueStr === 'false') return 'boolean';
188
190
  if (valueStr === 'null') return 'null';
189
191
  if (valueStr === '[]' || valueStr.startsWith('[')) return 'array';
@@ -191,10 +193,10 @@ class SchemaGenerator {
191
193
  if (/^['"`]/.test(valueStr)) return 'string';
192
194
  if (/^-?\d+$/.test(valueStr)) return 'integer';
193
195
  if (/^-?\d+\.\d+$/.test(valueStr)) return 'number';
194
-
196
+
195
197
  return this.defaultType;
196
198
  }
197
-
199
+
198
200
  /**
199
201
  * Parse default value string to actual value
200
202
  * @param {string} valueStr
@@ -211,7 +213,7 @@ class SchemaGenerator {
211
213
  return valueStr;
212
214
  }
213
215
  }
214
-
216
+
215
217
  /**
216
218
  * Extract JSDoc comment from function string
217
219
  * @param {string} fnString
@@ -222,7 +224,7 @@ class SchemaGenerator {
222
224
  if (!match) return null;
223
225
  return this.parseJSDoc(match[0]);
224
226
  }
225
-
227
+
226
228
  /**
227
229
  * Parse JSDoc comment
228
230
  * @param {string} jsdoc
@@ -234,16 +236,17 @@ class SchemaGenerator {
234
236
  params: [],
235
237
  returns: null,
236
238
  example: null,
237
- throws: []
239
+ throws: [],
238
240
  };
239
-
240
- const lines = jsdoc.split('\n')
241
+
242
+ const lines = jsdoc
243
+ .split('\n')
241
244
  .map(l => l.replace(/^\s*\*\s?/, '').trim())
242
245
  .filter(l => l && !l.startsWith('/'));
243
-
246
+
244
247
  let currentTag = null;
245
248
  let buffer = [];
246
-
249
+
247
250
  for (const line of lines) {
248
251
  if (line.startsWith('@')) {
249
252
  // Process previous buffer
@@ -251,7 +254,7 @@ class SchemaGenerator {
251
254
  result.description = buffer.join(' ');
252
255
  }
253
256
  buffer = [];
254
-
257
+
255
258
  if (line.startsWith('@param')) {
256
259
  currentTag = 'param';
257
260
  const parsed = this.parseParamTag(line);
@@ -281,14 +284,14 @@ class SchemaGenerator {
281
284
  }
282
285
  }
283
286
  }
284
-
287
+
285
288
  if (currentTag === null && buffer.length) {
286
289
  result.description = buffer.join(' ');
287
290
  }
288
-
291
+
289
292
  return result;
290
293
  }
291
-
294
+
292
295
  /**
293
296
  * Parse @param tag
294
297
  * @param {string} line
@@ -297,16 +300,16 @@ class SchemaGenerator {
297
300
  parseParamTag(line) {
298
301
  const match = line.match(/@param\s+\{([^}]+)\}\s+(\[)?(\w+)(?:\])?(?:\s*-?\s*(.*))?/);
299
302
  if (!match) return null;
300
-
303
+
301
304
  const [, type, optional, name, description] = match;
302
305
  return {
303
306
  name,
304
307
  type: type.toLowerCase(),
305
308
  required: !optional,
306
- description: description || ''
309
+ description: description || '',
307
310
  };
308
311
  }
309
-
312
+
310
313
  /**
311
314
  * Build schema from extracted params and JSDoc
312
315
  * @param {Array} params
@@ -316,14 +319,14 @@ class SchemaGenerator {
316
319
  buildSchema(params, jsdoc) {
317
320
  const properties = {};
318
321
  const required = [];
319
-
322
+
320
323
  // Merge param info from function signature and JSDoc
321
324
  const paramMap = new Map();
322
-
325
+
323
326
  for (const param of params) {
324
327
  paramMap.set(param.name, { ...param });
325
328
  }
326
-
329
+
327
330
  if (jsdoc?.params) {
328
331
  for (const docParam of jsdoc.params) {
329
332
  const existing = paramMap.get(docParam.name);
@@ -331,14 +334,14 @@ class SchemaGenerator {
331
334
  Object.assign(existing, {
332
335
  type: docParam.type || existing.type,
333
336
  description: docParam.description || existing.description,
334
- required: docParam.required ?? existing.required
337
+ required: docParam.required ?? existing.required,
335
338
  });
336
339
  } else {
337
340
  paramMap.set(docParam.name, docParam);
338
341
  }
339
342
  }
340
343
  }
341
-
344
+
342
345
  // Build properties
343
346
  for (const [name, param] of paramMap) {
344
347
  if (param.destructured) {
@@ -346,7 +349,7 @@ class SchemaGenerator {
346
349
  for (const prop of param.destructured) {
347
350
  properties[prop] = {
348
351
  type: 'string',
349
- description: `Property: ${prop}`
352
+ description: `Property: ${prop}`,
350
353
  };
351
354
  }
352
355
  } else {
@@ -358,28 +361,28 @@ class SchemaGenerator {
358
361
  properties[name].default = param.default;
359
362
  }
360
363
  }
361
-
364
+
362
365
  if (param.required && !param.destructured) {
363
366
  required.push(name);
364
367
  }
365
368
  }
366
-
369
+
367
370
  const schema = {
368
371
  type: 'object',
369
- properties
372
+ properties,
370
373
  };
371
-
374
+
372
375
  if (required.length > 0) {
373
376
  schema.required = required;
374
377
  }
375
-
378
+
376
379
  if (this.strict) {
377
380
  schema.additionalProperties = false;
378
381
  }
379
-
382
+
380
383
  return schema;
381
384
  }
382
-
385
+
383
386
  /**
384
387
  * Build schema from parsed JSDoc
385
388
  * @param {Object} parsed
@@ -388,49 +391,49 @@ class SchemaGenerator {
388
391
  buildSchemaFromParsed(parsed) {
389
392
  return this.buildSchema([], parsed);
390
393
  }
391
-
394
+
392
395
  /**
393
396
  * Convert type string to JSON Schema
394
397
  * @param {string} typeStr
395
398
  * @param {Object} [param]
396
399
  * @returns {Object}
397
400
  */
398
- typeToSchema(typeStr, param = {}) {
401
+ typeToSchema(typeStr, _param = {}) {
399
402
  const type = typeStr.toLowerCase();
400
-
403
+
401
404
  // Handle array types
402
405
  if (type.endsWith('[]')) {
403
406
  const itemType = type.slice(0, -2);
404
407
  return {
405
408
  type: 'array',
406
- items: this.typeToSchema(itemType)
409
+ items: this.typeToSchema(itemType),
407
410
  };
408
411
  }
409
-
412
+
410
413
  // Handle union types
411
414
  if (type.includes('|')) {
412
415
  const types = type.split('|').map(t => this.typeToSchema(t.trim()));
413
416
  return { anyOf: types };
414
417
  }
415
-
418
+
416
419
  // Handle common types
417
420
  const typeMap = {
418
- 'string': { type: 'string' },
419
- 'number': { type: 'number' },
420
- 'integer': { type: 'integer' },
421
- 'int': { type: 'integer' },
422
- 'boolean': { type: 'boolean' },
423
- 'bool': { type: 'boolean' },
424
- 'object': { type: 'object' },
425
- 'array': { type: 'array' },
426
- 'any': { type: 'object' },
427
- 'null': { type: 'null' },
428
- '*': { type: 'object' }
421
+ string: { type: 'string' },
422
+ number: { type: 'number' },
423
+ integer: { type: 'integer' },
424
+ int: { type: 'integer' },
425
+ boolean: { type: 'boolean' },
426
+ bool: { type: 'boolean' },
427
+ object: { type: 'object' },
428
+ array: { type: 'array' },
429
+ any: { type: 'object' },
430
+ null: { type: 'null' },
431
+ '*': { type: 'object' },
429
432
  };
430
-
433
+
431
434
  return typeMap[type] || { type: 'string' };
432
435
  }
433
-
436
+
434
437
  /**
435
438
  * Extract all functions from file content
436
439
  * @param {string} content
@@ -438,35 +441,36 @@ class SchemaGenerator {
438
441
  */
439
442
  extractFunctions(content) {
440
443
  const functions = [];
441
-
444
+
442
445
  // Match function declarations with JSDoc
443
446
  const regex = /(\/\*\*[\s\S]*?\*\/)\s*(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/g;
444
447
  let match;
445
-
448
+
446
449
  while ((match = regex.exec(content)) !== null) {
447
450
  const [, jsdoc, name, params] = match;
448
451
  functions.push({
449
452
  name,
450
453
  params: this.parseParameterString(params),
451
- jsdoc: this.parseJSDoc(jsdoc)
454
+ jsdoc: this.parseJSDoc(jsdoc),
452
455
  });
453
456
  }
454
-
457
+
455
458
  // Match arrow functions with JSDoc
456
- const arrowRegex = /(\/\*\*[\s\S]*?\*\/)\s*(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?\(([^)]*)\)\s*=>/g;
457
-
459
+ const arrowRegex =
460
+ /(\/\*\*[\s\S]*?\*\/)\s*(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?\(([^)]*)\)\s*=>/g;
461
+
458
462
  while ((match = arrowRegex.exec(content)) !== null) {
459
463
  const [, jsdoc, name, params] = match;
460
464
  functions.push({
461
465
  name,
462
466
  params: this.parseParameterString(params),
463
- jsdoc: this.parseJSDoc(jsdoc)
467
+ jsdoc: this.parseJSDoc(jsdoc),
464
468
  });
465
469
  }
466
-
470
+
467
471
  return functions;
468
472
  }
469
-
473
+
470
474
  /**
471
475
  * Generate OpenAI function tool schema
472
476
  * @param {string} name
@@ -480,11 +484,11 @@ class SchemaGenerator {
480
484
  function: {
481
485
  name,
482
486
  description,
483
- parameters
484
- }
487
+ parameters,
488
+ },
485
489
  };
486
490
  }
487
-
491
+
488
492
  /**
489
493
  * Generate Anthropic tool schema
490
494
  * @param {string} name
@@ -496,7 +500,7 @@ class SchemaGenerator {
496
500
  return {
497
501
  name,
498
502
  description,
499
- input_schema: parameters
503
+ input_schema: parameters,
500
504
  };
501
505
  }
502
506
  }
@@ -510,5 +514,5 @@ function createSchemaGenerator(options = {}) {
510
514
 
511
515
  module.exports = {
512
516
  SchemaGenerator,
513
- createSchemaGenerator
517
+ createSchemaGenerator,
514
518
  };