dflow-sdd-ddd 0.1.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/LICENSE +21 -0
- package/README.md +209 -0
- package/bin/dflow.js +72 -0
- package/lib/init.js +1206 -0
- package/package.json +42 -0
- package/templates/core/scaffolding/CLAUDE-md-snippet.md +168 -0
- package/templates/core/scaffolding/Git-principles-gitflow.md +350 -0
- package/templates/core/scaffolding/Git-principles-trunk.md +375 -0
- package/templates/core/scaffolding/_conventions.md +175 -0
- package/templates/core/scaffolding/_overview.md +165 -0
- package/templates/core/scaffolding/architecture-decisions-README.md +34 -0
- package/templates/core/templates/CLAUDE.md +172 -0
- package/templates/core/templates/_index.md +118 -0
- package/templates/core/templates/aggregate-design.md +58 -0
- package/templates/core/templates/behavior.md +62 -0
- package/templates/core/templates/context-definition.md +64 -0
- package/templates/core/templates/context-map.md +25 -0
- package/templates/core/templates/events.md +19 -0
- package/templates/core/templates/glossary.md +15 -0
- package/templates/core/templates/lightweight-spec.md +82 -0
- package/templates/core/templates/models.md +47 -0
- package/templates/core/templates/phase-spec.md +195 -0
- package/templates/core/templates/rules.md +24 -0
- package/templates/core/templates/tech-debt.md +15 -0
- package/templates/webforms/scaffolding/CLAUDE-md-snippet.md +167 -0
- package/templates/webforms/scaffolding/Git-principles-gitflow.md +333 -0
- package/templates/webforms/scaffolding/Git-principles-trunk.md +316 -0
- package/templates/webforms/scaffolding/_conventions.md +139 -0
- package/templates/webforms/scaffolding/_overview.md +109 -0
- package/templates/webforms/templates/CLAUDE.md +157 -0
- package/templates/webforms/templates/_index.md +110 -0
- package/templates/webforms/templates/behavior.md +58 -0
- package/templates/webforms/templates/context-definition.md +57 -0
- package/templates/webforms/templates/context-map.md +25 -0
- package/templates/webforms/templates/glossary.md +15 -0
- package/templates/webforms/templates/lightweight-spec.md +82 -0
- package/templates/webforms/templates/models.md +39 -0
- package/templates/webforms/templates/phase-spec.md +187 -0
- package/templates/webforms/templates/rules.md +24 -0
- package/templates/webforms/templates/tech-debt.md +15 -0
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dflow-sdd-ddd",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Dflow SDD/DDD project scaffolding CLI",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dflow": "bin/dflow.js",
|
|
8
|
+
"dflow-sdd-ddd": "bin/dflow.js"
|
|
9
|
+
},
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=22.0.0"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"bin/",
|
|
15
|
+
"lib/",
|
|
16
|
+
"templates/",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"sdd",
|
|
21
|
+
"ddd",
|
|
22
|
+
"specification-driven-development",
|
|
23
|
+
"domain-driven-design",
|
|
24
|
+
"codex",
|
|
25
|
+
"claude-code"
|
|
26
|
+
],
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+ssh://git@github.com/weilung/AI-Guided-SDD-DDD-Development-Skills.git"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/weilung/AI-Guided-SDD-DDD-Development-Skills/issues"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/weilung/AI-Guided-SDD-DDD-Development-Skills#readme",
|
|
35
|
+
"scripts": {
|
|
36
|
+
"test": "node test/smoke.mjs"
|
|
37
|
+
},
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
<!-- Scaffolding template maintained alongside Dflow skill. See proposals/PROPOSAL-010 for origin. -->
|
|
2
|
+
|
|
3
|
+
# CLAUDE.md Snippet — Dflow Adoption (Core edition)
|
|
4
|
+
|
|
5
|
+
> Source: `scaffolding/CLAUDE-md-snippet.md`
|
|
6
|
+
> Purpose: a minimal block you paste into (or replace with) your
|
|
7
|
+
> project's root `CLAUDE.md` when adopting Dflow.
|
|
8
|
+
> For the Core skill, the full reference template lives at
|
|
9
|
+
> `sdd-ddd-core-skill/templates/CLAUDE.md` — if you want the complete
|
|
10
|
+
> version, use that instead. This snippet is a lighter starting point.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## How to use this snippet
|
|
15
|
+
|
|
16
|
+
- **If your project has no `CLAUDE.md`**: `npx dflow-sdd-ddd init` will
|
|
17
|
+
create one using this snippet as the base
|
|
18
|
+
- **If your project already has a `CLAUDE.md`**: do NOT overwrite.
|
|
19
|
+
Merge the **two H2 blocks** below (`System Context` / `Development Workflow`) into your
|
|
20
|
+
existing file, preserving any project-specific content you already
|
|
21
|
+
have
|
|
22
|
+
|
|
23
|
+
The two-H2 structure (`System Context` / `Development Workflow`) is intentional and must be
|
|
24
|
+
preserved — it matches the Dflow skill's `templates/CLAUDE.md` and
|
|
25
|
+
keeps every project's `CLAUDE.md` scannable for AI in the same shape.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Snippet to merge into `CLAUDE.md`
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
# Project: {系統名稱} — ASP.NET Core + DDD
|
|
33
|
+
|
|
34
|
+
**重要:所有開發工作都必須遵循本文件定義的流程。**
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## System Context
|
|
39
|
+
|
|
40
|
+
> 技術棧、架構、業務領域、目錄結構
|
|
41
|
+
|
|
42
|
+
### Background
|
|
43
|
+
|
|
44
|
+
- **Business Domain**: {業務領域概述,e.g. "企業差旅費用申報與核銷"}
|
|
45
|
+
- **Users / Customers**: {使用者 / 客戶描述}
|
|
46
|
+
- **Team**: {團隊組成;e.g. "全端工程團隊,3-5 人;DDD 經驗中等"}
|
|
47
|
+
- **Dflow Adoption Context**: {新專案 greenfield / 既有系統導入 / 遷移等}
|
|
48
|
+
- **Tech Stack**: ASP.NET Core {版本};EF Core / MediatR / {其他};
|
|
49
|
+
.NET {版本}
|
|
50
|
+
|
|
51
|
+
### Architecture (Clean Architecture)
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Presentation → Application → Domain ← Infrastructure
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
依賴方向永遠朝內。Domain 層是核心,不依賴任何外部套件。
|
|
58
|
+
|
|
59
|
+
| Layer | Responsibilities | Must NOT |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| Domain | 業務規則、Aggregate、Value Object、Domain Event | 依賴外部套件、存取資料庫、處理 HTTP |
|
|
62
|
+
| Application | 編排領域操作、CQRS、驗證、DTO | 包含業務邏輯、直接存取資料庫 |
|
|
63
|
+
| Infrastructure | EF Core、外部 API、檔案存取 | 包含業務邏輯 |
|
|
64
|
+
| Presentation | HTTP 端點、Request/Response | 包含業務邏輯、直接操作 Domain 物件 |
|
|
65
|
+
|
|
66
|
+
### Project Structure
|
|
67
|
+
|
|
68
|
+
完整 specs 目錄結構見 Dflow skill `SKILL.md` § "Project Structure"。
|
|
69
|
+
以下只列本專案當前狀態(`npx dflow-sdd-ddd init` 建立後可能還未全填):
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
dflow/specs/
|
|
73
|
+
├── domain/
|
|
74
|
+
│ ├── glossary.md
|
|
75
|
+
│ ├── context-map.md
|
|
76
|
+
│ └── {context}/ # 首個 bounded context 被 P007a 建立時會補齊
|
|
77
|
+
│ ├── context.md
|
|
78
|
+
│ ├── models.md
|
|
79
|
+
│ ├── rules.md
|
|
80
|
+
│ ├── behavior.md
|
|
81
|
+
│ └── events.md
|
|
82
|
+
├── features/{active,completed,backlog}/
|
|
83
|
+
└── architecture/
|
|
84
|
+
├── decisions/
|
|
85
|
+
└── tech-debt.md
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Development Workflow
|
|
91
|
+
|
|
92
|
+
> SDD 流程、Git 整合、Domain 層規範、AI 協作
|
|
93
|
+
|
|
94
|
+
### Dflow Skill — Canonical Decision Logic Lives in the Skill
|
|
95
|
+
|
|
96
|
+
AI 的完整決策樹、Workflow Transparency、Ceremony Scaling 三層判準
|
|
97
|
+
(T1 Heavy / T2 Light / T3 Trivial)、所有 slash command 的 step-by-step
|
|
98
|
+
流程 **不在此重述**,請以 Dflow skill 本體為準:
|
|
99
|
+
|
|
100
|
+
- `sdd-ddd-core-skill/SKILL.md`(決策樹 + Slash Commands 總表)
|
|
101
|
+
- `sdd-ddd-core-skill/references/` 內各 flow 文件
|
|
102
|
+
|
|
103
|
+
本專案採用的 Dflow entry points:
|
|
104
|
+
- `npx dflow-sdd-ddd init` — 專案初始化(一次性,已執行過)
|
|
105
|
+
- `/dflow:new-feature` — 新功能
|
|
106
|
+
- `/dflow:new-phase` — 既有 active feature 加新 phase
|
|
107
|
+
- `/dflow:modify-existing` — 修改既有行為
|
|
108
|
+
- `/dflow:bug-fix` — Bug 修復
|
|
109
|
+
- `/dflow:finish-feature` — Feature 收尾 + 整合摘要
|
|
110
|
+
- `/dflow:pr-review` — PR 審查檢查點
|
|
111
|
+
|
|
112
|
+
### Core Principles (Project Reaffirmed)
|
|
113
|
+
|
|
114
|
+
1. **Spec Before Code** — 沒有規格就不寫實作
|
|
115
|
+
2. **Domain at the Center** — 業務邏輯只存在於 Domain 層
|
|
116
|
+
3. **Ubiquitous Language** — 使用 `dflow/specs/domain/glossary.md` 中定義的術語
|
|
117
|
+
4. **One Aggregate per Transaction** — 單一操作只修改一個 Aggregate
|
|
118
|
+
5. **Dependency Inversion** — Domain 定義介面,Infrastructure 實作
|
|
119
|
+
|
|
120
|
+
### Domain Layer Rules (Hard Invariants)
|
|
121
|
+
|
|
122
|
+
- ❌ 不可有任何 NuGet 套件依賴(純 .NET 類型)
|
|
123
|
+
- ❌ 不可有 ORM 屬性(`[Table]`、`[Column]` 等)
|
|
124
|
+
- ❌ 不可有序列化屬性(`[JsonProperty]` 等)
|
|
125
|
+
- ❌ 不可有 `DbContext`、`IConfiguration`、`HttpClient`
|
|
126
|
+
- ✅ Entity 使用 `private set;`,透過方法改變狀態
|
|
127
|
+
- ✅ Value Object 使用 `record`,建構式驗證
|
|
128
|
+
- ✅ Aggregate Root 管理 `DomainEvents` 集合
|
|
129
|
+
- ✅ 其他 Aggregate 只透過 ID 引用
|
|
130
|
+
|
|
131
|
+
### Project-Level Supplemental Rules
|
|
132
|
+
|
|
133
|
+
{此段由專案自行填入。例如:}
|
|
134
|
+
|
|
135
|
+
- **本專案使用 MediatR 做 Command / Query dispatch**,Application 層
|
|
136
|
+
Command / Query Handler 命名為 `{Name}CommandHandler` /
|
|
137
|
+
`{Name}QueryHandler`
|
|
138
|
+
- **整合測試使用 {Testcontainers / WebApplicationFactory / 其他}**;
|
|
139
|
+
CI 流程中自動跑
|
|
140
|
+
- **{其他團隊協議}**
|
|
141
|
+
|
|
142
|
+
### Git Branching Strategy
|
|
143
|
+
|
|
144
|
+
本專案採用:{填寫 Git Flow / trunk-based / GitHub Flow / 自訂}
|
|
145
|
+
詳見 `dflow/specs/shared/Git-principles-{gitflow|trunk}.md`。
|
|
146
|
+
|
|
147
|
+
### AI Collaboration Notes
|
|
148
|
+
|
|
149
|
+
- 開發者提出任何需求時,先引導建立 spec 和 Aggregate 設計
|
|
150
|
+
- 確認實作順序:Domain → Application → Infrastructure → Presentation
|
|
151
|
+
- 發現業務邏輯在錯誤的層時,指出並建議搬移
|
|
152
|
+
- 每次開發循環結束時,提醒更新術語表、models.md、events.md
|
|
153
|
+
- Review 時檢查 Domain 層的純淨度(零外部依賴)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Notes
|
|
159
|
+
|
|
160
|
+
- This snippet is intentionally lighter than
|
|
161
|
+
`sdd-ddd-core-skill/templates/CLAUDE.md`. If you want the full version
|
|
162
|
+
(with detailed flow descriptions per slash command), use that
|
|
163
|
+
template instead
|
|
164
|
+
- The snippet does NOT re-copy the Dflow decision tree, Ceremony
|
|
165
|
+
Scaling criteria, or per-flow step details — those live in the
|
|
166
|
+
skill and change when the skill evolves
|
|
167
|
+
- Re-run `npx dflow-sdd-ddd init` will NOT overwrite an existing
|
|
168
|
+
`CLAUDE.md`; if you want to re-sync, merge manually
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
<!-- Scaffolding template maintained alongside Dflow skill. See proposals/PROPOSAL-010 for origin. -->
|
|
2
|
+
|
|
3
|
+
# Git Principles — Git Flow edition
|
|
4
|
+
|
|
5
|
+
> Created: {YYYY-MM-DD}
|
|
6
|
+
> Scope: project Git conventions. This project adopts **Git Flow** as
|
|
7
|
+
> its branching strategy.
|
|
8
|
+
> Audience: engineers + AI assistants performing Git operations.
|
|
9
|
+
|
|
10
|
+
Dflow itself is branching-strategy-neutral — it only requires the
|
|
11
|
+
feature-branch-per-feature convention (see the Dflow skill's
|
|
12
|
+
`references/git-integration.md`). This file records the Git Flow-
|
|
13
|
+
specific conventions chosen by this project.
|
|
14
|
+
|
|
15
|
+
If your project adopts a different branching strategy (single `main`,
|
|
16
|
+
trunk-based, GitHub Flow), use `Git-principles-trunk.md` instead.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Branch Structure
|
|
21
|
+
|
|
22
|
+
| Branch | Naming | Cut from | Merges to |
|
|
23
|
+
|--------|--------|----------|-----------|
|
|
24
|
+
| `main` / `master` | `main` | — | release / hotfix only |
|
|
25
|
+
| `develop` | `develop` | — | integration branch for features |
|
|
26
|
+
| feature | `feature/{SPEC-ID}-{slug}` | `develop` | `develop` |
|
|
27
|
+
| release | `release/{version}` | `develop` | `main` + `develop` |
|
|
28
|
+
| hotfix | `hotfix/{version}-hotfix{n}` | `main` | `main` + `develop` |
|
|
29
|
+
|
|
30
|
+
The `feature/{SPEC-ID}-{slug}` pattern is a **Dflow requirement** (not
|
|
31
|
+
a Git Flow requirement). It ties each feature branch to its
|
|
32
|
+
corresponding `dflow/specs/features/active/{SPEC-ID}-{slug}/` directory.
|
|
33
|
+
|
|
34
|
+
### Feature Branch Workflow
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 1. Create feature branch
|
|
38
|
+
git checkout develop
|
|
39
|
+
git pull origin develop
|
|
40
|
+
git checkout -b feature/{SPEC-ID}-{slug}
|
|
41
|
+
|
|
42
|
+
# 2. Stay in sync with develop during development
|
|
43
|
+
git fetch origin
|
|
44
|
+
git rebase origin/develop
|
|
45
|
+
|
|
46
|
+
# 3. Commit as you go (see § 2 below)
|
|
47
|
+
git add .
|
|
48
|
+
git commit -m "[{SPEC-ID}] {short description}"
|
|
49
|
+
|
|
50
|
+
# 4. Push
|
|
51
|
+
git push -u origin feature/{SPEC-ID}-{slug}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Release Workflow
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 1. Cut release branch
|
|
58
|
+
git checkout develop
|
|
59
|
+
git pull origin develop
|
|
60
|
+
git checkout -b release/{version}
|
|
61
|
+
|
|
62
|
+
# 2. Version bump / final adjustments (e.g. update AssemblyInfo,
|
|
63
|
+
# appsettings version, db migration baseline)
|
|
64
|
+
git add .
|
|
65
|
+
git commit -m "release {version}"
|
|
66
|
+
|
|
67
|
+
# 3. Merge to main with --no-ff
|
|
68
|
+
git checkout main
|
|
69
|
+
git pull origin main
|
|
70
|
+
git merge --no-ff release/{version} -m "Release {version}"
|
|
71
|
+
|
|
72
|
+
# 4. Tag
|
|
73
|
+
git tag -a {version} -m "{version summary}"
|
|
74
|
+
|
|
75
|
+
# 5. Back-merge into develop
|
|
76
|
+
git checkout develop
|
|
77
|
+
git merge --no-ff release/{version} -m "Merge release/{version} back to develop"
|
|
78
|
+
|
|
79
|
+
# 6. Push + cleanup
|
|
80
|
+
git push origin main develop --tags
|
|
81
|
+
git branch -d release/{version}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Hotfix Workflow
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 1. Cut hotfix branch from main
|
|
88
|
+
git checkout main
|
|
89
|
+
git pull origin main
|
|
90
|
+
git checkout -b hotfix/{version}-hotfix{n}
|
|
91
|
+
|
|
92
|
+
# 2. Fix + commit
|
|
93
|
+
git add .
|
|
94
|
+
git commit -m "hotfix{n}: {fix description}"
|
|
95
|
+
|
|
96
|
+
# 3. Merge to main + tag
|
|
97
|
+
git checkout main
|
|
98
|
+
git merge --no-ff hotfix/{version}-hotfix{n}
|
|
99
|
+
git tag -a {version}-hotfix{n} -m "{fix description}"
|
|
100
|
+
|
|
101
|
+
# 4. Back-merge to develop
|
|
102
|
+
git checkout develop
|
|
103
|
+
git merge --no-ff hotfix/{version}-hotfix{n}
|
|
104
|
+
|
|
105
|
+
# 5. Push + cleanup
|
|
106
|
+
git push origin main develop --tags
|
|
107
|
+
git branch -d hotfix/{version}-hotfix{n}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Hotfix spec requirement (team convention)**: Hotfixes often skip the
|
|
111
|
+
upfront SDD cycle for speed. This project commits to writing a
|
|
112
|
+
lightweight spec within **24 hours** after the hotfix lands, documenting
|
|
113
|
+
root cause + fix + (if applicable) a tech-debt entry in
|
|
114
|
+
`dflow/specs/architecture/tech-debt.md` if the bug reveals a systemic issue.
|
|
115
|
+
This is a **human-to-human commitment** — Dflow / AI cannot track the
|
|
116
|
+
24-hour clock; the team enforces it in retros.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 2. Commit Message Format
|
|
121
|
+
|
|
122
|
+
Commits must tie back to a SPEC-ID:
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
[{SPEC-ID}] {short description}
|
|
126
|
+
|
|
127
|
+
{optional detailed body}
|
|
128
|
+
|
|
129
|
+
Co-Authored-By: Claude <noreply@anthropic.com> ← suggested, not mandatory
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Type prefix (recommended)
|
|
133
|
+
|
|
134
|
+
When applicable, prefix with a type (conventional commits-style):
|
|
135
|
+
|
|
136
|
+
| Type | Meaning |
|
|
137
|
+
|------|---------|
|
|
138
|
+
| feat | new feature |
|
|
139
|
+
| fix | bug fix |
|
|
140
|
+
| refactor | internal refactor (no behavior change) |
|
|
141
|
+
| docs | documentation only |
|
|
142
|
+
| style | formatting only |
|
|
143
|
+
| test | tests only |
|
|
144
|
+
| chore | build / tooling |
|
|
145
|
+
|
|
146
|
+
Example: `[EXP-001] feat: introduce ExpenseReport Aggregate with submission invariants`
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 3. Gate Checks
|
|
151
|
+
|
|
152
|
+
Before making key Git operations:
|
|
153
|
+
|
|
154
|
+
### Before `git commit`
|
|
155
|
+
|
|
156
|
+
- [ ] If the change corresponds to a phase-spec, that phase-spec's
|
|
157
|
+
`Implementation Tasks` section items are checked (or remaining items have
|
|
158
|
+
justification in the spec's notes section)
|
|
159
|
+
- [ ] `_index.md` status reflects the current work (Phase Specs row
|
|
160
|
+
updated, `Resume Pointer` refreshed if the commit reaches a meaningful
|
|
161
|
+
checkpoint)
|
|
162
|
+
- [ ] Clean Architecture layer rules hold (Domain has no external
|
|
163
|
+
package deps, no business logic leaked into handlers /
|
|
164
|
+
controllers)
|
|
165
|
+
|
|
166
|
+
### Before merging a feature branch to `develop`
|
|
167
|
+
|
|
168
|
+
- [ ] `/dflow:finish-feature` has run (or the equivalent Step 8.4
|
|
169
|
+
manual archival is complete)
|
|
170
|
+
- [ ] `_index.md` status = `completed`, feature directory moved to
|
|
171
|
+
`dflow/specs/features/completed/` via `git mv`
|
|
172
|
+
- [ ] BC layer synced: `dflow/specs/domain/{context}/rules.md`,
|
|
173
|
+
`behavior.md`, `events.md`, and (if cross-context)
|
|
174
|
+
`context-map.md` reflect the feature's net changes
|
|
175
|
+
- [ ] `dflow/specs/domain/glossary.md` updated with any new terms
|
|
176
|
+
- [ ] `dflow/specs/architecture/tech-debt.md` updated with any debt discovered
|
|
177
|
+
- [ ] Domain project has zero external NuGet dependencies
|
|
178
|
+
- [ ] No ORM / serialization attributes on Domain entities
|
|
179
|
+
- [ ] Domain unit tests pass (invariants + value object equality)
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 4. Integration Commit Message Conventions
|
|
184
|
+
|
|
185
|
+
`/dflow:finish-feature` emits a **Git-strategy-neutral Integration
|
|
186
|
+
Summary** (see `references/finish-feature-flow.md` in the Dflow skill).
|
|
187
|
+
This section specifies how to turn that Summary into the actual merge
|
|
188
|
+
commit message under Git Flow.
|
|
189
|
+
|
|
190
|
+
Git Flow typically uses `--no-ff` merges (keeps the branch history
|
|
191
|
+
visible). The recommended merge commit format is:
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
Merge feature/{SPEC-ID}-{slug} into develop
|
|
195
|
+
|
|
196
|
+
{Feature Goal block, copied from Integration Summary}
|
|
197
|
+
|
|
198
|
+
Change Scope:
|
|
199
|
+
- BC: {context-name}
|
|
200
|
+
- Aggregate(s) touched: {Aggregate names}
|
|
201
|
+
- Phase Count: {N}
|
|
202
|
+
- Lightweight Changes: {n_t2} T2 + {n_t3} T3
|
|
203
|
+
|
|
204
|
+
Related BR-IDs:
|
|
205
|
+
- ADDED: BR-NN, BR-NN
|
|
206
|
+
- MODIFIED: BR-NN
|
|
207
|
+
- REMOVED: (none)
|
|
208
|
+
|
|
209
|
+
Domain Events introduced / modified: {Event names, or "(none)"}
|
|
210
|
+
|
|
211
|
+
Related SPEC-IDs: {SPEC-ID}{, follow-up SPEC-IDs if any}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Concrete example
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
git checkout develop
|
|
218
|
+
git pull origin develop
|
|
219
|
+
git merge --no-ff feature/SPEC-20260421-001-submit-expense-report \
|
|
220
|
+
-m "Merge feature/SPEC-20260421-001-submit-expense-report into develop" \
|
|
221
|
+
-m "Feature Goal: 實作 ExpenseReport 提交流程,含狀態機與事件發佈。" \
|
|
222
|
+
-m "Change Scope: BC Expense; Aggregate ExpenseReport; Phase Count 2; Lightweight Changes 0 T2" \
|
|
223
|
+
-m "Related BR-IDs: ADDED BR-12; MODIFIED BR-05" \
|
|
224
|
+
-m "Domain Events: ExpenseReportSubmitted" \
|
|
225
|
+
-m "Related SPEC-IDs: SPEC-20260421-001"
|
|
226
|
+
git push origin develop
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
The `-m` flags stack as separate paragraphs in the commit body.
|
|
230
|
+
Alternatively, write a single `-m` with the entire body or open the
|
|
231
|
+
editor with `git merge --no-ff feature/...` and paste the Integration
|
|
232
|
+
Summary directly.
|
|
233
|
+
|
|
234
|
+
### Why `--no-ff` is recommended here
|
|
235
|
+
|
|
236
|
+
Git Flow's value proposition is preserving branch history. `--no-ff`
|
|
237
|
+
makes the merge commit an explicit node on `develop`, which:
|
|
238
|
+
- Keeps the feature branch visible in `git log --graph`
|
|
239
|
+
- Lets `git log --first-parent develop` summarise features as single
|
|
240
|
+
commits
|
|
241
|
+
- Gives reviewers a single commit to reference for the whole feature
|
|
242
|
+
|
|
243
|
+
If your project prefers squash merge under Git Flow (unusual but valid),
|
|
244
|
+
use the trunk-edition template (`Git-principles-trunk.md`) for the
|
|
245
|
+
commit format; the branch model stays Git Flow.
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 5. Tags & Release Notes
|
|
250
|
+
|
|
251
|
+
### Tag naming
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
git tag -a v{major}.{minor}.{patch} -m "{release summary}"
|
|
255
|
+
# e.g. git tag -a v1.2.3 -m "Expense report submission + event handlers"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### `CHANGELOG.md`
|
|
259
|
+
|
|
260
|
+
Detailed version history lives in `CHANGELOG.md` at the repo root. One
|
|
261
|
+
section per release tag; link back to the SPEC-IDs included in that
|
|
262
|
+
release.
|
|
263
|
+
|
|
264
|
+
Example entry:
|
|
265
|
+
|
|
266
|
+
```markdown
|
|
267
|
+
## [1.2.3] — {YYYY-MM-DD}
|
|
268
|
+
|
|
269
|
+
### Added
|
|
270
|
+
- {SPEC-20260421-001}: ExpenseReport submission flow with Domain Events
|
|
271
|
+
|
|
272
|
+
### Changed
|
|
273
|
+
- {SPEC-20260415-003}: ApprovalPolicy Aggregate invariant tightened
|
|
274
|
+
|
|
275
|
+
### Fixed
|
|
276
|
+
- {BUG-042}: Fix Money rounding in multi-currency totals
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 6. AI Collaboration Rules (Project Policy)
|
|
282
|
+
|
|
283
|
+
Three categories:
|
|
284
|
+
|
|
285
|
+
### Must-confirm operations (AI asks before running)
|
|
286
|
+
|
|
287
|
+
| Operation | Why |
|
|
288
|
+
|-----------|-----|
|
|
289
|
+
| `git commit` | Stage needs human review |
|
|
290
|
+
| `git push` | Publishing to shared remote |
|
|
291
|
+
| `git merge` (onto develop / main / release) | Shared-branch impact |
|
|
292
|
+
| Any `git rebase` that rewrites shared history | Force-push risk |
|
|
293
|
+
|
|
294
|
+
### Forbidden operations
|
|
295
|
+
|
|
296
|
+
| Operation | Reason |
|
|
297
|
+
|-----------|--------|
|
|
298
|
+
| `git push -f` to `main` / `develop` | Overwrites other people's work |
|
|
299
|
+
| `git reset --hard` to a remote branch | Irreversible |
|
|
300
|
+
| `git commit --amend` on a pushed commit | Rewrites public history |
|
|
301
|
+
| Deleting `main` / `develop` | Protected branches |
|
|
302
|
+
|
|
303
|
+
### Allowed without asking
|
|
304
|
+
|
|
305
|
+
| Operation |
|
|
306
|
+
|-----------|
|
|
307
|
+
| `git status` / `git diff` / `git log` / `git show` |
|
|
308
|
+
| `git fetch` (no merge) |
|
|
309
|
+
| `git stash` (local-only) |
|
|
310
|
+
| `git branch` (listing only) |
|
|
311
|
+
|
|
312
|
+
### AI commit authorship (suggested, not enforced)
|
|
313
|
+
|
|
314
|
+
When an AI assists in producing a commit, appending a `Co-Authored-By`
|
|
315
|
+
line is **suggested** but not mandatory. The canonical form for
|
|
316
|
+
Claude is:
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
For other AI assistants, use the vendor-documented author line (or omit
|
|
323
|
+
it). This is a project-level transparency convention, not a Dflow
|
|
324
|
+
requirement.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 7. CI / CD
|
|
329
|
+
|
|
330
|
+
{Fill in this project's CI/CD pipeline shape: trigger (e.g. push to
|
|
331
|
+
develop, tag), stages (build → test → deploy), environments
|
|
332
|
+
(dev / staging / prod). Reference the pipeline config file if one
|
|
333
|
+
exists, e.g. `.github/workflows/ci.yml` or `azure-pipelines.yml`.}
|
|
334
|
+
|
|
335
|
+
### Suggested CI gates for Clean Architecture
|
|
336
|
+
|
|
337
|
+
- Verify Domain project has zero (or allow-listed) NuGet deps
|
|
338
|
+
- Run Domain unit tests + Application tests on every PR
|
|
339
|
+
- Run Integration tests on `develop` and `release/*` branches
|
|
340
|
+
- Verify EF migrations build cleanly
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Related Documents
|
|
345
|
+
|
|
346
|
+
- `references/git-integration.md` in the Dflow skill — canonical
|
|
347
|
+
source for feature-branch-per-feature, `git mv` mandate, Gate Checks
|
|
348
|
+
- [System overview](_overview.md)
|
|
349
|
+
- [Spec conventions](_conventions.md)
|
|
350
|
+
- `CHANGELOG.md` at repo root
|