@careerchain/stdd 0.1.1 → 0.1.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 (40) hide show
  1. package/assets/.claude/agents/implementer.md +4 -4
  2. package/assets/.claude/agents/plan-writer.md +7 -7
  3. package/assets/.claude/agents/qa-engineer.md +58 -6
  4. package/assets/.claude/agents/spec-reviewer.md +24 -18
  5. package/assets/.claude/agents/spec-writer.md +42 -38
  6. package/assets/.claude/agents/test-reviewer.md +21 -21
  7. package/assets/.claude/hooks/spec-first-check.sh +201 -0
  8. package/assets/.claude/rules/stdd-spec-first.md +36 -0
  9. package/assets/.claude/settings.json +16 -2
  10. package/assets/.claude/skills/auto-implement/SKILL.md +1 -1
  11. package/assets/.claude/skills/auto-implement/references/phases.md +14 -12
  12. package/assets/.claude/skills/documenting-plans/SKILL.md +2 -2
  13. package/assets/.claude/skills/documenting-specifications/SKILL.md +326 -300
  14. package/assets/.claude/skills/documenting-specifications/guides/error-handling.md +23 -21
  15. package/assets/.claude/skills/documenting-specifications/guides/stdd-violations.md +2 -2
  16. package/assets/.claude/skills/documenting-specifications/templates/api-spec-common.md +97 -0
  17. package/assets/.claude/skills/documenting-specifications/templates/architecture-common.md +188 -0
  18. package/assets/.claude/skills/documenting-specifications/templates/design-common.md +57 -0
  19. package/assets/.claude/skills/documenting-specifications/templates/requirements-common.md +104 -0
  20. package/assets/.claude/skills/documenting-specifications/templates/requirements.md +105 -125
  21. package/assets/.claude/skills/documenting-specifications/templates/table-definition-common.md +78 -0
  22. package/assets/.claude/skills/documenting-specifications/templates/tech-design.md +110 -183
  23. package/assets/.claude/skills/documenting-specifications/templates/test-plan.md +58 -0
  24. package/assets/.claude/skills/generating-wireframes/SKILL.md +10 -10
  25. package/assets/.claude/skills/generating-wireframes/guides/from-requirements.md +13 -13
  26. package/assets/.claude/skills/generating-wireframes/templates/index.html +1 -1
  27. package/assets/.claude/skills/introducing-stdd/SKILL.md +3 -0
  28. package/assets/.claude/skills/reverse-engineering-common-spec/SKILL.md +21 -10
  29. package/assets/.claude/skills/reverse-engineering-feature-spec/SKILL.md +53 -32
  30. package/assets/.claude/skills/reverse-engineering-feature-spec/guides/figma-capture.md +9 -9
  31. package/assets/.claude/skills/tailoring-spec-format/SKILL.md +7 -7
  32. package/assets/.claude/skills/verifying-consistency/SKILL.md +1 -1
  33. package/assets/mcp.json +9 -0
  34. package/assets/stdd.config.yml.tpl +4 -0
  35. package/dist/cli.js +1 -0
  36. package/dist/cli.js.map +1 -1
  37. package/dist/install.js +20 -1
  38. package/dist/install.js.map +1 -1
  39. package/package.json +1 -1
  40. package/assets/.claude/skills/documenting-specifications/templates/screen-items-definition.md +0 -179
