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.
Files changed (154) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +14 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +46 -0
  5. package/.github/SECURITY.md +67 -0
  6. package/.github/workflows/ci.yml +140 -0
  7. package/AGENT-GUIDE.md +237 -0
  8. package/CHANGELOG.md +73 -0
  9. package/CODE_OF_CONDUCT.md +56 -0
  10. package/CONTRIBUTING.md +68 -0
  11. package/LICENSE +22 -0
  12. package/README.md +500 -0
  13. package/dist/agent/code-review.js +115 -0
  14. package/dist/agent/code-review.js.map +1 -0
  15. package/dist/agent/code-writer.js +227 -0
  16. package/dist/agent/code-writer.js.map +1 -0
  17. package/dist/agent/context-compactor.js +108 -0
  18. package/dist/agent/context-compactor.js.map +1 -0
  19. package/dist/agent/experience.js +190 -0
  20. package/dist/agent/experience.js.map +1 -0
  21. package/dist/agent/orchestrator.js +212 -0
  22. package/dist/agent/orchestrator.js.map +1 -0
  23. package/dist/agent/parallel-orchestrator.js +94 -0
  24. package/dist/agent/parallel-orchestrator.js.map +1 -0
  25. package/dist/agent/planner.js +53 -0
  26. package/dist/agent/planner.js.map +1 -0
  27. package/dist/agent/prompts.js +26 -0
  28. package/dist/agent/prompts.js.map +1 -0
  29. package/dist/agent/quality-gate.js +143 -0
  30. package/dist/agent/quality-gate.js.map +1 -0
  31. package/dist/agent/repo-reader.js +384 -0
  32. package/dist/agent/repo-reader.js.map +1 -0
  33. package/dist/agent/repo-underwriter.js +132 -0
  34. package/dist/agent/repo-underwriter.js.map +1 -0
  35. package/dist/agent/self-heal.js +134 -0
  36. package/dist/agent/self-heal.js.map +1 -0
  37. package/dist/agent/self-improver.js +148 -0
  38. package/dist/agent/self-improver.js.map +1 -0
  39. package/dist/agent/subagent.js +75 -0
  40. package/dist/agent/subagent.js.map +1 -0
  41. package/dist/agent/swe-agent.js +162 -0
  42. package/dist/agent/swe-agent.js.map +1 -0
  43. package/dist/agent/swe-planner.js +155 -0
  44. package/dist/agent/swe-planner.js.map +1 -0
  45. package/dist/agent/swe-verifier.js +113 -0
  46. package/dist/agent/swe-verifier.js.map +1 -0
  47. package/dist/cli/commands.js +167 -0
  48. package/dist/cli/commands.js.map +1 -0
  49. package/dist/cli/index.js +179 -0
  50. package/dist/cli/index.js.map +1 -0
  51. package/dist/cli/repl.js +67 -0
  52. package/dist/cli/repl.js.map +1 -0
  53. package/dist/cli/run.js +762 -0
  54. package/dist/cli/run.js.map +1 -0
  55. package/dist/cli/version.js +14 -0
  56. package/dist/cli/version.js.map +1 -0
  57. package/dist/enterprise/audit.js +294 -0
  58. package/dist/enterprise/audit.js.map +1 -0
  59. package/dist/enterprise/guard.js +58 -0
  60. package/dist/enterprise/guard.js.map +1 -0
  61. package/dist/enterprise/index.js +99 -0
  62. package/dist/enterprise/index.js.map +1 -0
  63. package/dist/enterprise/policy.js +242 -0
  64. package/dist/enterprise/policy.js.map +1 -0
  65. package/dist/enterprise/quota.js +58 -0
  66. package/dist/enterprise/quota.js.map +1 -0
  67. package/dist/enterprise/tenant.js +143 -0
  68. package/dist/enterprise/tenant.js.map +1 -0
  69. package/dist/models/cost.js +13 -0
  70. package/dist/models/cost.js.map +1 -0
  71. package/dist/models/model-router.js +170 -0
  72. package/dist/models/model-router.js.map +1 -0
  73. package/dist/models/model.dto.js +61 -0
  74. package/dist/models/model.dto.js.map +1 -0
  75. package/dist/models/model.interface.js +3 -0
  76. package/dist/models/model.interface.js.map +1 -0
  77. package/dist/models/providers/mock.provider.js +35 -0
  78. package/dist/models/providers/mock.provider.js.map +1 -0
  79. package/dist/models/providers/ollama.provider.js +88 -0
  80. package/dist/models/providers/ollama.provider.js.map +1 -0
  81. package/dist/models/providers/openai-compatible.provider.js +106 -0
  82. package/dist/models/providers/openai-compatible.provider.js.map +1 -0
  83. package/dist/runtime/event-log.js +42 -0
  84. package/dist/runtime/event-log.js.map +1 -0
  85. package/dist/runtime/git.js +106 -0
  86. package/dist/runtime/git.js.map +1 -0
  87. package/dist/runtime/session-persist.js +60 -0
  88. package/dist/runtime/session-persist.js.map +1 -0
  89. package/dist/runtime/session-store.js +34 -0
  90. package/dist/runtime/session-store.js.map +1 -0
  91. package/dist/runtime/worktree.js +117 -0
  92. package/dist/runtime/worktree.js.map +1 -0
  93. package/dist/shared/config.js +184 -0
  94. package/dist/shared/config.js.map +1 -0
  95. package/dist/shared/errors.js +66 -0
  96. package/dist/shared/errors.js.map +1 -0
  97. package/dist/shared/logger.js +51 -0
  98. package/dist/shared/logger.js.map +1 -0
  99. package/dist/shared/types.js +9 -0
  100. package/dist/shared/types.js.map +1 -0
  101. package/dist/skills/goal.js +60 -0
  102. package/dist/skills/goal.js.map +1 -0
  103. package/dist/skills/grill.js +129 -0
  104. package/dist/skills/grill.js.map +1 -0
  105. package/dist/skills/plan.js +40 -0
  106. package/dist/skills/plan.js.map +1 -0
  107. package/dist/tools/analysis/code-analyzer.js +136 -0
  108. package/dist/tools/analysis/code-analyzer.js.map +1 -0
  109. package/dist/tools/file/edit.tool.js +43 -0
  110. package/dist/tools/file/edit.tool.js.map +1 -0
  111. package/dist/tools/file/list.tool.js +36 -0
  112. package/dist/tools/file/list.tool.js.map +1 -0
  113. package/dist/tools/file/read.tool.js +34 -0
  114. package/dist/tools/file/read.tool.js.map +1 -0
  115. package/dist/tools/file/write.tool.js +39 -0
  116. package/dist/tools/file/write.tool.js.map +1 -0
  117. package/dist/tools/generator/code-generator.js +119 -0
  118. package/dist/tools/generator/code-generator.js.map +1 -0
  119. package/dist/tools/generator/test-generator.js +65 -0
  120. package/dist/tools/generator/test-generator.js.map +1 -0
  121. package/dist/tools/index.js +53 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/safe-path.js +36 -0
  124. package/dist/tools/safe-path.js.map +1 -0
  125. package/dist/tools/search/grep.tool.js +81 -0
  126. package/dist/tools/search/grep.tool.js.map +1 -0
  127. package/dist/tools/shell/exec.js +50 -0
  128. package/dist/tools/shell/exec.js.map +1 -0
  129. package/dist/tools/shell/run-shell.tool.js +49 -0
  130. package/dist/tools/shell/run-shell.tool.js.map +1 -0
  131. package/dist/tools/tool.interface.js +8 -0
  132. package/dist/tools/tool.interface.js.map +1 -0
  133. package/dist/tools/tool.registry.js +75 -0
  134. package/dist/tools/tool.registry.js.map +1 -0
  135. package/dist/tools/verify/build-check.tool.js +37 -0
  136. package/dist/tools/verify/build-check.tool.js.map +1 -0
  137. package/dist/tools/verify/test-run.tool.js +37 -0
  138. package/dist/tools/verify/test-run.tool.js.map +1 -0
  139. package/dist/web/auth.js +25 -0
  140. package/dist/web/auth.js.map +1 -0
  141. package/dist/web/public/index.html +39 -0
  142. package/dist/web/server.js +60 -0
  143. package/dist/web/server.js.map +1 -0
  144. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -0
  145. 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
  146. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +358 -0
  147. 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
  148. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +303 -0
  149. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -0
  150. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -0
  151. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -0
  152. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -0
  153. package/package.json +83 -0
  154. 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"}