@mcp-graph-workflow/mcp-graph 5.1.4 → 5.2.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/api/router.d.ts +1 -0
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +3 -2
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/folder.d.ts +4 -1
- package/dist/api/routes/folder.d.ts.map +1 -1
- package/dist/api/routes/folder.js +20 -1
- package/dist/api/routes/folder.js.map +1 -1
- package/dist/api/routes/gitnexus.d.ts.map +1 -1
- package/dist/api/routes/gitnexus.js +3 -1
- package/dist/api/routes/gitnexus.js.map +1 -1
- package/dist/core/analyzer/ac-parser.d.ts +7 -0
- package/dist/core/analyzer/ac-parser.d.ts.map +1 -0
- package/dist/core/analyzer/ac-parser.js +67 -0
- package/dist/core/analyzer/ac-parser.js.map +1 -0
- package/dist/core/analyzer/ac-validator.d.ts +15 -0
- package/dist/core/analyzer/ac-validator.d.ts.map +1 -0
- package/dist/core/analyzer/ac-validator.js +142 -0
- package/dist/core/analyzer/ac-validator.js.map +1 -0
- package/dist/core/analyzer/definition-of-ready.d.ts +16 -0
- package/dist/core/analyzer/definition-of-ready.d.ts.map +1 -0
- package/dist/core/analyzer/definition-of-ready.js +107 -0
- package/dist/core/analyzer/definition-of-ready.js.map +1 -0
- package/dist/core/analyzer/prd-quality.d.ts +14 -0
- package/dist/core/analyzer/prd-quality.d.ts.map +1 -0
- package/dist/core/analyzer/prd-quality.js +156 -0
- package/dist/core/analyzer/prd-quality.js.map +1 -0
- package/dist/core/analyzer/risk-assessment.d.ts +11 -0
- package/dist/core/analyzer/risk-assessment.d.ts.map +1 -0
- package/dist/core/analyzer/risk-assessment.js +97 -0
- package/dist/core/analyzer/risk-assessment.js.map +1 -0
- package/dist/core/analyzer/scope-analyzer.d.ts +7 -0
- package/dist/core/analyzer/scope-analyzer.d.ts.map +1 -0
- package/dist/core/analyzer/scope-analyzer.js +99 -0
- package/dist/core/analyzer/scope-analyzer.js.map +1 -0
- package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
- package/dist/core/config/ai-memory-generator.js +8 -11
- package/dist/core/config/ai-memory-generator.js.map +1 -1
- package/dist/core/context/context-assembler.d.ts +3 -0
- package/dist/core/context/context-assembler.d.ts.map +1 -1
- package/dist/core/context/context-assembler.js +5 -2
- package/dist/core/context/context-assembler.js.map +1 -1
- package/dist/core/context/rag-context.d.ts +4 -2
- package/dist/core/context/rag-context.d.ts.map +1 -1
- package/dist/core/context/rag-context.js +8 -5
- package/dist/core/context/rag-context.js.map +1 -1
- package/dist/core/designer/adr-validator.d.ts +8 -0
- package/dist/core/designer/adr-validator.d.ts.map +1 -0
- package/dist/core/designer/adr-validator.js +61 -0
- package/dist/core/designer/adr-validator.js.map +1 -0
- package/dist/core/designer/coupling-analyzer.d.ts +7 -0
- package/dist/core/designer/coupling-analyzer.d.ts.map +1 -0
- package/dist/core/designer/coupling-analyzer.js +59 -0
- package/dist/core/designer/coupling-analyzer.js.map +1 -0
- package/dist/core/designer/definition-of-ready.d.ts +8 -0
- package/dist/core/designer/definition-of-ready.d.ts.map +1 -0
- package/dist/core/designer/definition-of-ready.js +146 -0
- package/dist/core/designer/definition-of-ready.js.map +1 -0
- package/dist/core/designer/interface-checker.d.ts +7 -0
- package/dist/core/designer/interface-checker.d.ts.map +1 -0
- package/dist/core/designer/interface-checker.js +53 -0
- package/dist/core/designer/interface-checker.js.map +1 -0
- package/dist/core/designer/tech-risk-assessor.d.ts +7 -0
- package/dist/core/designer/tech-risk-assessor.d.ts.map +1 -0
- package/dist/core/designer/tech-risk-assessor.js +95 -0
- package/dist/core/designer/tech-risk-assessor.js.map +1 -0
- package/dist/core/designer/traceability-matrix.d.ts +8 -0
- package/dist/core/designer/traceability-matrix.d.ts.map +1 -0
- package/dist/core/designer/traceability-matrix.js +67 -0
- package/dist/core/designer/traceability-matrix.js.map +1 -0
- package/dist/core/events/event-types.d.ts +11 -1
- package/dist/core/events/event-types.d.ts.map +1 -1
- package/dist/core/handoff/delivery-checklist.d.ts +10 -0
- package/dist/core/handoff/delivery-checklist.d.ts.map +1 -0
- package/dist/core/handoff/delivery-checklist.js +148 -0
- package/dist/core/handoff/delivery-checklist.js.map +1 -0
- package/dist/core/handoff/doc-completeness.d.ts +7 -0
- package/dist/core/handoff/doc-completeness.d.ts.map +1 -0
- package/dist/core/handoff/doc-completeness.js +19 -0
- package/dist/core/handoff/doc-completeness.js.map +1 -0
- package/dist/core/implementer/definition-of-done.d.ts +11 -0
- package/dist/core/implementer/definition-of-done.d.ts.map +1 -0
- package/dist/core/implementer/definition-of-done.js +158 -0
- package/dist/core/implementer/definition-of-done.js.map +1 -0
- package/dist/core/implementer/sprint-progress.d.ts +11 -0
- package/dist/core/implementer/sprint-progress.d.ts.map +1 -0
- package/dist/core/implementer/sprint-progress.js +80 -0
- package/dist/core/implementer/sprint-progress.js.map +1 -0
- package/dist/core/implementer/tdd-checker.d.ts +15 -0
- package/dist/core/implementer/tdd-checker.d.ts.map +1 -0
- package/dist/core/implementer/tdd-checker.js +132 -0
- package/dist/core/implementer/tdd-checker.js.map +1 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts +5 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -1
- package/dist/core/integrations/gitnexus-launcher.js +30 -3
- package/dist/core/integrations/gitnexus-launcher.js.map +1 -1
- package/dist/core/listener/backlog-health.d.ts +7 -0
- package/dist/core/listener/backlog-health.d.ts.map +1 -0
- package/dist/core/listener/backlog-health.js +64 -0
- package/dist/core/listener/backlog-health.js.map +1 -0
- package/dist/core/listener/feedback-readiness.d.ts +11 -0
- package/dist/core/listener/feedback-readiness.d.ts.map +1 -0
- package/dist/core/listener/feedback-readiness.js +124 -0
- package/dist/core/listener/feedback-readiness.js.map +1 -0
- package/dist/core/planner/lifecycle-phase.d.ts +26 -3
- package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
- package/dist/core/planner/lifecycle-phase.js +209 -17
- package/dist/core/planner/lifecycle-phase.js.map +1 -1
- package/dist/core/rag/phase-metadata.d.ts +23 -0
- package/dist/core/rag/phase-metadata.d.ts.map +1 -0
- package/dist/core/rag/phase-metadata.js +72 -0
- package/dist/core/rag/phase-metadata.js.map +1 -0
- package/dist/core/rag/phase-summary.d.ts +17 -0
- package/dist/core/rag/phase-summary.d.ts.map +1 -0
- package/dist/core/rag/phase-summary.js +104 -0
- package/dist/core/rag/phase-summary.js.map +1 -0
- package/dist/core/rag/prd-indexer.d.ts +16 -0
- package/dist/core/rag/prd-indexer.d.ts.map +1 -0
- package/dist/core/rag/prd-indexer.js +37 -0
- package/dist/core/rag/prd-indexer.js.map +1 -0
- package/dist/core/reviewer/review-readiness.d.ts +8 -0
- package/dist/core/reviewer/review-readiness.d.ts.map +1 -0
- package/dist/core/reviewer/review-readiness.js +159 -0
- package/dist/core/reviewer/review-readiness.js.map +1 -0
- package/dist/core/store/knowledge-store.d.ts +9 -0
- package/dist/core/store/knowledge-store.d.ts.map +1 -1
- package/dist/core/store/knowledge-store.js +22 -0
- package/dist/core/store/knowledge-store.js.map +1 -1
- package/dist/core/utils/errors.d.ts +7 -0
- package/dist/core/utils/errors.d.ts.map +1 -1
- package/dist/core/utils/errors.js +14 -0
- package/dist/core/utils/errors.js.map +1 -1
- package/dist/core/validator/definition-of-ready.d.ts +8 -0
- package/dist/core/validator/definition-of-ready.d.ts.map +1 -0
- package/dist/core/validator/definition-of-ready.js +155 -0
- package/dist/core/validator/definition-of-ready.js.map +1 -0
- package/dist/core/validator/done-integrity-checker.d.ts +7 -0
- package/dist/core/validator/done-integrity-checker.d.ts.map +1 -0
- package/dist/core/validator/done-integrity-checker.js +38 -0
- package/dist/core/validator/done-integrity-checker.js.map +1 -0
- package/dist/core/validator/status-flow-checker.d.ts +7 -0
- package/dist/core/validator/status-flow-checker.d.ts.map +1 -0
- package/dist/core/validator/status-flow-checker.js +26 -0
- package/dist/core/validator/status-flow-checker.js.map +1 -0
- package/dist/mcp/app-factory.d.ts +1 -0
- package/dist/mcp/app-factory.d.ts.map +1 -1
- package/dist/mcp/app-factory.js +2 -2
- package/dist/mcp/app-factory.js.map +1 -1
- package/dist/mcp/lifecycle-wrapper.d.ts +14 -4
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
- package/dist/mcp/lifecycle-wrapper.js +104 -5
- package/dist/mcp/lifecycle-wrapper.js.map +1 -1
- package/dist/mcp/server.js +3 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/{stats.d.ts → analyze.d.ts} +2 -2
- package/dist/mcp/tools/analyze.d.ts.map +1 -0
- package/dist/mcp/tools/analyze.js +272 -0
- package/dist/mcp/tools/analyze.js.map +1 -0
- package/dist/mcp/tools/import-prd.d.ts.map +1 -1
- package/dist/mcp/tools/import-prd.js +15 -1
- package/dist/mcp/tools/import-prd.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +6 -10
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/{velocity.d.ts → metrics.d.ts} +2 -2
- package/dist/mcp/tools/metrics.d.ts.map +1 -0
- package/dist/mcp/tools/metrics.js +69 -0
- package/dist/mcp/tools/metrics.js.map +1 -0
- package/dist/mcp/tools/next.d.ts.map +1 -1
- package/dist/mcp/tools/next.js +19 -5
- package/dist/mcp/tools/next.js.map +1 -1
- package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
- package/dist/mcp/tools/plan-sprint.js +20 -0
- package/dist/mcp/tools/plan-sprint.js.map +1 -1
- package/dist/mcp/tools/rag-context.d.ts.map +1 -1
- package/dist/mcp/tools/rag-context.js +20 -5
- package/dist/mcp/tools/rag-context.js.map +1 -1
- package/dist/mcp/tools/set-phase.d.ts.map +1 -1
- package/dist/mcp/tools/set-phase.js +64 -6
- package/dist/mcp/tools/set-phase.js.map +1 -1
- package/dist/mcp/tools/update-status.d.ts.map +1 -1
- package/dist/mcp/tools/update-status.js +21 -6
- package/dist/mcp/tools/update-status.js.map +1 -1
- package/dist/mcp/tools/{decompose.d.ts → validate-ac.d.ts} +2 -2
- package/dist/mcp/tools/validate-ac.d.ts.map +1 -0
- package/dist/mcp/tools/validate-ac.js +23 -0
- package/dist/mcp/tools/validate-ac.js.map +1 -0
- package/dist/schemas/ac-quality-schema.d.ts +90 -0
- package/dist/schemas/ac-quality-schema.d.ts.map +1 -0
- package/dist/schemas/ac-quality-schema.js +34 -0
- package/dist/schemas/ac-quality-schema.js.map +1 -0
- package/dist/schemas/analyzer-schema.d.ts +160 -0
- package/dist/schemas/analyzer-schema.d.ts.map +1 -0
- package/dist/schemas/analyzer-schema.js +74 -0
- package/dist/schemas/analyzer-schema.js.map +1 -0
- package/dist/schemas/designer-schema.d.ts +259 -0
- package/dist/schemas/designer-schema.d.ts.map +1 -0
- package/dist/schemas/designer-schema.js +102 -0
- package/dist/schemas/designer-schema.js.map +1 -0
- package/dist/schemas/handoff-schema.d.ts +49 -0
- package/dist/schemas/handoff-schema.d.ts.map +1 -0
- package/dist/schemas/handoff-schema.js +28 -0
- package/dist/schemas/handoff-schema.js.map +1 -0
- package/dist/schemas/implementer-schema.d.ts +187 -0
- package/dist/schemas/implementer-schema.d.ts.map +1 -0
- package/dist/schemas/implementer-schema.js +80 -0
- package/dist/schemas/implementer-schema.js.map +1 -0
- package/dist/schemas/knowledge.schema.d.ts +8 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -1
- package/dist/schemas/knowledge.schema.js +1 -1
- package/dist/schemas/knowledge.schema.js.map +1 -1
- package/dist/schemas/listener-schema.d.ts +62 -0
- package/dist/schemas/listener-schema.d.ts.map +1 -0
- package/dist/schemas/listener-schema.js +35 -0
- package/dist/schemas/listener-schema.js.map +1 -0
- package/dist/schemas/reviewer-schema.d.ts +34 -0
- package/dist/schemas/reviewer-schema.d.ts.map +1 -0
- package/dist/schemas/reviewer-schema.js +17 -0
- package/dist/schemas/reviewer-schema.js.map +1 -0
- package/dist/schemas/validator-schema.d.ts +79 -0
- package/dist/schemas/validator-schema.d.ts.map +1 -0
- package/dist/schemas/validator-schema.js +43 -0
- package/dist/schemas/validator-schema.js.map +1 -0
- package/dist/web/dashboard/dist/assets/{benchmark-tab-CuZsNkbP.js → benchmark-tab-DE6hAHVG.js} +1 -1
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DsBjJHx8.js +312 -0
- package/dist/web/dashboard/dist/assets/graph-tab-C09DzeZ_.js +1 -0
- package/dist/web/dashboard/dist/assets/{graph-utils-D5iPoiPD.js → graph-utils-D4LFspTf.js} +5 -5
- package/dist/web/dashboard/dist/assets/{index-CN9Wi5mu.js → index-B2fTJ4AS.js} +2 -2
- package/dist/web/dashboard/dist/assets/index-CkqEqKiH.css +1 -0
- package/dist/web/dashboard/dist/assets/{insights-tab-CLA0OIxd.js → insights-tab-Bm7CDckb.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-CSYlvuCu.js → logs-tab-Cxpcv_ni.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-BBLpErTk.js → prd-backlog-tab-X84Rj-IB.js} +1 -1
- package/dist/web/dashboard/dist/assets/{serena-tab-BxYP8nU5.js → serena-tab-BunULNvw.js} +1 -1
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/mcp/tools/bulk-update-status.d.ts +0 -4
- package/dist/mcp/tools/bulk-update-status.d.ts.map +0 -1
- package/dist/mcp/tools/bulk-update-status.js +0 -22
- package/dist/mcp/tools/bulk-update-status.js.map +0 -1
- package/dist/mcp/tools/decompose.d.ts.map +0 -1
- package/dist/mcp/tools/decompose.js +0 -25
- package/dist/mcp/tools/decompose.js.map +0 -1
- package/dist/mcp/tools/dependencies.d.ts +0 -4
- package/dist/mcp/tools/dependencies.d.ts.map +0 -1
- package/dist/mcp/tools/dependencies.js +0 -47
- package/dist/mcp/tools/dependencies.js.map +0 -1
- package/dist/mcp/tools/stats.d.ts.map +0 -1
- package/dist/mcp/tools/stats.js +0 -46
- package/dist/mcp/tools/stats.js.map +0 -1
- package/dist/mcp/tools/velocity.d.ts.map +0 -1
- package/dist/mcp/tools/velocity.js +0 -25
- package/dist/mcp/tools/velocity.js.map +0 -1
- package/dist/web/dashboard/dist/assets/gitnexus-tab-D7If6lxT.js +0 -312
- package/dist/web/dashboard/dist/assets/graph-tab-Dp7PfUEJ.js +0 -1
- package/dist/web/dashboard/dist/assets/index-BUl7yWBP.css +0 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status Flow Checker — validates that done tasks went through proper status transitions.
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
const TASK_TYPES = new Set(["task", "subtask"]);
|
|
6
|
+
export function checkStatusFlow(doc) {
|
|
7
|
+
const violations = [];
|
|
8
|
+
const doneTasks = doc.nodes.filter((n) => TASK_TYPES.has(n.type) && n.status === "done");
|
|
9
|
+
for (const task of doneTasks) {
|
|
10
|
+
// Heuristic: if updatedAt === createdAt, the task never transitioned through statuses
|
|
11
|
+
if (task.updatedAt === task.createdAt) {
|
|
12
|
+
violations.push({
|
|
13
|
+
nodeId: task.id,
|
|
14
|
+
title: task.title,
|
|
15
|
+
currentStatus: task.status,
|
|
16
|
+
details: `Task "${task.title}" marcada como done sem transição de status (createdAt === updatedAt)`,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const complianceRate = doneTasks.length === 0
|
|
21
|
+
? 100
|
|
22
|
+
: Math.round(((doneTasks.length - violations.length) / doneTasks.length) * 100);
|
|
23
|
+
logger.info("status-flow-check", { complianceRate, violationCount: violations.length });
|
|
24
|
+
return { violations, complianceRate };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=status-flow-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-flow-checker.js","sourceRoot":"","sources":["../../../src/core/validator/status-flow-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhD,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAEzF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,sFAAsF;QACtF,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,aAAa,EAAE,IAAI,CAAC,MAAM;gBAC1B,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,uEAAuE;aACpG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC;QAC3C,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAElF,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAExF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -9,6 +9,7 @@ export interface AppFactoryOptions {
|
|
|
9
9
|
eventBus: GraphEventBus;
|
|
10
10
|
mcp?: McpServer;
|
|
11
11
|
storeManager?: StoreManager;
|
|
12
|
+
gitnexusPort?: number;
|
|
12
13
|
}
|
|
13
14
|
export declare function createApp(options: AppFactoryOptions): Express;
|
|
14
15
|
//# sourceMappingURL=app-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-factory.d.ts","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"app-factory.d.ts","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CA6B7D"}
|
package/dist/mcp/app-factory.js
CHANGED
|
@@ -6,7 +6,7 @@ import { createApiRouter } from "../api/router.js";
|
|
|
6
6
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
7
|
const publicDir = path.join(__dirname, "..", "web", "dashboard", "dist");
|
|
8
8
|
export function createApp(options) {
|
|
9
|
-
const { store, basePath, eventBus, mcp, storeManager } = options;
|
|
9
|
+
const { store, basePath, eventBus, mcp, storeManager, gitnexusPort } = options;
|
|
10
10
|
const app = express();
|
|
11
11
|
app.use(express.json());
|
|
12
12
|
// MCP HTTP transport (optional — only when MCP server is provided)
|
|
@@ -20,7 +20,7 @@ export function createApp(options) {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
// REST API
|
|
23
|
-
app.use("/api/v1", createApiRouter({ store, basePath, eventBus, storeManager }));
|
|
23
|
+
app.use("/api/v1", createApiRouter({ store, basePath, eventBus, storeManager, gitnexusPort }));
|
|
24
24
|
// Static files (dashboard)
|
|
25
25
|
app.use(express.static(publicDir));
|
|
26
26
|
// Health check
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-factory.js","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-factory.js","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAWzE,MAAM,UAAU,SAAS,CAAC,OAA0B;IAClD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAE/E,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,mEAAmE;IACnE,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,SAAS;aAC9B,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAE/F,2BAA2B;IAC3B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnC,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { SqliteStore } from "../core/store/sqlite-store.js";
|
|
3
3
|
import type { GraphDocument } from "../core/graph/graph-types.js";
|
|
4
|
-
import { type LifecyclePhase, type LifecycleWarning, type McpAgentSuggestion } from "../core/planner/lifecycle-phase.js";
|
|
4
|
+
import { type LifecyclePhase, type LifecycleWarning, type McpAgentSuggestion, type StrictnessMode } from "../core/planner/lifecycle-phase.js";
|
|
5
|
+
export interface PhaseKnowledgeSnippet {
|
|
6
|
+
title: string;
|
|
7
|
+
sourceType: string;
|
|
8
|
+
snippet: string;
|
|
9
|
+
phase?: string;
|
|
10
|
+
}
|
|
5
11
|
export interface LifecycleBlock {
|
|
6
12
|
phase: LifecyclePhase;
|
|
7
13
|
reminder: string;
|
|
@@ -9,14 +15,18 @@ export interface LifecycleBlock {
|
|
|
9
15
|
principles: string[];
|
|
10
16
|
warnings: LifecycleWarning[];
|
|
11
17
|
suggestedMcpAgents?: McpAgentSuggestion[];
|
|
18
|
+
phaseKnowledge?: PhaseKnowledgeSnippet[];
|
|
12
19
|
}
|
|
13
20
|
export interface LifecycleBlockOptions {
|
|
14
21
|
toolName?: string;
|
|
15
22
|
hasSnapshots?: boolean;
|
|
16
23
|
phaseOverride?: LifecyclePhase | null;
|
|
24
|
+
mode?: StrictnessMode;
|
|
25
|
+
store?: SqliteStore;
|
|
17
26
|
}
|
|
18
27
|
/**
|
|
19
28
|
* Build the _lifecycle block to append to MCP tool responses.
|
|
29
|
+
* Optionally includes top-3 knowledge snippets relevant to the current phase.
|
|
20
30
|
*/
|
|
21
31
|
export declare function buildLifecycleBlock(doc: GraphDocument, options?: LifecycleBlockOptions): LifecycleBlock;
|
|
22
32
|
/**
|
|
@@ -25,9 +35,9 @@ export declare function buildLifecycleBlock(doc: GraphDocument, options?: Lifecy
|
|
|
25
35
|
*/
|
|
26
36
|
export declare function appendLifecycleToResponse(responseJson: string, doc: GraphDocument): string;
|
|
27
37
|
/**
|
|
28
|
-
* Wrap all registered MCP tool handlers to append
|
|
29
|
-
*
|
|
30
|
-
*
|
|
38
|
+
* Wrap all registered MCP tool handlers to enforce lifecycle gates and append lifecycle context.
|
|
39
|
+
* Pre-execution: checks tool gates and status gates (blocks in strict mode).
|
|
40
|
+
* Post-execution: appends _lifecycle block to responses.
|
|
31
41
|
*/
|
|
32
42
|
export declare function wrapToolsWithLifecycle(server: McpServer, store: SqliteStore): void;
|
|
33
43
|
//# sourceMappingURL=lifecycle-wrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-wrapper.d.ts","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"lifecycle-wrapper.d.ts","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAC;AAI5C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CA0CvG;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAU1F;AA6DD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAkFlF"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { detectCurrentPhase, getPhaseGuidance, detectWarnings } from "../core/planner/lifecycle-phase.js";
|
|
1
|
+
import { detectCurrentPhase, getPhaseGuidance, detectWarnings, checkToolGate, checkStatusGate, } from "../core/planner/lifecycle-phase.js";
|
|
2
|
+
import { KnowledgeStore } from "../core/store/knowledge-store.js";
|
|
2
3
|
import { logger } from "../core/utils/logger.js";
|
|
3
4
|
/**
|
|
4
5
|
* Build the _lifecycle block to append to MCP tool responses.
|
|
6
|
+
* Optionally includes top-3 knowledge snippets relevant to the current phase.
|
|
5
7
|
*/
|
|
6
8
|
export function buildLifecycleBlock(doc, options) {
|
|
7
9
|
const phase = detectCurrentPhase(doc, {
|
|
@@ -10,8 +12,29 @@ export function buildLifecycleBlock(doc, options) {
|
|
|
10
12
|
});
|
|
11
13
|
const guidance = getPhaseGuidance(phase);
|
|
12
14
|
const warnings = options?.toolName
|
|
13
|
-
? detectWarnings(doc, phase, options.toolName)
|
|
15
|
+
? detectWarnings(doc, phase, options.toolName, options?.mode)
|
|
14
16
|
: [];
|
|
17
|
+
// Fetch top-3 phase-relevant knowledge snippets
|
|
18
|
+
let phaseKnowledge;
|
|
19
|
+
if (options?.store) {
|
|
20
|
+
try {
|
|
21
|
+
const knowledgeStore = new KnowledgeStore(options.store.getDb());
|
|
22
|
+
const phaseQuery = `phase ${phase} context`;
|
|
23
|
+
const results = knowledgeStore.searchWithPhaseBoost(phaseQuery, phase, 3);
|
|
24
|
+
if (results.length > 0) {
|
|
25
|
+
phaseKnowledge = results.map((r) => ({
|
|
26
|
+
title: r.title,
|
|
27
|
+
sourceType: r.sourceType,
|
|
28
|
+
snippet: r.content.length > 200 ? r.content.slice(0, 200) + "..." : r.content,
|
|
29
|
+
phase: r.metadata?.phase ?? undefined,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Knowledge search may fail — not critical
|
|
35
|
+
logger.debug("lifecycle-wrapper: phase knowledge search skipped");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
15
38
|
return {
|
|
16
39
|
phase,
|
|
17
40
|
reminder: guidance.reminder,
|
|
@@ -21,6 +44,7 @@ export function buildLifecycleBlock(doc, options) {
|
|
|
21
44
|
...(guidance.suggestedMcpAgents && guidance.suggestedMcpAgents.length > 0
|
|
22
45
|
? { suggestedMcpAgents: guidance.suggestedMcpAgents }
|
|
23
46
|
: {}),
|
|
47
|
+
...(phaseKnowledge && phaseKnowledge.length > 0 ? { phaseKnowledge } : {}),
|
|
24
48
|
};
|
|
25
49
|
}
|
|
26
50
|
/**
|
|
@@ -40,9 +64,48 @@ export function appendLifecycleToResponse(responseJson, doc) {
|
|
|
40
64
|
}
|
|
41
65
|
}
|
|
42
66
|
/**
|
|
43
|
-
*
|
|
44
|
-
|
|
45
|
-
|
|
67
|
+
* Build a blocked response for when a tool is gated by lifecycle enforcement.
|
|
68
|
+
*/
|
|
69
|
+
function buildBlockedResponse(toolName, phase, warnings) {
|
|
70
|
+
const errorWarnings = warnings.filter((w) => w.severity === "error");
|
|
71
|
+
return {
|
|
72
|
+
content: [{
|
|
73
|
+
type: "text",
|
|
74
|
+
text: JSON.stringify({
|
|
75
|
+
error: "lifecycle_gate_blocked",
|
|
76
|
+
phase,
|
|
77
|
+
tool: toolName,
|
|
78
|
+
reason: errorWarnings.map((w) => w.message).join("; "),
|
|
79
|
+
warnings: errorWarnings,
|
|
80
|
+
hint: "Use set_phase com force:true para bypass, ou mude para mode:'advisory' com set_phase({phase:'auto', mode:'advisory'})",
|
|
81
|
+
}, null, 2),
|
|
82
|
+
}],
|
|
83
|
+
isError: true,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Extract node ID and new status from tool call args for status gate checks.
|
|
88
|
+
*/
|
|
89
|
+
function extractStatusArgs(toolName, args) {
|
|
90
|
+
if (toolName !== "update_status") {
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
// MCP tool args are passed as the first argument (an object)
|
|
94
|
+
const toolArgs = args[0];
|
|
95
|
+
if (!toolArgs)
|
|
96
|
+
return {};
|
|
97
|
+
if (toolName === "update_status") {
|
|
98
|
+
return {
|
|
99
|
+
nodeId: toolArgs.nodeId,
|
|
100
|
+
newStatus: toolArgs.status,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Wrap all registered MCP tool handlers to enforce lifecycle gates and append lifecycle context.
|
|
107
|
+
* Pre-execution: checks tool gates and status gates (blocks in strict mode).
|
|
108
|
+
* Post-execution: appends _lifecycle block to responses.
|
|
46
109
|
*/
|
|
47
110
|
export function wrapToolsWithLifecycle(server, store) {
|
|
48
111
|
const registeredTools = server._registeredTools;
|
|
@@ -53,15 +116,51 @@ export function wrapToolsWithLifecycle(server, store) {
|
|
|
53
116
|
for (const [name, tool] of Object.entries(registeredTools)) {
|
|
54
117
|
const originalHandler = tool.handler;
|
|
55
118
|
tool.handler = async (...args) => {
|
|
119
|
+
// ── Pre-execution gate check ──
|
|
120
|
+
try {
|
|
121
|
+
const doc = store.toGraphDocument();
|
|
122
|
+
const phaseOverrideValue = store.getProjectSetting("lifecycle_phase_override");
|
|
123
|
+
const snapshots = store.listSnapshots();
|
|
124
|
+
const modeValue = store.getProjectSetting("lifecycle_strictness_mode");
|
|
125
|
+
const mode = (modeValue === "strict" || modeValue === "advisory") ? modeValue : "strict";
|
|
126
|
+
const phase = detectCurrentPhase(doc, {
|
|
127
|
+
hasSnapshots: snapshots.length > 0,
|
|
128
|
+
phaseOverride: phaseOverrideValue ? phaseOverrideValue : null,
|
|
129
|
+
});
|
|
130
|
+
// Check tool gate
|
|
131
|
+
const gateWarnings = checkToolGate(doc, phase, name, mode);
|
|
132
|
+
// Check status-specific gate for update_status
|
|
133
|
+
const statusArgs = extractStatusArgs(name, args);
|
|
134
|
+
if (statusArgs.nodeId && statusArgs.newStatus) {
|
|
135
|
+
const statusResult = checkStatusGate(doc, phase, statusArgs.nodeId, statusArgs.newStatus, mode);
|
|
136
|
+
gateWarnings.push(...statusResult.warnings);
|
|
137
|
+
}
|
|
138
|
+
// If any warning has severity "error" → block execution
|
|
139
|
+
const hasErrors = gateWarnings.some((w) => w.severity === "error");
|
|
140
|
+
if (hasErrors) {
|
|
141
|
+
logger.warn("lifecycle-wrapper: tool blocked by gate", { tool: name, phase, mode });
|
|
142
|
+
return buildBlockedResponse(name, phase, gateWarnings);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// If store has no project loaded (e.g., for `init`), skip gate check
|
|
147
|
+
logger.debug("lifecycle-wrapper: skipped gate check for tool", { tool: name });
|
|
148
|
+
}
|
|
149
|
+
// ── Execute original handler ──
|
|
56
150
|
const result = await originalHandler(...args);
|
|
151
|
+
// ── Post-execution: append _lifecycle block ──
|
|
57
152
|
try {
|
|
58
153
|
const doc = store.toGraphDocument();
|
|
59
154
|
const phaseOverrideValue = store.getProjectSetting("lifecycle_phase_override");
|
|
60
155
|
const snapshots = store.listSnapshots();
|
|
156
|
+
const modeValue = store.getProjectSetting("lifecycle_strictness_mode");
|
|
157
|
+
const mode = (modeValue === "strict" || modeValue === "advisory") ? modeValue : "strict";
|
|
61
158
|
const lifecycleBlock = buildLifecycleBlock(doc, {
|
|
62
159
|
toolName: name,
|
|
63
160
|
hasSnapshots: snapshots.length > 0,
|
|
64
161
|
phaseOverride: phaseOverrideValue ? phaseOverrideValue : null,
|
|
162
|
+
mode,
|
|
163
|
+
store,
|
|
65
164
|
});
|
|
66
165
|
// Append lifecycle as an additional text content item
|
|
67
166
|
if (result && Array.isArray(result.content)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-wrapper.js","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"lifecycle-wrapper.js","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -19,14 +19,15 @@ registerAllTools(mcp, storeManager.store);
|
|
|
19
19
|
// ── Express app ──────────────────────────────────────────
|
|
20
20
|
const app = createApp({
|
|
21
21
|
store: storeManager.store,
|
|
22
|
-
basePath:
|
|
22
|
+
basePath: storeManager.basePath,
|
|
23
23
|
eventBus,
|
|
24
24
|
mcp,
|
|
25
25
|
storeManager,
|
|
26
|
+
gitnexusPort: config.integrations.gitnexusPort,
|
|
26
27
|
});
|
|
27
28
|
// ── GitNexus auto-start ──────────────────────────────────
|
|
28
29
|
if (config.integrations.gitnexusAutoStart) {
|
|
29
|
-
const basePath =
|
|
30
|
+
const basePath = storeManager.basePath;
|
|
30
31
|
const gitnexusPort = config.integrations.gitnexusPort;
|
|
31
32
|
ensureGitNexusAnalyzed(basePath).then(() => {
|
|
32
33
|
return startGitNexusServe(basePath, gitnexusPort);
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACrH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AAEzB,4DAA4D;AAC5D,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;AACrC,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAEvC,4DAA4D;AAC5D,MAAM,GAAG,GAAG,IAAI,SAAS,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;AAE1C,4DAA4D;AAC5D,MAAM,GAAG,GAAG,SAAS,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC,KAAK;IACzB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { SqliteStore } from "../../core/store/sqlite-store.js";
|
|
3
|
-
export declare function
|
|
4
|
-
//# sourceMappingURL=
|
|
3
|
+
export declare function registerAnalyze(server: McpServer, store: SqliteStore): void;
|
|
4
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/analyze.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AA4DpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA+N3E"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { analyzePrdQuality } from "../../core/analyzer/prd-quality.js";
|
|
3
|
+
import { analyzeScope } from "../../core/analyzer/scope-analyzer.js";
|
|
4
|
+
import { checkDefinitionOfReady } from "../../core/analyzer/definition-of-ready.js";
|
|
5
|
+
import { assessRisks } from "../../core/analyzer/risk-assessment.js";
|
|
6
|
+
import { findTransitiveBlockers, detectCycles, findCriticalPath, } from "../../core/planner/dependency-chain.js";
|
|
7
|
+
import { detectLargeTasks } from "../../core/planner/decompose.js";
|
|
8
|
+
import { validateAdrs } from "../../core/designer/adr-validator.js";
|
|
9
|
+
import { buildTraceabilityMatrix } from "../../core/designer/traceability-matrix.js";
|
|
10
|
+
import { analyzeCoupling } from "../../core/designer/coupling-analyzer.js";
|
|
11
|
+
import { checkInterfaces } from "../../core/designer/interface-checker.js";
|
|
12
|
+
import { assessTechRisks } from "../../core/designer/tech-risk-assessor.js";
|
|
13
|
+
import { checkDesignReadiness } from "../../core/designer/definition-of-ready.js";
|
|
14
|
+
import { checkValidationReadiness } from "../../core/validator/definition-of-ready.js";
|
|
15
|
+
import { checkDoneIntegrity } from "../../core/validator/done-integrity-checker.js";
|
|
16
|
+
import { checkStatusFlow } from "../../core/validator/status-flow-checker.js";
|
|
17
|
+
import { checkReviewReadiness } from "../../core/reviewer/review-readiness.js";
|
|
18
|
+
import { checkHandoffReadiness } from "../../core/handoff/delivery-checklist.js";
|
|
19
|
+
import { checkDocCompleteness } from "../../core/handoff/doc-completeness.js";
|
|
20
|
+
import { checkListeningReadiness } from "../../core/listener/feedback-readiness.js";
|
|
21
|
+
import { analyzeBacklogHealth } from "../../core/listener/backlog-health.js";
|
|
22
|
+
import { KnowledgeStore } from "../../core/store/knowledge-store.js";
|
|
23
|
+
import { detectCurrentPhase } from "../../core/planner/lifecycle-phase.js";
|
|
24
|
+
import { checkDefinitionOfDone } from "../../core/implementer/definition-of-done.js";
|
|
25
|
+
import { checkTddAdherence } from "../../core/implementer/tdd-checker.js";
|
|
26
|
+
import { calculateSprintProgress } from "../../core/implementer/sprint-progress.js";
|
|
27
|
+
import { logger } from "../../core/utils/logger.js";
|
|
28
|
+
const ANALYZE_MODES = z.enum([
|
|
29
|
+
"prd_quality",
|
|
30
|
+
"scope",
|
|
31
|
+
"ready",
|
|
32
|
+
"risk",
|
|
33
|
+
"blockers",
|
|
34
|
+
"cycles",
|
|
35
|
+
"critical_path",
|
|
36
|
+
"decompose",
|
|
37
|
+
"adr",
|
|
38
|
+
"traceability",
|
|
39
|
+
"coupling",
|
|
40
|
+
"interfaces",
|
|
41
|
+
"tech_risk",
|
|
42
|
+
"design_ready",
|
|
43
|
+
"implement_done",
|
|
44
|
+
"tdd_check",
|
|
45
|
+
"progress",
|
|
46
|
+
"validate_ready",
|
|
47
|
+
"done_integrity",
|
|
48
|
+
"status_flow",
|
|
49
|
+
"review_ready",
|
|
50
|
+
"handoff_ready",
|
|
51
|
+
"doc_completeness",
|
|
52
|
+
"listening_ready",
|
|
53
|
+
"backlog_health",
|
|
54
|
+
]);
|
|
55
|
+
export function registerAnalyze(server, store) {
|
|
56
|
+
server.tool("analyze", "Analyze the project graph. Modes: prd_quality, scope, ready, risk, blockers, cycles, critical_path, decompose, adr, traceability, coupling, interfaces, tech_risk, design_ready (DESIGN→PLAN gate), implement_done, tdd_check, progress, validate_ready (IMPLEMENT→VALIDATE gate), done_integrity, status_flow, review_ready (VALIDATE→REVIEW gate), handoff_ready (REVIEW→HANDOFF gate), doc_completeness, listening_ready (HANDOFF→LISTENING gate), backlog_health.", {
|
|
57
|
+
mode: ANALYZE_MODES.describe("Analysis mode"),
|
|
58
|
+
nodeId: z.string().optional().describe("Node ID (required for 'blockers'/'implement_done', optional for 'decompose'/'tdd_check'. For 'progress' mode, used as sprint name filter)"),
|
|
59
|
+
}, async ({ mode, nodeId }) => {
|
|
60
|
+
logger.debug("tool:analyze", { mode, nodeId });
|
|
61
|
+
const doc = store.toGraphDocument();
|
|
62
|
+
switch (mode) {
|
|
63
|
+
case "prd_quality": {
|
|
64
|
+
const report = analyzePrdQuality(doc);
|
|
65
|
+
logger.info("tool:analyze:prd_quality:ok", { score: report.score, grade: report.grade });
|
|
66
|
+
return jsonResponse({ ok: true, mode, ...report });
|
|
67
|
+
}
|
|
68
|
+
case "scope": {
|
|
69
|
+
const analysis = analyzeScope(doc);
|
|
70
|
+
logger.info("tool:analyze:scope:ok", { orphans: analysis.orphans.length });
|
|
71
|
+
return jsonResponse({ ok: true, mode, ...analysis });
|
|
72
|
+
}
|
|
73
|
+
case "ready": {
|
|
74
|
+
const readiness = checkDefinitionOfReady(doc);
|
|
75
|
+
logger.info("tool:analyze:ready:ok", { ready: readiness.readyForNextPhase });
|
|
76
|
+
return jsonResponse({ ok: true, mode, ...readiness });
|
|
77
|
+
}
|
|
78
|
+
case "risk": {
|
|
79
|
+
const matrix = assessRisks(doc);
|
|
80
|
+
logger.info("tool:analyze:risk:ok", { total: matrix.summary.total });
|
|
81
|
+
return jsonResponse({ ok: true, mode, ...matrix });
|
|
82
|
+
}
|
|
83
|
+
case "blockers": {
|
|
84
|
+
if (!nodeId) {
|
|
85
|
+
return errorResponse("nodeId is required for 'blockers' mode");
|
|
86
|
+
}
|
|
87
|
+
const blockers = findTransitiveBlockers(doc, nodeId);
|
|
88
|
+
logger.info("tool:analyze:blockers:ok", { nodeId, blockerCount: blockers.length });
|
|
89
|
+
return jsonResponse({ ok: true, mode, nodeId, blockers });
|
|
90
|
+
}
|
|
91
|
+
case "cycles": {
|
|
92
|
+
const cycles = detectCycles(doc);
|
|
93
|
+
logger.info("tool:analyze:cycles:ok", { cycleCount: cycles.length });
|
|
94
|
+
return jsonResponse({ ok: true, mode, cycles });
|
|
95
|
+
}
|
|
96
|
+
case "critical_path": {
|
|
97
|
+
const path = findCriticalPath(doc);
|
|
98
|
+
logger.info("tool:analyze:critical_path:ok", { pathLength: path.length });
|
|
99
|
+
return jsonResponse({ ok: true, mode, criticalPath: path });
|
|
100
|
+
}
|
|
101
|
+
case "decompose": {
|
|
102
|
+
let results = detectLargeTasks(doc);
|
|
103
|
+
if (nodeId) {
|
|
104
|
+
results = results.filter((r) => r.node.id === nodeId);
|
|
105
|
+
}
|
|
106
|
+
logger.info("tool:analyze:decompose:ok", { count: results.length });
|
|
107
|
+
return jsonResponse({ ok: true, mode, results });
|
|
108
|
+
}
|
|
109
|
+
case "adr": {
|
|
110
|
+
const phase = detectCurrentPhase(doc);
|
|
111
|
+
const adrReport = validateAdrs(doc);
|
|
112
|
+
logger.info("tool:analyze:adr:ok", { grade: adrReport.overallGrade });
|
|
113
|
+
const response = { ok: true, mode, ...adrReport };
|
|
114
|
+
if (phase !== "DESIGN")
|
|
115
|
+
response._info = `Modo adr é específico da fase DESIGN (fase atual: ${phase})`;
|
|
116
|
+
return jsonResponse(response);
|
|
117
|
+
}
|
|
118
|
+
case "traceability": {
|
|
119
|
+
const phase = detectCurrentPhase(doc);
|
|
120
|
+
const traceReport = buildTraceabilityMatrix(doc);
|
|
121
|
+
logger.info("tool:analyze:traceability:ok", { coverageRate: traceReport.coverageRate });
|
|
122
|
+
const response = { ok: true, mode, ...traceReport };
|
|
123
|
+
if (phase !== "DESIGN")
|
|
124
|
+
response._info = `Modo traceability é específico da fase DESIGN (fase atual: ${phase})`;
|
|
125
|
+
return jsonResponse(response);
|
|
126
|
+
}
|
|
127
|
+
case "coupling": {
|
|
128
|
+
const phase = detectCurrentPhase(doc);
|
|
129
|
+
const couplingReport = analyzeCoupling(doc);
|
|
130
|
+
logger.info("tool:analyze:coupling:ok", { highCoupling: couplingReport.highCouplingNodes.length });
|
|
131
|
+
const response = { ok: true, mode, ...couplingReport };
|
|
132
|
+
if (phase !== "DESIGN")
|
|
133
|
+
response._info = `Modo coupling é específico da fase DESIGN (fase atual: ${phase})`;
|
|
134
|
+
return jsonResponse(response);
|
|
135
|
+
}
|
|
136
|
+
case "interfaces": {
|
|
137
|
+
const phase = detectCurrentPhase(doc);
|
|
138
|
+
const ifReport = checkInterfaces(doc);
|
|
139
|
+
logger.info("tool:analyze:interfaces:ok", { overallScore: ifReport.overallScore });
|
|
140
|
+
const response = { ok: true, mode, ...ifReport };
|
|
141
|
+
if (phase !== "DESIGN")
|
|
142
|
+
response._info = `Modo interfaces é específico da fase DESIGN (fase atual: ${phase})`;
|
|
143
|
+
return jsonResponse(response);
|
|
144
|
+
}
|
|
145
|
+
case "tech_risk": {
|
|
146
|
+
const phase = detectCurrentPhase(doc);
|
|
147
|
+
const techRiskReport = assessTechRisks(doc);
|
|
148
|
+
logger.info("tool:analyze:tech_risk:ok", { riskScore: techRiskReport.riskScore });
|
|
149
|
+
const response = { ok: true, mode, ...techRiskReport };
|
|
150
|
+
if (phase !== "DESIGN")
|
|
151
|
+
response._info = `Modo tech_risk é específico da fase DESIGN (fase atual: ${phase})`;
|
|
152
|
+
return jsonResponse(response);
|
|
153
|
+
}
|
|
154
|
+
case "design_ready": {
|
|
155
|
+
const phase = detectCurrentPhase(doc);
|
|
156
|
+
const readinessReport = checkDesignReadiness(doc);
|
|
157
|
+
logger.info("tool:analyze:design_ready:ok", { ready: readinessReport.ready, grade: readinessReport.grade });
|
|
158
|
+
const response = { ok: true, mode, ...readinessReport };
|
|
159
|
+
if (phase !== "DESIGN")
|
|
160
|
+
response._info = `Modo design_ready é específico da fase DESIGN (fase atual: ${phase})`;
|
|
161
|
+
return jsonResponse(response);
|
|
162
|
+
}
|
|
163
|
+
case "implement_done": {
|
|
164
|
+
if (!nodeId) {
|
|
165
|
+
return errorResponse("nodeId is required for 'implement_done' mode");
|
|
166
|
+
}
|
|
167
|
+
const phase = detectCurrentPhase(doc);
|
|
168
|
+
const dodReport = checkDefinitionOfDone(doc, nodeId);
|
|
169
|
+
logger.info("tool:analyze:implement_done:ok", { nodeId, ready: dodReport.ready, grade: dodReport.grade });
|
|
170
|
+
const dodResponse = { ok: true, mode, ...dodReport };
|
|
171
|
+
if (phase !== "IMPLEMENT")
|
|
172
|
+
dodResponse._info = `Modo implement_done é específico da fase IMPLEMENT (fase atual: ${phase})`;
|
|
173
|
+
return jsonResponse(dodResponse);
|
|
174
|
+
}
|
|
175
|
+
case "tdd_check": {
|
|
176
|
+
const phase = detectCurrentPhase(doc);
|
|
177
|
+
const tddReport = checkTddAdherence(doc, nodeId);
|
|
178
|
+
logger.info("tool:analyze:tdd_check:ok", { tasks: tddReport.tasks.length, overallTestability: tddReport.overallTestability });
|
|
179
|
+
const tddResponse = { ok: true, mode, ...tddReport };
|
|
180
|
+
if (phase !== "IMPLEMENT")
|
|
181
|
+
tddResponse._info = `Modo tdd_check é específico da fase IMPLEMENT (fase atual: ${phase})`;
|
|
182
|
+
return jsonResponse(tddResponse);
|
|
183
|
+
}
|
|
184
|
+
case "progress": {
|
|
185
|
+
const phase = detectCurrentPhase(doc);
|
|
186
|
+
const progressReport = calculateSprintProgress(doc, nodeId);
|
|
187
|
+
logger.info("tool:analyze:progress:ok", { done: progressReport.burndown.done, total: progressReport.burndown.total });
|
|
188
|
+
const progressResponse = { ok: true, mode, ...progressReport };
|
|
189
|
+
if (phase !== "IMPLEMENT")
|
|
190
|
+
progressResponse._info = `Modo progress é específico da fase IMPLEMENT (fase atual: ${phase})`;
|
|
191
|
+
return jsonResponse(progressResponse);
|
|
192
|
+
}
|
|
193
|
+
case "validate_ready": {
|
|
194
|
+
const phase = detectCurrentPhase(doc);
|
|
195
|
+
const valReport = checkValidationReadiness(doc);
|
|
196
|
+
logger.info("tool:analyze:validate_ready:ok", { ready: valReport.ready, grade: valReport.grade });
|
|
197
|
+
const valResponse = { ok: true, mode, ...valReport };
|
|
198
|
+
if (phase !== "VALIDATE" && phase !== "IMPLEMENT")
|
|
199
|
+
valResponse._info = `Modo validate_ready é específico das fases IMPLEMENT/VALIDATE (fase atual: ${phase})`;
|
|
200
|
+
return jsonResponse(valResponse);
|
|
201
|
+
}
|
|
202
|
+
case "done_integrity": {
|
|
203
|
+
const doneReport = checkDoneIntegrity(doc);
|
|
204
|
+
logger.info("tool:analyze:done_integrity:ok", { passed: doneReport.passed, issues: doneReport.issues.length });
|
|
205
|
+
return jsonResponse({ ok: true, mode, ...doneReport });
|
|
206
|
+
}
|
|
207
|
+
case "status_flow": {
|
|
208
|
+
const flowReport = checkStatusFlow(doc);
|
|
209
|
+
logger.info("tool:analyze:status_flow:ok", { complianceRate: flowReport.complianceRate });
|
|
210
|
+
return jsonResponse({ ok: true, mode, ...flowReport });
|
|
211
|
+
}
|
|
212
|
+
case "review_ready": {
|
|
213
|
+
const phase = detectCurrentPhase(doc);
|
|
214
|
+
const revReport = checkReviewReadiness(doc);
|
|
215
|
+
logger.info("tool:analyze:review_ready:ok", { ready: revReport.ready, grade: revReport.grade });
|
|
216
|
+
const revResponse = { ok: true, mode, ...revReport };
|
|
217
|
+
if (phase !== "REVIEW" && phase !== "VALIDATE")
|
|
218
|
+
revResponse._info = `Modo review_ready é específico das fases VALIDATE/REVIEW (fase atual: ${phase})`;
|
|
219
|
+
return jsonResponse(revResponse);
|
|
220
|
+
}
|
|
221
|
+
case "handoff_ready": {
|
|
222
|
+
const phase = detectCurrentPhase(doc);
|
|
223
|
+
const ks = new KnowledgeStore(store.getDb());
|
|
224
|
+
const knowledgeCount = ks.count();
|
|
225
|
+
const hoReport = checkHandoffReadiness(doc, { knowledgeCount });
|
|
226
|
+
logger.info("tool:analyze:handoff_ready:ok", { ready: hoReport.ready, grade: hoReport.grade });
|
|
227
|
+
const hoResponse = { ok: true, mode, ...hoReport };
|
|
228
|
+
if (phase !== "HANDOFF" && phase !== "REVIEW")
|
|
229
|
+
hoResponse._info = `Modo handoff_ready é específico das fases REVIEW/HANDOFF (fase atual: ${phase})`;
|
|
230
|
+
return jsonResponse(hoResponse);
|
|
231
|
+
}
|
|
232
|
+
case "doc_completeness": {
|
|
233
|
+
const docReport = checkDocCompleteness(doc);
|
|
234
|
+
logger.info("tool:analyze:doc_completeness:ok", { coverageRate: docReport.coverageRate });
|
|
235
|
+
return jsonResponse({ ok: true, mode, ...docReport });
|
|
236
|
+
}
|
|
237
|
+
case "listening_ready": {
|
|
238
|
+
const phase = detectCurrentPhase(doc);
|
|
239
|
+
const snapshots = store.listSnapshots();
|
|
240
|
+
const hasSnapshots = snapshots.length > 0;
|
|
241
|
+
const ksL = new KnowledgeStore(store.getDb());
|
|
242
|
+
const knowledgeCountL = ksL.count();
|
|
243
|
+
const lisReport = checkListeningReadiness(doc, { hasSnapshots, knowledgeCount: knowledgeCountL });
|
|
244
|
+
logger.info("tool:analyze:listening_ready:ok", { ready: lisReport.ready, grade: lisReport.grade });
|
|
245
|
+
const lisResponse = { ok: true, mode, ...lisReport };
|
|
246
|
+
if (phase !== "LISTENING" && phase !== "HANDOFF")
|
|
247
|
+
lisResponse._info = `Modo listening_ready é específico das fases HANDOFF/LISTENING (fase atual: ${phase})`;
|
|
248
|
+
return jsonResponse(lisResponse);
|
|
249
|
+
}
|
|
250
|
+
case "backlog_health": {
|
|
251
|
+
const healthReport = analyzeBacklogHealth(doc);
|
|
252
|
+
logger.info("tool:analyze:backlog_health:ok", { clean: healthReport.cleanForNewCycle, stale: healthReport.staleTasks.length });
|
|
253
|
+
return jsonResponse({ ok: true, mode, ...healthReport });
|
|
254
|
+
}
|
|
255
|
+
default: {
|
|
256
|
+
return errorResponse(`Unknown analyze mode: ${mode}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
function jsonResponse(data) {
|
|
262
|
+
return {
|
|
263
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function errorResponse(message) {
|
|
267
|
+
return {
|
|
268
|
+
content: [{ type: "text", text: JSON.stringify({ error: message }) }],
|
|
269
|
+
isError: true,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=analyze.js.map
|