secufusion-mcp 2.3.0 → 2.4.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.
@@ -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.3.0",
4
+ "version": "2.4.0",
5
5
  "author": {
6
6
  "name": "Motivity Labs"
7
7
  },
@@ -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
- const cached = JSON.parse(readFileSafe(philosophyFile) || "null");
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 features/stories
1570
+ if ((task_type === "feature" || task_type === "user_story") && (!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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "secufusion-mcp",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "type": "module",
5
5
  "description": "Project-level spec driven AI workflow tooling for SecuFusion, MCP server - developer workflow tooling with guardrails",
6
6
  "main": "mcp/dist/server.js",