@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.
- package/dist/index.js +91 -6
- 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
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
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