@kaddo/mcp 3.47.0 → 3.48.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.
Files changed (2) hide show
  1. package/dist/index.js +91 -6
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5516,6 +5516,43 @@ function buildRoadmapQuality(dir) {
5516
5516
  return { initiatives, work_item_candidates };
5517
5517
  }
5518
5518
 
5519
+ // ../cli/src/core/scan-signals.ts
5520
+ function signalCount(signals) {
5521
+ return Object.values(signals).reduce((sum, arr) => sum + arr.length, 0);
5522
+ }
5523
+ function hasWarnings(signals) {
5524
+ return signals.tests.some((s) => s.label.includes("No test directory"));
5525
+ }
5526
+ function renderSignalsCompact(signals) {
5527
+ const lines = [];
5528
+ const CATEGORIES = [
5529
+ ["auth", "Auth"],
5530
+ ["payments", "Payments"],
5531
+ ["webhooks", "Webhooks"],
5532
+ ["storage", "Storage"],
5533
+ ["background_jobs", "Background jobs"],
5534
+ ["email", "Email"],
5535
+ ["database", "Database"],
5536
+ ["migrations", "Migrations"],
5537
+ ["api_routes", "API routes"],
5538
+ ["tests", "Tests"],
5539
+ ["security", "Security"],
5540
+ ["infrastructure", "Infrastructure"],
5541
+ ["external_integrations", "External integrations"],
5542
+ ["environment", "Environment"]
5543
+ ];
5544
+ for (const [key, label] of CATEGORIES) {
5545
+ const arr = signals[key];
5546
+ if (arr.length === 0) continue;
5547
+ if (arr.length === 1) {
5548
+ lines.push(`- ${label}: ${arr[0].label}`);
5549
+ } else {
5550
+ lines.push(`- ${label}: ${arr.length}`);
5551
+ }
5552
+ }
5553
+ return lines.length > 0 ? lines.join("\n") + "\n" : "No signals detected.\n";
5554
+ }
5555
+
5519
5556
  // ../cli/src/core/project-route.ts
