@fenglimg/fabric-cli 2.0.0-rc.23 → 2.0.0-rc.26
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/dist/chunk-PWLW3B57.js +18 -0
- package/dist/{chunk-STLR2GHP.js → chunk-SRX7WZUG.js} +1 -1
- package/dist/{config-XGUUAYX6.js → config-5CH4EJQ2.js} +2 -2
- package/dist/{doctor-R2E2XO6A.js → doctor-ZIQXN2T2.js} +211 -34
- package/dist/index.js +7 -7
- package/dist/{install-TDZYZV54.js → install-3MWBW6N7.js} +3 -3
- package/dist/{serve-NPCI342P.js → serve-U3TPWDOB.js} +1 -1
- package/dist/{uninstall-MQM6NUFM.js → uninstall-SUSIZHGL.js} +1 -1
- package/package.json +3 -3
- package/templates/hooks/archive-hint.cjs +463 -0
- package/templates/hooks/fabric-hint.cjs +153 -98
- package/templates/hooks/lib/cite-contract-reminder.cjs +173 -0
- package/templates/hooks/lib/cite-line-parser.cjs +118 -0
- package/templates/skills/fabric-archive/SKILL.md +535 -4
- package/dist/chunk-6ICJICVU.js +0 -10
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/i18n.ts
|
|
4
|
+
import {
|
|
5
|
+
createTranslator,
|
|
6
|
+
detectNodeLocale,
|
|
7
|
+
resolveFabricLocale
|
|
8
|
+
} from "@fenglimg/fabric-shared";
|
|
9
|
+
var locale = detectNodeLocale();
|
|
10
|
+
var t = createTranslator(locale);
|
|
11
|
+
function getDoctorTranslator(projectRoot) {
|
|
12
|
+
return createTranslator(resolveFabricLocale(projectRoot));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
t,
|
|
17
|
+
getDoctorTranslator
|
|
18
|
+
};
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
configCmd,
|
|
4
4
|
config_default,
|
|
5
5
|
installMcpClients
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SRX7WZUG.js";
|
|
7
7
|
import "./chunk-MF3OTILQ.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-PWLW3B57.js";
|
|
9
9
|
export {
|
|
10
10
|
configCmd,
|
|
11
11
|
config_default as default,
|
|
@@ -6,8 +6,9 @@ import {
|
|
|
6
6
|
symbol
|
|
7
7
|
} from "./chunk-G2CIOLD4.js";
|
|
8
8
|
import {
|
|
9
|
+
getDoctorTranslator,
|
|
9
10
|
t
|
|
10
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-PWLW3B57.js";
|
|
11
12
|
import {
|
|
12
13
|
resolveDevMode
|
|
13
14
|
} from "./chunk-COI5VDFU.js";
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
checkLockOrThrow,
|
|
21
22
|
enrichDescriptions,
|
|
22
23
|
runDoctorApplyLint as runDoctorFixKnowledge,
|
|
24
|
+
runDoctorArchiveHistory,
|
|
23
25
|
runDoctorCiteCoverage,
|
|
24
26
|
runDoctorFix,
|
|
25
27
|
runDoctorReport
|
|
@@ -89,6 +91,15 @@ var doctorCommand = defineCommand({
|
|
|
89
91
|
default: "all",
|
|
90
92
|
valueHint: "cc|codex|cursor|all"
|
|
91
93
|
},
|
|
94
|
+
// v2.0.0-rc.24 TASK-10: --layer filter for the cite contract audit. Pairs
|
|
95
|
+
// with --cite-coverage. Validated against {'team','personal','all'} at
|
|
96
|
+
// command entry; rejects 'both' (rc.20 plan-context vocabulary) explicitly.
|
|
97
|
+
layer: {
|
|
98
|
+
type: "string",
|
|
99
|
+
description: t("cli.doctor.args.layer.description"),
|
|
100
|
+
default: "all",
|
|
101
|
+
valueHint: "team|personal|all"
|
|
102
|
+
},
|
|
92
103
|
// rc.23 TASK-007 (a-C2): description-grade back-fill flag set. Read-side
|
|
93
104
|
// by default; `--auto` flips the writer arm on. Mutually exclusive with
|
|
94
105
|
// --fix / --fix-knowledge / --cite-coverage (different mutation surfaces).
|
|
@@ -106,11 +117,20 @@ var doctorCommand = defineCommand({
|
|
|
106
117
|
type: "boolean",
|
|
107
118
|
description: t("cli.doctor.args.dry-run.description"),
|
|
108
119
|
default: false
|
|
120
|
+
},
|
|
121
|
+
// v2.0.0-rc.25 TASK-10: --archive-history flag (parallel to rc.20
|
|
122
|
+
// --cite-coverage). Read-only; reads session_archive_attempted events
|
|
123
|
+
// and renders a per-session table. Pairs with the shared `--since` flag.
|
|
124
|
+
"archive-history": {
|
|
125
|
+
type: "boolean",
|
|
126
|
+
description: t("cli.doctor.args.archive-history.description"),
|
|
127
|
+
default: false
|
|
109
128
|
}
|
|
110
129
|
},
|
|
111
130
|
async run({ args }) {
|
|
112
131
|
const workspaceRoot = process.cwd();
|
|
113
132
|
const resolution = resolveDevMode(args.target, workspaceRoot);
|
|
133
|
+
const dt = getDoctorTranslator(resolution.target);
|
|
114
134
|
try {
|
|
115
135
|
checkLockOrThrow(resolution.target);
|
|
116
136
|
} catch (err) {
|
|
@@ -124,9 +144,35 @@ var doctorCommand = defineCommand({
|
|
|
124
144
|
const fix = args.fix === true;
|
|
125
145
|
const citeCoverage = args["cite-coverage"] === true;
|
|
126
146
|
const enrichDesc = args["enrich-descriptions"] === true;
|
|
147
|
+
const archiveHistory = args["archive-history"] === true;
|
|
148
|
+
if (archiveHistory) {
|
|
149
|
+
if (fix || fixKnowledge || citeCoverage || enrichDesc) {
|
|
150
|
+
writeStderr(dt("cli.doctor.errors.archive-history-mutex"));
|
|
151
|
+
process.exitCode = 1;
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const sinceInput = args.since ?? "7d";
|
|
155
|
+
let sinceMs;
|
|
156
|
+
try {
|
|
157
|
+
sinceMs = parseSinceDuration(sinceInput);
|
|
158
|
+
} catch {
|
|
159
|
+
writeStderr(dt("cli.doctor.errors.invalid-since", { input: sinceInput }));
|
|
160
|
+
process.exitCode = 1;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const report2 = await runDoctorArchiveHistory(resolution.target, {
|
|
164
|
+
since: sinceMs
|
|
165
|
+
});
|
|
166
|
+
if (args.json === true) {
|
|
167
|
+
writeStdout(JSON.stringify(report2, null, 2));
|
|
168
|
+
} else {
|
|
169
|
+
renderArchiveHistoryReport(report2, sinceInput, dt);
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
127
173
|
if (enrichDesc) {
|
|
128
174
|
if (fix || fixKnowledge || citeCoverage) {
|
|
129
|
-
writeStderr(
|
|
175
|
+
writeStderr(dt("cli.doctor.errors.enrich-descriptions-mutex"));
|
|
130
176
|
process.exitCode = 1;
|
|
131
177
|
return;
|
|
132
178
|
}
|
|
@@ -139,13 +185,13 @@ var doctorCommand = defineCommand({
|
|
|
139
185
|
if (args.json === true) {
|
|
140
186
|
writeStdout(JSON.stringify(report2, null, 2));
|
|
141
187
|
} else {
|
|
142
|
-
renderEnrichDescriptionsReport(report2);
|
|
188
|
+
renderEnrichDescriptionsReport(report2, dt);
|
|
143
189
|
}
|
|
144
190
|
return;
|
|
145
191
|
}
|
|
146
192
|
if (citeCoverage) {
|
|
147
193
|
if (fix || fixKnowledge) {
|
|
148
|
-
writeStderr(
|
|
194
|
+
writeStderr(dt("cli.doctor.errors.cite-coverage-mutex"));
|
|
149
195
|
process.exitCode = 1;
|
|
150
196
|
return;
|
|
151
197
|
}
|
|
@@ -153,25 +199,32 @@ var doctorCommand = defineCommand({
|
|
|
153
199
|
try {
|
|
154
200
|
sinceMs = parseSinceDuration(args.since ?? "7d");
|
|
155
201
|
} catch {
|
|
156
|
-
writeStderr(
|
|
202
|
+
writeStderr(dt("cli.doctor.errors.invalid-since", { input: args.since ?? "7d" }));
|
|
157
203
|
process.exitCode = 1;
|
|
158
204
|
return;
|
|
159
205
|
}
|
|
160
206
|
const clientFilter = args.client ?? "all";
|
|
161
207
|
if (!isValidClientFilter(clientFilter)) {
|
|
162
|
-
writeStderr(
|
|
208
|
+
writeStderr(dt("cli.doctor.errors.invalid-client", { input: clientFilter }));
|
|
209
|
+
process.exitCode = 1;
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const layerFilter = args.layer ?? "all";
|
|
213
|
+
if (!isValidLayerFilter(layerFilter)) {
|
|
214
|
+
writeStderr(dt("cli.doctor.errors.invalid-layer", { input: layerFilter }));
|
|
163
215
|
process.exitCode = 1;
|
|
164
216
|
return;
|
|
165
217
|
}
|
|
166
218
|
const report2 = await runDoctorCiteCoverage(resolution.target, {
|
|
167
219
|
since: sinceMs,
|
|
168
|
-
client: clientFilter
|
|
220
|
+
client: clientFilter,
|
|
221
|
+
layer: layerFilter
|
|
169
222
|
});
|
|
170
|
-
renderCiteCoverageReport(report2, args.json === true);
|
|
223
|
+
renderCiteCoverageReport(report2, args.json === true, dt);
|
|
171
224
|
return;
|
|
172
225
|
}
|
|
173
226
|
if (fixKnowledge && fix) {
|
|
174
|
-
writeStderr(
|
|
227
|
+
writeStderr(dt("cli.doctor.errors.fix-knowledge-fix-mutually-exclusive"));
|
|
175
228
|
process.exitCode = 1;
|
|
176
229
|
return;
|
|
177
230
|
}
|
|
@@ -212,11 +265,11 @@ var doctorCommand = defineCommand({
|
|
|
212
265
|
if (fixKnowledgeReport.aborted && fixKnowledgeReport.abort_reason !== void 0) {
|
|
213
266
|
writeStderr(fixKnowledgeReport.abort_reason);
|
|
214
267
|
}
|
|
215
|
-
renderFixKnowledgeMutations(fixKnowledgeReport);
|
|
268
|
+
renderFixKnowledgeMutations(fixKnowledgeReport, dt);
|
|
216
269
|
} else if (fixReport !== null) {
|
|
217
270
|
writeStdout(fixReport.message);
|
|
218
271
|
}
|
|
219
|
-
renderHumanReport(report);
|
|
272
|
+
renderHumanReport(report, dt);
|
|
220
273
|
}
|
|
221
274
|
await emitDoctorRunEventBestEffort(resolution.target, {
|
|
222
275
|
mode: fixKnowledge ? "fix-knowledge" : "lint",
|
|
@@ -239,21 +292,21 @@ var doctorCommand = defineCommand({
|
|
|
239
292
|
}
|
|
240
293
|
});
|
|
241
294
|
var doctor_default = doctorCommand;
|
|
242
|
-
function renderHumanReport(report) {
|
|
295
|
+
function renderHumanReport(report, dt) {
|
|
243
296
|
writeStdout(`${renderStatus(report.status)} ${paint.ai("fabric doctor")} ${paint.human(report.summary.target)}`);
|
|
244
297
|
for (const check of report.checks) {
|
|
245
298
|
writeStdout(`${renderStatus(check.status)} ${check.name}: ${check.message}`);
|
|
246
299
|
}
|
|
247
|
-
writeIssueSection(
|
|
248
|
-
writeIssueSection(
|
|
249
|
-
writeIssueSection(
|
|
300
|
+
writeIssueSection(dt("doctor.section.fixable"), report.fixable_errors);
|
|
301
|
+
writeIssueSection(dt("doctor.section.manual"), report.manual_errors);
|
|
302
|
+
writeIssueSection(dt("doctor.section.warnings"), report.warnings);
|
|
250
303
|
}
|
|
251
|
-
function renderFixKnowledgeMutations(fixKnowledgeReport) {
|
|
304
|
+
function renderFixKnowledgeMutations(fixKnowledgeReport, dt) {
|
|
252
305
|
if (fixKnowledgeReport.mutations.length === 0) {
|
|
253
306
|
return;
|
|
254
307
|
}
|
|
255
308
|
writeStdout("");
|
|
256
|
-
writeStdout(
|
|
309
|
+
writeStdout(dt("doctor.section.fix-knowledge-mutations"));
|
|
257
310
|
for (const mutation of fixKnowledgeReport.mutations) {
|
|
258
311
|
const marker = mutation.applied ? symbol.ok : symbol.error;
|
|
259
312
|
const errSuffix = mutation.applied || mutation.error === void 0 ? "" : ` (${mutation.error})`;
|
|
@@ -268,6 +321,9 @@ function writeIssueSection(title, issues) {
|
|
|
268
321
|
writeStdout(title);
|
|
269
322
|
for (const issue of issues) {
|
|
270
323
|
writeStdout(`- ${issue.code}: ${issue.message}`);
|
|
324
|
+
if (issue.actionHint !== void 0 && issue.actionHint.length > 0) {
|
|
325
|
+
writeStdout(` \u2192 ${issue.actionHint}`);
|
|
326
|
+
}
|
|
271
327
|
}
|
|
272
328
|
}
|
|
273
329
|
function renderStatus(status) {
|
|
@@ -377,35 +433,43 @@ var CITE_COVERAGE_CLIENT_FILTERS = /* @__PURE__ */ new Set([
|
|
|
377
433
|
function isValidClientFilter(input) {
|
|
378
434
|
return CITE_COVERAGE_CLIENT_FILTERS.has(input);
|
|
379
435
|
}
|
|
380
|
-
|
|
436
|
+
var CITE_COVERAGE_LAYER_FILTERS = /* @__PURE__ */ new Set([
|
|
437
|
+
"team",
|
|
438
|
+
"personal",
|
|
439
|
+
"all"
|
|
440
|
+
]);
|
|
441
|
+
function isValidLayerFilter(input) {
|
|
442
|
+
return CITE_COVERAGE_LAYER_FILTERS.has(input);
|
|
443
|
+
}
|
|
444
|
+
function renderCiteCoverageReport(report, jsonMode, dt) {
|
|
381
445
|
if (jsonMode) {
|
|
382
446
|
writeStdout(JSON.stringify(report, null, 2));
|
|
383
447
|
return;
|
|
384
448
|
}
|
|
385
449
|
if (report.status === "skipped") {
|
|
386
|
-
writeStdout(
|
|
450
|
+
writeStdout(dt("doctor.cite.status.skipped"));
|
|
387
451
|
return;
|
|
388
452
|
}
|
|
389
453
|
const lines = [];
|
|
390
|
-
lines.push(
|
|
454
|
+
lines.push(dt("doctor.section.cite-coverage"));
|
|
391
455
|
lines.push(
|
|
392
|
-
|
|
456
|
+
dt("doctor.cite.header", {
|
|
393
457
|
since: new Date(report.since_ts).toISOString(),
|
|
394
458
|
marker: new Date(report.marker_ts).toISOString()
|
|
395
459
|
})
|
|
396
460
|
);
|
|
397
461
|
if (report.marker_emitted_now) {
|
|
398
|
-
lines.push(
|
|
462
|
+
lines.push(dt("doctor.cite.warning.justActivated"));
|
|
399
463
|
}
|
|
400
464
|
lines.push("");
|
|
401
|
-
lines.push(` ${
|
|
402
|
-
lines.push(` ${
|
|
403
|
-
lines.push(` ${
|
|
404
|
-
lines.push(` ${
|
|
405
|
-
lines.push(` ${
|
|
465
|
+
lines.push(` ${dt("doctor.cite.metric.editsTouched")}: ${report.metrics.edits_touched}`);
|
|
466
|
+
lines.push(` ${dt("doctor.cite.metric.qualifyingCites")}: ${report.metrics.qualifying_cites}`);
|
|
467
|
+
lines.push(` ${dt("doctor.cite.metric.recalledUnverified")}: ${report.metrics.recalled_unverified}`);
|
|
468
|
+
lines.push(` ${dt("doctor.cite.metric.expectedButMissed")}: ${report.metrics.expected_but_missed}`);
|
|
469
|
+
lines.push(` ${dt("doctor.cite.metric.totalTurns")}: ${report.metrics.total_turns}`);
|
|
406
470
|
if (report.per_client !== void 0 && Object.keys(report.per_client).length > 1) {
|
|
407
471
|
lines.push("");
|
|
408
|
-
lines.push(`### ${
|
|
472
|
+
lines.push(`### ${dt("doctor.cite.section.perClient")}`);
|
|
409
473
|
for (const [client, metrics] of Object.entries(report.per_client)) {
|
|
410
474
|
const summary = Object.entries(metrics).map(([k, v]) => `${k}=${v}`).join(" / ");
|
|
411
475
|
lines.push(` ${client}: ${summary}`);
|
|
@@ -413,27 +477,102 @@ function renderCiteCoverageReport(report, jsonMode) {
|
|
|
413
477
|
}
|
|
414
478
|
if (report.dismissed_reason_histogram !== void 0 && Object.keys(report.dismissed_reason_histogram).length > 0) {
|
|
415
479
|
lines.push("");
|
|
416
|
-
lines.push(`### ${
|
|
480
|
+
lines.push(`### ${dt("doctor.cite.section.dismissedReasons")}`);
|
|
417
481
|
for (const [reason, count] of Object.entries(report.dismissed_reason_histogram)) {
|
|
418
|
-
const label =
|
|
482
|
+
const label = dt(`doctor.cite.dismissed.${reason}`);
|
|
419
483
|
lines.push(` ${label}: ${count}`);
|
|
420
484
|
}
|
|
421
485
|
}
|
|
422
486
|
if (report.none_reason_histogram !== void 0 && Object.keys(report.none_reason_histogram).length > 0) {
|
|
423
487
|
lines.push("");
|
|
424
|
-
lines.push(`### ${
|
|
488
|
+
lines.push(`### ${dt("doctor.cite.section.noneReasons")}`);
|
|
425
489
|
for (const [reason, count] of Object.entries(report.none_reason_histogram)) {
|
|
426
|
-
const label =
|
|
490
|
+
const label = dt(`doctor.cite.none.${reason}`);
|
|
427
491
|
lines.push(` ${label}: ${count}`);
|
|
428
492
|
}
|
|
429
493
|
}
|
|
494
|
+
appendContractSection(lines, report, dt);
|
|
430
495
|
writeStdout(lines.join("\n"));
|
|
431
496
|
}
|
|
432
|
-
function
|
|
497
|
+
function appendContractSection(lines, report, dt) {
|
|
498
|
+
const status = report.contract_metrics_status;
|
|
499
|
+
if (status === void 0) {
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
const metrics = report.contract_metrics;
|
|
503
|
+
const perLayerType = report.per_layer_type;
|
|
504
|
+
const allCountsZero = metrics === void 0 || metrics.decisions_cited === 0 && metrics.pitfalls_cited === 0 && metrics.contract_with === 0 && metrics.contract_missing === 0 && metrics.hard_violated === 0 && metrics.cite_id_unresolved === 0 && Object.keys(metrics.skip_count).length === 0;
|
|
505
|
+
if (status === "awaiting_marker" && allCountsZero) {
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
lines.push("");
|
|
509
|
+
lines.push(`### ${dt("cite-coverage.contract.header")}`);
|
|
510
|
+
if (status === "skipped:bootstrap_drift") {
|
|
511
|
+
lines.push(` ${dt("cite-coverage.contract.status.skipped_bootstrap_drift")}`);
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
const statusKey = status === "ok" ? "cite-coverage.contract.status.ok" : "cite-coverage.contract.status.awaiting_marker";
|
|
515
|
+
lines.push(` status: ${dt(statusKey)}`);
|
|
516
|
+
if (typeof report.contract_marker_ts === "number" && report.contract_marker_ts > 0) {
|
|
517
|
+
lines.push(` since: ${new Date(report.contract_marker_ts).toISOString()}`);
|
|
518
|
+
}
|
|
519
|
+
if (report.layer_filter !== void 0) {
|
|
520
|
+
lines.push(` layer filter: ${report.layer_filter}`);
|
|
521
|
+
}
|
|
522
|
+
if (metrics !== void 0) {
|
|
523
|
+
lines.push(` ${dt("cite-coverage.contract.decisions_cited")}: ${metrics.decisions_cited}`);
|
|
524
|
+
lines.push(` ${dt("cite-coverage.contract.pitfalls_cited")}: ${metrics.pitfalls_cited}`);
|
|
525
|
+
lines.push(` ${dt("cite-coverage.contract.with")}: ${metrics.contract_with}`);
|
|
526
|
+
lines.push(` ${dt("cite-coverage.contract.missing")}: ${metrics.contract_missing}`);
|
|
527
|
+
if (metrics.hard_violated > 0) {
|
|
528
|
+
const layerSuffix = report.layer_filter === "personal" ? dt("cite-coverage.layer.personal_fyi") : dt("cite-coverage.layer.team_review");
|
|
529
|
+
lines.push(
|
|
530
|
+
` ${dt("cite-coverage.contract.hard_violated")} ${layerSuffix}: ${metrics.hard_violated}`
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
if (perLayerType !== void 0) {
|
|
535
|
+
const teamKeys = Object.keys(perLayerType.team).filter(
|
|
536
|
+
(k) => perLayerType.team[k] > 0
|
|
537
|
+
);
|
|
538
|
+
const personalKeys = Object.keys(perLayerType.personal).filter(
|
|
539
|
+
(k) => perLayerType.personal[k] > 0
|
|
540
|
+
);
|
|
541
|
+
if (teamKeys.length > 0 || personalKeys.length > 0) {
|
|
542
|
+
lines.push("");
|
|
543
|
+
lines.push(`#### ${dt("cite-coverage.layer.team")} \xD7 ${dt("cite-coverage.layer.personal")}`);
|
|
544
|
+
for (const key of teamKeys) {
|
|
545
|
+
const label = dt(`cite-coverage.contract.type.${key}`);
|
|
546
|
+
lines.push(` ${dt("cite-coverage.layer.team")} \u2014 ${label}: ${perLayerType.team[key]}`);
|
|
547
|
+
}
|
|
548
|
+
for (const key of personalKeys) {
|
|
549
|
+
const label = dt(`cite-coverage.contract.type.${key}`);
|
|
550
|
+
lines.push(
|
|
551
|
+
` ${dt("cite-coverage.layer.personal")} \u2014 ${label}: ${perLayerType.personal[key]}`
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
if (metrics !== void 0 && Object.keys(metrics.skip_count).length > 0) {
|
|
557
|
+
lines.push("");
|
|
558
|
+
lines.push(`#### ${dt("cite-coverage.contract.skip_count")}`);
|
|
559
|
+
for (const [reason, count] of Object.entries(metrics.skip_count)) {
|
|
560
|
+
const label = dt(`cite-coverage.skip.${reason}`);
|
|
561
|
+
lines.push(` ${label}: ${count}`);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
if (metrics !== void 0 && metrics.cite_id_unresolved > 0) {
|
|
565
|
+
lines.push("");
|
|
566
|
+
lines.push(
|
|
567
|
+
`${symbol.warn} ${dt("cite-coverage.contract.cite_id_unresolved")}: ${metrics.cite_id_unresolved}`
|
|
568
|
+
);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
function renderEnrichDescriptionsReport(report, dt) {
|
|
433
572
|
const header = `${symbol.ok} ${paint.ai("fab doctor --enrich-descriptions")} mode=${report.mode}${report.dryRun ? " (dry-run)" : ""} scanned=${report.scanned} modified=${report.modified} skipped=${report.skipped}`;
|
|
434
573
|
writeStdout(header);
|
|
435
574
|
if (report.candidates.length === 0) {
|
|
436
|
-
writeStdout(
|
|
575
|
+
writeStdout(dt("doctor.enrich.allComplete"));
|
|
437
576
|
return;
|
|
438
577
|
}
|
|
439
578
|
writeStdout("");
|
|
@@ -477,6 +616,44 @@ function parseSinceDuration(input) {
|
|
|
477
616
|
}
|
|
478
617
|
throw new Error(`invalid --since value: ${input}`);
|
|
479
618
|
}
|
|
619
|
+
function renderArchiveHistoryReport(report, sinceLabel, dt) {
|
|
620
|
+
if (report.entries.length === 0) {
|
|
621
|
+
writeStdout(dt("doctor.archive-history.empty", { sinceLabel }));
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
const lines = [];
|
|
625
|
+
lines.push(
|
|
626
|
+
dt("doctor.archive-history.header", {
|
|
627
|
+
sinceLabel,
|
|
628
|
+
count: String(report.total),
|
|
629
|
+
plural: report.total === 1 ? "" : "s"
|
|
630
|
+
})
|
|
631
|
+
);
|
|
632
|
+
lines.push("");
|
|
633
|
+
lines.push(
|
|
634
|
+
`| ${dt("doctor.archive-history.table.session")} | ${dt(
|
|
635
|
+
"doctor.archive-history.table.lastAttempt"
|
|
636
|
+
)} | ${dt("doctor.archive-history.table.outcome")} | ${dt(
|
|
637
|
+
"doctor.archive-history.table.candidates"
|
|
638
|
+
)} | ${dt("doctor.archive-history.table.coveredGap")} |`
|
|
639
|
+
);
|
|
640
|
+
lines.push("| ------- | ---------------- | -------- | ---------- | ----------- |");
|
|
641
|
+
for (const entry of report.entries) {
|
|
642
|
+
const lastAttempt = formatTimestampForTable(entry.last_attempted_at);
|
|
643
|
+
lines.push(
|
|
644
|
+
`| ${entry.session_id_short} | ${lastAttempt} | ${entry.outcome} | ${entry.candidates_proposed} | ${entry.age_since_covered_hours}h |`
|
|
645
|
+
);
|
|
646
|
+
}
|
|
647
|
+
writeStdout(lines.join("\n"));
|
|
648
|
+
}
|
|
649
|
+
function formatTimestampForTable(iso) {
|
|
650
|
+
const d = new Date(iso);
|
|
651
|
+
if (Number.isNaN(d.getTime())) return iso;
|
|
652
|
+
const pad = (n) => n < 10 ? `0${n}` : `${n}`;
|
|
653
|
+
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(
|
|
654
|
+
d.getUTCHours()
|
|
655
|
+
)}:${pad(d.getUTCMinutes())}`;
|
|
656
|
+
}
|
|
480
657
|
export {
|
|
481
658
|
doctor_default as default,
|
|
482
659
|
doctorCommand,
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
t
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-PWLW3B57.js";
|
|
5
5
|
|
|
6
6
|
// src/index.ts
|
|
7
7
|
import { realpathSync } from "fs";
|
|
@@ -11,11 +11,11 @@ import { defineCommand, runMain } from "citty";
|
|
|
11
11
|
|
|
12
12
|
// src/commands/index.ts
|
|
13
13
|
var allCommands = {
|
|
14
|
-
install: () => import("./install-
|
|
15
|
-
doctor: () => import("./doctor-
|
|
16
|
-
serve: () => import("./serve-
|
|
17
|
-
uninstall: () => import("./uninstall-
|
|
18
|
-
config: () => import("./config-
|
|
14
|
+
install: () => import("./install-3MWBW6N7.js").then((module) => module.default),
|
|
15
|
+
doctor: () => import("./doctor-ZIQXN2T2.js").then((module) => module.default),
|
|
16
|
+
serve: () => import("./serve-U3TPWDOB.js").then((module) => module.default),
|
|
17
|
+
uninstall: () => import("./uninstall-SUSIZHGL.js").then((module) => module.default),
|
|
18
|
+
config: () => import("./config-5CH4EJQ2.js").then((module) => module.default),
|
|
19
19
|
"plan-context-hint": () => import("./plan-context-hint-KPGOW3QC.js").then((module) => module.default),
|
|
20
20
|
// v2.0.0-rc.23 TASK-014 (F8c): S5 onboard-slot coverage. Used by the
|
|
21
21
|
// fabric-archive Skill's first-run phase to detect unclaimed slots.
|
|
@@ -26,7 +26,7 @@ var allCommands = {
|
|
|
26
26
|
var main = defineCommand({
|
|
27
27
|
meta: {
|
|
28
28
|
name: "fabric",
|
|
29
|
-
version: "2.0.0-rc.
|
|
29
|
+
version: "2.0.0-rc.26",
|
|
30
30
|
description: t("cli.main.description")
|
|
31
31
|
},
|
|
32
32
|
subCommands: allCommands
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
installMcpClients
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SRX7WZUG.js";
|
|
5
5
|
import {
|
|
6
6
|
installArchiveHintHook,
|
|
7
7
|
installFabricArchiveSkill,
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
} from "./chunk-G2CIOLD4.js";
|
|
32
32
|
import {
|
|
33
33
|
t
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-PWLW3B57.js";
|
|
35
35
|
import {
|
|
36
36
|
createDebugLogger,
|
|
37
37
|
resolveDevMode
|
|
@@ -1348,7 +1348,7 @@ function readProjectName(target) {
|
|
|
1348
1348
|
return basename(target);
|
|
1349
1349
|
}
|
|
1350
1350
|
function getCliVersion() {
|
|
1351
|
-
return true ? "2.0.0-rc.
|
|
1351
|
+
return true ? "2.0.0-rc.26" : "unknown";
|
|
1352
1352
|
}
|
|
1353
1353
|
function sortRecord(record) {
|
|
1354
1354
|
return Object.fromEntries(Object.entries(record).sort(([left], [right]) => left.localeCompare(right)));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fenglimg/fabric-cli",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.26",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"fab": "dist/index.js",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"tree-sitter-javascript": "^0.25.0",
|
|
21
21
|
"tree-sitter-typescript": "^0.23.2",
|
|
22
22
|
"web-tree-sitter": "^0.26.8",
|
|
23
|
-
"@fenglimg/fabric-server": "2.0.0-rc.
|
|
24
|
-
"@fenglimg/fabric-shared": "2.0.0-rc.
|
|
23
|
+
"@fenglimg/fabric-server": "2.0.0-rc.26",
|
|
24
|
+
"@fenglimg/fabric-shared": "2.0.0-rc.26"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/node": "^22.15.0",
|