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.
- package/LICENSE +21 -0
- package/README.md +119 -0
- package/assets/templates/ai/_common/company/coding-standard.md +35 -0
- package/assets/templates/ai/_common/company/git-workflow.md +40 -0
- package/assets/templates/ai/_common/company/review-policy.md +30 -0
- package/assets/templates/ai/_common/company/security.md +25 -0
- package/assets/templates/ai/_common/project/architecture.md.hbs +29 -0
- package/assets/templates/ai/_common/project/conventions.md +24 -0
- package/assets/templates/ai/_common/project/overview.md.hbs +37 -0
- package/assets/templates/ai/_common/project/testing.md +32 -0
- package/assets/templates/ai/claude/CLAUDE.md.hbs +65 -0
- package/assets/templates/ai/codex/CODEX.md.hbs +60 -0
- package/assets/templates/base/.env.example +4 -0
- package/assets/templates/base/README.md.hbs +73 -0
- package/assets/templates/features/discord/.env.example.patch +3 -0
- package/assets/templates/features/discord/package.json.patch +5 -0
- package/assets/templates/features/docker/Dockerfile.hbs +38 -0
- package/assets/templates/features/docker/docker-compose.yml.hbs +11 -0
- package/assets/templates/features/eslint/eslint.config.js +14 -0
- package/assets/templates/features/eslint/package.json.patch +11 -0
- package/assets/templates/features/github-actions/.github/workflows/ci.yml.hbs +51 -0
- package/assets/templates/features/lark/.env.example.patch +3 -0
- package/assets/templates/features/lark/package.json.patch +5 -0
- package/assets/templates/features/line-bot/.env.example.patch +2 -0
- package/assets/templates/features/line-bot/package.json.patch +5 -0
- package/assets/templates/features/prettier/.prettierignore +3 -0
- package/assets/templates/features/prettier/.prettierrc +7 -0
- package/assets/templates/features/prettier/package.json.patch +9 -0
- package/assets/templates/features/react/index.html.hbs +12 -0
- package/assets/templates/features/react/package.json.patch +17 -0
- package/assets/templates/features/react/src/web/App.tsx.hbs +8 -0
- package/assets/templates/features/react/src/web/main.tsx +9 -0
- package/assets/templates/features/react/vite.config.ts +6 -0
- package/assets/templates/features/react-laravel/package.json.patch +19 -0
- package/assets/templates/features/react-laravel/resources/js/app.jsx.hbs +17 -0
- package/assets/templates/features/react-laravel/vite.config.js +13 -0
- package/assets/templates/features/vitest/package.json.patch +10 -0
- package/assets/templates/features/vitest/tests/index.test.ts.hbs +7 -0
- package/assets/templates/features/vitest/vitest.config.ts +11 -0
- package/assets/templates/languages/laravel/.env.example.patch +12 -0
- package/assets/templates/languages/laravel/composer.json.hbs +41 -0
- package/assets/templates/languages/laravel/docs/SETUP.md.hbs +24 -0
- package/assets/templates/languages/typescript/package.json.patch +20 -0
- package/assets/templates/languages/typescript/src/index.ts.hbs +1 -0
- package/assets/templates/languages/typescript/tsconfig.json +17 -0
- package/assets/workflow/.ai/prompts/session-workflow.md +72 -0
- package/assets/workflow/.ai/templates/session/design.md +21 -0
- package/assets/workflow/.ai/templates/session/questions.md +34 -0
- package/assets/workflow/.ai/templates/session/requirements.md +25 -0
- package/assets/workflow/.ai/templates/session/summary.md +21 -0
- package/assets/workflow/.ai/templates/session/tasks.md +13 -0
- package/assets/workflow/.ai/templates/session/test.md +15 -0
- package/assets/workflow/.ai/workflows/bugfix.md +19 -0
- package/assets/workflow/.ai/workflows/development.md +27 -0
- package/assets/workflow/.ai/workflows/feature.md +20 -0
- package/assets/workflow/.ai/workflows/review.md +19 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +89 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +64 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/session.d.ts +8 -0
- package/dist/commands/session.js +96 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/update.d.ts +13 -0
- package/dist/commands/update.js +64 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/workflow.d.ts +7 -0
- package/dist/commands/workflow.js +64 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/core/assets.d.ts +8 -0
- package/dist/core/assets.js +29 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.js +31 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/copier.d.ts +25 -0
- package/dist/core/copier.js +103 -0
- package/dist/core/copier.js.map +1 -0
- package/dist/core/fetcher.d.ts +10 -0
- package/dist/core/fetcher.js +56 -0
- package/dist/core/fetcher.js.map +1 -0
- package/dist/core/logger.d.ts +7 -0
- package/dist/core/logger.js +15 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/sync.d.ts +26 -0
- package/dist/core/sync.js +69 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/doctor/checks.d.ts +5 -0
- package/dist/doctor/checks.js +97 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/deep.d.ts +39 -0
- package/dist/doctor/deep.js +144 -0
- package/dist/doctor/deep.js.map +1 -0
- package/dist/doctor/rc.d.ts +13 -0
- package/dist/doctor/rc.js +31 -0
- package/dist/doctor/rc.js.map +1 -0
- package/dist/doctor/runner.d.ts +3 -0
- package/dist/doctor/runner.js +39 -0
- package/dist/doctor/runner.js.map +1 -0
- package/dist/doctor/types.d.ts +32 -0
- package/dist/doctor/types.js +3 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/registry/templates.d.ts +18 -0
- package/dist/registry/templates.js +45 -0
- package/dist/registry/templates.js.map +1 -0
- 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,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 @@
|
|
|
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
|
+
}
|