spec-runner 1.6.0 → 1.7.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/bin/spec-runner-installer.js +7 -85
- package/package.json +1 -1
- package/spec-runner/templates/.claude/rules/agent-delegation.md +1 -0
- package/spec-runner/templates/.claude/skills/architecture-skill-development/SKILL.md +23 -10
- package/spec-runner/templates/.github/skills/architecture-skill-development/SKILL.md +23 -10
- package/spec-runner/templates/.spec-runner/references/resources.md +46 -0
|
@@ -25,15 +25,13 @@ const DEST_GITHUB_DIR = path.join(CWD, ".github");
|
|
|
25
25
|
|
|
26
26
|
const FORCE = process.env.SPEC_RUNNER_FORCE === "1";
|
|
27
27
|
const TARGET = (process.env.SPEC_RUNNER_TARGET || "").trim().toLowerCase();
|
|
28
|
-
const MODE = (process.env.SPEC_RUNNER_MODE || "").trim().toLowerCase();
|
|
29
|
-
const ARCH_STATUS = (process.env.SPEC_RUNNER_ARCH_STATUS || "").trim().toLowerCase();
|
|
30
28
|
|
|
31
29
|
const TEMPLATE_ROOT = path.join(PKG_DIR, "spec-runner", "templates");
|
|
32
30
|
const CLAUDE_TEMPLATE_DIR = path.join(TEMPLATE_ROOT, ".claude");
|
|
33
31
|
const COPILOT_TEMPLATE_DIR = path.join(TEMPLATE_ROOT, ".github");
|
|
34
32
|
|
|
35
33
|
function parseArgs(argv) {
|
|
36
|
-
const out = { target: ""
|
|
34
|
+
const out = { target: "" };
|
|
37
35
|
for (let i = 0; i < argv.length; i += 1) {
|
|
38
36
|
const a = argv[i];
|
|
39
37
|
if (a === "--target" && i + 1 < argv.length) {
|
|
@@ -45,24 +43,6 @@ function parseArgs(argv) {
|
|
|
45
43
|
out.target = a.slice("--target=".length).trim().toLowerCase();
|
|
46
44
|
continue;
|
|
47
45
|
}
|
|
48
|
-
if (a === "--mode" && i + 1 < argv.length) {
|
|
49
|
-
out.mode = String(argv[i + 1] || "").trim().toLowerCase();
|
|
50
|
-
i += 1;
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
if (a.startsWith("--mode=")) {
|
|
54
|
-
out.mode = a.slice("--mode=".length).trim().toLowerCase();
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
if (a === "--arch-status" && i + 1 < argv.length) {
|
|
58
|
-
out.archStatus = String(argv[i + 1] || "").trim().toLowerCase();
|
|
59
|
-
i += 1;
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
if (a.startsWith("--arch-status=")) {
|
|
63
|
-
out.archStatus = a.slice("--arch-status=".length).trim().toLowerCase();
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
46
|
}
|
|
67
47
|
return out;
|
|
68
48
|
}
|
|
@@ -196,48 +176,6 @@ function promptTargetInteractive() {
|
|
|
196
176
|
return "claude";
|
|
197
177
|
}
|
|
198
178
|
|
|
199
|
-
function normalizeMode(t) {
|
|
200
|
-
if (!t) return "";
|
|
201
|
-
const x = String(t).trim().toLowerCase();
|
|
202
|
-
if (x === "new" || x === "n") return "new";
|
|
203
|
-
if (x === "existing" || x === "exist" || x === "e") return "existing";
|
|
204
|
-
return "";
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
function promptModeInteractive() {
|
|
208
|
-
if (!isTTY()) return "new";
|
|
209
|
-
|
|
210
|
-
const ans = promptLine(
|
|
211
|
-
"\nプロジェクトの状態を選んでください:\n" +
|
|
212
|
-
" 1) 新規プロジェクト\n" +
|
|
213
|
-
" 2) 既存プロジェクト\n" +
|
|
214
|
-
"選択 [1/2] : "
|
|
215
|
-
);
|
|
216
|
-
if (ans === "2") return "existing";
|
|
217
|
-
return "new";
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
function normalizeArchStatus(t) {
|
|
221
|
-
if (!t) return "";
|
|
222
|
-
const x = String(t).trim().toLowerCase();
|
|
223
|
-
if (x === "undecided" || x === "u") return "undecided";
|
|
224
|
-
if (x === "decided" || x === "d") return "decided";
|
|
225
|
-
return "";
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function promptArchStatusInteractive() {
|
|
229
|
-
if (!isTTY()) return "undecided";
|
|
230
|
-
|
|
231
|
-
const ans = promptLine(
|
|
232
|
-
"\nアーキテクチャの状態を選んでください:\n" +
|
|
233
|
-
" 1) 未決定(これから決める)\n" +
|
|
234
|
-
" 2) 既に決まっている\n" +
|
|
235
|
-
"選択 [1/2] : "
|
|
236
|
-
);
|
|
237
|
-
if (ans === "2") return "decided";
|
|
238
|
-
return "undecided";
|
|
239
|
-
}
|
|
240
|
-
|
|
241
179
|
function archivePathFor(destPath, archiveRoot) {
|
|
242
180
|
// destPath は CWD の配下を想定
|
|
243
181
|
const rel = path.relative(CWD, destPath);
|
|
@@ -390,21 +328,12 @@ function printBanner() {
|
|
|
390
328
|
console.log("");
|
|
391
329
|
}
|
|
392
330
|
|
|
393
|
-
function printNextSteps(
|
|
331
|
+
function printNextSteps() {
|
|
394
332
|
console.log("─────────────────────────────────────────");
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
console.log(" (既に決まっているアーキテクチャを記述)");
|
|
400
|
-
console.log("");
|
|
401
|
-
console.log(" 2. Claude Code を開いて /architecture-skill-development を実行してください。");
|
|
402
|
-
} else {
|
|
403
|
-
console.log("次のステップ:");
|
|
404
|
-
console.log("");
|
|
405
|
-
console.log(" Claude Code を開いて、作りたいものを伝えてください。");
|
|
406
|
-
console.log(" セットアップが自動で始まります。");
|
|
407
|
-
}
|
|
333
|
+
console.log("次のステップ:");
|
|
334
|
+
console.log("");
|
|
335
|
+
console.log(" Claude Code を開いて、作りたいものを伝えてください。");
|
|
336
|
+
console.log(" セットアップが自動で始まります。");
|
|
408
337
|
console.log("─────────────────────────────────────────");
|
|
409
338
|
}
|
|
410
339
|
|
|
@@ -415,13 +344,6 @@ function main() {
|
|
|
415
344
|
let target = normalizeTarget(args.target) || normalizeTarget(TARGET);
|
|
416
345
|
if (!target) target = promptTargetInteractive();
|
|
417
346
|
|
|
418
|
-
let mode = normalizeMode(args.mode) || normalizeMode(MODE);
|
|
419
|
-
if (!mode) mode = promptModeInteractive();
|
|
420
|
-
|
|
421
|
-
let archStatus = normalizeArchStatus(args.archStatus) || normalizeArchStatus(ARCH_STATUS);
|
|
422
|
-
if (!archStatus && mode === "new") archStatus = promptArchStatusInteractive();
|
|
423
|
-
if (!archStatus) archStatus = "undecided";
|
|
424
|
-
|
|
425
347
|
const ts = FORCE ? isoTimestampSafe() : null;
|
|
426
348
|
const archiveRoot = ts ? path.join(CWD, ".spec-runner", "archive", ts) : null;
|
|
427
349
|
|
|
@@ -466,7 +388,7 @@ function main() {
|
|
|
466
388
|
else if (target === "copilot") console.log("完了: .github/ を導入しました。");
|
|
467
389
|
else console.log("完了: .claude/ と .github/ を導入しました。");
|
|
468
390
|
console.log("");
|
|
469
|
-
printNextSteps(
|
|
391
|
+
printNextSteps();
|
|
470
392
|
}
|
|
471
393
|
|
|
472
394
|
main();
|
package/package.json
CHANGED
|
@@ -14,6 +14,7 @@ description: メインエージェントがサブエージェントへ委任す
|
|
|
14
14
|
| コーディング規約チェック | `@review-code` | 実装・修正が完了したとき |
|
|
15
15
|
| テスト実行+失敗分析 | `@run-tests` | 実装・修正が完了したとき |
|
|
16
16
|
| 変更の影響範囲調査 | `@analyze-impact` | design-change で影響範囲を洗うとき |
|
|
17
|
+
| エラー・技術的な詰まりの調査 | サブエージェント(WebSearch) | 解決策が不明なとき。`.spec-runner/references/resources.md` に記載された URL を起点に検索する |
|
|
17
18
|
|
|
18
19
|
## 並行起動
|
|
19
20
|
|
|
@@ -37,18 +37,19 @@ Phase 6: セットアップ専用 skill のアーカイブ提案
|
|
|
37
37
|
2. 常時守る約束は rule にする
|
|
38
38
|
3. 毎回コピーする設計書は template にする
|
|
39
39
|
|
|
40
|
-
###
|
|
40
|
+
### プロジェクト専用スキルの作成
|
|
41
41
|
|
|
42
|
-
`architecture.yaml` の `style`
|
|
42
|
+
`architecture.yaml` の `style` に応じた seed(`ddd-seed` / `simple-seed`)がインストール済みの場合、どのように専用スキルを作るかをユーザーに確認する。
|
|
43
43
|
|
|
44
|
-
|
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
44
|
+
| 選択肢 | 内容 |
|
|
45
|
+
|--------|------|
|
|
46
|
+
| 新規に作る | `harness-format.md` を基に、このプロジェクトのフローをゼロから記述する |
|
|
47
|
+
| リネームだけ | seed ファイルをプロジェクト専用名に変更する |
|
|
48
|
+
| リネーム+構成変更 | seed をリネームしたうえでフェーズ構成・テンプレートパスをプロジェクトの実態に合わせて書き換える |
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
seed が存在しない場合は「新規に作る」で進める。
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
`has_frontend: true` の場合は、UC ファイルに画面レイアウトセクションを含める旨を専用スキルに明記する。
|
|
52
53
|
|
|
53
54
|
4. ユーザーに確認・承認を得る
|
|
54
55
|
|
|
@@ -88,6 +89,19 @@ Phase 6: セットアップ専用 skill のアーカイブ提案
|
|
|
88
89
|
3. **言語・型固有ルール**: `<your-language-and-type-rules>` を言語・フレームワークに合わせた具体的なルールに書き換える
|
|
89
90
|
4. **プロジェクト構造**: `<your-project-structure>` を `folder_structure` の実際のディレクトリ構成に書き換える
|
|
90
91
|
|
|
92
|
+
### リファレンス URL の登録
|
|
93
|
+
|
|
94
|
+
`.spec-runner/references/resources.md` に、このプロジェクトで使う公式ドキュメントの URL を登録する。
|
|
95
|
+
|
|
96
|
+
1. ユーザーに以下を確認する:
|
|
97
|
+
- 言語・フレームワーク・ツールの公式ドキュメント URL
|
|
98
|
+
- 参考にしているサンプルリポジトリ・リファレンス実装
|
|
99
|
+
- API 仕様(OpenAPI など)
|
|
100
|
+
- 社内 Wiki・Notion などの内部ドキュメント
|
|
101
|
+
- その他ベストプラクティス記事・移行ガイドなど
|
|
102
|
+
2. 教えてもらった情報を名前・カテゴリとともに `.spec-runner/references/resources.md` の該当テーブルに書き込む
|
|
103
|
+
3. ユーザーが追加を終えたら次へ進む
|
|
104
|
+
|
|
91
105
|
### その他の基盤 skill
|
|
92
106
|
|
|
93
107
|
同様のプレースホルダーや汎用記述が他の skill にあれば、同じ要領で書き換える。
|
|
@@ -109,8 +123,7 @@ Phase 6: セットアップ専用 skill のアーカイブ提案
|
|
|
109
123
|
|---|---|
|
|
110
124
|
| `architecture-definition` | 新規プロジェクト初期化専用。アーキテクチャ確定後は不要 |
|
|
111
125
|
| `existing-project-to-docs` | 既存プロジェクト取り込み専用。docs 生成後は不要 |
|
|
112
|
-
| `ddd-seed`
|
|
113
|
-
| `simple-seed` | style: layered で seed 使用後は不要 |
|
|
126
|
+
| `ddd-seed` / `simple-seed` | プロジェクト専用スキル作成後は不要 |
|
|
114
127
|
| `architecture-skill-development`(このファイル自身) | project 専用 skill が安定したら不要。アーキテクチャ大変更時は再利用可 |
|
|
115
128
|
|
|
116
129
|
### 手順
|
|
@@ -37,18 +37,19 @@ Phase 6: セットアップ専用 skill のアーカイブ提案
|
|
|
37
37
|
2. 常時守る約束は rule にする
|
|
38
38
|
3. 毎回コピーする設計書は template にする
|
|
39
39
|
|
|
40
|
-
###
|
|
40
|
+
### プロジェクト専用スキルの作成
|
|
41
41
|
|
|
42
|
-
`architecture.yaml` の `style`
|
|
42
|
+
`architecture.yaml` の `style` に応じた seed(`ddd-seed` / `simple-seed`)がインストール済みの場合、どのように専用スキルを作るかをユーザーに確認する。
|
|
43
43
|
|
|
44
|
-
|
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
|
44
|
+
| 選択肢 | 内容 |
|
|
45
|
+
|--------|------|
|
|
46
|
+
| 新規に作る | `harness-format.md` を基に、このプロジェクトのフローをゼロから記述する |
|
|
47
|
+
| リネームだけ | seed ファイルをプロジェクト専用名に変更する |
|
|
48
|
+
| リネーム+構成変更 | seed をリネームしたうえでフェーズ構成・テンプレートパスをプロジェクトの実態に合わせて書き換える |
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
seed が存在しない場合は「新規に作る」で進める。
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
`has_frontend: true` の場合は、UC ファイルに画面レイアウトセクションを含める旨を専用スキルに明記する。
|
|
52
53
|
|
|
53
54
|
4. ユーザーに確認・承認を得る
|
|
54
55
|
|
|
@@ -88,6 +89,19 @@ Phase 6: セットアップ専用 skill のアーカイブ提案
|
|
|
88
89
|
3. **言語・型固有ルール**: `<your-language-and-type-rules>` を言語・フレームワークに合わせた具体的なルールに書き換える
|
|
89
90
|
4. **プロジェクト構造**: `<your-project-structure>` を `folder_structure` の実際のディレクトリ構成に書き換える
|
|
90
91
|
|
|
92
|
+
### リファレンス URL の登録
|
|
93
|
+
|
|
94
|
+
`.spec-runner/references/resources.md` に、このプロジェクトで使う公式ドキュメントの URL を登録する。
|
|
95
|
+
|
|
96
|
+
1. ユーザーに以下を確認する:
|
|
97
|
+
- 言語・フレームワーク・ツールの公式ドキュメント URL
|
|
98
|
+
- 参考にしているサンプルリポジトリ・リファレンス実装
|
|
99
|
+
- API 仕様(OpenAPI など)
|
|
100
|
+
- 社内 Wiki・Notion などの内部ドキュメント
|
|
101
|
+
- その他ベストプラクティス記事・移行ガイドなど
|
|
102
|
+
2. 教えてもらった情報を名前・カテゴリとともに `.spec-runner/references/resources.md` の該当テーブルに書き込む
|
|
103
|
+
3. ユーザーが追加を終えたら次へ進む
|
|
104
|
+
|
|
91
105
|
### その他の基盤 skill
|
|
92
106
|
|
|
93
107
|
同様のプレースホルダーや汎用記述が他の skill にあれば、同じ要領で書き換える。
|
|
@@ -109,8 +123,7 @@ Phase 6: セットアップ専用 skill のアーカイブ提案
|
|
|
109
123
|
|---|---|
|
|
110
124
|
| `architecture-definition` | 新規プロジェクト初期化専用。アーキテクチャ確定後は不要 |
|
|
111
125
|
| `existing-project-to-docs` | 既存プロジェクト取り込み専用。docs 生成後は不要 |
|
|
112
|
-
| `ddd-seed`
|
|
113
|
-
| `simple-seed` | style: layered で seed 使用後は不要 |
|
|
126
|
+
| `ddd-seed` / `simple-seed` | プロジェクト専用スキル作成後は不要 |
|
|
114
127
|
| `architecture-skill-development`(このファイル自身) | project 専用 skill が安定したら不要。アーキテクチャ大変更時は再利用可 |
|
|
115
128
|
|
|
116
129
|
### 手順
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Resources
|
|
2
|
+
|
|
3
|
+
エラーや調査が必要なときにサブエージェントが参照する外部リソース一覧。
|
|
4
|
+
`architecture-skill-development` 実行時に登録する。
|
|
5
|
+
|
|
6
|
+
## 言語・ランタイム
|
|
7
|
+
|
|
8
|
+
| 名前 | URL |
|
|
9
|
+
|------|-----|
|
|
10
|
+
| {言語名} | {公式ドキュメントURL} |
|
|
11
|
+
|
|
12
|
+
## フレームワーク・ライブラリ
|
|
13
|
+
|
|
14
|
+
| 名前 | URL |
|
|
15
|
+
|------|-----|
|
|
16
|
+
| {フレームワーク名} | {公式ドキュメントURL} |
|
|
17
|
+
|
|
18
|
+
## インフラ・ツール
|
|
19
|
+
|
|
20
|
+
| 名前 | URL |
|
|
21
|
+
|------|-----|
|
|
22
|
+
| {ツール名} | {公式ドキュメントURL} |
|
|
23
|
+
|
|
24
|
+
## サンプル・リファレンス実装
|
|
25
|
+
|
|
26
|
+
| 名前 | URL |
|
|
27
|
+
|------|-----|
|
|
28
|
+
| {リポジトリ名} | {URL} |
|
|
29
|
+
|
|
30
|
+
## API 仕様
|
|
31
|
+
|
|
32
|
+
| 名前 | URL |
|
|
33
|
+
|------|-----|
|
|
34
|
+
| {API名} | {URL} |
|
|
35
|
+
|
|
36
|
+
## 社内ドキュメント・Wiki
|
|
37
|
+
|
|
38
|
+
| 名前 | URL |
|
|
39
|
+
|------|-----|
|
|
40
|
+
| {ドキュメント名} | {URL} |
|
|
41
|
+
|
|
42
|
+
## その他(移行ガイド・ベストプラクティス記事など)
|
|
43
|
+
|
|
44
|
+
| 名前 | URL |
|
|
45
|
+
|------|-----|
|
|
46
|
+
| {タイトル} | {URL} |
|