@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.
@@ -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
+ };
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-MF3OTILQ.js";
5
5
  import {
6
6
  t
7
- } from "./chunk-6ICJICVU.js";
7
+ } from "./chunk-PWLW3B57.js";
8
8
 
9
9
  // src/commands/config.ts
10
10
  import { existsSync, statSync } from "fs";
@@ -3,9 +3,9 @@ import {
3
3
  configCmd,
4
4
  config_default,
5
5
  installMcpClients
6
- } from "./chunk-STLR2GHP.js";
6
+ } from "./chunk-SRX7WZUG.js";
7
7
  import "./chunk-MF3OTILQ.js";
8
- import "./chunk-6ICJICVU.js";
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-6ICJICVU.js";
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(t("cli.doctor.errors.enrich-descriptions-mutex"));
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(t("cli.doctor.errors.cite-coverage-mutex"));
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(t("cli.doctor.errors.invalid-since", { input: args.since ?? "7d" }));
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(t("cli.doctor.errors.invalid-client", { input: clientFilter }));
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(t("cli.doctor.errors.fix-knowledge-fix-mutually-exclusive"));
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(t("doctor.section.fixable"), report.fixable_errors);
248
- writeIssueSection(t("doctor.section.manual"), report.manual_errors);
249
- writeIssueSection(t("doctor.section.warnings"), report.warnings);
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(t("doctor.section.fix-knowledge-mutations"));
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
- function renderCiteCoverageReport(report, jsonMode) {
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(t("doctor.cite.status.skipped"));
450
+ writeStdout(dt("doctor.cite.status.skipped"));
387
451
  return;
388
452
  }
389
453
  const lines = [];
390
- lines.push(t("doctor.section.cite-coverage"));
454
+ lines.push(dt("doctor.section.cite-coverage"));
391
455
  lines.push(
392
- t("doctor.cite.header", {
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(t("doctor.cite.warning.justActivated"));
462
+ lines.push(dt("doctor.cite.warning.justActivated"));
399
463
  }
400
464
  lines.push("");
401
- lines.push(` ${t("doctor.cite.metric.editsTouched")}: ${report.metrics.edits_touched}`);
402
- lines.push(` ${t("doctor.cite.metric.qualifyingCites")}: ${report.metrics.qualifying_cites}`);
403
- lines.push(` ${t("doctor.cite.metric.recalledUnverified")}: ${report.metrics.recalled_unverified}`);
404
- lines.push(` ${t("doctor.cite.metric.expectedButMissed")}: ${report.metrics.expected_but_missed}`);
405
- lines.push(` ${t("doctor.cite.metric.totalTurns")}: ${report.metrics.total_turns}`);
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(`### ${t("doctor.cite.section.perClient")}`);
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(`### ${t("doctor.cite.section.dismissedReasons")}`);
480
+ lines.push(`### ${dt("doctor.cite.section.dismissedReasons")}`);
417
481
  for (const [reason, count] of Object.entries(report.dismissed_reason_histogram)) {
418
- const label = t(`doctor.cite.dismissed.${reason}`);
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(`### ${t("doctor.cite.section.noneReasons")}`);
488
+ lines.push(`### ${dt("doctor.cite.section.noneReasons")}`);
425
489
  for (const [reason, count] of Object.entries(report.none_reason_histogram)) {
426
- const label = t(`doctor.cite.none.${reason}`);
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 renderEnrichDescriptionsReport(report) {
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(t("doctor.enrich.allComplete"));
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-6ICJICVU.js";
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-TDZYZV54.js").then((module) => module.default),
15
- doctor: () => import("./doctor-R2E2XO6A.js").then((module) => module.default),
16
- serve: () => import("./serve-NPCI342P.js").then((module) => module.default),
17
- uninstall: () => import("./uninstall-MQM6NUFM.js").then((module) => module.default),
18
- config: () => import("./config-XGUUAYX6.js").then((module) => module.default),
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.23",
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-STLR2GHP.js";
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-6ICJICVU.js";
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.23" : "unknown";
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)));
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-G2CIOLD4.js";
8
8
  import {
9
9
  t
10
- } from "./chunk-6ICJICVU.js";
10
+ } from "./chunk-PWLW3B57.js";
11
11
  import {
12
12
  createDebugLogger,
13
13
  resolveDevMode
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-G2CIOLD4.js";
20
20
  import {
21
21
  t
22
- } from "./chunk-6ICJICVU.js";
22
+ } from "./chunk-PWLW3B57.js";
23
23
  import {
24
24
  createDebugLogger,
25
25
  resolveDevMode
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fenglimg/fabric-cli",
3
- "version": "2.0.0-rc.23",
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.23",
24
- "@fenglimg/fabric-shared": "2.0.0-rc.23"
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",