spec-runner 1.0.9 → 1.0.11
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/package.json +1 -1
- package/templates/.spec-runner/scripts/spec-runner-core.sh +72 -4
- 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 +1 -1
- package/templates/.spec-runner/steps//344/273/225/346/247/230/347/255/226/345/256/232.md +2 -2
- package/templates/.spec-runner/steps//345/210/206/346/236/220.md +1 -0
- package/templates/.spec-runner/steps//346/233/226/346/230/247/343/201/225/350/247/243/346/266/210.md +21 -10
- package/templates/.spec-runner/templates/phase-locks.json +16 -1
package/package.json
CHANGED
|
@@ -267,6 +267,27 @@ run_phase() {
|
|
|
267
267
|
check_command=""
|
|
268
268
|
feature_dir=""
|
|
269
269
|
feature_spec=""
|
|
270
|
+
charter_doc="$(get_steps_common_doc "charter")"
|
|
271
|
+
domain_root="$(get_steps_common_doc "domain_root")"
|
|
272
|
+
architecture_root="$(get_steps_common_doc "architecture_root")"
|
|
273
|
+
|
|
274
|
+
first_md_in_dir() {
|
|
275
|
+
local d="$1"
|
|
276
|
+
[[ -d "$d" ]] || return 1
|
|
277
|
+
find "$d" -type f -name "*.md" 2>/dev/null | sort | head -1
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
doc_key() {
|
|
281
|
+
local f="$1"
|
|
282
|
+
basename "$f" .md
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
quality_done() {
|
|
286
|
+
local kind="$1" # clarified | analyzed
|
|
287
|
+
local scope="$2" # charter | domain | architecture | uc
|
|
288
|
+
local key="$3"
|
|
289
|
+
jq -e --arg k "$key" --arg s "$scope" ".quality.${kind}[\$s][]? == \$k" "$LOCK_FILE" >/dev/null 2>&1
|
|
290
|
+
}
|
|
270
291
|
|
|
271
292
|
resolve_step() {
|
|
272
293
|
local sid="$1"
|
|
@@ -293,11 +314,52 @@ run_phase() {
|
|
|
293
314
|
uc_count_total=${uc_count_total:-0}
|
|
294
315
|
|
|
295
316
|
if [[ $has_charter_lock -eq 0 ]]; then
|
|
296
|
-
|
|
317
|
+
if [[ -f "$charter_doc" ]]; then
|
|
318
|
+
ckey="$(doc_key "$charter_doc")"
|
|
319
|
+
feature_spec="$charter_doc"
|
|
320
|
+
feature_dir="$(dirname "$charter_doc")"
|
|
321
|
+
if ! quality_done "clarified" "charter" "$ckey"; then
|
|
322
|
+
phase=0; phase_name_ja="憲章(曖昧さ解消)"; resolve_step "clarify"
|
|
323
|
+
elif ! quality_done "analyzed" "charter" "$ckey"; then
|
|
324
|
+
phase=0; phase_name_ja="憲章(分析)"; resolve_step "analyze"
|
|
325
|
+
else
|
|
326
|
+
phase=0; phase_name_ja="憲章策定"; resolve_step "charter"
|
|
327
|
+
fi
|
|
328
|
+
else
|
|
329
|
+
phase=0; phase_name_ja="憲章策定"; resolve_step "charter"
|
|
330
|
+
fi
|
|
297
331
|
elif [[ $has_domain_lock -eq 0 && ${uc_count_total} -gt 0 && $on_uc_branch -eq 0 ]]; then
|
|
298
|
-
|
|
332
|
+
domain_spec="$(first_md_in_dir "$domain_root" || true)"
|
|
333
|
+
if [[ -n "$domain_spec" ]]; then
|
|
334
|
+
feature_spec="$domain_spec"
|
|
335
|
+
feature_dir="$(dirname "$domain_spec")"
|
|
336
|
+
dkey="$(doc_key "$domain_spec")"
|
|
337
|
+
if ! quality_done "clarified" "domain" "$dkey"; then
|
|
338
|
+
phase=2; phase_name_ja="ドメイン設計(曖昧さ解消)"; resolve_step "clarify"
|
|
339
|
+
elif ! quality_done "analyzed" "domain" "$dkey"; then
|
|
340
|
+
phase=2; phase_name_ja="ドメイン設計(分析)"; resolve_step "analyze"
|
|
341
|
+
else
|
|
342
|
+
phase=2; phase_name_ja="ドメイン設計"; resolve_step "domain"
|
|
343
|
+
fi
|
|
344
|
+
else
|
|
345
|
+
phase=2; phase_name_ja="ドメイン設計"; resolve_step "domain"
|
|
346
|
+
fi
|
|
299
347
|
elif [[ $has_arch_lock -eq 0 && $has_domain_lock -eq 1 ]]; then
|
|
300
|
-
|
|
348
|
+
arch_spec="$(first_md_in_dir "$architecture_root" || true)"
|
|
349
|
+
if [[ -n "$arch_spec" ]]; then
|
|
350
|
+
feature_spec="$arch_spec"
|
|
351
|
+
feature_dir="$(dirname "$arch_spec")"
|
|
352
|
+
akey="$(doc_key "$arch_spec")"
|
|
353
|
+
if ! quality_done "clarified" "architecture" "$akey"; then
|
|
354
|
+
phase=3; phase_name_ja="アーキテクチャ選択(曖昧さ解消)"; resolve_step "clarify"
|
|
355
|
+
elif ! quality_done "analyzed" "architecture" "$akey"; then
|
|
356
|
+
phase=3; phase_name_ja="アーキテクチャ選択(分析)"; resolve_step "analyze"
|
|
357
|
+
else
|
|
358
|
+
phase=3; phase_name_ja="アーキテクチャ選択"; resolve_step "architecture_plan"
|
|
359
|
+
fi
|
|
360
|
+
else
|
|
361
|
+
phase=3; phase_name_ja="アーキテクチャ選択"; resolve_step "architecture_plan"
|
|
362
|
+
fi
|
|
301
363
|
elif [[ $on_uc_branch -eq 1 ]]; then
|
|
302
364
|
uc_spec=""
|
|
303
365
|
if [[ -n "$current_uc_id" ]]; then
|
|
@@ -312,7 +374,13 @@ run_phase() {
|
|
|
312
374
|
reviewed=0
|
|
313
375
|
jq -e --arg u "$uc_dir" '.uc_reviewed[]? == $u' "$LOCK_FILE" 2>/dev/null | grep -q true && reviewed=1
|
|
314
376
|
if [[ $reviewed -eq 0 ]]; then
|
|
315
|
-
|
|
377
|
+
if ! quality_done "clarified" "uc" "$uc_dir"; then
|
|
378
|
+
phase=1; phase_name_ja="ユースケース仕様(曖昧さ解消)"; resolve_step "clarify"
|
|
379
|
+
elif ! quality_done "analyzed" "uc" "$uc_dir"; then
|
|
380
|
+
phase=1; phase_name_ja="ユースケース仕様(分析)"; resolve_step "analyze"
|
|
381
|
+
else
|
|
382
|
+
phase=1; phase_name_ja="ユースケース仕様(レビュー通過まで)"; resolve_step "clarify"
|
|
383
|
+
fi
|
|
316
384
|
else
|
|
317
385
|
if [[ "$grade" == "A" ]] && [[ $has_infra_lock -eq 0 ]]; then
|
|
318
386
|
phase=4; phase_name_ja="インフラ詳細設計"; resolve_step "infra_plan"
|
|
@@ -6,13 +6,13 @@ primary_output: docs/02_ユースケース仕様/<カテゴリ>/UC-N-xxx.md
|
|
|
6
6
|
|
|
7
7
|
# ユースケース仕様(UC 仕様書)
|
|
8
8
|
|
|
9
|
-
**やること**: 機能説明(`$ARGUMENTS`)から UC ブランチと UC 仕様書を作成し、テンプレに沿って埋める。その後 clarify → analyze
|
|
9
|
+
**やること**: 機能説明(`$ARGUMENTS`)から UC ブランチと UC 仕様書を作成し、テンプレに沿って埋める。その後 quality フロー(clarify → analyze)を回し、必要に応じて checklist を実施して review-pass へ進む。
|
|
10
10
|
|
|
11
11
|
| 項目 | 内容 |
|
|
12
12
|
|------|------|
|
|
13
13
|
| **成果物** | `docs/02_ユースケース仕様/<カテゴリ>/UC-N-xxx.md`(1 UC = 1 本) |
|
|
14
14
|
| **main** | **必ず UC 用ブランチを作成してから**仕様を書く。main で直接編集しない |
|
|
15
|
-
| **品質フロー** | clarify → analyze
|
|
15
|
+
| **品質フロー** | `phase-locks.json` の `quality` を使って **clarify → analyze** を自動進行。必要なら checklist を追加で実施 |
|
|
16
16
|
| **判断ログ(任意)** | `docs/02_.../<カテゴリ>/判断記録/UC-N-MMDD-題名.md`。テンプレ: `.spec-runner/templates/UC-N-MMDD-判断記録テンプレ.md` |
|
|
17
17
|
|
|
18
18
|
## ユーザー入力
|
|
@@ -88,6 +88,7 @@ $ARGUMENTS
|
|
|
88
88
|
- CRITICAL あり → 「実装」の前に解消推奨
|
|
89
89
|
- LOW/MEDIUM のみ → 改善案のうえ進行可
|
|
90
90
|
- 次コマンドを明示(仕様修正・実装方針追記・実装計画調整等)
|
|
91
|
+
- 完了時に `.spec-runner/phase-locks.json` の `quality.analyzed.<scope>` に対象ドキュメントのベース名を追加する(scope: `charter` / `domain` / `architecture` / `uc`)
|
|
91
92
|
|
|
92
93
|
### 8. 修正案オファー
|
|
93
94
|
|
package/templates/.spec-runner/steps//346/233/226/346/230/247/343/201/225/350/247/243/346/266/210.md
CHANGED
|
@@ -6,12 +6,12 @@ note: 任意フェーズで曖昧さを解消
|
|
|
6
6
|
|
|
7
7
|
# 曖昧さ解消(品質フロー)
|
|
8
8
|
|
|
9
|
-
**やること**:
|
|
9
|
+
**やること**: 任意フェーズで対象仕様(憲章 / UC 仕様 / ドメイン設計 / アーキテクチャ)の曖昧さ・不足決定を検出し、**対話で 1 問ずつ**解消して仕様ファイルに反映する。
|
|
10
10
|
|
|
11
11
|
| 項目 | 内容 |
|
|
12
12
|
|------|------|
|
|
13
13
|
| **タイミング** | 任意フェーズで実行可能。必要に応じて複数回実行してよい |
|
|
14
|
-
| **仕様パス** | `FEATURE_SPEC`
|
|
14
|
+
| **仕様パス** | `FEATURE_SPEC`(憲章: `docs/01_憲章/憲章.md`、UC: `docs/02_ユースケース仕様/.../UC-N-xxx.md`、ドメイン: `docs/03_ドメイン設計/*.md`、アーキ: `docs/04_アーキテクチャ/*.md`) |
|
|
15
15
|
| **判断ログ(任意)** | `FEATURE_DIR/判断記録/UC-N-MMDD-題名.md`。テンプレ: `.spec-runner/templates/UC-N-MMDD-判断記録テンプレ.md`。横断は `docs/04_アーキテクチャ/設計判断記録/` |
|
|
16
16
|
|
|
17
17
|
## ユーザー入力
|
|
@@ -25,8 +25,11 @@ $ARGUMENTS
|
|
|
25
25
|
## 実行フロー
|
|
26
26
|
|
|
27
27
|
1. **JSON**
|
|
28
|
-
`.spec-runner/spec-runner.sh 次のステップ --json` を **1 回**。`
|
|
29
|
-
|
|
28
|
+
`.spec-runner/spec-runner.sh 次のステップ --json` を **1 回**。`FEATURE_SPEC`・`FEATURE_DIR` を使用。
|
|
29
|
+
- UC 仕様を対象とする場合: 実装方針・タスクは **UC .md の一番下**。
|
|
30
|
+
- 憲章を対象とする場合: 憲章本文の原則・定義・用語を対象にする。
|
|
31
|
+
- ドメイン/アーキを対象とする場合: 現在の `FEATURE_SPEC`(対象 `.md`)の曖昧さを解消する。
|
|
32
|
+
JSON パース失敗 → 中止。`FEATURE_SPEC` が空なら対象仕様が未作成なので先に作成を案内。
|
|
30
33
|
シングルクォートはエスケープ(例: `'I'\''m Groot'`)。
|
|
31
34
|
|
|
32
35
|
2. **スキャン**
|
|
@@ -51,13 +54,17 @@ $ARGUMENTS
|
|
|
51
54
|
|
|
52
55
|
5. **回答ごとの反映(増分)**
|
|
53
56
|
- メモリとファイル内容を保持
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
|
|
57
|
+
- **本文更新を必須**: 採用回答を必ず該当セクションへ反映(機能→機能要件、操作→ストーリー/アクター、データ→データモデル、非機能→測定可能な基準、エッジ→エッジケース、用語→統一・旧表記は一度だけ (旧: "X"))
|
|
58
|
+
- `## 解消事項` は任意。必要な場合のみ最小限を残す(本文の代替にしない)
|
|
59
|
+
- 記録する場合は次の改行形式:
|
|
60
|
+
```markdown
|
|
61
|
+
- Q: <質問>
|
|
62
|
+
A: <回答>
|
|
63
|
+
```
|
|
64
|
+
- 古い曖昧記述は置換し矛盾を残さない。**各反映の直後にファイル保存**。見出し階層維持。新規見出しは **`## 解消事項`** のみ可
|
|
58
65
|
|
|
59
66
|
6. **検証(各書き込み後・最終)**
|
|
60
|
-
-
|
|
67
|
+
- 本文に解消済み内容が反映され、本文だけ読めば仕様が確定している
|
|
61
68
|
- 質問数(採用分)≤ 5
|
|
62
69
|
- 更新セクションに解消済みの曖昧プレースホルダが残っていない
|
|
63
70
|
- 矛盾なし、Markdown 有効、用語一貫
|
|
@@ -71,7 +78,11 @@ $ARGUMENTS
|
|
|
71
78
|
## 動作ルール
|
|
72
79
|
|
|
73
80
|
- 意味のある曖昧がない: 「正式な解消に値する重要な曖昧さは検出されませんでした」と次へ
|
|
74
|
-
- 仕様ファイルがない:
|
|
81
|
+
- 仕様ファイルがない: 対象仕様(憲章 / UC / ドメイン / アーキ)の作成を案内(ここでは新規作成しない)
|
|
82
|
+
- `[要確認: ...]` が残っている項目を優先して質問対象にする
|
|
83
|
+
- `[要確認: ...]` が無くても、文脈から曖昧・未決定な表現を検出して質問対象に含める
|
|
84
|
+
- 実行状態は `.spec-runner/phase-locks.json` の `quality.clarified.<scope>` で管理し、本文に余計な状態メタ情報は残さない
|
|
85
|
+
- `## 解消事項` を残す場合も最小限にし、判断の正本は常に本文とする
|
|
75
86
|
- 質問は合計 5 を超えない(聞き直しは新規に数えない)
|
|
76
87
|
- 機能の明確さを妨げない限り技術スタックの推測質問は避ける
|
|
77
88
|
- 「ストップ」「完了」「進めて」等を尊重
|
|
@@ -25,5 +25,20 @@
|
|
|
25
25
|
"locked_at": null,
|
|
26
26
|
"reviewed_by": null
|
|
27
27
|
},
|
|
28
|
-
"uc_reviewed": []
|
|
28
|
+
"uc_reviewed": [],
|
|
29
|
+
"quality": {
|
|
30
|
+
"_comment": "clarify/analyze の実行済み管理(対象ドキュメントのベース名)",
|
|
31
|
+
"clarified": {
|
|
32
|
+
"charter": [],
|
|
33
|
+
"domain": [],
|
|
34
|
+
"architecture": [],
|
|
35
|
+
"uc": []
|
|
36
|
+
},
|
|
37
|
+
"analyzed": {
|
|
38
|
+
"charter": [],
|
|
39
|
+
"domain": [],
|
|
40
|
+
"architecture": [],
|
|
41
|
+
"uc": []
|
|
42
|
+
}
|
|
43
|
+
}
|
|
29
44
|
}
|