feihong-code 7.2.0 → 7.6.0
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/workflows/ci.yml +54 -1
- package/.github/workflows/release.yml +30 -0
- package/.github/workflows/swebench-real.yml +84 -0
- package/CHANGELOG.md +41 -39
- package/CONTRIBUTING.md +9 -2
- package/README.md +56 -6
- package/README.self-evolve.md +279 -274
- package/dist/agent/change-manager.js +1 -1
- package/dist/agent/code-rag.js +1 -1
- package/dist/agent/code-review.js +1 -1
- package/dist/agent/code-writer.js +1 -1
- package/dist/agent/completion-engine.js +76 -45
- package/dist/agent/completion-engine.js.map +1 -1
- package/dist/agent/completion-postprocess.js +109 -0
- package/dist/agent/completion-postprocess.js.map +1 -0
- package/dist/agent/context-budget.js +121 -0
- package/dist/agent/context-budget.js.map +1 -0
- package/dist/agent/context-compactor.js +58 -0
- package/dist/agent/context-compactor.js.map +1 -1
- package/dist/agent/experience.js +1 -1
- package/dist/agent/layered-memory.js +1 -1
- package/dist/agent/lint.js +121 -0
- package/dist/agent/lint.js.map +1 -0
- package/dist/agent/orchestrator.js +106 -31
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/parallel-orchestrator.js +1 -1
- package/dist/agent/planner.js +8 -3
- package/dist/agent/planner.js.map +1 -1
- package/dist/agent/prompts.js +55 -55
- package/dist/agent/quality-gate.js +1 -1
- package/dist/agent/repo-context.js +1 -1
- package/dist/agent/repo-reader.js +1 -1
- package/dist/agent/repo-underwriter.js +1 -1
- package/dist/agent/self-correction.js +25 -25
- package/dist/agent/self-heal.js +32 -27
- package/dist/agent/self-heal.js.map +1 -1
- package/dist/agent/self-improver.js +1 -1
- package/dist/agent/subagent-summary.js +1 -1
- package/dist/agent/subagent.js +1 -1
- package/dist/agent/swe-agent.js +1 -1
- package/dist/agent/swe-verifier.js +1 -1
- package/dist/agent/symbol-index.js +1 -1
- package/dist/agent/team.js +1 -1
- package/dist/agent/type-checker.js +1 -1
- package/dist/cli/commands.js +16 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/index.js +66 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/multi-pane-tui.js +217 -0
- package/dist/cli/multi-pane-tui.js.map +1 -0
- package/dist/cli/repl.js +1 -1
- package/dist/cli/run.js +168 -42
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/self-evolve-cli.js +168 -0
- package/dist/cli/tui-run.js +79 -0
- package/dist/cli/tui-run.js.map +1 -0
- package/dist/cli/tui.js +1 -1
- package/dist/cli/tui.js.map +1 -1
- package/dist/cli/version.js +3 -3
- package/dist/cli/version.js.map +1 -1
- package/dist/enterprise/audit.js +1 -1
- package/dist/enterprise/index.js +1 -1
- package/dist/enterprise/policy.js +1 -1
- package/dist/enterprise/quota.js +1 -1
- package/dist/enterprise/tenant.js +1 -1
- package/dist/harness/executor.js +1 -1
- package/dist/harness/index.js +1 -1
- package/dist/harness/loader.js +1 -1
- package/dist/harness/types.js +1 -1
- package/dist/harness/verifier.js +52 -12
- package/dist/harness/verifier.js.map +1 -1
- package/dist/integrations/feishu-bridge.js +348 -0
- package/dist/integrations/feishu-bridge.js.map +1 -0
- package/dist/integrations/github-mcp.js +137 -0
- package/dist/integrations/github-mcp.js.map +1 -0
- package/dist/integrations/wechat-bridge.js +499 -0
- package/dist/integrations/wechat-bridge.js.map +1 -0
- package/dist/integrations/yuanbao-bridge.js +326 -0
- package/dist/integrations/yuanbao-bridge.js.map +1 -0
- package/dist/lsp/lsp-client.js +183 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-service.js +159 -0
- package/dist/lsp/lsp-service.js.map +1 -0
- package/dist/models/model-router.js +1 -1
- package/dist/models/model.dto.js +1 -1
- package/dist/models/providers/ollama.provider.js +1 -1
- package/dist/models/providers/openai-compatible.provider.js +1 -1
- package/dist/plugins/manager.js +50 -2
- package/dist/plugins/manager.js.map +1 -1
- package/dist/plugins/plugin-loader.js +1 -1
- package/dist/runtime/event-log.js +1 -1
- package/dist/runtime/git.js +1 -1
- package/dist/runtime/hooks.js +71 -4
- package/dist/runtime/hooks.js.map +1 -1
- package/dist/runtime/session-persist.js +1 -1
- package/dist/runtime/worktree.js +1 -1
- package/dist/self-evolve/manager.js +517 -401
- package/dist/self-evolve/self-heal-scheduler.js +160 -0
- package/dist/self-evolve/self-heal-scheduler.js.map +1 -0
- package/dist/shared/concurrency.js +1 -1
- package/dist/shared/config.js +4 -2
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/errors.js +1 -1
- package/dist/shared/i18n.js +109 -101
- package/dist/shared/i18n.js.map +1 -1
- package/dist/shared/secure-store.js +12 -5
- package/dist/shared/secure-store.js.map +1 -1
- package/dist/shared/types.js +1 -1
- package/dist/skills/goal.js +1 -1
- package/dist/skills/grill.js +1 -1
- package/dist/skills/plan.js +1 -1
- package/dist/skills/pua-hooks.js +273 -0
- package/dist/skills/pua-hooks.js.map +1 -0
- package/dist/skills/self-heal.js +9 -3
- package/dist/skills/self-heal.js.map +1 -1
- package/dist/skills/skill-loader.js +1 -1
- package/dist/skills/skill-market.js +84 -8
- package/dist/skills/skill-market.js.map +1 -1
- package/dist/tools/analysis/code-analyzer.js +1 -1
- package/dist/tools/file/edit.tool.js +18 -3
- package/dist/tools/file/edit.tool.js.map +1 -1
- package/dist/tools/file/list.tool.js +1 -1
- package/dist/tools/file/read.tool.js +1 -1
- package/dist/tools/file/write.tool.js +1 -1
- package/dist/tools/generator/code-generator.js +41 -41
- package/dist/tools/generator/test-generator.js +10 -10
- package/dist/tools/index.js +1 -1
- package/dist/tools/mcp/index.js +1 -1
- package/dist/tools/mcp/mcp-client.js +1 -1
- package/dist/tools/safe-path.js +1 -1
- package/dist/tools/search/grep.tool.js +1 -1
- package/dist/tools/shell/exec.js +24 -2
- package/dist/tools/shell/exec.js.map +1 -1
- package/dist/tools/shell/run-shell.tool.js +1 -1
- package/dist/tools/skills/load-skill.tool.js +1 -1
- package/dist/tools/tool.registry.js +10 -1
- package/dist/tools/tool.registry.js.map +1 -1
- package/dist/tools/verify/build-check.tool.js +1 -1
- package/dist/tools/verify/test-run.tool.js +1 -1
- package/dist/tools/web/web.tool.js +1 -1
- package/dist/voice/voice-programming.js +32 -6
- package/dist/voice/voice-programming.js.map +1 -1
- package/dist/web/auth.js +34 -2
- package/dist/web/auth.js.map +1 -1
- package/dist/web/channels.js +1 -1
- package/dist/web/extra-apis.js +440 -0
- package/dist/web/extra-apis.js.map +1 -0
- package/dist/web/public/css/style.css +99 -72
- package/dist/web/public/index.html +44 -1
- package/dist/web/public/js/api.js +64 -2
- package/dist/web/public/js/app.js +151 -128
- package/dist/web/public/js/mock-api.js +25 -0
- package/dist/web/public/js/monaco-editor.js +161 -1
- package/dist/web/public/js/ui.js +292 -56
- package/dist/web/public/service-worker.js +5 -29
- package/dist/web/server.js +178 -61
- package/dist/web/server.js.map +1 -1
- package/dist/web/task-queue.js +6 -21
- package/dist/web/task-queue.js.map +1 -1
- package/docs/App/344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +1 -1
- package/docs/App/346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +1 -1
- package/docs/BENCHMARK_REPORT_en.md +62 -5
- package/docs/BENCHMARK_REPORT_zh.md +66 -9
- package/docs/DPA.md +65 -0
- package/docs/DPA/346/225/260/346/215/256/345/244/204/347/220/206/345/215/217/350/256/256/346/250/241/346/235/277_v1.0.md +69 -0
- package/docs/Deployment_Guide_EN.md +1 -1
- package/docs/SECURITY_WHITEPAPER.md +74 -0
- package/docs/SELF-EVOLVE-GUIDE.md +1 -1
- package/docs/SWE_BENCH_REPORT.md +73 -0
- package/docs/TECHNICAL_SPEC_en.md +1 -1
- package/docs/TECHNICAL_SPEC_zh.md +1 -1
- package/docs/Technical_Manual_EN.md +1 -1
- package/docs/UPDATE_NOTES_en.md +1 -1
- package/docs/UPDATE_NOTES_zh.md +1 -1
- package/docs/UPGRADE_7.2.0.md +309 -0
- package/docs/UPGRADE_GUIDE_7_5.md +86 -0
- package/docs/UPGRADE_GUIDE_7_6.md +153 -0
- package/docs/User_Manual_EN.md +1 -1
- package/docs/VOLTAGENT_SKILLS_CATALOG.md +95 -0
- package/docs/error-codes.md +1 -1
- package/docs/geo-feihong-code.html +391 -0
- package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +5 -3
- package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +140 -231
- package/docs//345/205/250/351/235/242/345/244/215/347/233/230_50/350/275/256/346/267/261/345/272/246/345/256/241/350/256/241_v7.2.0.md +208 -0
- package/docs//345/205/250/351/235/242/345/244/215/347/233/230_6/351/241/271/351/207/215/347/202/271/346/240/270/346/237/245_v7.2.0.md +152 -0
- package/docs//345/205/250/351/235/242/345/244/215/347/233/230_/350/277/220/350/241/214/346/227/266/345/256/236/346/265/213/347/211/210_v7.2.0.md +271 -0
- package/docs//345/220/210/350/247/204/350/256/244/350/257/201/345/207/206/345/244/207/346/270/205/345/215/225_v7.2.0.md +59 -0
- package/docs//345/256/211/345/205/250/347/231/275/347/232/256/344/271/246_v7.2.0.md +84 -0
- package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +240 -149
- package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +2 -2
- package/electron/main.js +4 -202
- package/package.json +182 -172
- package/templates/skills/api-design/SKILL.md +27 -0
- package/templates/skills/code-review/SKILL.md +35 -0
- package/templates/skills/dependency-upgrade/SKILL.md +29 -0
- package/templates/skills/doc-gen/SKILL.md +29 -0
- package/templates/skills/git-flow/SKILL.md +26 -0
- package/templates/skills/onboarding/SKILL.md +27 -0
- package/templates/skills/performance/SKILL.md +29 -0
- package/templates/skills/refactor/SKILL.md +28 -0
- package/templates/skills/security-audit/SKILL.md +28 -0
- package/templates/skills/test-gen/SKILL.md +30 -0
- package/docs/DEPLOYMENT.md +0 -382
- package/docs/MODEL_FINETUNING.md +0 -405
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Self-Evolve CLI - 自我迭代升级命令行接口
|
|
4
|
+
*
|
|
5
|
+
* 说明:本文件不依赖 commander(此前为未声明的第三方依赖,导致全新安装时
|
|
6
|
+
* `Cannot find module 'commander'` 崩溃)。改为手写参数解析,自包含、零依赖,
|
|
7
|
+
* 与 src/self-evolve/manager.js 的 CLI 入口语义保持一致。
|
|
8
|
+
* 主入口:`fhcode self-evolve <subcommand>`(见 run.ts runSelfEvolve)。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { SelfEvolveManager } = require('../self-evolve/manager.js');
|
|
12
|
+
|
|
13
|
+
const manager = new SelfEvolveManager();
|
|
14
|
+
|
|
15
|
+
/** 简单标志解析:支持 `--flag value` 与 `--flag=value` */
|
|
16
|
+
function parseFlags(args) {
|
|
17
|
+
const flags = {};
|
|
18
|
+
const positional = [];
|
|
19
|
+
for (let i = 0; i < args.length; i++) {
|
|
20
|
+
const a = args[i];
|
|
21
|
+
if (a.startsWith('--')) {
|
|
22
|
+
const eq = a.indexOf('=');
|
|
23
|
+
const name = eq >= 0 ? a.slice(2, eq) : a.slice(2);
|
|
24
|
+
const inline = eq >= 0 ? a.slice(eq + 1) : undefined;
|
|
25
|
+
flags[name] = inline !== undefined ? inline : args[i + 1];
|
|
26
|
+
if (inline === undefined && flags[name] !== undefined && !flags[name].startsWith('-')) i++;
|
|
27
|
+
else if (inline === undefined) flags[name] = true;
|
|
28
|
+
} else if (a.startsWith('-') && a.length === 2) {
|
|
29
|
+
flags[a.slice(1)] = args[i + 1];
|
|
30
|
+
if (flags[a.slice(1)] !== undefined && !String(flags[a.slice(1)]).startsWith('-')) i++;
|
|
31
|
+
else flags[a.slice(1)] = true;
|
|
32
|
+
} else {
|
|
33
|
+
positional.push(a);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { flags, positional };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function printUsage() {
|
|
40
|
+
console.log('自我迭代管理系统(fhcode self-evolve)');
|
|
41
|
+
console.log('用法:');
|
|
42
|
+
console.log(' fhcode self-evolve init - 初始化系统');
|
|
43
|
+
console.log(' fhcode self-evolve status - 查看统计');
|
|
44
|
+
console.log(' fhcode self-evolve failures list [-t 类型] [-s 状态] [-d 天数] - 列出失败');
|
|
45
|
+
console.log(' fhcode self-evolve skills list - 列出技能');
|
|
46
|
+
console.log(' fhcode self-evolve create-skill -n 名称 -d 描述 -p 模式 -s 方案 [-t 触发词] - 创建技能');
|
|
47
|
+
console.log(' fhcode self-evolve review --daily - 每日复盘');
|
|
48
|
+
console.log(' fhcode self-evolve analyze [-d 天数] - 错误模式分析');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 统一的子命令入口:既可被 `fhcode self-evolve` 主 CLI 复用,也可独立运行 */
|
|
52
|
+
function runCli(argv) {
|
|
53
|
+
const args = Array.isArray(argv) ? argv.slice() : process.argv.slice(2);
|
|
54
|
+
if (args.length === 0) {
|
|
55
|
+
printUsage();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const { flags, positional } = parseFlags(args);
|
|
59
|
+
const [cmd, sub] = positional;
|
|
60
|
+
|
|
61
|
+
if (cmd === 'init') {
|
|
62
|
+
manager.init();
|
|
63
|
+
} else if (cmd === 'status') {
|
|
64
|
+
const stats = manager.getStatistics();
|
|
65
|
+
console.log('\n📊 自我迭代系统状态');
|
|
66
|
+
console.log('='.repeat(40));
|
|
67
|
+
console.log(`总失败记录: ${stats.total_failures}`);
|
|
68
|
+
console.log(`已解决: ${stats.resolved}`);
|
|
69
|
+
console.log(`待处理: ${stats.pending}`);
|
|
70
|
+
console.log(`解决率: ${stats.resolution_rate}`);
|
|
71
|
+
console.log(`技能库: ${stats.total_skills} 个技能`);
|
|
72
|
+
console.log(`共享经验库: ${stats.total_experiences} 条经验(experiences.jsonl,与 self-improve 共用)`);
|
|
73
|
+
if (Object.keys(stats.by_type).length > 0) {
|
|
74
|
+
console.log('错误类型分布:');
|
|
75
|
+
Object.entries(stats.by_type).forEach(([type, count]) => console.log(` ${type}: ${count}`));
|
|
76
|
+
}
|
|
77
|
+
} else if (cmd === 'failures' && sub === 'list') {
|
|
78
|
+
const filters = {};
|
|
79
|
+
if (flags.t || flags.type) filters.type = flags.t || flags.type;
|
|
80
|
+
if (flags.s || flags.status) filters.status = flags.s || flags.status;
|
|
81
|
+
if (flags.d || flags.days) filters.days = parseInt(flags.d || flags.days, 10);
|
|
82
|
+
const failures = manager.listFailures(filters);
|
|
83
|
+
if (failures.length === 0) {
|
|
84
|
+
console.log('暂无失败记录');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log(`\n找到 ${failures.length} 条失败记录:\n`);
|
|
88
|
+
failures.forEach((f) => {
|
|
89
|
+
const icon = f.status === 'resolved' ? '✅' : '⏳';
|
|
90
|
+
console.log(`${icon} [${f.id.slice(0, 8)}] ${f.error_type}`);
|
|
91
|
+
console.log(` 任务: ${String(f.task).slice(0, 60)}`);
|
|
92
|
+
console.log(` 错误: ${String(f.error_message).slice(0, 80)}`);
|
|
93
|
+
if (f.solution) console.log(` 解决: ${String(f.solution).slice(0, 60)}`);
|
|
94
|
+
console.log('');
|
|
95
|
+
});
|
|
96
|
+
} else if (cmd === 'skills' && sub === 'list') {
|
|
97
|
+
const skills = manager.listSkills();
|
|
98
|
+
if (skills.length === 0) {
|
|
99
|
+
console.log('技能库为空');
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
console.log(`\n技能库 (${skills.length} 个技能):\n`);
|
|
103
|
+
skills.forEach((s) => {
|
|
104
|
+
console.log(`📦 ${s.name} v${s.version}`);
|
|
105
|
+
console.log(` ${s.description}`);
|
|
106
|
+
console.log(` 触发词: ${(s.triggers || []).join(', ') || '无'}`);
|
|
107
|
+
console.log(` 使用次数: ${s.usage_count}`);
|
|
108
|
+
console.log('');
|
|
109
|
+
});
|
|
110
|
+
} else if (cmd === 'create-skill') {
|
|
111
|
+
const name = flags.n || flags.name;
|
|
112
|
+
const description = flags.d || flags.description;
|
|
113
|
+
const pattern = flags.p || flags.pattern;
|
|
114
|
+
const solution = flags.s || flags.solution;
|
|
115
|
+
if (!name || !description || !pattern || !solution) {
|
|
116
|
+
console.error('create-skill 需要 -n/--name -d/--description -p/--pattern -s/--solution');
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const triggers = (flags.t || flags.triggers || '').split(',').map((t) => t.trim()).filter(Boolean) || [name];
|
|
121
|
+
const skill = manager.createSkill(name, description, triggers, pattern, solution);
|
|
122
|
+
console.log(`\n✅ 技能已创建: ${skill.name}`);
|
|
123
|
+
console.log(` 位置: ~/.feihong-code/skills/${skill.name}/SKILL.md`);
|
|
124
|
+
} else if (cmd === 'review' && (flags.daily || flags.d === 'daily')) {
|
|
125
|
+
const report = manager.generateDailyReport();
|
|
126
|
+
console.log('\n📅 每日复盘报告');
|
|
127
|
+
console.log('='.repeat(40));
|
|
128
|
+
console.log(`日期: ${report.date}`);
|
|
129
|
+
console.log(`失败任务: ${report.total_failures}`);
|
|
130
|
+
console.log(`已解决: ${report.resolved}`);
|
|
131
|
+
console.log(`待处理: ${report.pending}`);
|
|
132
|
+
console.log(`新技能: ${report.new_skills}`);
|
|
133
|
+
report.failures.forEach((f) => {
|
|
134
|
+
const icon = f.status === 'resolved' ? '✅' : '⏳';
|
|
135
|
+
console.log(` ${icon} [${f.id}] ${f.type}: ${f.message}`);
|
|
136
|
+
});
|
|
137
|
+
} else if (cmd === 'analyze') {
|
|
138
|
+
const days = parseInt(flags.d || flags.days || '7', 10);
|
|
139
|
+
const recentFailures = manager.listFailures({ days });
|
|
140
|
+
const byType = {};
|
|
141
|
+
recentFailures.forEach((f) => {
|
|
142
|
+
(byType[f.error_type] = byType[f.error_type] || []).push(f);
|
|
143
|
+
});
|
|
144
|
+
console.log(`\n🔍 最近 ${days} 天的错误模式分析`);
|
|
145
|
+
console.log('='.repeat(40));
|
|
146
|
+
Object.entries(byType).forEach(([type, failures]) => {
|
|
147
|
+
console.log(`\n${type} (${failures.length} 次)`);
|
|
148
|
+
const existing = manager.skillsIndex.find((s) => s.error_pattern === type);
|
|
149
|
+
if (existing) console.log(` ✅ 已有技能: ${existing.name}`);
|
|
150
|
+
else {
|
|
151
|
+
console.log(` ⚠️ 建议创建新技能`);
|
|
152
|
+
console.log(` 示例: fhcode self-evolve create-skill \\`);
|
|
153
|
+
console.log(` --name ${type}-handler --description "处理${type}" --pattern ${type} --solution "根据具体情况处理"`);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
} else if (cmd === 'help' || cmd === '--help' || cmd === '-h') {
|
|
157
|
+
printUsage();
|
|
158
|
+
} else {
|
|
159
|
+
printUsage();
|
|
160
|
+
process.exitCode = 1;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = { runCli };
|
|
165
|
+
|
|
166
|
+
if (require.main === module) {
|
|
167
|
+
runCli(process.argv.slice(2));
|
|
168
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildDemoPanes = buildDemoPanes;
|
|
4
|
+
exports.runTuiInteractive = runTuiInteractive;
|
|
5
|
+
exports.runTui = runTui;
|
|
6
|
+
/**
|
|
7
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
8
|
+
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
9
|
+
*
|
|
10
|
+
* P2-1 多窗格 TUI 入口:`fhcode tui`
|
|
11
|
+
* - 非 TTY:打印演示多窗格布局(供冒烟断言 / 管道输出)。
|
|
12
|
+
* - TTY:进入交互模式,展示文件树 + 消息/Diff 多窗格。
|
|
13
|
+
*/
|
|
14
|
+
const multi_pane_tui_1 = require("./multi-pane-tui");
|
|
15
|
+
/** 演示数据:文件树 + 消息 + diff(供冒烟断言与 TTY 演示共用) */
|
|
16
|
+
function buildDemoPanes() {
|
|
17
|
+
const tui = new multi_pane_tui_1.MultiPaneTui({ width: 100, height: 28, fileTreeWidth: 24, color: false });
|
|
18
|
+
tui.setStatus({ mode: 'live', state: '运行中', fileCount: 3 });
|
|
19
|
+
tui.setFileTree(['src/', ' main.ts', ' agent/', ' planner.ts', 'package.json']);
|
|
20
|
+
tui.appendMessage('> 用户: 修复登录校验漏洞');
|
|
21
|
+
tui.appendMessage('计划: 1) 检查 auth middleware 2) 补 token 过期校验');
|
|
22
|
+
tui.setDiff({
|
|
23
|
+
file: 'src/server/middleware/auth.ts',
|
|
24
|
+
hunks: [
|
|
25
|
+
{
|
|
26
|
+
header: '-5,4 +5,5 @@',
|
|
27
|
+
lines: [
|
|
28
|
+
{ type: 'ctx', content: 'export function auth(req, res, next) {' },
|
|
29
|
+
{ type: 'del', content: ' if (!req.token) return res.status(401);' },
|
|
30
|
+
{ type: 'add', content: ' if (!req.token) return res.status(401).end();' },
|
|
31
|
+
{ type: 'add', content: ' if (isExpired(req.token)) return res.status(401).end();' },
|
|
32
|
+
{ type: 'ctx', content: ' next();' },
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
});
|
|
37
|
+
return tui;
|
|
38
|
+
}
|
|
39
|
+
/** 交互循环(TTY):Tab 切窗格 / 1=消息 / 2=Diff / ↑↓ 文件树 / q 退出 */
|
|
40
|
+
function runTuiInteractive(stream = process.stdin) {
|
|
41
|
+
const tui = buildDemoPanes();
|
|
42
|
+
tui.start();
|
|
43
|
+
if (!tui.isEnabled) {
|
|
44
|
+
// 非 TTY:直接打印布局
|
|
45
|
+
console.log(tui.getLayout().join('\n'));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
stream.setRawMode?.(true);
|
|
49
|
+
stream.resume?.();
|
|
50
|
+
stream.setEncoding('utf8');
|
|
51
|
+
stream.on('data', (chunk) => {
|
|
52
|
+
const k = chunk.toString();
|
|
53
|
+
if (k === 'q' || k === '\u0003') {
|
|
54
|
+
tui.stop();
|
|
55
|
+
stream.setRawMode?.(false);
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
else if (k === '\t') {
|
|
59
|
+
tui.nextPane();
|
|
60
|
+
}
|
|
61
|
+
else if (k === '1') {
|
|
62
|
+
tui.setRightMode('messages');
|
|
63
|
+
}
|
|
64
|
+
else if (k === '2') {
|
|
65
|
+
tui.setRightMode('diff');
|
|
66
|
+
}
|
|
67
|
+
else if (k === '\u001b[B' || k === 'j') {
|
|
68
|
+
tui.moveTreeCursor(1);
|
|
69
|
+
}
|
|
70
|
+
else if (k === '\u001b[A' || k === 'k') {
|
|
71
|
+
tui.moveTreeCursor(-1);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
tui.appendMessage('多窗格 TUI 已就绪(Tab 切窗格 / 1=消息 / 2=Diff / ↑↓ 文件树 / q 退出)');
|
|
75
|
+
}
|
|
76
|
+
function runTui() {
|
|
77
|
+
runTuiInteractive();
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=tui-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-run.js","sourceRoot":"","sources":["../../src/cli/tui-run.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/tui.js
CHANGED
package/dist/cli/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;GAaG;AACH,yCAAmC;AAEnC,MAAM,GAAG,GAAG,OAAO,CAAC;AACpB,YAAY;AACZ,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,WAAW;AACzC,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,WAAW;AAC1C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,CAAC,gBAAgB;AAC3D,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAC3C,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,QAAQ,CAAC;AAEtB,kCAAkC;AAClC,SAAS,MAAM,CAAC,GAAW,EAAE,GAAG,GAAG,CAAC;IAClC,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/version.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SIGNATURE = exports.TAGLINE = exports.PRODUCT = exports.VERSION = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* 飞虹 Code (Muse Code
|
|
5
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
6
6
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
7
|
*
|
|
8
8
|
* 版本号集中定义
|
|
9
9
|
*/
|
|
10
|
-
exports.VERSION = '7.
|
|
10
|
+
exports.VERSION = '7.6.0';
|
|
11
11
|
exports.PRODUCT = '飞虹 Code';
|
|
12
|
-
exports.TAGLINE = '终端 AI
|
|
12
|
+
exports.TAGLINE = '终端 AI 编程智能体(对标 Muse Code / Claude Code / Cursor CLI · 自研内核差异化)';
|
|
13
13
|
exports.SIGNATURE = '晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹';
|
|
14
14
|
//# sourceMappingURL=version.js.map
|
package/dist/cli/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,OAAO,GAAG,SAAS,CAAC;AACpB,QAAA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACU,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,OAAO,GAAG,SAAS,CAAC;AACpB,QAAA,OAAO,GAAG,gEAAgE,CAAC;AAC3E,QAAA,SAAS,GACpB,uCAAuC,CAAC"}
|
package/dist/enterprise/audit.js
CHANGED
package/dist/enterprise/index.js
CHANGED
|
@@ -19,7 +19,7 @@ exports.createEnterpriseRuntime = createEnterpriseRuntime;
|
|
|
19
19
|
exports.assertQuota = assertQuota;
|
|
20
20
|
exports.renderWhoami = renderWhoami;
|
|
21
21
|
/**
|
|
22
|
-
* 飞虹 Code (Muse Code
|
|
22
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
23
23
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
24
24
|
*
|
|
25
25
|
* M4 企业能力聚合装配:租户 → 策略 → 审计 → 配额 → 守卫。
|
package/dist/enterprise/quota.js
CHANGED
|
@@ -5,7 +5,7 @@ exports.assertValidId = assertValidId;
|
|
|
5
5
|
exports.resolveTenantContext = resolveTenantContext;
|
|
6
6
|
exports.listTenants = listTenants;
|
|
7
7
|
/**
|
|
8
|
-
* 飞虹 Code (Muse Code
|
|
8
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
9
9
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
10
10
|
*
|
|
11
11
|
* M4 多租户:身份解析与数据隔离。
|
package/dist/harness/executor.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RealModelExecutor = exports.MockOrchestratorExecutor = exports.SOLUTION_FILE = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* 飞虹 Code (Muse Code
|
|
5
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
6
6
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
7
|
*
|
|
8
8
|
* harness 执行器(可插拔):对单个评测实例运行 Agent 闭环。
|
package/dist/harness/index.js
CHANGED
|
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
/**
|
|
18
|
-
* 飞虹 Code (Muse Code
|
|
18
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
19
19
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
20
20
|
*
|
|
21
21
|
* 可插拔 harness 模块组统一出口:
|
package/dist/harness/loader.js
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.LocalJsonLoader = exports.SwebenchLoader = void 0;
|
|
4
4
|
exports.normalizeInstance = normalizeInstance;
|
|
5
5
|
/**
|
|
6
|
-
* 飞虹 Code (Muse Code
|
|
6
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
7
7
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
8
8
|
*
|
|
9
9
|
* harness 数据集加载器(可插拔):
|
package/dist/harness/types.js
CHANGED
package/dist/harness/verifier.js
CHANGED
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TestVerifier = exports.FileExistsVerifier = void 0;
|
|
4
4
|
/**
|
|
5
|
-
* 飞虹 Code (Muse Code
|
|
5
|
+
* 飞虹 Code (对标 Muse Code · 自研内核)
|
|
6
6
|
* 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
7
7
|
*
|
|
8
8
|
* harness 验证器(可插拔):判定执行产出是否满足通过条件。
|
|
9
9
|
* - HarnessVerifier 接口:文件存在 / 测试通过 / 自定义规则均可实现接入(异步,跑测试需要)
|
|
10
|
-
* - FileExistsVerifier
|
|
11
|
-
* - TestVerifier
|
|
12
|
-
*
|
|
10
|
+
* - FileExistsVerifier:检查工作区是否生成了指定文件(mock 闭环冒烟用)
|
|
11
|
+
* - TestVerifier:按 SWE-bench 语义验证——
|
|
12
|
+
* ① FAIL_TO_PASS 用例必须先失败后通过(修复前验证失败可选用 beforeCommand);
|
|
13
|
+
* ② 修复后 FAIL_TO_PASS 必须全部通过;
|
|
14
|
+
* ③ PASS_TO_PASS 回归测试必须仍然通过(防止修坏既有功能)。
|
|
13
15
|
* 命令经 sanitizeManagedCommand 约束(仅包管理器脚本,防命令注入)。
|
|
14
16
|
*/
|
|
15
17
|
const fs_1 = require("fs");
|
|
@@ -27,22 +29,60 @@ class FileExistsVerifier {
|
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
exports.FileExistsVerifier = FileExistsVerifier;
|
|
30
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* 测试通过型验证器(SWE-bench 语义):
|
|
34
|
+
* 修复后 FAIL_TO_PASS 全部通过 且 PASS_TO_PASS 回归全部通过,才算验证通过。
|
|
35
|
+
* 可选 beforeCommand:在验证前先跑一次(确认 FAIL_TO_PASS 原本确实失败,防"测试本来就过"的假阳性)。
|
|
36
|
+
*/
|
|
31
37
|
class TestVerifier {
|
|
32
38
|
opts;
|
|
33
39
|
id = 'test-run';
|
|
34
40
|
constructor(opts = {}) {
|
|
35
41
|
this.opts = opts;
|
|
36
42
|
}
|
|
43
|
+
/** 在 cwd 执行单条命令并返回退出码;命令不合法时返回 -1(判为不通过,防注入) */
|
|
44
|
+
async runOne(cmd, cwd) {
|
|
45
|
+
const safe = (0, exec_1.sanitizeManagedCommand)(cmd, cmd);
|
|
46
|
+
if (!safe)
|
|
47
|
+
return -1;
|
|
48
|
+
const res = await (0, exec_1.runCommand)(safe, cwd, this.opts.timeoutMs ?? 120000);
|
|
49
|
+
return res.code;
|
|
50
|
+
}
|
|
51
|
+
/** 从命令的退出码判断"存在失败用例"(退出码非 0 即视为有失败) */
|
|
52
|
+
anyFailed(cmd, cwd) {
|
|
53
|
+
return this.runOne(cmd, cwd).then((code) => code !== 0);
|
|
54
|
+
}
|
|
37
55
|
async verify(cwd, instance) {
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
56
|
+
// 0) 可选:修复前确认 FAIL_TO_PASS 原本失败(真 SWE-bench 的差分前提)
|
|
57
|
+
if (this.opts.beforeCommand) {
|
|
58
|
+
const preFail = await this.anyFailed(this.opts.beforeCommand, cwd);
|
|
59
|
+
// 若修复前没有失败用例,则本次验证无意义(用例本来就过),判为不通过
|
|
60
|
+
if (!preFail)
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// 1) FAIL_TO_PASS:修复后这些用例必须全部通过
|
|
64
|
+
const ftpCmd = this.opts.failToPassCommand ??
|
|
65
|
+
(instance.FAIL_TO_PASS.length > 0
|
|
66
|
+
? `npm test -- ${instance.FAIL_TO_PASS.map(quoteTestId).join(' ')}`
|
|
67
|
+
: this.opts.testCommand ?? 'npm test');
|
|
68
|
+
const ftpCode = await this.runOne(ftpCmd, cwd);
|
|
69
|
+
if (ftpCode !== 0)
|
|
70
|
+
return false;
|
|
71
|
+
// 2) PASS_TO_PASS:既有功能回归必须仍然通过(防止修坏)
|
|
72
|
+
if (instance.PASS_TO_PASS.length > 0) {
|
|
73
|
+
const p2pCmd = this.opts.passToPassCommand ?? this.opts.testCommand ?? 'npm test';
|
|
74
|
+
const p2pCode = await this.runOne(p2pCmd, cwd);
|
|
75
|
+
if (p2pCode !== 0)
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
45
79
|
}
|
|
46
80
|
}
|
|
47
81
|
exports.TestVerifier = TestVerifier;
|
|
82
|
+
/** 将测试用例 id 安全转义为 shell 参数(仅允许 [A-Za-z0-9_\-.:/\[\]#]) */
|
|
83
|
+
function quoteTestId(id) {
|
|
84
|
+
if (!/^[A-Za-z0-9_\-.:/[\]#]+$/.test(id))
|
|
85
|
+
return '';
|
|
86
|
+
return id;
|
|
87
|
+
}
|
|
48
88
|
//# sourceMappingURL=verifier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/harness/verifier.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/harness/verifier.ts"],"names":[],"mappings":"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"}
|