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.
Files changed (69) hide show
  1. package/README.md +64 -24
  2. package/bin/spec-runner.js +23 -5
  3. package/package.json +1 -1
  4. package/templates/base/.github/PULL_REQUEST_TEMPLATE.md +11 -11
  5. package/templates/base/.github/workflows/phase-gate-check.yml +22 -22
  6. package/templates/base/scripts/spec-runner.sh +158 -71
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. package/templates/base/templates/README.md +32 -0
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. package/templates/claude/.claude/commands/sr-/343/203/254/343/203/223/343/203/245/343/203/274.md +9 -0
  21. package/templates/claude/.claude/commands/sr-/344/273/225/346/247/230.md +9 -0
  22. package/templates/claude/.claude/commands/{sr-fix.md → sr-/344/277/256/346/255/243.md} +2 -2
  23. package/templates/claude/.claude/commands/{sr-init.md → sr-/345/210/235/346/234/237/345/214/226.md} +3 -3
  24. package/templates/claude/.claude/commands/{sr-complete.md → sr-/345/256/214/344/272/206.md} +1 -1
  25. package/templates/claude/.claude/commands/{sr-implement.md → sr-/345/256/237/350/243/205.md} +1 -1
  26. package/templates/claude/.claude/commands/sr-/346/206/262/347/253/240.md +9 -0
  27. package/templates/claude/.claude/commands/sr-/346/246/202/350/246/201/350/250/255/350/250/210.md +9 -0
  28. package/templates/{cursor/.cursor/commands/sr-status.md → claude/.claude/commands/sr-/347/212/266/346/205/213.md} +1 -1
  29. package/templates/claude/.claude/commands/{sr-hotfix.md → sr-/347/267/212/346/200/245/344/277/256/346/255/243.md} +2 -2
  30. package/templates/{cursor/.cursor/commands/sr-configure.md → claude/.claude/commands/sr-/350/250/255/345/256/232.md} +2 -2
  31. 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
  32. package/templates/claude/.claude/hooks/pre-tool-use.sh +1 -1
  33. package/templates/claude/CLAUDE.md +22 -22
  34. package/templates/copilot/.github/copilot-instructions.md +1 -1
  35. 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
  36. 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
  37. 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
  38. package/templates/copilot/.github/prompts/sr-/344/273/225/346/247/230.prompt.md +13 -0
  39. package/templates/copilot/.github/prompts/{sr-fix.prompt.md → sr-/344/277/256/346/255/243.prompt.md} +1 -1
  40. package/templates/copilot/.github/prompts/{sr-init.prompt.md → sr-/345/210/235/346/234/237/345/214/226.prompt.md} +3 -3
  41. package/templates/copilot/.github/prompts/{sr-complete.prompt.md → sr-/345/256/214/344/272/206.prompt.md} +1 -1
  42. package/templates/copilot/.github/prompts/{sr-implement.prompt.md → sr-/345/256/237/350/243/205.prompt.md} +1 -1
  43. package/templates/copilot/.github/prompts/sr-/346/206/262/347/253/240.prompt.md +13 -0
  44. 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
  45. package/templates/copilot/.github/prompts/{sr-status.prompt.md → sr-/347/212/266/346/205/213.prompt.md} +1 -1
  46. 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
  47. package/templates/copilot/.github/prompts/{sr-configure.prompt.md → sr-/350/250/255/345/256/232.prompt.md} +1 -1
  48. 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
  49. package/templates/cursor/.cursor/commands/sr-/343/202/262/343/203/274/343/203/210/350/250/255/345/256/232.md +9 -0
  50. 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
  51. package/templates/cursor/.cursor/commands/sr-/343/203/254/343/203/223/343/203/245/343/203/274.md +9 -0
  52. package/templates/cursor/.cursor/commands/sr-/344/273/225/346/247/230.md +9 -0
  53. package/templates/cursor/.cursor/commands/{sr-fix.md → sr-/344/277/256/346/255/243.md} +2 -2
  54. package/templates/cursor/.cursor/commands/{sr-init.md → sr-/345/210/235/346/234/237/345/214/226.md} +3 -3
  55. package/templates/cursor/.cursor/commands/{sr-complete.md → sr-/345/256/214/344/272/206.md} +1 -1
  56. package/templates/cursor/.cursor/commands/{sr-implement.md → sr-/345/256/237/350/243/205.md} +1 -1
  57. package/templates/cursor/.cursor/commands/sr-/346/206/262/347/253/240.md +9 -0
  58. package/templates/cursor/.cursor/commands/sr-/346/246/202/350/246/201/350/250/255/350/250/210.md +9 -0
  59. package/templates/{claude/.claude/commands/sr-status.md → cursor/.cursor/commands/sr-/347/212/266/346/205/213.md} +1 -1
  60. package/templates/cursor/.cursor/commands/{sr-hotfix.md → sr-/347/267/212/346/200/245/344/277/256/346/255/243.md} +2 -2
  61. package/templates/{claude/.claude/commands/sr-configure.md → cursor/.cursor/commands/sr-/350/250/255/345/256/232.md} +2 -2
  62. 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
  63. package/templates/claude/.claude/commands/sr-design-high.md +0 -9
  64. package/templates/claude/.claude/commands/sr-review.md +0 -9
  65. package/templates/cursor/.cursor/commands/sr-design-high.md +0 -9
  66. package/templates/cursor/.cursor/commands/sr-review.md +0 -9
  67. package/templates/cursor/.cursor/commands/sr-set-gate.md +0 -9
  68. /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
  69. /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/review/debt.md"