@@ -0,0 +1,201 @@
1
+ #!/bin/bash
2
+ # PreToolUse Hook: 実装ファイルの編集前に STDD の「Spec → テスト → 実装」順序を促す。
3
+ # Edit / Write / MultiEdit にマッチさせて使う(settings.json で登録)。
4
+ #
5
+ # 役割(Poka-Yoke):
6
+ # ad-hoc な「この実装を直して」等の指示でスキルを介さず実装ファイルを編集しようと
7
+ # したとき、まず Spec / テストの更新を検討するようリマインドする。既定は非ブロッキング。
8
+ #
9
+ # このフックは下流プロジェクト固有の値をハードコードせず、リポジトリルートの
10
+ # .stdd.config.yml を実行時に読み取って動作する(設定駆動)。
11
+ # - apps[].path : 実装ファイルとみなすディレクトリ("." はリポジトリ全体)
12
+ # - docs.layout.requirements : Spec の配置({{ より前の固定 prefix を Spec 領域とみなす)
13
+ # - workflow.enforce_spec_first : off | warn(既定) | block
14
+ # - project.primary_branch : block 判定でブランチ差分を比較する基準
15
+ #
16
+ # 分類で Spec / テスト / docs / .claude / 設定・ロックファイルは免除(無言で許可)する。
17
+ # 設定が無い / フックが失敗する場合はブロックせずスキップする(フェイルオープン)。
18
+ # 詳細な記述規約は docs/config-driven-authoring.md を参照。
19
+
20
+ hook_input=$(cat)
21
+ FILE_RAW=$(printf '%s' "$hook_input" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
22
+ [ -z "$FILE_RAW" ] && exit 0
23
+
24
+ ROOT_DIR=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0
25
+ CONFIG="$ROOT_DIR/.stdd.config.yml"
26
+ [ -f "$CONFIG" ] || exit 0
27
+
28
+ # 編集対象パスをリポジトリルート相対へ正規化
29
+ case "$FILE_RAW" in
30
+ "$ROOT_DIR"/*) REL="${FILE_RAW#"$ROOT_DIR"/}" ;;
31
+ ./*) REL="${FILE_RAW#./}" ;;
32
+ *) REL="$FILE_RAW" ;;
33
+ esac
34
+
35
+ # --- .stdd.config.yml パーサ(外部依存なし。pre-push-check.sh と同じ流儀) ---
36
+
37
+ # 指定セクション直下のスカラー値を取得: $1=section, $2=key
38
+ yaml_scalar() {
39
+ awk -v sec="$1:" -v k="$2:" '
40
+ /^[^[:space:]]/ { insec = ($1 == sec) }
41
+ insec && $1 == k {
42
+ sub(/^[[:space:]]*[^:]*:[[:space:]]*/, "", $0)
43
+ print $0
44
+ exit
45
+ }
46
+ ' "$CONFIG"
47
+ }
48
+
49
+ # apps[] の path を 1 行ずつ取得
50
+ yaml_apps_paths() {
51
+ awk '
52
+ /^[^[:space:]]/ { inapps = ($1 == "apps:") }
53
+ inapps && $1 == "path:" {
54
+ sub(/^[[:space:]]*path:[[:space:]]*/, "", $0)
55
+ print $0
56
+ }
57
+ ' "$CONFIG"
58
+ }
59
+
60
+ # docs.layout.requirements の値(ネストキー。最初の requirements: 行を採用)
61
+ yaml_requirements() {
62
+ awk '$1 == "requirements:" {
63
+ sub(/^[[:space:]]*requirements:[[:space:]]*/, "", $0)
64
+ print $0
65
+ exit
66
+ }' "$CONFIG"
67
+ }
68
+
69
+ strip_quotes() {
70
+ local v="$1"
71
+ v="${v%\"}"; v="${v#\"}"
72
+ v="${v%\'}"; v="${v#\'}"
73
+ printf '%s' "$v"
74
+ }
75
+
76
+ # docs.layout.requirements の {{ より前の固定 prefix を Spec 領域として導出
77
+ REQ_TPL=$(strip_quotes "$(yaml_requirements)")
78
+ SPEC_PREFIX="${REQ_TPL%%\{\{*}"
79
+
80
+ # --- パス分類 ---
81
+
82
+ is_spec() {
83
+ local rel="$1" base
84
+ base=$(basename "$rel")
85
+ case "$base" in
86
+ REQUIREMENTS.md|TECH_DESIGN.md|TEST_PLAN.md|ARCHITECTURE.md|TABLE_DEFINITION.md|API_SPEC.md|DESIGN.md) return 0 ;;
87
+ esac
88
+ case "$rel" in
89
+ docs/*|*/docs/*) return 0 ;;
90
+ esac
91
+ if [ -n "$SPEC_PREFIX" ] && [ "$SPEC_PREFIX" != "$REQ_TPL" ]; then
92
+ case "$rel" in
93
+ "$SPEC_PREFIX"*) return 0 ;;
94
+ esac
95
+ fi
96
+ return 1
97
+ }
98
+
99
+ is_test() {
100
+ local rel="$1" base
101
+ base=$(basename "$rel")
102
+ case "$base" in
103
+ *.test.*|*.spec.*|*_test.*|*_spec.*) return 0 ;;
104
+ esac
105
+ case "/$rel/" in
106
+ */__tests__/*|*/__mocks__/*|*/tests/*|*/test/*|*/e2e/*|*/spec/*) return 0 ;;
107
+ esac
108
+ return 1
109
+ }
110
+
111
+ is_excluded() {
112
+ local rel="$1" base
113
+ base=$(basename "$rel")
114
+ case "$rel" in
115
+ .claude/*|*/.claude/*|.git/*|*/.git/*|node_modules/*|*/node_modules/*) return 0 ;;
116
+ dist/*|*/dist/*|build/*|*/build/*|coverage/*|*/coverage/*|.next/*|*/.next/*) return 0 ;;
117
+ esac
118
+ case "$base" in
119
+ .env*|*.lock) return 0 ;;
120
+ *.md|*.txt|*.json|*.yml|*.yaml|*.toml|*.ini) return 0 ;;
121
+ *.css|*.scss|*.sass|*.less|*.svg|*.png|*.jpg|*.jpeg|*.gif|*.ico|*.webp) return 0 ;;
122
+ esac
123
+ return 1
124
+ }
125
+
126
+ APPS_PATHS=$(yaml_apps_paths)
127
+ [ -z "$APPS_PATHS" ] && APPS_PATHS="."
128
+
129
+ in_apps() {
130
+ local rel="$1" p
131
+ while IFS= read -r raw; do
132
+ [ -z "$raw" ] && continue
133
+ p=$(strip_quotes "$raw")
134
+ [ -z "$p" ] && continue
135
+ [ "$p" = "." ] && return 0
136
+ p="${p%/}"
137
+ case "$rel" in
138
+ "$p"/*) return 0 ;;
139
+ esac
140
+ done <<EOF
141
+ $APPS_PATHS
142
+ EOF
143
+ return 1
144
+ }
145
+
146
+ # Spec / テスト / 除外対象 / apps 外 はいずれも無言で許可
147
+ is_spec "$REL" && exit 0
148
+ is_test "$REL" && exit 0
149
+ is_excluded "$REL" && exit 0
150
+ in_apps "$REL" || exit 0
151
+
152
+ # --- 実装ファイル編集と判定。enforce_spec_first に従う ---
153
+
154
+ MODE=$(strip_quotes "$(yaml_scalar workflow enforce_spec_first)")
155
+ MODE=${MODE:-warn}
156
+
157
+ [ "$MODE" = "off" ] && exit 0
158
+
159
+ REMINDER="STDD リマインダ: 実装ファイル ($REL) を編集しようとしています。\
160
+ この変更が仕様の振る舞いを変えるなら、いきなり実装を直さず、先に Spec\
161
+ (.stdd.config.yml の docs.layout)とテストを更新してください(Spec → テスト → 実装)。\
162
+ 振る舞いを変えないリファクタ・整形・設定変更ならこのまま進めて構いません。\
163
+ 本格的な機能実装は auto-implement、仕様更新は documenting-specifications スキルに委譲できます。"
164
+
165
+ if [ "$MODE" = "block" ]; then
166
+ PRIMARY_BRANCH=$(strip_quotes "$(yaml_scalar project primary_branch)")
167
+ PRIMARY_BRANCH=${PRIMARY_BRANCH:-main}
168
+
169
+ branch_has_spec_or_test() {
170
+ local base files f
171
+ base=$(git merge-base HEAD "origin/$PRIMARY_BRANCH" 2>/dev/null || true)
172
+ files=""
173
+ [ -n "$base" ] && files=$(git diff --name-only "$base"...HEAD 2>/dev/null)
174
+ files="$files
175
+ $(git diff --name-only 2>/dev/null)
176
+ $(git diff --name-only --cached 2>/dev/null)"
177
+ while IFS= read -r f; do
178
+ [ -z "$f" ] && continue
179
+ if is_spec "$f" || is_test "$f"; then return 0; fi
180
+ done <<EOF
181
+ $files
182
+ EOF
183
+ return 1
184
+ }
185
+
186
+ # ブランチに既に Spec / テストの変更があれば spec-first 充足とみなして許可
187
+ if branch_has_spec_or_test; then
188
+ exit 0
189
+ fi
190
+
191
+ DENY="STDD enforce_spec_first=block: このブランチにはまだ Spec / テストの変更がありません。\
192
+ $REMINDER"
193
+ jq -n --arg r "$DENY" \
194
+ '{hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:$r}}'
195
+ exit 0
196
+ fi
197
+
198
+ # warn(既定): 非ブロッキングのリマインドを文脈に注入
199
+ jq -n --arg r "$REMINDER" \
200
+ '{hookSpecificOutput:{hookEventName:"PreToolUse",additionalContext:$r}}'
201
+ exit 0
@@ -0,0 +1,36 @@
1
+ # STDD: Spec-First の原則(最優先・常時適用)
2
+
3
+ このプロジェクトは **STDD (Spec & Test Driven Development)** で運用されている。
4
+ 唯一の真実源 (SSoT) は **Spec ドキュメント**であり、コード変更は必ず
5
+ **「Spec → テスト → 実装」** の順で行う。Spec から始まらない実装は STDD 違反。
6
+
7
+ ## 必ず守ること
8
+
9
+ ユーザーから「修正して / 直して / 変更して / fix / 〜を追加して / 実装して」等、
10
+ **コードに手を入れる依頼**を受けたら(スキルを介さない ad-hoc な一言依頼でも)、
11
+ いきなり実装ファイルを編集せず、まず次の順で判断・実行する。
12
+
13
+ 1. **Spec 確認**: この変更で対象機能の `REQUIREMENTS.md` / `TECH_DESIGN.md`
14
+ (配置は `.stdd.config.yml` の `docs.layout`)の記述が変わるか確認する。
15
+ 仕様(What / 振る舞い)が変わるなら、**先に Spec を更新**する。
16
+ 2. **テスト更新 (Red)**: Spec の変更または新しい振る舞いを検証するテストを
17
+ 先に追加 / 更新し、失敗する(Red)ことを確認する。
18
+ 3. **実装 (Green)**: テストを通す最小限の実装を行う。
19
+ 4. **整合性**: Spec ⇔ テスト ⇔ 実装が一致した状態でコミットする。
20
+
21
+ 「実装だけ」を直すと Spec と実装が乖離し、SSoT 性が壊れる。実装側で先に直したく
22
+ なっても、Spec を飛ばさない。
23
+
24
+ ## 例外(Spec 更新が不要なケース)
25
+
26
+ **仕様の振る舞いを変えない**変更は Spec 更新をスキップしてよい:
27
+ リファクタリング / 命名・整形 / コメント / 設定値 / ビルド・CI / タイポ修正。
28
+ ただし**テストが緑のまま**であることは必ず確認する。
29
+
30
+ ## 迷ったら
31
+
32
+ 「これは仕様変更か、それとも振る舞いを変えない変更か」を一言ユーザーに確認する。
33
+
34
+ 本格的な機能実装は `auto-implement` スキル、仕様の作成・更新は
35
+ `documenting-specifications` スキル、Spec ⇔ テスト ⇔ 実装 の整合性確認は
36
+ `verifying-consistency` スキルに委譲できる。
@@ -47,7 +47,8 @@
47
47
  "Bash(shasum:*)",
48
48
  "Bash(xargs:*)",
49
49
  "Bash(awk:*)",
50
- "Bash(PGPASSWORD=postgres psql:*)"
50
+ "Bash(PGPASSWORD=postgres psql:*)",
51
+ "mcp__playwright__*"
51
52
  ]
52
53
  },
53
54
  "hooks": {
@@ -61,7 +62,20 @@
61
62
  "timeout": 600
62
63
  }
63
64
  ]
65
+ },
66
+ {
67
+ "matcher": "Edit|Write|MultiEdit",
68
+ "hooks": [
69
+ {
70
+ "type": "command",
71
+ "command": ".claude/hooks/spec-first-check.sh",
72
+ "timeout": 30
73
+ }
74
+ ]
64
75
  }
65
76
  ]
66
- }
77
+ },
78
+ "enabledMcpjsonServers": [
79
+ "playwright"
80
+ ]
67
81
  }
@@ -93,7 +93,7 @@ GitHub Projectのステータス更新の手順は [references/github-project.md
93
93
 
94
94
  ```
95
95
  Team Lead(オーケストレーター) ← このスキル自身
96
- ├→ Spec Writer : REQUIREMENTS.md + TECH_DESIGN.md 作成
96
+ ├→ Spec Writer : REQUIREMENTS.md + TECH_DESIGN.md + TEST_PLAN.md 作成
97
97
  ├→ Spec Reviewer : Spec の品質・整合性・漏れをレビュー
98
98
  ├→ Plan Writer : タスク分解・実装計画(PLANドキュメント)を作成
99
99
  ├→ Implementer : テスト作成 → 実装(STDDフロー)
@@ -17,18 +17,18 @@
17
17
 
18
18
  1. `docs/` 配下に該当機能のディレクトリを作成(存在しない場合)
19
19
  2. `REQUIREMENTS.md` を作成:
20
- - ビジネス要件の整理
21
- - ユーザージャーニーの定義
22
- - 受入基準の明確化
20
+ - 業務要件(解決する問題・対象ユーザー・ビジネス目標)の整理
21
+ - 機能要件:ユースケースごとに 振る舞い(番号付き手順・主語明示)+ 受入基準(EARS)+ Priority を定義
22
+ - 非機能要件(機能固有のもの。共通は common 準拠)の明確化
23
23
  3. ワイヤーフレーム(WF)を生成(UI を持つ機能の場合):
24
24
  - `generating-wireframes` スキルに従い `docs/<app>/<feature-path>/wireframes/` に HTML WF を生成
25
- - REQUIREMENTS.md「3. UI/UX デザイン」から `./wireframes/index.html` にリンク
25
+ - REQUIREMENTS.md「2.4 UI/UX・画面」から `./wireframes/index.html` にリンク
26
26
  - UI を持たない機能(バッチ・API のみ等)はスキップ
27
27
  4. `TECH_DESIGN.md` を作成:
28
- - 技術設計方針
29
- - ファイル構成
30
- - テスト戦略(テストケース一覧)
31
- 5. 必要に応じて `SCREEN_ITEMS_DEFINITION.md` を作成
28
+ - 技術設計方針(概要 / 主要な設計判断 / ロジック設計 / エラーハンドリング戦略)
29
+ - 画面 feature では「画面項目定義」セクションを含める(非画面 feature は省略)
30
+ - データ構造は common `TABLE_DEFINITION.md`、API は common `API_SPEC.md` を参照
31
+ 5. `TEST_PLAN.md` を作成(テスト戦略・テストケース一覧。feature 単位の独立ドキュメント)
32
32
 
33
33
  作成したSpecをコミット。
34
34
 
@@ -55,8 +55,8 @@ HIGH/MEDIUM の指摘がある場合は Hard Threshold とは別に判断する
55
55
 
56
56
  **Plan Writerに依頼**して、Specドキュメントに基づきPLANドキュメントを作成する。
57
57
 
58
- 1. REQUIREMENTS.mdのUser JourneyとPriorityを確認
59
- 2. TECH_DESIGN.mdのTest Strategyに基づきタスクを分解
58
+ 1. REQUIREMENTS.mdのユースケース(振る舞い+受入基準)とPriorityを確認
59
+ 2. TEST_PLAN.mdのテスト戦略に基づきタスクを分解
60
60
  3. テスト→実装の順序でタスクリストを作成
61
61
  4. ファイル構成(新規/既存修正/既存維持)を明記
62
62
  5. PLANドキュメントをコミット
@@ -107,14 +107,14 @@ HIGH/MEDIUM の指摘がある場合は Hard Threshold とは別に判断する
107
107
 
108
108
  レビュー観点:
109
109
 
110
- 1. **Spec準拠**: TECH_DESIGN.mdのテスト戦略(ジャーニー別テストレベル分類・テスト総数・内訳)に作成テストが則っているか
110
+ 1. **Spec準拠**: TEST_PLAN.mdのテスト戦略(ユースケース別テストレベル分類・テスト総数・内訳)に作成テストが則っているか
111
111
  2. **形骸的テストの検出**: トートロジー、モック戻り値のassert、内容を検証しないアサーション等、意味のないテストがないか
112
112
  - ただしE2EテストでUI要素(role, aria-label, data-testid, 可視テキスト等)に依拠した検証は許容
113
113
  3. **一般的なテスト品質**: AAA構造、独立性、命名、Flaky耐性、アサーションの具体性
114
114
 
115
115
  ### 判定結果の扱い
116
116
 
117
- Test Reviewer の **Hard Threshold**(HIGH 0件 / MEDIUM ≤2件 / 形骸的テスト 0件 / TECH_DESIGN.md整合 / P0 E2E完全カバー / 受入基準テスト網羅)を1項目でも下回った場合は必ず NEEDS CHANGES 以下となる。
117
+ Test Reviewer の **Hard Threshold**(HIGH 0件 / MEDIUM ≤2件 / 形骸的テスト 0件 / TEST_PLAN.md整合 / P0 E2E完全カバー / 受入基準テスト網羅)を1項目でも下回った場合は必ず NEEDS CHANGES 以下となる。
118
118
 
119
119
  - **PASS**: Phase 2のステップ2(実装)に戻って作業を継続。
120
120
  - **NEEDS CHANGES**: Test Reviewer 出力末尾の「Generator への差し戻し指示」をそのまま implementer に渡してテストを修正させる → テストを再コミット → Test Reviewer に再レビュー依頼。**最大3回**ループ。
@@ -143,6 +143,8 @@ Test Reviewer の **Hard Threshold**(HIGH 0件 / MEDIUM ≤2件 / 形骸的テ
143
143
 
144
144
  4. **コード品質チェック**: `simplify` skill と同等のレビューを実施
145
145
 
146
+ 5. **動作確認(Playwright MCP)**: `commands.dev` が定義され UI を持つ場合、dev サーバを起動し Playwright MCP(`mcp__playwright__*`)で主要ユースケースのハッピーパスをブラウザ操作で確認する(主要要素の存在・console エラーなし・画面遷移)。`commands.dev` 未定義 / UIなし / Playwright MCP 利用不可ならスキップする。詳細は QA Engineer の Phase 6 を参照。
147
+
146
148
  問題がある場合:
147
149
 
148
150
  - **ビルド・型エラー**: Build Error Resolverに修正を依頼
@@ -150,9 +150,9 @@ PLANドキュメントには以下のセクションを含める:
150
150
  ```
151
151
  「REQUIREMENTS.mdを確認しました。今回のセッションでは以下のどの範囲を実装しますか?
152
152
 
153
- A) 全てのUser Journey(P0〜P2)
153
+ A) 全てのユースケース(P0〜P2)
154
154
  B) P0のCritical Pathsのみ
155
- C) 特定のJourneyのみ(指定してください)
155
+ C) 特定のユースケースのみ(指定してください)
156
156
 
157
157
  また、既存のPLANドキュメントがある場合は、そちらを継続しますか?」
158
158
  ```