spec-runner 1.0.24 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +15 -7
  2. package/bin/spec-runner.js +28 -23
  3. package/docs/flow.md +59 -201
  4. package/package.json +1 -1
  5. package/templates/.spec-runner/project.json.example +1 -1
  6. package/templates/.spec-runner/scripts/check.sh +2 -38
  7. package/templates/.spec-runner/scripts/spec-runner-core.sh +137 -348
  8. package/templates/.spec-runner/scripts/uc-next-start.sh +154 -0
  9. package/templates/.spec-runner/spec-runner.sh +2 -3
  10. package/templates/.spec-runner/steps/steps.json +22 -97
  11. package/templates/.spec-runner/steps//343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.md +10 -9
  12. 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
  13. package/templates/.spec-runner/steps//344/273/225/346/247/230/347/255/226/345/256/232.md +16 -14
  14. package/templates/.spec-runner/steps//345/210/206/346/236/220.md +2 -2
  15. package/templates/.spec-runner/steps//345/256/237/350/243/205.md +8 -7
  16. package/templates/.spec-runner/steps//345/256/237/350/243/205/350/250/210/347/224/273.md +10 -10
  17. package/templates/.spec-runner/steps//346/206/262/347/253/240.md +1 -1
  18. package/templates/.spec-runner/steps//346/233/226/346/230/247/343/201/225/350/247/243/346/266/210.md +1 -1
  19. package/templates/mkdocs-scaffold/docs/index.md +3 -3
  20. package/templates/skills/uc-k1-work-card-init/SKILL.md +76 -0
  21. package/templates/skills/uc-k2-pre-commit-check/SKILL.md +57 -0
  22. package/templates/skills/uc-k3-spec-impl-diff-review/SKILL.md +57 -0
  23. package/templates/spec-runner-command.md +4 -3
  24. package/templates/.spec-runner/hooks/pre-commit +0 -47
  25. package/templates/.spec-runner/hooks/pre-push +0 -9
  26. package/templates/.spec-runner/scripts/branch/uc-next-start.sh +0 -224
  27. package/templates/.spec-runner/scripts/docs-serve.sh +0 -21
  28. package/templates/.spec-runner/scripts/test/require-tests-green.sh +0 -27
  29. package/templates/.spec-runner/steps//343/201/235/343/201/256/344/273/226/344/275/234/346/245/255.md +0 -34
  30. package/templates/.spec-runner/steps//343/202/277/343/202/271/343/202/257/344/270/200/350/246/247.md +0 -95
  31. 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
  32. package/templates/.spec-runner/templates/grade-history.json +0 -5
package/README.md CHANGED
@@ -22,7 +22,6 @@ curl -sSL https://raw.githubusercontent.com/TEEE88/spec-runner/main/install.sh |
22
22
 
23
23
  - `mkdocs.yml` / `requirements-docs.txt`
24
24
  - `docs/index.md`(サイトのホーム)
25
- - `docs/spec-runner-フロー.md`(`spec-runner` パッケージ同梱の手順書)
26
25
 
27
26
  `.spec-runner/` がすでにあり **2 回目以降はエラーで止まる** 場合も、**その手前**で上記 MkDocs 用ファイルの不足分だけ補完される(初回導入以前のリポジトリで MkDocs だけ足したいときに便利)。
28
27
 
@@ -42,12 +41,21 @@ curl -sSL https://raw.githubusercontent.com/TEEE88/spec-runner/main/install.sh |
42
41
 
43
42
  AI から使う場合は、`/spec-runner` のように「spec-runner を実行する」と伝えればよい。フェーズやコマンド名を覚える必要はない。
44
43
 
44
+ **Git**: フェーズごとにブランチを切る必要はない。**コミットしたくなったとき**に、AI と `project.json` の命名に沿ってブランチ名・メッセージを相談し、一緒にコミットする運用でよい(詳細は同梱の `docs/flow.md` と `.spec-runner/steps/仕様策定.md`)。
45
+
45
46
  ---
46
47
 
47
48
  ## フロー(全体像)
48
49
 
49
50
  設計書(`docs/01..06`)と UC 仕様(`docs/02_ユースケース仕様/`)をどんな順で作っていくかは `docs/flow.md` にまとめています。
50
51
 