31
- GLOSSARY="$PROJECT_ROOT/docs/glossary.md"
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/requirements/$(uc_slug).md"; }
201
- uc_high() { echo "$PROJECT_ROOT/docs/high-level/$(uc_slug).md"; }
202
- uc_detail() { echo "$PROJECT_ROOT/docs/detailed/$(uc_slug)"; }
203
- uc_test() { echo "$PROJECT_ROOT/docs/test-design/$(uc_slug).md"; }
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/requirement/template.md"
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" "glossary.md の確認済み" || ((errors++))
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
- <!-- glossary.md の日本語名で書く -->
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/domain.md" "ドメインモデル設計" || ((errors++))
479
- check_status "$detail_dir/domain.md" "reviewed" "ドメインモデルのレビュー" || ((errors++))
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/domain.md" "ドメインモデル設計" || ((errors++))
483
- check_status "$detail_dir/domain.md" "reviewed" "ドメインモデルのレビュー" || ((errors++))
484
- check_file "$detail_dir/usecase.md" "ユースケース設計" || ((errors++))
485
- check_status "$detail_dir/usecase.md" "reviewed" "ユースケース設計のレビュー" || ((errors++))
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/domain.md" "ドメインモデル設計" || ((errors++))
489
- check_status "$detail_dir/domain.md" "reviewed" "ドメインモデルのレビュー" || ((errors++))
490
- check_file "$detail_dir/usecase.md" "ユースケース設計" || ((errors++))
491
- check_status "$detail_dir/usecase.md" "reviewed" "ユースケース設計のレビュー" || ((errors++))
492
- check_file "$detail_dir/table.md" "テーブル設計" || ((errors++))
493
- check_status "$detail_dir/table.md" "reviewed" "テーブル設計のレビュー" || ((errors++))
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/$sub.md"
520
+ dest_file="$detail_dir/${sub_ja}.md"
511
521
  mkdir -p "$detail_dir"
512
522
 
513
- local tmpl="$PROJECT_ROOT/templates/detailed/$sub.md"
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 sub in domain usecase table infra; do
557
- check_file "$detail_dir/$sub.md" "詳細設計/$sub.md" || ((errors++))
558
- check_status "$detail_dir/$sub.md" "reviewed" "詳細設計/$sub.md のレビュー" || ((errors++))
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チェック(必要なADRが作成されているか確認を促す)
571
+ # 設計判断記録チェック(ADR が 1 件もない場合に促す)
562
572
  local adr_count
563
- adr_count=$(find "$PROJECT_ROOT/docs/adr" -name "*.md" ! -name "TEMPLATE.md" 2>/dev/null | wc -l | tr -d ' ')
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/adr/ にADRが1件もありません。設計判断があればADRを作成してください"
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
- *requirements*)
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 "次: glossary.md を確認後 ./scripts/spec-runner.sh set-gate glossary_checked"
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
- *high-level*)
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
- *domain*)
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
- *usecase*)
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
- *table*)
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
- *infra*)
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
- *test-design*)
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 "開始するには: ./scripts/spec-runner.sh init <ユースケース名>"
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}$phase${NC}"
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} $gate"
947
+ echo -e " ${GREEN}✓${NC} $gate_label"
861
948
  else
862
- echo -e " ${RED}✗${NC} $gate"
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. ./scripts/spec-runner.sh review-pass $req_file"
875
- echo -e " 3. ./scripts/spec-runner.sh set-gate glossary_checked"
876
- echo -e " 4. ./scripts/spec-runner.sh design-high"
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. ./scripts/spec-runner.sh review-pass $high_file"
881
- echo -e " 3. ./scripts/spec-runner.sh design-detail domain"
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/detailed/$(uc_slug)/domain.md を編集"
886
- echo -e " 2. review-pass のあと ./scripts/spec-runner.sh design-detail usecase"
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/detailed/$(uc_slug)/usecase.md を編集"
889
- echo -e " 2. review-pass のあと ./scripts/spec-runner.sh design-detail table"
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/detailed/$(uc_slug)/table.md を編集"
892
- echo -e " 2. review-pass のあと ./scripts/spec-runner.sh design-detail infra"
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/detailed/$(uc_slug)/infra.md を編集"
895
- echo -e " 2. review-pass のあと ./scripts/spec-runner.sh test-design"
981
+ echo -e " 1. docs/03_詳細設計/$(uc_slug)/インフラ.md を編集"
982
+ echo -e " 2. /sr-レビュー のあと /sr-テスト設計"
896
983
  else
897
- echo -e " ./scripts/spec-runner.sh test-design"
984
+ echo -e " /sr-テスト設計"
898
985
  fi
