spec-runner 1.0.13 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-runner",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "フェーズ駆動で設計先行を強制。npx で .spec-runner を展開し、次のステップ .md に従って進める",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -1,12 +1,16 @@
1
1
  #!/usr/bin/env bash
2
2
  # 次の UC を開始する: main に切り替え、feature/UC-N-xxx ブランチを作成する。
3
3
  # 使用例:
4
- # ./uc-next-start.sh # UC 番号を自動検出。説明はプロンプトまたは "next-uc" で作成
5
- # ./uc-next-start.sh task-update # UC 番号 + 説明 "task-update" でブランチ作成
6
- # ./uc-next-start.sh task-update 認証 # 次 UC 番号 + 説明 + カテゴリ
7
- # ./uc-next-start.sh UC-2 task-update # 指定 UC + 説明
8
- # ./uc-next-start.sh UC-2 task-update 認証 # 指定 UC + 説明 + カテゴリ
9
- # ./uc-next-start.sh --yes task-update # 確認なしで実行
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 は必ず指定する
10
14
  # 実行後は次のステップに進む旨を案内する。
11
15
 
12
16
  set -e
@@ -20,8 +24,12 @@ for a in "$@"; do
20
24
  case "$a" in
21
25
  --yes|-y) YES_MODE=true ;;
22
26
  *)
23
- # 空引数は無視(例: "" "task-management" "カテゴリ")
24
- [[ -n "$a" ]] && ARGS+=("$a")
27
+ # 空引数は禁止
28
+ if [[ -z "$a" ]]; then
29
+ echo "Error: 空文字の引数は使用できません。UC-ID を省略する場合は引数自体を渡さないでください。" >&2
30
+ exit 1
31
+ fi
32
+ ARGS+=("$a")
25
33
  ;;
26
34
  esac
27
35
  done
@@ -56,60 +64,62 @@ next_uc_id() {
56
64
  }
57
65
 
58
66
  NEXT_UC="$(next_uc_id)"
59
- DESC=""
67
+ SLUG=""
68
+ TITLE=""
60
69
  CATEGORY=""
