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.
- package/README.md +15 -7
- package/bin/spec-runner.js +28 -23
- package/docs/flow.md +59 -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 +137 -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 +3 -3
- 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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 次の UC 仕様のひな形を作成する(Git ブランチの作成・切替は行わない)。
|
|
3
|
+
# 使用例:
|
|
4
|
+
# ./uc-next-start.sh "task-management" "タスク管理機能追加" "タスク管理"
|
|
5
|
+
# ./uc-next-start.sh UC-2 "order-cancel" "注文キャンセル" "注文"
|
|
6
|
+
# ./uc-next-start.sh --yes "task-management" "タスク管理機能追加" "タスク管理"
|
|
7
|
+
# 引数仕様(位置引数):
|
|
8
|
+
# [UC-ID] [SLUG] [TITLE] [CATEGORY]
|
|
9
|
+
# - UC-ID: 省略可(例: UC-2)
|
|
10
|
+
# - SLUG: 必須。識別用の短名(ASCII, kebab-case 推奨。ファイル名には使わず参考・一貫性のため)
|
|
11
|
+
# - TITLE: 必須。UC ファイル題名(日本語推奨)
|
|
12
|
+
# - CATEGORY: 必須。docs/02_ユースケース仕様/ 配下のカテゴリ名(日本語可)
|
|
13
|
+
# 重要: 空欄の引数は禁止。SLUG/TITLE/CATEGORY は必ず指定する
|
|
14
|
+
|
|
15
|
+
set -e
|
|
16
|
+
REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || echo ".")}"
|
|
17
|
+
cd "$REPO_ROOT"
|
|
18
|
+
|
|
19
|
+
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
|
|
20
|
+
echo "Error: Git リポジトリ内で実行してください。" >&2
|
|
21
|
+
exit 1
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
YES_MODE=false
|
|
25
|
+
ARGS=()
|
|
26
|
+
for a in "$@"; do
|
|
27
|
+
case "$a" in
|
|
28
|
+
--yes|-y) YES_MODE=true ;;
|
|
29
|
+
*)
|
|
30
|
+
if [[ -z "$a" ]]; then
|
|
31
|
+
echo "Error: 空文字の引数は使用できません。UC-ID を省略する場合は引数自体を渡さないでください。" >&2
|
|
32
|
+
exit 1
|
|
33
|
+
fi
|
|
34
|
+
ARGS+=("$a")
|
|
35
|
+
;;
|
|
36
|
+
esac
|
|
37
|
+
done
|
|
38
|
+
|
|
39
|
+
PROJECT_JSON="$REPO_ROOT/.spec-runner/project.json"
|
|
40
|
+
[[ -f "$PROJECT_JSON" ]] || { echo "uc-next-start: project.json がありません: $PROJECT_JSON" >&2; exit 1; }
|
|
41
|
+
command -v jq >/dev/null 2>&1 || { echo "uc-next-start: jq が必要です(brew install jq)" >&2; exit 1; }
|
|
42
|
+
UC_ID_RE="$(jq -r '.naming.uc_id_pattern' "$PROJECT_JSON")"
|
|
43
|
+
[[ -n "$UC_ID_RE" && "$UC_ID_RE" != "null" ]] || {
|
|
44
|
+
echo "uc-next-start: project.json の naming.uc_id_pattern が未設定です" >&2
|
|
45
|
+
exit 1
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
next_uc_id() {
|
|
49
|
+
local dir="$REPO_ROOT/docs/02_ユースケース仕様"
|
|
50
|
+
mkdir -p "$dir"
|
|
51
|
+
local max=0
|
|
52
|
+
for f in "$dir"/*/UC-*.md; do
|
|
53
|
+
[[ -e "$f" ]] || continue
|
|
54
|
+
base=$(basename "$f" .md)
|
|
55
|
+
if [[ "$base" =~ ^(${UC_ID_RE})- ]]; then
|
|
56
|
+
uc_id="${BASH_REMATCH[1]}"
|
|
57
|
+
digits=$(echo "$uc_id" | tr -cd '0-9')
|
|
58
|
+
[[ -z "$digits" ]] && continue
|
|
59
|
+
n=$((10#$digits))
|
|
60
|
+
[[ $n -gt $max ]] && max=$n
|
|
61
|
+
fi
|
|
62
|
+
done
|
|
63
|
+
printf "UC-%d\n" $((max + 1))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
NEXT_UC="$(next_uc_id)"
|
|
67
|
+
SLUG=""
|
|
68
|
+
TITLE=""
|
|
69
|
+
CATEGORY=""
|
|
70
|
+
if [[ ${#ARGS[@]} -ge 1 ]] && [[ "${ARGS[0]}" =~ ^${UC_ID_RE}$ ]]; then
|
|
71
|
+
[[ ${#ARGS[@]} -eq 4 ]] || {
|
|
72
|
+
echo "Usage: .spec-runner/scripts/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
|
|
73
|
+
echo " - UC-ID を指定した場合は SLUG/TITLE/CATEGORY の3引数が必須です" >&2
|
|
74
|
+
exit 1
|
|
75
|
+
}
|
|
76
|
+
NEXT_UC="${ARGS[0]}"
|
|
77
|
+
SLUG="${ARGS[1]}"
|
|
78
|
+
TITLE="${ARGS[2]}"
|
|
79
|
+
CATEGORY="${ARGS[3]}"
|
|
80
|
+
else
|
|
81
|
+
[[ ${#ARGS[@]} -eq 3 ]] || {
|
|
82
|
+
echo "Usage: .spec-runner/scripts/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
|
|
83
|
+
echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
|
|
84
|
+
exit 1
|
|
85
|
+
}
|
|
86
|
+
SLUG="${ARGS[0]}"
|
|
87
|
+
TITLE="${ARGS[1]}"
|
|
88
|
+
CATEGORY="${ARGS[2]}"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
if [[ -z "$SLUG" || -z "$TITLE" || -z "$CATEGORY" ]]; then
|
|
92
|
+
echo "Usage: .spec-runner/scripts/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
|
|
93
|
+
echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
|
|
94
|
+
exit 1
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
SLUG=$(echo "$SLUG" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-*//' | sed 's/-*$//')
|
|
98
|
+
if [[ -z "$SLUG" ]]; then
|
|
99
|
+
echo "Error: SLUG は英数字・ハイフンへ正規化可能な値を指定してください(例: task-management)。" >&2
|
|
100
|
+
exit 1
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
DOC_TITLE="$TITLE"
|
|
104
|
+
DOC_TITLE=$(echo "$DOC_TITLE" | sed 's/[\\\\\\/\\:\\*\\?\\\"\\<\\>\\|]/ /g' | sed 's/[[:space:]]\\+/ /g' | sed 's/^ *//; s/ *$//')
|
|
105
|
+
if [[ -z "$DOC_TITLE" ]]; then
|
|
106
|
+
echo "Error: TITLE が不正です(危険文字除去後に空になりました)。" >&2
|
|
107
|
+
exit 1
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
CATEGORY=$(echo "$CATEGORY" | sed 's/[\\\/:\*\?"<>|]//g' | sed 's/[[:cntrl:]]//g' | sed 's/[[:space:]]\+/ /g' | sed 's/^ *//; s/ *$//')
|
|
111
|
+
if [[ -z "$CATEGORY" ]]; then
|
|
112
|
+
echo "Error: CATEGORY は空にできません。" >&2
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
115
|
+
|
|
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
|
|
121
|
+
exit 1
|
|
122
|
+
fi
|
|
123
|
+
|
|
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
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
if [[ "$YES_MODE" != true ]]; then
|
|
131
|
+
echo "次の UC 仕様のひな形を作成します(ブランチは作成しません)。"
|
|
132
|
+
echo " → $UC_DOC"
|
|
133
|
+
echo -n " 実行してよろしいですか? [y/N]: "
|
|
134
|
+
read -r ans
|
|
135
|
+
case "$ans" in
|
|
136
|
+
[yY]|[yY][eE][sS]) ;;
|
|
137
|
+
*) echo "キャンセルしました。"; exit 0 ;;
|
|
138
|
+
esac
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
mkdir -p "$FEATURE_DIR"
|
|
142
|
+
mkdir -p "${FEATURE_DIR}/判断記録"
|
|
143
|
+
TEMPLATE="$REPO_ROOT/.spec-runner/templates/UC-N-ユースケース名.md"
|
|
144
|
+
if [[ -f "$TEMPLATE" ]]; then
|
|
145
|
+
sed "s/UC-N/${NEXT_UC}/g; s/{ユースケース名}/${DOC_TITLE}/g" "$TEMPLATE" > "$UC_DOC"
|
|
146
|
+
echo "Created: $UC_DOC"
|
|
147
|
+
else
|
|
148
|
+
touch "$UC_DOC"
|
|
149
|
+
echo "# ${NEXT_UC}: ${DOC_TITLE}" >> "$UC_DOC"
|
|
150
|
+
echo "Created: $UC_DOC"
|
|
151
|
+
fi
|
|
152
|
+
|
|
153
|
+
echo ""
|
|
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
|
|
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":
|
|
3
|
-
"note": "steps
|
|
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/
|
|
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
|
-
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
package/templates/.spec-runner/steps//343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
| **命名** |
|
|
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
|
|
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
|
-
-
|
|
36
|
+
- `feature_spec` のファイル名から UC 番号と識別名を決める(例: `UC-1-注文作成.md` → UC-1, order-placement)
|
|
37
37
|
|
|
38
|
-
3.
|
|
38
|
+
3. **配置と命名**
|
|
39
39
|
- ベース: **`project.json` の `test_design.dir`**、パターンは `test_design.pattern`
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
| **
|
|
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 件ずつ**
|
|
45
|
+
- 合意後は **1 件ずつ** UC を追加する。土台づくりに **`uc-next-start.sh`**(仕様ひな形のみ)を使っても、手動で `UC-N-xxx.md` を置いてもよい(CRUD は原則別 UC)。
|
|
44
46
|
|
|
45
47
|
### 0.5. 引数なし時の候補提示(必須)
|
|
46
48
|
|
|
@@ -53,24 +55,24 @@ $ARGUMENTS
|
|
|
53
55
|
- ユーザー回答後:
|
|
54
56
|
- 選択された案(または自由入力文)を今回の機能説明として扱い、以降のステップを通常どおり実行する。
|
|
55
57
|
|
|
56
|
-
### 1.
|
|
58
|
+
### 1. 短名 SLUG(2〜4 語)
|
|
57
59
|
|
|
58
|
-
-
|
|
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)はそのまま。`
|
|
62
|
+
- 技術略語(OAuth2, API, JWT)はそのまま。`TITLE` は日本語で記述する。
|
|
61
63
|
- 例: 「ユーザー認証」→ user-auth / 「OAuth2 API」→ oauth2-api-integration 等。
|
|
62
64
|
|
|
63
|
-
### 2.
|
|
65
|
+
### 2. UC 仕様の作成
|
|
64
66
|
|
|
65
|
-
- `docs/01_憲章/憲章.md`
|
|
66
|
-
- `.spec-runner/scripts/
|
|
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` を置いてもよい。
|
|
67
69
|
- UC-ID は省略可(省略時は自動採番)。**SLUG / TITLE / CATEGORY は必須**(空文字禁止)。
|
|
68
70
|
- CATEGORY で配置先が決まる(カテゴリ名は日本語可)。**機能ごとに 1 回だけ**。
|
|
69
71
|
- シングルクォートはエスケープ(例: `'I'\''m Groot'`)またはダブルクォート。
|
|
70
72
|
- 引数の実例:
|
|
71
|
-
- `./.spec-runner/scripts/
|
|
72
|
-
- `./.spec-runner/scripts/
|
|
73
|
-
- `./.spec-runner/scripts/
|
|
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`
|
|
74
76
|
|
|
75
77
|
### 3. テンプレ読込
|
|
76
78
|
|
|
@@ -108,13 +110,13 @@ checklists を使う場合のみ `FEATURE_DIR/checklists/requirements.md` を生
|
|
|
108
110
|
|
|
109
111
|
### 7. 完了報告
|
|
110
112
|
|
|
111
|
-
|
|
113
|
+
仕様パス・チェックリスト結果・次フェーズ(曖昧さ解消 / 実装計画)の準備状況。
|
|
112
114
|
|
|
113
115
|
※ 分解提案を経た場合は、採用された UC 分割案(採用順)も合わせて報告する。
|
|
114
116
|
|
|
115
117
|
※ **UC 洗い出しが完了したら** `./.spec-runner/phase-locks.json` の `uc_discovery.completed` を `true` にする(以降 `domain` に進む)。
|
|
116
118
|
|
|
117
|
-
**注**:
|
|
119
|
+
**注**: `uc-next-start.sh` は仕様ファイルの生成のみ。現在のブランチは変わらない。
|
|
118
120
|
|
|
119
121
|
## 付録 A: 仕様品質チェックリスト例
|
|
120
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 回。`
|
|
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
|
|
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。テストは **`
|
|
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
|
|
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
|
-
- **`
|
|
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
|
-
|
|
76
|
+
次 UC やマージのタイミングはプロジェクト次第。**コミット・ブランチが欲しくなったら** AI に相談する。
|
|
77
|
+
**任意**: `.spec-runner/scripts/uc-next-start.sh`(`--yes` で確認省略)— **次 UC 用の仕様ひな形 `.md` のみ**作成(ブランチは作らない)。
|
|
77
78
|
|
|
78
79
|
---
|
|
79
|
-
**次**:
|
|
80
|
+
**次**: 完了後、次のステップへ。
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
step_id: implementation_plan
|
|
3
|
-
phase:
|
|
4
|
-
note:
|
|
3
|
+
phase: 3
|
|
4
|
+
note: アーキテクチャ設計
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# 実装計画(アーキテクチャ)
|
|
8
8
|
|
|
9
|
-
**やること**:
|
|
9
|
+
**やること**: `docs/04_アーキテクチャ/` に設計を置き、最新の UC 仕様に **実装方針を UC の .md の一番下(## 実装方針)** として反映する。あわせて `docs/work.md` の実装タスクを更新する。
|
|
10
10
|
|
|
11
11
|
| 項目 | 内容 |
|
|
12
12
|
|------|------|
|
|
13
13
|
| **docs/02** | カテゴリフォルダ内に **UC-N-xxx.md を 1 本ずつ**。実装方針・タスクは **各 UC .md の一番下** |
|
|
14
14
|
| **動的設定** | 必須ドキュメント・命名規則は **`.spec-runner/project.json` を AI が直接編集** |
|
|
15
|
-
|
|
|
15
|
+
| **補足(任意)** | 必要に応じて `docs/05_インフラ設計`(schema.dbml 等)を作成 |
|
|
16
16
|
|
|
17
17
|
## ユーザー入力
|
|
18
18
|
|
|
@@ -27,7 +27,7 @@ $ARGUMENTS
|
|
|
27
27
|
| フェーズ | パス | 内容の例 |
|
|
28
28
|
|----------|------|----------|
|
|
29
29
|
| Phase 2 | `docs/04_アーキテクチャ/` | パターン選定・インフラ方針・命名・設計判断(`MMDD-題名.md`。年はフォルダ分け可) |
|
|
30
|
-
|
|
|
30
|
+
| 任意 | `docs/05_インフラ設計/` | クラウド・ネットワーク・**schema.dbml**(必要時のみ) |
|
|
31
31
|
| API 公開時 | `docs/06_API仕様/` | openapi.yaml(Gate 3 で参照) |
|
|
32
32
|
|
|
33
33
|
## API 仕様(openapi.yaml)
|
|
@@ -35,16 +35,16 @@ $ARGUMENTS
|
|
|
35
35
|
- **単一ソース**: `docs/06_API仕様/openapi.yaml`。型・クライアントはここから生成すると設計と一致。`tags` で分類、`$ref` 分割可。
|
|
36
36
|
- **生成手段**: プロジェクト標準(openapi-generator / openapi-typescript / orval 等)。spec-runner は固定しない。
|
|
37
37
|
|
|
38
|
-
## Phase 2(main/develop
|
|
38
|
+
## Phase 2(main/develop など)
|
|
39
39
|
|
|
40
40
|
`docs/01_憲章/憲章.md` と `docs/03_ドメイン設計/` を読み、**`docs/04_アーキテクチャ/`** にパターン選定・インフラ方針・命名・設計判断記録を作成。フォルダが無ければこのフェーズで作成。
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## UC 上での計画(実装方針セクション)
|
|
43
43
|
|
|
44
44
|
以下 1–4 を実行。
|
|
45
45
|
|
|
46
46
|
1. **セットアップ**
|
|
47
|
-
`.spec-runner/spec-runner.sh 次のステップ --json`。`feature_spec`・`feature_dir`。
|
|
47
|
+
`.spec-runner/spec-runner.sh 次のステップ --json`。`feature_spec`・`feature_dir`。
|
|
48
48
|
|
|
49
49
|
2. **文脈**
|
|
50
50
|
FEATURE_SPEC(**必須**)、`docs/01_憲章/憲章.md`、UC の「## 実装方針」。UC 1 本で計画。
|
|
@@ -59,7 +59,7 @@ $ARGUMENTS
|
|
|
59
59
|
- 設計後に憲章チェックを再評価
|
|
60
60
|
|
|
61
61
|
4. **停止と報告**
|
|
62
|
-
コマンドは Phase 2
|
|
62
|
+
コマンドは Phase 2 計画の後で終了。FEATURE_SPEC・生成物を報告。
|
|
63
63
|
|
|
64
64
|
## サブフェーズ詳細
|
|
65
65
|
|