899
986
  ;;
900
987
  test-design)
901
- echo -e " 1. docs/test-design/$(uc_slug).md を編集し、テストコードを書く(Red)"
902
- echo -e " 2. テストコードをコミット → ./scripts/spec-runner.sh set-gate test_code_committed"
903
- echo -e " 3. ./scripts/spec-runner.sh review-pass docs/test-design/$(uc_slug).md"
904
- echo -e " 4. ./scripts/spec-runner.sh implement"
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 にしたら: ./scripts/spec-runner.sh complete"
994
+ echo -e " 実装してテストを Green にしたら: /sr-完了"
908
995
  ;;
909
996
  complete)
910
997
  echo -e " 完了。PR を作成してマージしてください。"
911
998
  ;;
912
999
  fix)
913
- echo -e " 案内に従って該当ドキュメントを修正し、必要なら design-detail 等から再実行。"
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/detailed/$(uc_slug)/domain.md → status: draft に戻す"
966
- info " docs/detailed/$(uc_slug)/usecase.md → 再確認"
967
- info " docs/test-design/$(uc_slug).md → 再確認"
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/detailed/$(uc_slug)/usecase.md → status: draft に戻す"
972
- info " docs/test-design/$(uc_slug).md → 再確認"
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/detailed/$(uc_slug)/infra.md → status: draft に戻す"
1063
+ info " docs/03_詳細設計/$(uc_slug)/インフラ.md → status: draft に戻す"
977
1064
  ;;
978
1065
  4)
979
1066
  info "テーブル設計から修正します"
980
- info " docs/detailed/$(uc_slug)/table.md → status: draft に戻す"
1067
+ info " docs/03_詳細設計/$(uc_slug)/テーブル.md → status: draft に戻す"
981
1068
  ;;
982
1069
  5)
983
1070
  info "テストを追加して実装を修正します"
@@ -0,0 +1,14 @@
1
+ ---
2
+ title: {{USECASE}} インフラ設計
3
+ status: draft
4
+ created: {{DATE}}
5
+ updated: {{DATE}}
6
+ ---
7
+
8
+ # {{USECASE}} インフラ設計
9
+
10
+ ## API エンドポイント
11
+
12
+ ## リポジトリ実装方針
13
+
14
+ ## フロントエンド構成(該当時)
@@ -0,0 +1,17 @@
1
+ ---
2
+ title: {{USECASE}} テーブル設計
3
+ status: draft
4
+ created: {{DATE}}
5
+ updated: {{DATE}}
6
+ ---
7
+
8
+ # {{USECASE}} テーブル設計
9
+
10
+ ## ER(Mermaid)
11
+
12
+ ```mermaid
13
+ erDiagram
14
+ <!-- ドメインモデル ≠ テーブル。用途で分けてよい -->
15
+ ```
16
+
17
+ ## カラム・制約
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: {{USECASE}} ドメインモデル設計
3
+ status: draft
4
+ created: {{DATE}}
5
+ updated: {{DATE}}
6
+ ---
7
+
8
+ # {{USECASE}} ドメインモデル設計
9
+
10
+ ## エンティティ・値オブジェクト
11
+
12
+ <!-- docs/03_用語集.md の用語を使う -->
13
+
14
+ ## 集約・リポジトリ IF
15
+
16
+ ## ドメインイベント
17
+
18
+ ## 振る舞い(メソッド)
@@ -0,0 +1,12 @@
1
+ ---
2
+ title: {{USECASE}} ユースケース設計
3
+ status: draft
4
+ created: {{DATE}}
5
+ updated: {{DATE}}
6
+ ---
7
+
8
+ # {{USECASE}} ユースケース設計
9
+
10
+ ## Command / Query の入出力
11
+
12
+ ## シーケンス(ドメインモデル参照)
@@ -43,4 +43,4 @@ CIがこのセクションを読んでファイル存在チェックする。
43
43
 
44
44
  ## 影響
45
45
 
46
- <!-- 他の設計・ADRへの影響 -->
46
+ <!-- 他の設計・ADRへの影響 -->
@@ -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`
@@ -48,4 +48,4 @@
48
48
  1. 新しい概念 → 実装前にここへ追加
49
49
  2. 日本語名変更 → 設計ドキュメントの全使用箇所も更新
50
50
  3. 英語名変更 → コードの全使用箇所もリネーム
51
- 4. 「初出」列 → 最初に定義したドキュメントのパスを記載
51
+ 4. 「初出」列 → 最初に定義したドキュメントのパスを記載
@@ -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-set-gate
1
+ # /sr-ゲート設定
2
2
 
3
- 以下を**必ずターミナルで実行**してください。$ARGUMENTS にはゲート名を指定します(例: `/sr-set-gate glossary_checked`)。
3
+ **チャットで使うコマンド**。$ARGUMENTS にゲート名を指定し、以下を**ターミナルで実行**してください(例: `/sr-ゲート設定 glossary_checked`)。
4
4
 
5
5
  ```bash
6
6
  ./scripts/spec-runner.sh set-gate $ARGUMENTS