@careerchain/stdd 0.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.
Files changed (53) hide show
  1. package/README.md +44 -0
  2. package/assets/.claude/agents/code-reviewer.md +170 -0
  3. package/assets/.claude/agents/implementer.md +96 -0
  4. package/assets/.claude/agents/plan-writer.md +124 -0
  5. package/assets/.claude/agents/qa-engineer.md +133 -0
  6. package/assets/.claude/agents/spec-reviewer.md +173 -0
  7. package/assets/.claude/agents/spec-writer.md +194 -0
  8. package/assets/.claude/agents/test-reviewer.md +218 -0
  9. package/assets/.claude/docs/spec-driven-development-guide.md +436 -0
  10. package/assets/.claude/hooks/pre-push-check.sh +160 -0
  11. package/assets/.claude/settings.json +67 -0
  12. package/assets/.claude/skills/auto-implement/SKILL.md +168 -0
  13. package/assets/.claude/skills/auto-implement/references/github-project.md +54 -0
  14. package/assets/.claude/skills/auto-implement/references/phases.md +244 -0
  15. package/assets/.claude/skills/create-pr/SKILL.md +112 -0
  16. package/assets/.claude/skills/documenting-plans/SKILL.md +217 -0
  17. package/assets/.claude/skills/documenting-plans/templates/plan.md +182 -0
  18. package/assets/.claude/skills/documenting-specifications/SKILL.md +300 -0
  19. package/assets/.claude/skills/documenting-specifications/guides/error-handling.md +78 -0
  20. package/assets/.claude/skills/documenting-specifications/guides/stdd-violations.md +237 -0
  21. package/assets/.claude/skills/documenting-specifications/templates/requirements.md +184 -0
  22. package/assets/.claude/skills/documenting-specifications/templates/screen-items-definition.md +179 -0
  23. package/assets/.claude/skills/documenting-specifications/templates/tech-design.md +241 -0
  24. package/assets/.claude/skills/generating-wireframes/SKILL.md +121 -0
  25. package/assets/.claude/skills/generating-wireframes/examples/tob-form.html +497 -0
  26. package/assets/.claude/skills/generating-wireframes/examples/tob-list.html +536 -0
  27. package/assets/.claude/skills/generating-wireframes/examples/toc-form.html +493 -0
  28. package/assets/.claude/skills/generating-wireframes/examples/toc-list.html +538 -0
  29. package/assets/.claude/skills/generating-wireframes/guides/from-requirements.md +53 -0
  30. package/assets/.claude/skills/generating-wireframes/templates/index.html +472 -0
  31. package/assets/.claude/skills/generating-wireframes/templates/screen.html +480 -0
  32. package/assets/.claude/skills/introducing-stdd/SKILL.md +185 -0
  33. package/assets/.claude/skills/introducing-stdd/templates/introduction-plan.md +64 -0
  34. package/assets/.claude/skills/kaizen/SKILL.md +129 -0
  35. package/assets/.claude/skills/kaizen/references/code-examples.md +233 -0
  36. package/assets/.claude/skills/reverse-engineering-common-spec/SKILL.md +137 -0
  37. package/assets/.claude/skills/reverse-engineering-feature-spec/SKILL.md +463 -0
  38. package/assets/.claude/skills/reverse-engineering-feature-spec/guides/accuracy.md +215 -0
  39. package/assets/.claude/skills/reverse-engineering-feature-spec/guides/figma-capture.md +313 -0
  40. package/assets/.claude/skills/review-pr-with-agents/SKILL.md +159 -0
  41. package/assets/.claude/skills/searching-existing-solutions/SKILL.md +110 -0
  42. package/assets/.claude/skills/setup-stdd/SKILL.md +82 -0
  43. package/assets/.claude/skills/software-architecture/SKILL.md +260 -0
  44. package/assets/.claude/skills/starting-new-with-stdd/SKILL.md +142 -0
  45. package/assets/.claude/skills/starting-new-with-stdd/templates/bootstrap-plan.md +73 -0
  46. package/assets/.claude/skills/tailoring-spec-format/SKILL.md +103 -0
  47. package/assets/.claude/skills/verifying-consistency/SKILL.md +90 -0
  48. package/assets/stdd.config.yml.tpl +34 -0
  49. package/dist/cli.js +148 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/install.js +121 -0
  52. package/dist/install.js.map +1 -0
  53. package/package.json +48 -0
