foundruu 0.7.1 → 0.9.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/README.md +20 -16
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +15 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/session.d.ts +7 -1
- package/dist/commands/session.js +108 -4
- package/dist/commands/session.js.map +1 -1
- package/dist/doctor/checks.d.ts +1 -0
- package/dist/doctor/checks.js +49 -0
- package/dist/doctor/checks.js.map +1 -1
- package/dist/doctor/runner.d.ts +6 -1
- package/dist/doctor/runner.js +22 -0
- package/dist/doctor/runner.js.map +1 -1
- package/dist/doctor/types.d.ts +18 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,20 +20,20 @@ npm install && npm run build && npm link
|
|
|
20
20
|
|
|
21
21
|
## コマンド
|
|
22
22
|
|
|
23
|
-
| コマンド
|
|
24
|
-
|
|
|
25
|
-
| `foundruu init [--template <id>] [--features <list>]`
|
|
26
|
-
| `foundruu workflow install`
|
|
27
|
-
| `foundruu doctor [--json]`
|
|
28
|
-
| `foundruu doctor --deep [--since <ref>] [--report <dir>]`
|
|
29
|
-
| `foundruu update [--force] [--diff] [--only <paths...>]`
|
|
30
|
-
| `foundruu session start <name>` / `
|
|
31
|
-
| `foundruu templates`
|
|
32
|
-
| `foundruu plugins`
|
|
33
|
-
| `foundruu mcp`
|
|
34
|
-
| `foundruu dashboard [--dir <dir>] [--out <file>]`
|
|
35
|
-
| `foundruu cloud push`
|
|
36
|
-
| `foundruu --help` / `--version`
|
|
23
|
+
| コマンド | 説明 |
|
|
24
|
+
| --------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
25
|
+
| `foundruu init [--template <id>] [--features <list>]` | テンプレート + Workflow + Rules + Doctor設定を一括導入 |
|
|
26
|
+
| `foundruu workflow install` | Workflow / Prompt / Rules(`.ai/`)のみを既存リポジトリへ導入 |
|
|
27
|
+
| `foundruu doctor [--json] [--fix]` | リポジトリがAI開発可能な状態か診断(`--fix` で README/LICENSE/.gitignore/.env.example を自動生成) |
|
|
28
|
+
| `foundruu doctor --deep [--since <ref>] [--report <dir>]` | AI開発プロセス品質をスコア診断(md/html/json レポート出力可) |
|
|
29
|
+
| `foundruu update [--force] [--diff] [--only <paths...>]` | Workflow / Prompt / Rules を最新へ更新(パス指定・差分確認可) |
|
|
30
|
+
| `foundruu session start <name>` / `list` / `show` / `end` / `current` | AI開発セッションの作成 / 一覧 / 状態表示 / 完了 / 現在のセッション |
|
|
31
|
+
| `foundruu templates` | 利用可能なテンプレート一覧 |
|
|
32
|
+
| `foundruu plugins` | 読み込まれているプラグイン一覧 |
|
|
33
|
+
| `foundruu mcp` | MCP サーバーを起動(AIエージェント連携) |
|
|
34
|
+
| `foundruu dashboard [--dir <dir>] [--out <file>]` | deep レポート履歴からスコア推移ダッシュボード(HTML)を生成(既定: `reports/index.html`) |
|
|
35
|
+
| `foundruu cloud push` | 最新の deep レポートを [foundruu-cloud](https://github.com/Ruu5LP/foundruu-cloud) へ送信 |
|
|
36
|
+
| `foundruu --help` / `--version` | ヘルプ / バージョン |
|
|
37
37
|
|
|
38
38
|
## 利用フロー
|
|
39
39
|
|
|
@@ -76,6 +76,8 @@ Docker / GitHub Actions / AI Rules / Workflow / Prompt / foundruu.json
|
|
|
76
76
|
チェックは [src/doctor/checks.ts](src/doctor/checks.ts) に宣言的に定義されており、1エントリ追加するだけで拡張できます。
|
|
77
77
|
`--json` 出力と exit code により GitHub Actions からも利用できます。
|
|
78
78
|
|
|
79
|
+
`foundruu doctor --fix` は、欠けている README / LICENSE / .gitignore / .env.example を最小構成で自動生成してから再診断します(既存ファイルは上書きしません)。
|
|
80
|
+
|
|
79
81
|
プロジェクトルートの `.foundruurc` でカスタマイズできます:
|
|
80
82
|
|
|
81
83
|
```json
|
|
@@ -127,6 +129,7 @@ module.exports = {
|
|
|
127
129
|
### 公式プラグイン
|
|
128
130
|
|
|
129
131
|
- [foundruu-plugin-security](plugins/foundruu-plugin-security/) — SECURITY.md / .env の gitignore / 依存更新自動化のチェックを追加(`npm i -D foundruu-plugin-security`)。自作プラグインの参考実装でもあります
|
|
132
|
+
- [foundruu-plugin-node](plugins/foundruu-plugin-node/) — Node バージョン固定 / ロックファイル / node_modules の gitignore のチェックを追加(`npm i -D foundruu-plugin-node`)
|
|
130
133
|
|
|
131
134
|
## ダッシュボード
|
|
132
135
|
|
|
@@ -159,7 +162,7 @@ jobs:
|
|
|
159
162
|
runs-on: ubuntu-latest
|
|
160
163
|
steps:
|
|
161
164
|
- uses: actions/checkout@v4
|
|
162
|
-
- uses: Ruu5LP/foundruu@v0.
|
|
165
|
+
- uses: Ruu5LP/foundruu@v0.9.0 # リリースタグに固定(移動タグ v0 でも可)
|
|
163
166
|
with:
|
|
164
167
|
fail-on: error # error / warning / never
|
|
165
168
|
deep: "true" # --deep のスコア診断も実行
|
|
@@ -167,7 +170,7 @@ jobs:
|
|
|
167
170
|
|
|
168
171
|
結果はジョブサマリに表形式で出力されます。依存ごとバンドル済みのため、実行時に
|
|
169
172
|
npm install や TypeScript ビルドは走りません(`node` で即実行)。`@main` ではなく
|
|
170
|
-
リリースタグ(`@v0.
|
|
173
|
+
リリースタグ(`@v0.9.0` など)への固定を推奨します。
|
|
171
174
|
|
|
172
175
|
## VSCode Extension
|
|
173
176
|
|
|
@@ -195,6 +198,7 @@ lint / format:check / typecheck / test:coverage / build は CI([.github/workfl
|
|
|
195
198
|
- [docs/roadmap.md](docs/roadmap.md) — MVP以降のロードマップ
|
|
196
199
|
- [docs/PLUGIN_DEV.md](docs/PLUGIN_DEV.md) — プラグイン開発ガイド
|
|
197
200
|
- [docs/cloud.md](docs/cloud.md) — Cloud(レポート集約)の設計
|
|
201
|
+
- [CHANGELOG.md](CHANGELOG.md) — 変更履歴
|
|
198
202
|
|
|
199
203
|
## ライセンス
|
|
200
204
|
|
package/dist/cli.js
CHANGED
|
@@ -53,6 +53,7 @@ program
|
|
|
53
53
|
.command("doctor")
|
|
54
54
|
.description("リポジトリがAI開発可能な状態か診断する(.foundruurc でカスタマイズ可能)")
|
|
55
55
|
.option("--json", "JSON形式で出力する")
|
|
56
|
+
.option("--fix", "修復可能な項目(README / LICENSE / .gitignore / .env.example)を自動生成する")
|
|
56
57
|
.option("--deep", "docs/ と git 差分から AI開発プロセスの品質をスコア診断する")
|
|
57
58
|
.option("--since <ref>", "--deep の差分比較基準", "main")
|
|
58
59
|
.option("--report <dir>", "--deep のレポート(md/html/json)を書き出すディレクトリ")
|
|
@@ -89,6 +90,24 @@ session
|
|
|
89
90
|
.action(async () => {
|
|
90
91
|
await wrap(() => (0, session_1.listSessions)(process.cwd()));
|
|
91
92
|
});
|
|
93
|
+
session
|
|
94
|
+
.command("show [name]")
|
|
95
|
+
.description("セッションの状態とファイルを表示する(name 省略で現在のセッション)")
|
|
96
|
+
.action(async (name) => {
|
|
97
|
+
await wrap(() => (0, session_1.showSession)(process.cwd(), name));
|
|
98
|
+
});
|
|
99
|
+
session
|
|
100
|
+
.command("end [name]")
|
|
101
|
+
.description("セッションを完了として記録する(name 省略で現在のセッション)")
|
|
102
|
+
.action(async (name) => {
|
|
103
|
+
await wrap(() => (0, session_1.endSession)(process.cwd(), name));
|
|
104
|
+
});
|
|
105
|
+
session
|
|
106
|
+
.command("current")
|
|
107
|
+
.description("現在のセッションを表示する")
|
|
108
|
+
.action(async () => {
|
|
109
|
+
await wrap(() => (0, session_1.currentSession)(process.cwd()));
|
|
110
|
+
});
|
|
92
111
|
const cloud = program.command("cloud").description("FoundRuu Cloud(レポート集約)と連携する");
|
|
93
112
|
cloud
|
|
94
113
|
.command("push")
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,0CAA0C;AAC1C,kDAAsD;AACtD,8CAAqD;AACrD,8CAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -41,6 +41,21 @@ function runDoctorCommand(cwd, options) {
|
|
|
41
41
|
runDeep(cwd, options);
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
+
if (options.fix) {
|
|
45
|
+
const { fixed, unfixable } = (0, runner_1.runDoctorFix)(cwd);
|
|
46
|
+
if (fixed.length === 0) {
|
|
47
|
+
logger_1.log.info("自動修復できる項目はありませんでした。");
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
for (const f of fixed)
|
|
51
|
+
logger_1.log.success(f.message);
|
|
52
|
+
}
|
|
53
|
+
for (const u of unfixable) {
|
|
54
|
+
logger_1.log.warn(`手動対応が必要: ${u.label} → ${u.hint}`);
|
|
55
|
+
}
|
|
56
|
+
logger_1.log.info("");
|
|
57
|
+
// 修復後の状態を続けて診断表示する(下の通常フローへ)
|
|
58
|
+
}
|
|
44
59
|
const report = (0, runner_1.runDoctor)(cwd);
|
|
45
60
|
if (options.json) {
|
|
46
61
|
console.log(JSON.stringify(report, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
/** .ai を持つリポジトリルートを特定する(git toplevel 優先、なければ上方向へ探索) */
|
|
6
6
|
export declare function findAiRoot(cwd: string): string | null;
|
|
7
7
|
export declare function startSession(cwd: string, name: string): void;
|
|
8
|
-
/**
|
|
8
|
+
/** セッションを完了として記録する。name 省略時は現在のセッション */
|
|
9
|
+
export declare function endSession(cwd: string, name?: string): void;
|
|
10
|
+
/** セッションの状態と作業ファイルを表示する。name 省略時は現在のセッション */
|
|
11
|
+
export declare function showSession(cwd: string, name?: string): void;
|
|
12
|
+
/** 現在のセッションを表示する */
|
|
13
|
+
export declare function currentSession(cwd: string): void;
|
|
14
|
+
/** 既存セッション名の一覧を返す(MCP からも利用)。.current / .status 等は除外 */
|
|
9
15
|
export declare function sessionNames(cwd: string): string[];
|
|
10
16
|
export declare function listSessions(cwd: string): void;
|
package/dist/commands/session.js
CHANGED
|
@@ -5,6 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.findAiRoot = findAiRoot;
|
|
7
7
|
exports.startSession = startSession;
|
|
8
|
+
exports.endSession = endSession;
|
|
9
|
+
exports.showSession = showSession;
|
|
10
|
+
exports.currentSession = currentSession;
|
|
8
11
|
exports.sessionNames = sessionNames;
|
|
9
12
|
exports.listSessions = listSessions;
|
|
10
13
|
const child_process_1 = require("child_process");
|
|
@@ -44,6 +47,51 @@ function requireAiRoot(cwd) {
|
|
|
44
47
|
}
|
|
45
48
|
return root;
|
|
46
49
|
}
|
|
50
|
+
const sessionsRoot = (root) => path_1.default.join(root, ".ai", "sessions");
|
|
51
|
+
const currentFile = (root) => path_1.default.join(sessionsRoot(root), ".current");
|
|
52
|
+
const statusFile = (root, name) => path_1.default.join(sessionsRoot(root), ".status", `${name}.json`);
|
|
53
|
+
function readCurrent(root) {
|
|
54
|
+
const file = currentFile(root);
|
|
55
|
+
if (!fs_1.default.existsSync(file))
|
|
56
|
+
return null;
|
|
57
|
+
return fs_1.default.readFileSync(file, "utf8").trim() || null;
|
|
58
|
+
}
|
|
59
|
+
function setCurrent(root, name) {
|
|
60
|
+
fs_1.default.mkdirSync(sessionsRoot(root), { recursive: true });
|
|
61
|
+
fs_1.default.writeFileSync(currentFile(root), `${name}\n`);
|
|
62
|
+
}
|
|
63
|
+
function clearCurrent(root) {
|
|
64
|
+
const file = currentFile(root);
|
|
65
|
+
if (fs_1.default.existsSync(file))
|
|
66
|
+
fs_1.default.rmSync(file);
|
|
67
|
+
}
|
|
68
|
+
function readStatus(root, name) {
|
|
69
|
+
const file = statusFile(root, name);
|
|
70
|
+
if (!fs_1.default.existsSync(file))
|
|
71
|
+
return null;
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(fs_1.default.readFileSync(file, "utf8"));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function writeStatus(root, name, status) {
|
|
80
|
+
fs_1.default.mkdirSync(path_1.default.dirname(statusFile(root, name)), { recursive: true });
|
|
81
|
+
fs_1.default.writeFileSync(statusFile(root, name), JSON.stringify(status, null, 2) + "\n");
|
|
82
|
+
}
|
|
83
|
+
const sessionDir = (root, name) => path_1.default.join(sessionsRoot(root), name);
|
|
84
|
+
/** name 省略時は現在のセッションを使う。どちらも無ければエラー */
|
|
85
|
+
function resolveSession(root, name, action) {
|
|
86
|
+
const target = name ?? readCurrent(root);
|
|
87
|
+
if (!target) {
|
|
88
|
+
throw new Error(`${action}するセッションを指定してください(現在のセッションがありません)。`);
|
|
89
|
+
}
|
|
90
|
+
if (!fs_1.default.existsSync(sessionDir(root, target))) {
|
|
91
|
+
throw new Error(`セッションが見つかりません: ${target}`);
|
|
92
|
+
}
|
|
93
|
+
return target;
|
|
94
|
+
}
|
|
47
95
|
function startSession(cwd, name) {
|
|
48
96
|
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(name)) {
|
|
49
97
|
throw new Error(`セッション名が不正です(英数字で始まり / や空白を含まないこと): ${name}`);
|
|
@@ -62,7 +110,9 @@ function startSession(cwd, name) {
|
|
|
62
110
|
for (const file of files) {
|
|
63
111
|
fs_1.default.copyFileSync(path_1.default.join(templateDir, file), path_1.default.join(dest, file));
|
|
64
112
|
}
|
|
65
|
-
|
|
113
|
+
writeStatus(root, name, { startedAt: new Date().toISOString() });
|
|
114
|
+
setCurrent(root, name);
|
|
115
|
+
logger_1.log.success(`セッションを作成しました: .ai/sessions/${name}(現在のセッション)`);
|
|
66
116
|
logger_1.log.info("");
|
|
67
117
|
logger_1.log.info("作成ファイル:");
|
|
68
118
|
for (const file of files.sort()) {
|
|
@@ -74,7 +124,55 @@ function startSession(cwd, name) {
|
|
|
74
124
|
logger_1.log.info(" 2. AI に .ai/prompts/session-workflow.md と requirements.md を渡す");
|
|
75
125
|
logger_1.log.info(" 3. AI が「進める / 質問する」を判断します");
|
|
76
126
|
}
|
|
77
|
-
/**
|
|
127
|
+
/** セッションを完了として記録する。name 省略時は現在のセッション */
|
|
128
|
+
function endSession(cwd, name) {
|
|
129
|
+
const root = requireAiRoot(cwd);
|
|
130
|
+
const target = resolveSession(root, name, "終了");
|
|
131
|
+
const status = readStatus(root, target) ?? { startedAt: new Date().toISOString() };
|
|
132
|
+
if (status.endedAt) {
|
|
133
|
+
logger_1.log.info(`セッション ${target} は既に終了しています(${status.endedAt})。`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
status.endedAt = new Date().toISOString();
|
|
137
|
+
writeStatus(root, target, status);
|
|
138
|
+
if (readCurrent(root) === target)
|
|
139
|
+
clearCurrent(root);
|
|
140
|
+
logger_1.log.success(`セッションを終了しました: ${target}`);
|
|
141
|
+
}
|
|
142
|
+
/** セッションの状態と作業ファイルを表示する。name 省略時は現在のセッション */
|
|
143
|
+
function showSession(cwd, name) {
|
|
144
|
+
const root = requireAiRoot(cwd);
|
|
145
|
+
const target = resolveSession(root, name, "表示");
|
|
146
|
+
const status = readStatus(root, target);
|
|
147
|
+
const state = status?.endedAt ? "完了" : "進行中";
|
|
148
|
+
const current = readCurrent(root) === target ? "(現在のセッション)" : "";
|
|
149
|
+
logger_1.log.info(`セッション: ${target}(${state})${current}`);
|
|
150
|
+
if (status?.startedAt)
|
|
151
|
+
logger_1.log.info(` 開始: ${status.startedAt}`);
|
|
152
|
+
if (status?.endedAt)
|
|
153
|
+
logger_1.log.info(` 終了: ${status.endedAt}`);
|
|
154
|
+
logger_1.log.info(" ファイル:");
|
|
155
|
+
const files = fs_1.default
|
|
156
|
+
.readdirSync(sessionDir(root, target))
|
|
157
|
+
.filter((f) => f.endsWith(".md"))
|
|
158
|
+
.sort();
|
|
159
|
+
for (const file of files) {
|
|
160
|
+
const empty = fs_1.default.readFileSync(path_1.default.join(sessionDir(root, target), file), "utf8").trim() === "";
|
|
161
|
+
logger_1.log.info(` - ${file}${empty ? "(未記入)" : ""}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** 現在のセッションを表示する */
|
|
165
|
+
function currentSession(cwd) {
|
|
166
|
+
const root = requireAiRoot(cwd);
|
|
167
|
+
const current = readCurrent(root);
|
|
168
|
+
if (!current) {
|
|
169
|
+
logger_1.log.info("現在のセッションはありません。");
|
|
170
|
+
logger_1.log.info(" 作成: foundruu session start <session-name>");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
logger_1.log.info(`現在のセッション: ${current}`);
|
|
174
|
+
}
|
|
175
|
+
/** 既存セッション名の一覧を返す(MCP からも利用)。.current / .status 等は除外 */
|
|
78
176
|
function sessionNames(cwd) {
|
|
79
177
|
const root = requireAiRoot(cwd);
|
|
80
178
|
const sessionsDir = path_1.default.join(root, ".ai", "sessions");
|
|
@@ -82,7 +180,7 @@ function sessionNames(cwd) {
|
|
|
82
180
|
return [];
|
|
83
181
|
return fs_1.default
|
|
84
182
|
.readdirSync(sessionsDir, { withFileTypes: true })
|
|
85
|
-
.filter((e) => e.isDirectory())
|
|
183
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith("."))
|
|
86
184
|
.map((e) => e.name)
|
|
87
185
|
.sort();
|
|
88
186
|
}
|
|
@@ -93,9 +191,15 @@ function listSessions(cwd) {
|
|
|
93
191
|
logger_1.log.info(" 作成: foundruu session start <session-name>");
|
|
94
192
|
return;
|
|
95
193
|
}
|
|
194
|
+
const root = requireAiRoot(cwd);
|
|
195
|
+
const current = readCurrent(root);
|
|
96
196
|
logger_1.log.info("セッション一覧 (.ai/sessions/):");
|
|
97
197
|
for (const name of sessions) {
|
|
98
|
-
|
|
198
|
+
const state = readStatus(root, name)?.endedAt ? "完了" : "進行中";
|
|
199
|
+
const marker = name === current ? " *" : "";
|
|
200
|
+
logger_1.log.info(` - ${name}(${state})${marker}`);
|
|
99
201
|
}
|
|
202
|
+
if (current)
|
|
203
|
+
logger_1.log.info("\n * = 現在のセッション");
|
|
100
204
|
}
|
|
101
205
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":";;;;;AAWA,gCAgBC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor/checks.d.ts
CHANGED
package/dist/doctor/checks.js
CHANGED
|
@@ -1,8 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.checks = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
/** package.json の name か、無ければディレクトリ名をプロジェクト名として使う */
|
|
10
|
+
function projectName(cwd) {
|
|
11
|
+
try {
|
|
12
|
+
const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(cwd, "package.json"), "utf8"));
|
|
13
|
+
if (pkg.name)
|
|
14
|
+
return pkg.name;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
/* package.json が無い/壊れている場合はディレクトリ名にフォールバック */
|
|
18
|
+
}
|
|
19
|
+
return path_1.default.basename(cwd);
|
|
20
|
+
}
|
|
21
|
+
/** cwd/rel にファイルを作成し、実施メッセージを返す(fix は欠如時のみ呼ばれる) */
|
|
22
|
+
function create(cwd, rel, content) {
|
|
23
|
+
fs_1.default.writeFileSync(path_1.default.join(cwd, rel), content);
|
|
24
|
+
return `${rel} を作成しました`;
|
|
25
|
+
}
|
|
26
|
+
const MIT_LICENSE = (year) => `MIT License
|
|
27
|
+
|
|
28
|
+
Copyright (c) ${year} <COPYRIGHT HOLDER>
|
|
29
|
+
|
|
30
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
31
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
32
|
+
in the Software without restriction, including without limitation the rights
|
|
33
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
34
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
35
|
+
furnished to do so, subject to the following conditions:
|
|
36
|
+
|
|
37
|
+
The above copyright notice and this permission notice shall be included in all
|
|
38
|
+
copies or substantial portions of the Software.
|
|
39
|
+
|
|
40
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
41
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
42
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
43
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
44
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
45
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
46
|
+
SOFTWARE.
|
|
47
|
+
`;
|
|
4
48
|
/**
|
|
5
49
|
* 診断ルール定義。チェックの追加はこの配列に1エントリ足すだけでよい。
|
|
50
|
+
* `fix` を持つチェックは `doctor --fix` で自動生成できる(既存は上書きしない)。
|
|
6
51
|
*/
|
|
7
52
|
exports.checks = [
|
|
8
53
|
{
|
|
@@ -12,6 +57,7 @@ exports.checks = [
|
|
|
12
57
|
severity: "error",
|
|
13
58
|
hint: "README.md を作成し、プロジェクトの目的・セットアップ手順を書いてください",
|
|
14
59
|
check: (ctx) => ctx.existsAny(["README.md", "README"]),
|
|
60
|
+
fix: (ctx) => create(ctx.cwd, "README.md", `# ${projectName(ctx.cwd)}\n\n> TODO: プロジェクトの目的とセットアップ手順を記述してください。\n`),
|
|
15
61
|
},
|
|
16
62
|
{
|
|
17
63
|
id: "license",
|
|
@@ -20,6 +66,7 @@ exports.checks = [
|
|
|
20
66
|
severity: "warn",
|
|
21
67
|
hint: "LICENSE ファイルを追加してください",
|
|
22
68
|
check: (ctx) => ctx.existsAny(["LICENSE", "LICENSE.md", "LICENSE.txt"]),
|
|
69
|
+
fix: (ctx) => create(ctx.cwd, "LICENSE", MIT_LICENSE(new Date().getFullYear())),
|
|
23
70
|
},
|
|
24
71
|
{
|
|
25
72
|
id: "gitignore",
|
|
@@ -28,6 +75,7 @@ exports.checks = [
|
|
|
28
75
|
severity: "error",
|
|
29
76
|
hint: ".gitignore を作成してください(foundruu init で導入できます)",
|
|
30
77
|
check: (ctx) => ctx.exists(".gitignore"),
|
|
78
|
+
fix: (ctx) => create(ctx.cwd, ".gitignore", "node_modules/\ndist/\n.env\n*.log\n"),
|
|
31
79
|
},
|
|
32
80
|
{
|
|
33
81
|
id: "env-example",
|
|
@@ -36,6 +84,7 @@ exports.checks = [
|
|
|
36
84
|
severity: "warn",
|
|
37
85
|
hint: ".env.example を作成し、必要な環境変数の一覧を共有してください",
|
|
38
86
|
check: (ctx) => ctx.existsAny([".env.example", ".env.sample"]),
|
|
87
|
+
fix: (ctx) => create(ctx.cwd, ".env.example", "# 必要な環境変数のキーと説明のみを記載してください(値は書かない)\n# 例:\n# DATABASE_URL=\n"),
|
|
39
88
|
},
|
|
40
89
|
{
|
|
41
90
|
id: "package-manifest",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/doctor/checks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/doctor/checks.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor/runner.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
import { DoctorCheck, DoctorContext, DoctorReport } from "./types";
|
|
1
|
+
import { DoctorCheck, DoctorContext, DoctorReport, FixReport } from "./types";
|
|
2
2
|
export declare function createContext(cwd: string): DoctorContext;
|
|
3
3
|
export declare function runDoctor(cwd: string, checkList?: DoctorCheck[]): DoctorReport;
|
|
4
|
+
/**
|
|
5
|
+
* 失敗しているチェックのうち fix を持つものを自動生成する(--fix)。
|
|
6
|
+
* .foundruurc で無効化されたチェックは対象外(applyRc が除外する)。
|
|
7
|
+
*/
|
|
8
|
+
export declare function runDoctorFix(cwd: string, checkList?: DoctorCheck[]): FixReport;
|
package/dist/doctor/runner.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.createContext = createContext;
|
|
7
7
|
exports.runDoctor = runDoctor;
|
|
8
|
+
exports.runDoctorFix = runDoctorFix;
|
|
8
9
|
const fs_1 = __importDefault(require("fs"));
|
|
9
10
|
const path_1 = __importDefault(require("path"));
|
|
10
11
|
const checks_1 = require("./checks");
|
|
@@ -36,4 +37,25 @@ function runDoctor(cwd, checkList = checks_1.checks) {
|
|
|
36
37
|
const failed = results.filter((r) => r.status === "fail").length;
|
|
37
38
|
return { results, passed, warned, failed, ok: failed === 0 };
|
|
38
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* 失敗しているチェックのうち fix を持つものを自動生成する(--fix)。
|
|
42
|
+
* .foundruurc で無効化されたチェックは対象外(applyRc が除外する)。
|
|
43
|
+
*/
|
|
44
|
+
function runDoctorFix(cwd, checkList = checks_1.checks) {
|
|
45
|
+
const ctx = createContext(cwd);
|
|
46
|
+
const effective = (0, rc_1.applyRc)(checkList, (0, rc_1.readRc)(cwd));
|
|
47
|
+
const fixed = [];
|
|
48
|
+
const unfixable = [];
|
|
49
|
+
for (const c of effective) {
|
|
50
|
+
if (c.check(ctx))
|
|
51
|
+
continue; // pass しているものは触らない
|
|
52
|
+
if (c.fix) {
|
|
53
|
+
fixed.push({ label: c.label, message: c.fix(ctx) });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
unfixable.push({ label: c.label, hint: c.hint });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { fixed, unfixable };
|
|
60
|
+
}
|
|
39
61
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/doctor/runner.ts"],"names":[],"mappings":";;;;;AAMA,sCAOC;AAED,8BAmBC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/doctor/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor/types.d.ts
CHANGED
|
@@ -15,6 +15,24 @@ export interface DoctorCheck {
|
|
|
15
15
|
/** 見つからなかったときの修正ガイド */
|
|
16
16
|
hint: string;
|
|
17
17
|
check(ctx: DoctorContext): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* `doctor --fix` 時に、欠けているものを最小構成で自動生成する。
|
|
20
|
+
* check が false(=欠如)のときだけ呼ばれるため既存ファイルは上書きしない。
|
|
21
|
+
* 返り値は実施内容の説明。未定義のチェックは --fix 対象外(hint に沿って手動対応)。
|
|
22
|
+
*/
|
|
23
|
+
fix?(ctx: DoctorContext): string;
|
|
24
|
+
}
|
|
25
|
+
export interface FixReport {
|
|
26
|
+
/** 自動生成できた項目 */
|
|
27
|
+
fixed: {
|
|
28
|
+
label: string;
|
|
29
|
+
message: string;
|
|
30
|
+
}[];
|
|
31
|
+
/** fix を持たず手動対応が必要な失敗項目 */
|
|
32
|
+
unfixable: {
|
|
33
|
+
label: string;
|
|
34
|
+
hint: string;
|
|
35
|
+
}[];
|
|
18
36
|
}
|
|
19
37
|
export interface CheckResult {
|
|
20
38
|
id: string;
|