5520
5557
  function isUseful(q) {
5521
5558
  return q === "useful";
@@ -5532,11 +5569,11 @@ var enableKaddo = {
5532
5569
  var scanRepository = {
5533
5570
  id: "scan-repository",
5534
5571
  label: "Scan repository",
5535
- evaluate: (ctx) => ({
5536
- status: ctx.hasScan ? "done" : ctx.hasConfig ? "pending" : "pending",
5537
- evidence: ctx.hasScan ? [".kaddo/scan.json"] : void 0,
5538
- command: ctx.hasScan ? void 0 : "kaddo scan"
5539
- })
5572
+ evaluate: (ctx) => {
5573
+ if (!ctx.hasScan) return { status: "pending", command: "kaddo scan" };
5574
+ if (ctx.hasScanWarnings) return { status: "warning", evidence: [".kaddo/scan.json"], reason: "Scan has warnings (e.g. no test directory detected).", command: "kaddo scan" };
5575
+ return { status: "done", evidence: [".kaddo/scan.json"] };
5576
+ }
5540
5577
  };
5541
5578
  var defineBusiness = {
5542
5579
  id: "define-business",
@@ -5823,9 +5860,18 @@ function buildRouteContext(dir) {
5823
5860
  totalAdrs: td.adrs,
5824
5861
  adaptersInstalled: adapters.length,
5825
5862
  hasGuardHistory: exists(join(dir, ".kaddo", "history", "guard-runs.jsonl")),
5863
+ hasScanWarnings: hasScan ? loadScanWarnings(dir) : false,
5826
5864
  nextStepId: mapNextStepId(nextStep.id)
5827
5865
  };
5828
5866
  }
5867
+ function loadScanWarnings(dir) {
5868
+ try {
5869
+ const parsed = JSON.parse(readFile(join(dir, ".kaddo", "scan.json")));
5870
+ return parsed.signals ? hasWarnings(parsed.signals) : false;
5871
+ } catch {
5872
+ return false;
5873
+ }
5874
+ }
5829
5875
  function mapNextStepId(id) {
5830
5876
  const MAP = {
5831
5877
  init: "enable-kaddo",
@@ -5972,6 +6018,16 @@ function loadScan(dir) {
5972
6018
  return null;
5973
6019
  }
5974
6020
  }
6021
+ function loadScanSignals(dir) {
6022
+ const scanPath = join(dir, ".kaddo", "scan.json");
6023
+ if (!exists(scanPath)) return null;
6024
+ try {
6025
+ const parsed = JSON.parse(readFile(scanPath));
6026
+ return parsed.signals ?? null;
6027
+ } catch {
6028
+ return null;
6029
+ }
6030
+ }
5975
6031
  function hasAgents(dir) {
5976
6032
  const agentsDir = join(dir, ARCH_DIR2, "agents");
5977
6033
  if (!exists(agentsDir)) return false;
@@ -6143,7 +6199,8 @@ function buildProjectExplanation(dir) {
6143
6199
  },
6144
6200
  installedAssets: installedAssetsSummary(dir),
6145
6201
  roadmapQuality: buildRoadmapQuality(dir),
6146
- projectRoute: buildProjectRoute(dir)
6202
+ projectRoute: buildProjectRoute(dir),
6203
+ scanSignals: loadScanSignals(dir)
6147
6204
  };
6148
6205
  }
6149
6206
  function stateLabel(state) {
@@ -6188,6 +6245,10 @@ function renderExplanationHuman(exp) {
6188
6245
  lines.push(`- Infrastructure: ${exp.stack.infrastructureFiles.join(", ")}`);
6189
6246
  lines.push("");
6190
6247
  }
6248
+ if (exp.scanSignals && signalCount(exp.scanSignals) > 0) {
6249
+ lines.push("## Scan Signals");
6250
+ lines.push(renderSignalsCompact(exp.scanSignals));
6251
+ }
6191
6252
  const ls = (name) => exp.layers.find((l) => l.layer === name)?.status ?? "Missing";
6192
6253
  lines.push("## Knowledge Status");
6193
6254
  lines.push(`- Inventory: ${exp.knowledge.hasInventory ? "available" : "missing"}`);
@@ -7699,6 +7760,25 @@ var RESOURCES = [
7699
7760
  }
7700
7761
  return [{ uri: "kaddo://project-route", text: JSON.stringify(buildProjectRoute(root), null, 2), mimeType: "application/json" }];
7701
7762
  }
7763
+ },
7764
+ {
7765
+ uri: "kaddo://scan-signals",
7766
+ name: "Kaddo scan signals",
7767
+ description: "Actionable signals detected by `kaddo scan`: auth, payments, webhooks, storage, background jobs, email, database, migrations, API routes, tests, security, infrastructure, integrations, environment (VS-081). Read-only.",
7768
+ mimeType: "application/json",
7769
+ read: (root) => {
7770
+ const body = readText(root, ".kaddo/scan.json");
7771
+ if (body) {
7772
+ try {
7773
+ const parsed = JSON.parse(body);
7774
+ if (parsed.signals) {
7775
+ return [{ uri: "kaddo://scan-signals", text: JSON.stringify(parsed.signals, null, 2), mimeType: "application/json" }];
7776
+ }
7777
+ } catch {
7778
+ }
7779
+ }
7780
+ return text("kaddo://scan-signals", "Scan signals not found. Run `kaddo scan` first.", "text/plain");
7781
+ }
7702
7782
  }
7703
7783
  ];
7704
7784
 
@@ -8040,6 +8120,7 @@ function buildContextPack(dir, config, now = /* @__PURE__ */ new Date()) {
8040
8120
  graph: loadGraphSummary(dir),
8041
8121
  graphHints: loadGraphHints(dir),
8042
8122
  skills: discoverInstalledSkills(dir).map((s) => s.id),
8123
+ scanSignals: scanJson?.signals ?? null,
8043
8124
  projectRoute: buildProjectRoute(dir),
8044
8125
  mappedModules,
8045
8126
  missing,
@@ -8154,6 +8235,10 @@ function renderContextPack(pack) {
8154
8235
  } else {
8155
8236
  parts.push("Scan baseline missing. Run `kaddo scan` for better context.\n");
8156
8237
  }
8238
+ if (pack.scanSignals && signalCount(pack.scanSignals) > 0) {
8239
+ parts.push("## Scan Signals\n");
8240
+ parts.push(renderSignalsCompact(pack.scanSignals));
8241
+ }
8157
8242
  parts.push("## Current Knowledge\n");
8158
8243
  parts.push((knowledge.summary || "No project knowledge summary found yet.") + "\n");
8159
8244
  parts.push("## Roadmap Status\n");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaddo/mcp",
3
- "version": "3.47.0",
3
+ "version": "3.48.0",
4
4
  "description": "MCP server for Kaddo project knowledge: read-only resources/tools/prompts plus safe derived generation under .kaddo/.",
5
5
  "license": "MIT",
6
6
  "repository": {