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.
- 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 +164 -145
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +247 -125
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +83 -80
- 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 +53 -44
- package/src/monitoring/incident-manager.js +123 -103
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +82 -59
- package/src/monitoring/quality-dashboard.js +51 -39
- package/src/monitoring/release-manager.js +70 -50
- 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
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
|
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
|
|
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,
|
|
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
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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 =
|
|
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
|
};
|