feihong-code 0.2.3 → 0.5.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 (152) hide show
  1. package/.github/FUNDING.yml +4 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +37 -37
  3. package/.github/ISSUE_TEMPLATE/config.yml +14 -14
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +28 -28
  5. package/.github/PULL_REQUEST_TEMPLATE.md +46 -46
  6. package/.github/SECURITY.md +67 -67
  7. package/.github/dependabot.yml +16 -0
  8. package/.github/workflows/ci.yml +1 -1
  9. package/AGENT-GUIDE.md +382 -237
  10. package/CHANGELOG.md +405 -73
  11. package/CODE_OF_CONDUCT.md +56 -56
  12. package/CONTRIBUTING.md +68 -68
  13. package/LICENSE +22 -22
  14. package/README.md +527 -522
  15. package/README.self-evolve.md +274 -0
  16. package/dist/agent/code-review.js +2 -0
  17. package/dist/agent/code-review.js.map +1 -1
  18. package/dist/agent/code-writer.js +70 -17
  19. package/dist/agent/code-writer.js.map +1 -1
  20. package/dist/agent/context-compactor.js +13 -4
  21. package/dist/agent/context-compactor.js.map +1 -1
  22. package/dist/agent/experience.js +262 -62
  23. package/dist/agent/experience.js.map +1 -1
  24. package/dist/agent/orchestrator.js +148 -68
  25. package/dist/agent/orchestrator.js.map +1 -1
  26. package/dist/agent/quality-gate.js +10 -4
  27. package/dist/agent/quality-gate.js.map +1 -1
  28. package/dist/agent/repo-context.js +181 -0
  29. package/dist/agent/repo-context.js.map +1 -0
  30. package/dist/agent/repo-reader.js +92 -99
  31. package/dist/agent/repo-reader.js.map +1 -1
  32. package/dist/agent/self-heal.js +38 -48
  33. package/dist/agent/self-heal.js.map +1 -1
  34. package/dist/agent/self-improver.js +65 -61
  35. package/dist/agent/self-improver.js.map +1 -1
  36. package/dist/agent/subagent-summary.js +31 -0
  37. package/dist/agent/subagent-summary.js.map +1 -0
  38. package/dist/agent/subagent.js +52 -2
  39. package/dist/agent/subagent.js.map +1 -1
  40. package/dist/agent/symbol-index.js +160 -0
  41. package/dist/agent/symbol-index.js.map +1 -0
  42. package/dist/agent/team.js +193 -0
  43. package/dist/agent/team.js.map +1 -0
  44. package/dist/cli/commands.js +124 -143
  45. package/dist/cli/commands.js.map +1 -1
  46. package/dist/cli/index.js +113 -106
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli/repl.js +82 -7
  49. package/dist/cli/repl.js.map +1 -1
  50. package/dist/cli/run.js +601 -95
  51. package/dist/cli/run.js.map +1 -1
  52. package/dist/cli/tui.js +145 -0
  53. package/dist/cli/tui.js.map +1 -0
  54. package/dist/cli/version.js +1 -1
  55. package/dist/enterprise/audit.js +75 -12
  56. package/dist/enterprise/audit.js.map +1 -1
  57. package/dist/enterprise/index.js +14 -11
  58. package/dist/enterprise/index.js.map +1 -1
  59. package/dist/enterprise/policy.js +22 -10
  60. package/dist/enterprise/policy.js.map +1 -1
  61. package/dist/harness/executor.js +127 -0
  62. package/dist/harness/executor.js.map +1 -0
  63. package/dist/harness/harness.js +87 -0
  64. package/dist/harness/harness.js.map +1 -0
  65. package/dist/harness/index.js +31 -0
  66. package/dist/harness/index.js.map +1 -0
  67. package/dist/harness/loader.js +138 -0
  68. package/dist/harness/loader.js.map +1 -0
  69. package/dist/harness/reporter.js +34 -0
  70. package/dist/harness/reporter.js.map +1 -0
  71. package/dist/harness/types.js +10 -0
  72. package/dist/harness/types.js.map +1 -0
  73. package/dist/harness/verifier.js +48 -0
  74. package/dist/harness/verifier.js.map +1 -0
  75. package/dist/hello.js +14 -0
  76. package/dist/hello.js.map +1 -0
  77. package/dist/memory/auto-summarize.js +208 -0
  78. package/dist/memory/auto-summarize.js.map +1 -0
  79. package/dist/memory/index.js +228 -0
  80. package/dist/memory/index.js.map +1 -0
  81. package/dist/models/model-router.js +23 -10
  82. package/dist/models/model-router.js.map +1 -1
  83. package/dist/plugins/plugin-loader.js +179 -0
  84. package/dist/plugins/plugin-loader.js.map +1 -0
  85. package/dist/runtime/event-log.js.map +1 -1
  86. package/dist/runtime/hooks.js +80 -0
  87. package/dist/runtime/hooks.js.map +1 -0
  88. package/dist/self-evolve/hook.js +60 -0
  89. package/dist/self-evolve/hook.js.map +1 -0
  90. package/dist/shared/config.js +35 -3
  91. package/dist/shared/config.js.map +1 -1
  92. package/dist/shared/i18n.js +535 -0
  93. package/dist/shared/i18n.js.map +1 -0
  94. package/dist/skills/grill.js +2 -1
  95. package/dist/skills/grill.js.map +1 -1
  96. package/dist/skills/self-heal.js +73 -0
  97. package/dist/skills/self-heal.js.map +1 -0
  98. package/dist/skills/skill-loader.js +131 -0
  99. package/dist/skills/skill-loader.js.map +1 -0
  100. package/dist/skills/skill-market.js +195 -0
  101. package/dist/skills/skill-market.js.map +1 -0
  102. package/dist/tools/analysis/code-analyzer.js +45 -18
  103. package/dist/tools/analysis/code-analyzer.js.map +1 -1
  104. package/dist/tools/index.js +5 -0
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/tools/mcp/index.js +84 -0
  107. package/dist/tools/mcp/index.js.map +1 -0
  108. package/dist/tools/mcp/mcp-client.js +172 -0
  109. package/dist/tools/mcp/mcp-client.js.map +1 -0
  110. package/dist/tools/sandbox.js +126 -0
  111. package/dist/tools/sandbox.js.map +1 -0
  112. package/dist/tools/shell/exec.js +25 -0
  113. package/dist/tools/shell/exec.js.map +1 -1
  114. package/dist/tools/shell/run-shell.tool.js +4 -1
  115. package/dist/tools/shell/run-shell.tool.js.map +1 -1
  116. package/dist/tools/skills/load-skill.tool.js +36 -0
  117. package/dist/tools/skills/load-skill.tool.js.map +1 -0
  118. package/dist/tools/tool.interface.js.map +1 -1
  119. package/dist/tools/tool.registry.js +37 -1
  120. package/dist/tools/tool.registry.js.map +1 -1
  121. package/dist/tools/web/web.tool.js +139 -0
  122. package/dist/tools/web/web.tool.js.map +1 -0
  123. package/dist/web/auth.js +42 -3
  124. package/dist/web/auth.js.map +1 -1
  125. package/dist/web/channels.js +171 -0
  126. package/dist/web/channels.js.map +1 -0
  127. package/dist/web/public/index.html +3253 -39
  128. package/dist/web/public/index.html.tmp +3117 -0
  129. package/dist/web/public/index_new.html +3196 -0
  130. package/dist/web/server.js +790 -11
  131. package/dist/web/server.js.map +1 -1
  132. package/dist/web/task-queue.js +352 -0
  133. package/dist/web/task-queue.js.map +1 -0
  134. package/dist/web/web-config.js +143 -0
  135. package/dist/web/web-config.js.map +1 -0
  136. package/docs/Deployment_Guide_EN.md +288 -0
  137. package/docs/Technical_Manual_EN.md +216 -0
  138. package/docs/User_Manual_EN.md +314 -0
  139. package/docs/self-evolve-implementation.md +165 -0
  140. package/docs/self-evolve.md +166 -0
  141. package/docs//344/272/247/345/223/201/345/274/200/345/217/221/346/226/207/346/241/243.md +614 -614
  142. 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 -267
  143. package/docs//344/275/277/347/224/250/350/257/264/346/230/216/344/271/246.md +318 -358
  144. 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 -130
  145. package/docs//346/212/200/346/234/257/350/257/264/346/230/216/344/271/246.md +216 -303
  146. package/docs//346/236/266/346/236/204/344/270/216API.md +238 -238
  147. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +196 -196
  148. package/docs//351/203/250/347/275/262/346/214/207/345/215/227.md +165 -165
  149. package/docs//351/203/250/347/275/262/350/257/264/346/230/216/344/271/246.md +288 -0
  150. package/docs//351/205/215/347/275/256/345/217/202/350/200/203.md +127 -127
  151. package/package.json +114 -109
  152. package/tool-schema.json +127 -127