52
+ ## Skills テンプレート(任意)
53
+
54
+ - `templates/skills/uc-k1-work-card-init/SKILL.md`(`docs/work.md` 初期化)
55
+ - `templates/skills/uc-k2-pre-commit-check/SKILL.md`(コミット前チェック案内)
56
+ - `templates/skills/uc-k3-spec-impl-diff-review/SKILL.md`(仕様-実装差分レビュー)
57
+ - `npx spec-runner` 実行時に、不足分のみ `.claude/skills/` へ自動コピーされます(既存ファイルは上書きしない)。
58
+
51
59
  ---
52
60
 
53
61
  ## ドキュメントサイト(MkDocs + Material)
@@ -59,13 +67,13 @@ AI から使う場合は、`/spec-runner` のように「spec-runner を実行
59
67
  プレビュー起動(Python 3 必須・仮想環境 `.venv-docs/` を使用):
60
68
 
61
69
  ```bash
62
- ./.spec-runner/scripts/docs-serve.sh
70
+ 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
71
  ```
64
72
 
65
73
  `8000` が使用中のとき:
66
74
 
67
75
  ```bash
68
- DOCS_PORT=8001 ./.spec-runner/scripts/docs-serve.sh
76
+ 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
77
  ```
70
78
 
71
79
  ## 導入後にできるもの
@@ -76,14 +84,14 @@ DOCS_PORT=8001 ./.spec-runner/scripts/docs-serve.sh
76
84
  │ ├── spec-runner.sh # 入口(次のステップ --json)
77
85
  │ ├── project.json # 設定(ブランチ命名・必須ドキュメント・テストコマンド等)
78
86
  │ ├── phase-locks.json # フェーズの通過状態
79
- │ ├── grade-history.json # グレード(LOOP1 / A / B / C)
80
- │ ├── scripts/ # spec-runner-core.sh, check, branch, docs-serve.sh 等
87
+ │ ├── scripts/ # spec-runner-core.sh, check, branch
81
88
  │ ├── steps/ # 憲章・ドメイン設計・仕様策定・曖昧さ解消・テスト設計・実装 等の .md
82
89
  │ └── templates/ # UC 仕様書ひな形
83
90
  ├── .claude/commands/spec-runner.md # Claude 用コマンド定義(/spec-runner)
91
+ ├── .claude/skills/ # Skills テンプレート(不足分のみ自動配置)
84
92
  ├── mkdocs.yml # MkDocs(未有効時のみ配置)
85
93
  ├── requirements-docs.txt # mkdocs / mkdocs-material(未有効時のみ配置)
86
- ├── docs/ # 設計書(01..06)+ index.md 等。MkDocs の文書ルート
94
+ ├── docs/ # 設計書(01..06)+ work.md + index.md 等。MkDocs の文書ルート
87
95
  └── (AI は Claude Code 前提)
