spec-runner 1.0.24 → 1.1.0
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 -6
- package/bin/spec-runner.js +28 -18
- package/docs/flow.md +58 -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 +129 -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 +2 -2
- 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
|
@@ -6,7 +6,7 @@ primary_output: docs/01_憲章/憲章.md
|
|
|
6
6
|
|
|
7
7
|
# 憲章策定(Phase 0: CHARTER)
|
|
8
8
|
|
|
9
|
-
**やること**: `docs/01_憲章/憲章.md` のプロジェクト憲章を作成・更新する。spec.md セクション 2(Phase 0
|
|
9
|
+
**やること**: `docs/01_憲章/憲章.md` のプロジェクト憲章を作成・更新する。spec.md セクション 2(Phase 0)に準拠する。あわせて `docs/work.md` の目的・受入条件・実装タスクを更新する。
|
|
10
10
|
|
|
11
11
|
| 項目 | 内容 |
|
|
12
12
|
|------|------|
|
package/templates/.spec-runner/steps//346/233/226/346/230/247/343/201/225/350/247/243/346/266/210.md
CHANGED
|
@@ -6,7 +6,7 @@ note: 任意フェーズで曖昧さを解消
|
|
|
6
6
|
|
|
7
7
|
# 曖昧さ解消(品質フロー)
|
|
8
8
|
|
|
9
|
-
**やること**: 任意フェーズで対象仕様(憲章 / UC 仕様 / ドメイン設計 / アーキテクチャ)の曖昧さ・不足決定を検出し、**対話で 1
|
|
9
|
+
**やること**: 任意フェーズで対象仕様(憲章 / UC 仕様 / ドメイン設計 / アーキテクチャ)の曖昧さ・不足決定を検出し、**対話で 1 問ずつ**解消して仕様ファイルに反映する。必要なら `docs/work.md` の受入条件・未解決も更新する。
|
|
10
10
|
|
|
11
11
|
| 項目 | 内容 |
|
|
12
12
|
|------|------|
|
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
リポジトリルートで次を実行します(Python 3 と `requirements-docs.txt` 用の仮想環境 `.venv-docs/` が使われます)。
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
./.
|
|
25
|
+
python3 -m venv .venv-docs && ./.venv-docs/bin/pip install -q -r requirements-docs.txt && ./.venv-docs/bin/mkdocs serve --dev-addr 127.0.0.1:8000
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
`8000` 番が使用中の場合はポートを変えられます。
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
|
|
31
|
+
python3 -m venv .venv-docs && ./.venv-docs/bin/pip install -q -r requirements-docs.txt && ./.venv-docs/bin/mkdocs serve --dev-addr 127.0.0.1:8001
|
|
32
32
|
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uc-k1-work-card-init
|
|
3
|
+
description: 新規作業の docs/work.md を初期化する
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UC-K1: Work Card 初期化スキル
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
新しい作業を始めるときに、`docs/work.md` を最小構成で初期化し、以後の仕様・実装・検証の正本にする。
|
|
11
|
+
|
|
12
|
+
## 入力
|
|
13
|
+
|
|
14
|
+
- ユーザーの自然言語要求(今回やりたいこと)
|
|
15
|
+
- 既存の `docs/work.md`(あれば上書きせず更新)
|
|
16
|
+
|
|
17
|
+
## 出力
|
|
18
|
+
|
|
19
|
+
- `docs/work.md` に以下が埋まっていること
|
|
20
|
+
- `目的`
|
|
21
|
+
- `受入条件`
|
|
22
|
+
- `実装タスク`
|
|
23
|
+
- `検証結果`(初期は未実施)
|
|
24
|
+
|
|
25
|
+
## 実行手順
|
|
26
|
+
|
|
27
|
+
1. `docs/work.md` が存在するか確認する。
|
|
28
|
+
2. なければ新規作成し、あれば今回作業分に更新する。
|
|
29
|
+
3. ユーザー要求から `目的` を 1-3 行で明文化する。
|
|
30
|
+
4. `受入条件` をテスト可能な箇条書きで 3-7 件作る。
|
|
31
|
+
5. `実装タスク` をチェックボックス(`- [ ]`)で作る。
|
|
32
|
+
6. 初期タスクに次を必ず含める。
|
|
33
|
+
- 憲章の更新確認
|
|
34
|
+
- ドメインモデル更新確認
|
|
35
|
+
- テスト設計
|
|
36
|
+
- 実装
|
|
37
|
+
7. `検証結果` は初期状態を記入する(例: 「未実施」)。
|
|
38
|
+
|
|
39
|
+
## テンプレート
|
|
40
|
+
|
|
41
|
+
```md
|
|
42
|
+
# Work Card
|
|
43
|
+
|
|
44
|
+
## 目的
|
|
45
|
+
- ...
|
|
46
|
+
|
|
47
|
+
## 受入条件
|
|
48
|
+
- [ ] ...
|
|
49
|
+
- [ ] ...
|
|
50
|
+
|
|
51
|
+
## 実装タスク
|
|
52
|
+
- [ ] 憲章の更新確認
|
|
53
|
+
- [ ] ドメインモデル更新確認
|
|
54
|
+
- [ ] テスト設計
|
|
55
|
+
- [ ] 実装
|
|
56
|
+
|
|
57
|
+
## 検証結果
|
|
58
|
+
- 未実施
|
|
59
|
+
|
|
60
|
+
## 未解決 / 見送り
|
|
61
|
+
- なし
|
|
62
|
+
|
|
63
|
+
## コミット確認(任意)
|
|
64
|
+
- [ ] 今回コミットする
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 完了条件
|
|
68
|
+
|
|
69
|
+
- `docs/work.md` が存在する
|
|
70
|
+
- `目的/受入条件/実装タスク/検証結果` が埋まっている
|
|
71
|
+
- 受入条件が実装タスクと矛盾しない
|
|
72
|
+
|
|
73
|
+
## 失敗時フォールバック
|
|
74
|
+
|
|
75
|
+
- 要求が曖昧で受入条件を書けない場合は、推測で埋めず `曖昧さ解消` を先に提案する。
|
|
76
|
+
- 既存 `docs/work.md` と競合する場合は、既存内容を保持しつつ「今回スコープ」を追記する。
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uc-k2-pre-commit-check
|
|
3
|
+
description: docs/work.md の未完了と検証漏れを検出する
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UC-K2: コミット前チェック案内スキル
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
コミット前に `docs/work.md` を確認し、未完了チェックと検証漏れを検出する。
|
|
11
|
+
|
|
12
|
+
## 入力
|
|
13
|
+
|
|
14
|
+
- なし(`docs/work.md` を読む)
|
|
15
|
+
|
|
16
|
+
## 出力
|
|
17
|
+
|
|
18
|
+
- 未完了項目の一覧
|
|
19
|
+
- 検証漏れの一覧
|
|
20
|
+
- 「今回コミットする / しない」の確認文
|
|
21
|
+
|
|
22
|
+
## 実行手順
|
|
23
|
+
|
|
24
|
+
1. `docs/work.md` を読み、`- [ ]` の未完了を抽出する。
|
|
25
|
+
2. `## 検証結果` セクションを確認し、`未実施` や空欄を検出する。
|
|
26
|
+
3. `## 受入条件` の完了状況と `## 実装タスク` の完了状況を突き合わせる。
|
|
27
|
+
4. 次の形式で結果を返す。
|
|
28
|
+
- 未完了: 箇条書き
|
|
29
|
+
- 検証漏れ: 箇条書き
|
|
30
|
+
- 判断確認: `今回コミットしますか?(する / しない)`
|
|
31
|
+
5. ユーザーが「しない」を選んだ場合、次に進むタスクを 1-3 件だけ提案する。
|
|
32
|
+
|
|
33
|
+
## 出力フォーマット
|
|
34
|
+
|
|
35
|
+
```md
|
|
36
|
+
## コミット前チェック結果
|
|
37
|
+
|
|
38
|
+
### 未完了
|
|
39
|
+
- ...
|
|
40
|
+
|
|
41
|
+
### 検証漏れ
|
|
42
|
+
- ...
|
|
43
|
+
|
|
44
|
+
### コミット確認
|
|
45
|
+
今回コミットしますか?(する / しない)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 完了条件
|
|
49
|
+
|
|
50
|
+
- `docs/work.md` の未完了項目を列挙できている
|
|
51
|
+
- 検証結果の不足有無を示せている
|
|
52
|
+
- コミット意思確認を 1 文で提示できている
|
|
53
|
+
|
|
54
|
+
## 失敗時フォールバック
|
|
55
|
+
|
|
56
|
+
- `docs/work.md` が見つからない場合は、UC-K1 で初期化してから再実行する。
|
|
57
|
+
- セクション見出しが欠けている場合は、既存内容を壊さず必要見出しの追記を提案する。
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: uc-k3-spec-impl-diff-review
|
|
3
|
+
description: 仕様と実装差分の不一致を抽出する
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UC-K3: 仕様-実装差分レビュー補助スキル
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
`docs/work.md` の受入条件と実装差分を照合し、仕様不足・実装不足・テスト不足を検出する。
|
|
11
|
+
|
|
12
|
+
## 入力
|
|
13
|
+
|
|
14
|
+
- `docs/work.md`
|
|
15
|
+
- 差分ファイル一覧(`git diff --name-only` 相当)
|
|
16
|
+
|
|
17
|
+
## 出力
|
|
18
|
+
|
|
19
|
+
- 不一致項目の一覧
|
|
20
|
+
- 仕様不足
|
|
21
|
+
- 実装不足
|
|
22
|
+
- テスト不足
|
|
23
|
+
|
|
24
|
+
## 実行手順
|
|
25
|
+
|
|
26
|
+
1. `docs/work.md` の `受入条件` と `実装タスク` を読む。
|
|
27
|
+
2. 差分ファイル一覧から、仕様・実装・テストの変更有無を分類する。
|
|
28
|
+
3. 次の観点で不一致を検出する。
|
|
29
|
+
- 受入条件にあるのに実装差分が見当たらない
|
|
30
|
+
- 実装差分があるのに受入条件に反映されていない
|
|
31
|
+
- 実装差分があるのにテスト差分がない
|
|
32
|
+
4. 不一致がある場合のみ、項目ごとに短く列挙する。
|
|
33
|
+
|
|
34
|
+
## 出力フォーマット
|
|
35
|
+
|
|
36
|
+
```md
|
|
37
|
+
## 仕様-実装差分レビュー
|
|
38
|
+
|
|
39
|
+
### 仕様不足
|
|
40
|
+
- ...
|
|
41
|
+
|
|
42
|
+
### 実装不足
|
|
43
|
+
- ...
|
|
44
|
+
|
|
45
|
+
### テスト不足
|
|
46
|
+
- ...
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 完了条件
|
|
50
|
+
|
|
51
|
+
- 3分類(仕様不足 / 実装不足 / テスト不足)で結果を返せる
|
|
52
|
+
- 不一致なしの場合は「不一致なし」を明記できる
|
|
53
|
+
|
|
54
|
+
## 失敗時フォールバック
|
|
55
|
+
|
|
56
|
+
- 差分一覧が無い場合は `git diff --name-only` 相当の取得を提案する。
|
|
57
|
+
- `docs/work.md` の受入条件が未整備なら UC-K1 を先に実行する。
|
|
@@ -19,12 +19,11 @@ $ARGUMENTS
|
|
|
19
19
|
```bash
|
|
20
20
|
.spec-runner/spec-runner.sh 次のステップ --json
|
|
21
21
|
```
|
|
22
|
-
|
|
22
|
+
出力は JSON で、少なくとも以下を含む:
|
|
23
23
|
- `phase` — 現在フェーズ(0〜6)
|
|
24
24
|
- `phase_name_ja` — フェーズ名(日本語)
|
|
25
25
|
- `command` — 推奨ステップ名(例: テスト設計)
|
|
26
26
|
- `command_file` — そのステップの .md の絶対パス(`.spec-runner/steps/` 配下)
|
|
27
|
-
- `grade` — 検出されたグレード(LOOP1 / A / B / C)
|
|
28
27
|
|
|
29
28
|
2. **ステップを読み実行する**
|
|
30
29
|
- `command_file` で示されたファイル(例: `.spec-runner/steps/テスト設計.md`)を開いて読む。
|
|
@@ -37,6 +36,8 @@ $ARGUMENTS
|
|
|
37
36
|
## ルール
|
|
38
37
|
|
|
39
38
|
- **spec-runner はこの 1 コマンドでよい。** 迷ったらこれを実行し、`command_file` の内容に従う。
|
|
40
|
-
- `spec-runner.sh 次のステップ` は lock
|
|
39
|
+
- `spec-runner.sh 次のステップ` は lock ファイルと成果物の有無から次フェーズを判定する。lock がまだ無ければ Phase 0(憲章)から始める。
|
|
41
40
|
- ステップ内容は `.spec-runner/steps/` 配下にあり、spec-runner は現在フェーズ用のファイルを読み実行する。
|
|
41
|
+
- **Work Card**: 常に `docs/work.md` を正本として更新する(目的・受入条件・実装タスク・検証結果)。
|
|
42
|
+
- **Skills化(任意)**: 同じ作業が繰り返しになる場合、AI は次に進む前に Skills を提案する。テンプレートは `templates/skills/` 配下(`uc-k1-work-card-init`, `uc-k2-pre-commit-check`, `uc-k3-spec-impl-diff-review`)を優先し、必要なら `.claude/skills/<skill-name>/` に取り込んで使う。
|
|
42
43
|
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# spec-runner pre-commit: ブランチ名チェック + 命名規則チェック(Section 8-4)
|
|
3
|
-
|
|
4
|
-
set -e
|
|
5
|
-
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)"
|
|
6
|
-
[[ -n "$REPO_ROOT" ]] || exit 0
|
|
7
|
-
|
|
8
|
-
branch=$(git branch --show-current)
|
|
9
|
-
|
|
10
|
-
pj="$REPO_ROOT/.spec-runner/project.json"
|
|
11
|
-
[[ -f "$pj" ]] || { echo "pre-commit: project.json がありません: $pj" >&2; exit 1; }
|
|
12
|
-
command -v jq >/dev/null 2>&1 || { echo "pre-commit: jq が必要です(brew install jq)" >&2; exit 1; }
|
|
13
|
-
bp="$(jq -r '.naming.branch_prefix // "feature"' "$pj" 2>/dev/null)"
|
|
14
|
-
uc_id_pat="$(jq -r '.naming.uc_id_pattern // "UC-[0-9]+"' "$pj" 2>/dev/null)"
|
|
15
|
-
other_work="$(jq -r '.naming.other_work_prefixes[]? | . + "/.+"' "$pj" 2>/dev/null | tr '\n' '|' | sed 's/|$//')"
|
|
16
|
-
[[ -z "$other_work" ]] && other_work="work/.+|infra/.+|cicd/.+"
|
|
17
|
-
valid_pattern="^(main|develop|${bp}/(${uc_id_pat}-.+|${other_work})|fix/${uc_id_pat}-.+|release/[0-9]+\\.[0-9]+\\.[0-9]+.*|hotfix/[0-9]+\\.[0-9]+\\.[0-9]+-.+)$"
|
|
18
|
-
|
|
19
|
-
if ! echo "$branch" | grep -qE "$valid_pattern"; then
|
|
20
|
-
echo "❌ ブランチ名が規則違反: $branch"
|
|
21
|
-
echo " 正しい形式:"
|
|
22
|
-
if [[ -f "$REPO_ROOT/.spec-runner/project.json" ]] && command -v jq >/dev/null 2>&1; then
|
|
23
|
-
bp=$(jq -r '.naming.branch_prefix // "feature"' "$REPO_ROOT/.spec-runner/project.json" 2>/dev/null || echo "feature")
|
|
24
|
-
else
|
|
25
|
-
bp="feature"
|
|
26
|
-
fi
|
|
27
|
-
echo " ${bp}/{UC-ID}-{kebab-description} (新規UC、UC-IDは project.json の uc_id_pattern)"
|
|
28
|
-
echo " ${bp}/cicd/xxx ${bp}/infra/xxx (その他作業、project.json の other_work_prefixes)"
|
|
29
|
-
echo " fix/{UC-ID}-{kebab-description} (修正)"
|
|
30
|
-
echo " release/{semver} (リリース)"
|
|
31
|
-
echo " hotfix/{semver}-{kebab-description} (緊急修正)"
|
|
32
|
-
exit 1
|
|
33
|
-
fi
|
|
34
|
-
|
|
35
|
-
# 命名規則チェック(.spec-runner スクリプトがある場合のみ実行)
|
|
36
|
-
if [[ -d "$REPO_ROOT/src" ]]; then
|
|
37
|
-
while IFS= read -r dir; do
|
|
38
|
-
[[ -z "$dir" ]] && continue
|
|
39
|
-
base=$(basename "$dir")
|
|
40
|
-
if ! echo "$base" | grep -qE '^[a-z][a-z0-9-]*$'; then
|
|
41
|
-
echo "NAMING: フォルダ名「$dir」はkebab-caseで命名してください" >&2
|
|
42
|
-
exit 1
|
|
43
|
-
fi
|
|
44
|
-
done < <(find "$REPO_ROOT/src/" -type d 2>/dev/null || true)
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
exit 0
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# 次の UC を開始する: main に切り替え、feature/UC-N-xxx ブランチを作成する。
|
|
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
|
-
|
|
16
|
-
set -e
|
|
17
|
-
REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || echo ".")}"
|
|
18
|
-
cd "$REPO_ROOT"
|
|
19
|
-
BRANCH_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
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
|
-
|
|
26
|
-
YES_MODE=false
|
|
27
|
-
ARGS=()
|
|
28
|
-
for a in "$@"; do
|
|
29
|
-
case "$a" in
|
|
30
|
-
--yes|-y) YES_MODE=true ;;
|
|
31
|
-
*)
|
|
32
|
-
# 空引数は禁止
|
|
33
|
-
if [[ -z "$a" ]]; then
|
|
34
|
-
echo "Error: 空文字の引数は使用できません。UC-ID を省略する場合は引数自体を渡さないでください。" >&2
|
|
35
|
-
exit 1
|
|
36
|
-
fi
|
|
37
|
-
ARGS+=("$a")
|
|
38
|
-
;;
|
|
39
|
-
esac
|
|
40
|
-
done
|
|
41
|
-
|
|
42
|
-
PROJECT_JSON="$REPO_ROOT/.spec-runner/project.json"
|
|
43
|
-
[[ -f "$PROJECT_JSON" ]] || { echo "uc-next-start: project.json がありません: $PROJECT_JSON" >&2; exit 1; }
|
|
44
|
-
command -v jq >/dev/null 2>&1 || { echo "uc-next-start: jq が必要です(brew install jq)" >&2; exit 1; }
|
|
45
|
-
UC_ID_RE="$(jq -r '.naming.uc_id_pattern' "$PROJECT_JSON")"
|
|
46
|
-
BRANCH_PREFIX="$(jq -r '.naming.branch_prefix' "$PROJECT_JSON")"
|
|
47
|
-
[[ -n "$UC_ID_RE" && "$UC_ID_RE" != "null" && -n "$BRANCH_PREFIX" && "$BRANCH_PREFIX" != "null" ]] || {
|
|
48
|
-
echo "uc-next-start: project.json の naming.uc_id_pattern / branch_prefix が未設定です" >&2
|
|
49
|
-
exit 1
|
|
50
|
-
}
|
|
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
|
-
|
|
63
|
-
next_uc_id() {
|
|
64
|
-
# docs/02_ユースケース仕様/<カテゴリ>/UC-*.md から次に使う UC-N を返す
|
|
65
|
-
local dir="$REPO_ROOT/docs/02_ユースケース仕様"
|
|
66
|
-
mkdir -p "$dir"
|
|
67
|
-
local max=0
|
|
68
|
-
for f in "$dir"/*/UC-*.md; do
|
|
69
|
-
[[ -e "$f" ]] || continue
|
|
70
|
-
base=$(basename "$f" .md)
|
|
71
|
-
if [[ "$base" =~ ^(${UC_ID_RE})- ]]; then
|
|
72
|
-
uc_id="${BASH_REMATCH[1]}"
|
|
73
|
-
digits=$(echo "$uc_id" | tr -cd '0-9')
|
|
74
|
-
[[ -z "$digits" ]] && continue
|
|
75
|
-
n=$((10#$digits))
|
|
76
|
-
[[ $n -gt $max ]] && max=$n
|
|
77
|
-
fi
|
|
78
|
-
done
|
|
79
|
-
printf "UC-%d\n" $((max + 1))
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
NEXT_UC="$(next_uc_id)"
|
|
83
|
-
SLUG=""
|
|
84
|
-
TITLE=""
|
|
85
|
-
CATEGORY=""
|
|
86
|
-
if [[ ${#ARGS[@]} -ge 1 ]] && [[ "${ARGS[0]}" =~ ^${UC_ID_RE}$ ]]; then
|
|
87
|
-
[[ ${#ARGS[@]} -eq 4 ]] || {
|
|
88
|
-
echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
|
|
89
|
-
echo " - UC-ID を指定した場合は SLUG/TITLE/CATEGORY の3引数が必須です" >&2
|
|
90
|
-
exit 1
|
|
91
|
-
}
|
|
92
|
-
NEXT_UC="${ARGS[0]}"
|
|
93
|
-
SLUG="${ARGS[1]}"
|
|
94
|
-
TITLE="${ARGS[2]}"
|
|
95
|
-
CATEGORY="${ARGS[3]}"
|
|
96
|
-
else
|
|
97
|
-
[[ ${#ARGS[@]} -eq 3 ]] || {
|
|
98
|
-
echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
|
|
99
|
-
echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
|
|
100
|
-
exit 1
|
|
101
|
-
}
|
|
102
|
-
SLUG="${ARGS[0]}"
|
|
103
|
-
TITLE="${ARGS[1]}"
|
|
104
|
-
CATEGORY="${ARGS[2]}"
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
# SLUG / TITLE / CATEGORY は必須(UC-ID のみ任意)
|
|
108
|
-
if [[ -z "$SLUG" || -z "$TITLE" || -z "$CATEGORY" ]]; then
|
|
109
|
-
echo "Usage: .spec-runner/scripts/branch/uc-next-start.sh [UC-ID] \"SLUG\" \"TITLE\" \"CATEGORY\" [--yes]" >&2
|
|
110
|
-
echo " - UC-ID は任意、SLUG/TITLE/CATEGORY は必須です(空文字禁止)" >&2
|
|
111
|
-
exit 1
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
# SLUG は英小文字・ハイフン(Git ブランチ名は ASCII のみ)
|
|
115
|
-
# macOS(BSD sed) でも動くように、連続ハイフンは 's/--*/-/g' で圧縮する
|
|
116
|
-
SLUG=$(echo "$SLUG" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-*//' | sed 's/-*$//')
|
|
117
|
-
if [[ -z "$SLUG" ]]; then
|
|
118
|
-
echo "Error: SLUG は英数字・ハイフンへ正規化可能な値を指定してください(例: task-management)。" >&2
|
|
119
|
-
exit 1
|
|
120
|
-
fi
|
|
121
|
-
BRANCH_NAME="${BRANCH_PREFIX}/${NEXT_UC}-${SLUG}"
|
|
122
|
-
|
|
123
|
-
# UC ファイル題名
|
|
124
|
-
DOC_TITLE="$TITLE"
|
|
125
|
-
# ファイル名に危険な文字が入らないように除去(日本語は許可)
|
|
126
|
-
DOC_TITLE=$(echo "$DOC_TITLE" | sed 's/[\\\\\\/\\:\\*\\?\\\"\\<\\>\\|]/ /g' | sed 's/[[:space:]]\\+/ /g' | sed 's/^ *//; s/ *$//')
|
|
127
|
-
if [[ -z "$DOC_TITLE" ]]; then
|
|
128
|
-
echo "Error: TITLE が不正です(危険文字除去後に空になりました)。" >&2
|
|
129
|
-
exit 1
|
|
130
|
-
fi
|
|
131
|
-
|
|
132
|
-
# カテゴリは必須。日本語カテゴリは許可し、危険文字だけ除去。
|
|
133
|
-
# 文字レンジ指定は sed 実装差で壊れやすいため、危険文字のみを除去する。
|
|
134
|
-
CATEGORY=$(echo "$CATEGORY" | sed 's/[\\\/:\*\?"<>|]//g' | sed 's/[[:cntrl:]]//g' | sed 's/[[:space:]]\+/ /g' | sed 's/^ *//; s/ *$//')
|
|
135
|
-
if [[ -z "$CATEGORY" ]]; then
|
|
136
|
-
echo "Error: CATEGORY は空にできません。" >&2
|
|
137
|
-
exit 1
|
|
138
|
-
fi
|
|
139
|
-
|
|
140
|
-
if git rev-parse --verify "$BRANCH_NAME" >/dev/null 2>&1; then
|
|
141
|
-
echo "Error: ブランチ '$BRANCH_NAME' は既に存在します。" >&2
|
|
142
|
-
exit 1
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
CURRENT=$(git branch --show-current 2>/dev/null || echo "")
|
|
146
|
-
MAIN_BRANCH=""
|
|
147
|
-
|
|
148
|
-
# 1) origin/HEAD からデフォルトブランチを取得
|
|
149
|
-
if git symbolic-ref -q --short refs/remotes/origin/HEAD >/dev/null 2>&1; then
|
|
150
|
-
MAIN_BRANCH="$(git symbolic-ref -q --short refs/remotes/origin/HEAD | sed 's#^origin/##')"
|
|
151
|
-
fi
|
|
152
|
-
# 2) main / master をフォールバック
|
|
153
|
-
if [[ -z "$MAIN_BRANCH" ]]; then
|
|
154
|
-
if git rev-parse --verify "main" >/dev/null 2>&1; then
|
|
155
|
-
MAIN_BRANCH="main"
|
|
156
|
-
elif git rev-parse --verify "master" >/dev/null 2>&1; then
|
|
157
|
-
MAIN_BRANCH="master"
|
|
158
|
-
fi
|
|
159
|
-
fi
|
|
160
|
-
# 3) どれも無ければ現在ブランチ(初期ブランチ名が trunk/develop 等のケース)
|
|
161
|
-
if [[ -z "$MAIN_BRANCH" ]]; then
|
|
162
|
-
MAIN_BRANCH="${CURRENT:-}"
|
|
163
|
-
fi
|
|
164
|
-
[[ -n "$MAIN_BRANCH" ]] || { echo "Error: ベースブランチを特定できません(main/master/current が見つかりません)。" >&2; exit 1; }
|
|
165
|
-
|
|
166
|
-
if [[ "$YES_MODE" != true ]]; then
|
|
167
|
-
echo "次の UC を開始する準備をします。"
|
|
168
|
-
echo " $MAIN_BRANCH にチェックアウトし、ブランチ \"$BRANCH_NAME\" を作成します。"
|
|
169
|
-
echo -n " 実行してよろしいですか? [y/N]: "
|
|
170
|
-
read -r ans
|
|
171
|
-
case "$ans" in
|
|
172
|
-
[yY]|[yY][eE][sS]) ;;
|
|
173
|
-
*) echo "キャンセルしました。"; exit 0 ;;
|
|
174
|
-
esac
|
|
175
|
-
fi
|
|
176
|
-
|
|
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
|
|
191
|
-
|
|
192
|
-
# ブランチ作成 + UC 仕様書作成(統合)
|
|
193
|
-
UC_ID_PATTERN="^${UC_ID_RE}$"
|
|
194
|
-
if ! echo "$NEXT_UC" | grep -qE "$UC_ID_PATTERN"; then
|
|
195
|
-
echo "Error: UC-ID が命名規則に合いません: $NEXT_UC(期待: $UC_ID_PATTERN)" >&2
|
|
196
|
-
exit 1
|
|
197
|
-
fi
|
|
198
|
-
valid_uc_pattern="^${BRANCH_PREFIX}/${UC_ID_RE}-[a-z0-9-]+\$"
|
|
199
|
-
if ! echo "$BRANCH_NAME" | grep -qE "$valid_uc_pattern"; then
|
|
200
|
-
echo "Error: ブランチ名が命名規則に合いません: $BRANCH_NAME(期待: ${BRANCH_PREFIX}/<UC-ID>-kebab-description)" >&2
|
|
201
|
-
exit 1
|
|
202
|
-
fi
|
|
203
|
-
|
|
204
|
-
git checkout -b "$BRANCH_NAME"
|
|
205
|
-
echo "Created branch: $BRANCH_NAME"
|
|
206
|
-
|
|
207
|
-
FEATURE_DIR="docs/02_ユースケース仕様/${CATEGORY}"
|
|
208
|
-
UC_DOC="${FEATURE_DIR}/${NEXT_UC}-${DOC_TITLE}.md"
|
|
209
|
-
mkdir -p "$FEATURE_DIR"
|
|
210
|
-
# UC ごとの判断ログ置き場(任意だが、作成しておくと運用が安定する)
|
|
211
|
-
mkdir -p "${FEATURE_DIR}/判断記録"
|
|
212
|
-
# テンプレ: 修正・改善は .spec-runner/templates/UC-N-ユースケース名.md を編集。プレースホルダ UC-N → UC番号, {ユースケース名} → 題名
|
|
213
|
-
TEMPLATE="$REPO_ROOT/.spec-runner/templates/UC-N-ユースケース名.md"
|
|
214
|
-
if [[ -f "$TEMPLATE" ]]; then
|
|
215
|
-
sed "s/UC-N/${NEXT_UC}/g; s/{ユースケース名}/${DOC_TITLE}/g" "$TEMPLATE" > "$UC_DOC"
|
|
216
|
-
echo "Created: $UC_DOC"
|
|
217
|
-
else
|
|
218
|
-
touch "$UC_DOC"
|
|
219
|
-
echo "# ${NEXT_UC}: ${DOC_TITLE}" >> "$UC_DOC"
|
|
220
|
-
echo "Created: $UC_DOC"
|
|
221
|
-
fi
|
|
222
|
-
|
|
223
|
-
echo ""
|
|
224
|
-
echo "次の UC 用ブランチの準備ができました。次のステップに進んでください。"
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# MkDocs + Material で docs/ をプレビュー(プロジェクトルートで実行される想定)
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
|
|
5
|
-
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
6
|
-
cd "$ROOT"
|
|
7
|
-
|
|
8
|
-
DOCS_PORT="${DOCS_PORT:-8000}"
|
|
9
|
-
REQ="requirements-docs.txt"
|
|
10
|
-
|
|
11
|
-
if [[ ! -f "$REQ" ]]; then
|
|
12
|
-
echo "ERROR: ${REQ} が見つかりません。npx spec-runner を実行して MkDocs 用ファイルを展開してください。" >&2
|
|
13
|
-
exit 1
|
|
14
|
-
fi
|
|
15
|
-
|
|
16
|
-
if [[ ! -d .venv-docs ]]; then
|
|
17
|
-
python3 -m venv .venv-docs
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
./.venv-docs/bin/pip install -q -r "$REQ"
|
|
21
|
-
exec ./.venv-docs/bin/mkdocs serve --dev-addr "127.0.0.1:${DOCS_PORT}"
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# テストコマンドを実行し、すべてグリーンでないと終了コード 1 を返す。
|
|
3
|
-
# コマンドは .spec-runner/project.json の test_command.run のみ(必須)。
|
|
4
|
-
|
|
5
|
-
set -e
|
|
6
|
-
REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || echo ".")}"
|
|
7
|
-
cd "$REPO_ROOT"
|
|
8
|
-
SPEC_RUNNER="${REPO_ROOT}/.spec-runner"
|
|
9
|
-
PROJECT_JSON="${SPEC_RUNNER}/project.json"
|
|
10
|
-
command -v jq >/dev/null 2>&1 || { echo "require-tests-green: jq が必要です(brew install jq)" >&2; exit 1; }
|
|
11
|
-
[[ -f "$PROJECT_JSON" ]] || { echo "require-tests-green: $PROJECT_JSON がありません" >&2; exit 1; }
|
|
12
|
-
|
|
13
|
-
RUN_CMD=$(jq -r '.test_command.run' "$PROJECT_JSON")
|
|
14
|
-
[[ -n "$RUN_CMD" && "$RUN_CMD" != "null" ]] || {
|
|
15
|
-
echo "require-tests-green: project.json に test_command.run を設定してください。" >&2
|
|
16
|
-
exit 1
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
echo "require-tests-green: テストを実行しています($RUN_CMD)..."
|
|
20
|
-
if eval "$RUN_CMD"; then
|
|
21
|
-
echo "require-tests-green: すべてグリーンです。実装完了の条件(テスト)を満たしています。"
|
|
22
|
-
exit 0
|
|
23
|
-
else
|
|
24
|
-
echo "" >&2
|
|
25
|
-
echo "require-tests-green: テストが失敗しました。実装完了とみなせません。" >&2
|
|
26
|
-
exit 1
|
|
27
|
-
fi
|
package/templates/.spec-runner/steps//343/201/235/343/201/256/344/273/226/344/275/234/346/245/255.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
step_id: other_work
|
|
3
|
-
phase: null
|
|
4
|
-
note: UC ブランチではない
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# その他作業(CI/CD・インフラ・共通設定など)
|
|
8
|
-
|
|
9
|
-
**やること**: UC 以外の作業用ブランチ上で、通常開発フローで進める。spec-runner の UC ステップ(仕様策定〜実装)は**対象外**。
|
|
10
|
-
|
|
11
|
-
| 項目 | 内容 |
|
|
12
|
-
|------|------|
|
|
13
|
-
| **ブランチ** | `feature/<接頭辞>/xxx`(接頭辞は `project.json` の **naming.other_work_prefixes**。既定: work, infra, cicd) |
|
|
14
|
-
| **UC フロー** | このステップのまま **仕様策定〜実装は実行しない** |
|
|
15
|
-
| **参照** | 必要なら `.spec-runner/steps/実装計画.md` と docs/03, 04, 06 等 |
|
|
16
|
-
|
|
17
|
-
## ブランチの例
|
|
18
|
-
|
|
19
|
-
| ブランチ例 | 用途 |
|
|
20
|
-
|------------|------|
|
|
21
|
-
| `feature/cicd/github-actions` | CI/CD |
|
|
22
|
-
| `feature/infra/docker` | インフラ・コンテナ |
|
|
23
|
-
| `feature/work/setup-tooling` | 共通ツール |
|
|
24
|
-
|
|
25
|
-
接頭辞は **project.json の naming.other_work_prefixes** に配列で記載。プロジェクトに合わせて追加・変更可。
|
|
26
|
-
|
|
27
|
-
## 注意
|
|
28
|
-
|
|
29
|
-
- phase-locks の `uc_reviewed` や UC 判定には**影響しない**。このブランチ用 lock は不要。
|
|
30
|
-
- 再度「次のステップ」を見たい場合は **UC ブランチに checkout** するか **main に戻る**。
|
|
31
|
-
- 作業完了後は main にマージするか、UC ブランチに切り替えて spec-runner を再実行。
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
**次**: UC 作業に戻る場合は適切なブランチへ。
|