@wrongstack/cli 1.0.17 → 1.0.24

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.
Files changed (125) hide show
  1. package/dist/{acp-INCNOH42.js → acp-AJWSKWE5.js} +18 -7
  2. package/dist/arg-parser.d.ts +1 -0
  3. package/dist/{auth-YXK3EDUL.js → auth-GRBZ7Y3D.js} +61 -15
  4. package/dist/auth-menu/direct.d.ts +1 -0
  5. package/dist/auth-menu/local.d.ts +2 -0
  6. package/dist/auth-menu/oauth-menu.d.ts +3 -1
  7. package/dist/auth-menu/panel-service.d.ts +20 -0
  8. package/dist/{bench-YBU6BVQP.js → bench-N5K7Z5O3.js} +2 -2
  9. package/dist/boot/config-backup-recovery.d.ts +2 -1
  10. package/dist/boot/dispatch-webui.d.ts +11 -0
  11. package/dist/boot/short-circuit-desktop.d.ts +1 -0
  12. package/dist/boot/tui-project-picker-callback.d.ts +1 -1
  13. package/dist/boot/tui-settings-adapter.d.ts +15 -2
  14. package/dist/{boot-auto-thin-MANHOYHE.js → boot-auto-thin-6Q56FY3F.js} +3 -2
  15. package/dist/{chunk-6WRKAACA.js → chunk-2BKFWIER.js} +4 -2
  16. package/dist/{chunk-JY52HWL6.js → chunk-2EBVTYJR.js} +2 -2
  17. package/dist/chunk-3OCUS3VN.js +46 -0
  18. package/dist/chunk-424ORSE7.js +56 -0
  19. package/dist/{chunk-KEPABQYT.js → chunk-5SEYGOCH.js} +8 -82
  20. package/dist/chunk-BBHWW6LR.js +549 -0
  21. package/dist/{chunk-CJTBLTS4.js → chunk-BLD5DSVA.js} +4 -3
  22. package/dist/{chunk-K5PAL6KR.js → chunk-DRM7PSW7.js} +75 -29
  23. package/dist/{chunk-XJ7K67PP.js → chunk-JF2MULWF.js} +17 -10
  24. package/dist/{chunk-SIS37L3W.js → chunk-L2RVEQWO.js} +211 -193
  25. package/dist/{chunk-RDHFXOJM.js → chunk-LFMVHT3R.js} +106 -57
  26. package/dist/chunk-LUMETJFO.js +171 -0
  27. package/dist/{chunk-C3Z4N6A6.js → chunk-MHEBWVXL.js} +6 -2
  28. package/dist/{chunk-VGER3HYZ.js → chunk-PGKJ2OQP.js} +5 -5
  29. package/dist/{chunk-672UXYL3.js → chunk-QBBF7GIK.js} +2 -2
  30. package/dist/{chunk-DE7BZDNK.js → chunk-QFPQXKCG.js} +11 -3
  31. package/dist/chunk-R4QGL6GB.js +10 -0
  32. package/dist/chunk-S4FFHDJG.js +93 -0
  33. package/dist/chunk-SFBFYIOW.js +271 -0
  34. package/dist/{chunk-JX6KL7OF.js → chunk-SKPDE62W.js} +4 -3
  35. package/dist/{chunk-RMQNCHGO.js → chunk-U46QR4WR.js} +5 -9
  36. package/dist/{chunk-B4JLSXZB.js → chunk-WSTVGC2C.js} +73 -45
  37. package/dist/chunk-YBUCXXYZ.js +36 -0
  38. package/dist/{chunk-2VMJ3E5Z.js → chunk-YTEOAWOJ.js} +6 -2
  39. package/dist/{chunk-GPPRNAKW.js → chunk-ZMX5HRLI.js} +2 -2
  40. package/dist/{chunk-YLQEGYV4.js → chunk-ZZRSG7VK.js} +14 -4
  41. package/dist/{cli-context-4PTWEK52.js → cli-context-34Q5IJRA.js} +121 -89
  42. package/dist/cli-entry-point.d.ts +2 -0
  43. package/dist/{cli-main-DQ2GBY7M.js → cli-main-AELJDBGU.js} +1471 -1293
  44. package/dist/config-doctor.d.ts +10 -2
  45. package/dist/{config-transfer-2YF3CRTN.js → config-transfer-RUWLDCNK.js} +34 -13
  46. package/dist/{diag-doctor-ANPRUYFM.js → diag-doctor-WIFJH3XH.js} +2 -2
  47. package/dist/execute-deps.d.ts +2 -1
  48. package/dist/{execution-A6WJLSOC.js → execution-PYC5FCS4.js} +303 -256
  49. package/dist/{hq-NU75W3SE.js → hq-JTUTFI4L.js} +274 -258
  50. package/dist/hq-command-controller.d.ts +1 -1
  51. package/dist/hq-server/project-root.d.ts +35 -1
  52. package/dist/{hq-server-M2JWVW4D.js → hq-server-PC7GZMPT.js} +2 -2
  53. package/dist/{hq-service-L5INQFM4.js → hq-service-NW56MUP2.js} +11 -4
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.js +17 -12
  56. package/dist/kanban-supervisor-67ECABTD.js +7 -0
  57. package/dist/live-settings-input.d.ts +7 -0
  58. package/dist/{mailbox-serve-3GFOK2I7.js → mailbox-serve-WDOCH6KR.js} +3 -3
  59. package/dist/{mcp-DC5WSBOO.js → mcp-LBS45HWZ.js} +4 -4
  60. package/dist/modeldiag-36OGAL5C.js +828 -0
  61. package/dist/{per-subcommand-help-DHTYU524.js → per-subcommand-help-XE77MTGJ.js} +3 -3
  62. package/dist/permission-prompt-mirror.d.ts +1 -1
  63. package/dist/permission-prompt.d.ts +2 -2
  64. package/dist/plugin-config.d.ts +12 -0
  65. package/dist/plugin-management-types.d.ts +31 -0
  66. package/dist/plugin-management.d.ts +2 -30
  67. package/dist/plugin-package-install.d.ts +3 -0
  68. package/dist/{plugin-usage-M6KET4OZ.js → plugin-usage-S5LVGMBW.js} +6 -5
  69. package/dist/{plugins-WJLW6ULV.js → plugins-RHBIVLI7.js} +4 -3
  70. package/dist/provider-config-utils.d.ts +1 -6
  71. package/dist/{providers-models-LFNZ5WI7.js → providers-models-2CFG46RD.js} +41 -31
  72. package/dist/release-asset-download.d.ts +3 -0
  73. package/dist/services/dispatch-classifier.d.ts +39 -5
  74. package/dist/{sessions-config-UL45XKX7.js → sessions-config-IQUH2GXT.js} +13 -5
  75. package/dist/settings-menu.d.ts +2 -0
  76. package/dist/short-circuit-flags-SDT53OML.js +10 -0
  77. package/dist/{simpleui-dist-CXSIDAXZ.js → simpleui-dist-7BQISSEP.js} +7 -3
  78. package/dist/skill-suggest-L2EVWB6R.js +290 -0
  79. package/dist/slash-commands/effort.d.ts +1 -1
  80. package/dist/slash-commands/fallback.d.ts +1 -1
  81. package/dist/slash-commands/gitid.d.ts +1 -1
  82. package/dist/slash-commands/jev.d.ts +4 -0
  83. package/dist/slash-commands/openai-quota.d.ts +15 -0
  84. package/dist/slash-commands/sdd-task-mutations.d.ts +4 -0
  85. package/dist/slash-commands/settings-keys.d.ts +2 -0
  86. package/dist/slash-commands/settings-reset.d.ts +6 -0
  87. package/dist/standalone-update-MW47J3AK.js +164 -0
  88. package/dist/standalone-update.d.ts +19 -0
  89. package/dist/subcommands/handlers/hq-alerts.d.ts +3 -0
  90. package/dist/subcommands/handlers/hq-audit.d.ts +46 -0
  91. package/dist/subcommands/handlers/hq-data-dir.d.ts +13 -0
  92. package/dist/subcommands/handlers/skill-suggest.d.ts +21 -0
  93. package/dist/subcommands/handlers/typesafe-brain-replay.d.ts +26 -0
  94. package/dist/subcommands/handlers/typesafe-judgment-check.d.ts +3 -0
  95. package/dist/subcommands/handlers/typesafe-topic-replay.d.ts +19 -0
  96. package/dist/subcommands/handlers/typesafe-triage-replay.d.ts +18 -0
  97. package/dist/subcommands/handlers/typesafe.d.ts +23 -0
  98. package/dist/{subcommands-ERDDIJ3L.js → subcommands-ZTSIN7LG.js} +2 -2
  99. package/dist/typesafe-HVEVPA6R.js +316 -0
  100. package/dist/typesafe-brain-replay-C5276FVR.js +222 -0
  101. package/dist/typesafe-judgment-check-GGYYV5UF.js +29 -0
  102. package/dist/typesafe-topic-replay-4W73BOLV.js +218 -0
  103. package/dist/typesafe-triage-replay-FGAW7QM7.js +215 -0
  104. package/dist/{update-5DPB4YD4.js → update-7XIOEXTD.js} +4 -3
  105. package/dist/{update-check-BS3DHTSI.js → update-check-2POMBHFB.js} +3 -2
  106. package/dist/update-check.d.ts +1 -1
  107. package/dist/version-help-WZ623NWM.js +10 -0
  108. package/dist/version.d.ts +3 -2
  109. package/dist/webui-client-observability.d.ts +7 -0
  110. package/dist/{webui-server-MRPGTTKL.js → webui-server-L2SICPTB.js} +158 -94
  111. package/dist/webui-server-options.d.ts +11 -0
  112. package/dist/webui-server.d.ts +15 -1
  113. package/dist/wiring/domain-glossary.d.ts +5 -4
  114. package/dist/wiring/plugins.d.ts +1 -1
  115. package/dist/wiring/provider-persisters.d.ts +24 -0
  116. package/dist/wiring/provider-runtime.d.ts +9 -1
  117. package/dist/wiring/runtime-dispatch-state.d.ts +3 -1
  118. package/package.json +28 -28
  119. package/dist/chunk-DR2OXU46.js +0 -174
  120. package/dist/chunk-JACOMTIH.js +0 -275
  121. package/dist/chunk-M4W3QLQW.js +0 -54
  122. package/dist/chunk-XJXDOF63.js +0 -28
  123. package/dist/modeldiag-CJSFHZ3J.js +0 -1356
  124. package/dist/short-circuit-flags-SJQBJ33I.js +0 -10
  125. package/dist/version-help-WXI42PZ3.js +0 -10