61
-
62
- # ファイル題名は日本語優先にするため、スクリプト引数の「生の説明」を保持する
63
- RAW_DESC=""
64
- if [[ ${#ARGS[@]} -ge 2 ]] && [[ "${ARGS[0]}" =~ ^${UC_ID_RE}$ ]]; then
70
+ if [[ ${#ARGS[@]} -ge 1 ]] && [[ "${ARGS[0]}" =~ ^${UC_ID_RE}$ ]]; then
71
+ [[ ${#ARGS[@]} -eq 4 ]] || {
72
+ echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
73
+ echo " - UC-ID を指定した場合は SLUG/TITLE/CATEGORY の3引数が必須です" >&2
74
+ exit 1
75
+ }
65
76
  NEXT_UC="${ARGS[0]}"
66
- DESC="${ARGS[1]}"
67
- RAW_DESC="${ARGS[1]}"
68
- CATEGORY="${ARGS[2]:-}"
69
- elif [[ ${#ARGS[@]} -ge 1 ]]; then
70
- DESC="${ARGS[0]}"
71
- RAW_DESC="${ARGS[0]}"
72
- CATEGORY="${ARGS[1]:-}"
77
+ SLUG="${ARGS[1]}"
78
+ TITLE="${ARGS[2]}"
79
+ CATEGORY="${ARGS[3]}"
80
+ else
81
+ [[ ${#ARGS[@]} -eq 3 ]] || {
82
+ echo "Usage: .spec-runner/scripts/branch/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]}"
73
89
  fi
74
90
 
75
- # 説明が無ければデフォルト(next-uc UC 番号ベース)
76
- if [[ -z "$DESC" ]]; then
77
- if [[ "$YES_MODE" == true ]]; then
78
- DESC="next-uc"
79
- else
80
- echo "次の UC 用ブランチを作成します。"
81
- echo " UC: $NEXT_UC"
82
- echo -n " 説明(英数字・ハイフン推奨。日本語のみの場合は uc-001 等にフォールバック。Enter で \"next-uc\"): "
83
- read -r DESC
84
- DESC="${DESC:-next-uc}"
85
- fi
91
+ # SLUG / TITLE / CATEGORY は必須(UC-ID のみ任意)
92
+ 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
94
+ echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
95
+ exit 1
86
96
  fi
87
97
 
88
- # 説明は英小文字・ハイフン(Git ブランチ名は ASCII のみ)。日本語など非 ASCII はサニタイズで除去される
98
+ # SLUG は英小文字・ハイフン(Git ブランチ名は ASCII のみ)
89
99
  # macOS(BSD sed) でも動くように、連続ハイフンは 's/--*/-/g' で圧縮する
90
- DESC=$(echo "$DESC" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-*//' | sed 's/-*$//')
91
- # サニタイズ後に空(日本語のみの説明など)の場合は UC 番号ベースのスラグでフォールバック
92
- [[ -z "$DESC" ]] && DESC="uc-$(echo "$NEXT_UC" | sed 's/^UC-//')"
93
- BRANCH_NAME="${BRANCH_PREFIX}/${NEXT_UC}-${DESC}"
94
-
95
- # UC 仕様書ファイル名は必ず日本語にする(題名が ASCII のみなら「要確認」にする)
96
- DOC_TITLE="$RAW_DESC"
97
- if [[ -z "$DOC_TITLE" ]]; then
98
- DOC_TITLE="要確認"
99
- else
100
- # 非ASCIIが無い(= 英数字/記号のみ)なら、日本語題名が無い扱いにして要確認へ
101
- if echo "$DOC_TITLE" | LC_ALL=C grep -q '^[ -~]*$'; then
102
- DOC_TITLE="要確認"
103
- fi
100
+ SLUG=$(echo "$SLUG" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-*//' | sed 's/-*$//')
101
+ if [[ -z "$SLUG" ]]; then
102
+ echo "Error: SLUG は英数字・ハイフンへ正規化可能な値を指定してください(例: task-management)。" >&2
103
+ exit 1
104
104
  fi
105
+ BRANCH_NAME="${BRANCH_PREFIX}/${NEXT_UC}-${SLUG}"
106
+
107
+ # UC ファイル題名
108
+ DOC_TITLE="$TITLE"
105
109
  # ファイル名に危険な文字が入らないように除去(日本語は許可)
106
110
  DOC_TITLE=$(echo "$DOC_TITLE" | sed 's/[\\\\\\/\\:\\*\\?\\\"\\<\\>\\|]/ /g' | sed 's/[[:space:]]\\+/ /g' | sed 's/^ *//; s/ *$//')
107
- [[ -z "$DOC_TITLE" ]] && DOC_TITLE="要確認"
111
+ if [[ -z "$DOC_TITLE" ]]; then
112
+ echo "Error: TITLE が不正です(危険文字除去後に空になりました)。" >&2
113
+ exit 1
114
+ fi
108
115
 
109
- # カテゴリ(省略時はデフォルト)。日本語カテゴリは許可し、危険文字だけ除去。
110
- CATEGORY="${CATEGORY:-ユースケース}"
111
- CATEGORY=$(echo "$CATEGORY" | sed 's/[^a-zA-Z0-9_ーぁ-んァ-ン一-龥\-]//g')
112
- [[ -z "$CATEGORY" ]] && CATEGORY="ユースケース"
116
+ # カテゴリは必須。日本語カテゴリは許可し、危険文字だけ除去。
117
+ # 文字レンジ指定は sed 実装差で壊れやすいため、危険文字のみを除去する。
118
+ CATEGORY=$(echo "$CATEGORY" | sed 's/[\\\/:\*\?"<>|]//g' | sed 's/[[:cntrl:]]//g' | sed 's/[[:space:]]\+/ /g' | sed 's/^ *//; s/ *$//')
119
+ if [[ -z "$CATEGORY" ]]; then
120
+ echo "Error: CATEGORY は空にできません。" >&2
121
+ exit 1
122
+ fi
113
123
 
114
124
  if git rev-parse --verify "$BRANCH_NAME" >/dev/null 2>&1; then
115
125
  echo "Error: ブランチ '$BRANCH_NAME' は既に存在します。" >&2
@@ -314,7 +314,7 @@ run_health_check() {
314
314
  for f in "$UC_ROOT"/*/UC-*.md; do
315
315
  [[ -f "$f" ]] || continue
316
316
  base=$(basename "$f" .md)
317
- if ! grep -qE '受入条件|成功基準|Given|When|Then|EARS' "$f" 2>/dev/null; then
317
+ if ! grep -qE '受入条件|成功基準|前提:|操作:|期待:|\\|[[:space:]]*前提[[:space:]]*\\|[[:space:]]*操作[[:space:]]*\\|[[:space:]]*期待[[:space:]]*\\|' "$f" 2>/dev/null; then
318
318
  drifts+=("UC ${base}: 受入条件または成功基準がありません")
319
319
  fi
320
320
  count=$(grep -c '\\[要確認:' "$f" 2>/dev/null || echo 0)
@@ -33,15 +33,20 @@ $ARGUMENTS
33
33
  ### 1. ブランチ用短名(2〜4 語)
34
34
 
35
35
  - 機能説明からキーワード抽出。**ブランチ名は ASCII のみ**、kebab-case(例: order-placement, user-auth)。
36
- - **UC ファイル名は日本語**(`UC-<N>-<題名>.md`)。未確定は `要確認`。
37
- - 技術略語(OAuth2, API, JWT)はそのまま。日本語のみで DESC が決まらない場合は日本語を渡してよい(スクリプトが `uc-N` 等にフォールバック)。
36
+ - **UC ファイル名は TITLE を使用**(`UC-<N>-<TITLE>.md`)。
37
+ - 技術略語(OAuth2, API, JWT)はそのまま。`SLUG` ASCII(kebab-case)、`TITLE` は日本語で記述する。
38
38
  - 例: 「ユーザー認証」→ user-auth / 「OAuth2 API」→ oauth2-api-integration 等。
39
39
 
40
40
  ### 2. ブランチと仕様の作成
41
41
 
42
- - `.spec-runner/scripts/branch/uc-next-start.sh [UC-ID] "$DESC" [カテゴリ] [--yes]`
43
- - UC-ID 省略で自動採番。カテゴリで配置先が決まる(カテゴリ名は日本語可)。**機能ごとに 1 回だけ**。
42
+ - `.spec-runner/scripts/branch/uc-next-start.sh [UC-ID] "$SLUG" "$TITLE" "$CATEGORY" [--yes]`
43
+ - UC-ID は省略可(省略時は自動採番)。**SLUG / TITLE / CATEGORY は必須**(空文字禁止)。
44
+ - CATEGORY で配置先が決まる(カテゴリ名は日本語可)。**機能ごとに 1 回だけ**。
44
45
  - シングルクォートはエスケープ(例: `'I'\''m Groot'`)またはダブルクォート。
46
+ - 引数の実例:
47
+ - `./.spec-runner/scripts/branch/uc-next-start.sh "task-management" "タスク管理機能追加" "タスク管理" --yes`
48
+ - `./.spec-runner/scripts/branch/uc-next-start.sh UC-2 "order-cancel" "注文キャンセル" "注文" --yes`
49
+ - `./.spec-runner/scripts/branch/uc-next-start.sh UC-3 "task-import" "タスク一括登録" "タスク管理" --yes`
45
50
 
46
51
  ### 3. テンプレ読込
47
52
 
@@ -164,6 +169,7 @@ checklists を使う場合のみ `FEATURE_DIR/checklists/requirements.md` を生
164
169
  ### 成功基準
165
170
 
166
171
  - 測定可能(時間・割合・件数等)、技術非依存、ユーザー/ビジネス結果、実装を知らず検証可能
172
+ - 受入条件は日本語フォーマット(`前提` / `操作` / `期待`)で記述する。複数件は表形式(`| 前提 | 操作 | 期待 |`)を使用する
167
173
 
168
174
  **良い例**: 「3 分以内にチェックアウト」「1 万同時ユーザー」「検索 95% が 1 秒以内」
169
175
 
@@ -6,15 +6,19 @@
6
6
 
7
7
  ## 事前条件
8
8
 
9
- ## 基本フロー(Happy Path)
9
+ ## 基本フロー
10
10
 
11
- ## 代替フロー・例外
11
+ ## 代替フロー
12
+
13
+ ## 例外
12
14
 
13
15
  ## 事後条件
14
16
 
15
- ## 受入条件(EARS記法・測定可能な成功基準)
17
+ ## 受入条件
18
+
19
+ | 前提 | 操作 | 期待 |
20
+ |------|------|------|
21
+ | <条件・前提状態> | <ユーザー操作・イベント> | <測定可能な結果> |
16
22
 
17
23
  ## 備考
18
24
 
19
- ---
20
- # changed: YYYY-MM-DD 理由(修正時のみ記入)