@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.
Files changed (255) hide show
  1. package/dist/api/router.d.ts +1 -0
  2. package/dist/api/router.d.ts.map +1 -1
  3. package/dist/api/router.js +3 -2
  4. package/dist/api/router.js.map +1 -1
  5. package/dist/api/routes/folder.d.ts +4 -1
  6. package/dist/api/routes/folder.d.ts.map +1 -1
  7. package/dist/api/routes/folder.js +20 -1
  8. package/dist/api/routes/folder.js.map +1 -1
  9. package/dist/api/routes/gitnexus.d.ts.map +1 -1
  10. package/dist/api/routes/gitnexus.js +3 -1
  11. package/dist/api/routes/gitnexus.js.map +1 -1
  12. package/dist/core/analyzer/ac-parser.d.ts +7 -0
  13. package/dist/core/analyzer/ac-parser.d.ts.map +1 -0
  14. package/dist/core/analyzer/ac-parser.js +67 -0
  15. package/dist/core/analyzer/ac-parser.js.map +1 -0
  16. package/dist/core/analyzer/ac-validator.d.ts +15 -0
  17. package/dist/core/analyzer/ac-validator.d.ts.map +1 -0
  18. package/dist/core/analyzer/ac-validator.js +142 -0
  19. package/dist/core/analyzer/ac-validator.js.map +1 -0
  20. package/dist/core/analyzer/definition-of-ready.d.ts +16 -0
  21. package/dist/core/analyzer/definition-of-ready.d.ts.map +1 -0
  22. package/dist/core/analyzer/definition-of-ready.js +107 -0
  23. package/dist/core/analyzer/definition-of-ready.js.map +1 -0
  24. package/dist/core/analyzer/prd-quality.d.ts +14 -0
  25. package/dist/core/analyzer/prd-quality.d.ts.map +1 -0
  26. package/dist/core/analyzer/prd-quality.js +156 -0
  27. package/dist/core/analyzer/prd-quality.js.map +1 -0
  28. package/dist/core/analyzer/risk-assessment.d.ts +11 -0
  29. package/dist/core/analyzer/risk-assessment.d.ts.map +1 -0
  30. package/dist/core/analyzer/risk-assessment.js +97 -0
  31. package/dist/core/analyzer/risk-assessment.js.map +1 -0
  32. package/dist/core/analyzer/scope-analyzer.d.ts +7 -0
  33. package/dist/core/analyzer/scope-analyzer.d.ts.map +1 -0
  34. package/dist/core/analyzer/scope-analyzer.js +99 -0
  35. package/dist/core/analyzer/scope-analyzer.js.map +1 -0
  36. package/dist/core/config/ai-memory-generator.d.ts.map +1 -1
  37. package/dist/core/config/ai-memory-generator.js +8 -11
  38. package/dist/core/config/ai-memory-generator.js.map +1 -1
  39. package/dist/core/context/context-assembler.d.ts +3 -0
  40. package/dist/core/context/context-assembler.d.ts.map +1 -1
  41. package/dist/core/context/context-assembler.js +5 -2
  42. package/dist/core/context/context-assembler.js.map +1 -1
  43. package/dist/core/context/rag-context.d.ts +4 -2
  44. package/dist/core/context/rag-context.d.ts.map +1 -1
  45. package/dist/core/context/rag-context.js +8 -5
  46. package/dist/core/context/rag-context.js.map +1 -1
  47. package/dist/core/designer/adr-validator.d.ts +8 -0
  48. package/dist/core/designer/adr-validator.d.ts.map +1 -0
  49. package/dist/core/designer/adr-validator.js +61 -0
  50. package/dist/core/designer/adr-validator.js.map +1 -0
  51. package/dist/core/designer/coupling-analyzer.d.ts +7 -0
  52. package/dist/core/designer/coupling-analyzer.d.ts.map +1 -0
  53. package/dist/core/designer/coupling-analyzer.js +59 -0
  54. package/dist/core/designer/coupling-analyzer.js.map +1 -0
  55. package/dist/core/designer/definition-of-ready.d.ts +8 -0
  56. package/dist/core/designer/definition-of-ready.d.ts.map +1 -0
  57. package/dist/core/designer/definition-of-ready.js +146 -0
  58. package/dist/core/designer/definition-of-ready.js.map +1 -0
  59. package/dist/core/designer/interface-checker.d.ts +7 -0
  60. package/dist/core/designer/interface-checker.d.ts.map +1 -0
  61. package/dist/core/designer/interface-checker.js +53 -0
  62. package/dist/core/designer/interface-checker.js.map +1 -0
  63. package/dist/core/designer/tech-risk-assessor.d.ts +7 -0
  64. package/dist/core/designer/tech-risk-assessor.d.ts.map +1 -0
  65. package/dist/core/designer/tech-risk-assessor.js +95 -0
  66. package/dist/core/designer/tech-risk-assessor.js.map +1 -0
  67. package/dist/core/designer/traceability-matrix.d.ts +8 -0
  68. package/dist/core/designer/traceability-matrix.d.ts.map +1 -0
  69. package/dist/core/designer/traceability-matrix.js +67 -0
  70. package/dist/core/designer/traceability-matrix.js.map +1 -0
  71. package/dist/core/events/event-types.d.ts +11 -1
  72. package/dist/core/events/event-types.d.ts.map +1 -1
  73. package/dist/core/handoff/delivery-checklist.d.ts +10 -0
  74. package/dist/core/handoff/delivery-checklist.d.ts.map +1 -0
  75. package/dist/core/handoff/delivery-checklist.js +148 -0
  76. package/dist/core/handoff/delivery-checklist.js.map +1 -0
  77. package/dist/core/handoff/doc-completeness.d.ts +7 -0
  78. package/dist/core/handoff/doc-completeness.d.ts.map +1 -0
  79. package/dist/core/handoff/doc-completeness.js +19 -0
  80. package/dist/core/handoff/doc-completeness.js.map +1 -0
  81. package/dist/core/implementer/definition-of-done.d.ts +11 -0
  82. package/dist/core/implementer/definition-of-done.d.ts.map +1 -0
  83. package/dist/core/implementer/definition-of-done.js +158 -0
  84. package/dist/core/implementer/definition-of-done.js.map +1 -0
  85. package/dist/core/implementer/sprint-progress.d.ts +11 -0
  86. package/dist/core/implementer/sprint-progress.d.ts.map +1 -0
  87. package/dist/core/implementer/sprint-progress.js +80 -0
  88. package/dist/core/implementer/sprint-progress.js.map +1 -0
  89. package/dist/core/implementer/tdd-checker.d.ts +15 -0
  90. package/dist/core/implementer/tdd-checker.d.ts.map +1 -0
  91. package/dist/core/implementer/tdd-checker.js +132 -0
  92. package/dist/core/implementer/tdd-checker.js.map +1 -0
  93. package/dist/core/integrations/gitnexus-launcher.d.ts +5 -0
  94. package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -1
  95. package/dist/core/integrations/gitnexus-launcher.js +30 -3
  96. package/dist/core/integrations/gitnexus-launcher.js.map +1 -1
  97. package/dist/core/listener/backlog-health.d.ts +7 -0
  98. package/dist/core/listener/backlog-health.d.ts.map +1 -0
  99. package/dist/core/listener/backlog-health.js +64 -0
  100. package/dist/core/listener/backlog-health.js.map +1 -0
  101. package/dist/core/listener/feedback-readiness.d.ts +11 -0
  102. package/dist/core/listener/feedback-readiness.d.ts.map +1 -0
  103. package/dist/core/listener/feedback-readiness.js +124 -0
  104. package/dist/core/listener/feedback-readiness.js.map +1 -0
  105. package/dist/core/planner/lifecycle-phase.d.ts +26 -3
  106. package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
  107. package/dist/core/planner/lifecycle-phase.js +209 -17
  108. package/dist/core/planner/lifecycle-phase.js.map +1 -1
  109. package/dist/core/rag/phase-metadata.d.ts +23 -0
  110. package/dist/core/rag/phase-metadata.d.ts.map +1 -0
  111. package/dist/core/rag/phase-metadata.js +72 -0
  112. package/dist/core/rag/phase-metadata.js.map +1 -0
  113. package/dist/core/rag/phase-summary.d.ts +17 -0
  114. package/dist/core/rag/phase-summary.d.ts.map +1 -0
  115. package/dist/core/rag/phase-summary.js +104 -0
  116. package/dist/core/rag/phase-summary.js.map +1 -0
  117. package/dist/core/rag/prd-indexer.d.ts +16 -0
  118. package/dist/core/rag/prd-indexer.d.ts.map +1 -0
  119. package/dist/core/rag/prd-indexer.js +37 -0
  120. package/dist/core/rag/prd-indexer.js.map +1 -0
  121. package/dist/core/reviewer/review-readiness.d.ts +8 -0
  122. package/dist/core/reviewer/review-readiness.d.ts.map +1 -0
  123. package/dist/core/reviewer/review-readiness.js +159 -0
  124. package/dist/core/reviewer/review-readiness.js.map +1 -0
  125. package/dist/core/store/knowledge-store.d.ts +9 -0
  126. package/dist/core/store/knowledge-store.d.ts.map +1 -1
  127. package/dist/core/store/knowledge-store.js +22 -0
  128. package/dist/core/store/knowledge-store.js.map +1 -1
  129. package/dist/core/utils/errors.d.ts +7 -0
  130. package/dist/core/utils/errors.d.ts.map +1 -1
  131. package/dist/core/utils/errors.js +14 -0
  132. package/dist/core/utils/errors.js.map +1 -1
  133. package/dist/core/validator/definition-of-ready.d.ts +8 -0
  134. package/dist/core/validator/definition-of-ready.d.ts.map +1 -0
  135. package/dist/core/validator/definition-of-ready.js +155 -0
  136. package/dist/core/validator/definition-of-ready.js.map +1 -0
  137. package/dist/core/validator/done-integrity-checker.d.ts +7 -0
  138. package/dist/core/validator/done-integrity-checker.d.ts.map +1 -0
  139. package/dist/core/validator/done-integrity-checker.js +38 -0
  140. package/dist/core/validator/done-integrity-checker.js.map +1 -0
  141. package/dist/core/validator/status-flow-checker.d.ts +7 -0
  142. package/dist/core/validator/status-flow-checker.d.ts.map +1 -0
  143. package/dist/core/validator/status-flow-checker.js +26 -0
  144. package/dist/core/validator/status-flow-checker.js.map +1 -0
  145. package/dist/mcp/app-factory.d.ts +1 -0
  146. package/dist/mcp/app-factory.d.ts.map +1 -1
  147. package/dist/mcp/app-factory.js +2 -2
  148. package/dist/mcp/app-factory.js.map +1 -1
  149. package/dist/mcp/lifecycle-wrapper.d.ts +14 -4
  150. package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
  151. package/dist/mcp/lifecycle-wrapper.js +104 -5
  152. package/dist/mcp/lifecycle-wrapper.js.map +1 -1
  153. package/dist/mcp/server.js +3 -2
  154. package/dist/mcp/server.js.map +1 -1
  155. package/dist/mcp/tools/{stats.d.ts → analyze.d.ts} +2 -2
  156. package/dist/mcp/tools/analyze.d.ts.map +1 -0
  157. package/dist/mcp/tools/analyze.js +272 -0
  158. package/dist/mcp/tools/analyze.js.map +1 -0
  159. package/dist/mcp/tools/import-prd.d.ts.map +1 -1
  160. package/dist/mcp/tools/import-prd.js +15 -1
  161. package/dist/mcp/tools/import-prd.js.map +1 -1
  162. package/dist/mcp/tools/index.d.ts.map +1 -1
  163. package/dist/mcp/tools/index.js +6 -10
  164. package/dist/mcp/tools/index.js.map +1 -1
  165. package/dist/mcp/tools/{velocity.d.ts → metrics.d.ts} +2 -2
  166. package/dist/mcp/tools/metrics.d.ts.map +1 -0
  167. package/dist/mcp/tools/metrics.js +69 -0
  168. package/dist/mcp/tools/metrics.js.map +1 -0
  169. package/dist/mcp/tools/next.d.ts.map +1 -1
  170. package/dist/mcp/tools/next.js +19 -5
  171. package/dist/mcp/tools/next.js.map +1 -1
  172. package/dist/mcp/tools/plan-sprint.d.ts.map +1 -1
  173. package/dist/mcp/tools/plan-sprint.js +20 -0
  174. package/dist/mcp/tools/plan-sprint.js.map +1 -1
  175. package/dist/mcp/tools/rag-context.d.ts.map +1 -1
  176. package/dist/mcp/tools/rag-context.js +20 -5
  177. package/dist/mcp/tools/rag-context.js.map +1 -1
  178. package/dist/mcp/tools/set-phase.d.ts.map +1 -1
  179. package/dist/mcp/tools/set-phase.js +64 -6
  180. package/dist/mcp/tools/set-phase.js.map +1 -1
  181. package/dist/mcp/tools/update-status.d.ts.map +1 -1
  182. package/dist/mcp/tools/update-status.js +21 -6
  183. package/dist/mcp/tools/update-status.js.map +1 -1
  184. package/dist/mcp/tools/{decompose.d.ts → validate-ac.d.ts} +2 -2
  185. package/dist/mcp/tools/validate-ac.d.ts.map +1 -0
  186. package/dist/mcp/tools/validate-ac.js +23 -0
  187. package/dist/mcp/tools/validate-ac.js.map +1 -0
  188. package/dist/schemas/ac-quality-schema.d.ts +90 -0
  189. package/dist/schemas/ac-quality-schema.d.ts.map +1 -0
  190. package/dist/schemas/ac-quality-schema.js +34 -0
  191. package/dist/schemas/ac-quality-schema.js.map +1 -0
  192. package/dist/schemas/analyzer-schema.d.ts +160 -0
  193. package/dist/schemas/analyzer-schema.d.ts.map +1 -0
  194. package/dist/schemas/analyzer-schema.js +74 -0
  195. package/dist/schemas/analyzer-schema.js.map +1 -0
  196. package/dist/schemas/designer-schema.d.ts +259 -0
  197. package/dist/schemas/designer-schema.d.ts.map +1 -0
  198. package/dist/schemas/designer-schema.js +102 -0
  199. package/dist/schemas/designer-schema.js.map +1 -0
  200. package/dist/schemas/handoff-schema.d.ts +49 -0
  201. package/dist/schemas/handoff-schema.d.ts.map +1 -0
  202. package/dist/schemas/handoff-schema.js +28 -0
  203. package/dist/schemas/handoff-schema.js.map +1 -0
  204. package/dist/schemas/implementer-schema.d.ts +187 -0
  205. package/dist/schemas/implementer-schema.d.ts.map +1 -0
  206. package/dist/schemas/implementer-schema.js +80 -0
  207. package/dist/schemas/implementer-schema.js.map +1 -0
  208. package/dist/schemas/knowledge.schema.d.ts +8 -0
  209. package/dist/schemas/knowledge.schema.d.ts.map +1 -1
  210. package/dist/schemas/knowledge.schema.js +1 -1
  211. package/dist/schemas/knowledge.schema.js.map +1 -1
  212. package/dist/schemas/listener-schema.d.ts +62 -0
  213. package/dist/schemas/listener-schema.d.ts.map +1 -0
  214. package/dist/schemas/listener-schema.js +35 -0
  215. package/dist/schemas/listener-schema.js.map +1 -0
  216. package/dist/schemas/reviewer-schema.d.ts +34 -0
  217. package/dist/schemas/reviewer-schema.d.ts.map +1 -0
  218. package/dist/schemas/reviewer-schema.js +17 -0
  219. package/dist/schemas/reviewer-schema.js.map +1 -0
  220. package/dist/schemas/validator-schema.d.ts +79 -0
  221. package/dist/schemas/validator-schema.d.ts.map +1 -0
  222. package/dist/schemas/validator-schema.js +43 -0
  223. package/dist/schemas/validator-schema.js.map +1 -0
  224. package/dist/web/dashboard/dist/assets/{benchmark-tab-CuZsNkbP.js → benchmark-tab-DE6hAHVG.js} +1 -1
  225. package/dist/web/dashboard/dist/assets/gitnexus-tab-DsBjJHx8.js +312 -0
  226. package/dist/web/dashboard/dist/assets/graph-tab-C09DzeZ_.js +1 -0
  227. package/dist/web/dashboard/dist/assets/{graph-utils-D5iPoiPD.js → graph-utils-D4LFspTf.js} +5 -5
  228. package/dist/web/dashboard/dist/assets/{index-CN9Wi5mu.js → index-B2fTJ4AS.js} +2 -2
  229. package/dist/web/dashboard/dist/assets/index-CkqEqKiH.css +1 -0
  230. package/dist/web/dashboard/dist/assets/{insights-tab-CLA0OIxd.js → insights-tab-Bm7CDckb.js} +1 -1
  231. package/dist/web/dashboard/dist/assets/{logs-tab-CSYlvuCu.js → logs-tab-Cxpcv_ni.js} +1 -1
  232. package/dist/web/dashboard/dist/assets/{prd-backlog-tab-BBLpErTk.js → prd-backlog-tab-X84Rj-IB.js} +1 -1
  233. package/dist/web/dashboard/dist/assets/{serena-tab-BxYP8nU5.js → serena-tab-BunULNvw.js} +1 -1
  234. package/dist/web/dashboard/dist/index.html +2 -2
  235. package/package.json +1 -1
  236. package/dist/mcp/tools/bulk-update-status.d.ts +0 -4
  237. package/dist/mcp/tools/bulk-update-status.d.ts.map +0 -1
  238. package/dist/mcp/tools/bulk-update-status.js +0 -22
  239. package/dist/mcp/tools/bulk-update-status.js.map +0 -1
  240. package/dist/mcp/tools/decompose.d.ts.map +0 -1
  241. package/dist/mcp/tools/decompose.js +0 -25
  242. package/dist/mcp/tools/decompose.js.map +0 -1
  243. package/dist/mcp/tools/dependencies.d.ts +0 -4
  244. package/dist/mcp/tools/dependencies.d.ts.map +0 -1
  245. package/dist/mcp/tools/dependencies.js +0 -47
  246. package/dist/mcp/tools/dependencies.js.map +0 -1
  247. package/dist/mcp/tools/stats.d.ts.map +0 -1
  248. package/dist/mcp/tools/stats.js +0 -46
  249. package/dist/mcp/tools/stats.js.map +0 -1
  250. package/dist/mcp/tools/velocity.d.ts.map +0 -1
  251. package/dist/mcp/tools/velocity.js +0 -25
  252. package/dist/mcp/tools/velocity.js.map +0 -1
  253. package/dist/web/dashboard/dist/assets/gitnexus-tab-D7If6lxT.js +0 -312
  254. package/dist/web/dashboard/dist/assets/graph-tab-Dp7PfUEJ.js +0 -1
  255. package/dist/web/dashboard/dist/assets/index-BUl7yWBP.css +0 -1
