soloforge 1.1.48 → 1.1.50
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/README.md +4 -4
- package/dist/cli/scope_check.d.ts.map +1 -1
- package/dist/cli/scope_check.js +10 -0
- package/dist/cli/scope_check.js.map +1 -1
- package/dist/context/adapters/shared/integration_guide.d.ts +3 -3
- package/dist/context/adapters/shared/integration_guide.js +4 -4
- package/dist/core/adversarial_review_store.d.ts +44 -44
- package/dist/core/adversarial_review_store.d.ts.map +1 -1
- package/dist/core/adversarial_review_store.js +43 -43
- package/dist/core/adversarial_review_store.js.map +1 -1
- package/dist/core/gate_record_store.d.ts.map +1 -1
- package/dist/core/gate_record_store.js +9 -4
- package/dist/core/gate_record_store.js.map +1 -1
- package/dist/core/git_utils.d.ts.map +1 -1
- package/dist/core/git_utils.js +7 -3
- package/dist/core/git_utils.js.map +1 -1
- package/dist/core/task_context/constants.d.ts.map +1 -1
- package/dist/core/task_context/constants.js +3 -1
- package/dist/core/task_context/constants.js.map +1 -1
- package/dist/core/task_context/manager.d.ts +0 -4
- package/dist/core/task_context/manager.d.ts.map +1 -1
- package/dist/core/task_context/manager.js +21 -32
- package/dist/core/task_context/manager.js.map +1 -1
- package/dist/core/task_context/stage_fact_ownership.js +1 -1
- package/dist/core/task_context/stage_fact_ownership.js.map +1 -1
- package/dist/core/task_context/status_transitions.js +5 -5
- package/dist/core/task_context/status_transitions.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/waiver_store.d.ts +100 -0
- package/dist/core/waiver_store.d.ts.map +1 -0
- package/dist/core/waiver_store.js +185 -0
- package/dist/core/waiver_store.js.map +1 -0
- package/dist/domain/asset_registry/derived_registry.d.ts +10 -0
- package/dist/domain/asset_registry/derived_registry.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_registry.js +10 -0
- package/dist/domain/asset_registry/derived_registry.js.map +1 -1
- package/dist/domain/asset_registry/derived_types.d.ts +10 -0
- package/dist/domain/asset_registry/derived_types.d.ts.map +1 -1
- package/dist/domain/asset_registry/derived_types.js +10 -0
- package/dist/domain/asset_registry/derived_types.js.map +1 -1
- package/dist/gate/certainty_gate.d.ts +10 -0
- package/dist/gate/certainty_gate.d.ts.map +1 -1
- package/dist/gate/certainty_gate.js.map +1 -1
- package/dist/gate/contracts/tool_actions.d.ts +10 -1
- package/dist/gate/contracts/tool_actions.d.ts.map +1 -1
- package/dist/gate/contracts/tool_actions.js +11 -1
- package/dist/gate/contracts/tool_actions.js.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js +11 -1
- package/dist/gate/contracts/tool_invocation_contract_registry.js.map +1 -1
- package/dist/gate/executors/executors_annotation.d.ts +33 -10
- package/dist/gate/executors/executors_annotation.d.ts.map +1 -1
- package/dist/gate/executors/executors_annotation.js +119 -64
- package/dist/gate/executors/executors_annotation.js.map +1 -1
- package/dist/gate/executors/executors_artifact.d.ts +1 -1
- package/dist/gate/executors/executors_artifact.d.ts.map +1 -1
- package/dist/gate/executors/executors_artifact.js +1 -138
- package/dist/gate/executors/executors_artifact.js.map +1 -1
- package/dist/gate/executors/executors_build.d.ts +2 -2
- package/dist/gate/executors/executors_build.d.ts.map +1 -1
- package/dist/gate/executors/executors_build.js +11 -111
- package/dist/gate/executors/executors_build.js.map +1 -1
- package/dist/gate/executors/executors_deploy.d.ts.map +1 -1
- package/dist/gate/executors/executors_deploy.js +35 -7
- package/dist/gate/executors/executors_deploy.js.map +1 -1
- package/dist/gate/executors/executors_external_command.d.ts.map +1 -1
- package/dist/gate/executors/executors_external_command.js +25 -5
- package/dist/gate/executors/executors_external_command.js.map +1 -1
- package/dist/gate/executors/executors_field_mapping.d.ts.map +1 -1
- package/dist/gate/executors/executors_field_mapping.js +78 -66
- package/dist/gate/executors/executors_field_mapping.js.map +1 -1
- package/dist/gate/executors/executors_jacoco.d.ts +3 -0
- package/dist/gate/executors/executors_jacoco.d.ts.map +1 -0
- package/dist/gate/executors/executors_jacoco.js +70 -0
- package/dist/gate/executors/executors_jacoco.js.map +1 -0
- package/dist/gate/executors/executors_prerequisite.d.ts +1 -1
- package/dist/gate/executors/executors_prerequisite.d.ts.map +1 -1
- package/dist/gate/executors/executors_prerequisite.js +1 -61
- package/dist/gate/executors/executors_prerequisite.js.map +1 -1
- package/dist/gate/executors/executors_probe.d.ts +1 -0
- package/dist/gate/executors/executors_probe.d.ts.map +1 -1
- package/dist/gate/executors/executors_probe.js +1 -0
- package/dist/gate/executors/executors_probe.js.map +1 -1
- package/dist/gate/executors/executors_scope.d.ts +7 -3
- package/dist/gate/executors/executors_scope.d.ts.map +1 -1
- package/dist/gate/executors/executors_scope.js +18 -171
- package/dist/gate/executors/executors_scope.js.map +1 -1
- package/dist/gate/executors/executors_trace.d.ts.map +1 -1
- package/dist/gate/executors/executors_trace.js +111 -1
- package/dist/gate/executors/executors_trace.js.map +1 -1
- package/dist/gate/executors/index.js +2 -2
- package/dist/gate/executors/index.js.map +1 -1
- package/dist/gate/gate_engine.d.ts +11 -0
- package/dist/gate/gate_engine.d.ts.map +1 -1
- package/dist/gate/gate_engine.js +43 -6
- package/dist/gate/gate_engine.js.map +1 -1
- package/dist/gate/gate_registry_bridge.d.ts +10 -0
- package/dist/gate/gate_registry_bridge.d.ts.map +1 -1
- package/dist/gate/gate_registry_bridge.js +2 -3
- package/dist/gate/gate_registry_bridge.js.map +1 -1
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.d.ts.map +1 -1
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.js +3 -0
- package/dist/gate/release/gate_checks/checkAssetAntiBloat.js.map +1 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/tools/index.js.map +1 -1
- package/dist/server/tools/middleware.d.ts.map +1 -1
- package/dist/server/tools/middleware.js +1 -0
- package/dist/server/tools/middleware.js.map +1 -1
- package/dist/server/tools/schemas.d.ts +10 -0
- package/dist/server/tools/schemas.d.ts.map +1 -1
- package/dist/server/tools/schemas.js +10 -0
- package/dist/server/tools/schemas.js.map +1 -1
- package/dist/server/tools/sf_doctor.d.ts +7 -0
- package/dist/server/tools/sf_doctor.d.ts.map +1 -1
- package/dist/server/tools/sf_doctor.js +38 -2
- package/dist/server/tools/sf_doctor.js.map +1 -1
- package/dist/server/tools/sf_waiver.d.ts +31 -0
- package/dist/server/tools/sf_waiver.d.ts.map +1 -0
- package/dist/server/tools/sf_waiver.js +139 -0
- package/dist/server/tools/sf_waiver.js.map +1 -0
- package/dist/server/tools/sf_work.d.ts +28 -37
- package/dist/server/tools/sf_work.d.ts.map +1 -1
- package/dist/server/tools/sf_work.js +155 -83
- package/dist/server/tools/sf_work.js.map +1 -1
- package/dist/shared/paths.d.ts +4 -0
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +6 -0
- package/dist/shared/paths.js.map +1 -1
- package/dist/types/pipeline_types.d.ts +4 -1
- package/dist/types/pipeline_types.d.ts.map +1 -1
- package/dist/verify/audit/probe_executor.d.ts +4 -1
- package/dist/verify/audit/probe_executor.d.ts.map +1 -1
- package/dist/verify/audit/probe_executor.js +4 -1
- package/dist/verify/audit/probe_executor.js.map +1 -1
- package/dist/verify/audit/probe_rule.d.ts +3 -0
- package/dist/verify/audit/probe_rule.d.ts.map +1 -1
- package/dist/verify/audit/probe_rule.js +3 -0
- package/dist/verify/audit/probe_rule.js.map +1 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.d.ts.map +1 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.js +0 -1
- package/dist/verify/contracts/runtime_state_recovery_registry.js.map +1 -1
- package/dist/verify/oda/probes/index.d.ts.map +1 -1
- package/dist/verify/oda/probes/index.js +2 -0
- package/dist/verify/oda/probes/index.js.map +1 -1
- package/dist/verify/oda/probes/slice_progress_probe.d.ts +4 -0
- package/dist/verify/oda/probes/slice_progress_probe.d.ts.map +1 -0
- package/dist/verify/oda/probes/slice_progress_probe.js +144 -0
- package/dist/verify/oda/probes/slice_progress_probe.js.map +1 -0
- package/package.json +1 -1
- package/templates/build/enforced.md +30 -22
- package/templates/build//346/265/213/350/257/225/344/274/230/345/205/210/347/274/226/347/240/201.md +1 -0
- package/templates/build//347/274/226/347/240/201/347/272/252/345/276/213.md +2 -1
- package/templates/design//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +5 -5
- package/templates/design//345/210/207/347/211/207/350/247/204/345/210/222.md +3 -1
- package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md +2 -1
- package/templates/operate/UI/350/247/206/350/247/211/351/252/214/346/224/266/347/272/252/345/276/213.md +13 -2
- package/templates/operate/enforced.md +2 -2
- package/templates/shared/enforced.md +1 -1
- package/templates/shared//345/267/245/344/275/234/346/265/201/347/241/254/350/247/204/345/210/231/345/245/221/347/272/246.md +2 -2
- package/templates/verify/enforced.md +11 -2
- package/templates/verify//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md +2 -2
- package/templates/verify//345/256/241/346/237/245/346/270/205/345/215/225.md +3 -1
- package/dist/gate/executors/executors_openapi_sync.d.ts +0 -23
- package/dist/gate/executors/executors_openapi_sync.d.ts.map +0 -1
- package/dist/gate/executors/executors_openapi_sync.js +0 -145
- package/dist/gate/executors/executors_openapi_sync.js.map +0 -1
|
@@ -61,17 +61,17 @@ extra:
|
|
|
61
61
|
|
|
62
62
|
## 导航决策流程
|
|
63
63
|
|
|
64
|
-
1. 调用 `sf_task action=query`
|
|
64
|
+
1. 调用 `sf_task action=query` 获取当前状态
|
|
65
65
|
2. 检查配置完整性:resolveConfig 返回 missing 时,优先补充不可探测字段
|
|
66
66
|
3. 检查是否有陈旧任务需要处理
|
|
67
67
|
4. 读取 `confirmation_decisions`
|
|
68
68
|
- `must_confirm` 非空时,先让用户选择,不得继续执行会被阻断的动作
|
|
69
69
|
- `should_confirm` 非空时,明确说明建议确认的收益,但允许继续只读或低风险准备
|
|
70
70
|
- `auto_resolvable` 非空时,按推荐命令修复或复验,不把它伪装成业务确认
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
5. 读取返回的 work_package,按描述执行下一步
|
|
72
|
+
6. 遵守 disallowed_actions 中的禁止动作
|
|
73
|
+
7. 执行完成后运行 acceptance_commands 验证
|
|
74
|
+
8. 如需用户确认,必须列出具体确认项、选项和不确认影响,不能笼统说“需要确认”
|
|
75
75
|
|
|
76
76
|
## 空项目确认口径
|
|
77
77
|
|
|
@@ -44,7 +44,9 @@ extra:
|
|
|
44
44
|
4. **依赖有序**:被依赖的切片先做;循环依赖必须打破
|
|
45
45
|
5. **爆炸半径可控**(改老系统):每个切片可独立回滚,不牵连全局
|
|
46
46
|
|
|
47
|
-
> **硬约束(design-gate SLICE-DIMENSION 兜底)**:骨架/基础设施切片 ≤ 2(超过 design verify 拦截)。多端项目合并为一个「全端骨架 + DB」切片,不每端一个骨架;其余切片必须垂直(端到端业务 前端→后端→DB
|
|
47
|
+
> **硬约束(design-gate SLICE-DIMENSION 兜底)**:骨架/基础设施切片 ≤ 2(超过 design verify 拦截)。多端项目合并为一个「全端骨架 + DB」切片,不每端一个骨架;其余切片必须垂直(端到端业务 前端→后端→DB)。
|
|
48
|
+
>
|
|
49
|
+
> **为什么必须垂直(shift-left 早验的结构前提)**:垂直切片每片端到端可独立跑 → slice-gate 每片能早验(SLICE-BUILD/UP/HTTP/E2E 交互 + 视觉局部自查)。横切(按端/技术层)单片跑不通全链路 → slice-gate 空转 → 所有早验失效、bug 积压到交付前。骨架无业务可验=验证空转,故限 ≤2(业界 walking skeleton 例外,通常 1)。
|
|
48
50
|
|
|
49
51
|
## 切片清单格式
|
|
50
52
|
|
package/templates/design//345/274/200/345/217/221/345/210/207/347/211/207/350/256/241/345/210/222.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
id: ka-
|
|
2
|
+
id: ka-artifact_template-开发切片计划
|
|
3
3
|
kind: artifact
|
|
4
4
|
title: 开发切片计划
|
|
5
5
|
sync_policy: copy_to_project
|
|
@@ -12,6 +12,7 @@ extra:
|
|
|
12
12
|
- '*'
|
|
13
13
|
lifecycle_status: active
|
|
14
14
|
version: 1.0.0
|
|
15
|
+
last_reviewed: '2026-06-21'
|
|
15
16
|
type: artifact_template
|
|
16
17
|
domain: design
|
|
17
18
|
owner_mechanism: mc-generic-artifact
|
|
@@ -10,6 +10,9 @@ triggers:
|
|
|
10
10
|
- 界面样式
|
|
11
11
|
- 前端样式
|
|
12
12
|
- 界面布局
|
|
13
|
+
- 切片交付
|
|
14
|
+
- 切片构建
|
|
15
|
+
- 前端切片
|
|
13
16
|
target_artifact:
|
|
14
17
|
- release_note
|
|
15
18
|
extra:
|
|
@@ -34,9 +37,17 @@ extra:
|
|
|
34
37
|
|
|
35
38
|
> **为什么是 L2 软规则**:SLICE-E2E(playwright e2e)只验**交互链路与接口响应**,不验**UI 视觉样式**(布局/颜色/间距/响应式视觉/与设计稿一致)。引擎不调 LLM、看不懂截图,**无法确定性判定"界面长得对不对"**——强行硬判必造假(有截图 ≠ 视觉对)。故 UI 视觉正确性归 **L2 客户端 AI 视觉审查**(主)+ **L3 人工确认**(兜底),引擎只做:注入本纪律提醒 + 提供发布说明留痕载体 + 文案不假装确定性验过。
|
|
36
39
|
|
|
37
|
-
## 主流程:L2 客户端 AI
|
|
40
|
+
## 主流程:L2 客户端 AI 视觉审查(分两层:切片级局部 + 交付前整体)
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
**shift-left**:视觉审查分两层——切片级做局部自查(早发现局部 bug),交付前做整体审查(跨切片一致性)。不一刀切压交付前(局部 bug 积压难倒查)。
|
|
43
|
+
|
|
44
|
+
### 切片级视觉自查(每切片交付时,软)
|
|
45
|
+
|
|
46
|
+
每完成一个含 UI 的切片(slice-gate 时),AI 看本切片涉及页面 screenshot,判**局部视觉**:本切片新增/改动页面的布局/颜色/响应式无明显错误;按钮/表单/交互元素可见可点;与已交付切片视觉无明显冲突。**软(不硬判)**:截图给 AI 看给局部结论,局部 bug 当场修不积压。
|
|
47
|
+
|
|
48
|
+
### 交付前整体审查(产出发布说明时)
|
|
49
|
+
|
|
50
|
+
交付前(产出发布说明时)对前端各端做**整体视觉审查**,**看截图判断**:
|
|
40
51
|
|
|
41
52
|
1. **布局**:核心页面在 desktop/移动 viewport 下无塌陷、无错位、关键元素可见可点
|
|
42
53
|
2. **颜色/主题**:配色与设计稿/主题一致,无对比度缺陷(文字可读)
|
|
@@ -55,7 +55,7 @@ checks:
|
|
|
55
55
|
check_type: deterministic
|
|
56
56
|
evidence_required: ["deploy/部署配置.md"]
|
|
57
57
|
gate: operate-gate
|
|
58
|
-
target: self
|
|
58
|
+
target: "self"
|
|
59
59
|
- id: RELNOTE-STRUCT
|
|
60
60
|
executor: document_structure
|
|
61
61
|
check_type: deterministic
|
|
@@ -95,7 +95,7 @@ checks:
|
|
|
95
95
|
|
|
96
96
|
# operate-gate 强制检查清单
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
9 条确定性检查(含 RELNOTE-STRUCT)。bridge 从此文件聚合。
|
|
99
99
|
|
|
100
100
|
> OPR-G01~G05 用 file_evidence(只验证据文件存在+非空);rule 描述的指标(5xx/P99/日志/回滚/一致性)**须人工确认**,故 severity=warning(不假装 error 确认指标)。
|
|
101
101
|
|
|
@@ -90,7 +90,7 @@ checks:
|
|
|
90
90
|
executor: external_command
|
|
91
91
|
command: npx
|
|
92
92
|
args: ["playwright", "test"]
|
|
93
|
-
rule: "浏览器端到端验证(前端交互 + 后端逻辑)—— playwright e2e(验交互链路与接口响应,不验 UI 视觉样式)。有 playwright.config 硬验(error,失败=e2e 问题);无跳过(Claude Code npx playwright install + 加配置后生效,新项目放行)。注:UI 视觉样式(布局/颜色/响应式视觉/与设计稿一致)属非确定性判断,不归本 e2e——归 L2 客户端 AI
|
|
93
|
+
rule: "浏览器端到端验证(前端交互 + 后端逻辑)—— playwright e2e(验交互链路与接口响应,不验 UI 视觉样式)。有 playwright.config 硬验(error,失败=e2e 问题);无跳过(Claude Code npx playwright install + 加配置后生效,新项目放行)。注:UI 视觉样式(布局/颜色/响应式视觉/与设计稿一致)属非确定性判断,不归本 e2e——归 L2 客户端 AI 视觉审查(**切片级局部自查 + 交付前整体**,见 operate 域「UI视觉验收纪律」guidance)+ L3 人工确认。"
|
|
94
94
|
severity: error
|
|
95
95
|
check_type: deterministic
|
|
96
96
|
evidence_required: ["playwright test exitCode=0"]
|
|
@@ -78,7 +78,7 @@ extra:
|
|
|
78
78
|
source_ref: src/context/adapters/shared/workflow_template.ts#wf-core-principles
|
|
79
79
|
- rule_id: wf-knowledge-injection
|
|
80
80
|
rule_summary: (已废弃)原三道门知识注入决策,已无运行时调用,保留作历史记录、不再注入
|
|
81
|
-
user_instruction:
|
|
81
|
+
user_instruction: (已废弃,不再注入;保留作历史记录)
|
|
82
82
|
mechanism_id: mc-knowledge-injection-boundary
|
|
83
83
|
enforcement_status: deprecated
|
|
84
84
|
source_ref: src/context/adapters/shared/workflow_template.ts#wf-knowledge-injection
|
|
@@ -146,7 +146,7 @@ extra:
|
|
|
146
146
|
source_ref: src/context/adapters/shared/workflow_template.ts#wf-no-lazy-code
|
|
147
147
|
---
|
|
148
148
|
|
|
149
|
-
#
|
|
149
|
+
# 工作流模板硬规则契约
|
|
150
150
|
|
|
151
151
|
工作流执行硬规则(条数随下方 hard_rules 清单维护,不在此硬编码)。
|
|
152
152
|
|
|
@@ -116,7 +116,7 @@ checks:
|
|
|
116
116
|
required_artifact: 代码审查报告模版
|
|
117
117
|
evidence_required: ["docs/audits/02-代码审查报告.md"]
|
|
118
118
|
gate: verify-gate
|
|
119
|
-
target: self
|
|
119
|
+
target: "self"
|
|
120
120
|
- id: VRF-G03
|
|
121
121
|
executor: vitest_run
|
|
122
122
|
rule: "端到端核心业务流程验证必须全部通过,证据级别至少 E1(运行时证据)"
|
|
@@ -221,6 +221,15 @@ checks:
|
|
|
221
221
|
evidence_required: ["docs/design/schema.sql"]
|
|
222
222
|
gate: verify-gate
|
|
223
223
|
target: "self"
|
|
224
|
+
# —— 验收点↔测试覆盖校验(REQ-* 验收点须有 @covers 标注覆盖,治测试凑数 / coverage theater)——
|
|
225
|
+
- id: AC-COVERAGE
|
|
226
|
+
executor: acceptance_coverage
|
|
227
|
+
rule: "REQ-* 覆盖率"
|
|
228
|
+
severity: error
|
|
229
|
+
check_type: deterministic
|
|
230
|
+
evidence_required: ["需求分析模版"]
|
|
231
|
+
gate: verify-gate
|
|
232
|
+
target: "self"
|
|
224
233
|
- id: CODEREVIEW-BLOCK
|
|
225
234
|
executor: document_structure
|
|
226
235
|
check_type: deterministic
|
|
@@ -238,7 +247,7 @@ checks:
|
|
|
238
247
|
|
|
239
248
|
# verify-gate 强制检查清单
|
|
240
249
|
|
|
241
|
-
|
|
250
|
+
24 条确定性检查(ARCH-DEP 已删:external_command 缺 command → dependency-cruiser 从未真跑,降级软下限;ARC-05 幽灵引用已清)。bridge 按 check.gate 聚合(CON-*/API-* 并发与 API 规范已归位 build/enforced.md——gate 本就是 build-gate;API-01/02 与 build ARC-02/03 重复已删;VRF-G02/ARCH-C-REVIEW semantic advisory 移至 guidance《架构语义红线》)。
|
|
242
251
|
|
|
243
252
|
对应工程经验:
|
|
244
253
|
- SOLID-DIP(依赖注入,Java/Spring;TS 无 DI 容器不适用)
|
package/templates/verify//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212.md
CHANGED
|
@@ -42,9 +42,9 @@ extra:
|
|
|
42
42
|
| 安全 | SEC-01~SEC-12 | ✅/❌ | <!-- 数量 --> | |
|
|
43
43
|
| 性能 | PER-01~PER-09 | ✅/❌ | <!-- 数量 --> | |
|
|
44
44
|
| 并发 | CON-01~CON-10 | ✅/❌ | <!-- 数量 --> | |
|
|
45
|
-
| 架构 | ARC-
|
|
45
|
+
| 架构 | ARC-02/04/06/08(build-gate;ARC-03 事务降级编码纪律) | ✅/❌ | <!-- 数量 --> | |
|
|
46
46
|
| SOLID | SOLID-SRP~SOLID-OCP | ✅/❌ | <!-- 数量 --> | |
|
|
47
|
-
| 接口契约 | API-
|
|
47
|
+
| 接口契约 | API-03/04/06/07/08/09(build-gate) | ✅/❌ | <!-- 数量 --> | <!-- 接口审查规则 --> |
|
|
48
48
|
| 可维护性 | MNT-01~MNT-05 | ✅/❌ | <!-- 数量 --> | **AI 盲区** |
|
|
49
49
|
| 交付完备 | DEL-01~DEL-05, SEL-01~SEL-02, TRA-01~TRA-02 | ✅/❌ | <!-- 数量 --> | |
|
|
50
50
|
| 决策完整性 | DEC-01~DEC-04 | ✅/❌ | <!-- 数量 --> | **AI 盲区** |
|
|
@@ -35,6 +35,8 @@ extra:
|
|
|
35
35
|
> 合并旧的十几个审查碎拆(SOLID/性能/并发/错误处理/数据隐私/可维护性等)。
|
|
36
36
|
> verify-gate 的 SEC/PER/CON/API 是确定性正则门禁;本清单是审查者的维度指引。
|
|
37
37
|
> 注入到代码审查报告(review_report)产出时。
|
|
38
|
+
>
|
|
39
|
+
> **对抗审查独立于此**:verify 后 `sf_work action=adversarial_review` 做 K=3 次独立采样取交集(每轮独立 session 不互参、取多数复现),findings 留痕不阻断(不追求"零 error 收敛")。本清单是单次审查维度,对抗审查是多次独立交叉验证。
|
|
38
40
|
|
|
39
41
|
## 审查维度(每类都要过一遍)
|
|
40
42
|
|
|
@@ -57,7 +59,7 @@ extra:
|
|
|
57
59
|
### 架构(对应 ARC-*)
|
|
58
60
|
- 分层依赖、循环依赖、单一职责、Controller 不含业务逻辑
|
|
59
61
|
|
|
60
|
-
### 接口契约(对应 API-
|
|
62
|
+
### 接口契约(对应 API-03/04/06/07/08/09)
|
|
61
63
|
- DTO 不暴露 Entity、写操作事务、权限注解、参数校验、RESTful、统一响应、分页、版本号、文档
|
|
62
64
|
|
|
63
65
|
### 可维护性(AI 盲区,重点人工复核)
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* openapi_sync_check 执行器 — 比对 openapi.yaml 与详细设计文档的接口一致性。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:解析 openapi.yaml 和详细设计文档,比对路径/方法/参数/返回值
|
|
6
|
-
* - 不负责:文档质量评估(语义层面的完整性由 AI 判断)
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:gate_engine evaluateCheck → gateExecutors.get("openapi_sync_check")
|
|
9
|
-
* 调用谁:fs(读取文件)、yaml 解析(解析 openapi.yaml)
|
|
10
|
-
*
|
|
11
|
-
* 数据流:openapi.yaml + 详细设计文档 → 结构化比对 → 一致/不一致
|
|
12
|
-
* 持久化:无
|
|
13
|
-
*/
|
|
14
|
-
import type { GateExecutorFn } from "../gate_executors.js";
|
|
15
|
-
/**
|
|
16
|
-
* openapi_sync_check 执行器入口。
|
|
17
|
-
*
|
|
18
|
-
* 比对 openapi.yaml 与详细设计文档,检查:
|
|
19
|
-
* 1. 设计文档引用的 endpoint 在 openapi.yaml 中存在
|
|
20
|
-
* 2. 方法一致(GET/POST/PUT/DELETE 等)
|
|
21
|
-
*/
|
|
22
|
-
export declare const executeOpenApiSyncCheck: GateExecutorFn;
|
|
23
|
-
//# sourceMappingURL=executors_openapi_sync.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executors_openapi_sync.d.ts","sourceRoot":"","sources":["../../../src/gate/executors/executors_openapi_sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAsE3D;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,cA+ErC,CAAC"}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* openapi_sync_check 执行器 — 比对 openapi.yaml 与详细设计文档的接口一致性。
|
|
3
|
-
*
|
|
4
|
-
* 职责边界:
|
|
5
|
-
* - 负责:解析 openapi.yaml 和详细设计文档,比对路径/方法/参数/返回值
|
|
6
|
-
* - 不负责:文档质量评估(语义层面的完整性由 AI 判断)
|
|
7
|
-
*
|
|
8
|
-
* 被谁调用:gate_engine evaluateCheck → gateExecutors.get("openapi_sync_check")
|
|
9
|
-
* 调用谁:fs(读取文件)、yaml 解析(解析 openapi.yaml)
|
|
10
|
-
*
|
|
11
|
-
* 数据流:openapi.yaml + 详细设计文档 → 结构化比对 → 一致/不一致
|
|
12
|
-
* 持久化:无
|
|
13
|
-
*/
|
|
14
|
-
import fs from "node:fs";
|
|
15
|
-
import path from "node:path";
|
|
16
|
-
/** 从 openapi.yaml 提取所有 endpoint(路径 + 方法) */
|
|
17
|
-
function extractOpenApiEndpoints(content) {
|
|
18
|
-
const endpoints = new Map();
|
|
19
|
-
// 简易 YAML 解析:提取 paths 下的 path 和 method
|
|
20
|
-
const lines = content.split("\n");
|
|
21
|
-
let inPaths = false;
|
|
22
|
-
let currentPath = "";
|
|
23
|
-
for (const line of lines) {
|
|
24
|
-
const trimmed = line.trim();
|
|
25
|
-
// 进入 paths section
|
|
26
|
-
if (trimmed === "paths:") {
|
|
27
|
-
inPaths = true;
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
if (!inPaths)
|
|
31
|
-
continue;
|
|
32
|
-
// paths 下的顶级 key 就是 path(以 / 开头)
|
|
33
|
-
if (line.startsWith(" /")) {
|
|
34
|
-
currentPath = trimmed.replace(/:$/, "");
|
|
35
|
-
endpoints.set(currentPath, new Set());
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
// path 下的 method(get/post/put/delete/patch)
|
|
39
|
-
if (currentPath && line.startsWith(" ")) {
|
|
40
|
-
const methodMatch = trimmed.match(/^(get|post|put|delete|patch|options|head):$/);
|
|
41
|
-
if (methodMatch) {
|
|
42
|
-
endpoints.get(currentPath)?.add(methodMatch[1].toLowerCase());
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
// 离开 paths section(遇到非空行且缩进 <= 1)
|
|
46
|
-
if (trimmed.length > 0 && !line.startsWith(" ") && trimmed !== "paths:") {
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return endpoints;
|
|
51
|
-
}
|
|
52
|
-
/** 从详细设计文档提取 endpoint 引用(路径 + 方法) */
|
|
53
|
-
function extractDesignDocEndpoints(content) {
|
|
54
|
-
const endpoints = new Map();
|
|
55
|
-
// 匹配常见格式:GET /api/xxx、POST /api/xxx、`GET /xxx` 等
|
|
56
|
-
const endpointRegex = /`?(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\s+(\/[^\s`<,,)]+)/gi;
|
|
57
|
-
let match;
|
|
58
|
-
while ((match = endpointRegex.exec(content)) !== null) {
|
|
59
|
-
const method = match[1].toLowerCase();
|
|
60
|
-
const url = match[2];
|
|
61
|
-
// 提取 path(去掉 query string)
|
|
62
|
-
const pathOnly = url.split("?")[0].split("{")[0].replace(/\/+$/, "") || "/";
|
|
63
|
-
if (!endpoints.has(pathOnly)) {
|
|
64
|
-
endpoints.set(pathOnly, new Set());
|
|
65
|
-
}
|
|
66
|
-
endpoints.get(pathOnly)?.add(method);
|
|
67
|
-
}
|
|
68
|
-
return endpoints;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* openapi_sync_check 执行器入口。
|
|
72
|
-
*
|
|
73
|
-
* 比对 openapi.yaml 与详细设计文档,检查:
|
|
74
|
-
* 1. 设计文档引用的 endpoint 在 openapi.yaml 中存在
|
|
75
|
-
* 2. 方法一致(GET/POST/PUT/DELETE 等)
|
|
76
|
-
*/
|
|
77
|
-
export const executeOpenApiSyncCheck = async (check, ctx) => {
|
|
78
|
-
const projectRoot = ctx.projectRoot;
|
|
79
|
-
// 定位文件
|
|
80
|
-
const openApiPath = path.join(projectRoot, "docs", "api", "openapi.yaml");
|
|
81
|
-
const designDocPath = path.join(projectRoot, "docs", "design", "03-详细设计文档.md");
|
|
82
|
-
if (!fs.existsSync(openApiPath)) {
|
|
83
|
-
return {
|
|
84
|
-
check_id: check.id,
|
|
85
|
-
executed_by: "code",
|
|
86
|
-
passed: false,
|
|
87
|
-
error: "openapi.yaml 不存在",
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
if (!fs.existsSync(designDocPath)) {
|
|
91
|
-
// 详细设计是可选产物,不存在时通过
|
|
92
|
-
return {
|
|
93
|
-
check_id: check.id,
|
|
94
|
-
executed_by: "code",
|
|
95
|
-
passed: true,
|
|
96
|
-
evidence: "详细设计文档不存在(可选产物),跳过检查",
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
// 容错读取:路径偶发为目录(EISDIR)或无权限(EACCES),裸 readFileSync 会崩整个 executor
|
|
100
|
-
let openApiContent;
|
|
101
|
-
let designDocContent;
|
|
102
|
-
try {
|
|
103
|
-
openApiContent = fs.readFileSync(openApiPath, "utf-8");
|
|
104
|
-
designDocContent = fs.readFileSync(designDocPath, "utf-8");
|
|
105
|
-
}
|
|
106
|
-
catch (err) {
|
|
107
|
-
return {
|
|
108
|
-
check_id: check.id,
|
|
109
|
-
executed_by: "code",
|
|
110
|
-
passed: false,
|
|
111
|
-
error: `openapi/design 文档读取失败(EISDIR/EACCES): ${err instanceof Error ? err.message : String(err)}`,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
const openApiEndpoints = extractOpenApiEndpoints(openApiContent);
|
|
115
|
-
const designEndpoints = extractDesignDocEndpoints(designDocContent);
|
|
116
|
-
// 比对:设计文档引用的 endpoint 必须在 openapi.yaml 中存在
|
|
117
|
-
const mismatches = [];
|
|
118
|
-
for (const [designPath, methods] of designEndpoints) {
|
|
119
|
-
const openApiMethods = openApiEndpoints.get(designPath);
|
|
120
|
-
if (!openApiMethods) {
|
|
121
|
-
mismatches.push(`路径 ${designPath} 在 openapi.yaml 中不存在`);
|
|
122
|
-
continue;
|
|
123
|
-
}
|
|
124
|
-
for (const method of methods) {
|
|
125
|
-
if (!openApiMethods.has(method)) {
|
|
126
|
-
mismatches.push(`${method.toUpperCase()} ${designPath} 在 openapi.yaml 中不存在`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (mismatches.length === 0) {
|
|
131
|
-
return {
|
|
132
|
-
check_id: check.id,
|
|
133
|
-
executed_by: "code",
|
|
134
|
-
passed: true,
|
|
135
|
-
evidence: `设计文档 ${designEndpoints.size} 个 endpoint 全部与 openapi.yaml 一致`,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
return {
|
|
139
|
-
check_id: check.id,
|
|
140
|
-
executed_by: "code",
|
|
141
|
-
passed: false,
|
|
142
|
-
evidence: `发现 ${mismatches.length} 处不一致:\n${mismatches.slice(0, 20).join("\n")}`,
|
|
143
|
-
};
|
|
144
|
-
};
|
|
145
|
-
//# sourceMappingURL=executors_openapi_sync.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executors_openapi_sync.js","sourceRoot":"","sources":["../../../src/gate/executors/executors_openapi_sync.ts"],"names":[],"mappings":"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"}
|