feihong-code 7.0.0 → 7.5.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 +180 -140
- package/.github/workflows/release.yml +200 -0
- package/CHANGELOG.md +94 -65
- package/README.md +609 -586
- package/dist/agent/browser-agent.js +354 -0
- package/dist/agent/browser-agent.js.map +1 -0
- package/dist/agent/change-manager.js +433 -0
- package/dist/agent/change-manager.js.map +1 -0
- package/dist/agent/code-rag.js +293 -0
- package/dist/agent/code-rag.js.map +1 -0
- package/dist/agent/code-writer.js +13 -1
- package/dist/agent/code-writer.js.map +1 -1
- package/dist/agent/completion-engine.js +553 -0
- package/dist/agent/completion-engine.js.map +1 -0
- 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 +235 -10
- package/dist/agent/context-compactor.js.map +1 -1
- package/dist/agent/custom-agent.js +368 -0
- package/dist/agent/custom-agent.js.map +1 -0
- package/dist/agent/design-to-code.js +218 -0
- package/dist/agent/design-to-code.js.map +1 -0
- package/dist/agent/event-driven-agent.js +359 -0
- package/dist/agent/event-driven-agent.js.map +1 -0
- package/dist/agent/git-integration.js +324 -0
- package/dist/agent/git-integration.js.map +1 -0
- package/dist/agent/layered-memory.js +329 -0
- package/dist/agent/layered-memory.js.map +1 -0
- package/dist/agent/lint.js +121 -0
- package/dist/agent/lint.js.map +1 -0
- package/dist/agent/multi-agent.js +359 -0
- package/dist/agent/multi-agent.js.map +1 -0
- package/dist/agent/orchestrator.js +136 -25
- package/dist/agent/orchestrator.js.map +1 -1
- package/dist/agent/prompts.js +54 -54
- package/dist/agent/quality-gate.js +139 -0
- package/dist/agent/quality-gate.js.map +1 -1
- package/dist/agent/self-correction.js +274 -0
- package/dist/agent/self-correction.js.map +1 -0
- package/dist/agent/self-heal.js +47 -17
- package/dist/agent/self-heal.js.map +1 -1
- package/dist/agent/solo-agent.js +321 -0
- package/dist/agent/solo-agent.js.map +1 -0
- package/dist/agent/symbol-index.js +258 -28
- package/dist/agent/symbol-index.js.map +1 -1
- package/dist/agent/team-collaboration.js +252 -0
- package/dist/agent/team-collaboration.js.map +1 -0
- package/dist/agent/type-checker.js +229 -0
- package/dist/agent/type-checker.js.map +1 -0
- package/dist/cli/commands.js +9 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/index.js +9 -0
- 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/run.js +130 -40
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/tui-run.js +79 -0
- package/dist/cli/tui-run.js.map +1 -0
- package/dist/cli/tui.js.map +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/integrations/collaboration.js +219 -0
- package/dist/integrations/collaboration.js.map +1 -0
- package/dist/integrations/figma.js +307 -0
- package/dist/integrations/figma.js.map +1 -0
- package/dist/integrations/sso.js +327 -0
- package/dist/integrations/sso.js.map +1 -0
- package/dist/knowledge/library.js +301 -0
- package/dist/knowledge/library.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/plugins/manager.js +380 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/runtime/event-log.js.map +1 -1
- package/dist/shared/i18n.js +108 -100
- package/dist/shared/i18n.js.map +1 -1
- package/dist/tools/browser/browser.tool.js +217 -0
- package/dist/tools/browser/browser.tool.js.map +1 -0
- package/dist/tools/generator/code-generator.js +40 -40
- package/dist/tools/generator/test-generator.js +9 -9
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/shell/exec.js +73 -11
- package/dist/tools/shell/exec.js.map +1 -1
- package/dist/tools/shell/run-shell.tool.js +8 -2
- package/dist/tools/shell/run-shell.tool.js.map +1 -1
- package/dist/training/completion-evaluator.js +213 -0
- package/dist/training/completion-evaluator.js.map +1 -0
- package/dist/training/fim-data.js +248 -0
- package/dist/training/fim-data.js.map +1 -0
- package/dist/voice/voice-programming.js +223 -0
- package/dist/voice/voice-programming.js.map +1 -0
- package/dist/web/extra-apis.js +440 -0
- package/dist/web/extra-apis.js.map +1 -0
- package/dist/web/public/css/style.css +1729 -1671
- package/dist/web/public/index.html +1242 -990
- package/dist/web/public/js/api.js +555 -382
- package/dist/web/public/js/app.js +2210 -2210
- package/dist/web/public/js/mock-api.js +234 -0
- package/dist/web/public/js/monaco-editor.js +363 -0
- package/dist/web/public/js/ui.js +2251 -1059
- package/dist/web/public/js/utils.js +214 -214
- package/dist/web/public/manifest.json +59 -0
- package/dist/web/public/service-worker.js +173 -0
- package/dist/web/server.js +1116 -45
- package/dist/web/server.js.map +1 -1
- package/dist/web/task-queue.js +22 -2
- package/dist/web/task-queue.js.map +1 -1
- package/docs/BENCHMARK_REPORT_en.md +386 -329
- package/docs/BENCHMARK_REPORT_zh.md +386 -329
- package/docs/DPA.md +63 -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 +67 -0
- package/docs/SECURITY_WHITEPAPER.md +74 -0
- package/docs/SWE_BENCH_REPORT.md +55 -0
- package/docs/TECHNICAL_SPEC_en.md +292 -292
- package/docs/TECHNICAL_SPEC_zh.md +292 -292
- package/docs/UPDATE_NOTES_en.md +159 -159
- package/docs/UPDATE_NOTES_zh.md +159 -159
- package/docs/UPGRADE_7.2.0.md +309 -0
- package/docs/UPGRADE_GUIDE_7_5.md +86 -0
- package/docs/geo-feihong-code.html +391 -0
- 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 +82 -0
- package/electron/main.js +404 -404
- package/package.json +175 -167
- 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/tool-schema.json +197 -197
- package/dist/hello.js +0 -14
- package/dist/hello.js.map +0 -1
- package/dist/self-evolve/hook.ts +0 -80
- package/dist/self-evolve/manager.d.ts +0 -8
- package/dist/web/web-config.js +0 -143
- package/dist/web/web-config.js.map +0 -1
package/.github/workflows/ci.yml
CHANGED
|
@@ -1,140 +1,180 @@
|
|
|
1
|
-
# 飞虹 Code CI
|
|
2
|
-
# 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
3
|
-
#
|
|
4
|
-
# 全流程离线:不使用任何 API key / Secrets,PR 来自 fork 也能安全跑完。
|
|
5
|
-
name: CI
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
push:
|
|
9
|
-
branches: [master, main]
|
|
10
|
-
pull_request:
|
|
11
|
-
workflow_dispatch:
|
|
12
|
-
|
|
13
|
-
env:
|
|
14
|
-
FH_OFFLINE: 'true'
|
|
15
|
-
FH_PROVIDERS: '[]'
|
|
16
|
-
|
|
17
|
-
jobs:
|
|
18
|
-
# ---------- 1. 构建与离线闭环冒烟(多 Node 版本矩阵) ----------
|
|
19
|
-
build:
|
|
20
|
-
name: 构建 · Node ${{ matrix.node }}
|
|
21
|
-
runs-on: ubuntu-latest
|
|
22
|
-
strategy:
|
|
23
|
-
fail-fast: false
|
|
24
|
-
matrix:
|
|
25
|
-
node: [18, 20, 22]
|
|
26
|
-
steps:
|
|
27
|
-
- uses: actions/checkout@v4
|
|
28
|
-
- uses: actions/setup-node@v4
|
|
29
|
-
with:
|
|
30
|
-
node-version: ${{ matrix.node }}
|
|
31
|
-
- run: npm install
|
|
32
|
-
- name: 类型检查
|
|
33
|
-
run: npm run typecheck
|
|
34
|
-
- name: 编译
|
|
35
|
-
run: npm run build
|
|
36
|
-
- name: CLI 可用性
|
|
37
|
-
run: node dist/cli/index.js --version
|
|
38
|
-
- name: 离线端到端闭环
|
|
39
|
-
run: node dist/cli/index.js "离线冒烟:创建一个说明文件"
|
|
40
|
-
- name: 只读技能
|
|
41
|
-
run: |
|
|
42
|
-
node dist/cli/index.js /plan "实现登录并且添加支付"
|
|
43
|
-
node dist/cli/index.js /grill src
|
|
44
|
-
|
|
45
|
-
# ---------- 2. M4 企业能力(权限 / 审计 / 多租户 / 配额) ----------
|
|
46
|
-
enterprise:
|
|
47
|
-
name: 企业能力冒烟 (M4)
|
|
48
|
-
runs-on: ubuntu-latest
|
|
49
|
-
steps:
|
|
50
|
-
- uses: actions/checkout@v4
|
|
51
|
-
- uses: actions/setup-node@v4
|
|
52
|
-
with:
|
|
53
|
-
node-version: 20
|
|
54
|
-
- run: npm install
|
|
55
|
-
- run: npm run build
|
|
56
|
-
- name: M4 断言套件(RBAC / 审计链 / 多租户 / 配额)
|
|
57
|
-
run: node scripts/verify-m4.mjs
|
|
58
|
-
- name: CLI 企业命令冒烟
|
|
59
|
-
env:
|
|
60
|
-
FH_HOME: ${{ runner.temp }}/fhhome
|
|
61
|
-
FH_TENANT: ci-tenant
|
|
62
|
-
FH_USER: ci-bot
|
|
63
|
-
FH_ROLE: developer
|
|
64
|
-
run: |
|
|
65
|
-
node dist/cli/index.js whoami
|
|
66
|
-
node dist/cli/index.js policy
|
|
67
|
-
node dist/cli/index.js "CI 离线任务"
|
|
68
|
-
node dist/cli/index.js audit --limit 10
|
|
69
|
-
node dist/cli/index.js audit verify
|
|
70
|
-
node dist/cli/index.js tenants
|
|
71
|
-
- name: 租户隔离断言(beta 不得看到 ci-tenant 的会话)
|
|
72
|
-
env:
|
|
73
|
-
FH_HOME: ${{ runner.temp }}/fhhome
|
|
74
|
-
FH_TENANT: beta-tenant
|
|
75
|
-
FH_ROLE: viewer
|
|
76
|
-
run: |
|
|
77
|
-
out=$(node dist/cli/index.js sessions)
|
|
78
|
-
echo "$out"
|
|
79
|
-
if echo "$out" | grep -q "CI 离线任务"; then
|
|
80
|
-
echo "::error::租户隔离失效:beta-tenant 读到了 ci-tenant 的会话"
|
|
81
|
-
exit 1
|
|
82
|
-
fi
|
|
83
|
-
|
|
84
|
-
# ---------- 3. 供应链与密钥安全 ----------
|
|
85
|
-
security:
|
|
86
|
-
name: 发布包安全检查
|
|
87
|
-
runs-on: ubuntu-latest
|
|
88
|
-
steps:
|
|
89
|
-
- uses: actions/checkout@v4
|
|
90
|
-
- uses: actions/setup-node@v4
|
|
91
|
-
with:
|
|
92
|
-
node-version: 20
|
|
93
|
-
- run: npm install
|
|
94
|
-
- run: npm run build
|
|
95
|
-
- name: 发布包不得包含密钥或源码
|
|
96
|
-
run: |
|
|
97
|
-
npm pack --dry-run 2>&1 | tee pack.txt
|
|
98
|
-
for bad in ".env" "src/" ".workbuddy" "policy.json" "id_rsa"; do
|
|
99
|
-
if grep -q "$bad" pack.txt; then
|
|
100
|
-
echo "::error::发布包中检出敏感条目: $bad"
|
|
101
|
-
exit 1
|
|
102
|
-
fi
|
|
103
|
-
done
|
|
104
|
-
echo "发布包白名单校验通过"
|
|
105
|
-
- name: 仓库内不得提交明文密钥
|
|
106
|
-
run: |
|
|
107
|
-
if git grep -nIE "sk-[A-Za-z0-9_-]{16,}" -- . ':!*.md' ':!scripts/verify-m4.mjs' ':!tests/unit/redact.test.ts'; then
|
|
108
|
-
echo "::error::检出疑似明文 API Key"
|
|
109
|
-
exit 1
|
|
110
|
-
fi
|
|
111
|
-
echo "密钥扫描通过"
|
|
112
|
-
- run: npm audit --omit=dev --audit-level=high
|
|
113
|
-
continue-on-error: true
|
|
114
|
-
|
|
115
|
-
# ----------
|
|
116
|
-
|
|
117
|
-
name:
|
|
118
|
-
runs-on: ubuntu-latest
|
|
119
|
-
steps:
|
|
120
|
-
- uses: actions/checkout@v4
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
1
|
+
# 飞虹 Code CI
|
|
2
|
+
# 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
3
|
+
#
|
|
4
|
+
# 全流程离线:不使用任何 API key / Secrets,PR 来自 fork 也能安全跑完。
|
|
5
|
+
name: CI
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [master, main]
|
|
10
|
+
pull_request:
|
|
11
|
+
workflow_dispatch:
|
|
12
|
+
|
|
13
|
+
env:
|
|
14
|
+
FH_OFFLINE: 'true'
|
|
15
|
+
FH_PROVIDERS: '[]'
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
# ---------- 1. 构建与离线闭环冒烟(多 Node 版本矩阵) ----------
|
|
19
|
+
build:
|
|
20
|
+
name: 构建 · Node ${{ matrix.node }}
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
strategy:
|
|
23
|
+
fail-fast: false
|
|
24
|
+
matrix:
|
|
25
|
+
node: [18, 20, 22]
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
- uses: actions/setup-node@v4
|
|
29
|
+
with:
|
|
30
|
+
node-version: ${{ matrix.node }}
|
|
31
|
+
- run: npm install
|
|
32
|
+
- name: 类型检查
|
|
33
|
+
run: npm run typecheck
|
|
34
|
+
- name: 编译
|
|
35
|
+
run: npm run build
|
|
36
|
+
- name: CLI 可用性
|
|
37
|
+
run: node dist/cli/index.js --version
|
|
38
|
+
- name: 离线端到端闭环
|
|
39
|
+
run: node dist/cli/index.js "离线冒烟:创建一个说明文件"
|
|
40
|
+
- name: 只读技能
|
|
41
|
+
run: |
|
|
42
|
+
node dist/cli/index.js /plan "实现登录并且添加支付"
|
|
43
|
+
node dist/cli/index.js /grill src
|
|
44
|
+
|
|
45
|
+
# ---------- 2. M4 企业能力(权限 / 审计 / 多租户 / 配额) ----------
|
|
46
|
+
enterprise:
|
|
47
|
+
name: 企业能力冒烟 (M4)
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@v4
|
|
51
|
+
- uses: actions/setup-node@v4
|
|
52
|
+
with:
|
|
53
|
+
node-version: 20
|
|
54
|
+
- run: npm install
|
|
55
|
+
- run: npm run build
|
|
56
|
+
- name: M4 断言套件(RBAC / 审计链 / 多租户 / 配额)
|
|
57
|
+
run: node scripts/verify-m4.mjs
|
|
58
|
+
- name: CLI 企业命令冒烟
|
|
59
|
+
env:
|
|
60
|
+
FH_HOME: ${{ runner.temp }}/fhhome
|
|
61
|
+
FH_TENANT: ci-tenant
|
|
62
|
+
FH_USER: ci-bot
|
|
63
|
+
FH_ROLE: developer
|
|
64
|
+
run: |
|
|
65
|
+
node dist/cli/index.js whoami
|
|
66
|
+
node dist/cli/index.js policy
|
|
67
|
+
node dist/cli/index.js "CI 离线任务"
|
|
68
|
+
node dist/cli/index.js audit --limit 10
|
|
69
|
+
node dist/cli/index.js audit verify
|
|
70
|
+
node dist/cli/index.js tenants
|
|
71
|
+
- name: 租户隔离断言(beta 不得看到 ci-tenant 的会话)
|
|
72
|
+
env:
|
|
73
|
+
FH_HOME: ${{ runner.temp }}/fhhome
|
|
74
|
+
FH_TENANT: beta-tenant
|
|
75
|
+
FH_ROLE: viewer
|
|
76
|
+
run: |
|
|
77
|
+
out=$(node dist/cli/index.js sessions)
|
|
78
|
+
echo "$out"
|
|
79
|
+
if echo "$out" | grep -q "CI 离线任务"; then
|
|
80
|
+
echo "::error::租户隔离失效:beta-tenant 读到了 ci-tenant 的会话"
|
|
81
|
+
exit 1
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# ---------- 3. 供应链与密钥安全 ----------
|
|
85
|
+
security:
|
|
86
|
+
name: 发布包安全检查
|
|
87
|
+
runs-on: ubuntu-latest
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v4
|
|
90
|
+
- uses: actions/setup-node@v4
|
|
91
|
+
with:
|
|
92
|
+
node-version: 20
|
|
93
|
+
- run: npm install
|
|
94
|
+
- run: npm run build
|
|
95
|
+
- name: 发布包不得包含密钥或源码
|
|
96
|
+
run: |
|
|
97
|
+
npm pack --dry-run 2>&1 | tee pack.txt
|
|
98
|
+
for bad in ".env" "src/" ".workbuddy" "policy.json" "id_rsa"; do
|
|
99
|
+
if grep -q "$bad" pack.txt; then
|
|
100
|
+
echo "::error::发布包中检出敏感条目: $bad"
|
|
101
|
+
exit 1
|
|
102
|
+
fi
|
|
103
|
+
done
|
|
104
|
+
echo "发布包白名单校验通过"
|
|
105
|
+
- name: 仓库内不得提交明文密钥
|
|
106
|
+
run: |
|
|
107
|
+
if git grep -nIE "sk-[A-Za-z0-9_-]{16,}" -- . ':!*.md' ':!scripts/verify-m4.mjs' ':!tests/unit/redact.test.ts'; then
|
|
108
|
+
echo "::error::检出疑似明文 API Key"
|
|
109
|
+
exit 1
|
|
110
|
+
fi
|
|
111
|
+
echo "密钥扫描通过"
|
|
112
|
+
- run: npm audit --omit=dev --audit-level=high
|
|
113
|
+
continue-on-error: true
|
|
114
|
+
|
|
115
|
+
# ---------- 3b. 供应链安全:依赖漏洞 + SBOM(P0-2) ----------
|
|
116
|
+
supplychain:
|
|
117
|
+
name: 供应链安全 · 依赖扫描 + SBOM
|
|
118
|
+
runs-on: ubuntu-latest
|
|
119
|
+
steps:
|
|
120
|
+
- uses: actions/checkout@v4
|
|
121
|
+
- uses: actions/setup-node@v4
|
|
122
|
+
with:
|
|
123
|
+
node-version: 20
|
|
124
|
+
- run: npm install
|
|
125
|
+
# 1) npm audit:生产依赖 high 及以上漏洞视为失败(供应链准入证据)
|
|
126
|
+
- name: npm audit(生产依赖 high+)
|
|
127
|
+
run: npm audit --omit=dev --audit-level=high
|
|
128
|
+
# 2) osv-scanner:OSV 数据库全量扫描 lockfile
|
|
129
|
+
- name: osv-scanner(OSV 全量漏洞库)
|
|
130
|
+
uses: google/osv-scanner/actions/scanner@v2
|
|
131
|
+
with:
|
|
132
|
+
scan-args: |-
|
|
133
|
+
--format=sarif
|
|
134
|
+
--output=osv-scanner.sarif
|
|
135
|
+
.
|
|
136
|
+
- name: 上传 osv-scanner 结果
|
|
137
|
+
uses: actions/upload-artifact@v4
|
|
138
|
+
with:
|
|
139
|
+
name: osv-scanner.sarif
|
|
140
|
+
path: osv-scanner.sarif
|
|
141
|
+
# 3) SBOM 生成(CycloneDX,随版本发布的供应链物料清单)
|
|
142
|
+
- name: 生成 SBOM(CycloneDX)
|
|
143
|
+
run: |
|
|
144
|
+
npx --yes @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json --omit dev
|
|
145
|
+
echo "SBOM 已生成"
|
|
146
|
+
- name: 上传 SBOM
|
|
147
|
+
uses: actions/upload-artifact@v4
|
|
148
|
+
with:
|
|
149
|
+
name: sbom.cdx.json
|
|
150
|
+
path: sbom.cdx.json
|
|
151
|
+
- name: SBOM 冒烟(非空 + 合法 JSON)
|
|
152
|
+
run: |
|
|
153
|
+
node -e "const s=require('./sbom.cdx.json'); if(!s.components||s.components.length===0){process.exit(1)} console.log('SBOM 组件数:', s.components.length)"
|
|
154
|
+
|
|
155
|
+
# ---------- 4. 容器镜像构建校验(稳定部署) ----------
|
|
156
|
+
docker:
|
|
157
|
+
name: Docker 镜像构建校验
|
|
158
|
+
runs-on: ubuntu-latest
|
|
159
|
+
steps:
|
|
160
|
+
- uses: actions/checkout@v4
|
|
161
|
+
- name: 构建镜像(不推送)
|
|
162
|
+
run: docker build -t feihong-code:ci .
|
|
163
|
+
- name: 冒烟:容器内企业命令可用
|
|
164
|
+
run: |
|
|
165
|
+
docker run --rm \
|
|
166
|
+
-e FH_ENTERPRISE=true -e FH_TENANT=ci -e FH_USER=ci -e FH_ROLE=developer \
|
|
167
|
+
feihong-code:ci whoami
|
|
168
|
+
- name: 冒烟:Web 控制台可启动
|
|
169
|
+
run: |
|
|
170
|
+
docker run --rm -d --name fhcode-smoke -p 8099:8080 \
|
|
171
|
+
-e FH_ENTERPRISE=true -e FH_WEB_TOKEN=ci-token -e FH_WEB_PORT=8080 \
|
|
172
|
+
feihong-code:ci serve --port 8080
|
|
173
|
+
sleep 3
|
|
174
|
+
code=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ci-token" http://localhost:8099/api/health)
|
|
175
|
+
docker rm -f fhcode-smoke
|
|
176
|
+
if [ "$code" != "200" ]; then
|
|
177
|
+
echo "::error::Web 控制台健康检查失败,HTTP=$code"
|
|
178
|
+
exit 1
|
|
179
|
+
fi
|
|
180
|
+
echo "Web 控制台健康检查通过 (HTTP 200)"
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# 飞虹 Code 发布工作流
|
|
2
|
+
# 晋江市飞虹智科技企业管理有限公司 · 飞扬企源研发中心 · 负责人:吴赐虹
|
|
3
|
+
#
|
|
4
|
+
# 触发条件:
|
|
5
|
+
# 1. 推送 v* 标签(如 v1.0.0)→ 自动发布 npm 包 + Docker 镜像 + GitHub Release
|
|
6
|
+
# 2. 手动触发(workflow_dispatch)→ 可指定版本号
|
|
7
|
+
#
|
|
8
|
+
# 所需 Secrets:
|
|
9
|
+
# - NPM_TOKEN: npm 发布令牌
|
|
10
|
+
# - DOCKERHUB_USERNAME: Docker Hub 用户名
|
|
11
|
+
# - DOCKERHUB_TOKEN: Docker Hub 访问令牌
|
|
12
|
+
# - GH_TOKEN: GitHub Token(自动注入,无需手动配置)
|
|
13
|
+
|
|
14
|
+
name: Release
|
|
15
|
+
|
|
16
|
+
on:
|
|
17
|
+
push:
|
|
18
|
+
tags:
|
|
19
|
+
- 'v*'
|
|
20
|
+
workflow_dispatch:
|
|
21
|
+
inputs:
|
|
22
|
+
version:
|
|
23
|
+
description: '发布版本号(如 1.0.0)'
|
|
24
|
+
required: true
|
|
25
|
+
default: 'patch'
|
|
26
|
+
|
|
27
|
+
env:
|
|
28
|
+
NODE_VERSION: '20'
|
|
29
|
+
IMAGE_NAME: feihong-code
|
|
30
|
+
|
|
31
|
+
jobs:
|
|
32
|
+
# ---------- 1. 版本号准备 ----------
|
|
33
|
+
version:
|
|
34
|
+
name: 准备版本号
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
outputs:
|
|
37
|
+
version: ${{ steps.get_version.outputs.version }}
|
|
38
|
+
tag: ${{ steps.get_version.outputs.tag }}
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
with:
|
|
42
|
+
fetch-depth: 0
|
|
43
|
+
- name: 获取版本号
|
|
44
|
+
id: get_version
|
|
45
|
+
run: |
|
|
46
|
+
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
|
|
47
|
+
VERSION=${GITHUB_REF_NAME#v}
|
|
48
|
+
else
|
|
49
|
+
if [[ "${{ github.event.inputs.version }}" == "patch" ]]; then
|
|
50
|
+
VERSION=$(npm version patch --no-git-tag-version | sed 's/v//')
|
|
51
|
+
elif [[ "${{ github.event.inputs.version }}" == "minor" ]]; then
|
|
52
|
+
VERSION=$(npm version minor --no-git-tag-version | sed 's/v//')
|
|
53
|
+
elif [[ "${{ github.event.inputs.version }}" == "major" ]]; then
|
|
54
|
+
VERSION=$(npm version major --no-git-tag-version | sed 's/v//')
|
|
55
|
+
else
|
|
56
|
+
VERSION=${{ github.event.inputs.version }}
|
|
57
|
+
fi
|
|
58
|
+
fi
|
|
59
|
+
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
60
|
+
echo "tag=v$VERSION" >> $GITHUB_OUTPUT
|
|
61
|
+
echo "发布版本: v$VERSION"
|
|
62
|
+
|
|
63
|
+
# ---------- 2. 构建与测试(复用 CI 逻辑) ----------
|
|
64
|
+
build:
|
|
65
|
+
name: 构建与测试
|
|
66
|
+
needs: version
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v4
|
|
70
|
+
- uses: actions/setup-node@v4
|
|
71
|
+
with:
|
|
72
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
73
|
+
registry-url: 'https://registry.npmjs.org'
|
|
74
|
+
- run: npm install
|
|
75
|
+
- name: 类型检查
|
|
76
|
+
run: npm run typecheck
|
|
77
|
+
- name: 编译构建
|
|
78
|
+
run: npm run build
|
|
79
|
+
- name: 前端资源打包
|
|
80
|
+
run: node scripts/copy-web.cjs
|
|
81
|
+
- name: CLI 可用性验证
|
|
82
|
+
run: node dist/cli/index.js --version
|
|
83
|
+
- name: P7-5 安全 CI(npm audit + CycloneDX SBOM)
|
|
84
|
+
run: npm run security || (echo "⚠️ npm audit 网络不可达按跳过处理" && exit 0)
|
|
85
|
+
- name: P7-5 综合冒烟门禁(本地回归)
|
|
86
|
+
run: |
|
|
87
|
+
node dist/cli/index.js serve --port 8099 > /tmp/fh-serve.log 2>&1 &
|
|
88
|
+
SERVER_PID=$!
|
|
89
|
+
READY=0
|
|
90
|
+
for i in $(seq 1 40); do
|
|
91
|
+
if curl -sf http://127.0.0.1:8099/api/health >/dev/null 2>&1; then READY=1; break; fi
|
|
92
|
+
sleep 1
|
|
93
|
+
done
|
|
94
|
+
if [ "$READY" != "1" ]; then
|
|
95
|
+
echo "❌ 测试服务 40s 内未就绪,serve 日志:"
|
|
96
|
+
cat /tmp/fh-serve.log || true
|
|
97
|
+
kill $SERVER_PID 2>/dev/null || true
|
|
98
|
+
exit 1
|
|
99
|
+
fi
|
|
100
|
+
node scripts/_smoke-full.mjs
|
|
101
|
+
EXIT_CODE=$?
|
|
102
|
+
kill $SERVER_PID 2>/dev/null || true
|
|
103
|
+
exit $EXIT_CODE
|
|
104
|
+
- name: P7-1 SWE-bench harness 链路冒烟(mock)
|
|
105
|
+
run: node dist/cli/index.js harness lite --limit 1 --mode mock || echo "⚠️ harness 需网络拉取数据集,失败不阻断(真实跑分见 docs/SWE_BENCH_REPORT.md)"
|
|
106
|
+
- name: 上传构建产物
|
|
107
|
+
uses: actions/upload-artifact@v4
|
|
108
|
+
with:
|
|
109
|
+
name: dist-${{ needs.version.outputs.version }}
|
|
110
|
+
path: dist/
|
|
111
|
+
retention-days: 30
|
|
112
|
+
|
|
113
|
+
# ---------- 3. 发布 npm 包 ----------
|
|
114
|
+
npm-publish:
|
|
115
|
+
name: 发布 npm 包
|
|
116
|
+
needs: [version, build]
|
|
117
|
+
runs-on: ubuntu-latest
|
|
118
|
+
if: github.event_name == 'push' || github.event.inputs.version != 'patch'
|
|
119
|
+
steps:
|
|
120
|
+
- uses: actions/checkout@v4
|
|
121
|
+
- uses: actions/setup-node@v4
|
|
122
|
+
with:
|
|
123
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
124
|
+
registry-url: 'https://registry.npmjs.org'
|
|
125
|
+
- name: 下载构建产物
|
|
126
|
+
uses: actions/download-artifact@v4
|
|
127
|
+
with:
|
|
128
|
+
name: dist-${{ needs.version.outputs.version }}
|
|
129
|
+
path: dist/
|
|
130
|
+
- name: 安装依赖(prepack build 需要)
|
|
131
|
+
run: npm ci
|
|
132
|
+
- name: 设置版本号
|
|
133
|
+
run: npm version ${{ needs.version.outputs.version }} --no-git-tag-version --allow-same-version
|
|
134
|
+
- name: 发布到 npm
|
|
135
|
+
run: npm publish --access public
|
|
136
|
+
env:
|
|
137
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
138
|
+
|
|
139
|
+
# ---------- 4. 构建并推送 Docker 镜像 ----------
|
|
140
|
+
docker-publish:
|
|
141
|
+
name: 发布 Docker 镜像
|
|
142
|
+
needs: [version, build]
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
if: github.event_name == 'push' || github.event.inputs.version != 'patch'
|
|
145
|
+
steps:
|
|
146
|
+
- uses: actions/checkout@v4
|
|
147
|
+
- name: 设置 Docker Buildx
|
|
148
|
+
uses: docker/setup-buildx-action@v3
|
|
149
|
+
- name: 登录 Docker Hub
|
|
150
|
+
uses: docker/login-action@v3
|
|
151
|
+
with:
|
|
152
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
153
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
154
|
+
- name: 构建并推送镜像
|
|
155
|
+
uses: docker/build-push-action@v5
|
|
156
|
+
with:
|
|
157
|
+
context: .
|
|
158
|
+
push: true
|
|
159
|
+
tags: |
|
|
160
|
+
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:${{ needs.version.outputs.version }}
|
|
161
|
+
${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:latest
|
|
162
|
+
cache-from: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:buildcache
|
|
163
|
+
cache-to: type=registry,ref=${{ secrets.DOCKERHUB_USERNAME }}/${{ env.IMAGE_NAME }}:buildcache,mode=max
|
|
164
|
+
|
|
165
|
+
# ---------- 5. 创建 GitHub Release ----------
|
|
166
|
+
github-release:
|
|
167
|
+
name: 创建 GitHub Release
|
|
168
|
+
needs: [version, build, npm-publish, docker-publish]
|
|
169
|
+
runs-on: ubuntu-latest
|
|
170
|
+
if: github.event_name == 'push'
|
|
171
|
+
steps:
|
|
172
|
+
- uses: actions/checkout@v4
|
|
173
|
+
with:
|
|
174
|
+
fetch-depth: 0
|
|
175
|
+
- name: 生成变更日志
|
|
176
|
+
id: changelog
|
|
177
|
+
run: |
|
|
178
|
+
echo "## 飞虹 Code v${{ needs.version.outputs.version }}" > RELEASE_NOTES.md
|
|
179
|
+
echo "" >> RELEASE_NOTES.md
|
|
180
|
+
echo "### 发布说明" >> RELEASE_NOTES.md
|
|
181
|
+
echo "" >> RELEASE_NOTES.md
|
|
182
|
+
git log --pretty=format:"- %s (%h)" $(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo HEAD^)..HEAD >> RELEASE_NOTES.md 2>/dev/null || echo "- 首次发布" >> RELEASE_NOTES.md
|
|
183
|
+
echo "" >> RELEASE_NOTES.md
|
|
184
|
+
echo "### 安装方式" >> RELEASE_NOTES.md
|
|
185
|
+
echo "" >> RELEASE_NOTES.md
|
|
186
|
+
echo "\`\`\`bash" >> RELEASE_NOTES.md
|
|
187
|
+
echo "npm install -g feihong-code" >> RELEASE_NOTES.md
|
|
188
|
+
echo "# 或" >> RELEASE_NOTES.md
|
|
189
|
+
echo "docker pull ${{ secrets.DOCKERHUB_USERNAME }}/feihong-code:latest" >> RELEASE_NOTES.md
|
|
190
|
+
echo "\`\`\`" >> RELEASE_NOTES.md
|
|
191
|
+
- name: 创建 Release
|
|
192
|
+
uses: softprops/action-gh-release@v1
|
|
193
|
+
with:
|
|
194
|
+
tag_name: ${{ needs.version.outputs.tag }}
|
|
195
|
+
name: 飞虹 Code ${{ needs.version.outputs.tag }}
|
|
196
|
+
body_path: RELEASE_NOTES.md
|
|
197
|
+
draft: false
|
|
198
|
+
prerelease: false
|
|
199
|
+
env:
|
|
200
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|