foundruu 0.8.0 → 0.10.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 +18 -16
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/dashboard.js +31 -4
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +31 -4
- 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/deep.js +7 -1
- package/dist/doctor/deep.js.map +1 -1
- package/dist/doctor/report.js +15 -7
- package/dist/doctor/report.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
|
|
@@ -160,7 +162,7 @@ jobs:
|
|
|
160
162
|
runs-on: ubuntu-latest
|
|
161
163
|
steps:
|
|
162
164
|
- uses: actions/checkout@v4
|
|
163
|
-
- uses: Ruu5LP/foundruu@v0.
|
|
165
|
+
- uses: Ruu5LP/foundruu@v0.10.0 # リリースタグに固定(移動タグ v0 でも可)
|
|
164
166
|
with:
|
|
165
167
|
fail-on: error # error / warning / never
|
|
166
168
|
deep: "true" # --deep のスコア診断も実行
|
|
@@ -168,7 +170,7 @@ jobs:
|
|
|
168
170
|
|
|
169
171
|
結果はジョブサマリに表形式で出力されます。依存ごとバンドル済みのため、実行時に
|
|
170
172
|
npm install や TypeScript ビルドは走りません(`node` で即実行)。`@main` ではなく
|
|
171
|
-
リリースタグ(`@v0.
|
|
173
|
+
リリースタグ(`@v0.10.0` など)への固定を推奨します。
|
|
172
174
|
|
|
173
175
|
## VSCode Extension
|
|
174
176
|
|
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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"}
|
|
@@ -43,6 +43,7 @@ function trendSvg(history) {
|
|
|
43
43
|
${dots}
|
|
44
44
|
</svg>`;
|
|
45
45
|
}
|
|
46
|
+
const esc = (s) => s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
46
47
|
function renderDashboard(history) {
|
|
47
48
|
const latest = history[history.length - 1];
|
|
48
49
|
const color = (s) => (s >= 80 ? "#22a06b" : s >= 50 ? "#b38600" : "#c9372c");
|
|
@@ -59,9 +60,31 @@ function renderDashboard(history) {
|
|
|
59
60
|
? ` (▼${-delta})`
|
|
60
61
|
: " (±0)"
|
|
61
62
|
: "";
|
|
62
|
-
|
|
63
|
+
const scoreCell = s.docPath !== undefined
|
|
64
|
+
? `<span style="color:${color(s.score)};font-weight:bold">${s.score}点${deltaLabel}</span>`
|
|
65
|
+
: `<span class="meta">未計測</span>`;
|
|
66
|
+
return `<tr><td>${s.label}</td><td>${scoreCell}</td><td>${s.docPath ?? "(なし)"}</td></tr>`;
|
|
63
67
|
})
|
|
64
68
|
.join("");
|
|
69
|
+
// 計測できたカテゴリが1つも無ければ総合スコアは「未計測」表示にする(0点の誤解を避ける)
|
|
70
|
+
const hasMeasured = latest.report.scores.some((s) => s.docPath !== undefined);
|
|
71
|
+
const overallColor = hasMeasured ? color(latest.report.overall) : "#666";
|
|
72
|
+
const overallText = hasMeasured ? `総合スコア: ${latest.report.overall}点` : "総合スコア: 未計測";
|
|
73
|
+
// 改善アクション: 各カテゴリの未達項目(label → improvement)を、スコアの低い順に並べる。
|
|
74
|
+
// 「何をすればスコアが上がるか」を具体的に示す。
|
|
75
|
+
const actionable = [...latest.report.scores]
|
|
76
|
+
.filter((s) => s.failed.length > 0)
|
|
77
|
+
.sort((a, b) => a.score - b.score);
|
|
78
|
+
const actionsHtml = actionable.length
|
|
79
|
+
? actionable
|
|
80
|
+
.map((s) => `<h3>${esc(s.label)} <span class="meta">(${s.score}点${s.docPath ? ` / ${esc(s.docPath)}` : ""})</span></h3>\n` +
|
|
81
|
+
`<ul>` +
|
|
82
|
+
s.failed
|
|
83
|
+
.map((f) => `<li><strong>${esc(f.label)}</strong> — ${esc(f.improvement)}</li>`)
|
|
84
|
+
.join("") +
|
|
85
|
+
`</ul>`)
|
|
86
|
+
.join("\n")
|
|
87
|
+
: `<p>改善アクションはありません 🎉</p>`;
|
|
65
88
|
return `<!doctype html>
|
|
66
89
|
<html lang="ja">
|
|
67
90
|
<head>
|
|
@@ -72,14 +95,16 @@ function renderDashboard(history) {
|
|
|
72
95
|
table { border-collapse: collapse; width: 100%; }
|
|
73
96
|
th, td { border: 1px solid #ddd; padding: .5rem .75rem; text-align: left; }
|
|
74
97
|
th { background: #f5f5f5; }
|
|
75
|
-
.overall { font-size: 2.5rem; font-weight: bold; color: ${
|
|
76
|
-
.meta { color: #666; }
|
|
98
|
+
.overall { font-size: 2.5rem; font-weight: bold; color: ${overallColor}; }
|
|
99
|
+
.meta { color: #666; font-weight: normal; }
|
|
100
|
+
h3 { margin: 1.2rem 0 .3rem; }
|
|
101
|
+
ul { line-height: 1.7; margin-top: .2rem; }
|
|
77
102
|
</style>
|
|
78
103
|
</head>
|
|
79
104
|
<body>
|
|
80
105
|
<h1>FoundRuu Dashboard</h1>
|
|
81
106
|
<p class="meta">レポート ${history.length}件 / 最新: ${latest.timestamp}</p>
|
|
82
|
-
<p class="overall"
|
|
107
|
+
<p class="overall">${overallText}</p>
|
|
83
108
|
<h2>スコア推移</h2>
|
|
84
109
|
${trendSvg(history)}
|
|
85
110
|
<h2>最新のカテゴリ別スコア</h2>
|
|
@@ -87,6 +112,8 @@ ${trendSvg(history)}
|
|
|
87
112
|
<tr><th>カテゴリ</th><th>スコア(前回比)</th><th>ドキュメント</th></tr>
|
|
88
113
|
${categoryRows}
|
|
89
114
|
</table>
|
|
115
|
+
<h2>改善アクション(最新レポート)</h2>
|
|
116
|
+
${actionsHtml}
|
|
90
117
|
</body>
|
|
91
118
|
</html>
|
|
92
119
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":";;;;;AAWA,kCAUC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -26,21 +26,48 @@ function runDeep(cwd, options) {
|
|
|
26
26
|
logger_1.log.info(picocolors_1.default.bold("FoundRuu Doctor --deep — AI開発プロセス品質診断\n"));
|
|
27
27
|
logger_1.log.info(`差分(${report.since} 基準): ${report.diff.files}ファイル +${report.diff.insertions} -${report.diff.deletions}\n`);
|
|
28
28
|
for (const s of report.scores) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
if (s.docPath === undefined) {
|
|
30
|
+
// 該当ドキュメントが無い = 未計測(0点ではない)
|
|
31
|
+
logger_1.log.info(`${picocolors_1.default.dim("░".repeat(10))} ${picocolors_1.default.dim("未計測")} ${s.label}`);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const color = scoreColor(s.score);
|
|
35
|
+
const bar = "█".repeat(Math.round(s.score / 10)).padEnd(10, "░");
|
|
36
|
+
logger_1.log.info(`${color(bar)} ${String(s.score).padStart(3)}点 ${s.label}${picocolors_1.default.dim(`(${s.docPath})`)}`);
|
|
37
|
+
}
|
|
32
38
|
for (const f of s.failed) {
|
|
33
39
|
logger_1.log.info(picocolors_1.default.dim(` - ${f.label} → ${f.improvement}`));
|
|
34
40
|
}
|
|
35
41
|
}
|
|
36
42
|
logger_1.log.info("");
|
|
37
|
-
|
|
43
|
+
if (report.scores.some((s) => s.docPath !== undefined)) {
|
|
44
|
+
logger_1.log.info(`総合スコア: ${scoreColor(report.overall)(picocolors_1.default.bold(`${report.overall}点`))}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
logger_1.log.info(picocolors_1.default.dim("総合スコア: 未計測(要件/設計/テスト/AI指示のドキュメントが見つかりません)"));
|
|
48
|
+
logger_1.log.info(picocolors_1.default.dim(" docs/ に requirements.md / design.md / test.md 等を用意すると計測されます。"));
|
|
49
|
+
}
|
|
38
50
|
}
|
|
39
51
|
function runDoctorCommand(cwd, options) {
|
|
40
52
|
if (options.deep) {
|
|
41
53
|
runDeep(cwd, options);
|
|
42
54
|
return;
|
|
43
55
|
}
|
|
56
|
+
if (options.fix) {
|
|
57
|
+
const { fixed, unfixable } = (0, runner_1.runDoctorFix)(cwd);
|
|
58
|
+
if (fixed.length === 0) {
|
|
59
|
+
logger_1.log.info("自動修復できる項目はありませんでした。");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (const f of fixed)
|
|
63
|
+
logger_1.log.success(f.message);
|
|
64
|
+
}
|
|
65
|
+
for (const u of unfixable) {
|
|
66
|
+
logger_1.log.warn(`手動対応が必要: ${u.label} → ${u.hint}`);
|
|
67
|
+
}
|
|
68
|
+
logger_1.log.info("");
|
|
69
|
+
// 修復後の状態を続けて診断表示する(下の通常フローへ)
|
|
70
|
+
}
|
|
44
71
|
const report = (0, runner_1.runDoctor)(cwd);
|
|
45
72
|
if (options.json) {
|
|
46
73
|
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/deep.js
CHANGED
|
@@ -253,7 +253,13 @@ function runDeepDoctor(cwd, since) {
|
|
|
253
253
|
failed,
|
|
254
254
|
};
|
|
255
255
|
});
|
|
256
|
-
|
|
256
|
+
// 該当ドキュメントが存在しないカテゴリ(docPath なし)は「未計測」とし、総合スコアに算入しない。
|
|
257
|
+
// 「ドキュメントの有無」は基本の doctor が見る領域で、--deep は「ある文書の中身の質」を測るため、
|
|
258
|
+
// 文書が無いことを 0 点として二重に減点しない(well-documented でも 0 点になる問題の対策)。
|
|
259
|
+
const measured = scores.filter((s) => s.docPath !== undefined);
|
|
260
|
+
const overall = measured.length
|
|
261
|
+
? Math.round(measured.reduce((sum, s) => sum + s.score, 0) / measured.length)
|
|
262
|
+
: 0;
|
|
257
263
|
return { since, diff, scores, overall };
|
|
258
264
|
}
|
|
259
265
|
//# sourceMappingURL=deep.js.map
|
package/dist/doctor/deep.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep.js","sourceRoot":"","sources":["../../src/doctor/deep.ts"],"names":[],"mappings":";;;;;;AAkNA,4BAqCC;AAED,
|
|
1
|
+
{"version":3,"file":"deep.js","sourceRoot":"","sources":["../../src/doctor/deep.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor/report.js
CHANGED
|
@@ -23,17 +23,19 @@ function writeFile(file, content) {
|
|
|
23
23
|
return file;
|
|
24
24
|
}
|
|
25
25
|
function renderMarkdown(report) {
|
|
26
|
+
const hasMeasured = report.scores.some((s) => s.docPath !== undefined);
|
|
27
|
+
const scoreText = (s) => s.docPath !== undefined ? `${s.score}点` : "未計測";
|
|
26
28
|
const lines = [
|
|
27
29
|
"# FoundRuu Deep Report",
|
|
28
30
|
"",
|
|
29
31
|
`- 生成日時: ${new Date().toISOString()}`,
|
|
30
32
|
`- 比較基準: \`${report.since}\``,
|
|
31
33
|
`- 差分: ${report.diff.files}ファイル +${report.diff.insertions} -${report.diff.deletions}`,
|
|
32
|
-
`- **総合スコア: ${report.overall}
|
|
34
|
+
`- **総合スコア: ${hasMeasured ? `${report.overall}点` : "未計測"}**`,
|
|
33
35
|
"",
|
|
34
36
|
"| カテゴリ | スコア | ドキュメント |",
|
|
35
37
|
"|---|---|---|",
|
|
36
|
-
...report.scores.map((s) => `| ${s.label} | ${s
|
|
38
|
+
...report.scores.map((s) => `| ${s.label} | ${scoreText(s)} | ${s.docPath ?? "(なし)"} |`),
|
|
37
39
|
"",
|
|
38
40
|
];
|
|
39
41
|
for (const s of report.scores) {
|
|
@@ -49,14 +51,20 @@ function renderMarkdown(report) {
|
|
|
49
51
|
}
|
|
50
52
|
function renderHtml(report) {
|
|
51
53
|
const color = (score) => (score >= 80 ? "#22a06b" : score >= 50 ? "#b38600" : "#c9372c");
|
|
54
|
+
const hasMeasured = report.scores.some((s) => s.docPath !== undefined);
|
|
52
55
|
const rows = report.scores
|
|
53
|
-
.map((s) =>
|
|
56
|
+
.map((s) => {
|
|
57
|
+
const scoreCell = s.docPath !== undefined
|
|
58
|
+
? `<td style="color:${color(s.score)};font-weight:bold">${s.score}点</td>`
|
|
59
|
+
: `<td style="color:#666">未計測</td>`;
|
|
60
|
+
return `
|
|
54
61
|
<tr>
|
|
55
62
|
<td>${escapeHtml(s.label)}</td>
|
|
56
|
-
|
|
63
|
+
${scoreCell}
|
|
57
64
|
<td>${escapeHtml(s.docPath ?? "(なし)")}</td>
|
|
58
65
|
<td><ul>${s.failed.map((f) => `<li><b>${escapeHtml(f.label)}</b> — ${escapeHtml(f.improvement)}</li>`).join("")}</ul></td>
|
|
59
|
-
</tr
|
|
66
|
+
</tr>`;
|
|
67
|
+
})
|
|
60
68
|
.join("");
|
|
61
69
|
return `<!doctype html>
|
|
62
70
|
<html lang="ja">
|
|
@@ -68,13 +76,13 @@ function renderHtml(report) {
|
|
|
68
76
|
table { border-collapse: collapse; width: 100%; }
|
|
69
77
|
th, td { border: 1px solid #ddd; padding: .5rem .75rem; text-align: left; vertical-align: top; }
|
|
70
78
|
th { background: #f5f5f5; }
|
|
71
|
-
.overall { font-size: 2rem; font-weight: bold; color: ${color(report.overall)}; }
|
|
79
|
+
.overall { font-size: 2rem; font-weight: bold; color: ${hasMeasured ? color(report.overall) : "#666"}; }
|
|
72
80
|
</style>
|
|
73
81
|
</head>
|
|
74
82
|
<body>
|
|
75
83
|
<h1>FoundRuu Deep Report</h1>
|
|
76
84
|
<p>比較基準: <code>${escapeHtml(report.since)}</code> / 差分: ${report.diff.files}ファイル +${report.diff.insertions} -${report.diff.deletions}</p>
|
|
77
|
-
<p class="overall">総合スコア: ${report.overall}
|
|
85
|
+
<p class="overall">総合スコア: ${hasMeasured ? `${report.overall}点` : "未計測"}</p>
|
|
78
86
|
<table>
|
|
79
87
|
<tr><th>カテゴリ</th><th>スコア</th><th>ドキュメント</th><th>改善案</th></tr>
|
|
80
88
|
${rows}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/doctor/report.ts"],"names":[],"mappings":";;;;;AAKA,4CAWC;AAhBD,4CAAoB;AACpB,gDAAwB;AAGxB,+DAA+D;AAC/D,SAAgB,gBAAgB,CAAC,MAAkB,EAAE,MAAc;IACjE,YAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,KAAK,EAAE,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG;QACZ,SAAS,CAAC,GAAG,IAAI,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;QACjE,SAAS,CAAC,GAAG,IAAI,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;QAC/C,SAAS,CAAC,GAAG,IAAI,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;KAC9C,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,OAAe;IAC9C,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,MAAM,KAAK,GAAa;QACtB,wBAAwB;QACxB,EAAE;QACF,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QACrC,aAAa,MAAM,CAAC,KAAK,IAAI;QAC7B,SAAS,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;QACrF,cAAc,MAAM,CAAC,OAAO,KAAK;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/doctor/report.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;
|