@@ -33,7 +33,7 @@ import {
33
33
  import { randomUUID as randomUUID6 } from "node:crypto";
34
34
  import * as fs4 from "node:fs/promises";
35
35
  import * as http from "node:http";
36
- import * as path7 from "node:path";
36
+ import * as path8 from "node:path";
37
37
  import { getSharedProjectMailbox } from "@wrongstack/core/coordination";
38
38
  import {
39
39
  assessHqExposure as assessHqExposure2,
@@ -635,12 +635,13 @@ import {
635
635
  MailboxEventEmitter,
636
636
  MailboxHttpRateLimiter
637
637
  } from "@wrongstack/core/coordination";
638
- import * as path5 from "node:path";
638
+ import * as path6 from "node:path";
639
639
 
640
640
  // src/hq-static-serve.ts
641
641
  import * as fs2 from "node:fs";
642
642
  import { createRequire } from "node:module";
643
643
  import * as path2 from "node:path";
644
+ import { wrongstackPackageJsonPath } from "@wrongstack/core/utils";
644
645
  var requireFromHere = createRequire(import.meta.url);
645
646
  var MIME = {
646
647
  ".html": "text/html; charset=utf-8",
@@ -660,7 +661,10 @@ var cachedDistDir;
660
661
  function resolveHqDistDir() {
661
662
  if (cachedDistDir !== void 0) return cachedDistDir;
662
663
  try {
663
- const pkgJson = requireFromHere.resolve("@wrongstack/webui-hq/package.json");
664
+ const pkgJson = wrongstackPackageJsonPath(
665
+ "@wrongstack/webui-hq",
666
+ (id) => requireFromHere.resolve(id)
667
+ );
664
668
  const dist = path2.join(path2.dirname(pkgJson), "dist");
665
669
  if (fs2.existsSync(path2.join(dist, "index.html"))) {
666
670
  cachedDistDir = dist;
@@ -687,7 +691,7 @@ function resolveHqDistDir() {
687
691
  }
688
692
  function isInsideDist(filePath, distDir) {
689
693
  const rel = path2.relative(distDir, filePath);
690
- return rel !== "" && !rel.startsWith("..") && !path2.isAbsolute(rel);
694
+ return rel !== "" && rel !== ".." && !rel.startsWith(`..${path2.sep}`) && !path2.isAbsolute(rel);
691
695
  }
692
696
  function isMissingPath(error) {
693
697
  const code = error.code;
@@ -2165,11 +2169,24 @@ async function authorizeHqCommand(input) {
2165
2169
  }
2166
2170
 
2167
2171
  // src/hq-server/routes/mailbox-handlers.ts
2168
- import * as path3 from "node:path";
2172
+ import * as path4 from "node:path";
2169
2173
  import { resolveProjectDir } from "@wrongstack/core/coordination";
2170
2174
 
2171
2175
  // src/hq-server/project-root.ts
2176
+ import * as fsp from "node:fs/promises";
2177
+ import * as path3 from "node:path";
2172
2178
  import { deriveHqProjectId } from "@wrongstack/core/hq";
2179
+ function isPlainSegment(value) {
2180
+ return value.length > 0 && value !== "." && value !== ".." && !value.includes("/") && !value.includes("\\") && !path3.isAbsolute(value);
2181
+ }
2182
+ async function projectDirectoryExists(globalRoot, projectId) {
2183
+ if (!isPlainSegment(projectId)) return false;
2184
+ try {
2185
+ return (await fsp.stat(path3.join(globalRoot, "projects", projectId))).isDirectory();
2186
+ } catch {
2187
+ return false;
2188
+ }
2189
+ }
2173
2190
  function resolveHqProjectRoot(globalRoot, ids) {
2174
2191
  const fn = async () => {
2175
2192
  const { getSessionRegistry } = await import("@wrongstack/core/storage");
@@ -2177,7 +2194,7 @@ function resolveHqProjectRoot(globalRoot, ids) {
2177
2194
  const registry = getSessionRegistry(globalRoot);
2178
2195
  if (typeof ids.sessionId === "string") {
2179
2196
  const entry = await registry.get(ids.sessionId).catch(() => null);
2180
- if (entry?.projectRoot) return entry.projectRoot;
2197
+ if (entry?.projectRoot) return { status: "found", projectRoot: entry.projectRoot };
2181
2198
  }
2182
2199
  if (typeof ids.projectId === "string") {
2183
2200
  const { createHash: createHash2 } = await import("node:crypto");
@@ -2193,11 +2210,15 @@ function resolveHqProjectRoot(globalRoot, ids) {
2193
2210
  const match = all.find(
2194
2211
  (e) => e.projectSlug === ids.projectId || projectIdForRoot(e.projectRoot) === ids.projectId || createHash2("sha256").update(e.projectRoot).digest("hex").slice(0, 12) === ids.projectId
2195
2212
  );
2196
- if (match) return match.projectRoot;
2213
+ if (match) return { status: "found", projectRoot: match.projectRoot };
2214
+ if (await projectDirectoryExists(globalRoot, ids.projectId)) {
2215
+ return { status: "unavailable" };
2216
+ }
2197
2217
  }
2198
2218
  } catch {
2219
+ return { status: "unavailable" };
2199
2220
  }
2200
- return void 0;
2221
+ return { status: "unknown" };
2201
2222
  };
2202
2223
  return fn();
2203
2224
  }
@@ -2221,7 +2242,7 @@ async function handleMailboxGateway(_req, res, match, authorizeMailboxGateway, g
2221
2242
  );
2222
2243
  return;
2223
2244
  }
2224
- const gatewayGlobalRoot = path3.dirname(dataDir);
2245
+ const gatewayGlobalRoot = path4.dirname(dataDir);
2225
2246
  const preliminaryAccess = authorizeMailboxGateway(_req, `project:${projectId}`);
2226
2247
  if (!preliminaryAccess.allowed) {
2227
2248
  res.writeHead(preliminaryAccess.status ?? 401, {
@@ -2231,14 +2252,27 @@ async function handleMailboxGateway(_req, res, match, authorizeMailboxGateway, g
2231
2252
  res.end(JSON.stringify(preliminaryAccess.body));
2232
2253
  return;
2233
2254
  }
2234
- const projectRoot = await resolveHqProjectRoot(gatewayGlobalRoot, { projectId });
2235
- if (!projectRoot) {
2255
+ const resolution = await resolveHqProjectRoot(gatewayGlobalRoot, { projectId });
2256
+ if (resolution.status === "unavailable") {
2257
+ res.writeHead(503, { "Content-Type": "application/json", "Retry-After": "1" });
2258
+ res.end(
2259
+ JSON.stringify({
2260
+ error: {
2261
+ code: "UNAVAILABLE",
2262
+ message: `Project ${projectId} is not reachable right now; retry shortly.`
2263
+ }
2264
+ })
2265
+ );
2266
+ return;
2267
+ }
2268
+ if (resolution.status !== "found") {
2236
2269
  res.writeHead(404, { "Content-Type": "application/json" });
2237
2270
  res.end(
2238
2271
  JSON.stringify({ error: { code: "NOT_FOUND", message: `Unknown project: ${projectId}` } })
2239
2272
  );
2240
2273
  return;
2241
2274
  }
2275
+ const projectRoot = resolution.projectRoot;
2242
2276
  const suffix = match[2];
2243
2277
  const rawUrl = _req.url ?? "";
2244
2278
  const queryIndex = rawUrl.indexOf("?");
@@ -2287,16 +2321,22 @@ async function handleApiMailboxSend(_req, res, mutableAuth, sessions, dataDir, g
2287
2321
  res.end(JSON.stringify({ error: "audience must be all or leaders" }));
2288
2322
  return;
2289
2323
  }
2290
- const mbGlobalRoot = path3.dirname(dataDir);
2291
- const projectRoot = await resolveHqProjectRoot(mbGlobalRoot, {
2324
+ const mbGlobalRoot = path4.dirname(dataDir);
2325
+ const mbResolution = await resolveHqProjectRoot(mbGlobalRoot, {
2292
2326
  sessionId: mbody.sessionId,
2293
2327
  projectId: mbody.projectId
2294
2328
  });
2295
- if (typeof projectRoot !== "string" || projectRoot.length === 0) {
2329
+ if (mbResolution.status === "unavailable") {
2330
+ res.writeHead(503, { "Content-Type": "application/json", "Retry-After": "1" });
2331
+ res.end(JSON.stringify({ error: "target project mailbox is not reachable right now" }));
2332
+ return;
2333
+ }
2334
+ if (mbResolution.status !== "found" || mbResolution.projectRoot.length === 0) {
2296
2335
  res.writeHead(404, { "Content-Type": "application/json" });
2297
2336
  res.end(JSON.stringify({ error: "could not resolve target project mailbox" }));
2298
2337
  return;
2299
2338
  }
2339
+ const projectRoot = mbResolution.projectRoot;
2300
2340
  const to = typeof mbody.to === "string" ? mbody.to : "leader";
2301
2341
  const subject = typeof mbody.subject === "string" ? mbody.subject : "HQ prompt";
2302
2342
  const priority = mbody.priority === "high" ? "high" : mbody.priority === "low" ? "low" : "normal";
@@ -2407,16 +2447,22 @@ async function handleMailboxAction(_req, res, match, mutableAuth, sessions, data
2407
2447
  res.end(JSON.stringify({ error: "missing sessionId or projectId" }));
2408
2448
  return;
2409
2449
  }
2410
- const actGlobalRoot = path3.dirname(dataDir);
2411
- const projectRoot = await resolveHqProjectRoot(actGlobalRoot, {
2450
+ const actGlobalRoot = path4.dirname(dataDir);
2451
+ const actResolution = await resolveHqProjectRoot(actGlobalRoot, {
2412
2452
  sessionId: abody.sessionId,
2413
2453
  projectId: abody.projectId
2414
2454
  });
2415
- if (typeof projectRoot !== "string" || projectRoot.length === 0) {
2455
+ if (actResolution.status === "unavailable") {
2456
+ res.writeHead(503, { "Content-Type": "application/json", "Retry-After": "1" });
2457
+ res.end(JSON.stringify({ error: "target project mailbox is not reachable right now" }));
2458
+ return;
2459
+ }
2460
+ if (actResolution.status !== "found" || actResolution.projectRoot.length === 0) {
2416
2461
  res.writeHead(404, { "Content-Type": "application/json" });
2417
2462
  res.end(JSON.stringify({ error: "could not resolve target project mailbox" }));
2418
2463
  return;
2419
2464
  }
2465
+ const projectRoot = actResolution.projectRoot;
2420
2466
  try {
2421
2467
  const { actionToAckInput } = await import("@wrongstack/core/coordination");
2422
2468
  const projectDir = resolveProjectDir(projectRoot, actGlobalRoot);
@@ -2647,14 +2693,14 @@ async function handleApiTrendsCost(req, res, persistence) {
2647
2693
  }
2648
2694
 
2649
2695
  // src/hq-server/routes/session-handlers.ts
2650
- import * as path4 from "node:path";
2696
+ import * as path5 from "node:path";
2651
2697
  import {
2652
2698
  buildTranscriptFromEvents,
2653
2699
  resolveHqDataDir
2654
2700
  } from "@wrongstack/core/hq";
2655
2701
  async function handleApiSessions(res) {
2656
2702
  const { getSessionRegistry } = await import("@wrongstack/core/storage");
2657
- const globalRoot = path4.dirname(resolveHqDataDir());
2703
+ const globalRoot = path5.dirname(resolveHqDataDir());
2658
2704
  try {
2659
2705
  const registry = getSessionRegistry(globalRoot);
2660
2706
  const sessions = await registry.list();
@@ -2699,7 +2745,7 @@ async function handleApiSessionEvents(req, res, match, transcripts) {
2699
2745
  res.end(JSON.stringify({ error: "invalid sessionId encoding" }));
2700
2746
  return;
2701
2747
  }
2702
- const globalRoot = path4.dirname(resolveHqDataDir());
2748
+ const globalRoot = path5.dirname(resolveHqDataDir());
2703
2749
  try {
2704
2750
  const registry = getSessionRegistry(globalRoot);
2705
2751
  const entry = await registry.get(sessionId).catch(() => null);
@@ -2801,8 +2847,8 @@ async function handleApiAgentMessages(req, res, match, agentMessages) {
2801
2847
  // src/hq-server/routes/system-handlers.ts
2802
2848
  async function handleApiSystemUpdate(res) {
2803
2849
  const [{ checkForUpdate }, { detectUpdatePackageName }] = await Promise.all([
2804
- import("./update-check-BS3DHTSI.js"),
2805
- import("./update-5DPB4YD4.js")
2850
+ import("./update-check-2POMBHFB.js"),
2851
+ import("./update-7XIOEXTD.js")
2806
2852
  ]);
2807
2853
  const packageName = detectUpdatePackageName();
2808
2854
  const info = await checkForUpdate({ packageName });
@@ -3430,7 +3476,7 @@ var MailboxGatewayManager = class {
3430
3476
  const lastUsed = this.mailboxGatewayLastUsed.get(projectDir);
3431
3477
  gateways.push({
3432
3478
  // projectId = basename(projectDir) — matches the credential contract.
3433
- projectId: path5.basename(projectDir),
3479
+ projectId: path6.basename(projectDir),
3434
3480
  projectRoot: projectDir,
3435
3481
  hasActiveStreams: gateway.router.hasActiveStreams(),
3436
3482
  lastUsedAt: typeof lastUsed === "number" ? lastUsed : null,
@@ -3520,7 +3566,7 @@ async function prepareHqServerStart(options, defaults) {
3520
3566
 
3521
3567
  // src/hq-server/startup.ts
3522
3568
  import * as fs3 from "node:fs/promises";
3523
- import * as path6 from "node:path";
3569
+ import * as path7 from "node:path";
3524
3570
  import { writeHqRuntimeFile } from "@wrongstack/core/hq";
3525
3571
  var hqRuntimeMarkerPath2 = hqRuntimeMarkerPath;
3526
3572
  async function writeHqRuntimeMarker(dataDir, url) {
@@ -3601,7 +3647,7 @@ HQ auth loaded from ${startup.dataDir}
3601
3647
  if (startup.clientEnv.WRONGSTACK_HQ_TOKEN) {
3602
3648
  write(` WRONGSTACK_HQ_TOKEN=${startup.clientEnv.WRONGSTACK_HQ_TOKEN}
3603
3649
  `);
3604
- write(`Credentials are stored in ${path6.join(startup.dataDir, "auth.json")}
3650
+ write(`Credentials are stored in ${path7.join(startup.dataDir, "auth.json")}
3605
3651
  `);
3606
3652
  }
3607
3653
  writeHqLanEndpoints(write, handle, void 0);
@@ -4731,12 +4777,12 @@ async function startHqServerWithAuth(options, host, port, dataDir, firstRunAuth)
4731
4777
  const persistence = createHqPersistence(dataDir);
4732
4778
  const auditLog = new HqCommandAuditLog(1e3, (entry) => persistence.commandLog.append(entry));
4733
4779
  void (async () => {
4734
- const projectsDir = path7.join(path7.dirname(dataDir), "projects");
4780
+ const projectsDir = path8.join(path8.dirname(dataDir), "projects");
4735
4781
  const entries = await fs4.readdir(projectsDir, { withFileTypes: true }).catch(() => []);
4736
4782
  await Promise.all(
4737
4783
  entries.filter((entry) => entry.isDirectory()).map(async (entry) => {
4738
- const projectDir = path7.join(projectsDir, entry.name);
4739
- const metadataPath = path7.join(projectDir, ".mailbox-server.json");
4784
+ const projectDir = path8.join(projectsDir, entry.name);
4785
+ const metadataPath = path8.join(projectDir, ".mailbox-server.json");
4740
4786
  const ownerPid = await fs4.readFile(metadataPath, "utf8").then((raw) => JSON.parse(raw).pid).catch(() => void 0);
4741
4787
  if (ownerPid === void 0) return;
4742
4788
  let ownerAlive = false;
@@ -5104,4 +5150,4 @@ export {
5104
5150
  startHqServer,
5105
5151
  HqInsecureExposureError2 as HqInsecureExposureError
5106
5152
  };
5107
- //# sourceMappingURL=chunk-K5PAL6KR.js.map
5153
+ //# sourceMappingURL=chunk-DRM7PSW7.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  PLUGIN_AUDIT_ENTRIES,
6
6
  loadExternalPlugins
7
- } from "./chunk-SIS37L3W.js";
7
+ } from "./chunk-L2RVEQWO.js";
8
8
 
9
9
  // src/wiring/plugins.ts
10
10
  import { join } from "node:path";
@@ -20,7 +20,21 @@ function createApi(ownerName, base) {
20
20
  // src/wiring/plugins.ts
21
21
  var DEPRECATED_PLUGIN_NAMES = {
22
22
  "web-search": "use the built-in `search` and `fetch` tools",
23
- "json-path": "use the built-in `json` tool with action: query | validate | transform | merge"
23
+ "json-path": "use the built-in `json` tool with action: query | validate | transform | merge",
24
+ // Deleted in the 2026-09-17 catalog review. The first four produced
25
+ // findings that were noise by construction (each was run against this
26
+ // repo and mis-reported); the rest duplicated infrastructure the host
27
+ // already ships. Kept here so an existing config that still lists one
28
+ // warns and skips instead of failing to resolve the import.
29
+ "interface-contract-guard": "removed \u2014 it reported plain data interfaces as unimplemented",
30
+ "refactor-suggester": "removed \u2014 use `lint-gate` plus the built-in `grep` and `read` tools",
31
+ "feature-flag-tracker": "removed \u2014 use the built-in `grep` tool with your own flag pattern",
32
+ "dead-code-detector": "removed \u2014 use your linter / `tsc` and `duplicate-code-detector`",
33
+ "semantic-search-indexer": "use the built-in `grep` tool or the codebase-index MCP server",
34
+ "knowledge-graph": "use the built-in `remember` / `search_memory` / `find_related_memories`",
35
+ "todo-tracker": "use the built-in `todo` tool and the Kanban board",
36
+ "smart-rename": "use the built-in `replace` tool",
37
+ "code-metrics": "removed \u2014 it reported numbers nothing acted on"
24
38
  };
25
39
  var deprecatedWarningsEmitted = /* @__PURE__ */ new Set();
26
40
  var BUILTIN_PLUGIN_CONFIG_ALIASES = {
@@ -171,13 +185,6 @@ async function setupPlugins(params) {
171
185
  if (allPlugins.length === 0) return;
172
186
  const pluginOptions = buildPluginOptions(config, allPlugins);
173
187
  if (paths?.projectDir) {
174
- if (pluginOptions["todo-tracker"] === void 0) {
175
- pluginOptions["todo-tracker"] = {};
176
- }
177
- const todoTrackerOpts = pluginOptions["todo-tracker"];
178
- if (typeof todoTrackerOpts["filePath"] !== "string" || todoTrackerOpts["filePath"] === "") {
179
- todoTrackerOpts["filePath"] = join(paths.projectDir, "todo-tracker.json");
180
- }
181
188
  const contextPinsOpts = pluginOptions["context-pins"] ?? {};
182
189
  pluginOptions["context-pins"] = contextPinsOpts;
183
190
  if (typeof contextPinsOpts["filePath"] !== "string" || contextPinsOpts["filePath"] === "") {
@@ -267,4 +274,4 @@ export {
267
274
  BUILTIN_PLUGIN_FACTORIES,
268
275
  setupPlugins
269
276
  };
270
- //# sourceMappingURL=chunk-XJ7K67PP.js.map
277
+ //# sourceMappingURL=chunk-JF2MULWF.js.map