spec-runner 1.0.0 → 1.0.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 +64 -24
- package/bin/spec-runner.js +23 -5
- package/package.json +1 -1
- package/templates/base/.github/PULL_REQUEST_TEMPLATE.md +11 -11
- package/templates/base/.github/workflows/phase-gate-check.yml +22 -22
- package/templates/base/scripts/spec-runner.sh +158 -71
- package/templates/base/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210//343/202/244/343/203/263/343/203/225/343/203/251.md +14 -0
- package/templates/base/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210//343/203/206/343/203/274/343/203/226/343/203/253.md +17 -0
- package/templates/base/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210//343/203/211/343/203/241/343/202/244/343/203/263.md +18 -0
- package/templates/base/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +12 -0
- package/templates/base/{docs/adr/TEMPLATE.md → templates/99_/350/250/255/350/250/210/345/210/244/346/226/255/350/250/230/351/214/262//343/201/262/343/201/252/345/275/242.md} +1 -1
- package/templates/base/templates/README.md +32 -0
- package/templates/base/templates//345/210/235/346/234/237/343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210/01_/346/206/262/347/253/240.md +48 -0
- package/templates/base/templates//345/210/235/346/234/237/343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210/02_/344/273/225/346/247/230.md +39 -0
- package/templates/base/{docs/glossary.md → templates//345/210/235/346/234/237/343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210/03_/347/224/250/350/252/236/351/233/206.md} +1 -1
- package/templates/base/templates//345/210/235/346/234/237/343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210/99_/350/250/255/350/250/210/345/210/244/346/226/255/350/250/230/351/214/262/.gitkeep +0 -0
- package/templates/base/templates//345/210/235/346/234/237/343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210//343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210/344/270/200/350/246/247.md +14 -0
- package/templates/claude/.claude/commands/{sr-set-gate.md → sr-/343/202/262/343/203/274/343/203/210/350/250/255/345/256/232.md} +2 -2
- package/templates/{cursor/.cursor/commands/sr-test-design.md → claude/.claude/commands/sr-/343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.md} +1 -1
- package/templates/claude/.claude/commands/sr-/343/203/254/343/203/223/343/203/245/343/203/274.md +9 -0
- package/templates/claude/.claude/commands/sr-/344/273/225/346/247/230.md +9 -0
- package/templates/claude/.claude/commands/{sr-fix.md → sr-/344/277/256/346/255/243.md} +2 -2
- package/templates/claude/.claude/commands/{sr-init.md → sr-/345/210/235/346/234/237/345/214/226.md} +3 -3
- package/templates/claude/.claude/commands/{sr-complete.md → sr-/345/256/214/344/272/206.md} +1 -1
- package/templates/claude/.claude/commands/{sr-implement.md → sr-/345/256/237/350/243/205.md} +1 -1
- package/templates/claude/.claude/commands/sr-/346/206/262/347/253/240.md +9 -0
- package/templates/claude/.claude/commands/sr-/346/246/202/350/246/201/350/250/255/350/250/210.md +9 -0
- package/templates/{cursor/.cursor/commands/sr-status.md → claude/.claude/commands/sr-/347/212/266/346/205/213.md} +1 -1
- package/templates/claude/.claude/commands/{sr-hotfix.md → sr-/347/267/212/346/200/245/344/277/256/346/255/243.md} +2 -2
- package/templates/{cursor/.cursor/commands/sr-configure.md → claude/.claude/commands/sr-/350/250/255/345/256/232.md} +2 -2
- package/templates/claude/.claude/commands/{sr-design-detail.md → sr-/350/251/263/347/264/260/350/250/255/350/250/210.md} +2 -2
- package/templates/claude/.claude/hooks/pre-tool-use.sh +1 -1
- package/templates/claude/CLAUDE.md +22 -22
- package/templates/copilot/.github/copilot-instructions.md +1 -1
- package/templates/copilot/.github/prompts/{sr-set-gate.prompt.md → sr-/343/202/262/343/203/274/343/203/210/350/250/255/345/256/232.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-test-design.prompt.md → sr-/343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-review.prompt.md → sr-/343/203/254/343/203/223/343/203/245/343/203/274.prompt.md} +2 -2
- package/templates/copilot/.github/prompts/sr-/344/273/225/346/247/230.prompt.md +13 -0
- package/templates/copilot/.github/prompts/{sr-fix.prompt.md → sr-/344/277/256/346/255/243.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-init.prompt.md → sr-/345/210/235/346/234/237/345/214/226.prompt.md} +3 -3
- package/templates/copilot/.github/prompts/{sr-complete.prompt.md → sr-/345/256/214/344/272/206.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-implement.prompt.md → sr-/345/256/237/350/243/205.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/sr-/346/206/262/347/253/240.prompt.md +13 -0
- package/templates/copilot/.github/prompts/{sr-design-high.prompt.md → sr-/346/246/202/350/246/201/350/250/255/350/250/210.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-status.prompt.md → sr-/347/212/266/346/205/213.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-hotfix.prompt.md → sr-/347/267/212/346/200/245/344/277/256/346/255/243.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-configure.prompt.md → sr-/350/250/255/345/256/232.prompt.md} +1 -1
- package/templates/copilot/.github/prompts/{sr-design-detail.prompt.md → sr-/350/251/263/347/264/260/350/250/255/350/250/210.prompt.md} +1 -1
- package/templates/cursor/.cursor/commands/sr-/343/202/262/343/203/274/343/203/210/350/250/255/345/256/232.md +9 -0
- package/templates/{claude/.claude/commands/sr-test-design.md → cursor/.cursor/commands/sr-/343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.md} +1 -1
- package/templates/cursor/.cursor/commands/sr-/343/203/254/343/203/223/343/203/245/343/203/274.md +9 -0
- package/templates/cursor/.cursor/commands/sr-/344/273/225/346/247/230.md +9 -0
- package/templates/cursor/.cursor/commands/{sr-fix.md → sr-/344/277/256/346/255/243.md} +2 -2
- package/templates/cursor/.cursor/commands/{sr-init.md → sr-/345/210/235/346/234/237/345/214/226.md} +3 -3
- package/templates/cursor/.cursor/commands/{sr-complete.md → sr-/345/256/214/344/272/206.md} +1 -1
- package/templates/cursor/.cursor/commands/{sr-implement.md → sr-/345/256/237/350/243/205.md} +1 -1
- package/templates/cursor/.cursor/commands/sr-/346/206/262/347/253/240.md +9 -0
- package/templates/cursor/.cursor/commands/sr-/346/246/202/350/246/201/350/250/255/350/250/210.md +9 -0
- package/templates/{claude/.claude/commands/sr-status.md → cursor/.cursor/commands/sr-/347/212/266/346/205/213.md} +1 -1
- package/templates/cursor/.cursor/commands/{sr-hotfix.md → sr-/347/267/212/346/200/245/344/277/256/346/255/243.md} +2 -2
- package/templates/{claude/.claude/commands/sr-configure.md → cursor/.cursor/commands/sr-/350/250/255/345/256/232.md} +2 -2
- package/templates/cursor/.cursor/commands/{sr-design-detail.md → sr-/350/251/263/347/264/260/350/250/255/350/250/210.md} +2 -2
- package/templates/claude/.claude/commands/sr-design-high.md +0 -9
- package/templates/claude/.claude/commands/sr-review.md +0 -9
- package/templates/cursor/.cursor/commands/sr-design-high.md +0 -9
- package/templates/cursor/.cursor/commands/sr-review.md +0 -9
- package/templates/cursor/.cursor/commands/sr-set-gate.md +0 -9
- /package/templates/base/templates/{requirement/template.md → 01_/350/246/201/344/273/266/345/256/232/347/276/251//343/201/262/343/201/252/345/275/242.md"} +0 -0
- /package/templates/base/{docs/review/debt.md → templates//345/210/235/346/234/237/343/203/211/343/202/255/343/203/245/343/203/241/343/203/263/343/203/210//346/214/257/343/202/212/350/277/224/343/202/212//350/262/240/345/202/265.md"} +0 -0
|
@@ -27,8 +27,8 @@ set -euo pipefail
|
|
|
27
27
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
28
28
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
29
29
|
STATE_FILE="$PROJECT_ROOT/.spec-runner/state.json"
|
|
30
|
-
DEBT_FILE="$PROJECT_ROOT/docs
|
|
31
|
-
GLOSSARY="$PROJECT_ROOT/docs/
|
|
30
|
+
DEBT_FILE="$PROJECT_ROOT/docs/振り返り/負債.md"
|
|
31
|
+
GLOSSARY="$PROJECT_ROOT/docs/03_用語集.md"
|
|
32
32
|
|
|
33
33
|
# ── フレームワーク設定を読み込む ───────────────────────────────────────────────
|
|
34
34
|
# npx spec-runner によって生成された .spec-runner/config.sh を読み込む
|
|
@@ -197,10 +197,10 @@ check_debt() {
|
|
|
197
197
|
# ── usecase/aggregate のパス計算 ───────────────────────────────────────────
|
|
198
198
|
uc_slug() { echo "$(state_get usecase)" | tr ' ' '-'; }
|
|
199
199
|
agg_slug() { echo "$(state_get aggregate)" | tr ' ' '-'; }
|
|
200
|
-
uc_req() { echo "$PROJECT_ROOT/docs/
|
|
201
|
-
uc_high() { echo "$PROJECT_ROOT/docs/
|
|
202
|
-
uc_detail() { echo "$PROJECT_ROOT/docs/
|
|
203
|
-
uc_test() { echo "$PROJECT_ROOT/docs/
|
|
200
|
+
uc_req() { echo "$PROJECT_ROOT/docs/01_要件/$(uc_slug).md"; }
|
|
201
|
+
uc_high() { echo "$PROJECT_ROOT/docs/02_概要設計/$(uc_slug).md"; }
|
|
202
|
+
uc_detail() { echo "$PROJECT_ROOT/docs/03_詳細設計/$(uc_slug)"; }
|
|
203
|
+
uc_test() { echo "$PROJECT_ROOT/docs/04_テスト設計/$(uc_slug).md"; }
|
|
204
204
|
|
|
205
205
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
206
206
|
# コマンド実装
|
|
@@ -282,7 +282,7 @@ cmd_init() {
|
|
|
282
282
|
# 要件定義ファイルをテンプレートから生成(templates/requirement/template.md を必須とする)
|
|
283
283
|
local req_file tmpl
|
|
284
284
|
req_file=$(uc_req)
|
|
285
|
-
tmpl="$PROJECT_ROOT/templates/
|
|
285
|
+
tmpl="$PROJECT_ROOT/templates/01_要件定義/ひな形.md"
|
|
286
286
|
[[ -f "$tmpl" ]] || die "要件テンプレートがありません: $tmpl (npx spec-runner でセットアップしてください)"
|
|
287
287
|
|
|
288
288
|
mkdir -p "$(dirname "$req_file")"
|
|
@@ -331,7 +331,7 @@ cmd_design_high() {
|
|
|
331
331
|
|
|
332
332
|
check_file "$req_file" "要件定義ファイル" || ((errors++))
|
|
333
333
|
check_status "$req_file" "approved" "要件定義のステータス" || ((errors++))
|
|
334
|
-
check_gate "glossary_checked" "
|
|
334
|
+
check_gate "glossary_checked" "用語集.md の確認済み" || ((errors++))
|
|
335
335
|
|
|
336
336
|
if [[ $errors -gt 0 ]]; then
|
|
337
337
|
echo ""
|
|
@@ -374,7 +374,7 @@ updated: $(date +%Y-%m-%d)
|
|
|
374
374
|
|
|
375
375
|
## ドメインモデルの洗い出し
|
|
376
376
|
|
|
377
|
-
<!--
|
|
377
|
+
<!-- 用語集.md の日本語名で書く -->
|
|
378
378
|
|
|
379
379
|
### エンティティ候補
|
|
380
380
|
|
|
@@ -475,22 +475,22 @@ cmd_design_detail() {
|
|
|
475
475
|
detail_dir=$(uc_detail)
|
|
476
476
|
case "$sub" in
|
|
477
477
|
usecase)
|
|
478
|
-
check_file "$detail_dir
|
|
479
|
-
check_status "$detail_dir
|
|
478
|
+
check_file "$detail_dir/ドメイン.md" "ドメインモデル設計" || ((errors++))
|
|
479
|
+
check_status "$detail_dir/ドメイン.md" "reviewed" "ドメインモデルのレビュー" || ((errors++))
|
|
480
480
|
;;
|
|
481
481
|
table)
|
|
482
|
-
check_file "$detail_dir
|
|
483
|
-
check_status "$detail_dir
|
|
484
|
-
check_file "$detail_dir
|
|
485
|
-
check_status "$detail_dir
|
|
482
|
+
check_file "$detail_dir/ドメイン.md" "ドメインモデル設計" || ((errors++))
|
|
483
|
+
check_status "$detail_dir/ドメイン.md" "reviewed" "ドメインモデルのレビュー" || ((errors++))
|
|
484
|
+
check_file "$detail_dir/ユースケース.md" "ユースケース設計" || ((errors++))
|
|
485
|
+
check_status "$detail_dir/ユースケース.md" "reviewed" "ユースケース設計のレビュー" || ((errors++))
|
|
486
486
|
;;
|
|
487
487
|
infra)
|
|
488
|
-
check_file "$detail_dir
|
|
489
|
-
check_status "$detail_dir
|
|
490
|
-
check_file "$detail_dir
|
|
491
|
-
check_status "$detail_dir
|
|
492
|
-
check_file "$detail_dir
|
|
493
|
-
check_status "$detail_dir
|
|
488
|
+
check_file "$detail_dir/ドメイン.md" "ドメインモデル設計" || ((errors++))
|
|
489
|
+
check_status "$detail_dir/ドメイン.md" "reviewed" "ドメインモデルのレビュー" || ((errors++))
|
|
490
|
+
check_file "$detail_dir/ユースケース.md" "ユースケース設計" || ((errors++))
|
|
491
|
+
check_status "$detail_dir/ユースケース.md" "reviewed" "ユースケース設計のレビュー" || ((errors++))
|
|
492
|
+
check_file "$detail_dir/テーブル.md" "テーブル設計" || ((errors++))
|
|
493
|
+
check_status "$detail_dir/テーブル.md" "reviewed" "テーブル設計のレビュー" || ((errors++))
|
|
494
494
|
;;
|
|
495
495
|
esac
|
|
496
496
|
|
|
@@ -504,13 +504,23 @@ cmd_design_detail() {
|
|
|
504
504
|
state_set_str "phase" "design-detail-$sub"
|
|
505
505
|
state_push_history "design-detail-$sub フェーズ開始"
|
|
506
506
|
|
|
507
|
+
# サブ種別→日本語ファイル名(ドメイン駆動の用語をそのまま)
|
|
508
|
+
local sub_ja
|
|
509
|
+
case "$sub" in
|
|
510
|
+
domain) sub_ja="ドメイン" ;;
|
|
511
|
+
usecase) sub_ja="ユースケース" ;;
|
|
512
|
+
table) sub_ja="テーブル" ;;
|
|
513
|
+
infra) sub_ja="インフラ" ;;
|
|
514
|
+
*) sub_ja="$sub" ;;
|
|
515
|
+
esac
|
|
516
|
+
|
|
507
517
|
# ファイルをテンプレートから生成
|
|
508
518
|
local dest_file usecase
|
|
509
519
|
usecase=$(state_get "usecase")
|
|
510
|
-
dest_file="$detail_dir/$
|
|
520
|
+
dest_file="$detail_dir/${sub_ja}.md"
|
|
511
521
|
mkdir -p "$detail_dir"
|
|
512
522
|
|
|
513
|
-
local tmpl="$PROJECT_ROOT/templates/
|
|
523
|
+
local tmpl="$PROJECT_ROOT/templates/03_詳細設計/${sub_ja}.md"
|
|
514
524
|
if [[ ! -f "$dest_file" ]]; then
|
|
515
525
|
if [[ -f "$tmpl" ]]; then
|
|
516
526
|
sed "s/{{USECASE}}/$usecase/g; s/{{DATE}}/$(date +%Y-%m-%d)/g" "$tmpl" > "$dest_file"
|
|
@@ -553,16 +563,16 @@ cmd_test_design() {
|
|
|
553
563
|
local detail_dir
|
|
554
564
|
detail_dir=$(uc_detail)
|
|
555
565
|
|
|
556
|
-
for
|
|
557
|
-
check_file "$detail_dir/$
|
|
558
|
-
check_status "$detail_dir/$
|
|
566
|
+
for sub_ja in ドメイン ユースケース テーブル インフラ; do
|
|
567
|
+
check_file "$detail_dir/$sub_ja.md" "03_詳細設計/$sub_ja.md" || ((errors++))
|
|
568
|
+
check_status "$detail_dir/$sub_ja.md" "reviewed" "03_詳細設計/$sub_ja.md のレビュー" || ((errors++))
|
|
559
569
|
done
|
|
560
570
|
|
|
561
|
-
# ADR
|
|
571
|
+
# 設計判断記録チェック(ADR が 1 件もない場合に促す)
|
|
562
572
|
local adr_count
|
|
563
|
-
adr_count=$(find "$PROJECT_ROOT/docs/
|
|
573
|
+
adr_count=$(find "$PROJECT_ROOT/docs/99_設計判断記録" -name "*.md" ! -name "ひな形.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
564
574
|
if [[ "$adr_count" -eq 0 ]]; then
|
|
565
|
-
warn "docs/
|
|
575
|
+
warn "docs/99_設計判断記録/ にADRが1件もありません。設計判断があれば作成してください"
|
|
566
576
|
fi
|
|
567
577
|
|
|
568
578
|
if [[ $errors -gt 0 ]]; then
|
|
@@ -770,7 +780,7 @@ cmd_review_pass() {
|
|
|
770
780
|
uc_slug_val=$(uc_slug)
|
|
771
781
|
|
|
772
782
|
case "$file" in
|
|
773
|
-
*
|
|
783
|
+
*01_要件*)
|
|
774
784
|
state_set_bool "gates.require_approved" true
|
|
775
785
|
state_set_str "phase" "require-approved"
|
|
776
786
|
# statusもapprovedに(同一デバイス上で一時ファイル)
|
|
@@ -778,35 +788,35 @@ cmd_review_pass() {
|
|
|
778
788
|
tmp2="${file}.tmp.$$"
|
|
779
789
|
sed "s/^status: .*/status: approved/" "$file" > "$tmp2" && mv "$tmp2" "$file"
|
|
780
790
|
ok "ゲート更新: require_approved = true"
|
|
781
|
-
info "次:
|
|
791
|
+
info "次: docs/03_用語集.md を確認後 ./scripts/spec-runner.sh set-gate glossary_checked"
|
|
782
792
|
info " ./scripts/spec-runner.sh design-high"
|
|
783
793
|
;;
|
|
784
|
-
*
|
|
794
|
+
*02_概要設計*)
|
|
785
795
|
state_set_bool "gates.high_level_reviewed" true
|
|
786
796
|
ok "ゲート更新: high_level_reviewed = true"
|
|
787
797
|
info "次: ./scripts/spec-runner.sh design-detail domain"
|
|
788
798
|
;;
|
|
789
|
-
|
|
799
|
+
*ドメイン*)
|
|
790
800
|
state_set_bool "gates.domain_model_reviewed" true
|
|
791
801
|
ok "ゲート更新: domain_model_reviewed = true"
|
|
792
802
|
info "次: ./scripts/spec-runner.sh design-detail usecase"
|
|
793
803
|
;;
|
|
794
|
-
|
|
804
|
+
*ユースケース*)
|
|
795
805
|
state_set_bool "gates.usecase_design_reviewed" true
|
|
796
806
|
ok "ゲート更新: usecase_design_reviewed = true"
|
|
797
807
|
info "次: ./scripts/spec-runner.sh design-detail table"
|
|
798
808
|
;;
|
|
799
|
-
|
|
809
|
+
*テーブル*)
|
|
800
810
|
state_set_bool "gates.table_design_reviewed" true
|
|
801
811
|
ok "ゲート更新: table_design_reviewed = true"
|
|
802
812
|
info "次: ./scripts/spec-runner.sh design-detail infra"
|
|
803
813
|
;;
|
|
804
|
-
|
|
814
|
+
*インフラ*)
|
|
805
815
|
state_set_bool "gates.infra_design_reviewed" true
|
|
806
816
|
ok "ゲート更新: infra_design_reviewed = true"
|
|
807
817
|
info "次: ./scripts/spec-runner.sh test-design"
|
|
808
818
|
;;
|
|
809
|
-
*
|
|
819
|
+
*04_テスト設計*)
|
|
810
820
|
state_set_bool "gates.test_design_reviewed" true
|
|
811
821
|
ok "ゲート更新: test_design_reviewed = true"
|
|
812
822
|
info "テストコードをコミット後: ./scripts/spec-runner.sh set-gate test_code_committed"
|
|
@@ -824,26 +834,102 @@ cmd_set_gate() {
|
|
|
824
834
|
ok "ゲートフラグ設定: $gate = true"
|
|
825
835
|
}
|
|
826
836
|
|
|
837
|
+
# ── status 表示用:フェーズ・ゲートの日本語ラベル ─────────────────────────────
|
|
838
|
+
phase_ja() {
|
|
839
|
+
case "$1" in
|
|
840
|
+
require) echo "要件定義" ;;
|
|
841
|
+
require-approved) echo "要件承認済み" ;;
|
|
842
|
+
design-high) echo "概要設計" ;;
|
|
843
|
+
design-detail*) echo "詳細設計" ;;
|
|
844
|
+
test-design) echo "テスト設計" ;;
|
|
845
|
+
implement) echo "実装" ;;
|
|
846
|
+
complete) echo "完了" ;;
|
|
847
|
+
fix) echo "修正" ;;
|
|
848
|
+
*) echo "$1" ;;
|
|
849
|
+
esac
|
|
850
|
+
}
|
|
851
|
+
gate_ja() {
|
|
852
|
+
case "$1" in
|
|
853
|
+
require_approved) echo "要件レビュー済み" ;;
|
|
854
|
+
glossary_checked) echo "用語集確認済み" ;;
|
|
855
|
+
high_level_reviewed) echo "概要設計レビュー済み" ;;
|
|
856
|
+
domain_model_reviewed) echo "ドメインモデルレビュー済み" ;;
|
|
857
|
+
usecase_design_reviewed) echo "ユースケース設計レビュー済み" ;;
|
|
858
|
+
table_design_reviewed) echo "テーブル設計レビュー済み" ;;
|
|
859
|
+
infra_design_reviewed) echo "インフラ設計レビュー済み" ;;
|
|
860
|
+
test_design_reviewed) echo "テスト設計レビュー済み" ;;
|
|
861
|
+
test_code_committed) echo "テストコードコミット済み" ;;
|
|
862
|
+
*) echo "$1" ;;
|
|
863
|
+
esac
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
# ── status: プロジェクト土台(憲章・仕様)の未記入チェック ─────────────────────
|
|
867
|
+
# プレースホルダーが残っている=テンプレートのまま=未記入とみなす
|
|
868
|
+
CONSTITUTION_PLACEHOLDER="この節を編集"
|
|
869
|
+
SPECIFY_PLACEHOLDER="(1〜2文で。例:"
|
|
870
|
+
|
|
871
|
+
is_foundation_written() {
|
|
872
|
+
local kind="$1"
|
|
873
|
+
case "$kind" in
|
|
874
|
+
constitution)
|
|
875
|
+
[[ -f "$PROJECT_ROOT/docs/01_憲章.md" ]] && ! grep -q "$CONSTITUTION_PLACEHOLDER" "$PROJECT_ROOT/docs/01_憲章.md" 2>/dev/null
|
|
876
|
+
;;
|
|
877
|
+
specify)
|
|
878
|
+
[[ -f "$PROJECT_ROOT/docs/02_仕様.md" ]] && ! grep -q "$SPECIFY_PLACEHOLDER" "$PROJECT_ROOT/docs/02_仕様.md" 2>/dev/null
|
|
879
|
+
;;
|
|
880
|
+
*) return 1 ;;
|
|
881
|
+
esac
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
# 憲章・仕様の未記入案内を表示。mode: no_state(ユースケースなし) or has_state(開始済み)
|
|
885
|
+
status_show_foundation_reminder() {
|
|
886
|
+
local mode="${1:-no_state}"
|
|
887
|
+
local c_ok s_ok
|
|
888
|
+
is_foundation_written constitution && c_ok=1 || c_ok=0
|
|
889
|
+
is_foundation_written specify && s_ok=1 || s_ok=0
|
|
890
|
+
[[ $c_ok -eq 1 && $s_ok -eq 1 ]] && return
|
|
891
|
+
|
|
892
|
+
if [[ "$mode" == "no_state" ]]; then
|
|
893
|
+
info "プロジェクトの土台(init の前推奨):"
|
|
894
|
+
[[ $c_ok -eq 0 ]] && info " ✗ 憲章がまだ記入されていません → docs/01_憲章.md (/sr-憲章 で編集)"
|
|
895
|
+
[[ $s_ok -eq 0 ]] && info " ✗ 仕様がまだ記入されていません → docs/02_仕様.md (/sr-仕様 で編集)"
|
|
896
|
+
else
|
|
897
|
+
info "💡 プロジェクトの土台:"
|
|
898
|
+
[[ $c_ok -eq 0 ]] && info " 憲章がまだ → /sr-憲章"
|
|
899
|
+
[[ $s_ok -eq 0 ]] && info " 仕様がまだ → /sr-仕様"
|
|
900
|
+
fi
|
|
901
|
+
info ""
|
|
902
|
+
}
|
|
903
|
+
|
|
827
904
|
# ── status ─────────────────────────────────────────────────────────────────────
|
|
828
905
|
cmd_status() {
|
|
829
906
|
if [[ ! -f "$STATE_FILE" ]]; then
|
|
830
907
|
info "作業中のユースケースはありません"
|
|
831
|
-
info "
|
|
908
|
+
info ""
|
|
909
|
+
status_show_foundation_reminder no_state
|
|
910
|
+
info "開始するには: チャットで /sr-初期化 <ユースケース名> またはターミナルで下記を実行してください。"
|
|
911
|
+
info " 例(チャット): /sr-初期化 会員登録 会員"
|
|
912
|
+
info " 例(ターミナル): ./scripts/spec-runner.sh init 会員登録 会員"
|
|
832
913
|
return
|
|
833
914
|
fi
|
|
834
915
|
|
|
916
|
+
status_show_foundation_reminder has_state
|
|
917
|
+
|
|
835
918
|
local usecase phase branch agg_branch
|
|
836
919
|
usecase=$(state_get "usecase")
|
|
837
920
|
phase=$(state_get "phase")
|
|
838
921
|
branch=$(state_get "branch")
|
|
839
922
|
agg_branch=$(state_get "aggregate_branch")
|
|
840
923
|
|
|
924
|
+
local phase_ja_label
|
|
925
|
+
phase_ja_label=$(phase_ja "$phase")
|
|
926
|
+
|
|
841
927
|
echo ""
|
|
842
928
|
echo -e "${BOLD}════════════════════════════════════════${NC}"
|
|
843
929
|
echo -e "${BOLD} 現在の作業状況${NC}"
|
|
844
930
|
echo -e "${BOLD}════════════════════════════════════════${NC}"
|
|
845
931
|
echo -e " ユースケース : ${CYAN}$usecase${NC}"
|
|
846
|
-
echo -e " フェーズ : ${YELLOW}$
|
|
932
|
+
echo -e " フェーズ : ${YELLOW}$phase_ja_label${NC}"
|
|
847
933
|
echo -e " ブランチ : ${BLUE}$branch${NC}"
|
|
848
934
|
[[ -n "$agg_branch" ]] && echo -e " 集約ブランチ: ${BLUE}$agg_branch${NC}"
|
|
849
935
|
echo ""
|
|
@@ -854,63 +940,64 @@ cmd_status() {
|
|
|
854
940
|
domain_model_reviewed usecase_design_reviewed \
|
|
855
941
|
table_design_reviewed infra_design_reviewed \
|
|
856
942
|
test_design_reviewed test_code_committed; do
|
|
857
|
-
local val
|
|
943
|
+
local val gate_label
|
|
858
944
|
val=$(state_get "gates.$gate")
|
|
945
|
+
gate_label=$(gate_ja "$gate")
|
|
859
946
|
if [[ "$val" == "true" ]]; then
|
|
860
|
-
echo -e " ${GREEN}✓${NC} $
|
|
947
|
+
echo -e " ${GREEN}✓${NC} $gate_label"
|
|
861
948
|
else
|
|
862
|
-
echo -e " ${RED}✗${NC} $
|
|
949
|
+
echo -e " ${RED}✗${NC} $gate_label"
|
|
863
950
|
fi
|
|
864
951
|
done
|
|
865
952
|
|
|
866
953
|
echo ""
|
|
867
|
-
echo -e "${BOLD} 次にやるべきこと${NC}"
|
|
954
|
+
echo -e "${BOLD} 次にやるべきこと${NC} ${CYAN}(チャットでは /sr-* スラッシュコマンドが使えます)${NC}"
|
|
868
955
|
local req_file high_file
|
|
869
956
|
req_file=$(uc_req)
|
|
870
957
|
high_file=$(uc_high)
|
|
871
958
|
case "$phase" in
|
|
872
959
|
require)
|
|
873
960
|
echo -e " 1. ${CYAN}$req_file${NC} を編集"
|
|
874
|
-
echo -e " 2.
|
|
875
|
-
echo -e " 3.
|
|
876
|
-
echo -e " 4.
|
|
961
|
+
echo -e " 2. /sr-レビュー $req_file"
|
|
962
|
+
echo -e " 3. /sr-ゲート設定 glossary_checked"
|
|
963
|
+
echo -e " 4. /sr-概要設計"
|
|
877
964
|
;;
|
|
878
965
|
design-high)
|
|
879
966
|
echo -e " 1. ${CYAN}$high_file${NC} を編集"
|
|
880
|
-
echo -e " 2.
|
|
881
|
-
echo -e " 3.
|
|
967
|
+
echo -e " 2. /sr-レビュー $high_file"
|
|
968
|
+
echo -e " 3. /sr-詳細設計 domain"
|
|
882
969
|
;;
|
|
883
|
-
design-detail)
|
|
970
|
+
design-detail*)
|
|
884
971
|
if [[ "$(state_get "gates.domain_model_reviewed")" != "true" ]]; then
|
|
885
|
-
echo -e " 1. docs/
|
|
886
|
-
echo -e " 2.
|
|
972
|
+
echo -e " 1. docs/03_詳細設計/$(uc_slug)/ドメイン.md を編集"
|
|
973
|
+
echo -e " 2. /sr-レビュー のあと /sr-詳細設計 usecase"
|
|
887
974
|
elif [[ "$(state_get "gates.usecase_design_reviewed")" != "true" ]]; then
|
|
888
|
-
echo -e " 1. docs/
|
|
889
|
-
echo -e " 2.
|
|
975
|
+
echo -e " 1. docs/03_詳細設計/$(uc_slug)/ユースケース.md を編集"
|
|
976
|
+
echo -e " 2. /sr-レビュー のあと /sr-詳細設計 table"
|
|
890
977
|
elif [[ "$(state_get "gates.table_design_reviewed")" != "true" ]]; then
|
|
891
|
-
echo -e " 1. docs/
|
|
892
|
-
echo -e " 2.
|
|
978
|
+
echo -e " 1. docs/03_詳細設計/$(uc_slug)/テーブル.md を編集"
|
|
979
|
+
echo -e " 2. /sr-レビュー のあと /sr-詳細設計 infra"
|
|
893
980
|
elif [[ "$(state_get "gates.infra_design_reviewed")" != "true" ]]; then
|
|
894
|
-
echo -e " 1. docs/
|
|
895
|
-
echo -e " 2.
|
|
981
|
+
echo -e " 1. docs/03_詳細設計/$(uc_slug)/インフラ.md を編集"
|
|
982
|
+
echo -e " 2. /sr-レビュー のあと /sr-テスト設計"
|
|
896
983
|
else
|
|
897
|
-
echo -e "
|
|
984
|
+
echo -e " /sr-テスト設計"
|
|
898
985
|
fi
|
|
899
986
|
;;
|
|
900
987
|
test-design)
|
|
901
|
-
echo -e " 1. docs/
|
|
902
|
-
echo -e " 2. テストコードをコミット →
|
|
903
|
-
echo -e " 3.
|
|
904
|
-
echo -e " 4.
|
|
988
|
+
echo -e " 1. docs/04_テスト設計/$(uc_slug).md を編集し、テストコードを書く(Red)"
|
|
989
|
+
echo -e " 2. テストコードをコミット → /sr-ゲート設定 test_code_committed"
|
|
990
|
+
echo -e " 3. /sr-レビュー docs/04_テスト設計/$(uc_slug).md"
|
|
991
|
+
echo -e " 4. /sr-実装"
|
|
905
992
|
;;
|
|
906
993
|
implement)
|
|
907
|
-
echo -e " 実装してテストを Green にしたら:
|
|
994
|
+
echo -e " 実装してテストを Green にしたら: /sr-完了"
|
|
908
995
|
;;
|
|
909
996
|
complete)
|
|
910
997
|
echo -e " 完了。PR を作成してマージしてください。"
|
|
911
998
|
;;
|
|
912
999
|
fix)
|
|
913
|
-
echo -e " 案内に従って該当ドキュメントを修正し、必要なら
|
|
1000
|
+
echo -e " 案内に従って該当ドキュメントを修正し、必要なら /sr-詳細設計 等から再実行。"
|
|
914
1001
|
;;
|
|
915
1002
|
*)
|
|
916
1003
|
echo -e " ./scripts/spec-runner.sh help でコマンド一覧を確認"
|
|
@@ -962,22 +1049,22 @@ cmd_fix() {
|
|
|
962
1049
|
1)
|
|
963
1050
|
info "ドメインモデルから再設計します"
|
|
964
1051
|
info "修正ファイル:"
|
|
965
|
-
info " docs/
|
|
966
|
-
info " docs/
|
|
967
|
-
info " docs/
|
|
1052
|
+
info " docs/03_詳細設計/$(uc_slug)/ドメイン.md → status: draft に戻す"
|
|
1053
|
+
info " docs/03_詳細設計/$(uc_slug)/ユースケース.md → 再確認"
|
|
1054
|
+
info " docs/04_テスト設計/$(uc_slug).md → 再確認"
|
|
968
1055
|
;;
|
|
969
1056
|
2)
|
|
970
1057
|
info "ユースケース設計から修正します"
|
|
971
|
-
info " docs/
|
|
972
|
-
info " docs/
|
|
1058
|
+
info " docs/03_詳細設計/$(uc_slug)/ユースケース.md → status: draft に戻す"
|
|
1059
|
+
info " docs/04_テスト設計/$(uc_slug).md → 再確認"
|
|
973
1060
|
;;
|
|
974
1061
|
3)
|
|
975
1062
|
info "インフラ設計から修正します"
|
|
976
|
-
info " docs/
|
|
1063
|
+
info " docs/03_詳細設計/$(uc_slug)/インフラ.md → status: draft に戻す"
|
|
977
1064
|
;;
|
|
978
1065
|
4)
|
|
979
1066
|
info "テーブル設計から修正します"
|
|
980
|
-
info " docs/
|
|
1067
|
+
info " docs/03_詳細設計/$(uc_slug)/テーブル.md → status: draft に戻す"
|
|
981
1068
|
;;
|
|
982
1069
|
5)
|
|
983
1070
|
info "テストを追加して実装を修正します"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# templates/ の役割
|
|
2
|
+
|
|
3
|
+
DDD の用語をそのまま表すため、**フォルダ名・ファイル名はすべて日本語**。
|
|
4
|
+
ドキュメントの並び順のため **先頭に番号**(01_〜04_、99_)を付けている。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 生成用テンプレート(スクリプトが参照してファイルを生成する)
|
|
9
|
+
|
|
10
|
+
| フォルダ | 用途 | 生成先 |
|
|
11
|
+
|----------|------|--------|
|
|
12
|
+
| `01_要件定義/` | init | `docs/01_要件/<ユースケース名>.md`(1 UC ごとに 1 本) |
|
|
13
|
+
| `99_設計判断記録/` | 手動でコピー | `docs/99_設計判断記録/001-xxx.md` など(ADR を増やすとき) |
|
|
14
|
+
| `03_詳細設計/` | design-detail | `docs/03_詳細設計/<UC>/ドメイン.md` など(1 UC ごとに 4 本) |
|
|
15
|
+
|
|
16
|
+
→ ユーザー側でも **`templates/` に残ったまま**。スクリプトがここを**参照**して生成する。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 2. 初期ドキュメント(deploy 時に docs/ へそのままコピーする)
|
|
21
|
+
|
|
22
|
+
| フォルダ | 内容 |
|
|
23
|
+
|----------|------|
|
|
24
|
+
| `初期ドキュメント/` | 01_憲章・02_仕様・03_用語集・テンプレート一覧・振り返り・99_設計判断記録用 .gitkeep |
|
|
25
|
+
|
|
26
|
+
コピー後はユーザーが **`docs/01_憲章.md` などを直接編集**する。
|
|
27
|
+
|
|
28
|
+
→ ユーザー側では **`docs/`** に現れる。`templates/初期ドキュメント/` は deploy 後も残るが、編集するのは `docs/` の方。
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
**まとめ**: 「生成用」= テンプレートを**元に**スクリプトがファイルを**生成**する。「初期ドキュメント」= 中身を**そのまま** `docs/` に**コピー**して初期状態にする。**99_** は設計判断記録(ADR)用で最後に並ぶ。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# プロジェクト憲章(Constitution)
|
|
2
|
+
|
|
3
|
+
> このプロジェクト全体に適用する**不変の原則**。技術やツールに依存しない。
|
|
4
|
+
> 機能ごとの仕様は `docs/02_仕様.md` と各ユースケースの `docs/01_要件/` に書く。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 目的・スコープの原則
|
|
9
|
+
|
|
10
|
+
- このプロジェクトで**何を**作るか・**誰のため**かは、憲章ではなく `docs/02_仕様.md` で定義する。
|
|
11
|
+
- 憲章は「**どういうルールで**開発するか」だけを定める。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 品質・開発ルール(非交渉可能)
|
|
16
|
+
|
|
17
|
+
1. **設計先行**
|
|
18
|
+
実装前に要件・概要設計・詳細設計のいずれかを書く。フェーズゲートを通過するまで実装に進まない。
|
|
19
|
+
|
|
20
|
+
2. **用語の一意性**
|
|
21
|
+
ドメインの概念は `docs/03_用語集.md` に定義し、設計・実装で一貫して使う。
|
|
22
|
+
|
|
23
|
+
3. **レビュー通過**
|
|
24
|
+
各フェーズの成果物は `review-pass` で通過してから次に進む。スキップしない。
|
|
25
|
+
|
|
26
|
+
4. **変更のトレーサビリティ**
|
|
27
|
+
設計判断は `docs/99_設計判断記録/` に記録する。大きな方針変更は憲章の改訂として扱う。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 改訂・バージョン
|
|
32
|
+
|
|
33
|
+
- 憲章の変更は**意図を明示**し、必要なら履歴をこのファイルの末尾に追記する。
|
|
34
|
+
- 破壊的なルール変更は、チームの合意のうえで行う。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## フォルダ・アートファクトの原則(例)
|
|
39
|
+
|
|
40
|
+
- ドメインは UseCase / Infrastructure に依存しない。
|
|
41
|
+
- 設計ドキュメント(`docs/`)はコードと同期し、変更時は同時に更新する。
|
|
42
|
+
- 上記は例。プロジェクトに合わせて**この節を編集**し、「このプロジェクトのフォルダ構成や成果物のルール」を書く。
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
<!-- 改訂履歴(任意)
|
|
47
|
+
- YYYY-MM-DD: 初版
|
|
48
|
+
-->
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# プロジェクト仕様(Specify)
|
|
2
|
+
|
|
3
|
+
> **何を作るか・なぜ作るか**をプロジェクト全体のスコープとして書く。
|
|
4
|
+
> 個別機能の詳細は各ユースケースの `docs/01_要件/<ユースケース名>.md` に書く。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## このプロジェクトで作るもの
|
|
9
|
+
|
|
10
|
+
(1〜2文で。例: 「会員向けのタスク管理 Web アプリ。ログイン・タスクの CRUD・共有機能を提供する。」)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 作る理由・背景
|
|
15
|
+
|
|
16
|
+
(なぜこれが必要か。誰の課題を解くか。ビジネス・文脈を短く。)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## スコープ(含む / 含まない)
|
|
21
|
+
|
|
22
|
+
| 含む | 含まない |
|
|
23
|
+
|------|----------|
|
|
24
|
+
| (例: 会員登録・ログイン・タスク CRUD) | (例: 課金・他システム連携) |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 想定ユーザー・コンテキスト
|
|
29
|
+
|
|
30
|
+
- **誰が**使うか
|
|
31
|
+
- **どのような状況**で使うか(任意)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 参照
|
|
36
|
+
|
|
37
|
+
- プロジェクトの不変原則: `docs/01_憲章.md`
|
|
38
|
+
- 用語定義: `docs/03_用語集.md`
|
|
39
|
+
- 各機能の要件: `docs/01_要件/<ユースケース名>.md`
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# 生成用テンプレート一覧
|
|
2
|
+
|
|
3
|
+
すべて **`templates/`** 以下に集約されている。スクリプトがここからファイルを生成する。
|
|
4
|
+
|
|
5
|
+
| パス | 用途 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| `templates/01_要件定義/ひな形.md` | init 時に `docs/01_要件/<ユースケース名>.md` を生成。`{{USECASE}}`, `{{DATE}}` を置換。 |
|
|
8
|
+
| `templates/99_設計判断記録/ひな形.md` | 新規 ADR のひな形。`docs/99_設計判断記録/` にもコピー済み。手動でコピーして番号・タイトルを付ける。 |
|
|
9
|
+
| `templates/03_詳細設計/ドメイン.md` | design-detail domain 時に `docs/03_詳細設計/<UC>/ドメイン.md` を生成。 |
|
|
10
|
+
| `templates/03_詳細設計/ユースケース.md` | design-detail usecase 時に `docs/03_詳細設計/<UC>/ユースケース.md` を生成。 |
|
|
11
|
+
| `templates/03_詳細設計/テーブル.md` | design-detail table 時に `docs/03_詳細設計/<UC>/テーブル.md` を生成。 |
|
|
12
|
+
| `templates/03_詳細設計/インフラ.md` | design-detail infra 時に `docs/03_詳細設計/<UC>/インフラ.md` を生成。 |
|
|
13
|
+
|
|
14
|
+
詳細設計テンプレートは `{{USECASE}}`, `{{DATE}}` をスクリプトが置換する。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# /sr
|
|
1
|
+
# /sr-ゲート設定
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**チャットで使うコマンド**。$ARGUMENTS にゲート名を指定し、以下を**ターミナルで実行**してください(例: `/sr-ゲート設定 glossary_checked`)。
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
./scripts/spec-runner.sh set-gate $ARGUMENTS
|