@@ -0,0 +1,472 @@
1
+ <!--
2
+ index.html — 機能内のワイヤーフレーム一覧(目次)ひな型
3
+
4
+ 使い方:
5
+ - docs/<app>/<feature_path>/wireframes/index.html としてコピーする。
6
+ - 各画面 HTML へのリンクと、1 行説明を並べる。
7
+ - REQUIREMENTS.md の「3. UI/UX デザイン」からは、まずこの index.html を指す。
8
+ -->
9
+ <!DOCTYPE html>
10
+ <html lang="ja">
11
+ <head>
12
+ <meta charset="UTF-8" />
13
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
14
+ <title>[機能名] - ワイヤーフレーム一覧</title>
15
+ <style>
16
+ /*
17
+ * wireframe.css — STDD 汎用ワイヤーフレーム デザインシステム
18
+ *
19
+ * 目的:
20
+ * 低忠実度(low-fidelity)のワイヤーフレームを、技術スタック非依存の
21
+ * 素の HTML + CSS で表現するための共通スタイル。
22
+ *
23
+ * 方針:
24
+ * - グレースケール基調。ブランドカラー・装飾は持たない(実装の自由度を縛らない)。
25
+ * - レイアウト・情報設計・主要文言(タイトル / ボタン / 項目ラベル)の合意形成に用いる。
26
+ * - モバイルファースト。768px 以上でデスクトップレイアウトに展開する。
27
+ * - 各画面 HTML の <head> 内に <style> として直接埋め込む(CSS 単体ファイルは作らない / 自己完結 HTML)。
28
+ *
29
+ * 使い方:
30
+ * components の各クラス(wf-*)を組み合わせて画面を組む。
31
+ * クラス一覧は同ディレクトリの SKILL.md / templates/screen.html を参照。
32
+ */
33
+
34
+ /* ===== Reset / Base ===== */
35
+ * {
36
+ box-sizing: border-box;
37
+ margin: 0;
38
+ padding: 0;
39
+ }
40
+
41
+ :root {
42
+ --wf-ink: #2b2b2b; /* 主要テキスト */
43
+ --wf-muted: #777; /* 補助テキスト・プレースホルダ */
44
+ --wf-line: #c9c9c9; /* 枠線 */
45
+ --wf-fill: #f2f2f2; /* 面(薄) */
46
+ --wf-fill-2: #e4e4e4; /* 面(中) */
47
+ --wf-fill-3: #d2d2d2; /* 面(濃)/ primary ボタン */
48
+ --wf-bg: #ffffff;
49
+ --wf-radius: 4px;
50
+ --wf-gap: 12px;
51
+ --wf-pad: 16px;
52
+ }
53
+
54
+ body {
55
+ font-family: -apple-system, "Segoe UI", "Noto Sans JP", "Hiragino Sans", sans-serif;
56
+ color: var(--wf-ink);
57
+ background: #eaeaea;
58
+ line-height: 1.5;
59
+ font-size: 14px;
60
+ }
61
+
62
+ /* ===== ラベル(画面名・状態名の注記) ===== */
63
+ .wf-screen-label {
64
+ max-width: 1100px;
65
+ margin: 16px auto 0;
66
+ padding: 0 16px;
67
+ font-size: 12px;
68
+ color: var(--wf-muted);
69
+ letter-spacing: 0.04em;
70
+ }
71
+ .wf-screen-label strong {
72
+ color: var(--wf-ink);
73
+ font-size: 13px;
74
+ }
75
+
76
+ /* ===== Page shell ===== */
77
+ .wf-page {
78
+ max-width: 1100px;
79
+ margin: 8px auto 32px;
80
+ background: var(--wf-bg);
81
+ border: 1px solid var(--wf-line);
82
+ border-radius: var(--wf-radius);
83
+ overflow: hidden;
84
+ }
85
+ /* モバイル枠(幅 390px 固定)でプレビューしたい場合に付与 */
86
+ .wf-page--mobile {
87
+ max-width: 390px;
88
+ }
89
+
90
+ /* ===== Header(グローバルヘッダー) ===== */
91
+ .wf-header {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: var(--wf-gap);
95
+ padding: 12px var(--wf-pad);
96
+ border-bottom: 1px solid var(--wf-line);
97
+ background: var(--wf-fill);
98
+ }
99
+ .wf-header__logo {
100
+ font-weight: 700;
101
+ padding: 6px 10px;
102
+ border: 1px solid var(--wf-line);
103
+ border-radius: var(--wf-radius);
104
+ background: var(--wf-bg);
105
+ }
106
+ .wf-header__nav {
107
+ display: flex;
108
+ gap: 16px;
109
+ flex-wrap: wrap;
110
+ color: var(--wf-muted);
111
+ }
112
+ .wf-header__spacer { flex: 1; }
113
+
114
+ /* ===== Body layout(サイドバー + メイン) ===== */
115
+ .wf-body {
116
+ display: flex;
117
+ min-height: 360px;
118
+ }
119
+ .wf-sidebar {
120
+ width: 200px;
121
+ flex-shrink: 0;
122
+ border-right: 1px solid var(--wf-line);
123
+ background: var(--wf-fill);
124
+ padding: var(--wf-pad);
125
+ }
126
+ .wf-sidebar__item {
127
+ padding: 8px 10px;
128
+ border-radius: var(--wf-radius);
129
+ color: var(--wf-muted);
130
+ }
131
+ .wf-sidebar__item--active {
132
+ background: var(--wf-fill-2);
133
+ color: var(--wf-ink);
134
+ font-weight: 600;
135
+ }
136
+ .wf-main {
137
+ flex: 1;
138
+ padding: var(--wf-pad);
139
+ min-width: 0;
140
+ }
141
+
142
+ /* モバイル: サイドバーは隠してハンバーガー前提(注記用ダミー) */
143
+ @media (max-width: 767px) {
144
+ .wf-sidebar { display: none; }
145
+ }
146
+
147
+ /* ===== 見出し / パンくず / タブ ===== */
148
+ .wf-breadcrumb {
149
+ color: var(--wf-muted);
150
+ font-size: 12px;
151
+ margin-bottom: 8px;
152
+ }
153
+ .wf-title {
154
+ font-size: 20px;
155
+ font-weight: 700;
156
+ margin-bottom: 4px;
157
+ }
158
+ .wf-subtitle {
159
+ color: var(--wf-muted);
160
+ margin-bottom: var(--wf-pad);
161
+ }
162
+ .wf-tabs {
163
+ display: flex;
164
+ gap: 4px;
165
+ border-bottom: 1px solid var(--wf-line);
166
+ margin-bottom: var(--wf-pad);
167
+ }
168
+ .wf-tabs__item {
169
+ padding: 8px 14px;
170
+ color: var(--wf-muted);
171
+ border: 1px solid transparent;
172
+ border-bottom: none;
173
+ }
174
+ .wf-tabs__item--active {
175
+ color: var(--wf-ink);
176
+ font-weight: 600;
177
+ border-color: var(--wf-line);
178
+ border-radius: var(--wf-radius) var(--wf-radius) 0 0;
179
+ background: var(--wf-fill);
180
+ margin-bottom: -1px;
181
+ }
182
+
183
+ /* ===== ツールバー(件数 + アクション) ===== */
184
+ .wf-toolbar {
185
+ display: flex;
186
+ align-items: center;
187
+ gap: var(--wf-gap);
188
+ flex-wrap: wrap;
189
+ margin-bottom: var(--wf-pad);
190
+ }
191
+ .wf-toolbar__spacer { flex: 1; }
192
+ .wf-count { color: var(--wf-muted); }
193
+
194
+ /* ===== 検索 / フィルタ ===== */
195
+ .wf-search {
196
+ border: 1px solid var(--wf-line);
197
+ border-radius: var(--wf-radius);
198
+ margin-bottom: var(--wf-pad);
199
+ overflow: hidden;
200
+ }
201
+ .wf-search__head {
202
+ padding: 8px var(--wf-pad);
203
+ background: var(--wf-fill-2);
204
+ font-weight: 600;
205
+ }
206
+ .wf-search__body {
207
+ padding: var(--wf-pad);
208
+ display: grid;
209
+ grid-template-columns: 1fr;
210
+ gap: var(--wf-gap);
211
+ }
212
+ @media (min-width: 768px) {
213
+ .wf-search__body { grid-template-columns: 1fr 1fr; }
214
+ }
215
+ .wf-search__actions {
216
+ grid-column: 1 / -1;
217
+ display: flex;
218
+ justify-content: flex-end;
219
+ gap: 8px;
220
+ }
221
+
222
+ /* ===== Form / Field ===== */
223
+ .wf-form {
224
+ display: grid;
225
+ grid-template-columns: 1fr;
226
+ gap: var(--wf-gap);
227
+ }
228
+ @media (min-width: 768px) {
229
+ .wf-form--2col { grid-template-columns: 1fr 1fr; }
230
+ }
231
+ .wf-field { display: flex; flex-direction: column; gap: 4px; }
232
+ .wf-field--full { grid-column: 1 / -1; }
233
+ .wf-label { font-size: 12px; color: var(--wf-ink); font-weight: 600; }
234
+ .wf-label--required::after { content: " *"; color: var(--wf-muted); }
235
+ .wf-input,
236
+ .wf-select,
237
+ .wf-textarea {
238
+ border: 1px solid var(--wf-line);
239
+ border-radius: var(--wf-radius);
240
+ background: var(--wf-bg);
241
+ padding: 8px 10px;
242
+ color: var(--wf-muted);
243
+ min-height: 36px;
244
+ }
245
+ .wf-textarea { min-height: 88px; }
246
+ /* セレクトのプルダウン矢印は HTML 側に「▾」を明示的に書く(例: <span class="wf-select">すべて ▾</span>) */
247
+ .wf-help { font-size: 11px; color: var(--wf-muted); }
248
+ .wf-error { font-size: 11px; color: var(--wf-ink); font-weight: 600; }
249
+
250
+ /* ===== Buttons ===== */
251
+ .wf-button {
252
+ display: inline-flex;
253
+ align-items: center;
254
+ justify-content: center;
255
+ gap: 6px;
256
+ min-height: 36px;
257
+ padding: 8px 16px;
258
+ border: 1px solid var(--wf-line);
259
+ border-radius: var(--wf-radius);
260
+ background: var(--wf-bg);
261
+ color: var(--wf-ink);
262
+ font: inherit;
263
+ cursor: default;
264
+ }
265
+ .wf-button--primary { background: var(--wf-fill-3); font-weight: 600; }
266
+ .wf-button--ghost { border-color: transparent; color: var(--wf-muted); }
267
+ .wf-button--sm { min-height: 28px; padding: 4px 10px; font-size: 12px; }
268
+
269
+ /* ===== Table ===== */
270
+ .wf-table-wrap {
271
+ border: 1px solid var(--wf-line);
272
+ border-radius: var(--wf-radius);
273
+ overflow-x: auto;
274
+ }
275
+ .wf-table {
276
+ width: 100%;
277
+ border-collapse: collapse;
278
+ min-width: 640px;
279
+ }
280
+ .wf-table th,
281
+ .wf-table td {
282
+ text-align: left;
283
+ padding: 10px 12px;
284
+ border-bottom: 1px solid var(--wf-line);
285
+ white-space: nowrap;
286
+ }
287
+ .wf-table thead th {
288
+ background: var(--wf-fill-2);
289
+ font-weight: 600;
290
+ }
291
+ .wf-table tbody tr:last-child td { border-bottom: none; }
292
+ .wf-table td.wf-td--muted { color: var(--wf-muted); }
293
+
294
+ /* ===== Cards / Grid ===== */
295
+ .wf-grid {
296
+ display: grid;
297
+ grid-template-columns: 1fr;
298
+ gap: var(--wf-gap);
299
+ }
300
+ @media (min-width: 768px) { .wf-grid--2 { grid-template-columns: repeat(2, 1fr); } }
301
+ @media (min-width: 1024px) { .wf-grid--3 { grid-template-columns: repeat(3, 1fr); } }
302
+ .wf-card {
303
+ border: 1px solid var(--wf-line);
304
+ border-radius: var(--wf-radius);
305
+ padding: var(--wf-pad);
306
+ background: var(--wf-bg);
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 6px;
310
+ }
311
+ .wf-card__title { font-weight: 600; }
312
+ .wf-card__meta { color: var(--wf-muted); font-size: 12px; }
313
+
314
+ /* ===== Kanban ===== */
315
+ .wf-kanban {
316
+ display: grid;
317
+ grid-template-columns: 1fr;
318
+ gap: var(--wf-gap);
319
+ }
320
+ @media (min-width: 768px) {
321
+ .wf-kanban--3 { grid-template-columns: repeat(3, 1fr); }
322
+ }
323
+ .wf-kanban__col {
324
+ background: var(--wf-fill);
325
+ border: 1px solid var(--wf-line);
326
+ border-radius: var(--wf-radius);
327
+ padding: 10px;
328
+ display: flex;
329
+ flex-direction: column;
330
+ gap: 10px;
331
+ }
332
+ .wf-kanban__head { font-weight: 600; }
333
+
334
+ /* ===== Tag / Badge ===== */
335
+ .wf-tag {
336
+ display: inline-block;
337
+ padding: 2px 8px;
338
+ border: 1px solid var(--wf-line);
339
+ border-radius: 999px;
340
+ font-size: 11px;
341
+ color: var(--wf-muted);
342
+ background: var(--wf-fill);
343
+ }
344
+
345
+ /* ===== Placeholder(画像 / アバター) ===== */
346
+ .wf-img {
347
+ position: relative;
348
+ background: var(--wf-fill);
349
+ border: 1px solid var(--wf-line);
350
+ border-radius: var(--wf-radius);
351
+ min-height: 96px;
352
+ }
353
+ .wf-img::after {
354
+ content: "";
355
+ position: absolute;
356
+ inset: 0;
357
+ background:
358
+ linear-gradient(to top right, transparent calc(50% - 1px), var(--wf-line), transparent calc(50% + 1px)),
359
+ linear-gradient(to top left, transparent calc(50% - 1px), var(--wf-line), transparent calc(50% + 1px));
360
+ }
361
+ .wf-avatar {
362
+ width: 40px;
363
+ height: 40px;
364
+ border-radius: 999px;
365
+ background: var(--wf-fill-2);
366
+ border: 1px solid var(--wf-line);
367
+ flex-shrink: 0;
368
+ }
369
+
370
+ /* ===== Pagination ===== */
371
+ .wf-pagination {
372
+ display: flex;
373
+ justify-content: center;
374
+ gap: 4px;
375
+ margin-top: var(--wf-pad);
376
+ }
377
+ .wf-pagination__item {
378
+ min-width: 32px;
379
+ min-height: 32px;
380
+ display: inline-flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ border: 1px solid var(--wf-line);
384
+ border-radius: var(--wf-radius);
385
+ color: var(--wf-muted);
386
+ }
387
+ .wf-pagination__item--active {
388
+ background: var(--wf-fill-2);
389
+ color: var(--wf-ink);
390
+ font-weight: 600;
391
+ }
392
+
393
+ /* ===== 空状態 / エラー状態 ===== */
394
+ .wf-empty {
395
+ border: 1px dashed var(--wf-line);
396
+ border-radius: var(--wf-radius);
397
+ padding: 40px var(--wf-pad);
398
+ text-align: center;
399
+ color: var(--wf-muted);
400
+ }
401
+
402
+ /* ===== Modal / Dialog(重ね表示はせず、注記付きで並置) ===== */
403
+ .wf-modal {
404
+ max-width: 480px;
405
+ margin: 0 auto;
406
+ border: 1px solid var(--wf-line);
407
+ border-radius: var(--wf-radius);
408
+ background: var(--wf-bg);
409
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
410
+ }
411
+ .wf-modal__head {
412
+ padding: 12px var(--wf-pad);
413
+ border-bottom: 1px solid var(--wf-line);
414
+ font-weight: 600;
415
+ display: flex;
416
+ align-items: center;
417
+ }
418
+ .wf-modal__head .wf-toolbar__spacer { flex: 1; }
419
+ .wf-modal__body { padding: var(--wf-pad); display: grid; gap: var(--wf-gap); }
420
+ .wf-modal__foot {
421
+ padding: 12px var(--wf-pad);
422
+ border-top: 1px solid var(--wf-line);
423
+ display: flex;
424
+ justify-content: flex-end;
425
+ gap: 8px;
426
+ }
427
+
428
+ /* ===== 注記(インタラクション説明など) ===== */
429
+ .wf-note {
430
+ font-size: 11px;
431
+ color: var(--wf-muted);
432
+ border-left: 3px solid var(--wf-line);
433
+ padding: 2px 8px;
434
+ margin-top: 6px;
435
+ }
436
+
437
+ /* ===== ユーティリティ ===== */
438
+ .wf-row { display: flex; align-items: center; gap: var(--wf-gap); flex-wrap: wrap; }
439
+ .wf-stack { display: flex; flex-direction: column; gap: 8px; }
440
+ .wf-mt { margin-top: var(--wf-pad); }
441
+ .wf-muted { color: var(--wf-muted); }
442
+ </style>
443
+ </head>
444
+ <body>
445
+ <div class="wf-page">
446
+ <main class="wf-main">
447
+ <h1 class="wf-title">[機能名] ワイヤーフレーム</h1>
448
+ <p class="wf-subtitle">画面一覧。各リンクから個別のワイヤーフレームを開く。</p>
449
+
450
+ <div class="wf-table-wrap">
451
+ <table class="wf-table">
452
+ <thead>
453
+ <tr><th>画面</th><th>状態</th><th>概要</th></tr>
454
+ </thead>
455
+ <tbody>
456
+ <tr>
457
+ <td><a href="./[screen-1].html">[画面名1]</a></td>
458
+ <td class="wf-td--muted">通常</td>
459
+ <td class="wf-td--muted">[1 行説明]</td>
460
+ </tr>
461
+ <tr>
462
+ <td><a href="./[screen-2].html">[画面名2]</a></td>
463
+ <td class="wf-td--muted">通常 / 空 / エラー</td>
464
+ <td class="wf-td--muted">[1 行説明]</td>
465
+ </tr>
466
+ </tbody>
467
+ </table>
468
+ </div>
469
+ </main>
470
+ </div>
471
+ </body>
472
+ </html>