feihong-code 0.2.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/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- package/.github/ISSUE_TEMPLATE/config.yml +14 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
- package/.github/SECURITY.md +67 -0
- package/.github/workflows/ci.yml +140 -0
- package/AGENT-GUIDE.md +237 -0
- package/CHANGELOG.md +73 -0
- package/CODE_OF_CONDUCT.md +56 -0
- package/CONTRIBUTING.md +68 -0
- package/LICENSE +22 -0
- package/README.md +500 -0
- package/dist/agent/code-review.js +115 -0
- package/dist/agent/code-review.js.map +1 -0
- package/dist/agent/code-writer.js +227 -0
- package/dist/agent/code-writer.js.map +1 -0
- package/dist/agent/context-compactor.js +108 -0
- package/dist/agent/context-compactor.js.map +1 -0
- package/dist/agent/experience.js +190 -0
- package/dist/agent/experience.js.map +1 -0
- package/dist/agent/orchestrator.js +212 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/parallel-orchestrator.js +94 -0
- package/dist/agent/parallel-orchestrator.js.map +1 -0
- package/dist/agent/planner.js +53 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/prompts.js +26 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/quality-gate.js +143 -0
- package/dist/agent/quality-gate.js.map +1 -0
- package/dist/agent/repo-reader.js +384 -0
- package/dist/agent/repo-reader.js.map +1 -0
- package/dist/agent/repo-underwriter.js +132 -0
- package/dist/agent/repo-underwriter.js.map +1 -0
- package/dist/agent/self-heal.js +134 -0
- package/dist/agent/self-heal.js.map +1 -0
- package/dist/agent/self-improver.js +148 -0
- package/dist/agent/self-improver.js.map +1 -0
- package/dist/agent/subagent.js +75 -0
- package/dist/agent/subagent.js.map +1 -0
- package/dist/agent/swe-agent.js +162 -0
- package/dist/agent/swe-agent.js.map +1 -0
- package/dist/agent/swe-planner.js +155 -0
- package/dist/agent/swe-planner.js.map +1 -0
- package/dist/agent/swe-verifier.js +113 -0
- package/dist/agent/swe-verifier.js.map +1 -0
- package/dist/cli/commands.js +167 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.js +179 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.js +67 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.js +762 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/enterprise/audit.js +294 -0
- package/dist/enterprise/audit.js.map +1 -0
- package/dist/enterprise/guard.js +58 -0
- package/dist/enterprise/guard.js.map +1 -0
- package/dist/enterprise/index.js +99 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/policy.js +242 -0
- package/dist/enterprise/policy.js.map +1 -0
- package/dist/enterprise/quota.js +58 -0
- package/dist/enterprise/quota.js.map +1 -0
- package/dist/enterprise/tenant.js +143 -0
- package/dist/enterprise/tenant.js.map +1 -0
- package/dist/models/cost.js +13 -0
- package/dist/models/cost.js.map +1 -0
- package/dist/models/model-router.js +170 -0
- package/dist/models/model-router.js.map +1 -0
- package/dist/models/model.dto.js +61 -0
- package/dist/models/model.dto.js.map +1 -0
- package/dist/models/model.interface.js +3 -0
- package/dist/models/model.interface.js.map +1 -0
- package/dist/models/providers/mock.provider.js +35 -0
- package/dist/models/providers/mock.provider.js.map +1 -0
- package/dist/models/providers/ollama.provider.js +88 -0
- package/dist/models/providers/ollama.provider.js.map +1 -0
- package/dist/models/providers/openai-compatible.provider.js +106 -0
- package/dist/models/providers/openai-compatible.provider.js.map +1 -0
- package/dist/runtime/event-log.js +42 -0
- package/dist/runtime/event-log.js.map +1 -0
- package/dist/runtime/git.js +106 -0
- package/dist/runtime/git.js.map +1 -0
- package/dist/runtime/session-persist.js +60 -0
- package/dist/runtime/session-persist.js.map +1 -0
- package/dist/runtime/session-store.js +34 -0
- package/dist/runtime/session-store.js.map +1 -0
- package/dist/runtime/worktree.js +117 -0
- package/dist/runtime/worktree.js.map +1 -0
- package/dist/shared/config.js +184 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/errors.js +66 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.js +51 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/types.js +9 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/skills/goal.js +60 -0
- package/dist/skills/goal.js.map +1 -0
- package/dist/skills/grill.js +129 -0
- package/dist/skills/grill.js.map +1 -0
- package/dist/skills/plan.js +40 -0
- package/dist/skills/plan.js.map +1 -0
- package/dist/tools/analysis/code-analyzer.js +136 -0
- package/dist/tools/analysis/code-analyzer.js.map +1 -0
- package/dist/tools/file/edit.tool.js +43 -0
- package/dist/tools/file/edit.tool.js.map +1 -0
- package/dist/tools/file/list.tool.js +36 -0
- package/dist/tools/file/list.tool.js.map +1 -0
- package/dist/tools/file/read.tool.js +34 -0
- package/dist/tools/file/read.tool.js.map +1 -0
- package/dist/tools/file/write.tool.js +39 -0
- package/dist/tools/file/write.tool.js.map +1 -0
- package/dist/tools/generator/code-generator.js +119 -0
- package/dist/tools/generator/code-generator.js.map +1 -0
- package/dist/tools/generator/test-generator.js +65 -0
- package/dist/tools/generator/test-generator.js.map +1 -0
- package/dist/tools/index.js +53 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/safe-path.js +36 -0
- package/dist/tools/safe-path.js.map +1 -0
- package/dist/tools/search/grep.tool.js +81 -0
- package/dist/tools/search/grep.tool.js.map +1 -0
- package/dist/tools/shell/exec.js +50 -0
- package/dist/tools/shell/exec.js.map +1 -0
- package/dist/tools/shell/run-shell.tool.js +49 -0
- package/dist/tools/shell/run-shell.tool.js.map +1 -0
- package/dist/tools/tool.interface.js +8 -0
- package/dist/tools/tool.interface.js.map +1 -0
- package/dist/tools/tool.registry.js +75 -0
- package/dist/tools/tool.registry.js.map +1 -0
- package/dist/tools/verify/build-check.tool.js +37 -0
- package/dist/tools/verify/build-check.tool.js.map +1 -0
- package/dist/tools/verify/test-run.tool.js +37 -0
- package/dist/tools/verify/test-run.tool.js.map +1 -0
- package/dist/web/auth.js +25 -0
- package/dist/web/auth.js.map +1 -0
- package/dist/web/public/index.html +39 -0
- package/dist/web/server.js +60 -0
- package/dist/web/server.js.map +1 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
- package/docs//344/274/201/344/270/232/351/203/250/347/275/262/344/270/216/345/220/210/350/247/204.md +267 -0
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
- package/docs//345/270/270/350/247/201/351/227/256/351/242/230/344/270/216/346/225/205/351/232/234/346/216/222/346/237/245.md +130 -0
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
- package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
- package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
- package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
- package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
- package/package.json +83 -0
- package/tool-schema.json +127 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grill.js","sourceRoot":"","sources":["../../src/skills/grill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runPlan = runPlan;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* /plan 技能:把目标转化为结构化实现计划(仅规划,不执行变更)。
|
|
9
|
+
* 离线用规则生成;联调时可由模型产出更细致的方案。
|
|
10
|
+
*/
|
|
11
|
+
const planner_1 = require("../agent/planner");
|
|
12
|
+
function runPlan(goal) {
|
|
13
|
+
const tasks = (0, planner_1.decomposeGoal)(goal);
|
|
14
|
+
const items = tasks.map((t, i) => ({
|
|
15
|
+
step: i + 1,
|
|
16
|
+
action: t.goal,
|
|
17
|
+
target: inferTarget(t.goal),
|
|
18
|
+
risk: inferRisk(t.goal),
|
|
19
|
+
}));
|
|
20
|
+
return {
|
|
21
|
+
goal,
|
|
22
|
+
items: items.length ? items : [{ step: 1, action: goal, risk: '目标过于笼统,建议拆分' }],
|
|
23
|
+
estimatedWorktrees: Math.max(1, items.length),
|
|
24
|
+
note: '本计划为只读输出,未对代码库做任何修改。确认后可用 --parallel 并行执行。',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function inferTarget(text) {
|
|
28
|
+
const m = text.match(/(?:文件|模块|函数|类|组件|配置|接口|表)\s*[`'"']?([\w./-]+)/);
|
|
29
|
+
return m ? m[1] : '(待勘察确定)';
|
|
30
|
+
}
|
|
31
|
+
function inferRisk(text) {
|
|
32
|
+
if (/删除|移除|重构|迁移|重命名/.test(text))
|
|
33
|
+
return '破坏性操作,需先备份/评审';
|
|
34
|
+
if (/权限|密钥|token|密码|凭证/.test(text))
|
|
35
|
+
return '涉及敏感信息,需脱敏与最小权限';
|
|
36
|
+
if (/并发|并行|性能|压测/.test(text))
|
|
37
|
+
return '需关注回归与资源占用';
|
|
38
|
+
return '低风险,常规变更';
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/skills/plan.ts"],"names":[],"mappings":";;AAuBA,0BAgBC;AAvCD;;;;;;GAMG;AACH,8CAAiD;AAgBjD,SAAgB,OAAO,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,IAAI,CAAC,CAAC;IAElC,MAAM,KAAK,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,CAAC,GAAG,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,IAAI;QACd,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3B,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;KACxB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC9E,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;QAC7C,IAAI,EAAE,4CAA4C;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,CAAC;IACzD,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,iBAAiB,CAAC;IAC7D,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeFile = analyzeFile;
|
|
4
|
+
exports.analyzeDirectory = analyzeDirectory;
|
|
5
|
+
exports.analyzeDependencies = analyzeDependencies;
|
|
6
|
+
exports.generateReport = generateReport;
|
|
7
|
+
/**
|
|
8
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
9
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
10
|
+
*
|
|
11
|
+
* 智能代码分析器(M7):
|
|
12
|
+
* - 静态代码分析:复杂度、潜在 Bug、代码异味
|
|
13
|
+
* - 代码风格检查:命名规范、import 顺序、注释覆盖率
|
|
14
|
+
* - 依赖分析:package.json 依赖关系、版本冲突
|
|
15
|
+
*/
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path_1 = require("path");
|
|
18
|
+
/** 分析单文件 */
|
|
19
|
+
function analyzeFile(filePath, content) {
|
|
20
|
+
const lines = content.split('\n');
|
|
21
|
+
const issues = [];
|
|
22
|
+
const suggestions = [];
|
|
23
|
+
// 基础指标
|
|
24
|
+
const funcRegex = /\b(function|const\s+\w+\s*=\s*(async\s+)?\(|class\s+\w+)/g;
|
|
25
|
+
const functions = (content.match(funcRegex) || []).length;
|
|
26
|
+
// 复杂度估算
|
|
27
|
+
const complexity = ((content.match(/\bif\b/g) || []).length +
|
|
28
|
+
(content.match(/\bfor\b/g) || []).length +
|
|
29
|
+
(content.match(/\bwhile\b/g) || []).length +
|
|
30
|
+
(content.match(/\bswitch\b/g) || []).length +
|
|
31
|
+
(content.match(/\bcatch\b/g) || []).length) || 1;
|
|
32
|
+
// Bug 检测:未使用变量
|
|
33
|
+
const varRegex = /\b(const|let|var)\s+(\w+)\s*=/g;
|
|
34
|
+
const declaredVars = new Set();
|
|
35
|
+
let match;
|
|
36
|
+
while ((match = varRegex.exec(content)) !== null) {
|
|
37
|
+
declaredVars.add(match[2]);
|
|
38
|
+
}
|
|
39
|
+
for (const v of declaredVars) {
|
|
40
|
+
const uses = (content.match(new RegExp(`\\b${v}\\b`, 'g')) || []).length;
|
|
41
|
+
if (uses === 1) {
|
|
42
|
+
issues.push({ type: 'bug', severity: 'medium', message: `变量 \`${v}\` 可能未使用`, suggestion: '检查是否需要删除或正确使用' });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Bug 检测:空值风险
|
|
46
|
+
if (content.match(/!\./g)?.length) {
|
|
47
|
+
issues.push({ type: 'bug', severity: 'high', message: '检测到非空断言 (!.)', suggestion: '使用可选链 (?.) 替代' });
|
|
48
|
+
}
|
|
49
|
+
// Security:硬编码敏感字符串
|
|
50
|
+
if (content.match(/['"`](password|secret|key|token)[^'"`]*['"`]/gi)?.length) {
|
|
51
|
+
issues.push({ type: 'security', severity: 'high', message: '检测到可能硬编码的敏感字符串', suggestion: '使用环境变量管理敏感信息' });
|
|
52
|
+
}
|
|
53
|
+
// Style:console.log 残留
|
|
54
|
+
const consoleLogs = (content.match(/console\.(log|warn|error)\(/g) || []).length;
|
|
55
|
+
if (consoleLogs > 0) {
|
|
56
|
+
issues.push({ type: 'style', severity: 'low', message: `检测到 ${consoleLogs} 处 console 输出`, suggestion: '生产环境应移除' });
|
|
57
|
+
}
|
|
58
|
+
// TODO/FIXME
|
|
59
|
+
const todos = (content.match(/\/\/\s*(TODO|FIXME)/gi) || []).length;
|
|
60
|
+
if (todos > 0) {
|
|
61
|
+
suggestions.push({ category: '技术债务', description: `发现 ${todos} 处 TODO/FIXME`, impact: 'medium' });
|
|
62
|
+
}
|
|
63
|
+
// 注释覆盖率
|
|
64
|
+
const commentLines = content.split('\n').filter(l => l.trim().startsWith('//') || l.trim().startsWith('*')).length;
|
|
65
|
+
const commentRatio = lines.length > 0 ? Math.round(commentLines / lines.length * 100) : 0;
|
|
66
|
+
return {
|
|
67
|
+
file: filePath,
|
|
68
|
+
metrics: { lines: lines.length, functions, complexity, commentRatio },
|
|
69
|
+
issues,
|
|
70
|
+
suggestions,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** 分析目录 */
|
|
74
|
+
function analyzeDirectory(dirPath, maxFiles = 50) {
|
|
75
|
+
const results = [];
|
|
76
|
+
if (!(0, fs_1.existsSync)(dirPath))
|
|
77
|
+
return results;
|
|
78
|
+
const search = (dir, count) => {
|
|
79
|
+
if (count >= maxFiles)
|
|
80
|
+
return [];
|
|
81
|
+
const entries = (0, fs_1.readdirSync)(dir);
|
|
82
|
+
const files = [];
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
const fullPath = (0, path_1.join)(dir, entry);
|
|
85
|
+
const stat = (0, fs_1.statSync)(fullPath);
|
|
86
|
+
if (stat.isDirectory())
|
|
87
|
+
files.push(...search(fullPath, count - files.length));
|
|
88
|
+
else if (entry.endsWith('.ts') && !entry.endsWith('.d.ts') && !entry.endsWith('.test.ts'))
|
|
89
|
+
files.push(fullPath);
|
|
90
|
+
}
|
|
91
|
+
return files;
|
|
92
|
+
};
|
|
93
|
+
for (const file of search(dirPath, maxFiles)) {
|
|
94
|
+
try {
|
|
95
|
+
const content = (0, fs_1.readFileSync)(file, 'utf8');
|
|
96
|
+
results.push(analyzeFile(file, content));
|
|
97
|
+
}
|
|
98
|
+
catch { /* skip */ }
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
/** 分析依赖 */
|
|
103
|
+
function analyzeDependencies(pkgPath) {
|
|
104
|
+
try {
|
|
105
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf8'));
|
|
106
|
+
const conflicts = [];
|
|
107
|
+
const suggestions = [];
|
|
108
|
+
for (const [name, version] of Object.entries(pkg.dependencies || {})) {
|
|
109
|
+
const major = parseInt(version.replace('^', '').replace('~', '').split('.')[0]);
|
|
110
|
+
if (major === 0)
|
|
111
|
+
conflicts.push(`${name}@${version}`);
|
|
112
|
+
}
|
|
113
|
+
return { deps: pkg.dependencies, devDeps: pkg.devDependencies, conflicts, suggestions };
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return { deps: {}, devDeps: {}, conflicts: [], suggestions: [] };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** 生成报告 */
|
|
120
|
+
function generateReport(results) {
|
|
121
|
+
const allIssues = results.flatMap(r => r.issues);
|
|
122
|
+
const issuesByType = {};
|
|
123
|
+
const issuesBySeverity = {};
|
|
124
|
+
for (const issue of allIssues) {
|
|
125
|
+
issuesByType[issue.type] = (issuesByType[issue.type] || 0) + 1;
|
|
126
|
+
issuesBySeverity[issue.severity] = (issuesBySeverity[issue.severity] || 0) + 1;
|
|
127
|
+
}
|
|
128
|
+
const severityOrder = { high: 0, medium: 1, low: 2 };
|
|
129
|
+
allIssues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
130
|
+
return {
|
|
131
|
+
summary: { totalFiles: results.length, totalIssues: allIssues.length, issuesByType, issuesBySeverity },
|
|
132
|
+
topIssues: allIssues.slice(0, 10),
|
|
133
|
+
topSuggestions: results.flatMap(r => r.suggestions).slice(0, 5),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=code-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-analyzer.js","sourceRoot":"","sources":["../../../src/tools/analysis/code-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.editFileTool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* 工具:精确替换文件中的文本片段
|
|
9
|
+
*/
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const promises_1 = require("fs/promises");
|
|
12
|
+
const safe_path_1 = require("../safe-path");
|
|
13
|
+
exports.editFileTool = {
|
|
14
|
+
name: 'edit_file',
|
|
15
|
+
description: '在文件中将 oldText 首次精确替换为 newText',
|
|
16
|
+
jsonSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: {
|
|
19
|
+
path: { type: 'string', description: '文件相对路径' },
|
|
20
|
+
oldText: { type: 'string', description: '待替换的原文本' },
|
|
21
|
+
newText: { type: 'string', description: '替换后的新文本' },
|
|
22
|
+
},
|
|
23
|
+
required: ['path', 'oldText', 'newText'],
|
|
24
|
+
},
|
|
25
|
+
schema: zod_1.z.object({ path: zod_1.z.string().min(1), oldText: zod_1.z.string().min(1), newText: zod_1.z.string() }),
|
|
26
|
+
async execute(args, ctx) {
|
|
27
|
+
const { path, oldText, newText } = args;
|
|
28
|
+
const abs = (0, safe_path_1.safeJoin)(ctx.cwd, path);
|
|
29
|
+
try {
|
|
30
|
+
const content = await (0, promises_1.readFile)(abs, 'utf8');
|
|
31
|
+
const idx = content.indexOf(oldText);
|
|
32
|
+
if (idx < 0)
|
|
33
|
+
return { ok: false, output: '', error: '未找到 oldText' };
|
|
34
|
+
const updated = content.slice(0, idx) + newText + content.slice(idx + oldText.length);
|
|
35
|
+
await (0, promises_1.writeFile)(abs, updated, 'utf8');
|
|
36
|
+
return { ok: true, output: `已更新 ${path}` };
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
return { ok: false, output: '', error: `编辑失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=edit.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.tool.js","sourceRoot":"","sources":["../../../src/tools/file/edit.tool.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,6BAAwB;AACxB,0CAAkD;AAElD,4CAAwC;AAE3B,QAAA,YAAY,GAAS;IAChC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,+BAA+B;IAC5C,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;YAC/C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE;YACnD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE;SACpD;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;KACzC;IACD,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC9F,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAgB;QAClC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAA0D,CAAC;QAC9F,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YACtF,MAAM,IAAA,oBAAS,EAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjG,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listDirTool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* 工具:列出目录内容
|
|
9
|
+
*/
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const promises_1 = require("fs/promises");
|
|
12
|
+
const safe_path_1 = require("../safe-path");
|
|
13
|
+
exports.listDirTool = {
|
|
14
|
+
name: 'list_dir',
|
|
15
|
+
description: '列出工作区内目录内容(d=目录,-=文件)',
|
|
16
|
+
jsonSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: { path: { type: 'string', description: '目录相对路径,默认工作区根' } },
|
|
19
|
+
},
|
|
20
|
+
schema: zod_1.z.object({ path: zod_1.z.string().min(1).optional() }),
|
|
21
|
+
async execute(args, ctx) {
|
|
22
|
+
const rel = args.path ?? '.';
|
|
23
|
+
const abs = (0, safe_path_1.safeJoin)(ctx.cwd, rel);
|
|
24
|
+
try {
|
|
25
|
+
const entries = await (0, promises_1.readdir)(abs, { withFileTypes: true });
|
|
26
|
+
const lines = entries
|
|
27
|
+
.filter((e) => e.name !== '.workbuddy' && e.name !== 'node_modules')
|
|
28
|
+
.map((e) => `${e.isDirectory() ? 'd' : '-'} ${e.name}`);
|
|
29
|
+
return { ok: true, output: lines.join('\n') };
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
return { ok: false, output: '', error: `列目录失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=list.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.tool.js","sourceRoot":"","sources":["../../../src/tools/file/list.tool.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,6BAAwB;AACxB,0CAAsC;AAEtC,4CAAwC;AAE3B,QAAA,WAAW,GAAS;IAC/B,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,uBAAuB;IACpC,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE;KACvE;IACD,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IACxD,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAgB;QAClC,MAAM,GAAG,GAAI,IAAI,CAAC,IAAe,IAAI,GAAG,CAAC;QACzC,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAO,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,OAAO;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;iBACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClG,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readFileTool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* 工具:读取文件
|
|
9
|
+
*/
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const promises_1 = require("fs/promises");
|
|
12
|
+
const safe_path_1 = require("../safe-path");
|
|
13
|
+
exports.readFileTool = {
|
|
14
|
+
name: 'read_file',
|
|
15
|
+
description: '读取工作区内指定文件的文本内容',
|
|
16
|
+
jsonSchema: {
|
|
17
|
+
type: 'object',
|
|
18
|
+
properties: { path: { type: 'string', description: '文件相对工作区的路径' } },
|
|
19
|
+
required: ['path'],
|
|
20
|
+
},
|
|
21
|
+
schema: zod_1.z.object({ path: zod_1.z.string().min(1) }),
|
|
22
|
+
async execute(args, ctx) {
|
|
23
|
+
const { path } = args;
|
|
24
|
+
const abs = (0, safe_path_1.safeJoin)(ctx.cwd, path);
|
|
25
|
+
try {
|
|
26
|
+
const content = await (0, promises_1.readFile)(abs, 'utf8');
|
|
27
|
+
return { ok: true, output: content };
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
return { ok: false, output: '', error: `读取失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=read.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.tool.js","sourceRoot":"","sources":["../../../src/tools/file/read.tool.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,6BAAwB;AACxB,0CAAuC;AAEvC,4CAAwC;AAE3B,QAAA,YAAY,GAAS;IAChC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,iBAAiB;IAC9B,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;QACnE,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;IACD,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAgB;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAwB,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjG,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeFileTool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
6
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
|
+
*
|
|
8
|
+
* 工具:写入/覆盖文件
|
|
9
|
+
*/
|
|
10
|
+
const zod_1 = require("zod");
|
|
11
|
+
const promises_1 = require("fs/promises");
|
|
12
|
+
const path_1 = require("path");
|
|
13
|
+
const safe_path_1 = require("../safe-path");
|
|
14
|
+
exports.writeFileTool = {
|
|
15
|
+
name: 'write_file',
|
|
16
|
+
description: '在工作区内写入/覆盖文件(自动创建父目录)',
|
|
17
|
+
jsonSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
path: { type: 'string', description: '文件相对路径' },
|
|
21
|
+
content: { type: 'string', description: '要写入的完整内容' },
|
|
22
|
+
},
|
|
23
|
+
required: ['path', 'content'],
|
|
24
|
+
},
|
|
25
|
+
schema: zod_1.z.object({ path: zod_1.z.string().min(1), content: zod_1.z.string() }),
|
|
26
|
+
async execute(args, ctx) {
|
|
27
|
+
const { path, content } = args;
|
|
28
|
+
const abs = (0, safe_path_1.safeJoin)(ctx.cwd, path);
|
|
29
|
+
try {
|
|
30
|
+
await (0, promises_1.mkdir)((0, path_1.dirname)(abs), { recursive: true });
|
|
31
|
+
await (0, promises_1.writeFile)(abs, content, 'utf8');
|
|
32
|
+
return { ok: true, output: `已写入 ${path}(${content.length} 字节)` };
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
return { ok: false, output: '', error: `写入失败: ${e instanceof Error ? e.message : String(e)}` };
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=write.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.tool.js","sourceRoot":"","sources":["../../../src/tools/file/write.tool.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,6BAAwB;AACxB,0CAA+C;AAC/C,+BAA+B;AAE/B,4CAAwC;AAE3B,QAAA,aAAa,GAAS;IACjC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,uBAAuB;IACpC,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;YAC/C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;SACrD;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;KAC9B;IACD,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAClE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAgB;QAClC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAyC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,IAAA,gBAAK,EAAC,IAAA,cAAO,EAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAA,oBAAS,EAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,OAAO,CAAC,MAAM,MAAM,EAAE,CAAC;QACnE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjG,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateApiRoute = generateApiRoute;
|
|
4
|
+
exports.generateModel = generateModel;
|
|
5
|
+
exports.generateToolTemplate = generateToolTemplate;
|
|
6
|
+
exports.generateTestTemplate = generateTestTemplate;
|
|
7
|
+
exports.inferType = inferType;
|
|
8
|
+
exports.formatCode = formatCode;
|
|
9
|
+
exports.saveGeneratedCode = saveGeneratedCode;
|
|
10
|
+
/**
|
|
11
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
12
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
13
|
+
*
|
|
14
|
+
* 代码生成引擎(M7):
|
|
15
|
+
* - 基于模板的智能代码生成(API 路由、模型定义、工具模板)
|
|
16
|
+
* - 类型推断:根据上下文自动生成 TypeScript 类型
|
|
17
|
+
* - 代码重构:自动格式化、提取函数、重命名变量
|
|
18
|
+
*/
|
|
19
|
+
const fs_1 = require("fs");
|
|
20
|
+
const path_1 = require("path");
|
|
21
|
+
const logger_1 = require("../../shared/logger");
|
|
22
|
+
/** 生成 API 路由模板 */
|
|
23
|
+
function generateApiRoute(method, path, controller) {
|
|
24
|
+
const content = `import { Router, Request, Response } from 'express';
|
|
25
|
+
import { ${controller} } from '../controllers/${controller}';
|
|
26
|
+
|
|
27
|
+
const router = Router();
|
|
28
|
+
|
|
29
|
+
router.${method.toLowerCase()}('${path}', ${controller}.handle);
|
|
30
|
+
|
|
31
|
+
export default router;
|
|
32
|
+
`;
|
|
33
|
+
return { success: true, content };
|
|
34
|
+
}
|
|
35
|
+
/** 生成 Model 定义模板 */
|
|
36
|
+
function generateModel(name, fields) {
|
|
37
|
+
const fieldLines = Object.entries(fields).map(([k, t]) => ` ${k}: ${t};`).join('\n');
|
|
38
|
+
const content = `export interface ${name} {
|
|
39
|
+
${fieldLines}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class ${name}Model {
|
|
43
|
+
// TODO: 实现数据库操作
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
return { success: true, content };
|
|
47
|
+
}
|
|
48
|
+
/** 生成 Tool 模板 */
|
|
49
|
+
function generateToolTemplate(toolName) {
|
|
50
|
+
const content = `/**
|
|
51
|
+
* ${toolName} 工具(M7 自动生成)
|
|
52
|
+
*/
|
|
53
|
+
import type { ToolContext, ToolResult } from '../tool.interface';
|
|
54
|
+
|
|
55
|
+
export interface ${toolName}Args {
|
|
56
|
+
// TODO: 定义参数
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function execute${toolName}(
|
|
60
|
+
args: ${toolName}Args,
|
|
61
|
+
ctx: ToolContext,
|
|
62
|
+
): Promise<ToolResult> {
|
|
63
|
+
// TODO: 实现工具逻辑
|
|
64
|
+
return { ok: true, output: '...已执行' };
|
|
65
|
+
}
|
|
66
|
+
`;
|
|
67
|
+
return { success: true, content };
|
|
68
|
+
}
|
|
69
|
+
/** 生成测试文件模板 */
|
|
70
|
+
function generateTestTemplate(targetFile, functionName) {
|
|
71
|
+
const content = `import { describe, it, expect } from 'vitest';
|
|
72
|
+
import { ${functionName} } from '../${targetFile.replace(/\.ts$/, '')}';
|
|
73
|
+
|
|
74
|
+
describe('${functionName}', () => {
|
|
75
|
+
it('should execute successfully', () => {
|
|
76
|
+
const result = ${functionName}({});
|
|
77
|
+
expect(result).toBeDefined();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
`;
|
|
81
|
+
return { success: true, content };
|
|
82
|
+
}
|
|
83
|
+
/** 智能类型推断(基于默认值) */
|
|
84
|
+
function inferType(_fieldName, defaultValue) {
|
|
85
|
+
if (defaultValue === null)
|
|
86
|
+
return 'null';
|
|
87
|
+
if (Array.isArray(defaultValue))
|
|
88
|
+
return 'string[]';
|
|
89
|
+
if (typeof defaultValue === 'object')
|
|
90
|
+
return 'Record<string, unknown>';
|
|
91
|
+
return typeof defaultValue === 'string' ? 'string' :
|
|
92
|
+
typeof defaultValue === 'number' ? 'number' :
|
|
93
|
+
typeof defaultValue === 'boolean' ? 'boolean' : 'unknown';
|
|
94
|
+
}
|
|
95
|
+
/** 格式化代码(简单版) */
|
|
96
|
+
function formatCode(code) {
|
|
97
|
+
// 简单缩进处理
|
|
98
|
+
return code
|
|
99
|
+
.split('\n')
|
|
100
|
+
.map((line) => {
|
|
101
|
+
return line;
|
|
102
|
+
})
|
|
103
|
+
.join('\n');
|
|
104
|
+
}
|
|
105
|
+
/** 保存生成的代码到文件 */
|
|
106
|
+
function saveGeneratedCode(dir, filename, content) {
|
|
107
|
+
try {
|
|
108
|
+
if (!(0, fs_1.existsSync)(dir))
|
|
109
|
+
(0, fs_1.mkdirSync)(dir, { recursive: true });
|
|
110
|
+
const filepath = (0, path_1.join)(dir, filename);
|
|
111
|
+
(0, fs_1.writeFileSync)(filepath, content, 'utf8');
|
|
112
|
+
logger_1.logger.info('代码已生成', { file: filepath });
|
|
113
|
+
return { success: true, file: filepath };
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
return { success: false, error: e instanceof Error ? e.message : String(e) };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=code-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../../src/tools/generator/code-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateJestTest = generateJestTest;
|
|
4
|
+
exports.inferTestCases = inferTestCases;
|
|
5
|
+
exports.generateTests = generateTests;
|
|
6
|
+
exports.saveTestFile = saveTestFile;
|
|
7
|
+
/**
|
|
8
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
9
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
10
|
+
*
|
|
11
|
+
* 测试生成器(M7):
|
|
12
|
+
* - 基于 Jest 模板自动生成单元测试
|
|
13
|
+
* - 覆盖率高优先级排序
|
|
14
|
+
* - 代码分析辅助生成测试用例
|
|
15
|
+
*/
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path_1 = require("path");
|
|
18
|
+
/** 生成 Jest 测试模板 */
|
|
19
|
+
function generateJestTest(targetFile, functionName, tests) {
|
|
20
|
+
const testCases = tests.map((t, i) => `
|
|
21
|
+
it('${t.description || `test case ${i + 1}`}', () => {
|
|
22
|
+
const result = ${functionName}(${JSON.stringify(t.inputs)});
|
|
23
|
+
expect(result).toEqual(${JSON.stringify(t.expectedOutput)});
|
|
24
|
+
});`).join('\n');
|
|
25
|
+
const content = `import { describe, it, expect } from 'vitest';
|
|
26
|
+
import { ${functionName} } from '../${targetFile.replace(/\.ts$/, '')}';
|
|
27
|
+
|
|
28
|
+
describe('${functionName}', () => {${testCases}
|
|
29
|
+
});
|
|
30
|
+
`;
|
|
31
|
+
return { file: `${targetFile.replace(/\.ts$/, '.test.ts')}`, content };
|
|
32
|
+
}
|
|
33
|
+
/** 智能生成测试用例(基于函数签名推断) */
|
|
34
|
+
function inferTestCases(functionName, _functionSignature) {
|
|
35
|
+
const tests = [];
|
|
36
|
+
// 基本用例
|
|
37
|
+
tests.push({
|
|
38
|
+
functionName,
|
|
39
|
+
description: 'should execute without error',
|
|
40
|
+
inputs: {},
|
|
41
|
+
expectedOutput: undefined,
|
|
42
|
+
});
|
|
43
|
+
// 边界用例
|
|
44
|
+
tests.push({
|
|
45
|
+
functionName,
|
|
46
|
+
description: 'should handle empty input',
|
|
47
|
+
inputs: {},
|
|
48
|
+
expectedOutput: undefined,
|
|
49
|
+
});
|
|
50
|
+
return tests;
|
|
51
|
+
}
|
|
52
|
+
/** 生成完整测试文件 */
|
|
53
|
+
function generateTests(targetFile, functionName, tests) {
|
|
54
|
+
const testContent = generateJestTest(targetFile, functionName, tests);
|
|
55
|
+
return testContent;
|
|
56
|
+
}
|
|
57
|
+
/** 保存测试文件 */
|
|
58
|
+
function saveTestFile(outputDir, testFile, content) {
|
|
59
|
+
if (!(0, fs_1.existsSync)(outputDir))
|
|
60
|
+
(0, fs_1.mkdirSync)(outputDir, { recursive: true });
|
|
61
|
+
const filepath = (0, path_1.join)(outputDir, testFile);
|
|
62
|
+
(0, fs_1.writeFileSync)(filepath, content, 'utf8');
|
|
63
|
+
return filepath;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=test-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-generator.js","sourceRoot":"","sources":["../../../src/tools/generator/test-generator.ts"],"names":[],"mappings":";;AA0BA,4CAgBC;AAGD,wCAoBC;AAGD,sCAGC;AAGD,oCAKC;AA/ED;;;;;;;;GAQG;AACH,2BAA0D;AAC1D,+BAA4B;AAe5B,mBAAmB;AACnB,SAAgB,gBAAgB,CAAC,UAAkB,EAAE,YAAoB,EAAE,KAAiB;IAC1F,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,CAAC,CAAC,WAAW,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;qBACxB,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;6BAChC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;MACvD,CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,OAAO,GAAG;WACP,YAAY,eAAe,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;;YAEzD,YAAY,aAAa,SAAS;;CAE7C,CAAC;IAEA,OAAO,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC;AAED,yBAAyB;AACzB,SAAgB,cAAc,CAAC,YAAoB,EAAE,kBAA0B;IAC7E,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,OAAO;IACP,KAAK,CAAC,IAAI,CAAC;QACT,YAAY;QACZ,WAAW,EAAE,8BAA8B;QAC3C,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,SAAS;KAC1B,CAAC,CAAC;IAEH,OAAO;IACP,KAAK,CAAC,IAAI,CAAC;QACT,YAAY;QACZ,WAAW,EAAE,2BAA2B;QACxC,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,SAAS;KAC1B,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,eAAe;AACf,SAAgB,aAAa,CAAC,UAAkB,EAAE,YAAoB,EAAE,KAAiB;IACvF,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACtE,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,aAAa;AACb,SAAgB,YAAY,CAAC,SAAiB,EAAE,QAAgB,EAAE,OAAe;IAC/E,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC;QAAE,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAA,kBAAa,EAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ToolRegistry = void 0;
|
|
18
|
+
exports.createDefaultRegistry = createDefaultRegistry;
|
|
19
|
+
/**
|
|
20
|
+
* 飞虹 Code (Muse Code 参照复刻)
|
|
21
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
22
|
+
*
|
|
23
|
+
* 工具聚合:注册全部内置工具
|
|
24
|
+
*/
|
|
25
|
+
const tool_registry_1 = require("./tool.registry");
|
|
26
|
+
const read_tool_1 = require("./file/read.tool");
|
|
27
|
+
const write_tool_1 = require("./file/write.tool");
|
|
28
|
+
const edit_tool_1 = require("./file/edit.tool");
|
|
29
|
+
const list_tool_1 = require("./file/list.tool");
|
|
30
|
+
const grep_tool_1 = require("./search/grep.tool");
|
|
31
|
+
const run_shell_tool_1 = require("./shell/run-shell.tool");
|
|
32
|
+
const test_run_tool_1 = require("./verify/test-run.tool");
|
|
33
|
+
const build_check_tool_1 = require("./verify/build-check.tool");
|
|
34
|
+
function createDefaultRegistry() {
|
|
35
|
+
const reg = new tool_registry_1.ToolRegistry();
|
|
36
|
+
for (const t of [
|
|
37
|
+
read_tool_1.readFileTool,
|
|
38
|
+
write_tool_1.writeFileTool,
|
|
39
|
+
edit_tool_1.editFileTool,
|
|
40
|
+
list_tool_1.listDirTool,
|
|
41
|
+
grep_tool_1.grepTool,
|
|
42
|
+
run_shell_tool_1.runShellTool,
|
|
43
|
+
test_run_tool_1.runTestsTool,
|
|
44
|
+
build_check_tool_1.buildCheckTool,
|
|
45
|
+
]) {
|
|
46
|
+
reg.register(t);
|
|
47
|
+
}
|
|
48
|
+
return reg;
|
|
49
|
+
}
|
|
50
|
+
var tool_registry_2 = require("./tool.registry");
|
|
51
|
+
Object.defineProperty(exports, "ToolRegistry", { enumerable: true, get: function () { return tool_registry_2.ToolRegistry; } });
|
|
52
|
+
__exportStar(require("./tool.interface"), exports);
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAgBA,sDAeC;AA/BD;;;;;GAKG;AACH,mDAA+C;AAC/C,gDAAgD;AAChD,kDAAkD;AAClD,gDAAgD;AAChD,gDAA+C;AAC/C,kDAA8C;AAC9C,2DAAsD;AACtD,0DAAsD;AACtD,gEAA2D;AAE3D,SAAgB,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,4BAAY,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI;QACd,wBAAY;QACZ,0BAAa;QACb,wBAAY;QACZ,uBAAW;QACX,oBAAQ;QACR,6BAAY;QACZ,4BAAY;QACZ,iCAAc;KACf,EAAE,CAAC;QACF,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,mDAAiC"}
|