88
96
  ```
89
97
 
@@ -95,7 +103,7 @@ DOCS_PORT=8001 ./.spec-runner/scripts/docs-serve.sh
95
103
  - jq
96
104
  - git
97
105
  - bash 4.0+
98
- - 設計書の MkDocs プレビュー: Python 3(`docs-serve.sh` `python3` と venv を使用)
106
+ - 設計書の MkDocs プレビュー: Python 3(venv + mkdocs コマンドを直接実行)
99
107
 
100
108
  ---
101
109
 
@@ -18,12 +18,10 @@
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 を
25
24
  * 未有効時のみコピー(憲章・設計書は既存の docs/01..06 をそのまま閲覧)
26
- * - パッケージ同梱の docs/flow.md を docs/spec-runner-フロー.md としてコピー(未存在時のみ)
27
25
  */
28
26
 
29
27
  const fs = require("fs");
@@ -35,15 +33,13 @@ const TEMPLATE_SPEC_RUNNER_DIR = path.join(PKG_DIR, "templates", ".spec-runner")
35
33
  const DEST_DIR = path.join(CWD, ".spec-runner");
36
34
  const TEMPLATES_DIR = path.join(TEMPLATE_SPEC_RUNNER_DIR, "templates");
37
35
  const PHASE_LOCKS_TEMPLATE = path.join(TEMPLATES_DIR, "phase-locks.json");
38
- const GRADE_HISTORY_TEMPLATE = path.join(TEMPLATES_DIR, "grade-history.json");
39
36
  const MKDOCS_SCAFFOLD_DIR = path.join(PKG_DIR, "templates", "mkdocs-scaffold");
40
- const FLOW_DOC_SRC = path.join(PKG_DIR, "docs", "flow.md");
37
+ const SKILLS_TEMPLATE_DIR = path.join(PKG_DIR, "templates", "skills");
41
38
 
42
39
  /** コピー時はスキップし、FORCE 時は消さない(ユーザー状態を保持) */
43
40
  const USER_STATE_BASENAMES = new Set([
44
41
  "project.json",
45
42
  "phase-locks.json",
46
- "grade-history.json",
47
43
  ]);
48
44
 
49
45
  function log(msg) {
@@ -84,10 +80,6 @@ function ensureTemplateDirOrExit() {
84
80
  error("必須テンプレ templates/phase-locks.json が見つかりません。");
85
81
  process.exit(1);
86
82
  }
87
- if (!exists(GRADE_HISTORY_TEMPLATE)) {
88
- error("必須テンプレ templates/grade-history.json が見つかりません。");
89
- process.exit(1);
90
- }
91
83
  }
92
84
 
93
85
  function assertDestInstallableOrExit() {
@@ -154,18 +146,12 @@ function bootstrapProjectJson() {
154
146
  * フェーズ用 JSON は templates/.spec-runner/templates/*.json を正とする。
155
147
  * .spec-runner/ 直下に無いときだけコピー(既存のロックは上書きしない)。
156
148
  */
157
- function writeInitialLocksAndGrade() {
149
+ function writeInitialLocks() {
158
150
  const locksDest = path.join(DEST_DIR, "phase-locks.json");
159
151
  if (!exists(locksDest)) {
160
152
  fs.copyFileSync(PHASE_LOCKS_TEMPLATE, locksDest);
161
153
  ok(path.relative(CWD, locksDest));
162
154
  }
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
155
  }
170
156
 
171
157
  function installClaudeCommandIfPresent() {
@@ -177,6 +163,30 @@ function installClaudeCommandIfPresent() {
177
163
  ok(path.relative(CWD, claudeCmd));
178
164
  }
179
165
 
166
+ function installClaudeSkillsTemplatesIfPresent() {
167
+ if (!exists(SKILLS_TEMPLATE_DIR)) return;
168
+ const destRoot = path.join(CWD, ".claude", "skills");
169
+ info("Skills テンプレート(不足分のみ)を .claude/skills に配置します...");
170
+
171
+ function walk(srcDir, rel = "") {
172
+ for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
173
+ const srcPath = path.join(srcDir, entry.name);
174
+ const relPath = path.join(rel, entry.name);
175
+ const destPath = path.join(destRoot, relPath);
176
+ if (entry.isDirectory()) {
177
+ walk(srcPath, relPath);
178
+ } else {
179
+ if (exists(destPath)) continue;
180
+ fs.mkdirSync(path.dirname(destPath), { recursive: true });
181
+ fs.copyFileSync(srcPath, destPath);
182
+ ok(path.relative(CWD, destPath));
183
+ }
184
+ }
185
+ }
186
+
187
+ walk(SKILLS_TEMPLATE_DIR);
188
+ }
189
+
180
190
  /**
181
191
  * MkDocs + Material 用のファイルをプロジェクトルートに配置(未存在時のみ)。
182
192
  * 設計書本体は steps.json どおり docs/01..06 に置かれ、mkdocs の docs_dir でそのまま掲載する。
@@ -222,9 +232,6 @@ function installMkdocsScaffold() {
222
232
  path.join(MKDOCS_SCAFFOLD_DIR, "docs", "index.md"),
223
233
  path.join(CWD, "docs", "index.md"),
224
234
  );
225
- if (exists(FLOW_DOC_SRC)) {
226
- copyFileIfMissing(FLOW_DOC_SRC, path.join(CWD, "docs", "spec-runner-フロー.md"));
227
- }
228
235
  appendGitignoreVenvDocsIfNeeded();
229
236
  }
230
237
 
@@ -238,9 +245,6 @@ function printBanner() {
238
245
  }
239
246
 
240
247
  function printFooter() {
241
- log("");
242
- log("設計書プレビュー(MkDocs + Material・プロジェクトルートの docs/):");
243
- log(" ./.spec-runner/scripts/docs-serve.sh");
244
248
  log("");
245
249
  log("次のステップ(Claude Code 専用):");
246
250
  log(" /spec-runner を実行して");
@@ -257,8 +261,9 @@ function main() {
257
261
  wipeDestExceptUserState();
258
262
  expandTemplateTree();
259
263
  bootstrapProjectJson();
260
- writeInitialLocksAndGrade();
264
+ writeInitialLocks();
261
265
  installClaudeCommandIfPresent();
266
+ installClaudeSkillsTemplatesIfPresent();
262
267
  printFooter();
263
268
  }
264
269
 
package/docs/flow.md CHANGED
@@ -1,213 +1,71 @@
1
- # spec-runner の進め方(実装準拠)
1
+ # spec-runner フロー(シンプル版)
2
2
 
3
- このドキュメントは **リポジトリ内の実装**(`templates/.spec-runner/scripts/spec-runner-core.sh`、`steps/steps.json` 等)に沿って書いています。
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
- - **やること**: 出力の `command_file` を開き、その `.md` の指示どおりに作業する。
18
- - **毎回の検証**: `steps.json` の `common.commands.check` → 既定は `.spec-runner/scripts/check.sh`。
14
+ - `spec-runner` **薄いオーケストレータ**(次の一手を返す)
15
+ - 正本は `docs/work.md`
16
+ - 主線は 6 ステップ(実行フェーズは5本 + 憲章)、横断は 2 ステップ
17
+ - ブランチ運用やグレード判定は強制しない
19
18
 
20
- ### `--json` の主なフィールド(実装どおり)
19
+ ## 主線 6 ステップ
21
20
 
22
- | フィールド | 意味 |
23
- |------------|------|
24
- | `phase` | 数値(`steps.json` の各 step の `phase` と概ね対応) |
25
- | `phase_name_ja` | 表示用ラベル(コアが付与) |
26
- | `step_id` | `steps.json` `id`(例: `charter`, `uc_spec`, `clarify`) |
27
- | `command` | ステップの日本語名(`name_ja`) |
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
- `docs/` 配下の設計書は日本語で問題ありません。**Git 上はブランチ名・UC ファイルの slug は ASCII(kebab-case)推奨**です。
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
+ - lock が true でも、設計成果物(`docs/03` / `docs/04` の `.md`)が無い場合は該当設計フェーズに戻る
53
+ 5. 最新 UC がレビュー済みかつテスト準備済み
54
+ - `implement`
55
+ それ以外は `test_design`
56
+
57
+ ## 正本(Single Source)
58
+
59
+ - フロー定義: `.spec-runner/steps/steps.json`
60
+ - 進行状態: `.spec-runner/phase-locks.json`
61
+ - 作業正本: `docs/work.md`
62
+ - 仕様本文: `docs/01..06`, `docs/02_ユースケース仕様/**`
63
+ - 実装検証: `tests/**`, `test_command.run`
64
+
65
+ ## 運用ルール(最小)
66
+
67
+ 1. 実装前に `docs/work.md` の受入条件を埋める
68
+ 2. 作業中は `docs/work.md` のタスクを更新する
69
+ 3. コミット前に `docs/work.md` の `- [ ]` を確認する
70
+ 4. 完了時に `docs/work.md` の検証結果を更新する
71
+ 5. UC を十分に作ってレビュー完了したら `uc_discovery.completed` を `true` にする
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-runner",
3
- "version": "1.0.24",
3
+ "version": "1.1.2",
4
4
  "description": "フェーズ駆動で設計先行を強制。npx で .spec-runner を展開し、次のステップ .md に従って進める",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -19,7 +19,7 @@
19
19
  "test_design": {
20
20
  "dir": "tests",
21
21
  "pattern": "*.spec.*",
22
- "require_uc_prefixed_tests": true
22
+ "require_uc_prefixed_tests": false
23
23
  },
24
24
  "test_command": {
25
25
  "run": "npm test"
@@ -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
- if [[ ! -f ".spec-runner/grade-history.json" ]]; then
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 が存在しません")