spec-runner 1.0.23 → 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.
Files changed (31) hide show
  1. package/README.md +15 -6
  2. package/bin/spec-runner.js +28 -18
  3. package/docs/flow.md +58 -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 +129 -348
  8. package/templates/.spec-runner/scripts/{branch/uc-next-start.sh → uc-next-start.sh} +24 -66
  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 -13
  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 +2 -2
  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/docs-serve.sh +0 -21
  27. package/templates/.spec-runner/scripts/test/require-tests-green.sh +0 -27
  28. package/templates/.spec-runner/steps//343/201/235/343/201/256/344/273/226/344/275/234/346/245/255.md +0 -34
  29. package/templates/.spec-runner/steps//343/202/277/343/202/271/343/202/257/344/270/200/350/246/247.md +0 -95
  30. 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
  31. package/templates/.spec-runner/templates/grade-history.json +0 -5
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # 次の UC を開始する: main に切り替え、feature/UC-N-xxx ブランチを作成する。
2
+ # 次の UC 仕様のひな形を作成する(Git ブランチの作成・切替は行わない)。
3
3
  # 使用例:
4
4
  # ./uc-next-start.sh "task-management" "タスク管理機能追加" "タスク管理"
5
5
  # ./uc-next-start.sh UC-2 "order-cancel" "注文キャンセル" "注文"
@@ -7,16 +7,19 @@
7
7
  # 引数仕様(位置引数):
8
8
  # [UC-ID] [SLUG] [TITLE] [CATEGORY]
9
9
  # - UC-ID: 省略可(例: UC-2)
10
- # - SLUG: 必須。ブランチ用の短名(ASCII, kebab-case 推奨)
10
+ # - SLUG: 必須。識別用の短名(ASCII, kebab-case 推奨。ファイル名には使わず参考・一貫性のため)
11
11
  # - TITLE: 必須。UC ファイル題名(日本語推奨)
12
12
  # - CATEGORY: 必須。docs/02_ユースケース仕様/ 配下のカテゴリ名(日本語可)
13
13
  # 重要: 空欄の引数は禁止。SLUG/TITLE/CATEGORY は必ず指定する
14
- # 実行後は次のステップに進む旨を案内する。
15
14
 
16
15
  set -e
17
16
  REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || echo ".")}"
18
17
  cd "$REPO_ROOT"
19
- BRANCH_DIR="$(cd "$(dirname "$0")" && pwd)"
18
+
19
+ git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
20
+ echo "Error: Git リポジトリ内で実行してください。" >&2
21
+ exit 1
22
+ }
20
23
 
21
24
  YES_MODE=false
22
25
  ARGS=()
@@ -24,7 +27,6 @@ for a in "$@"; do
24
27
  case "$a" in
25
28
  --yes|-y) YES_MODE=true ;;
26
29
  *)
27
- # 空引数は禁止
28
30
  if [[ -z "$a" ]]; then
29
31
  echo "Error: 空文字の引数は使用できません。UC-ID を省略する場合は引数自体を渡さないでください。" >&2
30
32
  exit 1
@@ -38,14 +40,12 @@ PROJECT_JSON="$REPO_ROOT/.spec-runner/project.json"
38
40
  [[ -f "$PROJECT_JSON" ]] || { echo "uc-next-start: project.json がありません: $PROJECT_JSON" >&2; exit 1; }
39
41
  command -v jq >/dev/null 2>&1 || { echo "uc-next-start: jq が必要です(brew install jq)" >&2; exit 1; }
40
42
  UC_ID_RE="$(jq -r '.naming.uc_id_pattern' "$PROJECT_JSON")"
