spec-runner 1.0.22 → 1.0.24

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.22",
3
+ "version": "1.0.24",
4
4
  "description": "フェーズ駆動で設計先行を強制。npx で .spec-runner を展開し、次のステップ .md に従って進める",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -18,6 +18,11 @@ REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || echo ".")
18
18
  cd "$REPO_ROOT"
19
19
  BRANCH_DIR="$(cd "$(dirname "$0")" && pwd)"
20
20
 
21
+ # Git 未初期化ワークスペースでは最小構成で初期化する(main を既定化)
22
+ if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
23
+ git init -b main >/dev/null 2>&1 || git init >/dev/null 2>&1
24
+ fi
25
+
21
26
  YES_MODE=false
22
27
  ARGS=()
23
28
  for a in "$@"; do
@@ -44,6 +49,17 @@ BRANCH_PREFIX="$(jq -r '.naming.branch_prefix' "$PROJECT_JSON")"
44
49
  exit 1
45
50
  }
46
51
 
52
+ # 憲章の未コミット変更があれば、AI によるレビュー付きコミットを先に行う
53
+ CHARTER_DOC="$REPO_ROOT/docs/01_憲章/憲章.md"
54
+ if [[ -f "$CHARTER_DOC" ]]; then
55
+ if [[ -n "$(git status --porcelain -- "$CHARTER_DOC")" ]]; then
56
+ echo "Error: 憲章に未コミット変更があります: $CHARTER_DOC" >&2
57
+ echo " 先に AI に差分を確認させ、適切なコミットメッセージでコミットしてください。" >&2
58
+ echo " その後に uc-next-start.sh を再実行してください。" >&2
59
+ exit 1
60
+ fi
61
+ fi
62
+
47
63
  next_uc_id() {
48
64
  # docs/02_ユースケース仕様/<カテゴリ>/UC-*.md から次に使う UC-N を返す
49
65
  local dir="$REPO_ROOT/docs/02_ユースケース仕様"
@@ -158,8 +174,20 @@ if [[ "$YES_MODE" != true ]]; then
158
174
  esac
159
175
  fi
160
176
 
161
- git checkout "$MAIN_BRANCH"
162
- git pull --ff-only 2>/dev/null || true
177
+ # 初回コミット前(unborn HEAD)は checkout main が失敗し得るためフォールバックする
178
+ if git rev-parse --verify HEAD >/dev/null 2>&1; then
179
+ git checkout "$MAIN_BRANCH"
180
+ git pull --ff-only 2>/dev/null || true
181
+ else
182
+ CURRENT_HEAD="$(git symbolic-ref --short -q HEAD 2>/dev/null || echo "")"
183
+ if [[ -z "$MAIN_BRANCH" ]]; then
184
+ MAIN_BRANCH="${CURRENT_HEAD:-main}"
185
+ fi
186
+ if [[ "$CURRENT_HEAD" != "$MAIN_BRANCH" ]]; then
187
+ git checkout -b "$MAIN_BRANCH" >/dev/null 2>&1 || true
188
+ fi
189
+ echo "Info: 初回コミット前のため pull はスキップします。"
190
+ fi
163
191
 
164
192
  # ブランチ作成 + UC 仕様書作成(統合)
165
193
  UC_ID_PATTERN="^${UC_ID_RE}$"
@@ -288,7 +288,11 @@ run_phase() {
288
288
  local kind="$1" # clarified | analyzed
289
289
  local scope="$2" # charter | domain | architecture | uc
290
290
  local key="$3"
291
- jq -e --arg k "$key" --arg s "$scope" ".quality.${kind}[\$s][]? == \$k" "$LOCK_FILE" >/dev/null 2>&1
291
+ # 互換性のため、quality には「ベース名」と「.md 付き」の両方を許容する
292
+ local key_md="${key}.md"
293
+ jq -e --arg k "$key" --arg km "$key_md" --arg s "$scope" \
294
+ ".quality.${kind}[\$s][]? | select(. == \$k or . == \$km)" \
295
+ "$LOCK_FILE" >/dev/null 2>&1
292
296
  }
293
297
 
294
298
  resolve_step() {
@@ -18,6 +18,7 @@ primary_output: docs/02_ユースケース仕様/<カテゴリ>/UC-N-xxx.md
18
18
  ## ユーザー入力
19
19
 
20
20
  `$ARGUMENTS` が機能説明。空でコマンドしていない限り、繰り返し入力を求めない。
21
+ ただし **`$ARGUMENTS` が空** の場合は停止せず、AI 側で候補提案を行ってユーザー選択に進む。
21
22
 
22
23
  ```text
23
24
  $ARGUMENTS
@@ -41,6 +42,17 @@ $ARGUMENTS
41
42
  - まず作る 1 件(最小価値)
42
43
  - 合意後は **1 件ずつ** `uc-next-start.sh` で作成する(CRUD は原則別 UC)。
43
44
 
45
+ ### 0.5. 引数なし時の候補提示(必須)
46
+
47
+ - 条件: `$ARGUMENTS` が空。
48
+ - 挙動:
49
+ 1. AI がこのプロジェクト向けの機能案を **3〜5 件**提示する。
50
+ 2. 各案は 1 行で、`案N: 目的 / 主な利用者 / 想定カテゴリ` の形式で簡潔に示す。
51
+ 3. 「番号で選択」または「自由入力で別案指定」を案内する。
52
+ 4. **ユーザーが選ぶまで `uc-next-start.sh` を実行しない**。
53
+ - ユーザー回答後:
54
+ - 選択された案(または自由入力文)を今回の機能説明として扱い、以降のステップを通常どおり実行する。
55
+
44
56
  ### 1. ブランチ用短名(2〜4 語)
45
57
 
46
58
  - 機能説明からキーワード抽出。**ブランチ名は ASCII のみ**、kebab-case(例: order-placement, user-auth)。
@@ -50,6 +62,7 @@ $ARGUMENTS
50
62
 
51
63
  ### 2. ブランチと仕様の作成
52
64
 
65
+ - `docs/01_憲章/憲章.md` は先に確定する。未コミット差分がある場合は、**AI が差分を確認してコミットメッセージを作成し、コミット完了後**に `uc-next-start.sh` を実行する。
53
66
  - `.spec-runner/scripts/branch/uc-next-start.sh [UC-ID] "$SLUG" "$TITLE" "$CATEGORY" [--yes]`
54
67
  - UC-ID は省略可(省略時は自動採番)。**SLUG / TITLE / CATEGORY は必須**(空文字禁止)。
55
68
  - CATEGORY で配置先が決まる(カテゴリ名は日本語可)。**機能ごとに 1 回だけ**。
@@ -65,7 +78,7 @@ $ARGUMENTS
65
78
 
66
79
  ### 4. 本文生成の内訳
67
80
 
68
- 1. 入力パース。空なら ERROR「機能説明が指定されていません」
81
+ 1. 入力パース。空なら「0.5 引数なし時の候補提示」を実施し、選択後に続行する(即 ERROR にしない)
69
82
  2. 重要概念(アクター・アクション・データ・制約)
70
83
  3. 不明点: **推測で確定しない** → **`[要確認: ...]`**。付けるのは影響大・解釈複数・デフォルト無しのときのみ。**上限 3 個**。優先: スコープ > セキュリティ > UX > 技術詳細
71
84
  4. 「ユーザーシナリオとテスト」を埋める。フロー特定できなければ ERROR