secufusion-mcp 2.3.0 → 2.4.1
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/.claude-plugin/plugin.json +1 -1
- package/mcp/dist/server.js +17 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "secufusion-mcp",
|
|
3
3
|
"description": "SecuFusion MSSP platform dev agent — project-level spec driven, tenant-isolation enforced, zero-trust guardrails. 5 Core Slash Commands: /sfn-init (dynamic DNA + architecture diagram + watcher), /sfn-plan (philosophy check + intent WHY + classify + plan), /sfn-code (spec-driven implementation), /sfn-review (zero-tolerance 3-tier PR gate), /sfn-explore (on-demand service graph or blast-radius analysis).",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.4.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Motivity Labs"
|
|
7
7
|
},
|
package/mcp/dist/server.js
CHANGED
|
@@ -1556,15 +1556,31 @@ server.tool("philosophy_check", "MANDATORY PHASE -1 STEP — runs BEFORE classif
|
|
|
1556
1556
|
// Check cache
|
|
1557
1557
|
const philosophyDir = resolve(".secufusion/philosophy");
|
|
1558
1558
|
const philosophyFile = path.join(philosophyDir, `${work_item_id}.json`);
|
|
1559
|
+
let cached = null;
|
|
1559
1560
|
if (fs.existsSync(philosophyFile)) {
|
|
1560
1561
|
try {
|
|
1561
|
-
|
|
1562
|
+
cached = JSON.parse(readFileSafe(philosophyFile) || "null");
|
|
1562
1563
|
if (cached && (cached.philosophy_verdict === "PHILOSOPHY_PASS" || cached.philosophy_verdict === "PHILOSOPHY_ADVISORY")) {
|
|
1563
1564
|
return appendTelemetry({ content: [{ type: "text", text: `[PHILOSOPHY CACHED] ${work_item_id} — verdict: ${cached.philosophy_verdict}\n\n${cached.developer_message}` }] }, inputChars);
|
|
1564
1565
|
}
|
|
1565
1566
|
}
|
|
1566
1567
|
catch { }
|
|
1567
1568
|
}
|
|
1569
|
+
// Mandatory interview for ALL work items (features, bugs, chores, etc.)
|
|
1570
|
+
if (!cached || !cached.interview_completed) {
|
|
1571
|
+
const interviewText = `[PHILOSOPHY FAIL] ${work_item_id}\n\nBefore I help you build this, talk to me.\n\nWhat problem is this solving?\nWalk me through what the user is experiencing today\nwithout this feature. What's broken? What's painful?\nWhat happens if we don't build this at all?\n\nWho will actually use this and how often?\nIs this solving a problem for 1 client or all tenants?\n\nI see you said WHO: CONFIRMED —\nbut confirmed by whom exactly?\nIs that a verbal yes in a meeting or\na written requirement from the client?\nThose are very different things.\n\nDo NOT call classify_task. Re-run philosophy_check after resolving.`;
|
|
1572
|
+
if (!fs.existsSync(philosophyDir))
|
|
1573
|
+
fs.mkdirSync(philosophyDir, { recursive: true });
|
|
1574
|
+
try {
|
|
1575
|
+
writeFile(philosophyFile, JSON.stringify({
|
|
1576
|
+
work_item_id,
|
|
1577
|
+
philosophy_verdict: "PHILOSOPHY_FAIL",
|
|
1578
|
+
interview_completed: true
|
|
1579
|
+
}, null, 2));
|
|
1580
|
+
}
|
|
1581
|
+
catch { }
|
|
1582
|
+
return appendTelemetry({ content: [{ type: "text", text: interviewText }] }, inputChars);
|
|
1583
|
+
}
|
|
1568
1584
|
const wsRoot = getWorkspaceRoot();
|
|
1569
1585
|
let rejectedPatterns = [];
|
|
1570
1586
|
const rejRaw = readFileSafe(resolve(REJECTED_FILE));
|
package/package.json
CHANGED