41
- BRANCH_PREFIX="$(jq -r '.naming.branch_prefix' "$PROJECT_JSON")"
42
- [[ -n "$UC_ID_RE" && "$UC_ID_RE" != "null" && -n "$BRANCH_PREFIX" && "$BRANCH_PREFIX" != "null" ]] || {
43
- echo "uc-next-start: project.json の naming.uc_id_pattern / branch_prefix が未設定です" >&2
43
+ [[ -n "$UC_ID_RE" && "$UC_ID_RE" != "null" ]] || {
44
+ echo "uc-next-start: project.json naming.uc_id_pattern が未設定です" >&2
44
45
  exit 1
45
46
  }
46
47
 
47
48
  next_uc_id() {
48
- # docs/02_ユースケース仕様/<カテゴリ>/UC-*.md から次に使う UC-N を返す
49
49
  local dir="$REPO_ROOT/docs/02_ユースケース仕様"
50
50
  mkdir -p "$dir"
51
51
  local max=0
@@ -69,7 +69,7 @@ TITLE=""
69
69
  CATEGORY=""
70
70
  if [[ ${#ARGS[@]} -ge 1 ]] && [[ "${ARGS[0]}" =~ ^${UC_ID_RE}$ ]]; then
71
71
  [[ ${#ARGS[@]} -eq 4 ]] || {
72
- echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
72
+ echo "Usage: .spec-runner/scripts/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
73
73
  echo " - UC-ID を指定した場合は SLUG/TITLE/CATEGORY の3引数が必須です" >&2
74
74
  exit 1
75
75
  }
@@ -79,7 +79,7 @@ if [[ ${#ARGS[@]} -ge 1 ]] && [[ "${ARGS[0]}" =~ ^${UC_ID_RE}$ ]]; then
79
79
  CATEGORY="${ARGS[3]}"
80
80
  else
81
81
  [[ ${#ARGS[@]} -eq 3 ]] || {
82
- echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
82
+ echo "Usage: .spec-runner/scripts/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
83
83
  echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
84
84
  exit 1
85
85
  }
@@ -88,68 +88,48 @@ else
88
88
  CATEGORY="${ARGS[2]}"
89
89
  fi
90
90
 
91
- # SLUG / TITLE / CATEGORY は必須(UC-ID のみ任意)
92
91
  if [[ -z "$SLUG" || -z "$TITLE" || -z "$CATEGORY" ]]; then
93
- echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
92
+ echo "Usage: .spec-runner/scripts/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
94
93
  echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
95
94
  exit 1
96
95
  fi
97
96
 
98
- # SLUG は英小文字・ハイフン(Git ブランチ名は ASCII のみ)
99
- # macOS(BSD sed) でも動くように、連続ハイフンは 's/--*/-/g' で圧縮する
100
97
  SLUG=$(echo "$SLUG" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-*//' | sed 's/-*$//')
101
98
  if [[ -z "$SLUG" ]]; then
102
99
  echo "Error: SLUG は英数字・ハイフンへ正規化可能な値を指定してください(例: task-management)。" >&2
103
100
  exit 1
104
101
  fi
105
- BRANCH_NAME="${BRANCH_PREFIX}/${NEXT_UC}-${SLUG}"
106
102
 
107
- # UC ファイル題名
108
103
  DOC_TITLE="$TITLE"
109
- # ファイル名に危険な文字が入らないように除去(日本語は許可)
110
104
  DOC_TITLE=$(echo "$DOC_TITLE" | sed 's/[\\\\\\/\\:\\*\\?\\\"\\<\\>\\|]/ /g' | sed 's/[[:space:]]\\+/ /g' | sed 's/^ *//; s/ *$//')
111
105
  if [[ -z "$DOC_TITLE" ]]; then
112
106
  echo "Error: TITLE が不正です(危険文字除去後に空になりました)。" >&2
113
107
  exit 1
114
108
  fi
115
109
 
116
- # カテゴリは必須。日本語カテゴリは許可し、危険文字だけ除去。
117
- # 文字レンジ指定は sed 実装差で壊れやすいため、危険文字のみを除去する。
118
110
  CATEGORY=$(echo "$CATEGORY" | sed 's/[\\\/:\*\?"<>|]//g' | sed 's/[[:cntrl:]]//g' | sed 's/[[:space:]]\+/ /g' | sed 's/^ *//; s/ *$//')
119
111
  if [[ -z "$CATEGORY" ]]; then
120
112
  echo "Error: CATEGORY は空にできません。" >&2
121
113
  exit 1
122
114
  fi
123
115
 
124
- if git rev-parse --verify "$BRANCH_NAME" >/dev/null 2>&1; then
125
- echo "Error: ブランチ '$BRANCH_NAME' は既に存在します。" >&2
116
+ FEATURE_DIR="docs/02_ユースケース仕様/${CATEGORY}"
117
+ UC_DOC="${FEATURE_DIR}/${NEXT_UC}-${DOC_TITLE}.md"
118
+
119
+ if [[ -f "$UC_DOC" ]]; then
120
+ echo "Error: 既に存在します: $UC_DOC" >&2
126
121
  exit 1
127
122
  fi
128
123
 
129
- CURRENT=$(git branch --show-current 2>/dev/null || echo "")
130
- MAIN_BRANCH=""
131
-
132
- # 1) origin/HEAD からデフォルトブランチを取得
133
- if git symbolic-ref -q --short refs/remotes/origin/HEAD >/dev/null 2>&1; then
134
- MAIN_BRANCH="$(git symbolic-ref -q --short refs/remotes/origin/HEAD | sed 's#^origin/##')"
135
- fi
136
- # 2) main / master をフォールバック
137
- if [[ -z "$MAIN_BRANCH" ]]; then
138
- if git rev-parse --verify "main" >/dev/null 2>&1; then
139
- MAIN_BRANCH="main"
140
- elif git rev-parse --verify "master" >/dev/null 2>&1; then
141
- MAIN_BRANCH="master"
142
- fi
143
- fi
144
- # 3) どれも無ければ現在ブランチ(初期ブランチ名が trunk/develop 等のケース)
145
- if [[ -z "$MAIN_BRANCH" ]]; then
146
- MAIN_BRANCH="${CURRENT:-}"
124
+ UC_ID_PATTERN="^${UC_ID_RE}$"
125
+ if ! echo "$NEXT_UC" | grep -qE "$UC_ID_PATTERN"; then
126
+ echo "Error: UC-ID が命名規則に合いません: $NEXT_UC(期待: $UC_ID_PATTERN)" >&2
127
+ exit 1
147
128
  fi
148
- [[ -n "$MAIN_BRANCH" ]] || { echo "Error: ベースブランチを特定できません(main/master/current が見つかりません)。" >&2; exit 1; }
149
129
 
150
130
  if [[ "$YES_MODE" != true ]]; then
151
- echo "次の UC を開始する準備をします。"
152
- echo " $MAIN_BRANCH にチェックアウトし、ブランチ \"$BRANCH_NAME\" を作成します。"
131
+ echo "次の UC 仕様のひな形を作成します(ブランチは作成しません)。"
132
+ echo " $UC_DOC"
153
133
  echo -n " 実行してよろしいですか? [y/N]: "
154
134
  read -r ans
155
135
  case "$ans" in
@@ -158,30 +138,8 @@ if [[ "$YES_MODE" != true ]]; then
158
138
  esac
159
139
  fi
160
140
 
161
- git checkout "$MAIN_BRANCH"
162
- git pull --ff-only 2>/dev/null || true
163
-
164
- # ブランチ作成 + UC 仕様書作成(統合)
165
- UC_ID_PATTERN="^${UC_ID_RE}$"
166
- if ! echo "$NEXT_UC" | grep -qE "$UC_ID_PATTERN"; then
167
- echo "Error: UC-ID が命名規則に合いません: $NEXT_UC(期待: $UC_ID_PATTERN)" >&2
168
- exit 1
169
- fi
170
- valid_uc_pattern="^${BRANCH_PREFIX}/${UC_ID_RE}-[a-z0-9-]+\$"
171
- if ! echo "$BRANCH_NAME" | grep -qE "$valid_uc_pattern"; then
172
- echo "Error: ブランチ名が命名規則に合いません: $BRANCH_NAME(期待: ${BRANCH_PREFIX}/<UC-ID>-kebab-description)" >&2
173
- exit 1
174
- fi
175
-
176
- git checkout -b "$BRANCH_NAME"
177
- echo "Created branch: $BRANCH_NAME"
178
-
179
- FEATURE_DIR="docs/02_ユースケース仕様/${CATEGORY}"
180
- UC_DOC="${FEATURE_DIR}/${NEXT_UC}-${DOC_TITLE}.md"
181
141
  mkdir -p "$FEATURE_DIR"
182
- # UC ごとの判断ログ置き場(任意だが、作成しておくと運用が安定する)
183
142
  mkdir -p "${FEATURE_DIR}/判断記録"
184
- # テンプレ: 修正・改善は .spec-runner/templates/UC-N-ユースケース名.md を編集。プレースホルダ UC-N → UC番号, {ユースケース名} → 題名
185
143
  TEMPLATE="$REPO_ROOT/.spec-runner/templates/UC-N-ユースケース名.md"
186
144
  if [[ -f "$TEMPLATE" ]]; then
187
145
  sed "s/UC-N/${NEXT_UC}/g; s/{ユースケース名}/${DOC_TITLE}/g" "$TEMPLATE" > "$UC_DOC"
@@ -193,4 +151,4 @@ else
193
151
  fi
194
152
 
195
153
  echo ""
196
- echo "次の UC 用ブランチの準備ができました。次のステップに進んでください。"
154
+ echo "UC 仕様の準備ができました(現在のブランチは変更していません)。次のステップに進んでください。"
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  # spec-runner エントリポイント。次のステップ(現在フェーズ・やるべきステップ .md)を返す。
3
- # 使用: .spec-runner/spec-runner.sh [次のステップ] [--json|--lock|--グレード]
3
+ # 使用: .spec-runner/spec-runner.sh [次のステップ] [--json|--lock]
4
4
 
5
5
  set -e
6
6
  REPO_ROOT="${REPO_ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
@@ -18,12 +18,11 @@ case "$cmd" in
18
18
  fi
19
19
  case "${1:-}" in
20
20
  --lock) exec "$SR/spec-runner-core.sh" --status ;;
21
- --グレード) exec "$SR/spec-runner-core.sh" --grade ;;
22
21
  *) exec "$SR/spec-runner-core.sh" --phase "$@" ;;
23
22
  esac
24
23
  ;;
25
24
  *)
26
- echo "spec-runner: 引数なし、または「次のステップ」[--json|--lock|--グレード] のみ対応しています。" >&2
25
+ echo "spec-runner: 引数なし、または「次のステップ」[--json|--lock] のみ対応しています。" >&2
27
26
  echo " 使用例: .spec-runner/spec-runner.sh 次のステップ --json" >&2
28
27
  exit 1
29
28
  ;;
@@ -1,9 +1,10 @@
1
1
  {
2
- "version": 1,
3
- "note": "steps/*.md の『宣言(機械可読)』。md は実行テンプレ、こちらはルールと入出力の参照用。",
2
+ "version": 2,
3
+ "note": "薄いオーケストレータ向け steps 定義。主線6本(実行フェーズ5本 + 憲章)+ 横断2本(clarify/analyze)。",
4
4
  "common": {
5
5
  "docs": {
6
6
  "root": "docs",
7
+ "work_card": "docs/work.md",
7
8
  "charter": "docs/01_憲章/憲章.md",
8
9
  "uc_root": "docs/02_ユースケース仕様",
9
10
  "domain_root": "docs/03_ドメイン設計",
@@ -14,25 +15,7 @@
14
15
  },
15
16
  "commands": {
16
17
  "check": ".spec-runner/scripts/check.sh",
17
- "start_next_uc": ".spec-runner/scripts/branch/uc-next-start.sh"
18
- },
19
- "naming": {
20
- "uc_id_regex": "^UC-[0-9]+$",
21
- "uc_branch_regex": "^(?<prefix>[^/]+)/(?<uc>UC-[0-9]+)-(?<slug>[a-z0-9-]+)$",
22
- "uc_spec_regex": "^UC-[0-9]+-.+\\.md$",
23
- "decision_log_dir_name": "判断記録",
24
- "decision_log_filename_pattern": "UC-N-MMDD-題名.md",
25
- "decision_log_example": "UC-1-0317-要件解釈.md"
26
- },
27
- "clarification_policy": {
28
- "marker_format": "[要確認: ...]",
29
- "rule": "不明点は推測で確定せず、仕様/設計書内に [要確認: ...] として残す。",
30
- "interactive_questions_max": 3,
31
- "excess_handling": "質問として提示するのは最大3件。残りは『追加の要確認』として文書内に残す。"
32
- },
33
- "uc_to_domain_to_arch_flow": {
34
- "order": ["charter", "uc_spec", "domain", "architecture"],
35
- "note": "憲章の次は UC→ドメイン→アーキ。UC を入力にドメインを固め、ドメインを入力にアーキを固める。"
18
+ "start_next_uc": ".spec-runner/scripts/uc-next-start.sh"
36
19
  }
37
20
  },
38
21
  "steps": [
@@ -41,11 +24,8 @@
41
24
  "name_ja": "憲章",
42
25
  "phase": 0,
43
26
  "md_file": "憲章.md",
44
- "commands": [
45
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
46
- ],
47
- "primary_outputs": ["docs/01_憲章/憲章.md"],
48
- "notes": ["存在しない場合は .spec-runner/templates/憲章.md から生成する"]
27
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
28
+ "primary_outputs": ["docs/01_憲章/憲章.md", "docs/work.md"]
49
29
  },
50
30
  {
51
31
  "id": "uc_spec",
@@ -53,119 +33,64 @@
53
33
  "phase": 1,
54
34
  "md_file": "仕様策定.md",
55
35
  "commands": [
56
- { "id": "start_uc_branch", "command": ".spec-runner/scripts/branch/uc-next-start.sh" },
36
+ { "id": "start_uc_spec_scaffold", "command": ".spec-runner/scripts/uc-next-start.sh" },
57
37
  { "id": "check", "command": ".spec-runner/scripts/check.sh" }
58
38
  ],
59
- "primary_outputs": ["docs/02_ユースケース仕様/<カテゴリ>/UC-<N>-<題名>.md"],
60
- "secondary_outputs_optional": ["docs/02_ユースケース仕様/<カテゴリ>/判断記録/UC-N-MMDD-題名.md"]
39
+ "primary_outputs": ["docs/02_ユースケース仕様/<カテゴリ>/UC-<N>-<題名>.md", "docs/work.md"]
61
40
  },
62
41
  {
63
42
  "id": "domain",
64
43
  "name_ja": "ドメイン設計",
65
44
  "phase": 2,
66
45
  "md_file": "ドメイン設計.md",
67
- "commands": [
68
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
69
- ],
46
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
70
47
  "primary_outputs": [
71
48
  "docs/03_ドメイン設計/ユビキタス言語辞書.md",
72
49
  "docs/03_ドメイン設計/ドメインモデル.md",
73
- "docs/03_ドメイン設計/集約.md"
74
- ],
75
- "notes": ["存在しない場合は .spec-runner/templates/ から生成する"]
50
+ "docs/03_ドメイン設計/集約.md",
51
+ "docs/work.md"
52
+ ]
76
53
  },
77
54
  {
78
55
  "id": "architecture_plan",
79
56
  "name_ja": "実装計画",
80
57
  "phase": 3,
81
58
  "md_file": "実装計画.md",
82
- "commands": [
83
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
84
- ],
85
- "primary_outputs": ["docs/04_アーキテクチャ/*"],
59
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
60
+ "primary_outputs": ["docs/04_アーキテクチャ/*", "docs/work.md"],
86
61
  "secondary_outputs_optional": ["docs/06_API仕様/openapi.yaml"]
87
62
  },
88
- {
89
- "id": "infra_plan",
90
- "name_ja": "インフラ詳細設計(Grade A)",
91
- "phase": 4,
92
- "md_file": "実装計画.md",
93
- "commands": [
94
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
95
- ],
96
- "primary_outputs": ["docs/05_インフラ設計/schema.dbml"]
97
- },
98
63
  {
99
64
  "id": "test_design",
100
65
  "name_ja": "テスト設計",
101
66
  "phase": 5,
102
67
  "md_file": "テスト設計.md",
103
- "commands": [
104
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
105
- ],
106
- "primary_outputs": ["<test_design.dir>/**/UC-N-*.spec.*"]
68
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
69
+ "primary_outputs": ["<test_design.dir>/**/*.spec.*", "docs/work.md"]
107
70
  },
108
71
  {
109
72
  "id": "implement",
110
73
  "name_ja": "実装",
111
74
  "phase": 6,
112
75
  "md_file": "実装.md",
113
- "commands": [
114
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
115
- ],
116
- "primary_outputs": ["src/**", "<tests green>"],
117
- "notes": ["完了条件: require-tests-green.sh が exit 0"]
76
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
77
+ "primary_outputs": ["src/**", "<tests green>", "docs/work.md"]
118
78
  },
119
79
  {
120
80
  "id": "clarify",
121
81
  "name_ja": "曖昧さ解消",
122
82
  "phase": null,
123
83
  "md_file": "曖昧さ解消.md",
124
- "commands": [
125
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
126
- ],
127
- "primary_outputs": ["docs/02_ユースケース仕様/<カテゴリ>/UC-<N>-<題名>.md (更新)"]
84
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
85
+ "primary_outputs": ["(target spec update)", "docs/work.md"]
128
86
  },
129
87
  {
130
88
  "id": "analyze",
131
89
  "name_ja": "分析",
132
90
  "phase": null,
133
91
  "md_file": "分析.md",
134
- "commands": [
135
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
136
- ],
137
- "primary_outputs": ["docs/02_ユースケース仕様/<カテゴリ>/UC-<N>-<題名>.md (更新)"]
138
- },
139
- {
140
- "id": "checklist",
141
- "name_ja": "チェックリスト",
142
- "phase": 1,
143
- "md_file": "チェックリスト.md",
144
- "commands": [
145
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
146
- ],
147
- "primary_outputs": ["docs/02_ユースケース仕様/<カテゴリ>/checklists/*.md (任意)"]
148
- },
149
- {
150
- "id": "task_list",
151
- "name_ja": "タスク一覧",
152
- "phase": 1,
153
- "md_file": "タスク一覧.md",
154
- "commands": [
155
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
156
- ],
157
- "primary_outputs": ["docs/02_ユースケース仕様/<カテゴリ>/UC-<N>-<題名>.md (## タスク / ## タスク一覧 更新)"]
158
- },
159
- {
160
- "id": "other_work",
161
- "name_ja": "その他作業",
162
- "phase": 1,
163
- "md_file": "その他作業.md",
164
- "commands": [
165
- { "id": "check", "command": ".spec-runner/scripts/check.sh" }
166
- ],
167
- "primary_outputs": ["(branch scoped)"]
92
+ "commands": [{ "id": "check", "command": ".spec-runner/scripts/check.sh" }],
93
+ "primary_outputs": ["(analysis report)", "docs/work.md"]
168
94
  }
169
95
  ]
170
96
  }
171
-
@@ -6,15 +6,15 @@ primary_output: project.json の test_design.dir(既定 tests)
6
6
 
7
7
  # テスト設計(Phase 5: TEST DESIGN)
8
8
 
9
- **やること**: UC 仕様と受入条件に基づき、**PENDING 状態のテストコード**を `test_design.dir`(既定 `tests`)に作成する。続けて analyze / checklist → 人間承認 → review-pass のち Phase 6 へ。
9
+ **やること**: UC 仕様と受入条件に基づき、**PENDING 状態のテストコード**を `test_design.dir`(既定 `tests`)に作成する。あわせて `docs/work.md` の実装タスク・検証結果を更新する。
10
10
 
11
- **機械的な前提**(`project.json` の `test_design.require_uc_prefixed_tests` が true のとき): ファイル名は **`UC-N-<slug>.spec.<ext>`**(ブランチの UC 番号と一致)にすること。**これが無いと「次のステップ」は実装フェーズに進みません**(TDD で先にテストを置く流れを強制)。
11
+ **機械的な前提**(`project.json` の `test_design.require_uc_prefixed_tests` が true のとき): ファイル名は **`UC-N-<slug>.spec.<ext>`**(対象 UC の番号と一致)にすること。true の場合だけ、**命名が無いと「次のステップ」は実装フェーズに進みません**。
12
12
 
13
13
  | 項目 | 内容 |
14
14
  |------|------|
15
15
  | **出力先** | `.spec-runner/project.json` の `test_design.dir`(既定: `tests`)、パターンは `test_design.pattern`(既定: `*.spec.*`)。Python は `test_*.py` 等に変更可 |
16
16
  | **ドキュメント** | **読み取り専用**(test_design.dir への**追加のみ**)。UC 仕様の修正は「曖昧さ解消」等で別途 |
17
- | **命名** | spec.md **8-2** に厳守: `UC-N-{ユースケース名}.spec.{拡張子}` |
17
+ | **命名** | (推奨) `UC-N-{ユースケース名}.spec.{拡張子}` 。`test_design.require_uc_prefixed_tests=true` のときだけ必須。 |
18
18
  | **ピラミッド** | spec セクション 14: Unit : Integration : E2E ≈ 70 : 20 : 10。E2E は UC 1 本あたり最大 2 本目安 |
19
19
 
20
20
  ## ユーザー入力
@@ -28,19 +28,20 @@ $ARGUMENTS
28
28
  ## 実行フロー
29
29
 
30
30
  1. **セットアップ**
31
- リポジトリルートで `.spec-runner/spec-runner.sh 次のステップ --json`。ブランチ `feature/UC-N-xxx`。JSON の `feature_spec`・`feature_dir` を使用。
31
+ リポジトリルートで `.spec-runner/spec-runner.sh 次のステップ --json`。JSON の `feature_spec`・`feature_dir` を使用。
32
32
 
33
33
  2. **UC 仕様の読み込み**
34
34
  - FEATURE_SPEC から受入条件・成功基準・ユーザーストーリーを抽出
35
35
  - `docs/04_アーキテクチャ/命名規則.md` の SOURCE_EXTENSIONS でテスト拡張子(例: ts → `.spec.ts`)
36
- - ブランチ名から UC 番号と kebab 名(例: `feature/UC-1-order-placement` → UC-1, order-placement)
36
+ - `feature_spec` のファイル名から UC 番号と識別名を決める(例: `UC-1-注文作成.md` → UC-1, order-placement)
37
37
 
38
- 3. **配置と命名**(spec.md 8-2)
38
+ 3. **配置と命名**
39
39
  - ベース: **`project.json` の `test_design.dir`**、パターンは `test_design.pattern`
40
- - ユニット/UC: `{dir}/unit/UC-N-{名}.spec.{ext}`(例: `tests/unit/UC-1-order-placement.spec.ts`)
41
- - E2E: `{dir}/e2e/UC-N-{名}.e2e.spec.{ext}`
40
+ - `test_design.require_uc_prefixed_tests=true` の場合:
41
+ - ユニット/UC: `{dir}/unit/UC-N-{名}.spec.{ext}`(例: `tests/unit/UC-1-order-placement.spec.ts`)
42
+ - E2E: `{dir}/e2e/UC-N-{名}.e2e.spec.{ext}`
42
43
  - 集約不変条件: `{dir}/unit/{集約名}.invariants.spec.{ext}`
43
- - 既存の unit / integration / e2e 構造に合わせる
44
+ - `false` の場合: `test_design.pattern` に合致するテストファイル名であれば任意(ディレクトリ構造は既存に合わせる)
44
45
 
45
46
  4. **PENDING で記述**
46
47
  - 受入条件・成功基準ごとに **スキップ/TODO**(`it.todo` / `test.skip` / `@pending` 等)
@@ -6,7 +6,7 @@ primary_output: docs/03_ドメイン設計/
6
6
 
7
7
  # ドメイン設計(Domain)
8
8
 
9
- **やること**: `docs/03_ドメイン設計/` にユビキタス言語・ドメインモデル・集約等を整備する。完了後、レビュー通過で `phase-locks.json` の `domain` に `completed: true`。
9
+ **やること**: `docs/03_ドメイン設計/` にユビキタス言語・ドメインモデル・集約等を整備する。完了後、レビュー通過で `phase-locks.json` の `domain` に `completed: true`。あわせて `docs/work.md` の実装タスクを更新する。
10
10
 
11
11
  | 項目 | 内容 |
12
12
  |------|------|
@@ -38,7 +38,7 @@ $ARGUMENTS
38
38
  - 必要に応じて `エンティティ.md`・`値オブジェクト.md`
39
39
 
40
40
  2. **編集・追記**
41
- ユーザー指示や UC で発見した新概念に基づき上記を更新。骨格(主要集約と境界)を確定。Grade A の UC ループで肉付け。
41
+ ユーザー指示や UC で発見した新概念に基づき上記を更新。骨格(主要集約と境界)を確定し、必要に応じて後続で肉付けする。
42
42
  不明は推測で確定せず **`[要確認: ...]`** を残す(例: `[要確認: 集約境界の決め手(更新頻度/整合性要件)]`)。
43
43
 
44
44
  3. **レビュー通過後**
@@ -6,15 +6,17 @@ primary_output: docs/02_ユースケース仕様/<カテゴリ>/UC-N-xxx.md
6
6
 
7
7
  # ユースケース仕様(UC 仕様書)
8
8
 
9
- **やること**: 機能説明(`$ARGUMENTS`)から UC ブランチと UC 仕様書を作成し、テンプレに沿って埋める。その後 quality フロー(clarify → analyze)を回し、必要に応じて checklist を実施して review-pass へ進む。
9
+ **やること**: 機能説明(`$ARGUMENTS`)から UC 仕様書を作成(または更新)し、テンプレに沿って埋める。その後 quality フロー(clarify → analyze)を回し、必要に応じて checklist を実施して review-pass へ進む。あわせて `docs/work.md` の受入条件・実装タスクを同期する。
10
10
 
11
11
  | 項目 | 内容 |
12
12
  |------|------|
13
13
  | **成果物** | `docs/02_ユースケース仕様/<カテゴリ>/UC-N-xxx.md`(1 UC = 1 本) |
14
- | **main** | **必ず UC 用ブランチを作成してから**仕様を書く。main で直接編集しない |
14
+ | **Git** | **フェーズごとにブランチを切る必要はない。** 今いるブランチで仕様を書いてよい。**コミットしたくなったタイミング**で、AI `project.json` の naming に沿った**ブランチ名・コミットメッセージを相談し、checkout / 作成・コミットまで一緒にやってもらう**運用でよい |
15
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
+ **補足(spec-runner コア)**: テスト設計・実装フェーズは、ブランチではなく **UC 仕様と lock 状態**で判定されます。`uc_discovery.completed=false` の間は UC 作成フェーズを継続し、未レビュー UC がある場合は `clarify/analyze` を優先します。`spec-runner` はブランチを作りません。
19
+
18
20
  ## ユーザー入力
19
21
 
20
22
  `$ARGUMENTS` が機能説明。空でコマンドしていない限り、繰り返し入力を求めない。
@@ -40,7 +42,7 @@ $ARGUMENTS
40
42
  - 候補 UC 一覧(`UC-候補: 目的 / 範囲 / 非対象`)
41
43
  - 優先順(MVP から)
42
44
  - まず作る 1 件(最小価値)
43
- - 合意後は **1 件ずつ** `uc-next-start.sh` で作成する(CRUD は原則別 UC)。
45
+ - 合意後は **1 件ずつ** UC を追加する。土台づくりに **`uc-next-start.sh`**(仕様ひな形のみ)を使っても、手動で `UC-N-xxx.md` を置いてもよい(CRUD は原則別 UC)。
44
46
 
45
47
  ### 0.5. 引数なし時の候補提示(必須)
46
48
 
@@ -53,23 +55,24 @@ $ARGUMENTS
53
55
  - ユーザー回答後:
54
56
  - 選択された案(または自由入力文)を今回の機能説明として扱い、以降のステップを通常どおり実行する。
55
57
 
56
- ### 1. ブランチ用短名(2〜4 語)
58
+ ### 1. 短名 SLUG(2〜4 語)
57
59
 
58
- - 機能説明からキーワード抽出。**ブランチ名は ASCII のみ**、kebab-case(例: order-placement, user-auth)。
60
+ - 機能説明からキーワード抽出。`uc-next-start.sh` の**第1引数(UC-ID 省略時)または第2引数**として必須。**ASCII のみ**、kebab-case(例: order-placement, user-auth)。スクリプトはファイル名には使わず、**人間・AI がブランチ名を考えるときのタグ**として使う。
59
61
  - **UC ファイル名は TITLE を使用**(`UC-<N>-<TITLE>.md`)。
60
- - 技術略語(OAuth2, API, JWT)はそのまま。`SLUG` は ASCII(kebab-case)、`TITLE` は日本語で記述する。
62
+ - 技術略語(OAuth2, API, JWT)はそのまま。`TITLE` は日本語で記述する。
61
63
  - 例: 「ユーザー認証」→ user-auth / 「OAuth2 API」→ oauth2-api-integration 等。
62
64
 
63
- ### 2. ブランチと仕様の作成
65
+ ### 2. UC 仕様の作成
64
66
 
65
- - `.spec-runner/scripts/branch/uc-next-start.sh [UC-ID] "$SLUG" "$TITLE" "$CATEGORY" [--yes]`
67
+ - `docs/01_憲章/憲章.md` は先に確定する。未コミット差分がある場合は、**コミットしたくなったら AI に差分確認・メッセージ案・コミットを依頼**する(憲章と UC を同じコミットにまとめる必要はない)。
68
+ - **ショートカット**: `.spec-runner/scripts/uc-next-start.sh [UC-ID] "$SLUG" "$TITLE" "$CATEGORY" [--yes]` — **UC 仕様のひな形ファイルだけ**を所定フォルダに作成する(**Git のブランチ作成・checkout は行わない**)。**使わず**手動で `UC-N-xxx.md` を置いてもよい。
66
69
  - UC-ID は省略可(省略時は自動採番)。**SLUG / TITLE / CATEGORY は必須**(空文字禁止)。
67
70
  - CATEGORY で配置先が決まる(カテゴリ名は日本語可)。**機能ごとに 1 回だけ**。
68
71
  - シングルクォートはエスケープ(例: `'I'\''m Groot'`)またはダブルクォート。
69
72
  - 引数の実例:
70
- - `./.spec-runner/scripts/branch/uc-next-start.sh "task-management" "タスク管理機能追加" "タスク管理" --yes`
71
- - `./.spec-runner/scripts/branch/uc-next-start.sh UC-2 "order-cancel" "注文キャンセル" "注文" --yes`
72
- - `./.spec-runner/scripts/branch/uc-next-start.sh UC-3 "task-import" "タスク一括登録" "タスク管理" --yes`
73
+ - `./.spec-runner/scripts/uc-next-start.sh "task-management" "タスク管理機能追加" "タスク管理" --yes`
74
+ - `./.spec-runner/scripts/uc-next-start.sh UC-2 "order-cancel" "注文キャンセル" "注文" --yes`
75
+ - `./.spec-runner/scripts/uc-next-start.sh UC-3 "task-import" "タスク一括登録" "タスク管理" --yes`
73
76
 
74
77
  ### 3. テンプレ読込
75
78
 
@@ -107,13 +110,13 @@ checklists を使う場合のみ `FEATURE_DIR/checklists/requirements.md` を生
107
110
 
108
111
  ### 7. 完了報告
109
112
 
110
- ブランチ名・仕様パス・チェックリスト結果・次フェーズ(曖昧さ解消 / 実装計画)の準備状況。
113
+ 仕様パス・チェックリスト結果・次フェーズ(曖昧さ解消 / 実装計画)の準備状況。
111
114
 
112
115
  ※ 分解提案を経た場合は、採用された UC 分割案(採用順)も合わせて報告する。
113
116
 
114
117
  ※ **UC 洗い出しが完了したら** `./.spec-runner/phase-locks.json` の `uc_discovery.completed` を `true` にする(以降 `domain` に進む)。
115
118
 
116
- **注**: スクリプトは書き込み前にブランチ作成・チェックアウトと仕様の初期化を行う。
119
+ **注**: `uc-next-start.sh` は仕様ファイルの生成のみ。現在のブランチは変わらない。
117
120
 
118
121
  ## 付録 A: 仕様品質チェックリスト例
119
122
 
@@ -7,7 +7,7 @@ note: 任意フェーズで実行可能(読み取り専用)
7
7
 
8
8
  # 分析(品質フロー)
9
9
 
10
- **やること**: 任意フェーズで、**読み取り専用**で UC 仕様・憲章の一貫性・矛盾・カバレッジを分析し、構造化レポートを出力する(ファイルは変更しない)。
10
+ **やること**: 任意フェーズで、**読み取り専用**で UC 仕様・憲章の一貫性・矛盾・カバレッジを分析し、構造化レポートを出力する(ファイルは変更しない)。必要に応じて `docs/work.md` の未解決更新を提案する。
11
11
 
12
12
  | 項目 | 内容 |
13
13
  |------|------|
@@ -26,7 +26,7 @@ $ARGUMENTS
26
26
 
27
27
  ### 1. コンテキスト初期化
28
28
 
29
- `.spec-runner/spec-runner.sh 次のステップ --json` を 1 回。`feature/UC-N-xxx`。
29
+ `.spec-runner/spec-runner.sh 次のステップ --json` を 1 回。`feature_spec`・`feature_dir` を使用。
30
30
  **SPEC** = FEATURE_SPEC(**必須**)。実装方針・タスクは UC の「## 実装方針」「## タスク」。
31
31
  無ければエラー中止。引数のシングルクォートはエスケープ。
32
32
 
@@ -5,12 +5,12 @@ phase: 6
5
5
 
6
6
  # 実装(Phase 6: IMPLEMENTATION)
7
7
 
8
- **やること**: Phase 5 の **PENDING テストをグリーン**にする。**完了**はコードだけでなく **起動確認**(dev で `/` と主要画面)と **可能なら E2E 1 本グリーン**。Phase 5 レビュー後は AGENTS.md / CLAUDE.md の更新を検討。
8
+ **やること**: Phase 5 の **PENDING テストをグリーン**にする。**完了**はコードだけでなく **起動確認**(dev で `/` と主要画面)と **可能なら E2E 1 本グリーン**。あわせて `docs/work.md` のチェックボックスと検証結果を確定する。
9
9
 
10
10
  | 項目 | 内容 |
11
11
  |------|------|
12
12
  | **UC 配置** | カテゴリ内 **UC-N-xxx.md 1 本**。**## 実装方針**・**## タスク**(または **## タスク一覧**)は **一番下** |
13
- | **検証** | 完了は check.sh。テストは **`require-tests-green.sh`**(`project.json` の `test_command.run`)が **exit 0** まで「完了」報告しない |
13
+ | **検証** | 完了は check.sh。テストは **`project.json` の `test_command.run`** **exit 0** まで「完了」報告しない |
14
14
 
15
15
  ## フォルダ構造
16
16
 
@@ -37,7 +37,7 @@ $ARGUMENTS
37
37
  ## 実行フロー
38
38
 
39
39
  1. **JSON**
40
- `次のステップ --json`。`feature_dir`・`feature_spec`。`feature/UC-N-xxx`。
40
+ `次のステップ --json`。`feature_dir`・`feature_spec`。
41
41
 
42
42
  2. **チェックリスト(FEATURE_DIR/checklists/ がある場合)**
43
43
  `- [ ]` / `- [x]` を数え表化。未完了 0 → PASS。未完了あり → 「このまま進めますか? yes/no」で待つ。no で停止。yes で続行。
@@ -64,16 +64,17 @@ $ARGUMENTS
64
64
 
65
65
  9. **完了検証**
66
66
  - 必須タスク完了・仕様一致
67
- - **`require-tests-green.sh`** が 0 になるまで完了報告禁止
67
+ - **`test_command.run` の実行結果** が 0 になるまで完了報告禁止
68
68
  - **起動確認(必須)**: dev で `/` と当該 UC の主要画面が 200 等。不可なら修正まで
69
69
  - **E2E(推奨)**: `tests/e2e/` に該当 UC があればハッピーパス 1 本グリーンを目標。無ければユニット+起動で可
70
70
 
71
71
  10. **hooks.after_implement**
72
72
  あれば同様に表示/実行。
73
73
 
74
- ## 次の UC
74
+ ## 次の UC・履歴整理
75
75
 
76
- `.spec-runner/scripts/branch/uc-next-start.sh` 実行前に確認。`--yes` で確認省略。main に切り替えて次ブランチ作成。
76
+ UC やマージのタイミングはプロジェクト次第。**コミット・ブランチが欲しくなったら** AI に相談する。
77
+ **任意**: `.spec-runner/scripts/uc-next-start.sh`(`--yes` で確認省略)— **次 UC 用の仕様ひな形 `.md` のみ**作成(ブランチは作らない)。
77
78
 
78
79
  ---
79
- **次**: 完了後、次のステップへ。次 UC は上記スクリプト。
80
+ **次**: 完了後、次のステップへ。