spec-runner 1.0.24 → 1.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/README.md +15 -6
- package/bin/spec-runner.js +28 -18
- package/docs/flow.md +58 -201
- package/package.json +1 -1
- package/templates/.spec-runner/project.json.example +1 -1
- package/templates/.spec-runner/scripts/check.sh +2 -38
- package/templates/.spec-runner/scripts/spec-runner-core.sh +129 -348
- package/templates/.spec-runner/scripts/uc-next-start.sh +154 -0
- package/templates/.spec-runner/spec-runner.sh +2 -3
- package/templates/.spec-runner/steps/steps.json +22 -97
- package/templates/.spec-runner/steps//343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.md +10 -9
- package/templates/.spec-runner/steps//343/203/211/343/203/241/343/202/244/343/203/263/350/250/255/350/250/210.md +2 -2
- package/templates/.spec-runner/steps//344/273/225/346/247/230/347/255/226/345/256/232.md +16 -14
- package/templates/.spec-runner/steps//345/210/206/346/236/220.md +2 -2
- package/templates/.spec-runner/steps//345/256/237/350/243/205.md +8 -7
- package/templates/.spec-runner/steps//345/256/237/350/243/205/350/250/210/347/224/273.md +10 -10
- package/templates/.spec-runner/steps//346/206/262/347/253/240.md +1 -1
- package/templates/.spec-runner/steps//346/233/226/346/230/247/343/201/225/350/247/243/346/266/210.md +1 -1
- package/templates/mkdocs-scaffold/docs/index.md +2 -2
- package/templates/skills/uc-k1-work-card-init/SKILL.md +76 -0
- package/templates/skills/uc-k2-pre-commit-check/SKILL.md +57 -0
- package/templates/skills/uc-k3-spec-impl-diff-review/SKILL.md +57 -0
- package/templates/spec-runner-command.md +4 -3
- package/templates/.spec-runner/hooks/pre-commit +0 -47
- package/templates/.spec-runner/hooks/pre-push +0 -9
- package/templates/.spec-runner/scripts/branch/uc-next-start.sh +0 -224
- package/templates/.spec-runner/scripts/docs-serve.sh +0 -21
- package/templates/.spec-runner/scripts/test/require-tests-green.sh +0 -27
- package/templates/.spec-runner/steps//343/201/235/343/201/256/344/273/226/344/275/234/346/245/255.md +0 -34
- package/templates/.spec-runner/steps//343/202/277/343/202/271/343/202/257/344/270/200/350/246/247.md +0 -95
- package/templates/.spec-runner/steps//343/203/201/343/202/247/343/203/203/343/202/257/343/203/252/343/202/271/343/203/210.md +0 -80
- package/templates/.spec-runner/templates/grade-history.json +0 -5
package/README.md
CHANGED
|
@@ -42,12 +42,21 @@ curl -sSL https://raw.githubusercontent.com/TEEE88/spec-runner/main/install.sh |
|
|
|
42
42
|
|
|
43
43
|
AI から使う場合は、`/spec-runner` のように「spec-runner を実行する」と伝えればよい。フェーズやコマンド名を覚える必要はない。
|
|
44
44
|
|
|
45
|
+
**Git**: フェーズごとにブランチを切る必要はない。**コミットしたくなったとき**に、AI と `project.json` の命名に沿ってブランチ名・メッセージを相談し、一緒にコミットする運用でよい(詳細は同梱の `docs/flow.md` と `.spec-runner/steps/仕様策定.md`)。
|
|
46
|
+
|
|
45
47
|
---
|
|
46
48
|
|
|
47
49
|
## フロー(全体像)
|
|
48
50
|
|
|
49
51
|
設計書(`docs/01..06`)と UC 仕様(`docs/02_ユースケース仕様/`)をどんな順で作っていくかは `docs/flow.md` にまとめています。
|
|
50
52
|
|
|
53
|
+
## Skills テンプレート(任意)
|
|
54
|
+
|
|
55
|
+
- `templates/skills/uc-k1-work-card-init/SKILL.md`(`docs/work.md` 初期化)
|
|
56
|
+
- `templates/skills/uc-k2-pre-commit-check/SKILL.md`(コミット前チェック案内)
|
|
57
|
+
- `templates/skills/uc-k3-spec-impl-diff-review/SKILL.md`(仕様-実装差分レビュー)
|
|
58
|
+
- `npx spec-runner` 実行時に、不足分のみ `.claude/skills/` へ自動コピーされます(既存ファイルは上書きしない)。
|
|
59
|
+
|
|
51
60
|
---
|
|
52
61
|
|
|
53
62
|
## ドキュメントサイト(MkDocs + Material)
|
|
@@ -59,13 +68,13 @@ AI から使う場合は、`/spec-runner` のように「spec-runner を実行
|
|
|
59
68
|
プレビュー起動(Python 3 必須・仮想環境 `.venv-docs/` を使用):
|
|
60
69
|
|
|
61
70
|
```bash
|
|
62
|
-
./.
|
|
71
|
+
python3 -m venv .venv-docs && ./.venv-docs/bin/pip install -q -r requirements-docs.txt && ./.venv-docs/bin/mkdocs serve --dev-addr 127.0.0.1:8000
|
|
63
72
|
```
|
|
64
73
|
|
|
65
74
|
`8000` が使用中のとき:
|
|
66
75
|
|
|
67
76
|
```bash
|
|
68
|
-
|
|
77
|
+
python3 -m venv .venv-docs && ./.venv-docs/bin/pip install -q -r requirements-docs.txt && ./.venv-docs/bin/mkdocs serve --dev-addr 127.0.0.1:8001
|
|
69
78
|
```
|
|
70
79
|
|
|
71
80
|
## 導入後にできるもの
|
|
@@ -76,14 +85,14 @@ DOCS_PORT=8001 ./.spec-runner/scripts/docs-serve.sh
|
|
|
76
85
|
│ ├── spec-runner.sh # 入口(次のステップ --json)
|
|
77
86
|
│ ├── project.json # 設定(ブランチ命名・必須ドキュメント・テストコマンド等)
|
|
78
87
|
│ ├── phase-locks.json # フェーズの通過状態
|
|
79
|
-
│ ├──
|
|
80
|
-
│ ├── scripts/ # spec-runner-core.sh, check, branch, docs-serve.sh 等
|
|
88
|
+
│ ├── scripts/ # spec-runner-core.sh, check, branch 等
|
|
81
89
|
│ ├── steps/ # 憲章・ドメイン設計・仕様策定・曖昧さ解消・テスト設計・実装 等の .md
|
|
82
90
|
│ └── templates/ # UC 仕様書ひな形
|
|
83
91
|
├── .claude/commands/spec-runner.md # Claude 用コマンド定義(/spec-runner)
|
|
92
|
+
├── .claude/skills/ # Skills テンプレート(不足分のみ自動配置)
|
|
84
93
|
├── mkdocs.yml # MkDocs(未有効時のみ配置)
|
|
85
94
|
├── requirements-docs.txt # mkdocs / mkdocs-material(未有効時のみ配置)
|
|
86
|
-
├── docs/ # 設計書(01..06)+ index.md 等。MkDocs の文書ルート
|
|
95
|
+
├── docs/ # 設計書(01..06)+ work.md + index.md 等。MkDocs の文書ルート
|
|
87
96
|
└── (AI は Claude Code 前提)
|
|
88
97
|
```
|
|
89
98
|
|
|
@@ -95,7 +104,7 @@ DOCS_PORT=8001 ./.spec-runner/scripts/docs-serve.sh
|
|
|
95
104
|
- jq
|
|
96
105
|
- git
|
|
97
106
|
- bash 4.0+
|
|
98
|
-
- 設計書の MkDocs プレビュー: Python 3
|
|
107
|
+
- 設計書の MkDocs プレビュー: Python 3(venv + mkdocs コマンドを直接実行)
|
|
99
108
|
|
|
100
109
|
---
|
|
101
110
|
|
package/bin/spec-runner.js
CHANGED
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
* 必須テンプレ(パッケージ内):
|
|
19
19
|
* - templates/.spec-runner/project.json.example
|
|
20
20
|
* - templates/.spec-runner/templates/phase-locks.json
|
|
21
|
-
* - templates/.spec-runner/templates/grade-history.json
|
|
22
21
|
*
|
|
23
22
|
* MkDocs(任意・プロジェクトルート):
|
|
24
23
|
* - templates/mkdocs-scaffold/ の mkdocs.yml / requirements-docs.txt / docs/index.md を
|
|
@@ -35,15 +34,14 @@ const TEMPLATE_SPEC_RUNNER_DIR = path.join(PKG_DIR, "templates", ".spec-runner")
|
|
|
35
34
|
const DEST_DIR = path.join(CWD, ".spec-runner");
|
|
36
35
|
const TEMPLATES_DIR = path.join(TEMPLATE_SPEC_RUNNER_DIR, "templates");
|
|
37
36
|
const PHASE_LOCKS_TEMPLATE = path.join(TEMPLATES_DIR, "phase-locks.json");
|
|
38
|
-
const GRADE_HISTORY_TEMPLATE = path.join(TEMPLATES_DIR, "grade-history.json");
|
|
39
37
|
const MKDOCS_SCAFFOLD_DIR = path.join(PKG_DIR, "templates", "mkdocs-scaffold");
|
|
40
38
|
const FLOW_DOC_SRC = path.join(PKG_DIR, "docs", "flow.md");
|
|
39
|
+
const SKILLS_TEMPLATE_DIR = path.join(PKG_DIR, "templates", "skills");
|
|
41
40
|
|
|
42
41
|
/** コピー時はスキップし、FORCE 時は消さない(ユーザー状態を保持) */
|
|
43
42
|
const USER_STATE_BASENAMES = new Set([
|
|
44
43
|
"project.json",
|
|
45
44
|
"phase-locks.json",
|
|
46
|
-
"grade-history.json",
|
|
47
45
|
]);
|
|
48
46
|
|
|
49
47
|
function log(msg) {
|
|
@@ -84,10 +82,6 @@ function ensureTemplateDirOrExit() {
|
|
|
84
82
|
error("必須テンプレ templates/phase-locks.json が見つかりません。");
|
|
85
83
|
process.exit(1);
|
|
86
84
|
}
|
|
87
|
-
if (!exists(GRADE_HISTORY_TEMPLATE)) {
|
|
88
|
-
error("必須テンプレ templates/grade-history.json が見つかりません。");
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
85
|
}
|
|
92
86
|
|
|
93
87
|
function assertDestInstallableOrExit() {
|
|
@@ -154,18 +148,12 @@ function bootstrapProjectJson() {
|
|
|
154
148
|
* フェーズ用 JSON は templates/.spec-runner/templates/*.json を正とする。
|
|
155
149
|
* .spec-runner/ 直下に無いときだけコピー(既存のロックは上書きしない)。
|
|
156
150
|
*/
|
|
157
|
-
function
|
|
151
|
+
function writeInitialLocks() {
|
|
158
152
|
const locksDest = path.join(DEST_DIR, "phase-locks.json");
|
|
159
153
|
if (!exists(locksDest)) {
|
|
160
154
|
fs.copyFileSync(PHASE_LOCKS_TEMPLATE, locksDest);
|
|
161
155
|
ok(path.relative(CWD, locksDest));
|
|
162
156
|
}
|
|
163
|
-
|
|
164
|
-
const gradeDest = path.join(DEST_DIR, "grade-history.json");
|
|
165
|
-
if (!exists(gradeDest)) {
|
|
166
|
-
fs.copyFileSync(GRADE_HISTORY_TEMPLATE, gradeDest);
|
|
167
|
-
ok(path.relative(CWD, gradeDest));
|
|
168
|
-
}
|
|
169
157
|
}
|
|
170
158
|
|
|
171
159
|
function installClaudeCommandIfPresent() {
|
|
@@ -177,6 +165,30 @@ function installClaudeCommandIfPresent() {
|
|
|
177
165
|
ok(path.relative(CWD, claudeCmd));
|
|
178
166
|
}
|
|
179
167
|
|
|
168
|
+
function installClaudeSkillsTemplatesIfPresent() {
|
|
169
|
+
if (!exists(SKILLS_TEMPLATE_DIR)) return;
|
|
170
|
+
const destRoot = path.join(CWD, ".claude", "skills");
|
|
171
|
+
info("Skills テンプレート(不足分のみ)を .claude/skills に配置します...");
|
|
172
|
+
|
|
173
|
+
function walk(srcDir, rel = "") {
|
|
174
|
+
for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
|
|
175
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
176
|
+
const relPath = path.join(rel, entry.name);
|
|
177
|
+
const destPath = path.join(destRoot, relPath);
|
|
178
|
+
if (entry.isDirectory()) {
|
|
179
|
+
walk(srcPath, relPath);
|
|
180
|
+
} else {
|
|
181
|
+
if (exists(destPath)) continue;
|
|
182
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
183
|
+
fs.copyFileSync(srcPath, destPath);
|
|
184
|
+
ok(path.relative(CWD, destPath));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
walk(SKILLS_TEMPLATE_DIR);
|
|
190
|
+
}
|
|
191
|
+
|
|
180
192
|
/**
|
|
181
193
|
* MkDocs + Material 用のファイルをプロジェクトルートに配置(未存在時のみ)。
|
|
182
194
|
* 設計書本体は steps.json どおり docs/01..06 に置かれ、mkdocs の docs_dir でそのまま掲載する。
|
|
@@ -238,9 +250,6 @@ function printBanner() {
|
|
|
238
250
|
}
|
|
239
251
|
|
|
240
252
|
function printFooter() {
|
|
241
|
-
log("");
|
|
242
|
-
log("設計書プレビュー(MkDocs + Material・プロジェクトルートの docs/):");
|
|
243
|
-
log(" ./.spec-runner/scripts/docs-serve.sh");
|
|
244
253
|
log("");
|
|
245
254
|
log("次のステップ(Claude Code 専用):");
|
|
246
255
|
log(" /spec-runner を実行して");
|
|
@@ -257,8 +266,9 @@ function main() {
|
|
|
257
266
|
wipeDestExceptUserState();
|
|
258
267
|
expandTemplateTree();
|
|
259
268
|
bootstrapProjectJson();
|
|
260
|
-
|
|
269
|
+
writeInitialLocks();
|
|
261
270
|
installClaudeCommandIfPresent();
|
|
271
|
+
installClaudeSkillsTemplatesIfPresent();
|
|
262
272
|
printFooter();
|
|
263
273
|
}
|
|
264
274
|
|
package/docs/flow.md
CHANGED
|
@@ -1,213 +1,70 @@
|
|
|
1
|
-
# spec-runner
|
|
1
|
+
# spec-runner フロー(シンプル版)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
「次のステップ」は **1 本のコマンド**が返す **1 つの `command_file`(`.spec-runner/steps/*.md`)** だけです。
|
|
3
|
+
このドキュメントは、`templates/.spec-runner/scripts/spec-runner-core.sh` と `templates/.spec-runner/steps/steps.json` に合わせた最新フローを説明する。
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
## 入口コマンド
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
| 用途 | コマンド |
|
|
8
|
+
|---|---|
|
|
9
|
+
| 次のステップ | `./.spec-runner/spec-runner.sh 次のステップ --json` |
|
|
10
|
+
| lock 状態表示 | `./.spec-runner/spec-runner.sh 次のステップ --lock` |
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|------|-------------------------------|
|
|
12
|
-
| 次のステップ(人間向けテキスト) | `./.spec-runner/spec-runner.sh` または `./.spec-runner/spec-runner.sh 次のステップ` |
|
|
13
|
-
| 次のステップ(JSON) | `./.spec-runner/spec-runner.sh 次のステップ --json` |
|
|
14
|
-
| Lock 一覧 | `./.spec-runner/spec-runner.sh 次のステップ --lock`(内部では `--status`) |
|
|
15
|
-
| グレード判定ガイド | `./.spec-runner/spec-runner.sh 次のステップ --グレード` |
|
|
12
|
+
## 設計方針
|
|
16
13
|
|
|
17
|
-
-
|
|
18
|
-
-
|
|
14
|
+
- `spec-runner` は **薄いオーケストレータ**(次の一手を返す)
|
|
15
|
+
- 正本は `docs/work.md`
|
|
16
|
+
- 主線は 6 ステップ(実行フェーズは5本 + 憲章)、横断は 2 ステップ
|
|
17
|
+
- ブランチ運用やグレード判定は強制しない
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
## 主線 6 ステップ
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
| `command_file` | 絶対パス想定の `.spec-runner/steps/<md_file>` |
|
|
29
|
-
| `grade` | `grade-history.json` の `current_grade` |
|
|
30
|
-
| `check_command` | 毎回のチェック用シェルコマンド |
|
|
31
|
-
| `step_commands` | そのステップ用のコマンド配列(JSON) |
|
|
32
|
-
| `feature_dir` / `feature_spec` | UC ブランチ時、該当 UC のディレクトリ・仕様書パス(取れれば) |
|
|
21
|
+
1. `charter`(憲章)
|
|
22
|
+
2. `uc_spec`(仕様策定)
|
|
23
|
+
3. `domain`(ドメイン設計)
|
|
24
|
+
4. `architecture_plan`(実装計画)
|
|
25
|
+
5. `test_design`(テスト設計)
|
|
26
|
+
6. `implement`(実装)
|
|
33
27
|
|
|
34
|
-
|
|
28
|
+
※ 運用上は「実行フェーズ5本(仕様→ドメイン→計画→テスト→実装)+ 憲章」で扱う。
|
|
35
29
|
|
|
36
|
-
##
|
|
37
|
-
|
|
38
|
-
### `.spec-runner/phase-locks.json`
|
|
39
|
-
|
|
40
|
-
実際のキーは次のとおり(各オブジェクトに `completed`, `locked_at`, `reviewed_by` 等)。
|
|
41
|
-
|
|
42
|
-
| キー | 意味 |
|
|
43
|
-
|------|------|
|
|
44
|
-
| `charter` | 憲章フェーズ完了。ゲートでは `reviewed_by` も参照(LOOP1 時) |
|
|
45
|
-
| `domain` | ドメイン設計フェーズ完了 |
|
|
46
|
-
| `architecture` | アーキ(実装計画)フェーズ完了 |
|
|
47
|
-
| `infra` | インフラ詳細(Grade A)完了 |
|
|
48
|
-
| `test_design` | テスト設計ロック(ゲート側で参照) |
|
|
49
|
-
| `uc_discovery` | UC 洗い出し完了(`false` の間は domain に進まない) |
|
|
50
|
-
| `uc_reviewed` | **文字列の配列**。UC 仕様ファイルの **ベース名(拡張子なし)** が入ると「レビュー通過」とみなす(例: `UC-1-foo`) |
|
|
51
|
-
|
|
52
|
-
### `.spec-runner/grade-history.json`
|
|
53
|
-
|
|
54
|
-
- `current_grade`: `LOOP1` / `A` / `B` / `C` など(**ブランチ名には含めない**)
|
|
55
|
-
- Grade A のとき、UC レビュー通過後は **インフラ詳細(`infra_plan`)** が先に出る(`infra.completed` が付くまで)
|
|
56
|
-
|
|
57
|
-
### `.spec-runner/project.json`
|
|
58
|
-
|
|
59
|
-
- `naming`: ブランチ接頭辞 `branch_prefix`(既定 `feature`)、`uc_id_pattern`、`other_work_prefixes`(例: `work`, `infra`, `cicd`)
|
|
60
|
-
- `required_docs`: ゲート確認時の必須パス(`steps:charter` 形式で `steps.json` の `common.docs` を参照)
|
|
61
|
-
- `test_design.dir` / `test_design.pattern`(既定: `tests`, `*.spec.*`)
|
|
62
|
-
- `test_design.require_uc_prefixed_tests`(既定: キー省略時 **true**): **TDD 前提**。UC ブランチでは **`UC-N-` で始まり `pattern` に合致するテストファイル**が `test_design.dir` 内に無い限り **`test_design` のまま**(`implement` に進めない)。`false` にすると従来どおり「任意の spec が1つでもあれば実装」。
|
|
63
|
-
- `test_command.run`: **`require-tests-green.sh` が実行するテストコマンド**(実装完了の機械的条件)
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 「次のステップ」の分岐(`spec-runner-core.sh` の実際)
|
|
68
|
-
|
|
69
|
-
ブランチ種別・ロック・UC 有無・`uc_reviewed`・グレード・テストファイル有無で決まります。**紙の上の「常に UC→ドメイン→アーキ」の直線とは一致しません。**
|
|
70
|
-
|
|
71
|
-
### 1) UC ブランチ上(`feature/<UC-N>-<slug>` 形式)
|
|
72
|
-
|
|
73
|
-
1. 該当 `UC-N-*.md` が **まだ無い** → **`uc_spec`**(仕様策定)
|
|
74
|
-
2. 仕様はあるが **`uc_reviewed` にベース名が無い** → **`clarify`**(曖昧さ解消・レビュー通過まで)
|
|
75
|
-
3. レビュー済みかつ **`uc_discovery.completed` が false** → **`uc_spec`**(次UC作成)
|
|
76
|
-
4. レビュー済みかつ **Grade A かつ `infra.completed` でない** → **`infra_plan`**
|
|
77
|
-
5. それ以外で **当該 UC 用テストが未準備**(`require_uc_prefixed_tests` が true のときは **`UC-N-*.spec.*` 形式が1つ以上**)→ **`test_design`**
|
|
78
|
-
6. 上記を満たす → **`implement`**(あわせて **テストがグリーン**になるまで完了とみなさないのは `require-tests-green.sh` 側)
|
|
79
|
-
|
|
80
|
-
※ **ドメイン・アーキのロック未完了でも**、上記 UC ブランチ上では 3〜6 に進めます(コア実装どおり)。
|
|
81
|
-
|
|
82
|
-
### 2) UC ブランチではない(main 等)
|
|
83
|
-
|
|
84
|
-
実装では **次の順で最初に当てはまる分岐**が選ばれます(UC ブランチでも `other_work` ブランチでもない場合)。
|
|
85
|
-
|
|
86
|
-
1. **`charter.completed` でない**
|
|
87
|
-
- `docs/01_憲章/憲章.md` が無い → **`charter`**
|
|
88
|
-
- `docs/01_憲章/憲章.md` があり、`quality.clarified.charter` 未記録 → **`clarify`**(憲章の曖昧さ解消)
|
|
89
|
-
- `docs/01_憲章/憲章.md` があり、`quality.analyzed.charter` 未記録 → **`analyze`**(憲章の分析)
|
|
90
|
-
- 上記が記録済み → **`charter`**
|
|
91
|
-
2. **ドメイン未ロックかつ `uc_discovery.completed` が false** → **`uc_spec`**(次UC作成)
|
|
92
|
-
3. **ドメイン未ロックかつ `uc_discovery.completed` が true かつ `docs/02_...` に UC が 1 件以上**
|
|
93
|
-
- `docs/03_ドメイン設計/` に `.md` があり、`quality.clarified.domain` 未記録 → **`clarify`**
|
|
94
|
-
- `docs/03_ドメイン設計/` に `.md` があり、`quality.analyzed.domain` 未記録 → **`analyze`**
|
|
95
|
-
- 上記が記録済み、または `.md` が無い → **`domain`**
|
|
96
|
-
4. **ドメイン済みかつアーキ未ロック**
|
|
97
|
-
- `docs/04_アーキテクチャ/` に `.md` があり、`quality.clarified.architecture` 未記録 → **`clarify`**
|
|
98
|
-
- `docs/04_アーキテクチャ/` に `.md` があり、`quality.analyzed.architecture` 未記録 → **`analyze`**
|
|
99
|
-
- 上記が記録済み、または `.md` が無い → **`architecture_plan`**
|
|
100
|
-
5. **`other_work` 用ブランチ**(`feature/<other_work_prefix>/...`)かつ **2〜4 を通過済み** → **`other_work`**
|
|
101
|
-
6. **ドメイン未ロック**(この時点では UC が 0 件)→ **`uc_spec`**
|
|
102
|
-
7. **ドメイン・アーキともロック済み** → **`uc_spec`**(次の UC 開始)
|
|
103
|
-
|
|
104
|
-
要点:
|
|
105
|
-
|
|
106
|
-
- **初回**: main で UC がまだ無いと **6** で **`uc_spec`**。
|
|
107
|
-
- **UC がリポジトリに既にあるのにドメイン未ロック**(main で作業)→ `uc_discovery.completed=false` の間は **`uc_spec`** が先(`true` になってから **`domain`**)。
|
|
108
|
-
- **アーキ**は **ドメイン完了後**に **4** で出る。
|
|
109
|
-
|
|
110
|
-
### 3) 自動では選ばれないステップ(`steps.json` にのみ存在)
|
|
111
|
-
|
|
112
|
-
次の `id` は **コアの `run_phase` では返しません**。各 `.md`(仕様策定・テスト設計等)の **手順の中で**使う想定です。
|
|
30
|
+
## 横断 2 ステップ
|
|
113
31
|
|
|
32
|
+
- `clarify`(曖昧さ解消)
|
|
114
33
|
- `analyze`(分析)
|
|
115
|
-
- `checklist`(チェックリスト)
|
|
116
|
-
- `task_list`(タスク一覧)
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 成果物の置き場所(`steps.json` の `common.docs` と一致)
|
|
121
|
-
|
|
122
|
-
| キー | パス(既定) |
|
|
123
|
-
|------|----------------|
|
|
124
|
-
| 憲章 | `docs/01_憲章/憲章.md` |
|
|
125
|
-
| UC ルート | `docs/02_ユースケース仕様/<カテゴリ>/UC-N-<slug>.md` |
|
|
126
|
-
| ドメイン | `docs/03_ドメイン設計/`(ユビキタス言語辞書・ドメインモデル・集約 等) |
|
|
127
|
-
| アーキ | `docs/04_アーキテクチャ/` |
|
|
128
|
-
| インフラ | `docs/05_インフラ設計/`(例: `schema.dbml`) |
|
|
129
|
-
| API | `docs/06_API仕様/openapi.yaml` |
|
|
130
|
-
|
|
131
|
-
- UC ファイル名は **`UC-<N>-<slug>.md`**(`slug` は英数字・ハイフンが無難。ブランチ名も ASCII)。
|
|
132
|
-
- カテゴリフォルダ名は日本語可。
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## ディレクトリ構成(パッケージテンプレに近い形)
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
<プロジェクトルート>/
|
|
140
|
-
├── .spec-runner/
|
|
141
|
-
│ ├── spec-runner.sh
|
|
142
|
-
│ ├── project.json # 初回は project.json.example から
|
|
143
|
-
│ ├── phase-locks.json # 初回は templates/phase-locks.json から
|
|
144
|
-
│ ├── grade-history.json
|
|
145
|
-
│ ├── scripts/
|
|
146
|
-
│ │ ├── spec-runner-core.sh
|
|
147
|
-
│ │ ├── check.sh # --every / --full
|
|
148
|
-
│ │ ├── branch/uc-next-start.sh
|
|
149
|
-
│ │ └── test/require-tests-green.sh
|
|
150
|
-
│ ├── steps/ # *.md + steps.json
|
|
151
|
-
│ ├── templates/ # 憲章・UC・ドメイン雛形等
|
|
152
|
-
│ └── hooks/ # pre-commit / pre-push(任意)
|
|
153
|
-
├── docs/01_憲章/ … 06_API仕様/
|
|
154
|
-
├── tests/ # project.json の test_design.dir
|
|
155
|
-
└── src/
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
- **`npx spec-runner`**: `.spec-runner/` を展開し、**`.claude/commands/spec-runner.md` を配置**(テンプレに存在する場合)。`.cursor/` への自動配置は **インストーラでは行っていない**。
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
## フェーズ番号とステップ(`steps.json`)
|
|
163
|
-
|
|
164
|
-
| phase | step_id(代表) | 内容 |
|
|
165
|
-
|-------|-----------------|------|
|
|
166
|
-
| 0 | `charter` | 憲章 |
|
|
167
|
-
| 1 | `uc_spec` / `other_work` | UC 仕様・その他ブランチ |
|
|
168
|
-
| 2 | `domain` | ドメイン設計 |
|
|
169
|
-
| 3 | `architecture_plan` | 実装計画(アーキ) |
|
|
170
|
-
| 4 | `infra_plan` | インフラ詳細(Grade A) |
|
|
171
|
-
| 5 | `test_design` | PENDING テスト |
|
|
172
|
-
| 6 | `implement` | 実装・テストグリーン |
|
|
173
|
-
|
|
174
|
-
`clarify`(曖昧さ解消)と `analyze`(分析)は `phase: null` の任意ステップとして扱い、必要なタイミングで実行できます。
|
|
175
|
-
|
|
176
|
-
補足: `clarify` / `analyze` の自動実行は `.spec-runner/phase-locks.json` の `quality` によって 1 度ずつ管理します。
|
|
177
|
-
(UC は `uc_reviewed` 未登録の間、`clarify -> analyze -> clarify ...` の品質ループを回せます)
|
|
178
|
-
|
|
179
|
-
### 実装完了(Phase 6)の機械的条件
|
|
180
|
-
|
|
181
|
-
- **手動または CI で** `.spec-runner/scripts/test/require-tests-green.sh` が **exit 0** であること。
|
|
182
|
-
- 中身は `project.json` の **`test_command.run`** のみを `eval` 実行(例: `npm test`)。
|
|
183
|
-
|
|
184
|
-
### ゲート(`spec-runner-core.sh --gate`)のメモ
|
|
185
|
-
|
|
186
|
-
ゲートログ上の「Phase 1/2」表現は **ドメイン=Phase 1、アーキ=Phase 2** のように **steps.json の phase 番号と一致しません**。ロック対象は `phase-locks.json` のキーで判断してください。
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## TDD が「どこまで」強制されるか
|
|
191
|
-
|
|
192
|
-
| レベル | 内容 |
|
|
193
|
-
|--------|------|
|
|
194
|
-
| **ゲート(次のステップ)** | 上記どおり **先に当該 UC の spec ファイルを置く**まで `implement` を出さない(`require_uc_prefixed_tests: true` 時)。 |
|
|
195
|
-
| **レッド→グリーンの順序** | **コミット順や「本番コードより先にアサーションを書いたか」は機械検査していない**。Phase 5 で PENDING/skip、Phase 6 で実装・グリーン、という **フェーズ順**での強制。 |
|
|
196
|
-
| **完了条件** | `require-tests-green.sh`(`test_command.run` 全通過)。 |
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## 理想運用 vs コードのギャップ(把握用)
|
|
201
|
-
|
|
202
|
-
| 観点 | よく言われる理想 | 実コード |
|
|
203
|
-
|------|------------------|----------|
|
|
204
|
-
| UC とドメインの順序 | 常に UC 全部 → ドメイン | `uc_discovery.completed=false` の間は次UC(`uc_spec`)→ `true` になってから domain |
|
|
205
|
-
| UC 実装前にアーキ必須 | あり | **UC ブランチ上では**ドメイン・アーキ未ロックでもテスト設計・実装に進む |
|
|
206
|
-
|
|
207
|
-
運用で「必ずドメイン→アーキ→UC 実装」にしたい場合は、**ロックを先に済ませてから** UC ブランチに入る、またはコアの分岐変更が必要です。
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## 日本語ドキュメント
|
|
212
34
|
|
|
213
|
-
|
|
35
|
+
これらは任意タイミングで使う補助ステップ。主線フェーズを増やさない。
|
|
36
|
+
|
|
37
|
+
## 次ステップ判定(概要)
|
|
38
|
+
|
|
39
|
+
`spec-runner-core.sh` は lock と成果物から次を返す。
|
|
40
|
+
|
|
41
|
+
1. `charter.completed` が false
|
|
42
|
+
- 憲章が未整備なら `charter`
|
|
43
|
+
- 憲章があるなら `clarify` / `analyze` を先に返すことがある
|
|
44
|
+
2. `uc_discovery.completed` が false
|
|
45
|
+
- 未レビュー UC があれば `clarify` / `analyze`(UC 整合性チェック)
|
|
46
|
+
- すべてレビュー済みなら `uc_spec`(次 UC 作成)
|
|
47
|
+
3. `domain.completed` が false
|
|
48
|
+
- 未レビュー UC が 1 件でも残っていれば先に `clarify` / `analyze`
|
|
49
|
+
- 全 UC レビュー済みなら `domain`(必要に応じ `clarify` / `analyze`)
|
|
50
|
+
4. `architecture.completed` が false
|
|
51
|
+
- `architecture_plan`(必要に応じ `clarify` / `analyze`)
|
|
52
|
+
5. 最新 UC がレビュー済みかつテスト準備済み
|
|
53
|
+
- `implement`
|
|
54
|
+
それ以外は `test_design`
|
|
55
|
+
|
|
56
|
+
## 正本(Single Source)
|
|
57
|
+
|
|
58
|
+
- フロー定義: `.spec-runner/steps/steps.json`
|
|
59
|
+
- 進行状態: `.spec-runner/phase-locks.json`
|
|
60
|
+
- 作業正本: `docs/work.md`
|
|
61
|
+
- 仕様本文: `docs/01..06`, `docs/02_ユースケース仕様/**`
|
|
62
|
+
- 実装検証: `tests/**`, `test_command.run`
|
|
63
|
+
|
|
64
|
+
## 運用ルール(最小)
|
|
65
|
+
|
|
66
|
+
1. 実装前に `docs/work.md` の受入条件を埋める
|
|
67
|
+
2. 作業中は `docs/work.md` のタスクを更新する
|
|
68
|
+
3. コミット前に `docs/work.md` の `- [ ]` を確認する
|
|
69
|
+
4. 完了時に `docs/work.md` の検証結果を更新する
|
|
70
|
+
5. UC を十分に作ってレビュー完了したら `uc_discovery.completed` を `true` にする
|
package/package.json
CHANGED
|
@@ -41,14 +41,10 @@ run_steps_json_check() {
|
|
|
41
41
|
"uc_spec"
|
|
42
42
|
"domain"
|
|
43
43
|
"architecture_plan"
|
|
44
|
-
"infra_plan"
|
|
45
44
|
"test_design"
|
|
46
45
|
"implement"
|
|
47
46
|
"clarify"
|
|
48
47
|
"analyze"
|
|
49
|
-
"checklist"
|
|
50
|
-
"task_list"
|
|
51
|
-
"other_work"
|
|
52
48
|
)
|
|
53
49
|
|
|
54
50
|
dup_ids=$(jq -r '.steps[]?.id // empty' "$sj" | sort | uniq -d || true)
|
|
@@ -94,29 +90,6 @@ run_steps_json_check() {
|
|
|
94
90
|
run_naming_check() {
|
|
95
91
|
local errors=0
|
|
96
92
|
|
|
97
|
-
# ブランチ名
|
|
98
|
-
local branch
|
|
99
|
-
branch=$(git branch --show-current 2>/dev/null || echo "")
|
|
100
|
-
if [[ -n "$branch" ]]; then
|
|
101
|
-
local pj valid bp uc_id_pat other_work
|
|
102
|
-
pj="$REPO_ROOT/.spec-runner/project.json"
|
|
103
|
-
[[ -f "$pj" ]] || { echo "NAMING: project.json がありません: $pj" >&2; return 1; }
|
|
104
|
-
command -v jq >/dev/null 2>&1 || { echo "NAMING: jq が必要です(brew install jq)" >&2; return 1; }
|
|
105
|
-
bp="$(jq -r '.naming.branch_prefix' "$pj")"
|
|
106
|
-
uc_id_pat="$(jq -r '.naming.uc_id_pattern' "$pj")"
|
|
107
|
-
other_work="$(jq -r '.naming.other_work_prefixes[] | . + "/.+"' "$pj" | tr '\n' '|' | sed 's/|$//')"
|
|
108
|
-
if [[ -z "$bp" || "$bp" == "null" || -z "$uc_id_pat" || "$uc_id_pat" == "null" || -z "$other_work" ]]; then
|
|
109
|
-
echo "NAMING: project.json の naming.branch_prefix / uc_id_pattern / other_work_prefixes が不正です" >&2
|
|
110
|
-
errors=$((errors+1))
|
|
111
|
-
else
|
|
112
|
-
valid="^(main|develop|${bp}/(${uc_id_pat}-.+|${other_work})|fix/${uc_id_pat}-.+|release/[0-9]+\\.[0-9]+\\.[0-9]+.*|hotfix/[0-9]+\\.[0-9]+\\.[0-9]+-.+)$"
|
|
113
|
-
if ! echo "$branch" | grep -qE "$valid"; then
|
|
114
|
-
echo "NAMING: ブランチ名「$branch」が規則違反" >&2
|
|
115
|
-
errors=$((errors+1))
|
|
116
|
-
fi
|
|
117
|
-
fi
|
|
118
|
-
fi
|
|
119
|
-
|
|
120
93
|
# src フォルダ命名(存在する場合のみ)
|
|
121
94
|
if [[ -d "src" ]]; then
|
|
122
95
|
while IFS= read -r dir; do
|
|
@@ -130,7 +103,7 @@ run_naming_check() {
|
|
|
130
103
|
fi
|
|
131
104
|
|
|
132
105
|
if [[ $errors -eq 0 ]]; then
|
|
133
|
-
ok "✅
|
|
106
|
+
ok "✅ 命名規則チェック(src 配下フォルダ): 問題なし"
|
|
134
107
|
return 0
|
|
135
108
|
else
|
|
136
109
|
return 1
|
|
@@ -350,16 +323,7 @@ run_health_check() {
|
|
|
350
323
|
fi
|
|
351
324
|
fi
|
|
352
325
|
|
|
353
|
-
|
|
354
|
-
drifts+=(".spec-runner/grade-history.json がありません")
|
|
355
|
-
elif command -v jq >/dev/null 2>&1; then
|
|
356
|
-
grade=$(jq -r '.current_grade' .spec-runner/grade-history.json)
|
|
357
|
-
[[ -n "$grade" && "$grade" != "null" ]] || drifts+=("grade-history.json の current_grade が未設定です")
|
|
358
|
-
if [[ "$grade" == "A" && "$current_phase" -ge 4 && "$is_quality_step" -eq 0 ]]; then
|
|
359
|
-
[[ ! -f "$INFRA_ROOT/schema.dbml" ]] && drifts+=("Grade A 必須: schema.dbml が存在しません")
|
|
360
|
-
schema_sync_check >/dev/null 2>&1 || drifts+=("Prisma と schema.dbml のテーブルが一致していません(スキーマ同期チェック)")
|
|
361
|
-
fi
|
|
362
|
-
fi
|
|
326
|
+
# grade ベースの強制は行わない(薄いオーケストレータ方針)
|
|
363
327
|
|
|
364
328
|
if [[ "$current_phase" -ge 3 && "$is_quality_step" -eq 0 ]]; then
|
|
365
329
|
[[ ! -f "$OPENAPI_PATH" ]] && drifts+=("openapi.yaml が存在しません")
|