soloforge 1.3.3 → 1.3.5
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 +19 -3
- package/dist/adapters/claude_code/server.js +1 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +164 -44
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/shared/workflow_template.js +2 -2
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +148 -1
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/asset_manifest.d.ts.map +1 -1
- package/dist/engine/asset_manifest.js +11 -0
- package/dist/engine/asset_manifest.js.map +1 -1
- package/dist/engine/backend_implementation_contract.d.ts +1 -1
- package/dist/engine/backend_implementation_contract.d.ts.map +1 -1
- package/dist/engine/backend_implementation_contract.js +22 -0
- package/dist/engine/backend_implementation_contract.js.map +1 -1
- package/dist/engine/brainstorm_contract.d.ts +1 -1
- package/dist/engine/brainstorm_contract.js +1 -1
- package/dist/engine/code_maintainability_observability_contract.d.ts +74 -0
- package/dist/engine/code_maintainability_observability_contract.d.ts.map +1 -0
- package/dist/engine/code_maintainability_observability_contract.js +711 -0
- package/dist/engine/code_maintainability_observability_contract.js.map +1 -0
- package/dist/engine/config_write_boundary.d.ts +29 -0
- package/dist/engine/config_write_boundary.d.ts.map +1 -0
- package/dist/engine/config_write_boundary.js +69 -0
- package/dist/engine/config_write_boundary.js.map +1 -0
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +49 -1
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/contract_registry.js +1 -1
- package/dist/engine/diagnostic_registry.d.ts +13 -0
- package/dist/engine/diagnostic_registry.d.ts.map +1 -1
- package/dist/engine/diagnostic_registry.js +68 -0
- package/dist/engine/diagnostic_registry.js.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.js +195 -2
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
- package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
- package/dist/engine/explicit_asset_registry.js +134 -0
- package/dist/engine/explicit_asset_registry.js.map +1 -1
- package/dist/engine/extension_scenario_registry.js +4 -4
- package/dist/engine/extension_scenario_registry.js.map +1 -1
- package/dist/engine/foundation_scenario_runners.d.ts.map +1 -1
- package/dist/engine/foundation_scenario_runners.js +4 -2
- package/dist/engine/foundation_scenario_runners.js.map +1 -1
- package/dist/engine/historical_issue_mechanization_matrix.d.ts +28 -0
- package/dist/engine/historical_issue_mechanization_matrix.d.ts.map +1 -0
- package/dist/engine/historical_issue_mechanization_matrix.js +134 -0
- package/dist/engine/historical_issue_mechanization_matrix.js.map +1 -0
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +114 -13
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +151 -1
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/knowledge_governance_gate.d.ts +38 -0
- package/dist/engine/knowledge_governance_gate.d.ts.map +1 -0
- package/dist/engine/knowledge_governance_gate.js +123 -0
- package/dist/engine/knowledge_governance_gate.js.map +1 -0
- package/dist/engine/log_governance.d.ts +25 -0
- package/dist/engine/log_governance.d.ts.map +1 -0
- package/dist/engine/log_governance.js +76 -0
- package/dist/engine/log_governance.js.map +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
- package/dist/engine/mechanism_contract_registry.js +104 -0
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- package/dist/engine/mechanism_health_check.d.ts +23 -0
- package/dist/engine/mechanism_health_check.d.ts.map +1 -0
- package/dist/engine/mechanism_health_check.js +140 -0
- package/dist/engine/mechanism_health_check.js.map +1 -0
- package/dist/engine/next_action_planner.d.ts.map +1 -1
- package/dist/engine/next_action_planner.js +72 -4
- package/dist/engine/next_action_planner.js.map +1 -1
- package/dist/engine/observability.js +1 -1
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/project_knowledge_contract.d.ts +58 -0
- package/dist/engine/project_knowledge_contract.d.ts.map +1 -0
- package/dist/engine/project_knowledge_contract.js +298 -0
- package/dist/engine/project_knowledge_contract.js.map +1 -0
- package/dist/engine/project_knowledge_system_regression_matrix.d.ts +27 -0
- package/dist/engine/project_knowledge_system_regression_matrix.d.ts.map +1 -0
- package/dist/engine/project_knowledge_system_regression_matrix.js +295 -0
- package/dist/engine/project_knowledge_system_regression_matrix.js.map +1 -0
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
- package/dist/engine/release_issue_scenario_registry.js +506 -95
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts +4 -0
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +643 -12
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/team_awareness.js +6 -6
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/technology_decision.js +5 -5
- package/dist/engine/technology_decision.js.map +1 -1
- package/dist/engine/template_asset_contract_registry.d.ts.map +1 -1
- package/dist/engine/template_asset_contract_registry.js +6 -5
- package/dist/engine/template_asset_contract_registry.js.map +1 -1
- package/dist/engine/verifier.js +1 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workflow_navigation_contract.d.ts +10 -0
- package/dist/engine/workflow_navigation_contract.d.ts.map +1 -1
- package/dist/knowledge/loader.d.ts +3 -1
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +2 -2
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/knowledge/acceptance_templates//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/351/252/214/346/224/266/346/250/241/346/235/277.md +78 -0
- package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +1 -1
- package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +1 -1
- package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +1 -1
- package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +1 -1
- package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +1 -1
- package/templates/knowledge/review//344/273/243/347/240/201/345/217/257/347/273/264/346/212/244/346/200/247/344/270/216/345/217/257/350/247/202/346/265/213/346/200/247/345/256/241/346/237/245.md +81 -0
- package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +3 -3
- package/templates/knowledge/rules//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/345/245/221/347/272/246/350/247/204/345/210/231.md +150 -0
- package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227/350/247/204/345/210/231.md +69 -0
- package/templates/knowledge/rules//346/227/245/345/277/227/346/262/273/347/220/206/350/247/204/345/210/231.md +49 -0
- package/templates/knowledge/rules//346/234/272/345/210/266/350/207/252/346/262/273/347/220/206/350/247/204/345/210/231.md +48 -0
- package/templates/knowledge/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +1 -1
- package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +2 -2
- package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/351/227/250/346/216/247/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/rules//347/237/245/350/257/206/346/262/273/347/220/206/350/247/204/345/210/231.md +50 -0
- package/templates/knowledge/rules//351/205/215/347/275/256/350/220/275/347/233/230/350/276/271/347/225/214/350/247/204/345/210/231.md +47 -0
- package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +1 -1
- package/templates/scaffolds/react/Form.tsx.hbs +11 -3
- package/templates/scaffolds/react/List.tsx.hbs +11 -3
- package/templates/scaffolds/react/Page.tsx.hbs +1 -1
- package/templates/scaffolds/react/types.ts.hbs +4 -1
- package/templates/scaffolds/spring-boot/Controller.java.hbs +18 -4
- package/templates/scaffolds/spring-boot/DTO.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/Entity.java.hbs +8 -3
- package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +34 -10
- package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 日志治理规则
|
|
3
|
+
scope:
|
|
4
|
+
- '*'
|
|
5
|
+
products:
|
|
6
|
+
- '*'
|
|
7
|
+
id: ka-hard-rule-日志治理规则
|
|
8
|
+
asset_kind: hard_rule
|
|
9
|
+
lifecycle_status: active
|
|
10
|
+
authority: canonical
|
|
11
|
+
owner_mechanism_id: mc-log-governance
|
|
12
|
+
routes:
|
|
13
|
+
- verification
|
|
14
|
+
- operation
|
|
15
|
+
primary_triggers:
|
|
16
|
+
- 日志治理
|
|
17
|
+
- 输出噪音
|
|
18
|
+
- json 输出
|
|
19
|
+
secondary_triggers:
|
|
20
|
+
- user feedback
|
|
21
|
+
- logger
|
|
22
|
+
negative_triggers:
|
|
23
|
+
- 用户项目业务日志
|
|
24
|
+
priority: P1
|
|
25
|
+
specificity: 4
|
|
26
|
+
consumes:
|
|
27
|
+
- log_governance
|
|
28
|
+
hard_blocks:
|
|
29
|
+
- raw_output_noise
|
|
30
|
+
- json_stdout_pollution
|
|
31
|
+
- direct_console_output
|
|
32
|
+
fallback: manual_required
|
|
33
|
+
required_evidence:
|
|
34
|
+
- log_governance_report
|
|
35
|
+
version: 1.0.0
|
|
36
|
+
last_reviewed: '2026-05-26'
|
|
37
|
+
status: active
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
# 日志治理规则
|
|
41
|
+
|
|
42
|
+
SoloForge 自身输出必须通过统一日志模块,用户可见输出不得混入内部治理噪音。
|
|
43
|
+
|
|
44
|
+
## 硬规则
|
|
45
|
+
|
|
46
|
+
- CLI 和 MCP 用户可见输出必须中文语义优先。
|
|
47
|
+
- `--json` 模式 stdout 必须是纯 JSON。
|
|
48
|
+
- 引擎内部 trace 默认不得输出。
|
|
49
|
+
- 直接 `console` 输出只能存在于日志封装层。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 机制自治理规则
|
|
3
|
+
scope:
|
|
4
|
+
- '*'
|
|
5
|
+
products:
|
|
6
|
+
- '*'
|
|
7
|
+
id: ka-hard-rule-机制自治理规则
|
|
8
|
+
asset_kind: hard_rule
|
|
9
|
+
lifecycle_status: active
|
|
10
|
+
authority: canonical
|
|
11
|
+
owner_mechanism_id: mc-mechanism-health
|
|
12
|
+
routes:
|
|
13
|
+
- verification
|
|
14
|
+
- operation
|
|
15
|
+
primary_triggers:
|
|
16
|
+
- 机制健康
|
|
17
|
+
- 主链路消费
|
|
18
|
+
- 死代码
|
|
19
|
+
secondary_triggers:
|
|
20
|
+
- lazy import
|
|
21
|
+
- mechanism id
|
|
22
|
+
negative_triggers:
|
|
23
|
+
- 普通业务编码
|
|
24
|
+
priority: P1
|
|
25
|
+
specificity: 4
|
|
26
|
+
consumes:
|
|
27
|
+
- mechanism_health_check
|
|
28
|
+
hard_blocks:
|
|
29
|
+
- lazy_dead_import
|
|
30
|
+
- unconsumed_mechanism
|
|
31
|
+
fallback: manual_required
|
|
32
|
+
required_evidence:
|
|
33
|
+
- mechanism_health_report
|
|
34
|
+
version: 1.0.0
|
|
35
|
+
last_reviewed: '2026-05-26'
|
|
36
|
+
status: active
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
# 机制自治理规则
|
|
40
|
+
|
|
41
|
+
所有新增机制必须有真实生产消费路径,不能只停留在注册表、测试或文档。
|
|
42
|
+
|
|
43
|
+
## 硬规则
|
|
44
|
+
|
|
45
|
+
- 引擎模块导出的核心函数必须被 CLI、MCP handler 或 release gate 消费。
|
|
46
|
+
- `lazy*` 声明必须在 handler 或治理入口中实际调用。
|
|
47
|
+
- `mechanism_id` 必须在双层注册、机制合同和资产清单中保持一致。
|
|
48
|
+
- 行为测试必须包含 must-fail 和 must-pass,不得只验证文件存在。
|
|
@@ -39,7 +39,7 @@ status: active
|
|
|
39
39
|
## 核心体验原则
|
|
40
40
|
|
|
41
41
|
### 四条原则
|
|
42
|
-
1. **机制强,路径短** —
|
|
42
|
+
1. **机制强,路径短** — 机制必须接入真实主链路,用户主入口不超过一次自然语言指令或一个 CLI 命令
|
|
43
43
|
2. **规则硬,体验轻** — 关键失败硬阻断,低风险任务轻量
|
|
44
44
|
3. **证据足,不啰嗦** — 证据可审查,输出清晰简洁
|
|
45
45
|
4. **能自动修复,不假装完成** — 失败进入 repair_reverify 或 manual_required
|
|
@@ -64,7 +64,7 @@ status: active
|
|
|
64
64
|
|
|
65
65
|
### 原则二: Simplicity First — 简单优先
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
优先用最少代码、最少抽象、最少新增文件解决已确认目标。不为了未确认的未来需求提前设计复杂结构。
|
|
68
68
|
|
|
69
69
|
**必须做到:**
|
|
70
70
|
- 最少代码解决问题
|
|
@@ -119,7 +119,7 @@ status: active
|
|
|
119
119
|
|
|
120
120
|
**必须做到:**
|
|
121
121
|
- 明确目标和验收标准
|
|
122
|
-
- 禁止"功能正常""
|
|
122
|
+
- 禁止"功能正常""看起来没问题"等模糊成功标准;必须写出已执行验证和剩余风险
|
|
123
123
|
- 输出未验证项和人工确认项
|
|
124
124
|
|
|
125
125
|
**硬失败条件:**
|
|
@@ -60,7 +60,7 @@ last_reviewed: '2026-05-23'
|
|
|
60
60
|
## not_done_if_missing
|
|
61
61
|
|
|
62
62
|
- 新问题未经 DuplicateIssueCheck → hard fail。
|
|
63
|
-
-
|
|
63
|
+
- 新增功能批次未继承既有历史回归基线 → hard fail。
|
|
64
64
|
- 模板层需更新但未更新 → hard fail。
|
|
65
65
|
- 新增机制无 required 模板资产 → hard fail。
|
|
66
66
|
- 发布门禁配置未更新 → hard fail。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 知识治理规则
|
|
3
|
+
scope:
|
|
4
|
+
- '*'
|
|
5
|
+
products:
|
|
6
|
+
- '*'
|
|
7
|
+
id: ka-hard-rule-知识治理规则
|
|
8
|
+
asset_kind: hard_rule
|
|
9
|
+
lifecycle_status: active
|
|
10
|
+
authority: canonical
|
|
11
|
+
owner_mechanism_id: mc-knowledge-governance
|
|
12
|
+
routes:
|
|
13
|
+
- verification
|
|
14
|
+
- operation
|
|
15
|
+
- knowledge_update
|
|
16
|
+
primary_triggers:
|
|
17
|
+
- 知识治理
|
|
18
|
+
- 知识演进
|
|
19
|
+
- 文档治理
|
|
20
|
+
secondary_triggers:
|
|
21
|
+
- 中文语义
|
|
22
|
+
- language policy
|
|
23
|
+
negative_triggers:
|
|
24
|
+
- 普通代码修改
|
|
25
|
+
priority: P0
|
|
26
|
+
specificity: 5
|
|
27
|
+
consumes:
|
|
28
|
+
- knowledge_governance_gate
|
|
29
|
+
hard_blocks:
|
|
30
|
+
- promotion_without_evidence
|
|
31
|
+
- unauthorized_design_doc_fact
|
|
32
|
+
- language_policy_missing
|
|
33
|
+
fallback: manual_required
|
|
34
|
+
required_evidence:
|
|
35
|
+
- knowledge_governance_report
|
|
36
|
+
version: 1.0.0
|
|
37
|
+
last_reviewed: '2026-05-26'
|
|
38
|
+
status: active
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
# 知识治理规则
|
|
42
|
+
|
|
43
|
+
知识资产从草稿、演进、同步到注入必须有统一治理入口。
|
|
44
|
+
|
|
45
|
+
## 硬规则
|
|
46
|
+
|
|
47
|
+
- 知识晋级必须有证据,不能由 AI 推理直接变成核心事实。
|
|
48
|
+
- 中文优先项目的用户可见语义不得被英文默认模板污染。
|
|
49
|
+
- 设计文档只能承载已验证事实,不能承载施工日志或未验证假设。
|
|
50
|
+
- 多语言策略必须显式声明,不能用日志或 stderr 替代用户反馈。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 配置落盘边界规则
|
|
3
|
+
scope:
|
|
4
|
+
- '*'
|
|
5
|
+
products:
|
|
6
|
+
- '*'
|
|
7
|
+
id: ka-hard-rule-配置落盘边界规则
|
|
8
|
+
asset_kind: hard_rule
|
|
9
|
+
lifecycle_status: active
|
|
10
|
+
authority: canonical
|
|
11
|
+
owner_mechanism_id: mc-config-write-boundary
|
|
12
|
+
routes:
|
|
13
|
+
- operation
|
|
14
|
+
primary_triggers:
|
|
15
|
+
- init
|
|
16
|
+
- sync-templates
|
|
17
|
+
- 配置落盘
|
|
18
|
+
secondary_triggers:
|
|
19
|
+
- config.yaml
|
|
20
|
+
- .soloforge
|
|
21
|
+
negative_triggers:
|
|
22
|
+
- 只读验证
|
|
23
|
+
priority: P1
|
|
24
|
+
specificity: 4
|
|
25
|
+
consumes:
|
|
26
|
+
- config_write_boundary
|
|
27
|
+
hard_blocks:
|
|
28
|
+
- runtime_inference_persisted
|
|
29
|
+
- existing_project_write_without_confirm
|
|
30
|
+
fallback: manual_required
|
|
31
|
+
required_evidence:
|
|
32
|
+
- config_write_decision
|
|
33
|
+
version: 1.0.0
|
|
34
|
+
last_reviewed: '2026-05-26'
|
|
35
|
+
status: active
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# 配置落盘边界规则
|
|
39
|
+
|
|
40
|
+
运行时推断、已有项目探测和空项目蓝图必须区分处理。
|
|
41
|
+
|
|
42
|
+
## 硬规则
|
|
43
|
+
|
|
44
|
+
- 运行时推断结果不得自动写入项目配置。
|
|
45
|
+
- 已有项目写入 `.soloforge/`、`.mcp.json`、`CLAUDE.md` 或 adapter 配置时必须有用户确认。
|
|
46
|
+
- 空项目初始化可以创建 SoloForge 管理文件。
|
|
47
|
+
- 同步模板不得覆盖用户已修改资产。
|
|
@@ -39,7 +39,7 @@ status: active
|
|
|
39
39
|
## 决策规则
|
|
40
40
|
- Commit 消息必须语义化(feat/fix/refactor/test/docs/chore + 描述),禁止"update"、"fix"等笼统消息
|
|
41
41
|
- 每个 commit 对应一个最小变更单元
|
|
42
|
-
- 提交前检查清单:lint/format 通过、测试通过、无调试残留(console
|
|
42
|
+
- 提交前检查清单:lint/format 通过、测试通过、无调试残留(console 输出、print、待办/修复占位标记)、无敏感信息、无超范围变更、无未跟踪大文件
|
|
43
43
|
- 功能分支合并必须使用 --no-ff 保留历史
|
|
44
44
|
- 冲突在功能分支解决,禁止在 master 上解决冲突
|
|
45
45
|
- 单 commit 问题用 git revert,整分支问题用 git revert -m 1
|
|
@@ -15,10 +15,18 @@ interface {{ModuleName}}FormProps {
|
|
|
15
15
|
* {{ModuleName}} 表单组件 — 提供新增和编辑 {{moduleName}} 的表单交互。
|
|
16
16
|
*/
|
|
17
17
|
export const {{ModuleName}}Form: React.FC<{{ModuleName}}FormProps> = ({ initialData, onSubmit }) => {
|
|
18
|
-
|
|
18
|
+
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
onSubmit({
|
|
21
|
+
id: initialData?.id ?? 0,
|
|
22
|
+
createdAt: initialData?.createdAt ?? new Date().toISOString(),
|
|
23
|
+
updatedAt: new Date().toISOString(),
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
19
27
|
return (
|
|
20
|
-
<form>
|
|
21
|
-
|
|
28
|
+
<form onSubmit={handleSubmit}>
|
|
29
|
+
<button type="submit">保存</button>
|
|
22
30
|
</form>
|
|
23
31
|
);
|
|
24
32
|
};
|
|
@@ -17,18 +17,26 @@ interface {{ModuleName}}ListProps {
|
|
|
17
17
|
* {{ModuleName}} 列表组件 — 以表格形式展示 {{moduleName}} 数据,支持编辑和删除操作。
|
|
18
18
|
*/
|
|
19
19
|
export const {{ModuleName}}List: React.FC<{{ModuleName}}ListProps> = ({ data, onEdit, onDelete }) => {
|
|
20
|
-
// TODO: 实现列表组件,包含排序、筛选、分页等交互
|
|
21
20
|
return (
|
|
22
21
|
<table>
|
|
23
22
|
<thead>
|
|
24
23
|
<tr>
|
|
25
|
-
|
|
24
|
+
<th scope="col">ID</th>
|
|
25
|
+
<th scope="col">创建时间</th>
|
|
26
|
+
<th scope="col">更新时间</th>
|
|
27
|
+
<th scope="col">操作</th>
|
|
26
28
|
</tr>
|
|
27
29
|
</thead>
|
|
28
30
|
<tbody>
|
|
29
31
|
{data.map((item) => (
|
|
30
32
|
<tr key={item.id}>
|
|
31
|
-
{
|
|
33
|
+
<td>{item.id}</td>
|
|
34
|
+
<td>{item.createdAt}</td>
|
|
35
|
+
<td>{item.updatedAt}</td>
|
|
36
|
+
<td>
|
|
37
|
+
<button type="button" onClick={() => onEdit?.(item)}>编辑</button>
|
|
38
|
+
<button type="button" onClick={() => onDelete?.(item.id)}>删除</button>
|
|
39
|
+
</td>
|
|
32
40
|
</tr>
|
|
33
41
|
))}
|
|
34
42
|
</tbody>
|
|
@@ -6,10 +6,10 @@ import { {{moduleName}}Service } from './service';
|
|
|
6
6
|
* {{ModuleName}} 管理页面 — 展示 {{moduleName}} 列表,支持增删改查操作。
|
|
7
7
|
*/
|
|
8
8
|
export const {{ModuleName}}Page: React.FC = () => {
|
|
9
|
-
// TODO: 实现页面组件,包含列表展示、搜索筛选、新增/编辑弹窗、删除确认
|
|
10
9
|
return (
|
|
11
10
|
<div>
|
|
12
11
|
<h1>{{ModuleName}} 管理</h1>
|
|
12
|
+
<p>请按项目 API 契约接入 { {{moduleName}}Service.name },并补齐查询、编辑和删除交互。</p>
|
|
13
13
|
</div>
|
|
14
14
|
);
|
|
15
15
|
};
|
|
@@ -2,6 +2,9 @@ package {{basePackage}}.controller;
|
|
|
2
2
|
|
|
3
3
|
import {{basePackage}}.dto.{{ModuleName}}DTO;
|
|
4
4
|
import {{basePackage}}.service.{{ModuleName}}Service;
|
|
5
|
+
import jakarta.validation.Valid;
|
|
6
|
+
import org.slf4j.Logger;
|
|
7
|
+
import org.slf4j.LoggerFactory;
|
|
5
8
|
import org.springframework.web.bind.annotation.*;
|
|
6
9
|
|
|
7
10
|
import java.util.List;
|
|
@@ -13,8 +16,14 @@ import java.util.List;
|
|
|
13
16
|
@RequestMapping("/api/{{module_name}}s")
|
|
14
17
|
public class {{ModuleName}}Controller {
|
|
15
18
|
|
|
19
|
+
private static final Logger log = LoggerFactory.getLogger({{ModuleName}}Controller.class);
|
|
20
|
+
|
|
16
21
|
private final {{ModuleName}}Service {{moduleName}}Service;
|
|
17
22
|
|
|
23
|
+
/**
|
|
24
|
+
* 创建 {{moduleName}} 控制器实例。
|
|
25
|
+
* @param {{moduleName}}Service {{moduleName}} 业务服务
|
|
26
|
+
*/
|
|
18
27
|
public {{ModuleName}}Controller({{ModuleName}}Service {{moduleName}}Service) {
|
|
19
28
|
this.{{moduleName}}Service = {{moduleName}}Service;
|
|
20
29
|
}
|
|
@@ -25,6 +34,7 @@ public class {{ModuleName}}Controller {
|
|
|
25
34
|
*/
|
|
26
35
|
@GetMapping
|
|
27
36
|
public List<{{ModuleName}}DTO> list() {
|
|
37
|
+
log.info("查询 {} 列表", "{{ModuleName}}");
|
|
28
38
|
return {{moduleName}}Service.list();
|
|
29
39
|
}
|
|
30
40
|
|
|
@@ -35,27 +45,30 @@ public class {{ModuleName}}Controller {
|
|
|
35
45
|
*/
|
|
36
46
|
@GetMapping("/{id}")
|
|
37
47
|
public {{ModuleName}}DTO getById(@PathVariable Long id) {
|
|
48
|
+
log.info("查询 {} 详情: id={}", "{{ModuleName}}", id);
|
|
38
49
|
return {{moduleName}}Service.getById(id);
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
/**
|
|
42
53
|
* 创建 {{moduleName}}。
|
|
43
|
-
* @param dto
|
|
54
|
+
* @param dto 创建请求数据(经参数校验)
|
|
44
55
|
* @return 创建后的 {{moduleName}} 数据
|
|
45
56
|
*/
|
|
46
57
|
@PostMapping
|
|
47
|
-
public {{ModuleName}}DTO create(@RequestBody {{ModuleName}}DTO dto) {
|
|
58
|
+
public {{ModuleName}}DTO create(@Valid @RequestBody {{ModuleName}}DTO dto) {
|
|
59
|
+
log.info("创建{}请求开始 requestId={}", "{{ModuleName}}", dto.getId());
|
|
48
60
|
return {{moduleName}}Service.create(dto);
|
|
49
61
|
}
|
|
50
62
|
|
|
51
63
|
/**
|
|
52
64
|
* 更新 {{moduleName}}。
|
|
53
65
|
* @param id 主键标识
|
|
54
|
-
* @param dto
|
|
66
|
+
* @param dto 更新请求数据(经参数校验)
|
|
55
67
|
* @return 更新后的 {{moduleName}} 数据
|
|
56
68
|
*/
|
|
57
69
|
@PutMapping("/{id}")
|
|
58
|
-
public {{ModuleName}}DTO update(@PathVariable Long id, @RequestBody {{ModuleName}}DTO dto) {
|
|
70
|
+
public {{ModuleName}}DTO update(@PathVariable Long id, @Valid @RequestBody {{ModuleName}}DTO dto) {
|
|
71
|
+
log.info("更新 {}: id={}", "{{ModuleName}}", id);
|
|
59
72
|
return {{moduleName}}Service.update(id, dto);
|
|
60
73
|
}
|
|
61
74
|
|
|
@@ -65,6 +78,7 @@ public class {{ModuleName}}Controller {
|
|
|
65
78
|
*/
|
|
66
79
|
@DeleteMapping("/{id}")
|
|
67
80
|
public void delete(@PathVariable Long id) {
|
|
81
|
+
log.info("删除 {}: id={}", "{{ModuleName}}", id);
|
|
68
82
|
{{moduleName}}Service.delete(id);
|
|
69
83
|
}
|
|
70
84
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
package {{basePackage}}.entity;
|
|
2
2
|
|
|
3
|
-
import lombok.
|
|
3
|
+
import lombok.Getter;
|
|
4
|
+
import lombok.Setter;
|
|
4
5
|
import java.time.LocalDateTime;
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* {{ModuleName}} 实体 — 对应 {{moduleName}} 数据库表。
|
|
8
9
|
*/
|
|
9
|
-
@
|
|
10
|
+
@Getter
|
|
11
|
+
@Setter
|
|
10
12
|
public class {{ModuleName}} {
|
|
11
13
|
|
|
12
14
|
/** 主键标识 */
|
|
@@ -18,5 +20,8 @@ public class {{ModuleName}} {
|
|
|
18
20
|
/** 最后更新时间 */
|
|
19
21
|
private LocalDateTime updatedAt;
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
/**
|
|
24
|
+
* 业务字段应由数据库设计或脚手架变量生成;新增字段必须说明业务含义、
|
|
25
|
+
* 约束来源和是否参与审计/权限/状态流转。
|
|
26
|
+
*/
|
|
22
27
|
}
|
|
@@ -4,6 +4,8 @@ import {{basePackage}}.dto.{{ModuleName}}DTO;
|
|
|
4
4
|
import {{basePackage}}.entity.{{ModuleName}};
|
|
5
5
|
import {{basePackage}}.mapper.{{ModuleName}}Mapper;
|
|
6
6
|
import {{basePackage}}.service.{{ModuleName}}Service;
|
|
7
|
+
import org.slf4j.Logger;
|
|
8
|
+
import org.slf4j.LoggerFactory;
|
|
7
9
|
import org.springframework.stereotype.Service;
|
|
8
10
|
|
|
9
11
|
import java.util.List;
|
|
@@ -14,53 +16,75 @@ import java.util.List;
|
|
|
14
16
|
@Service
|
|
15
17
|
public class {{ModuleName}}ServiceImpl implements {{ModuleName}}Service {
|
|
16
18
|
|
|
19
|
+
private static final Logger log = LoggerFactory.getLogger({{ModuleName}}ServiceImpl.class);
|
|
20
|
+
|
|
17
21
|
private final {{ModuleName}}Mapper {{moduleName}}Mapper;
|
|
18
22
|
|
|
23
|
+
/**
|
|
24
|
+
* 创建 {{moduleName}} 服务实现实例。
|
|
25
|
+
* @param {{moduleName}}Mapper {{moduleName}} 数据访问组件
|
|
26
|
+
*/
|
|
19
27
|
public {{ModuleName}}ServiceImpl({{ModuleName}}Mapper {{moduleName}}Mapper) {
|
|
20
28
|
this.{{moduleName}}Mapper = {{moduleName}}Mapper;
|
|
21
29
|
}
|
|
22
30
|
|
|
23
31
|
/**
|
|
24
|
-
* {
|
|
32
|
+
* 查询 {{moduleName}} 列表。
|
|
33
|
+
* @return {{moduleName}} 数据传输对象列表
|
|
25
34
|
*/
|
|
26
35
|
@Override
|
|
27
36
|
public List<{{ModuleName}}DTO> list() {
|
|
28
|
-
|
|
37
|
+
log.debug("查询{{ModuleName}}列表");
|
|
29
38
|
return List.of();
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
/**
|
|
33
|
-
* {
|
|
42
|
+
* 根据主键查询 {{moduleName}} 详情。
|
|
43
|
+
* @param id 主键标识
|
|
44
|
+
* @return {{moduleName}} 数据传输对象,不存在时返回 null
|
|
34
45
|
*/
|
|
35
46
|
@Override
|
|
36
47
|
public {{ModuleName}}DTO getById(Long id) {
|
|
37
|
-
|
|
48
|
+
log.debug("查询{{ModuleName}}详情 id={}", id);
|
|
38
49
|
return null;
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
/**
|
|
42
|
-
* {
|
|
53
|
+
* 创建 {{moduleName}} 业务对象。
|
|
54
|
+
* @param dto 创建请求数据
|
|
55
|
+
* @return 创建后的 {{moduleName}} 数据传输对象
|
|
43
56
|
*/
|
|
44
57
|
@Override
|
|
45
58
|
public {{ModuleName}}DTO create({{ModuleName}}DTO dto) {
|
|
46
|
-
//
|
|
59
|
+
// 创建入口必须记录请求标识,便于排查重复提交和事务失败。
|
|
60
|
+
log.info("创建{{ModuleName}}开始 requestId={}", dto.getId());
|
|
61
|
+
// 示例脚手架不直接落库;真实项目应在此处补充写入、校验和审计边界。
|
|
62
|
+
log.info("创建{{ModuleName}}完成 requestId={}", dto.getId());
|
|
47
63
|
return dto;
|
|
48
64
|
}
|
|
49
65
|
|
|
50
66
|
/**
|
|
51
|
-
* {
|
|
67
|
+
* 更新 {{moduleName}} 业务对象。
|
|
68
|
+
* @param id 主键标识
|
|
69
|
+
* @param dto 更新请求数据
|
|
70
|
+
* @return 更新后的 {{moduleName}} 数据传输对象
|
|
52
71
|
*/
|
|
53
72
|
@Override
|
|
54
73
|
public {{ModuleName}}DTO update(Long id, {{ModuleName}}DTO dto) {
|
|
55
|
-
//
|
|
74
|
+
// 更新入口必须记录目标主键,便于定位并发覆盖和审计问题。
|
|
75
|
+
log.info("更新{{ModuleName}}开始 id={}", id);
|
|
76
|
+
log.info("更新{{ModuleName}}完成 id={}", id);
|
|
56
77
|
return dto;
|
|
57
78
|
}
|
|
58
79
|
|
|
59
80
|
/**
|
|
60
|
-
* {
|
|
81
|
+
* 删除 {{moduleName}} 业务对象。
|
|
82
|
+
* @param id 主键标识
|
|
61
83
|
*/
|
|
62
84
|
@Override
|
|
63
85
|
public void delete(Long id) {
|
|
64
|
-
//
|
|
86
|
+
// 删除入口必须记录目标主键,真实项目应补充级联校验和审计记录。
|
|
87
|
+
log.info("删除{{ModuleName}}开始 id={}", id);
|
|
88
|
+
log.info("删除{{ModuleName}}完成 id={}", id);
|
|
65
89
|
}
|
|
66
90
|
}
|