@@ -0,0 +1,37 @@
1
+ /**
2
+ * PRD Indexer — indexes PRD text content into the knowledge store
3
+ * so that original requirements can be queried in later lifecycle phases.
4
+ */
5
+ import { chunkText } from "./chunk-text.js";
6
+ import { logger } from "../utils/logger.js";
7
+ /**
8
+ * Index PRD text content into the knowledge store.
9
+ * Chunks the content and stores with source_type='prd'.
10
+ */
11
+ export function indexPrdContent(knowledgeStore, content, sourceFile, phase) {
12
+ const chunks = chunkText(content);
13
+ if (chunks.length === 0) {
14
+ logger.info("No content to index from PRD", { sourceFile });
15
+ return { documentsIndexed: 0, sourceFile };
16
+ }
17
+ const sourceId = `prd:${sourceFile}`;
18
+ // Remove previous version to re-index fresh content
19
+ knowledgeStore.deleteBySource("prd", sourceId);
20
+ const docs = knowledgeStore.insertChunks(chunks.map((chunk) => ({
21
+ sourceType: "prd",
22
+ sourceId,
23
+ title: chunks.length > 1
24
+ ? `PRD: ${sourceFile} [${chunk.index + 1}/${chunks.length}]`
25
+ : `PRD: ${sourceFile}`,
26
+ content: chunk.content,
27
+ chunkIndex: chunk.index,
28
+ metadata: {
29
+ sourceFile,
30
+ phase: phase ?? "ANALYZE",
31
+ indexedAt: new Date().toISOString(),
32
+ },
33
+ })));
34
+ logger.info("PRD content indexed", { sourceFile, chunks: docs.length });
35
+ return { documentsIndexed: docs.length, sourceFile };
36
+ }
37
+ //# sourceMappingURL=prd-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-indexer.js","sourceRoot":"","sources":["../../../src/core/rag/prd-indexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQ5C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,cAA8B,EAC9B,OAAe,EACf,UAAkB,EAClB,KAAsB;IAEtB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,UAAU,EAAE,CAAC;IAErC,oDAAoD;IACpD,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAG,cAAc,CAAC,YAAY,CACtC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrB,UAAU,EAAE,KAAc;QAC1B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;YACtB,CAAC,CAAC,QAAQ,UAAU,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG;YAC5D,CAAC,CAAC,QAAQ,UAAU,EAAE;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,KAAK;QACvB,QAAQ,EAAE;YACR,UAAU;YACV,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;KACF,CAAC,CAAC,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAExE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Review Readiness — composite gate for VALIDATE→REVIEW transition.
3
+ * 100% reuse of existing analyzers, no new helper modules.
4
+ */
5
+ import type { GraphDocument } from "../graph/graph-types.js";
6
+ import type { ReviewReadinessReport } from "../../schemas/reviewer-schema.js";
7
+ export declare function checkReviewReadiness(doc: GraphDocument): ReviewReadinessReport;
8
+ //# sourceMappingURL=review-readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-readiness.d.ts","sourceRoot":"","sources":["../../../src/core/reviewer/review-readiness.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAwB,MAAM,kCAAkC,CAAC;AAoBpG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,qBAAqB,CA6J9E"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Review Readiness — composite gate for VALIDATE→REVIEW transition.
3
+ * 100% reuse of existing analyzers, no new helper modules.
4
+ */
5
+ import { analyzeScope } from "../analyzer/scope-analyzer.js";
6
+ import { assessRisks } from "../analyzer/risk-assessment.js";
7
+ import { detectBottlenecks } from "../insights/bottleneck-detector.js";
8
+ import { validateAcQuality } from "../analyzer/ac-validator.js";
9
+ import { calculateVelocity } from "../planner/velocity.js";
10
+ import { detectCycles } from "../planner/dependency-chain.js";
11
+ import { logger } from "../utils/logger.js";
12
+ const TASK_TYPES = new Set(["task", "subtask"]);
13
+ function scoreToGrade(score) {
14
+ if (score >= 90)
15
+ return "A";
16
+ if (score >= 75)
17
+ return "B";
18
+ if (score >= 60)
19
+ return "C";
20
+ if (score >= 40)
21
+ return "D";
22
+ return "F";
23
+ }
24
+ export function checkReviewReadiness(doc) {
25
+ const checks = [];
26
+ const tasks = doc.nodes.filter((n) => TASK_TYPES.has(n.type));
27
+ const doneTasks = tasks.filter((n) => n.status === "done");
28
+ const completionRate = tasks.length > 0 ? (doneTasks.length / tasks.length) * 100 : 0;
29
+ // Reuse results from expensive calls
30
+ const bottlenecks = detectBottlenecks(doc);
31
+ const scopeAnalysis = analyzeScope(doc);
32
+ // ── Required checks ──
33
+ // 1. completion_rate — ≥80% tasks done
34
+ const enough = completionRate >= 80;
35
+ checks.push({
36
+ name: "completion_rate",
37
+ passed: enough,
38
+ details: enough
39
+ ? `${Math.round(completionRate)}% tasks done (meta: 80%)`
40
+ : `Apenas ${Math.round(completionRate)}% tasks done (meta: 80%)`,
41
+ severity: "required",
42
+ });
43
+ // 2. no_blocked_tasks — zero blocked tasks
44
+ const blockedCount = bottlenecks.blockedTasks.length;
45
+ const noBlocked = blockedCount === 0;
46
+ checks.push({
47
+ name: "no_blocked_tasks",
48
+ passed: noBlocked,
49
+ details: noBlocked
50
+ ? "Nenhuma task bloqueada"
51
+ : `${blockedCount} task(s) bloqueada(s)`,
52
+ severity: "required",
53
+ });
54
+ // 3. ac_coverage — ≥70% done tasks with AC
55
+ const doneWithAC = doneTasks.filter((t) => (t.acceptanceCriteria && t.acceptanceCriteria.length > 0));
56
+ const acCoverage = doneTasks.length > 0 ? Math.round((doneWithAC.length / doneTasks.length) * 100) : 100;
57
+ const acCoveragePass = acCoverage >= 70;
58
+ checks.push({
59
+ name: "ac_coverage",
60
+ passed: acCoveragePass,
61
+ details: `${acCoverage}% done tasks com AC (meta: 70%)`,
62
+ severity: "required",
63
+ });
64
+ // 4. no_cycles — no dependency cycles
65
+ const cycles = detectCycles(doc);
66
+ const noCycles = cycles.length === 0;
67
+ checks.push({
68
+ name: "no_cycles",
69
+ passed: noCycles,
70
+ details: noCycles
71
+ ? "Nenhum ciclo de dependência detectado"
72
+ : `${cycles.length} ciclo(s) detectado(s)`,
73
+ severity: "required",
74
+ });
75
+ // 5. risks_addressed — zero critical/high unmitigated risks
76
+ const riskMatrix = assessRisks(doc);
77
+ const unmitigatedCritical = riskMatrix.risks.filter((r) => (r.level === "critical" || r.level === "high") && r.mitigationStatus === "unmitigated");
78
+ const risksPass = unmitigatedCritical.length === 0;
79
+ checks.push({
80
+ name: "risks_addressed",
81
+ passed: risksPass,
82
+ details: risksPass
83
+ ? "Todos riscos critical/high endereçados"
84
+ : `${unmitigatedCritical.length} risco(s) critical/high sem mitigação`,
85
+ severity: "required",
86
+ });
87
+ // ── Recommended checks ──
88
+ // 6. velocity_stable — coefficient of variation < 1.0 (≥2 sprints)
89
+ const velocity = calculateVelocity(doc);
90
+ let velocityPass = true;
91
+ let velocityDetails = "Dados insuficientes para avaliar estabilidade";
92
+ if (velocity.sprints.length >= 2) {
93
+ const points = velocity.sprints.map((s) => s.totalPoints);
94
+ const avg = points.reduce((a, b) => a + b, 0) / points.length;
95
+ const variance = points.reduce((sum, p) => sum + Math.pow(p - avg, 2), 0) / points.length;
96
+ const stdDev = Math.sqrt(variance);
97
+ const cv = avg > 0 ? stdDev / avg : 0;
98
+ velocityPass = cv < 1.0;
99
+ velocityDetails = `Coeficiente de variação: ${cv.toFixed(2)} (meta: < 1.0)`;
100
+ }
101
+ checks.push({
102
+ name: "velocity_stable",
103
+ passed: velocityPass,
104
+ details: velocityDetails,
105
+ severity: "recommended",
106
+ });
107
+ // 7. no_orphan_tasks — zero orphan tasks
108
+ const orphanTasks = scopeAnalysis.orphans.filter((o) => TASK_TYPES.has(o.type));
109
+ const noOrphans = orphanTasks.length === 0;
110
+ checks.push({
111
+ name: "no_orphan_tasks",
112
+ passed: noOrphans,
113
+ details: noOrphans
114
+ ? "Nenhuma task órfã"
115
+ : `${orphanTasks.length} task(s) órfã(s)`,
116
+ severity: "recommended",
117
+ });
118
+ // 8. no_oversized_tasks — no tasks >120min without subtasks
119
+ const noOversized = bottlenecks.oversizedTasks.length === 0;
120
+ checks.push({
121
+ name: "no_oversized_tasks",
122
+ passed: noOversized,
123
+ details: noOversized
124
+ ? "Nenhuma task oversized"
125
+ : `${bottlenecks.oversizedTasks.length} task(s) >120min sem decomposição`,
126
+ severity: "recommended",
127
+ });
128
+ // 9. scope_integrity — no scope conflicts
129
+ const noConflicts = scopeAnalysis.conflicts.length === 0;
130
+ checks.push({
131
+ name: "scope_integrity",
132
+ passed: noConflicts,
133
+ details: noConflicts
134
+ ? "Sem conflitos de escopo"
135
+ : `${scopeAnalysis.conflicts.length} conflito(s) de escopo`,
136
+ severity: "recommended",
137
+ });
138
+ // 10. ac_quality — AC quality score ≥ 60
139
+ const acReport = validateAcQuality(doc);
140
+ const acQualityPass = acReport.overallScore >= 60;
141
+ checks.push({
142
+ name: "ac_quality",
143
+ passed: acQualityPass,
144
+ details: `AC quality score: ${acReport.overallScore} (meta: 60)`,
145
+ severity: "recommended",
146
+ });
147
+ // ── Scoring ──
148
+ const totalChecks = checks.length;
149
+ const passedChecks = checks.filter((c) => c.passed).length;
150
+ const score = Math.round((passedChecks / totalChecks) * 100);
151
+ const grade = scoreToGrade(score);
152
+ const ready = checks.filter((c) => c.severity === "required").every((c) => c.passed);
153
+ const summary = ready
154
+ ? `Review Ready (${grade}): ${passedChecks}/${totalChecks} checks passed, score ${score}`
155
+ : `Review Not Ready: ${checks.filter((c) => c.severity === "required" && !c.passed).map((c) => c.name).join(", ")} failed`;
156
+ logger.info("review-readiness", { ready, score, grade, passed: passedChecks, total: totalChecks });
157
+ return { checks, ready, score, grade, summary };
158
+ }
159
+ //# sourceMappingURL=review-readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-readiness.js","sourceRoot":"","sources":["../../../src/core/reviewer/review-readiness.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import type Database from "better-sqlite3";
7
7
  import type { KnowledgeDocument, KnowledgeSourceType } from "../../schemas/knowledge.schema.js";
