foundruu 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 (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/assets/templates/ai/_common/company/coding-standard.md +35 -0
  4. package/assets/templates/ai/_common/company/git-workflow.md +40 -0
  5. package/assets/templates/ai/_common/company/review-policy.md +30 -0
  6. package/assets/templates/ai/_common/company/security.md +25 -0
  7. package/assets/templates/ai/_common/project/architecture.md.hbs +29 -0
  8. package/assets/templates/ai/_common/project/conventions.md +24 -0
  9. package/assets/templates/ai/_common/project/overview.md.hbs +37 -0
  10. package/assets/templates/ai/_common/project/testing.md +32 -0
  11. package/assets/templates/ai/claude/CLAUDE.md.hbs +65 -0
  12. package/assets/templates/ai/codex/CODEX.md.hbs +60 -0
  13. package/assets/templates/base/.env.example +4 -0
  14. package/assets/templates/base/README.md.hbs +73 -0
  15. package/assets/templates/features/discord/.env.example.patch +3 -0
  16. package/assets/templates/features/discord/package.json.patch +5 -0
  17. package/assets/templates/features/docker/Dockerfile.hbs +38 -0
  18. package/assets/templates/features/docker/docker-compose.yml.hbs +11 -0
  19. package/assets/templates/features/eslint/eslint.config.js +14 -0
  20. package/assets/templates/features/eslint/package.json.patch +11 -0
  21. package/assets/templates/features/github-actions/.github/workflows/ci.yml.hbs +51 -0
  22. package/assets/templates/features/lark/.env.example.patch +3 -0
  23. package/assets/templates/features/lark/package.json.patch +5 -0
  24. package/assets/templates/features/line-bot/.env.example.patch +2 -0
  25. package/assets/templates/features/line-bot/package.json.patch +5 -0
  26. package/assets/templates/features/prettier/.prettierignore +3 -0
  27. package/assets/templates/features/prettier/.prettierrc +7 -0
  28. package/assets/templates/features/prettier/package.json.patch +9 -0
  29. package/assets/templates/features/react/index.html.hbs +12 -0
  30. package/assets/templates/features/react/package.json.patch +17 -0
  31. package/assets/templates/features/react/src/web/App.tsx.hbs +8 -0
  32. package/assets/templates/features/react/src/web/main.tsx +9 -0
  33. package/assets/templates/features/react/vite.config.ts +6 -0
  34. package/assets/templates/features/react-laravel/package.json.patch +19 -0
  35. package/assets/templates/features/react-laravel/resources/js/app.jsx.hbs +17 -0
  36. package/assets/templates/features/react-laravel/vite.config.js +13 -0
  37. package/assets/templates/features/vitest/package.json.patch +10 -0
  38. package/assets/templates/features/vitest/tests/index.test.ts.hbs +7 -0
  39. package/assets/templates/features/vitest/vitest.config.ts +11 -0
  40. package/assets/templates/languages/laravel/.env.example.patch +12 -0
  41. package/assets/templates/languages/laravel/composer.json.hbs +41 -0
  42. package/assets/templates/languages/laravel/docs/SETUP.md.hbs +24 -0
  43. package/assets/templates/languages/typescript/package.json.patch +20 -0
  44. package/assets/templates/languages/typescript/src/index.ts.hbs +1 -0
  45. package/assets/templates/languages/typescript/tsconfig.json +17 -0
  46. package/assets/workflow/.ai/prompts/session-workflow.md +72 -0
  47. package/assets/workflow/.ai/templates/session/design.md +21 -0
  48. package/assets/workflow/.ai/templates/session/questions.md +34 -0
  49. package/assets/workflow/.ai/templates/session/requirements.md +25 -0
  50. package/assets/workflow/.ai/templates/session/summary.md +21 -0
  51. package/assets/workflow/.ai/templates/session/tasks.md +13 -0
  52. package/assets/workflow/.ai/templates/session/test.md +15 -0
  53. package/assets/workflow/.ai/workflows/bugfix.md +19 -0
  54. package/assets/workflow/.ai/workflows/development.md +27 -0
  55. package/assets/workflow/.ai/workflows/feature.md +20 -0
  56. package/assets/workflow/.ai/workflows/review.md +19 -0
  57. package/dist/cli.d.ts +2 -0
  58. package/dist/cli.js +89 -0
  59. package/dist/cli.js.map +1 -0
  60. package/dist/commands/doctor.d.ts +6 -0
  61. package/dist/commands/doctor.js +64 -0
  62. package/dist/commands/doctor.js.map +1 -0
  63. package/dist/commands/init.d.ts +8 -0
  64. package/dist/commands/init.js +94 -0
  65. package/dist/commands/init.js.map +1 -0
  66. package/dist/commands/session.d.ts +8 -0
  67. package/dist/commands/session.js +96 -0
  68. package/dist/commands/session.js.map +1 -0
  69. package/dist/commands/update.d.ts +13 -0
  70. package/dist/commands/update.js +64 -0
  71. package/dist/commands/update.js.map +1 -0
  72. package/dist/commands/workflow.d.ts +7 -0
  73. package/dist/commands/workflow.js +64 -0
  74. package/dist/commands/workflow.js.map +1 -0
  75. package/dist/core/assets.d.ts +8 -0
  76. package/dist/core/assets.js +29 -0
  77. package/dist/core/assets.js.map +1 -0
  78. package/dist/core/config.d.ts +17 -0
  79. package/dist/core/config.js +31 -0
  80. package/dist/core/config.js.map +1 -0
  81. package/dist/core/copier.d.ts +25 -0
  82. package/dist/core/copier.js +103 -0
  83. package/dist/core/copier.js.map +1 -0
  84. package/dist/core/fetcher.d.ts +10 -0
  85. package/dist/core/fetcher.js +56 -0
  86. package/dist/core/fetcher.js.map +1 -0
  87. package/dist/core/logger.d.ts +7 -0
  88. package/dist/core/logger.js +15 -0
  89. package/dist/core/logger.js.map +1 -0
  90. package/dist/core/sync.d.ts +26 -0
  91. package/dist/core/sync.js +69 -0
  92. package/dist/core/sync.js.map +1 -0
  93. package/dist/doctor/checks.d.ts +5 -0
  94. package/dist/doctor/checks.js +97 -0
  95. package/dist/doctor/checks.js.map +1 -0
  96. package/dist/doctor/deep.d.ts +39 -0
  97. package/dist/doctor/deep.js +144 -0
  98. package/dist/doctor/deep.js.map +1 -0
  99. package/dist/doctor/rc.d.ts +13 -0
  100. package/dist/doctor/rc.js +31 -0
  101. package/dist/doctor/rc.js.map +1 -0
  102. package/dist/doctor/runner.d.ts +3 -0
  103. package/dist/doctor/runner.js +39 -0
  104. package/dist/doctor/runner.js.map +1 -0
  105. package/dist/doctor/types.d.ts +32 -0
  106. package/dist/doctor/types.js +3 -0
  107. package/dist/doctor/types.js.map +1 -0
  108. package/dist/registry/templates.d.ts +18 -0
  109. package/dist/registry/templates.js +45 -0
  110. package/dist/registry/templates.js.map +1 -0
  111. package/package.json +50 -0
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.deepRules = void 0;
7
+ exports.scanDocs = scanDocs;
8
+ exports.runDeepDoctor = runDeepDoctor;
9
+ const child_process_1 = require("child_process");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const CATEGORY_LABELS = {
13
+ requirements: "要件品質",
14
+ design: "設計品質",
15
+ test: "テスト品質",
16
+ aiInstructions: "AI指示品質",
17
+ };
18
+ const CATEGORY_PATTERNS = [
19
+ { category: "requirements", pattern: /requirement/i },
20
+ { category: "design", pattern: /design/i },
21
+ { category: "test", pattern: /test/i },
22
+ { category: "aiInstructions", pattern: /(ai[-_]?instructions?|claude|prompt)/i },
23
+ ];
24
+ /** DevDoctor rules.ts 由来のキーワードルール */
25
+ exports.deepRules = [
26
+ { category: "requirements", label: "何を作るかが明確", pattern: /目的|概要|ゴール|goal|purpose|やること/i, improvement: "目的・概要・ゴールのセクションを追加する" },
27
+ { category: "requirements", label: "何を作らないかが明確", pattern: /やらないこと|対象外|スコープ外|非対象|out of scope|non-goals?/i, improvement: "対象外・非ゴールを明記し、AIの作業範囲が膨らまないようにする" },
28
+ { category: "requirements", label: "正常系がある", pattern: /正常系|happy path|基本フロー/i, improvement: "代表的な正常系シナリオを箇条書きで追記する" },
29
+ { category: "requirements", label: "異常系がある", pattern: /異常系|エラー|exception|error case/i, improvement: "エラー時のレスポンスと画面表示を定義する" },
30
+ { category: "requirements", label: "権限条件がある", pattern: /権限|ロール|role|permission|アクセス制御/i, improvement: "誰がこの機能を使えるか(ロール・権限)を明記する" },
31
+ { category: "requirements", label: "完了条件が検証可能", pattern: /完了条件|done条件|完了基準|definition of done|受け入れ条件|acceptance criteria/i, improvement: "誰が見ても判定できる完了条件を箇条書きで定義する" },
32
+ { category: "design", label: "変更対象が書かれている", pattern: /変更対象|対象ファイル|変更点|変更内容/i, improvement: "変更対象のファイル・モジュールを列挙する" },
33
+ { category: "design", label: "既存仕様への影響がある", pattern: /既存|影響|impact|互換性/i, improvement: "既存機能への影響と互換性を明記する" },
34
+ { category: "design", label: "API入出力がある", pattern: /api|エンドポイント|リクエスト|レスポンス|入出力/i, improvement: "エンドポイントの入出力仕様を書く" },
35
+ { category: "design", label: "エラーケースがある", pattern: /エラー|失敗|error|failure/i, improvement: "失敗時の挙動・エラーハンドリング方針を書く" },
36
+ { category: "design", label: "ロールバック方針がある", pattern: /ロールバック|rollback|切り戻し/i, improvement: "問題発生時の切り戻し手順を書く" },
37
+ { category: "design", label: "処理フローが説明されている", pattern: /フロー|流れ|シーケンス|flow|sequence/i, improvement: "主要な処理の流れを図または箇条書きで書く" },
38
+ { category: "test", label: "正常系", pattern: /正常系|happy path/i, improvement: "正常系のテスト観点を追記する" },
39
+ { category: "test", label: "異常系", pattern: /異常系|エラー|error case/i, improvement: "異常系のテスト観点を追記する" },
40
+ { category: "test", label: "境界値", pattern: /境界値|boundary/i, improvement: "境界値のテスト観点を追記する" },
41
+ { category: "test", label: "既存機能への影響", pattern: /既存機能|regression|デグレ|回帰/i, improvement: "リグレッション確認の観点を追記する" },
42
+ { category: "test", label: "手動確認項目", pattern: /手動確認|manual check|手動テスト/i, improvement: "手動で確認すべき項目を列挙する" },
43
+ { category: "test", label: "実行したテストコマンド", pattern: /npm test|vitest|pytest|phpunit|artisan test|実行コマンド/i, improvement: "テストの実行コマンドを明記する" },
44
+ { category: "aiInstructions", label: "目的が明確", pattern: /目的|purpose|goal/i, improvement: "AI指示に目的を明記する" },
45
+ { category: "aiInstructions", label: "変更範囲が限定されている", pattern: /変更範囲|対象範囲|scope|対象ファイル/i, improvement: "AIが触ってよい範囲を限定する" },
46
+ { category: "aiInstructions", label: "禁止事項がある", pattern: /禁止|しない|never|don'?t|やらない/i, improvement: "やってはいけないことを明記する" },
47
+ { category: "aiInstructions", label: "参照ファイルが指定されている", pattern: /参照|reference|該当ファイル|ファイルパス/i, improvement: "参照すべきファイル・ドキュメントを指定する" },
48
+ { category: "aiInstructions", label: "完了条件がある", pattern: /完了条件|done|完了基準/i, improvement: "AIタスクの完了条件を定義する" },
49
+ ];
50
+ function git(cwd, args) {
51
+ return (0, child_process_1.execFileSync)("git", ["-C", cwd, ...args], { stdio: "pipe" }).toString();
52
+ }
53
+ function collectDiff(cwd, since) {
54
+ const base = git(cwd, ["merge-base", since, "HEAD"]).trim();
55
+ const numstat = git(cwd, ["diff", "--numstat", base]);
56
+ let files = 0;
57
+ let insertions = 0;
58
+ let deletions = 0;
59
+ for (const line of numstat.split("\n")) {
60
+ const m = line.match(/^(\d+|-)\t(\d+|-)\t/);
61
+ if (!m)
62
+ continue;
63
+ files += 1;
64
+ if (m[1] !== "-")
65
+ insertions += Number(m[1]);
66
+ if (m[2] !== "-")
67
+ deletions += Number(m[2]);
68
+ }
69
+ return { files, insertions, deletions };
70
+ }
71
+ /** docs/ ・リポジトリ直下・最新の .ai/sessions/ からカテゴリ別ドキュメントを収集する */
72
+ function scanDocs(cwd) {
73
+ const candidates = [];
74
+ for (const dir of ["docs", "doc", "."]) {
75
+ const abs = path_1.default.join(cwd, dir);
76
+ if (!fs_1.default.existsSync(abs))
77
+ continue;
78
+ for (const entry of fs_1.default.readdirSync(abs, { withFileTypes: true })) {
79
+ if (entry.isFile() && /\.(md|txt)$/i.test(entry.name)) {
80
+ candidates.push(path_1.default.join(dir === "." ? "" : dir, entry.name));
81
+ }
82
+ }
83
+ }
84
+ // 最新セッション(mtime 順)のドキュメントも対象にする
85
+ const sessionsDir = path_1.default.join(cwd, ".ai", "sessions");
86
+ if (fs_1.default.existsSync(sessionsDir)) {
87
+ const sessions = fs_1.default
88
+ .readdirSync(sessionsDir, { withFileTypes: true })
89
+ .filter((e) => e.isDirectory())
90
+ .map((e) => ({ name: e.name, mtime: fs_1.default.statSync(path_1.default.join(sessionsDir, e.name)).mtimeMs }))
91
+ .sort((a, b) => b.mtime - a.mtime);
92
+ if (sessions.length > 0) {
93
+ const latest = path_1.default.join(".ai", "sessions", sessions[0].name);
94
+ for (const f of fs_1.default.readdirSync(path_1.default.join(cwd, latest))) {
95
+ if (/\.md$/i.test(f))
96
+ candidates.push(path_1.default.join(latest, f));
97
+ }
98
+ }
99
+ }
100
+ const found = new Map();
101
+ for (const relPath of candidates) {
102
+ const category = CATEGORY_PATTERNS.find((p) => p.pattern.test(path_1.default.basename(relPath)))?.category;
103
+ if (!category || found.has(category))
104
+ continue;
105
+ const content = fs_1.default.readFileSync(path_1.default.join(cwd, relPath), "utf8");
106
+ if (content.trim().length > 0)
107
+ found.set(category, { path: relPath, content });
108
+ }
109
+ return found;
110
+ }
111
+ function runDeepDoctor(cwd, since) {
112
+ const diff = collectDiff(cwd, since);
113
+ const docs = scanDocs(cwd);
114
+ const scores = Object.keys(CATEGORY_LABELS).map((category) => {
115
+ const doc = docs.get(category);
116
+ const rules = exports.deepRules.filter((r) => r.category === category);
117
+ if (!doc) {
118
+ return {
119
+ category,
120
+ label: CATEGORY_LABELS[category],
121
+ score: 0,
122
+ failed: [
123
+ {
124
+ label: `${category} ドキュメントが見つからない`,
125
+ improvement: `docs/ または .ai/sessions/<session>/ に ${category}.md を作成する`,
126
+ },
127
+ ],
128
+ };
129
+ }
130
+ const failed = rules
131
+ .filter((r) => !r.pattern.test(doc.content))
132
+ .map((r) => ({ label: r.label, improvement: r.improvement }));
133
+ return {
134
+ category,
135
+ label: CATEGORY_LABELS[category],
136
+ docPath: doc.path,
137
+ score: Math.round(((rules.length - failed.length) / rules.length) * 100),
138
+ failed,
139
+ };
140
+ });
141
+ const overall = Math.round(scores.reduce((sum, s) => sum + s.score, 0) / scores.length);
142
+ return { since, diff, scores, overall };
143
+ }
144
+ //# sourceMappingURL=deep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep.js","sourceRoot":"","sources":["../../src/doctor/deep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { DoctorCheck, Severity } from "./types";
2
+ export declare const RC_FILE = ".foundruurc";
3
+ export interface FoundruuRc {
4
+ doctor?: {
5
+ /** 無効化するチェックID */
6
+ disable?: string[];
7
+ /** チェックIDごとの severity 上書き */
8
+ severity?: Record<string, Severity>;
9
+ };
10
+ }
11
+ export declare function readRc(cwd: string): FoundruuRc;
12
+ /** .foundruurc の設定をチェックルールへ適用する */
13
+ export declare function applyRc(checks: DoctorCheck[], rc: FoundruuRc): DoctorCheck[];
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RC_FILE = void 0;
7
+ exports.readRc = readRc;
8
+ exports.applyRc = applyRc;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ exports.RC_FILE = ".foundruurc";
12
+ function readRc(cwd) {
13
+ const file = path_1.default.join(cwd, exports.RC_FILE);
14
+ if (!fs_1.default.existsSync(file))
15
+ return {};
16
+ try {
17
+ return JSON.parse(fs_1.default.readFileSync(file, "utf8"));
18
+ }
19
+ catch (err) {
20
+ throw new Error(`${exports.RC_FILE} の JSON が不正です: ${err.message}`);
21
+ }
22
+ }
23
+ /** .foundruurc の設定をチェックルールへ適用する */
24
+ function applyRc(checks, rc) {
25
+ const disabled = new Set(rc.doctor?.disable ?? []);
26
+ const severity = rc.doctor?.severity ?? {};
27
+ return checks
28
+ .filter((c) => !disabled.has(c.id))
29
+ .map((c) => (severity[c.id] ? { ...c, severity: severity[c.id] } : c));
30
+ }
31
+ //# sourceMappingURL=rc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc.js","sourceRoot":"","sources":["../../src/doctor/rc.ts"],"names":[],"mappings":";;;;;;AAeA,wBAQC;AAGD,0BAMC;AAhCD,4CAAoB;AACpB,gDAAwB;AAGX,QAAA,OAAO,GAAG,aAAa,CAAC;AAWrC,SAAgB,MAAM,CAAC,GAAW;IAChC,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAO,CAAC,CAAC;IACrC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,eAAO,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,SAAgB,OAAO,CAAC,MAAqB,EAAE,EAAc;IAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;IAC3C,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { DoctorCheck, DoctorContext, DoctorReport } from "./types";
2
+ export declare function createContext(cwd: string): DoctorContext;
3
+ export declare function runDoctor(cwd: string, checkList?: DoctorCheck[]): DoctorReport;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createContext = createContext;
7
+ exports.runDoctor = runDoctor;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const checks_1 = require("./checks");
11
+ const rc_1 = require("./rc");
12
+ function createContext(cwd) {
13
+ const exists = (rel) => fs_1.default.existsSync(path_1.default.join(cwd, rel));
14
+ return {
15
+ cwd,
16
+ exists,
17
+ existsAny: (rels) => rels.some(exists),
18
+ };
19
+ }
20
+ function runDoctor(cwd, checkList = checks_1.checks) {
21
+ const ctx = createContext(cwd);
22
+ const effective = (0, rc_1.applyRc)(checkList, (0, rc_1.readRc)(cwd));
23
+ const results = effective.map((c) => {
24
+ const ok = c.check(ctx);
25
+ const status = ok ? "pass" : c.severity === "error" ? "fail" : "warn";
26
+ return {
27
+ id: c.id,
28
+ label: c.label,
29
+ category: c.category,
30
+ status,
31
+ ...(ok ? {} : { hint: c.hint }),
32
+ };
33
+ });
34
+ const passed = results.filter((r) => r.status === "pass").length;
35
+ const warned = results.filter((r) => r.status === "warn").length;
36
+ const failed = results.filter((r) => r.status === "fail").length;
37
+ return { results, passed, warned, failed, ok: failed === 0 };
38
+ }
39
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/doctor/runner.ts"],"names":[],"mappings":";;;;;AAMA,sCAOC;AAED,8BAmBC;AAlCD,4CAAoB;AACpB,gDAAwB;AACxB,qCAAmD;AACnD,6BAAuC;AAGvC,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,OAAO;QACL,GAAG;QACH,MAAM;QACN,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,SAAgB,SAAS,CAAC,GAAW,EAAE,YAA2B,eAAa;IAC7E,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAA,YAAO,EAAC,SAAS,EAAE,IAAA,WAAM,EAAC,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACtE,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM;YACN,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,32 @@
1
+ export type Severity = "error" | "warn";
2
+ export type CheckStatus = "pass" | "warn" | "fail";
3
+ export interface DoctorContext {
4
+ cwd: string;
5
+ /** cwd からの相対パスで存在確認する */
6
+ exists(relPath: string): boolean;
7
+ /** glob 的な簡易マッチ: ディレクトリ内にパターンに合うファイルがあるか */
8
+ existsAny(relPaths: string[]): boolean;
9
+ }
10
+ export interface DoctorCheck {
11
+ id: string;
12
+ label: string;
13
+ category: string;
14
+ severity: Severity;
15
+ /** 見つからなかったときの修正ガイド */
16
+ hint: string;
17
+ check(ctx: DoctorContext): boolean;
18
+ }
19
+ export interface CheckResult {
20
+ id: string;
21
+ label: string;
22
+ category: string;
23
+ status: CheckStatus;
24
+ hint?: string;
25
+ }
26
+ export interface DoctorReport {
27
+ results: CheckResult[];
28
+ passed: number;
29
+ warned: number;
30
+ failed: number;
31
+ ok: boolean;
32
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ export interface TemplateDefinition {
2
+ id: string;
3
+ label: string;
4
+ status: "available" | "planned";
5
+ /** assets/templates/languages/<language> を使用する */
6
+ language: string;
7
+ languageLabel: string;
8
+ /** assets/templates/features/<id> を合成する */
9
+ features: string[];
10
+ aiProviders: string[];
11
+ }
12
+ /**
13
+ * テンプレートレジストリ。
14
+ * 新テンプレートの追加 = assets/templates/languages/<id> を用意して、ここに1エントリ追加する。
15
+ */
16
+ export declare const templates: TemplateDefinition[];
17
+ export declare const DEFAULT_TEMPLATE = "typescript";
18
+ export declare function findTemplate(id: string): TemplateDefinition | undefined;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_TEMPLATE = exports.templates = void 0;
4
+ exports.findTemplate = findTemplate;
5
+ /**
6
+ * テンプレートレジストリ。
7
+ * 新テンプレートの追加 = assets/templates/languages/<id> を用意して、ここに1エントリ追加する。
8
+ */
9
+ exports.templates = [
10
+ {
11
+ id: "typescript",
12
+ label: "TypeScript",
13
+ status: "available",
14
+ language: "typescript",
15
+ languageLabel: "TypeScript",
16
+ features: ["eslint", "prettier", "vitest", "docker", "github-actions"],
17
+ aiProviders: ["claude", "codex"],
18
+ },
19
+ {
20
+ id: "laravel-react",
21
+ label: "Laravel + React",
22
+ status: "available",
23
+ language: "laravel",
24
+ languageLabel: "Laravel + React",
25
+ features: ["react-laravel", "docker", "github-actions"],
26
+ aiProviders: ["claude", "codex"],
27
+ },
28
+ {
29
+ id: "node-react",
30
+ label: "Node.js + React",
31
+ status: "available",
32
+ language: "typescript",
33
+ languageLabel: "TypeScript + React",
34
+ features: ["react", "eslint", "prettier", "vitest", "docker", "github-actions"],
35
+ aiProviders: ["claude", "codex"],
36
+ },
37
+ { id: "laravel-vue", label: "Laravel + Vue", status: "planned", language: "laravel", languageLabel: "Laravel", features: [], aiProviders: ["claude", "codex"] },
38
+ { id: "nextjs", label: "Next.js", status: "planned", language: "typescript", languageLabel: "TypeScript", features: [], aiProviders: ["claude", "codex"] },
39
+ { id: "nuxt", label: "Nuxt", status: "planned", language: "typescript", languageLabel: "TypeScript", features: [], aiProviders: ["claude", "codex"] },
40
+ ];
41
+ exports.DEFAULT_TEMPLATE = "typescript";
42
+ function findTemplate(id) {
43
+ return exports.templates.find((t) => t.id === id);
44
+ }
45
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/registry/templates.ts"],"names":[],"mappings":";;;AAmDA,oCAEC;AAzCD;;;GAGG;AACU,QAAA,SAAS,GAAyB;IAC7C;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,YAAY;QACtB,aAAa,EAAE,YAAY;QAC3B,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QACtE,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;KACjC;IACD;QACE,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,SAAS;QACnB,aAAa,EAAE,iBAAiB;QAChC,QAAQ,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QACvD,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;KACjC;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,iBAAiB;QACxB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,YAAY;QACtB,aAAa,EAAE,oBAAoB;QACnC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QAC/E,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;KACjC;IACD,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;IAC/J,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;IAC1J,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;CACtJ,CAAC;AAEW,QAAA,gBAAgB,GAAG,YAAY,CAAC;AAE7C,SAAgB,YAAY,CAAC,EAAU;IACrC,OAAO,iBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "foundruu",
3
+ "version": "0.1.0",
4
+ "description": "FoundRuu CLI - AI開発を標準化するためのプラットフォームCLI",
5
+ "license": "MIT",
6
+ "type": "commonjs",
7
+ "bin": {
8
+ "foundruu": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "assets"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "dev": "ts-node src/cli.ts",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "typecheck": "tsc --noEmit",
20
+ "prepublishOnly": "npm run typecheck && npm run build"
21
+ },
22
+ "dependencies": {
23
+ "@inquirer/prompts": "^7.10.1",
24
+ "commander": "^12.1.0",
25
+ "handlebars": "^4.7.8",
26
+ "picocolors": "^1.1.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.14.0",
30
+ "ts-node": "^10.9.2",
31
+ "typescript": "^5.5.4",
32
+ "vitest": "^2.1.4"
33
+ },
34
+ "engines": {
35
+ "node": ">=20"
36
+ },
37
+ "keywords": [
38
+ "cli",
39
+ "ai",
40
+ "scaffold",
41
+ "workflow",
42
+ "doctor",
43
+ "foundruu"
44
+ ],
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "https://github.com/Ruu5LP/RuunFoundry.git"
48
+ },
49
+ "author": "Ruu5LP"
50
+ }