@@ -0,0 +1,4 @@
1
+ # 飞虹 Code 赞助方式
2
+ # GitHub Sponsor 按钮配置文件
3
+ github: [wch887292]
4
+ custom: ["https://www.klai.top/opensource.html"]
@@ -1,37 +1,37 @@
1
- ---
2
- name: Bug 报告
3
- about: 创建报告帮助我们改进
4
- title: '[Bug] '
5
- labels: 'bug'
6
- assignees: ''
7
- ---
8
-
9
- ## 环境信息
10
-
11
- - **操作系统**: (如 Windows 11 / macOS 14 / Ubuntu 22.04)
12
- - **Node.js 版本**: `node --version`
13
- - **fhcode 版本**: `fhcode --version`
14
- - **模型配置**: Ollama / DeepSeek / OpenAI / 其他
15
- - **CLI 模式**: 单命令 / --parallel / swe
16
-
17
- ## 复现步骤
18
-
19
- 1. 执行命令: `fhcode "..."`
20
- 2. 输出或错误:
21
- ```
22
- (粘贴完整错误信息)
23
- ```
24
-
25
- ## 预期行为
26
-
27
- (描述你期望看到什么)
28
-
29
- ## 实际行为
30
-
31
- (描述实际发生了什么)
32
-
33
- ## 额外上下文
34
-
35
- - [ ] 我已在本地验证此 bug
36
- - [ ] 此问题可稳定复现
37
- - [ ] 相关截图或日志已附加
1
+ ---
2
+ name: Bug 报告
3
+ about: 创建报告帮助我们改进
4
+ title: '[Bug] '
5
+ labels: 'bug'
6
+ assignees: ''
7
+ ---
8
+
9
+ ## 环境信息
10
+
11
+ - **操作系统**: (如 Windows 11 / macOS 14 / Ubuntu 22.04)
12
+ - **Node.js 版本**: `node --version`
13
+ - **fhcode 版本**: `fhcode --version`
14
+ - **模型配置**: Ollama / DeepSeek / OpenAI / 其他
15
+ - **CLI 模式**: 单命令 / --parallel / swe
16
+
17
+ ## 复现步骤
18
+
19
+ 1. 执行命令: `fhcode "..."`
20
+ 2. 输出或错误:
21
+ ```
22
+ (粘贴完整错误信息)
23
+ ```
24
+
25
+ ## 预期行为
26
+
27
+ (描述你期望看到什么)
28
+
29
+ ## 实际行为
30
+
31
+ (描述实际发生了什么)
32
+
33
+ ## 额外上下文
34
+
35
+ - [ ] 我已在本地验证此 bug
36
+ - [ ] 此问题可稳定复现
37
+ - [ ] 相关截图或日志已附加
@@ -1,14 +1,14 @@
1
- blank_issues_enabled: true
2
- contact_links:
3
- - name: 📚 文档与 FAQ
4
- url: https://github.com/wch887292/feihong-code/blob/master/docs/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5.md
5
- about: 查看常见问题与故障排查
6
- - name: 💬 讨论与交流
7
- url: https://github.com/wch887292/feihong-code/discussions
8
- about: 发起讨论、分享经验、寻求帮助
9
- - name: 🤝 贡献指南
10
- url: https://github.com/wch887292/feihong-code/blob/master/CONTRIBUTING.md
11
- about: 了解如何参与项目开发
12
- - name: 🔐 安全漏洞报告
13
- url: https://github.com/wch887292/feihong-code/blob/master/.github/SECURITY.md
14
- about: 发现安全问题,请通过安全渠道报告
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: 📚 文档与 FAQ
4
+ url: https://github.com/wch887292/feihong-code/blob/master/docs/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E4%B8%8E%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5.md
5
+ about: 查看常见问题与故障排查
6
+ - name: 💬 讨论与交流
7
+ url: https://github.com/wch887292/feihong-code/discussions
8
+ about: 发起讨论、分享经验、寻求帮助
9
+ - name: 🤝 贡献指南
10
+ url: https://github.com/wch887292/feihong-code/blob/master/CONTRIBUTING.md
11
+ about: 了解如何参与项目开发
12
+ - name: 🔐 安全漏洞报告
13
+ url: https://github.com/wch887292/feihong-code/blob/master/.github/SECURITY.md
14
+ about: 发现安全问题,请通过安全渠道报告
@@ -1,28 +1,28 @@
1
- ---
2
- name: 功能请求
3
- about: 为这个项目提出想法
4
- title: '[Feature] '
5
- labels: 'enhancement'
6
- assignees: ''
7
- ---
8
-
9
- ## 功能描述
10
-
11
- (清晰简洁地描述你希望增加的功能)
12
-
13
- ## 使用场景
14
-
15
- (说明这个功能会解决什么问题,适用哪些场景)
16
-
17
- ## 建议实现方案
18
-
19
- (如有技术方案或参考实现,请提供)
20
-
21
- ## 备选方案
22
-
23
- (你考虑过哪些替代方案?)
24
-
25
- ## 额外信息
26
-
27
- - **关联问题**: #(如有)
28
- - **优先级**: 低 / 中 / 高
1
+ ---
2
+ name: 功能请求
3
+ about: 为这个项目提出想法
4
+ title: '[Feature] '
5
+ labels: 'enhancement'
6
+ assignees: ''
7
+ ---
8
+
9
+ ## 功能描述
10
+
11
+ (清晰简洁地描述你希望增加的功能)
12
+
13
+ ## 使用场景
14
+
15
+ (说明这个功能会解决什么问题,适用哪些场景)
16
+
17
+ ## 建议实现方案
18
+
19
+ (如有技术方案或参考实现,请提供)
20
+
21
+ ## 备选方案
22
+
23
+ (你考虑过哪些替代方案?)
24
+
25
+ ## 额外信息
26
+
27
+ - **关联问题**: #(如有)
28
+ - **优先级**: 低 / 中 / 高
@@ -1,46 +1,46 @@
1
- ## 变更类型
2
-
3
- - [ ] Bug 修复
4
- - [ ] 新功能
5
- - [ ] 性能优化
6
- - [ ] 文档更新
7
- - [ ] 重构
8
- - [ ] 测试补充
9
-
10
- ## 关联 Issue
11
-
12
- 修复 #(issue 编号)
13
-
14
- ## 变更描述
15
-
16
- (清晰描述本次 PR 做了什么变更)
17
-
18
- ## 测试验证
19
-
20
- - [ ] 本地类型检查通过:`npm run typecheck`
21
- - [ ] 单元测试通过:`npm test`
22
- - [ ] M4 企业能力验证:`npm run verify:m4`
23
- - [ ] 全量验证:`npm run verify`
24
- - [ ] 手动测试覆盖(如有新功能)
25
-
26
- ## 变更影响范围
27
-
28
- - 影响的模块:
29
- - 向后兼容性:是 / 否(如有破坏性变更请说明)
30
- - 需要更新文档:是 / 否
31
-
32
- ## 截图(如有 UI 变更)
33
-
34
- (粘贴截图或录屏链接)
35
-
36
- ## 提交信息格式
37
-
38
- ```
39
- feat(scope): 简要描述(符合 Conventional Commits)
40
- fix(scope): 简要描述
41
- docs(scope): 简要描述
42
- test(scope): 简要描述
43
- refactor(scope): 简要描述
44
- perf(scope): 简要描述
45
- chore(scope): 简要描述
46
- ```
1
+ ## 变更类型
2
+
3
+ - [ ] Bug 修复
4
+ - [ ] 新功能
5
+ - [ ] 性能优化
6
+ - [ ] 文档更新
7
+ - [ ] 重构
8
+ - [ ] 测试补充
9
+
10
+ ## 关联 Issue
11
+
12
+ 修复 #(issue 编号)
13
+
14
+ ## 变更描述
15
+
16
+ (清晰描述本次 PR 做了什么变更)
17
+
18
+ ## 测试验证
19
+
20
+ - [ ] 本地类型检查通过:`npm run typecheck`
21
+ - [ ] 单元测试通过:`npm test`
22
+ - [ ] M4 企业能力验证:`npm run verify:m4`
23
+ - [ ] 全量验证:`npm run verify`
24
+ - [ ] 手动测试覆盖(如有新功能)
25
+
26
+ ## 变更影响范围
27
+
28
+ - 影响的模块:
29
+ - 向后兼容性:是 / 否(如有破坏性变更请说明)
30
+ - 需要更新文档:是 / 否
31
+
32
+ ## 截图(如有 UI 变更)
33
+
34
+ (粘贴截图或录屏链接)
35
+
36
+ ## 提交信息格式
37
+
38
+ ```
39
+ feat(scope): 简要描述(符合 Conventional Commits)
40
+ fix(scope): 简要描述
41
+ docs(scope): 简要描述
42
+ test(scope): 简要描述
43
+ refactor(scope): 简要描述
44
+ perf(scope): 简要描述
45
+ chore(scope): 简要描述
46
+ ```
@@ -1,67 +1,67 @@
1
- # 安全政策
2
-
3
- ## 受支持的版本
4
-
5
- | 版本 | 支持状态 |
6
- |------|----------|
7
- | 0.2.x (Latest) | ✅ 活跃维护 |
8
- | 0.1.x | ⚠️ 仅安全补丁 |
9
-
10
- ## 报告漏洞
11
-
12
- **请不要在公共 Issue 中报告安全问题。**
13
-
14
- ### 私有报告渠道
15
-
16
- 1. **GitHub Security Advisories**(推荐)
17
- - 访问: https://github.com/wch887292/feihong-code/security/advisories
18
- - 或直接创建 Security Advisory
19
-
20
- 2. **邮件联系**
21
- - 负责人:吴赐虹
22
- - 邮箱:wch887292@gmail.com(请在邮件标题注明 `[SECURITY] feihong-code`)
23
-
24
- ### 报告内容
25
-
26
- 请包含以下信息:
27
- - 问题描述与复现步骤
28
- - 受影响版本
29
- - 潜在影响评估
30
- - 建议修复方案(如有)
31
- - 联系方式(可选)
32
-
33
- ### 响应时间
34
-
35
- - **确认收到**: 24 小时内
36
- - **初步评估**: 72 小时内
37
- - **补丁发布**: 根据严重程度,通常 1-2 周内
38
-
39
- ## 安全最佳实践
40
-
41
- ### 密钥管理
42
- - ✅ 永远不要提交 `.env` 文件
43
- - ✅ 使用环境变量或 `fhcode.config.json` 管理密钥
44
- - ✅ 定期轮换 API Key
45
-
46
- ### 运行时安全
47
- - 启用 `FH_OFFLINE=true` 进行测试
48
- - 使用 `--max-iterations` 控制成本
49
- - 启用 RBAC 策略:`FH_ENTERPRISE=true`
50
-
51
- ### 审计追踪
52
- - 定期检查审计日志:`fhcode audit verify`
53
- - 启用多租户隔离
54
- - 配置配额熔断
55
-
56
- ## 已公开的安全修复
57
-
58
- | 日期 | 版本 | 描述 |
59
- |------|------|------|
60
- | 2026-08-12 | 0.2.1 | M8 请求体限流、M14 配额冻结、M5 审计并发锁、M12 脱敏扩充 |
61
- | 2026-08-12 | 0.2.1 | H1 spawn 挂起防护、H2 沙箱逃逸防护、H3 flag 解析修复、H4 system 指令保留 |
62
-
63
- ## 安全依赖
64
-
65
- 运行 `npm audit` 检查依赖安全状态。我们采用最小依赖策略,仅引入:
66
- - `express` - HTTP 服务器
67
- - `zod` - 参数校验
1
+ # 安全政策
2
+
3
+ ## 受支持的版本
4
+
5
+ | 版本 | 支持状态 |
6
+ |------|----------|
7
+ | 0.2.x (Latest) | ✅ 活跃维护 |
8
+ | 0.1.x | ⚠️ 仅安全补丁 |
9
+
10
+ ## 报告漏洞
11
+
12
+ **请不要在公共 Issue 中报告安全问题。**
13
+
14
+ ### 私有报告渠道
15
+
16
+ 1. **GitHub Security Advisories**(推荐)
17
+ - 访问: https://github.com/wch887292/feihong-code/security/advisories
18
+ - 或直接创建 Security Advisory
19
+
20
+ 2. **邮件联系**
21
+ - 负责人:吴赐虹
22
+ - 邮箱:wch887292@gmail.com(请在邮件标题注明 `[SECURITY] feihong-code`)
23
+
24
+ ### 报告内容
25
+
26
+ 请包含以下信息:
27
+ - 问题描述与复现步骤
28
+ - 受影响版本
29
+ - 潜在影响评估
30
+ - 建议修复方案(如有)
31
+ - 联系方式(可选)
32
+
33
+ ### 响应时间
34
+
35
+ - **确认收到**: 24 小时内
36
+ - **初步评估**: 72 小时内
37
+ - **补丁发布**: 根据严重程度,通常 1-2 周内
38
+
39
+ ## 安全最佳实践
40
+
41
+ ### 密钥管理
42
+ - ✅ 永远不要提交 `.env` 文件
43
+ - ✅ 使用环境变量或 `fhcode.config.json` 管理密钥
44
+ - ✅ 定期轮换 API Key
45
+
46
+ ### 运行时安全
47
+ - 启用 `FH_OFFLINE=true` 进行测试
48
+ - 使用 `--max-iterations` 控制成本
49
+ - 启用 RBAC 策略:`FH_ENTERPRISE=true`
50
+
51
+ ### 审计追踪
52
+ - 定期检查审计日志:`fhcode audit verify`
53
+ - 启用多租户隔离
54
+ - 配置配额熔断
55
+
56
+ ## 已公开的安全修复
57
+
58
+ | 日期 | 版本 | 描述 |
59
+ |------|------|------|
60
+ | 2026-08-12 | 0.2.1 | M8 请求体限流、M14 配额冻结、M5 审计并发锁、M12 脱敏扩充 |
61
+ | 2026-08-12 | 0.2.1 | H1 spawn 挂起防护、H2 沙箱逃逸防护、H3 flag 解析修复、H4 system 指令保留 |
62
+
63
+ ## 安全依赖
64
+
65
+ 运行 `npm audit` 检查依赖安全状态。我们采用最小依赖策略,仅引入:
66
+ - `express` - HTTP 服务器
67
+ - `zod` - 参数校验
@@ -0,0 +1,16 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "npm"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 5
8
+ labels:
9
+ - "dependencies"
10
+ - "security"
11
+ - package-ecosystem: "github-actions"
12
+ directory: "/"
13
+ schedule:
14
+ interval: "weekly"
15
+ labels:
16
+ - "github-actions"
@@ -104,7 +104,7 @@ jobs:
104
104
  echo "发布包白名单校验通过"
105
105
  - name: 仓库内不得提交明文密钥
106
106
  run: |
107
- if git grep -nIE "sk-[A-Za-z0-9_-]{16,}" -- . ':!*.md' ':!scripts/verify-m4.mjs'; then
107
+ if git grep -nIE "sk-[A-Za-z0-9_-]{16,}" -- . ':!*.md' ':!scripts/verify-m4.mjs' ':!tests/unit/redact.test.ts'; then
108
108
  echo "::error::检出疑似明文 API Key"
109
109
  exit 1
110
110
  fi