8
+ import type { LifecyclePhase } from "../planner/lifecycle-phase.js";
8
9
  export interface InsertKnowledgeDoc {
9
10
  sourceType: KnowledgeSourceType;
10
11
  sourceId: string;
@@ -48,6 +49,14 @@ export declare class KnowledgeStore {
48
49
  search(query: string, limit?: number): Array<KnowledgeDocument & {
49
50
  score: number;
50
51
  }>;
52
+ /**
53
+ * Search knowledge documents with phase-aware boosting.
54
+ * Documents tagged with phases relevant to the current phase are ranked higher.
55
+ */
56
+ searchWithPhaseBoost(query: string, currentPhase: LifecyclePhase, limit?: number): Array<KnowledgeDocument & {
57
+ score: number;
58
+ phaseBoost: number;
59
+ }>;
51
60
  /**
52
61
  * Delete a knowledge document by ID.
53
62
  */
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-store.d.ts","sourceRoot":"","sources":["../../../src/core/store/knowledge-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAKhG,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AA8BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,kBAAkB,GAAG,iBAAiB;IAqClD;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE;IAY7D;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,mBAAmB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB,EAAE;IAqB1G;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC,iBAAiB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBvF;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAO3B;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQzE;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,MAAM;IAc/C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOnC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE;CAMrD"}
1
+ {"version":3,"file":"knowledge-store.d.ts","sourceRoot":"","sources":["../../../src/core/store/knowledge-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAKhG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AA8BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,kBAAkB,GAAG,iBAAiB;IAqClD;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE;IAY7D;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,mBAAmB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB,EAAE;IAqB1G;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC,iBAAiB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBvF;;;OAGG;IACH,oBAAoB,CAClB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,cAAc,EAC5B,KAAK,GAAE,MAAW,GACjB,KAAK,CAAC,iBAAiB,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAqBnE;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAO3B;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQzE;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,MAAM;IAc/C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOnC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE;CAMrD"}
@@ -7,6 +7,7 @@ import { createHash } from "node:crypto";
7
7
  import { generateId } from "../utils/id.js";
8
8
  import { now } from "../utils/time.js";
9
9
  import { logger } from "../utils/logger.js";
10
+ import { getPhaseBoost, applyPhaseBoost } from "../rag/phase-metadata.js";
10
11
  function rowToDoc(row) {
11
12
  return {
12
13
  id: row.id,
@@ -110,6 +111,27 @@ export class KnowledgeStore {
110
111
  score: row.score,
111
112
  }));
112
113
  }
114
+ /**
115
+ * Search knowledge documents with phase-aware boosting.
116
+ * Documents tagged with phases relevant to the current phase are ranked higher.
117
+ */
118
+ searchWithPhaseBoost(query, currentPhase, limit = 20) {
119
+ // Fetch more results than needed to allow re-ranking
120
+ const rawResults = this.search(query, limit * 2);
121
+ const boosted = rawResults.map((result) => {
122
+ const docPhase = result.metadata?.phase;
123
+ const boost = getPhaseBoost(currentPhase, docPhase);
124
+ const boostedScore = applyPhaseBoost(result.score, boost);
125
+ return {
126
+ ...result,
127
+ score: boostedScore,
128
+ phaseBoost: boost,
129
+ };
130
+ });
131
+ // Re-sort by boosted score (BM25: closer to 0 = better)
132
+ boosted.sort((a, b) => b.score - a.score);
133
+ return boosted.slice(0, limit);
134
+ }
113
135
  /**
114
136
  * Delete a knowledge document by ID.
115
137
  */
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-store.js","sourceRoot":"","sources":["../../../src/core/store/knowledge-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-store.js","sourceRoot":"","sources":["../../../src/core/store/knowledge-store.ts"],"names":[],"mappings":"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"}
@@ -17,4 +17,11 @@ export declare class ValidationError extends McpGraphError {
17
17
  export declare class SnapshotNotFoundError extends McpGraphError {
18
18
  constructor(id: number);
19
19
  }
20
+ export declare class LifecycleGateError extends McpGraphError {
21
+ readonly toolName: string;
22
+ readonly currentPhase: string;
23
+ readonly reason: string;
24
+ readonly unmetConditions: string[];
25
+ constructor(toolName: string, currentPhase: string, reason: string, unmetConditions: string[]);
26
+ }
20
27
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,wBAAyB,SAAQ,aAAa;;CAK1D;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,eAAgB,SAAQ,aAAa;aACH,MAAM,EAAE,OAAO,EAAE;gBAAlD,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,OAAO,EAAE;CAI/D;AAED,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,EAAE,EAAE,MAAM;CAIvB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,wBAAyB,SAAQ,aAAa;;CAK1D;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,eAAgB,SAAQ,aAAa;aACH,MAAM,EAAE,OAAO,EAAE;gBAAlD,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,OAAO,EAAE;CAI/D;AAED,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,kBAAmB,SAAQ,aAAa;aAEjC,QAAQ,EAAE,MAAM;aAChB,YAAY,EAAE,MAAM;aACpB,MAAM,EAAE,MAAM;aACd,eAAe,EAAE,MAAM,EAAE;gBAHzB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE;CAK5C"}
@@ -36,4 +36,18 @@ export class SnapshotNotFoundError extends McpGraphError {
36
36
  this.name = "SnapshotNotFoundError";
37
37
  }
38
38
  }
39
+ export class LifecycleGateError extends McpGraphError {
40
+ toolName;
41
+ currentPhase;
42
+ reason;
43
+ unmetConditions;
44
+ constructor(toolName, currentPhase, reason, unmetConditions) {
45
+ super(`Lifecycle gate: "${toolName}" blocked in ${currentPhase} — ${reason}`);
46
+ this.toolName = toolName;
47
+ this.currentPhase = currentPhase;
48
+ this.reason = reason;
49
+ this.unmetConditions = unmetConditions;
50
+ this.name = "LifecycleGateError";
51
+ }
52
+ }
39
53
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,IAAY;QACtB,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IACzD;QACE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,EAAU;QACpB,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,aAAa;IACH;IAA7C,YAAY,OAAe,EAAkB,MAAiB;QAC5D,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAW;QAE5D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,EAAU;QACpB,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,IAAY;QACtB,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IACzD;QACE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,EAAU;QACpB,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,aAAa;IACH;IAA7C,YAAY,OAAe,EAAkB,MAAiB;QAC5D,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAW;QAE5D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,EAAU;QACpB,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAEjC;IACA;IACA;IACA;IAJlB,YACkB,QAAgB,EAChB,YAAoB,EACpB,MAAc,EACd,eAAyB;QAEzC,KAAK,CAAC,oBAAoB,QAAQ,gBAAgB,YAAY,MAAM,MAAM,EAAE,CAAC,CAAC;QAL9D,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,WAAM,GAAN,MAAM,CAAQ;QACd,oBAAe,GAAf,eAAe,CAAU;QAGzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Validation Definition of Ready — composite gate for IMPLEMENT→VALIDATE transition.
3
+ * Aggregates completion, AC quality, done integrity, and risk checks.
4
+ */
5
+ import type { GraphDocument } from "../graph/graph-types.js";
6
+ import type { ValidationReadinessReport } from "../../schemas/validator-schema.js";
7
+ export declare function checkValidationReadiness(doc: GraphDocument): ValidationReadinessReport;
8
+ //# sourceMappingURL=definition-of-ready.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition-of-ready.d.ts","sourceRoot":"","sources":["../../../src/core/validator/definition-of-ready.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,yBAAyB,EAA4B,MAAM,mCAAmC,CAAC;AAqB7G,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,aAAa,GAAG,yBAAyB,CAgKtF"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Validation Definition of Ready — composite gate for IMPLEMENT→VALIDATE transition.
3
+ * Aggregates completion, AC quality, done integrity, and risk checks.
4
+ */
5
+ import { validateAcQuality } from "../analyzer/ac-validator.js";
6
+ import { assessRisks } from "../analyzer/risk-assessment.js";
7
+ import { detectBottlenecks } from "../insights/bottleneck-detector.js";
8
+ import { calculateMetrics } from "../insights/metrics-calculator.js";
9
+ import { detectCycles } from "../planner/dependency-chain.js";
10
+ import { checkDoneIntegrity } from "./done-integrity-checker.js";
11
+ import { checkStatusFlow } from "./status-flow-checker.js";
12
+ import { logger } from "../utils/logger.js";
13
+ const TASK_TYPES = new Set(["task", "subtask"]);
14
+ function scoreToGrade(score) {
15
+ if (score >= 90)
16
+ return "A";
17
+ if (score >= 75)
18
+ return "B";
19
+ if (score >= 60)
20
+ return "C";
21
+ if (score >= 40)
22
+ return "D";
23
+ return "F";
24
+ }
25
+ export function checkValidationReadiness(doc) {
26
+ const checks = [];
27
+ const tasks = doc.nodes.filter((n) => TASK_TYPES.has(n.type));
28
+ const doneTasks = tasks.filter((n) => n.status === "done");
29
+ const completionRate = tasks.length > 0 ? (doneTasks.length / tasks.length) * 100 : 0;
30
+ // ── Required checks ──
31
+ // 1. completion_threshold — ≥50% tasks done
32
+ const halfDone = completionRate >= 50;
33
+ checks.push({
34
+ name: "completion_threshold",
35
+ passed: halfDone,
36
+ details: halfDone
37
+ ? `${Math.round(completionRate)}% tasks done (meta: 50%)`
38
+ : `Apenas ${Math.round(completionRate)}% tasks done (meta: 50%)`,
39
+ severity: "required",
40
+ });
41
+ // 2. ac_defined — done tasks have AC
42
+ const hasAC = doc.nodes.some((n) => n.type === "acceptance_criteria" || (n.acceptanceCriteria && n.acceptanceCriteria.length > 0));
43
+ checks.push({
44
+ name: "ac_defined",
45
+ passed: hasAC,
46
+ details: hasAC
47
+ ? "Acceptance criteria definidos"
48
+ : "Nenhum acceptance criteria encontrado",
49
+ severity: "required",
50
+ });
51
+ // 3. ac_quality — AC quality score ≥ 60
52
+ const acReport = validateAcQuality(doc);
53
+ const acQualityPass = acReport.overallScore >= 60;
54
+ checks.push({
55
+ name: "ac_quality",
56
+ passed: acQualityPass,
57
+ details: `AC quality score: ${acReport.overallScore} (meta: 60)`,
58
+ severity: "required",
59
+ });
60
+ // 4. done_integrity — no done tasks with integrity issues
61
+ const integrityReport = checkDoneIntegrity(doc);
62
+ checks.push({
63
+ name: "done_integrity",
64
+ passed: integrityReport.passed,
65
+ details: integrityReport.passed
66
+ ? "Todas tasks done com integridade verificada"
67
+ : `${integrityReport.issues.length} problema(s) de integridade em tasks done`,
68
+ severity: "required",
69
+ });
70
+ // 5. no_cycles — no dependency cycles
71
+ const cycles = detectCycles(doc);
72
+ const noCycles = cycles.length === 0;
73
+ checks.push({
74
+ name: "no_cycles",
75
+ passed: noCycles,
76
+ details: noCycles
77
+ ? "Nenhum ciclo de dependência detectado"
78
+ : `${cycles.length} ciclo(s) detectado(s)`,
79
+ severity: "required",
80
+ });
81
+ // ── Recommended checks ──
82
+ // 6. ac_coverage_global — ≥80% of ALL tasks have AC
83
+ const tasksWithAC = tasks.filter((t) => (t.acceptanceCriteria && t.acceptanceCriteria.length > 0) ||
84
+ doc.nodes.some((n) => n.type === "acceptance_criteria" && doc.edges.some((e) => (e.from === n.id && e.to === t.id) || (e.from === t.id && e.to === n.id))));
85
+ const acCoverageRate = tasks.length > 0 ? Math.round((tasksWithAC.length / tasks.length) * 100) : 100;
86
+ const acCoveragePass = acCoverageRate >= 80;
87
+ checks.push({
88
+ name: "ac_coverage_global",
89
+ passed: acCoveragePass,
90
+ details: `${acCoverageRate}% tasks com AC (meta: 80%)`,
91
+ severity: "recommended",
92
+ });
93
+ // 7. no_oversized_remaining — no incomplete tasks >120min without subtasks
94
+ const bottlenecks = detectBottlenecks(doc);
95
+ const oversizedRemaining = bottlenecks.oversizedTasks.filter((ot) => {
96
+ const node = doc.nodes.find((n) => n.id === ot.id);
97
+ return node && node.status !== "done";
98
+ });
99
+ const noOversized = oversizedRemaining.length === 0;
100
+ checks.push({
101
+ name: "no_oversized_remaining",
102
+ passed: noOversized,
103
+ details: noOversized
104
+ ? "Nenhuma task incompleta oversized"
105
+ : `${oversizedRemaining.length} task(s) incompleta(s) >120min sem decomposição`,
106
+ severity: "recommended",
107
+ });
108
+ // 8. risks_mitigated — high/critical risks with mitigation
109
+ const riskMatrix = assessRisks(doc);
110
+ const unmitigatedHighRisks = riskMatrix.risks.filter((r) => (r.level === "high" || r.level === "critical") && r.mitigationStatus === "unmitigated");
111
+ const risksPass = unmitigatedHighRisks.length === 0;
112
+ checks.push({
113
+ name: "risks_mitigated",
114
+ passed: risksPass,
115
+ details: risksPass
116
+ ? "Todos riscos high/critical com mitigação"
117
+ : `${unmitigatedHighRisks.length} risco(s) high/critical sem mitigação`,
118
+ severity: "recommended",
119
+ });
120
+ // 9. status_flow_compliance — done tasks went through in_progress
121
+ const flowReport = checkStatusFlow(doc);
122
+ const flowPass = flowReport.complianceRate >= 80;
123
+ checks.push({
124
+ name: "status_flow_compliance",
125
+ passed: flowPass,
126
+ details: `Taxa de compliance do fluxo de status: ${flowReport.complianceRate}% (meta: 80%)`,
127
+ severity: "recommended",
128
+ });
129
+ // 10. sprint_progress — current sprint ≥ 70% completion
130
+ const metrics = calculateMetrics(doc);
131
+ const currentSprint = metrics.sprintProgress.length > 0
132
+ ? metrics.sprintProgress[metrics.sprintProgress.length - 1]
133
+ : null;
134
+ const sprintPass = currentSprint ? currentSprint.percentage >= 70 : true;
135
+ checks.push({
136
+ name: "sprint_progress",
137
+ passed: sprintPass,
138
+ details: currentSprint
139
+ ? `Sprint "${currentSprint.sprint}": ${currentSprint.percentage}% (meta: 70%)`
140
+ : "Nenhum sprint ativo",
141
+ severity: "recommended",
142
+ });
143
+ // ── Scoring ──
144
+ const totalChecks = checks.length;
145
+ const passedChecks = checks.filter((c) => c.passed).length;
146
+ const score = Math.round((passedChecks / totalChecks) * 100);
147
+ const grade = scoreToGrade(score);
148
+ const ready = checks.filter((c) => c.severity === "required").every((c) => c.passed);
149
+ const summary = ready
150
+ ? `Validation Ready (${grade}): ${passedChecks}/${totalChecks} checks passed, score ${score}`
151
+ : `Validation Not Ready: ${checks.filter((c) => c.severity === "required" && !c.passed).map((c) => c.name).join(", ")} failed`;
152
+ logger.info("validation-readiness", { ready, score, grade, passed: passedChecks, total: totalChecks });
153
+ return { checks, ready, score, grade, summary };
154
+ }
155
+ //# sourceMappingURL=definition-of-ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition-of-ready.js","sourceRoot":"","sources":["../../../src/core/validator/definition-of-ready.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Done Integrity Checker — validates that done tasks have consistent state.
3
+ */
4
+ import type { GraphDocument } from "../graph/graph-types.js";
5
+ import type { DoneIntegrityReport } from "../../schemas/validator-schema.js";
6
+ export declare function checkDoneIntegrity(doc: GraphDocument): DoneIntegrityReport;
7
+ //# sourceMappingURL=done-integrity-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"done-integrity-checker.d.ts","sourceRoot":"","sources":["../../../src/core/validator/done-integrity-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,mCAAmC,CAAC;AAKjG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,mBAAmB,CAsC1E"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Done Integrity Checker — validates that done tasks have consistent state.
3
+ */
4
+ import { logger } from "../utils/logger.js";
5
+ const TASK_TYPES = new Set(["task", "subtask"]);
6
+ export function checkDoneIntegrity(doc) {
7
+ const issues = [];
8
+ const doneTasks = doc.nodes.filter((n) => TASK_TYPES.has(n.type) && n.status === "done");
9
+ const nodeById = new Map(doc.nodes.map((n) => [n.id, n]));
10
+ for (const task of doneTasks) {
11
+ // Check 1: Done but still marked as blocked
12
+ if (task.blocked === true) {
13
+ issues.push({
14
+ nodeId: task.id,
15
+ title: task.title,
16
+ issueType: "blocked_but_done",
17
+ details: `Task "${task.title}" está done mas ainda marcada como blocked`,
18
+ });
19
+ }
20
+ // Check 2: Done but has depends_on edges pointing to non-done nodes
21
+ const dependsOnEdges = doc.edges.filter((e) => e.from === task.id && e.relationType === "depends_on");
22
+ for (const edge of dependsOnEdges) {
23
+ const dependency = nodeById.get(edge.to);
24
+ if (dependency && dependency.status !== "done") {
25
+ issues.push({
26
+ nodeId: task.id,
27
+ title: task.title,
28
+ issueType: "dependency_not_done",
29
+ details: `Task "${task.title}" está done mas depende de "${dependency.title}" (status: ${dependency.status})`,
30
+ });
31
+ }
32
+ }
33
+ }
34
+ const passed = issues.length === 0;
35
+ logger.info("done-integrity-check", { passed, issueCount: issues.length });
36
+ return { issues, passed };
37
+ }
38
+ //# sourceMappingURL=done-integrity-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"done-integrity-checker.js","sourceRoot":"","sources":["../../../src/core/validator/done-integrity-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,kBAAkB,CAAC,GAAkB;IACnD,MAAM,MAAM,GAAyB,EAAE,CAAC;IAExC,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;IACzF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,4CAA4C;QAC5C,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,kBAAkB;gBAC7B,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,4CAA4C;aACzE,CAAC,CAAC;QACL,CAAC;QAED,oEAAoE;QACpE,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,CAC7D,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC;oBACV,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,SAAS,EAAE,qBAAqB;oBAChC,OAAO,EAAE,SAAS,IAAI,CAAC,KAAK,+BAA+B,UAAU,CAAC,KAAK,cAAc,UAAU,CAAC,MAAM,GAAG;iBAC9G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Status Flow Checker — validates that done tasks went through proper status transitions.
3
+ */
4
+ import type { GraphDocument } from "../graph/graph-types.js";
5
+ import type { StatusFlowReport } from "../../schemas/validator-schema.js";
6
+ export declare function checkStatusFlow(doc: GraphDocument): StatusFlowReport;
7
+ //# sourceMappingURL=status-flow-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-flow-checker.d.ts","sourceRoot":"","sources":["../../../src/core/validator/status-flow-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,mCAAmC,CAAC;AAK/F,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAwBpE"}