@mcp-graph-workflow/mcp-graph 3.0.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/LICENSE +21 -0
- package/README.md +157 -0
- package/dist/api/middleware/error-handler.d.ts +3 -0
- package/dist/api/middleware/error-handler.d.ts.map +1 -0
- package/dist/api/middleware/error-handler.js +48 -0
- package/dist/api/middleware/error-handler.js.map +1 -0
- package/dist/api/middleware/request-logger.d.ts +6 -0
- package/dist/api/middleware/request-logger.d.ts.map +1 -0
- package/dist/api/middleware/request-logger.js +19 -0
- package/dist/api/middleware/request-logger.js.map +1 -0
- package/dist/api/middleware/validate.d.ts +5 -0
- package/dist/api/middleware/validate.d.ts.map +1 -0
- package/dist/api/middleware/validate.js +23 -0
- package/dist/api/middleware/validate.js.map +1 -0
- package/dist/api/router.d.ts +11 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +51 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/routes/benchmark.d.ts +4 -0
- package/dist/api/routes/benchmark.d.ts.map +1 -0
- package/dist/api/routes/benchmark.js +86 -0
- package/dist/api/routes/benchmark.js.map +1 -0
- package/dist/api/routes/capture.d.ts +3 -0
- package/dist/api/routes/capture.d.ts.map +1 -0
- package/dist/api/routes/capture.js +31 -0
- package/dist/api/routes/capture.js.map +1 -0
- package/dist/api/routes/context.d.ts +4 -0
- package/dist/api/routes/context.d.ts.map +1 -0
- package/dist/api/routes/context.js +25 -0
- package/dist/api/routes/context.js.map +1 -0
- package/dist/api/routes/docs-cache.d.ts +4 -0
- package/dist/api/routes/docs-cache.d.ts.map +1 -0
- package/dist/api/routes/docs-cache.js +79 -0
- package/dist/api/routes/docs-cache.js.map +1 -0
- package/dist/api/routes/edges.d.ts +4 -0
- package/dist/api/routes/edges.d.ts.map +1 -0
- package/dist/api/routes/edges.js +50 -0
- package/dist/api/routes/edges.js.map +1 -0
- package/dist/api/routes/events.d.ts +4 -0
- package/dist/api/routes/events.d.ts.map +1 -0
- package/dist/api/routes/events.js +37 -0
- package/dist/api/routes/events.js.map +1 -0
- package/dist/api/routes/gitnexus.d.ts +12 -0
- package/dist/api/routes/gitnexus.d.ts.map +1 -0
- package/dist/api/routes/gitnexus.js +162 -0
- package/dist/api/routes/gitnexus.js.map +1 -0
- package/dist/api/routes/graph.d.ts +4 -0
- package/dist/api/routes/graph.d.ts.map +1 -0
- package/dist/api/routes/graph.js +39 -0
- package/dist/api/routes/graph.js.map +1 -0
- package/dist/api/routes/import.d.ts +4 -0
- package/dist/api/routes/import.d.ts.map +1 -0
- package/dist/api/routes/import.js +92 -0
- package/dist/api/routes/import.js.map +1 -0
- package/dist/api/routes/insights.d.ts +4 -0
- package/dist/api/routes/insights.d.ts.map +1 -0
- package/dist/api/routes/insights.js +40 -0
- package/dist/api/routes/insights.js.map +1 -0
- package/dist/api/routes/integrations.d.ts +4 -0
- package/dist/api/routes/integrations.d.ts.map +1 -0
- package/dist/api/routes/integrations.js +85 -0
- package/dist/api/routes/integrations.js.map +1 -0
- package/dist/api/routes/knowledge.d.ts +8 -0
- package/dist/api/routes/knowledge.d.ts.map +1 -0
- package/dist/api/routes/knowledge.js +144 -0
- package/dist/api/routes/knowledge.js.map +1 -0
- package/dist/api/routes/nodes.d.ts +4 -0
- package/dist/api/routes/nodes.d.ts.map +1 -0
- package/dist/api/routes/nodes.js +123 -0
- package/dist/api/routes/nodes.js.map +1 -0
- package/dist/api/routes/project.d.ts +4 -0
- package/dist/api/routes/project.d.ts.map +1 -0
- package/dist/api/routes/project.js +70 -0
- package/dist/api/routes/project.js.map +1 -0
- package/dist/api/routes/rag.d.ts +8 -0
- package/dist/api/routes/rag.d.ts.map +1 -0
- package/dist/api/routes/rag.js +70 -0
- package/dist/api/routes/rag.js.map +1 -0
- package/dist/api/routes/search.d.ts +4 -0
- package/dist/api/routes/search.d.ts.map +1 -0
- package/dist/api/routes/search.js +25 -0
- package/dist/api/routes/search.js.map +1 -0
- package/dist/api/routes/skills.d.ts +3 -0
- package/dist/api/routes/skills.d.ts.map +1 -0
- package/dist/api/routes/skills.js +16 -0
- package/dist/api/routes/skills.js.map +1 -0
- package/dist/api/routes/stats.d.ts +4 -0
- package/dist/api/routes/stats.d.ts.map +1 -0
- package/dist/api/routes/stats.js +14 -0
- package/dist/api/routes/stats.js.map +1 -0
- package/dist/cli/commands/import-cmd.d.ts +3 -0
- package/dist/cli/commands/import-cmd.d.ts.map +1 -0
- package/dist/cli/commands/import-cmd.js +38 -0
- package/dist/cli/commands/import-cmd.js.map +1 -0
- package/dist/cli/commands/index-cmd.d.ts +3 -0
- package/dist/cli/commands/index-cmd.d.ts.map +1 -0
- package/dist/cli/commands/index-cmd.js +50 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +24 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +18 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +3 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +39 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/capture/content-extractor.d.ts +21 -0
- package/dist/core/capture/content-extractor.d.ts.map +1 -0
- package/dist/core/capture/content-extractor.js +74 -0
- package/dist/core/capture/content-extractor.js.map +1 -0
- package/dist/core/capture/validate-runner.d.ts +28 -0
- package/dist/core/capture/validate-runner.d.ts.map +1 -0
- package/dist/core/capture/validate-runner.js +42 -0
- package/dist/core/capture/validate-runner.js.map +1 -0
- package/dist/core/capture/web-capture.d.ts +20 -0
- package/dist/core/capture/web-capture.d.ts.map +1 -0
- package/dist/core/capture/web-capture.js +51 -0
- package/dist/core/capture/web-capture.js.map +1 -0
- package/dist/core/config/ai-memory-generator.d.ts +14 -0
- package/dist/core/config/ai-memory-generator.d.ts.map +1 -0
- package/dist/core/config/ai-memory-generator.js +130 -0
- package/dist/core/config/ai-memory-generator.js.map +1 -0
- package/dist/core/config/config-loader.d.ts +3 -0
- package/dist/core/config/config-loader.d.ts.map +1 -0
- package/dist/core/config/config-loader.js +48 -0
- package/dist/core/config/config-loader.js.map +1 -0
- package/dist/core/config/config-schema.d.ts +12 -0
- package/dist/core/config/config-schema.d.ts.map +1 -0
- package/dist/core/config/config-schema.js +13 -0
- package/dist/core/config/config-schema.js.map +1 -0
- package/dist/core/context/bm25-compressor.d.ts +21 -0
- package/dist/core/context/bm25-compressor.d.ts.map +1 -0
- package/dist/core/context/bm25-compressor.js +87 -0
- package/dist/core/context/bm25-compressor.js.map +1 -0
- package/dist/core/context/compact-context.d.ts +56 -0
- package/dist/core/context/compact-context.d.ts.map +1 -0
- package/dist/core/context/compact-context.js +170 -0
- package/dist/core/context/compact-context.js.map +1 -0
- package/dist/core/context/context-assembler.d.ts +43 -0
- package/dist/core/context/context-assembler.d.ts.map +1 -0
- package/dist/core/context/context-assembler.js +113 -0
- package/dist/core/context/context-assembler.js.map +1 -0
- package/dist/core/context/rag-context.d.ts +44 -0
- package/dist/core/context/rag-context.d.ts.map +1 -0
- package/dist/core/context/rag-context.js +93 -0
- package/dist/core/context/rag-context.js.map +1 -0
- package/dist/core/context/tiered-context.d.ts +35 -0
- package/dist/core/context/tiered-context.d.ts.map +1 -0
- package/dist/core/context/tiered-context.js +92 -0
- package/dist/core/context/tiered-context.js.map +1 -0
- package/dist/core/context/token-estimator.d.ts +7 -0
- package/dist/core/context/token-estimator.d.ts.map +1 -0
- package/dist/core/context/token-estimator.js +9 -0
- package/dist/core/context/token-estimator.js.map +1 -0
- package/dist/core/docs/docs-cache-store.d.ts +24 -0
- package/dist/core/docs/docs-cache-store.d.ts.map +1 -0
- package/dist/core/docs/docs-cache-store.js +61 -0
- package/dist/core/docs/docs-cache-store.js.map +1 -0
- package/dist/core/docs/docs-syncer.d.ts +13 -0
- package/dist/core/docs/docs-syncer.d.ts.map +1 -0
- package/dist/core/docs/docs-syncer.js +38 -0
- package/dist/core/docs/docs-syncer.js.map +1 -0
- package/dist/core/docs/mcp-context7-fetcher.d.ts +17 -0
- package/dist/core/docs/mcp-context7-fetcher.d.ts.map +1 -0
- package/dist/core/docs/mcp-context7-fetcher.js +87 -0
- package/dist/core/docs/mcp-context7-fetcher.js.map +1 -0
- package/dist/core/docs/stack-detector.d.ts +21 -0
- package/dist/core/docs/stack-detector.d.ts.map +1 -0
- package/dist/core/docs/stack-detector.js +101 -0
- package/dist/core/docs/stack-detector.js.map +1 -0
- package/dist/core/events/event-bus.d.ts +26 -0
- package/dist/core/events/event-bus.d.ts.map +1 -0
- package/dist/core/events/event-bus.js +47 -0
- package/dist/core/events/event-bus.js.map +1 -0
- package/dist/core/events/event-types.d.ts +71 -0
- package/dist/core/events/event-types.d.ts.map +1 -0
- package/dist/core/events/event-types.js +2 -0
- package/dist/core/events/event-types.js.map +1 -0
- package/dist/core/graph/graph-indexes.d.ts +3 -0
- package/dist/core/graph/graph-indexes.d.ts.map +1 -0
- package/dist/core/graph/graph-indexes.js +28 -0
- package/dist/core/graph/graph-indexes.js.map +1 -0
- package/dist/core/graph/graph-types.d.ts +72 -0
- package/dist/core/graph/graph-types.d.ts.map +1 -0
- package/dist/core/graph/graph-types.js +2 -0
- package/dist/core/graph/graph-types.js.map +1 -0
- package/dist/core/graph/mermaid-export.d.ts +9 -0
- package/dist/core/graph/mermaid-export.d.ts.map +1 -0
- package/dist/core/graph/mermaid-export.js +80 -0
- package/dist/core/graph/mermaid-export.js.map +1 -0
- package/dist/core/importer/import-prd.d.ts +7 -0
- package/dist/core/importer/import-prd.d.ts.map +1 -0
- package/dist/core/importer/import-prd.js +7 -0
- package/dist/core/importer/import-prd.js.map +1 -0
- package/dist/core/importer/prd-to-graph.d.ts +18 -0
- package/dist/core/importer/prd-to-graph.d.ts.map +1 -0
- package/dist/core/importer/prd-to-graph.js +195 -0
- package/dist/core/importer/prd-to-graph.js.map +1 -0
- package/dist/core/insights/bottleneck-detector.d.ts +31 -0
- package/dist/core/insights/bottleneck-detector.d.ts.map +1 -0
- package/dist/core/insights/bottleneck-detector.js +84 -0
- package/dist/core/insights/bottleneck-detector.js.map +1 -0
- package/dist/core/insights/metrics-calculator.d.ts +31 -0
- package/dist/core/insights/metrics-calculator.d.ts.map +1 -0
- package/dist/core/insights/metrics-calculator.js +78 -0
- package/dist/core/insights/metrics-calculator.js.map +1 -0
- package/dist/core/insights/skill-recommender.d.ts +21 -0
- package/dist/core/insights/skill-recommender.d.ts.map +1 -0
- package/dist/core/insights/skill-recommender.js +129 -0
- package/dist/core/insights/skill-recommender.js.map +1 -0
- package/dist/core/integrations/enriched-context.d.ts +24 -0
- package/dist/core/integrations/enriched-context.d.ts.map +1 -0
- package/dist/core/integrations/enriched-context.js +89 -0
- package/dist/core/integrations/enriched-context.js.map +1 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts +62 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -0
- package/dist/core/integrations/gitnexus-launcher.js +241 -0
- package/dist/core/integrations/gitnexus-launcher.js.map +1 -0
- package/dist/core/integrations/gitnexus-queries.d.ts +55 -0
- package/dist/core/integrations/gitnexus-queries.d.ts.map +1 -0
- package/dist/core/integrations/gitnexus-queries.js +168 -0
- package/dist/core/integrations/gitnexus-queries.js.map +1 -0
- package/dist/core/integrations/integration-orchestrator.d.ts +51 -0
- package/dist/core/integrations/integration-orchestrator.d.ts.map +1 -0
- package/dist/core/integrations/integration-orchestrator.js +118 -0
- package/dist/core/integrations/integration-orchestrator.js.map +1 -0
- package/dist/core/integrations/mcp-deps-installer.d.ts +21 -0
- package/dist/core/integrations/mcp-deps-installer.d.ts.map +1 -0
- package/dist/core/integrations/mcp-deps-installer.js +114 -0
- package/dist/core/integrations/mcp-deps-installer.js.map +1 -0
- package/dist/core/integrations/mcp-servers-config.d.ts +21 -0
- package/dist/core/integrations/mcp-servers-config.d.ts.map +1 -0
- package/dist/core/integrations/mcp-servers-config.js +58 -0
- package/dist/core/integrations/mcp-servers-config.js.map +1 -0
- package/dist/core/integrations/serena-reader.d.ts +18 -0
- package/dist/core/integrations/serena-reader.d.ts.map +1 -0
- package/dist/core/integrations/serena-reader.js +68 -0
- package/dist/core/integrations/serena-reader.js.map +1 -0
- package/dist/core/integrations/tool-status.d.ts +18 -0
- package/dist/core/integrations/tool-status.d.ts.map +1 -0
- package/dist/core/integrations/tool-status.js +97 -0
- package/dist/core/integrations/tool-status.js.map +1 -0
- package/dist/core/parser/classify.d.ts +31 -0
- package/dist/core/parser/classify.d.ts.map +1 -0
- package/dist/core/parser/classify.js +128 -0
- package/dist/core/parser/classify.js.map +1 -0
- package/dist/core/parser/extract.d.ts +21 -0
- package/dist/core/parser/extract.d.ts.map +1 -0
- package/dist/core/parser/extract.js +66 -0
- package/dist/core/parser/extract.js.map +1 -0
- package/dist/core/parser/file-reader.d.ts +13 -0
- package/dist/core/parser/file-reader.d.ts.map +1 -0
- package/dist/core/parser/file-reader.js +52 -0
- package/dist/core/parser/file-reader.js.map +1 -0
- package/dist/core/parser/normalize.d.ts +9 -0
- package/dist/core/parser/normalize.d.ts.map +1 -0
- package/dist/core/parser/normalize.js +22 -0
- package/dist/core/parser/normalize.js.map +1 -0
- package/dist/core/parser/read-file.d.ts +7 -0
- package/dist/core/parser/read-file.d.ts.map +1 -0
- package/dist/core/parser/read-file.js +17 -0
- package/dist/core/parser/read-file.js.map +1 -0
- package/dist/core/parser/read-html.d.ts +7 -0
- package/dist/core/parser/read-html.d.ts.map +1 -0
- package/dist/core/parser/read-html.js +51 -0
- package/dist/core/parser/read-html.js.map +1 -0
- package/dist/core/parser/read-pdf.d.ts +10 -0
- package/dist/core/parser/read-pdf.d.ts.map +1 -0
- package/dist/core/parser/read-pdf.js +16 -0
- package/dist/core/parser/read-pdf.js.map +1 -0
- package/dist/core/parser/segment.d.ts +13 -0
- package/dist/core/parser/segment.d.ts.map +1 -0
- package/dist/core/parser/segment.js +53 -0
- package/dist/core/parser/segment.js.map +1 -0
- package/dist/core/planner/decompose.d.ts +25 -0
- package/dist/core/planner/decompose.d.ts.map +1 -0
- package/dist/core/planner/decompose.js +100 -0
- package/dist/core/planner/decompose.js.map +1 -0
- package/dist/core/planner/dependency-chain.d.ts +20 -0
- package/dist/core/planner/dependency-chain.d.ts.map +1 -0
- package/dist/core/planner/dependency-chain.js +163 -0
- package/dist/core/planner/dependency-chain.js.map +1 -0
- package/dist/core/planner/enhanced-next.d.ts +25 -0
- package/dist/core/planner/enhanced-next.d.ts.map +1 -0
- package/dist/core/planner/enhanced-next.js +88 -0
- package/dist/core/planner/enhanced-next.js.map +1 -0
- package/dist/core/planner/lifecycle-phase.d.ts +21 -0
- package/dist/core/planner/lifecycle-phase.d.ts.map +1 -0
- package/dist/core/planner/lifecycle-phase.js +93 -0
- package/dist/core/planner/lifecycle-phase.js.map +1 -0
- package/dist/core/planner/next-task.d.ts +16 -0
- package/dist/core/planner/next-task.d.ts.map +1 -0
- package/dist/core/planner/next-task.js +146 -0
- package/dist/core/planner/next-task.js.map +1 -0
- package/dist/core/planner/planning-report.d.ts +38 -0
- package/dist/core/planner/planning-report.d.ts.map +1 -0
- package/dist/core/planner/planning-report.js +140 -0
- package/dist/core/planner/planning-report.js.map +1 -0
- package/dist/core/planner/velocity.d.ts +38 -0
- package/dist/core/planner/velocity.d.ts.map +1 -0
- package/dist/core/planner/velocity.js +92 -0
- package/dist/core/planner/velocity.js.map +1 -0
- package/dist/core/rag/capture-indexer.d.ts +16 -0
- package/dist/core/rag/capture-indexer.d.ts.map +1 -0
- package/dist/core/rag/capture-indexer.js +37 -0
- package/dist/core/rag/capture-indexer.js.map +1 -0
- package/dist/core/rag/chunk-text.d.ts +27 -0
- package/dist/core/rag/chunk-text.d.ts.map +1 -0
- package/dist/core/rag/chunk-text.js +112 -0
- package/dist/core/rag/chunk-text.js.map +1 -0
- package/dist/core/rag/docs-indexer.d.ts +18 -0
- package/dist/core/rag/docs-indexer.d.ts.map +1 -0
- package/dist/core/rag/docs-indexer.js +57 -0
- package/dist/core/rag/docs-indexer.js.map +1 -0
- package/dist/core/rag/embedding-store.d.ts +51 -0
- package/dist/core/rag/embedding-store.d.ts.map +1 -0
- package/dist/core/rag/embedding-store.js +134 -0
- package/dist/core/rag/embedding-store.js.map +1 -0
- package/dist/core/rag/rag-pipeline.d.ts +48 -0
- package/dist/core/rag/rag-pipeline.d.ts.map +1 -0
- package/dist/core/rag/rag-pipeline.js +276 -0
- package/dist/core/rag/rag-pipeline.js.map +1 -0
- package/dist/core/rag/serena-indexer.d.ts +16 -0
- package/dist/core/rag/serena-indexer.d.ts.map +1 -0
- package/dist/core/rag/serena-indexer.js +50 -0
- package/dist/core/rag/serena-indexer.js.map +1 -0
- package/dist/core/rag/serena-rag-query.d.ts +34 -0
- package/dist/core/rag/serena-rag-query.d.ts.map +1 -0
- package/dist/core/rag/serena-rag-query.js +83 -0
- package/dist/core/rag/serena-rag-query.js.map +1 -0
- package/dist/core/search/fts-search.d.ts +16 -0
- package/dist/core/search/fts-search.d.ts.map +1 -0
- package/dist/core/search/fts-search.js +62 -0
- package/dist/core/search/fts-search.js.map +1 -0
- package/dist/core/search/tfidf.d.ts +32 -0
- package/dist/core/search/tfidf.d.ts.map +1 -0
- package/dist/core/search/tfidf.js +67 -0
- package/dist/core/search/tfidf.js.map +1 -0
- package/dist/core/search/tokenizer.d.ts +9 -0
- package/dist/core/search/tokenizer.d.ts.map +1 -0
- package/dist/core/search/tokenizer.js +37 -0
- package/dist/core/search/tokenizer.js.map +1 -0
- package/dist/core/store/knowledge-store.d.ts +72 -0
- package/dist/core/store/knowledge-store.d.ts.map +1 -0
- package/dist/core/store/knowledge-store.js +166 -0
- package/dist/core/store/knowledge-store.js.map +1 -0
- package/dist/core/store/migrations.d.ts +4 -0
- package/dist/core/store/migrations.d.ts.map +1 -0
- package/dist/core/store/migrations.js +223 -0
- package/dist/core/store/migrations.js.map +1 -0
- package/dist/core/store/sqlite-store.d.ts +86 -0
- package/dist/core/store/sqlite-store.d.ts.map +1 -0
- package/dist/core/store/sqlite-store.js +707 -0
- package/dist/core/store/sqlite-store.js.map +1 -0
- package/dist/core/utils/constants.d.ts +10 -0
- package/dist/core/utils/constants.d.ts.map +1 -0
- package/dist/core/utils/constants.js +10 -0
- package/dist/core/utils/constants.js.map +1 -0
- package/dist/core/utils/errors.d.ts +20 -0
- package/dist/core/utils/errors.d.ts.map +1 -0
- package/dist/core/utils/errors.js +39 -0
- package/dist/core/utils/errors.js.map +1 -0
- package/dist/core/utils/fs.d.ts +2 -0
- package/dist/core/utils/fs.d.ts.map +1 -0
- package/dist/core/utils/fs.js +11 -0
- package/dist/core/utils/fs.js.map +1 -0
- package/dist/core/utils/id.d.ts +2 -0
- package/dist/core/utils/id.d.ts.map +1 -0
- package/dist/core/utils/id.js +6 -0
- package/dist/core/utils/id.js.map +1 -0
- package/dist/core/utils/logger.d.ts +8 -0
- package/dist/core/utils/logger.d.ts.map +1 -0
- package/dist/core/utils/logger.js +28 -0
- package/dist/core/utils/logger.js.map +1 -0
- package/dist/core/utils/platform.d.ts +18 -0
- package/dist/core/utils/platform.d.ts.map +1 -0
- package/dist/core/utils/platform.js +43 -0
- package/dist/core/utils/platform.js.map +1 -0
- package/dist/core/utils/time.d.ts +2 -0
- package/dist/core/utils/time.d.ts.map +1 -0
- package/dist/core/utils/time.js +4 -0
- package/dist/core/utils/time.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/init-project.d.ts +2 -0
- package/dist/mcp/init-project.d.ts.map +1 -0
- package/dist/mcp/init-project.js +144 -0
- package/dist/mcp/init-project.js.map +1 -0
- package/dist/mcp/lifecycle-wrapper.d.ts +26 -0
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -0
- package/dist/mcp/lifecycle-wrapper.js +67 -0
- package/dist/mcp/lifecycle-wrapper.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +73 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +3 -0
- package/dist/mcp/stdio.d.ts.map +1 -0
- package/dist/mcp/stdio.js +20 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/mcp/tools/add-node.d.ts +4 -0
- package/dist/mcp/tools/add-node.d.ts.map +1 -0
- package/dist/mcp/tools/add-node.js +83 -0
- package/dist/mcp/tools/add-node.js.map +1 -0
- package/dist/mcp/tools/bulk-update-status.d.ts +4 -0
- package/dist/mcp/tools/bulk-update-status.d.ts.map +1 -0
- package/dist/mcp/tools/bulk-update-status.js +22 -0
- package/dist/mcp/tools/bulk-update-status.js.map +1 -0
- package/dist/mcp/tools/clone-node.d.ts +4 -0
- package/dist/mcp/tools/clone-node.d.ts.map +1 -0
- package/dist/mcp/tools/clone-node.js +111 -0
- package/dist/mcp/tools/clone-node.js.map +1 -0
- package/dist/mcp/tools/context.d.ts +4 -0
- package/dist/mcp/tools/context.d.ts.map +1 -0
- package/dist/mcp/tools/context.js +30 -0
- package/dist/mcp/tools/context.js.map +1 -0
- package/dist/mcp/tools/decompose.d.ts +4 -0
- package/dist/mcp/tools/decompose.d.ts.map +1 -0
- package/dist/mcp/tools/decompose.js +25 -0
- package/dist/mcp/tools/decompose.js.map +1 -0
- package/dist/mcp/tools/delete-node.d.ts +4 -0
- package/dist/mcp/tools/delete-node.d.ts.map +1 -0
- package/dist/mcp/tools/delete-node.js +29 -0
- package/dist/mcp/tools/delete-node.js.map +1 -0
- package/dist/mcp/tools/dependencies.d.ts +4 -0
- package/dist/mcp/tools/dependencies.d.ts.map +1 -0
- package/dist/mcp/tools/dependencies.js +47 -0
- package/dist/mcp/tools/dependencies.js.map +1 -0
- package/dist/mcp/tools/edge.d.ts +4 -0
- package/dist/mcp/tools/edge.d.ts.map +1 -0
- package/dist/mcp/tools/edge.js +140 -0
- package/dist/mcp/tools/edge.js.map +1 -0
- package/dist/mcp/tools/export.d.ts +4 -0
- package/dist/mcp/tools/export.d.ts.map +1 -0
- package/dist/mcp/tools/export.js +38 -0
- package/dist/mcp/tools/export.js.map +1 -0
- package/dist/mcp/tools/import-prd.d.ts +4 -0
- package/dist/mcp/tools/import-prd.d.ts.map +1 -0
- package/dist/mcp/tools/import-prd.js +81 -0
- package/dist/mcp/tools/import-prd.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +4 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +58 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/init.d.ts +4 -0
- package/dist/mcp/tools/init.d.ts.map +1 -0
- package/dist/mcp/tools/init.js +18 -0
- package/dist/mcp/tools/init.js.map +1 -0
- package/dist/mcp/tools/list.d.ts +4 -0
- package/dist/mcp/tools/list.d.ts.map +1 -0
- package/dist/mcp/tools/list.js +56 -0
- package/dist/mcp/tools/list.js.map +1 -0
- package/dist/mcp/tools/move-node.d.ts +4 -0
- package/dist/mcp/tools/move-node.d.ts.map +1 -0
- package/dist/mcp/tools/move-node.js +110 -0
- package/dist/mcp/tools/move-node.js.map +1 -0
- package/dist/mcp/tools/next.d.ts +4 -0
- package/dist/mcp/tools/next.d.ts.map +1 -0
- package/dist/mcp/tools/next.js +32 -0
- package/dist/mcp/tools/next.js.map +1 -0
- package/dist/mcp/tools/plan-sprint.d.ts +4 -0
- package/dist/mcp/tools/plan-sprint.d.ts.map +1 -0
- package/dist/mcp/tools/plan-sprint.js +54 -0
- package/dist/mcp/tools/plan-sprint.js.map +1 -0
- package/dist/mcp/tools/rag-context.d.ts +4 -0
- package/dist/mcp/tools/rag-context.d.ts.map +1 -0
- package/dist/mcp/tools/rag-context.js +51 -0
- package/dist/mcp/tools/rag-context.js.map +1 -0
- package/dist/mcp/tools/reindex-knowledge.d.ts +4 -0
- package/dist/mcp/tools/reindex-knowledge.d.ts.map +1 -0
- package/dist/mcp/tools/reindex-knowledge.js +49 -0
- package/dist/mcp/tools/reindex-knowledge.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +4 -0
- package/dist/mcp/tools/search.d.ts.map +1 -0
- package/dist/mcp/tools/search.js +41 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/show.d.ts +4 -0
- package/dist/mcp/tools/show.d.ts.map +1 -0
- package/dist/mcp/tools/show.js +42 -0
- package/dist/mcp/tools/show.js.map +1 -0
- package/dist/mcp/tools/snapshot.d.ts +4 -0
- package/dist/mcp/tools/snapshot.d.ts.map +1 -0
- package/dist/mcp/tools/snapshot.js +45 -0
- package/dist/mcp/tools/snapshot.js.map +1 -0
- package/dist/mcp/tools/stats.d.ts +4 -0
- package/dist/mcp/tools/stats.d.ts.map +1 -0
- package/dist/mcp/tools/stats.js +46 -0
- package/dist/mcp/tools/stats.js.map +1 -0
- package/dist/mcp/tools/sync-stack-docs.d.ts +4 -0
- package/dist/mcp/tools/sync-stack-docs.d.ts.map +1 -0
- package/dist/mcp/tools/sync-stack-docs.js +77 -0
- package/dist/mcp/tools/sync-stack-docs.js.map +1 -0
- package/dist/mcp/tools/update-node.d.ts +4 -0
- package/dist/mcp/tools/update-node.d.ts.map +1 -0
- package/dist/mcp/tools/update-node.js +45 -0
- package/dist/mcp/tools/update-node.js.map +1 -0
- package/dist/mcp/tools/update-status.d.ts +4 -0
- package/dist/mcp/tools/update-status.d.ts.map +1 -0
- package/dist/mcp/tools/update-status.js +33 -0
- package/dist/mcp/tools/update-status.js.map +1 -0
- package/dist/mcp/tools/validate-task.d.ts +4 -0
- package/dist/mcp/tools/validate-task.d.ts.map +1 -0
- package/dist/mcp/tools/validate-task.js +57 -0
- package/dist/mcp/tools/validate-task.js.map +1 -0
- package/dist/mcp/tools/velocity.d.ts +4 -0
- package/dist/mcp/tools/velocity.d.ts.map +1 -0
- package/dist/mcp/tools/velocity.js +25 -0
- package/dist/mcp/tools/velocity.js.map +1 -0
- package/dist/schemas/edge.schema.d.ts +31 -0
- package/dist/schemas/edge.schema.d.ts.map +1 -0
- package/dist/schemas/edge.schema.js +16 -0
- package/dist/schemas/edge.schema.js.map +1 -0
- package/dist/schemas/graph.schema.d.ts +102 -0
- package/dist/schemas/graph.schema.d.ts.map +1 -0
- package/dist/schemas/graph.schema.js +28 -0
- package/dist/schemas/graph.schema.js.map +1 -0
- package/dist/schemas/knowledge.schema.d.ts +29 -0
- package/dist/schemas/knowledge.schema.d.ts.map +1 -0
- package/dist/schemas/knowledge.schema.js +17 -0
- package/dist/schemas/knowledge.schema.js.map +1 -0
- package/dist/schemas/node.schema.d.ts +80 -0
- package/dist/schemas/node.schema.d.ts.map +1 -0
- package/dist/schemas/node.schema.js +38 -0
- package/dist/schemas/node.schema.js.map +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-BTKW3REK.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-BhbUvjLM.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-CESZcCtO.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-D64Ala80.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-DJ7HyF-u.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-DVyzQZ2d.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-XUH7yQNv.js +1 -0
- package/dist/web/dashboard/dist/assets/benchmark-tab-ZfJu1pxc.js +1 -0
- package/dist/web/dashboard/dist/assets/constants-BIEJOBya.js +1 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-BFHEXsJm.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-Bbp91fom.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-C3fPSzYi.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-Cd0k8qk3.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-ClNGphK5.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-Cuc-KSII.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DEqMBSbC.css +1 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DEwJXSnD.js +312 -0
- package/dist/web/dashboard/dist/assets/gitnexus-tab-DOD7xwmm.js +312 -0
- package/dist/web/dashboard/dist/assets/graph-tab-AD7csRcc.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-BKyDCyHH.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-BUAkTto0.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-D0F0WJES.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-DA16nThT.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-DJknUhrl.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-DRPfelKw.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-tab-lJ2rPS4Z.js +1 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BN7tt0ZS.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BTV1KGUM.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BZV40eAE.css +1 -0
- package/dist/web/dashboard/dist/assets/graph-utils-BkfAOVJ9.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-Bo7cD1sx.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-CI4znRl5.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-DrCx5m7q.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-KQmzMFXM.js +23 -0
- package/dist/web/dashboard/dist/assets/graph-utils-M7iOhRI-.js +23 -0
- package/dist/web/dashboard/dist/assets/index-BGMP3W6f.css +1 -0
- package/dist/web/dashboard/dist/assets/index-BVXu3x9W.js +53 -0
- package/dist/web/dashboard/dist/assets/index-B_T9j86O.js +53 -0
- package/dist/web/dashboard/dist/assets/index-Bga9WW2A.css +1 -0
- package/dist/web/dashboard/dist/assets/index-BnLPCC8R.css +1 -0
- package/dist/web/dashboard/dist/assets/index-BonF71I0.js +53 -0
- package/dist/web/dashboard/dist/assets/index-CSyjxREL.js +53 -0
- package/dist/web/dashboard/dist/assets/index-CbUKe2Fv.js +53 -0
- package/dist/web/dashboard/dist/assets/index-D9i2aVjo.js +53 -0
- package/dist/web/dashboard/dist/assets/index-DzM6oBA3.js +53 -0
- package/dist/web/dashboard/dist/assets/index-IK005MzD.js +53 -0
- package/dist/web/dashboard/dist/assets/insights-tab-B9R3HsMU.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-BO_cxLyV.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-Brn6IMfQ.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-C6x-aJ8p.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-CWUU6eDi.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-CapL1jP-.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-CeWM6zgV.js +1 -0
- package/dist/web/dashboard/dist/assets/insights-tab-xQj5e61M.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-0oOO63rA.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-BcWoplsM.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-Bjj5KccG.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-C7cKQyup.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-CT4ja7Ay.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-CmPHHBDQ.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-DAHBiRO-.js +1 -0
- package/dist/web/dashboard/dist/assets/prd-backlog-tab-_jmBe3MU.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-BVyBTaHC.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-CVI1GGRk.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-D1ki2NjT.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-DRrRfjpO.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-DvYbwR4Z.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-DwiZ6Jm3.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-L6isY0iT.js +1 -0
- package/dist/web/dashboard/dist/assets/serena-tab-ba2n0AOh.js +1 -0
- package/dist/web/dashboard/dist/index.html +13 -0
- package/package.json +86 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { GraphDocument } from "../graph/graph-types.js";
|
|
2
|
+
export type LifecyclePhase = "ANALYZE" | "DESIGN" | "PLAN" | "IMPLEMENT" | "VALIDATE" | "REVIEW" | "HANDOFF" | "LISTENING";
|
|
3
|
+
export interface PhaseGuidance {
|
|
4
|
+
reminder: string;
|
|
5
|
+
suggestedTools: string[];
|
|
6
|
+
principles: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Detect the current lifecycle phase from the graph state.
|
|
10
|
+
*
|
|
11
|
+
* Heuristics:
|
|
12
|
+
* - No nodes → ANALYZE
|
|
13
|
+
* - Only requirement/epic/decision nodes → DESIGN
|
|
14
|
+
* - Tasks exist but no sprint assigned → PLAN
|
|
15
|
+
* - Any task in_progress → IMPLEMENT
|
|
16
|
+
* - Most tasks done, some remaining → VALIDATE
|
|
17
|
+
* - All actionable nodes done → REVIEW
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectCurrentPhase(doc: GraphDocument): LifecyclePhase;
|
|
20
|
+
export declare function getPhaseGuidance(phase: LifecyclePhase): PhaseGuidance;
|
|
21
|
+
//# sourceMappingURL=lifecycle-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-phase.d.ts","sourceRoot":"","sources":["../../../src/core/planner/lifecycle-phase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,MAAM,GACN,WAAW,GACX,UAAU,GACV,QAAQ,GACR,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,CA4CrE;AA6CD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,aAAa,CAErE"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const DESIGN_ONLY_TYPES = new Set(["requirement", "epic", "decision", "constraint", "milestone", "risk"]);
|
|
2
|
+
const TASK_TYPES = new Set(["task", "subtask"]);
|
|
3
|
+
/**
|
|
4
|
+
* Detect the current lifecycle phase from the graph state.
|
|
5
|
+
*
|
|
6
|
+
* Heuristics:
|
|
7
|
+
* - No nodes → ANALYZE
|
|
8
|
+
* - Only requirement/epic/decision nodes → DESIGN
|
|
9
|
+
* - Tasks exist but no sprint assigned → PLAN
|
|
10
|
+
* - Any task in_progress → IMPLEMENT
|
|
11
|
+
* - Most tasks done, some remaining → VALIDATE
|
|
12
|
+
* - All actionable nodes done → REVIEW
|
|
13
|
+
*/
|
|
14
|
+
export function detectCurrentPhase(doc) {
|
|
15
|
+
const { nodes } = doc;
|
|
16
|
+
if (nodes.length === 0) {
|
|
17
|
+
return "ANALYZE";
|
|
18
|
+
}
|
|
19
|
+
const tasks = nodes.filter((n) => TASK_TYPES.has(n.type));
|
|
20
|
+
const hasOnlyDesignNodes = nodes.every((n) => DESIGN_ONLY_TYPES.has(n.type));
|
|
21
|
+
if (hasOnlyDesignNodes || tasks.length === 0) {
|
|
22
|
+
return "DESIGN";
|
|
23
|
+
}
|
|
24
|
+
const inProgress = tasks.filter((n) => n.status === "in_progress");
|
|
25
|
+
if (inProgress.length > 0) {
|
|
26
|
+
return "IMPLEMENT";
|
|
27
|
+
}
|
|
28
|
+
const doneTasks = tasks.filter((n) => n.status === "done");
|
|
29
|
+
const allDone = nodes.every((n) => n.status === "done" || !TASK_TYPES.has(n.type) && DESIGN_ONLY_TYPES.has(n.type));
|
|
30
|
+
if (doneTasks.length === tasks.length && tasks.length > 0) {
|
|
31
|
+
return "REVIEW";
|
|
32
|
+
}
|
|
33
|
+
const hasSprints = tasks.some((n) => n.sprint != null);
|
|
34
|
+
if (!hasSprints) {
|
|
35
|
+
return "PLAN";
|
|
36
|
+
}
|
|
37
|
+
// Most done but some remaining → VALIDATE
|
|
38
|
+
if (doneTasks.length > 0 && doneTasks.length >= tasks.length * 0.5) {
|
|
39
|
+
return "VALIDATE";
|
|
40
|
+
}
|
|
41
|
+
// Tasks with sprint but not started yet → still PLAN
|
|
42
|
+
const notStarted = tasks.every((n) => n.status === "backlog" || n.status === "ready");
|
|
43
|
+
if (notStarted) {
|
|
44
|
+
return "PLAN";
|
|
45
|
+
}
|
|
46
|
+
return "IMPLEMENT";
|
|
47
|
+
}
|
|
48
|
+
const GUIDANCE = {
|
|
49
|
+
ANALYZE: {
|
|
50
|
+
reminder: "Fase ANALYZE: Crie o PRD a partir da ideia. Defina requisitos, restrições e critérios de aceitação antes de qualquer código.",
|
|
51
|
+
suggestedTools: ["import_prd", "add_node", "search"],
|
|
52
|
+
principles: ["Definir antes de construir", "PRD como contrato", "Requisitos claros e mensuráveis"],
|
|
53
|
+
},
|
|
54
|
+
DESIGN: {
|
|
55
|
+
reminder: "Fase DESIGN: Defina a arquitetura e tome decisões técnicas. Use análise de impacto antes de definir a estrutura.",
|
|
56
|
+
suggestedTools: ["add_node", "edge", "decompose", "export"],
|
|
57
|
+
principles: ["Skeleton & Organs", "Decisões arquiteturais documentadas", "Anti-one-shot"],
|
|
58
|
+
},
|
|
59
|
+
PLAN: {
|
|
60
|
+
reminder: "Fase PLAN: Planeje o sprint, decomponha tasks grandes e sincronize documentação das libs.",
|
|
61
|
+
suggestedTools: ["plan_sprint", "decompose", "sync_stack_docs", "edge", "dependencies"],
|
|
62
|
+
principles: ["Decomposição atômica", "Sprint planning baseado em velocidade", "Dependências explícitas"],
|
|
63
|
+
},
|
|
64
|
+
IMPLEMENT: {
|
|
65
|
+
reminder: "Fase IMPLEMENT: TDD obrigatório — Red → Green → Refactor. Escreva o teste ANTES da implementação. Use `context` para token-efficiency.",
|
|
66
|
+
suggestedTools: ["next", "context", "update_status", "rag_context", "validate_task"],
|
|
67
|
+
principles: ["TDD Red→Green→Refactor", "Anti-one-shot", "Code detachment", "Decomposição atômica"],
|
|
68
|
+
},
|
|
69
|
+
VALIDATE: {
|
|
70
|
+
reminder: "Fase VALIDATE: Valide tasks completadas com testes E2E (Playwright). Verifique critérios de aceitação.",
|
|
71
|
+
suggestedTools: ["validate_task", "velocity", "stats", "list"],
|
|
72
|
+
principles: ["Validação automatizada", "Critérios de aceitação como contrato", "Zero tolerance para regressões"],
|
|
73
|
+
},
|
|
74
|
+
REVIEW: {
|
|
75
|
+
reminder: "Fase REVIEW: Revise o código, verifique blast radius e garanta que nada quebrou. Exporte o grafo para revisão.",
|
|
76
|
+
suggestedTools: ["export", "stats", "velocity", "dependencies"],
|
|
77
|
+
principles: ["Code review obrigatório", "Blast radius check", "Non-regression rule"],
|
|
78
|
+
},
|
|
79
|
+
HANDOFF: {
|
|
80
|
+
reminder: "Fase HANDOFF: Crie o PR, documente decisões e exporte o grafo. Prepare para entrega.",
|
|
81
|
+
suggestedTools: ["export", "snapshot", "stats", "velocity"],
|
|
82
|
+
principles: ["Documentação como entrega", "Grafo exportado", "Knowledge base atualizada"],
|
|
83
|
+
},
|
|
84
|
+
LISTENING: {
|
|
85
|
+
reminder: "Fase LISTENING: Colete feedback e adicione novos nodes ao grafo. Inicie novo ciclo se necessário.",
|
|
86
|
+
suggestedTools: ["add_node", "import_prd", "search", "list"],
|
|
87
|
+
principles: ["Feedback contínuo", "Iteração incremental", "CLAUDE.md como spec evolutiva"],
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
export function getPhaseGuidance(phase) {
|
|
91
|
+
return GUIDANCE[phase];
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=lifecycle-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-phase.js","sourceRoot":"","sources":["../../../src/core/planner/lifecycle-phase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution planner: suggests the next best task to work on.
|
|
3
|
+
*
|
|
4
|
+
* Algorithm:
|
|
5
|
+
* 1. Filter nodes of type task/subtask with status backlog or ready
|
|
6
|
+
* 2. Eliminate nodes with unresolved depends_on edges (dependency target not done)
|
|
7
|
+
* 3. Eliminate nodes with blocked = true
|
|
8
|
+
* 4. Sort by: priority ASC, xpSize ASC, estimateMinutes ASC, createdAt ASC
|
|
9
|
+
*/
|
|
10
|
+
import type { GraphDocument, GraphNode } from "../graph/graph-types.js";
|
|
11
|
+
export interface NextTaskResult {
|
|
12
|
+
node: GraphNode;
|
|
13
|
+
reason: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function findNextTask(doc: GraphDocument): NextTaskResult | null;
|
|
16
|
+
//# sourceMappingURL=next-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-task.d.ts","sourceRoot":"","sources":["../../../src/core/planner/next-task.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAa,MAAM,yBAAyB,CAAC;AAOnF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI,CAgGtE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution planner: suggests the next best task to work on.
|
|
3
|
+
*
|
|
4
|
+
* Algorithm:
|
|
5
|
+
* 1. Filter nodes of type task/subtask with status backlog or ready
|
|
6
|
+
* 2. Eliminate nodes with unresolved depends_on edges (dependency target not done)
|
|
7
|
+
* 3. Eliminate nodes with blocked = true
|
|
8
|
+
* 4. Sort by: priority ASC, xpSize ASC, estimateMinutes ASC, createdAt ASC
|
|
9
|
+
*/
|
|
10
|
+
import { logger } from "../utils/logger.js";
|
|
11
|
+
const XP_SIZE_ORDER = {
|
|
12
|
+
XS: 1, S: 2, M: 3, L: 4, XL: 5,
|
|
13
|
+
};
|
|
14
|
+
export function findNextTask(doc) {
|
|
15
|
+
// Step 1: Filter eligible nodes
|
|
16
|
+
const eligible = doc.nodes.filter((n) => (n.type === "task" || n.type === "subtask") &&
|
|
17
|
+
(n.status === "backlog" || n.status === "ready") &&
|
|
18
|
+
!n.blocked);
|
|
19
|
+
logger.debug("Next task candidates", {
|
|
20
|
+
eligible: eligible.length,
|
|
21
|
+
total: doc.nodes.length,
|
|
22
|
+
});
|
|
23
|
+
if (eligible.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
// Step 2: Build a set of done node IDs for dependency checking
|
|
26
|
+
const doneIds = new Set(doc.nodes.filter((n) => n.status === "done").map((n) => n.id));
|
|
27
|
+
// Step 3: Find depends_on edges and filter out nodes with unresolved deps
|
|
28
|
+
const unblocked = eligible.filter((node) => {
|
|
29
|
+
const depsEdges = doc.edges.filter((e) => e.from === node.id && e.relationType === "depends_on");
|
|
30
|
+
// All dependency targets must be done
|
|
31
|
+
return depsEdges.every((e) => doneIds.has(e.to));
|
|
32
|
+
});
|
|
33
|
+
if (unblocked.length === 0) {
|
|
34
|
+
// All eligible tasks have unresolved dependencies — return the one with fewest deps
|
|
35
|
+
const withDepCount = eligible.map((node) => {
|
|
36
|
+
const deps = doc.edges.filter((e) => e.from === node.id && e.relationType === "depends_on" && !doneIds.has(e.to));
|
|
37
|
+
return { node, pendingDeps: deps.length };
|
|
38
|
+
});
|
|
39
|
+
withDepCount.sort((a, b) => a.pendingDeps - b.pendingDeps);
|
|
40
|
+
logger.debug("next:all-blocked", {
|
|
41
|
+
eligibleCount: eligible.length,
|
|
42
|
+
bestPendingDeps: withDepCount[0].pendingDeps,
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
node: withDepCount[0].node,
|
|
46
|
+
reason: `Todas as tasks têm dependências pendentes. Esta tem menos (${withDepCount[0].pendingDeps}).`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Step 4: Topological rank from priority_over edges (Kahn's algorithm)
|
|
50
|
+
const priorityRank = computePriorityRank(unblocked, doc.edges);
|
|
51
|
+
// Step 5: Sort
|
|
52
|
+
unblocked.sort((a, b) => {
|
|
53
|
+
// Priority_over topological rank ASC (lower rank = higher priority)
|
|
54
|
+
const rankA = priorityRank.get(a.id) ?? Infinity;
|
|
55
|
+
const rankB = priorityRank.get(b.id) ?? Infinity;
|
|
56
|
+
if (rankA !== rankB)
|
|
57
|
+
return rankA - rankB;
|
|
58
|
+
// Priority ASC (1 = critical, 5 = optional)
|
|
59
|
+
if (a.priority !== b.priority)
|
|
60
|
+
return a.priority - b.priority;
|
|
61
|
+
// XP size ASC
|
|
62
|
+
const sizeA = XP_SIZE_ORDER[a.xpSize || "M"] ?? 3;
|
|
63
|
+
const sizeB = XP_SIZE_ORDER[b.xpSize || "M"] ?? 3;
|
|
64
|
+
if (sizeA !== sizeB)
|
|
65
|
+
return sizeA - sizeB;
|
|
66
|
+
// Estimate ASC
|
|
67
|
+
const estA = a.estimateMinutes ?? 999;
|
|
68
|
+
const estB = b.estimateMinutes ?? 999;
|
|
69
|
+
if (estA !== estB)
|
|
70
|
+
return estA - estB;
|
|
71
|
+
// Prefer tasks with more acceptance criteria (clearer definition)
|
|
72
|
+
const acA = a.acceptanceCriteria?.length ?? 0;
|
|
73
|
+
const acB = b.acceptanceCriteria?.length ?? 0;
|
|
74
|
+
if (acA !== acB)
|
|
75
|
+
return acB - acA;
|
|
76
|
+
// CreatedAt ASC (older first)
|
|
77
|
+
return a.createdAt.localeCompare(b.createdAt);
|
|
78
|
+
});
|
|
79
|
+
const best = unblocked[0];
|
|
80
|
+
const reasons = ["desbloqueada"];
|
|
81
|
+
if (best.priority <= 2)
|
|
82
|
+
reasons.push("alta prioridade");
|
|
83
|
+
if (best.xpSize && XP_SIZE_ORDER[best.xpSize] <= 2)
|
|
84
|
+
reasons.push("baixa complexidade");
|
|
85
|
+
logger.debug("next:selected", {
|
|
86
|
+
nodeId: best.id,
|
|
87
|
+
title: best.title,
|
|
88
|
+
priority: best.priority,
|
|
89
|
+
candidatesCount: unblocked.length,
|
|
90
|
+
reason: reasons.join(", "),
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
node: best,
|
|
94
|
+
reason: reasons.join(", "),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Kahn's algorithm topological sort on priority_over edges.
|
|
99
|
+
* Returns a map of nodeId → rank (0 = highest priority).
|
|
100
|
+
* Nodes in cycles get no rank (treated as Infinity in sort).
|
|
101
|
+
*/
|
|
102
|
+
function computePriorityRank(candidates, edges) {
|
|
103
|
+
const candidateIds = new Set(candidates.map((n) => n.id));
|
|
104
|
+
const rank = new Map();
|
|
105
|
+
// Filter priority_over edges where both endpoints are in the candidate set
|
|
106
|
+
const relevantEdges = edges.filter((e) => e.relationType === "priority_over" &&
|
|
107
|
+
candidateIds.has(e.from) &&
|
|
108
|
+
candidateIds.has(e.to));
|
|
109
|
+
if (relevantEdges.length === 0)
|
|
110
|
+
return rank;
|
|
111
|
+
// Build adjacency list and in-degree count
|
|
112
|
+
const inDegree = new Map();
|
|
113
|
+
const adj = new Map();
|
|
114
|
+
for (const id of candidateIds) {
|
|
115
|
+
inDegree.set(id, 0);
|
|
116
|
+
adj.set(id, []);
|
|
117
|
+
}
|
|
118
|
+
for (const edge of relevantEdges) {
|
|
119
|
+
adj.get(edge.from).push(edge.to);
|
|
120
|
+
inDegree.set(edge.to, (inDegree.get(edge.to) ?? 0) + 1);
|
|
121
|
+
}
|
|
122
|
+
// Kahn's: start with nodes that have 0 in-degree
|
|
123
|
+
const queue = [];
|
|
124
|
+
for (const [id, deg] of inDegree) {
|
|
125
|
+
if (deg === 0)
|
|
126
|
+
queue.push(id);
|
|
127
|
+
}
|
|
128
|
+
let currentRank = 0;
|
|
129
|
+
while (queue.length > 0) {
|
|
130
|
+
const batch = [...queue];
|
|
131
|
+
queue.length = 0;
|
|
132
|
+
for (const id of batch) {
|
|
133
|
+
rank.set(id, currentRank);
|
|
134
|
+
for (const neighbor of adj.get(id) ?? []) {
|
|
135
|
+
const newDeg = (inDegree.get(neighbor) ?? 1) - 1;
|
|
136
|
+
inDegree.set(neighbor, newDeg);
|
|
137
|
+
if (newDeg === 0)
|
|
138
|
+
queue.push(neighbor);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
currentRank++;
|
|
142
|
+
}
|
|
143
|
+
// Nodes still not in rank are part of cycles — they get no rank (Infinity in sort)
|
|
144
|
+
return rank;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=next-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-task.js","sourceRoot":"","sources":["../../../src/core/planner/next-task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning Report — generates a structured report for sprint planning.
|
|
3
|
+
* Includes recommended order, missing docs, and risk assessment.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphDocument } from "../graph/graph-types.js";
|
|
6
|
+
import type { SqliteStore } from "../store/sqlite-store.js";
|
|
7
|
+
export interface PlanningReport {
|
|
8
|
+
/** Recommended task execution order */
|
|
9
|
+
recommendedOrder: Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
type: string;
|
|
13
|
+
priority: number;
|
|
14
|
+
xpSize: string;
|
|
15
|
+
reason: string;
|
|
16
|
+
}>;
|
|
17
|
+
/** Libraries or topics with missing documentation */
|
|
18
|
+
missingDocs: string[];
|
|
19
|
+
/** Risk assessment */
|
|
20
|
+
risks: Array<{
|
|
21
|
+
nodeId: string;
|
|
22
|
+
title: string;
|
|
23
|
+
risk: string;
|
|
24
|
+
severity: "low" | "medium" | "high";
|
|
25
|
+
}>;
|
|
26
|
+
/** Summary metrics */
|
|
27
|
+
summary: {
|
|
28
|
+
totalReady: number;
|
|
29
|
+
totalBlocked: number;
|
|
30
|
+
estimatedPoints: number;
|
|
31
|
+
avgVelocity: number | null;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate a planning report for the current sprint.
|
|
36
|
+
*/
|
|
37
|
+
export declare function generatePlanningReport(doc: GraphDocument, store: SqliteStore): PlanningReport;
|
|
38
|
+
//# sourceMappingURL=planning-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-report.d.ts","sourceRoot":"","sources":["../../../src/core/planner/planning-report.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM5D,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,gBAAgB,EAAE,KAAK,CAAC;QACtB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB;IACtB,KAAK,EAAE,KAAK,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;KACrC,CAAC,CAAC;IACH,sBAAsB;IACtB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,WAAW,GACjB,cAAc,CAiDhB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning Report — generates a structured report for sprint planning.
|
|
3
|
+
* Includes recommended order, missing docs, and risk assessment.
|
|
4
|
+
*/
|
|
5
|
+
import { KnowledgeStore } from "../store/knowledge-store.js";
|
|
6
|
+
import { findNextTask } from "./next-task.js";
|
|
7
|
+
import { calculateVelocity } from "./velocity.js";
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
/**
|
|
10
|
+
* Generate a planning report for the current sprint.
|
|
11
|
+
*/
|
|
12
|
+
export function generatePlanningReport(doc, store) {
|
|
13
|
+
const eligibleNodes = doc.nodes.filter((n) => (n.type === "task" || n.type === "subtask") &&
|
|
14
|
+
(n.status === "backlog" || n.status === "ready") &&
|
|
15
|
+
!n.blocked);
|
|
16
|
+
const blockedNodes = doc.nodes.filter((n) => (n.type === "task" || n.type === "subtask") &&
|
|
17
|
+
(n.status === "blocked" || n.blocked));
|
|
18
|
+
// Build recommended order using next-task algorithm iteratively
|
|
19
|
+
const recommendedOrder = buildRecommendedOrder(doc);
|
|
20
|
+
// Assess missing docs
|
|
21
|
+
const missingDocs = assessMissingDocs(store, eligibleNodes);
|
|
22
|
+
// Assess risks
|
|
23
|
+
const risks = assessRisks(doc, eligibleNodes, blockedNodes);
|
|
24
|
+
// Velocity
|
|
25
|
+
const velocity = calculateVelocity(doc);
|
|
26
|
+
const XP_POINTS = { XS: 1, S: 2, M: 3, L: 5, XL: 8 };
|
|
27
|
+
const estimatedPoints = eligibleNodes.reduce((sum, n) => sum + (XP_POINTS[n.xpSize ?? "M"] ?? 3), 0);
|
|
28
|
+
logger.info("Planning report generated", {
|
|
29
|
+
ready: eligibleNodes.length,
|
|
30
|
+
blocked: blockedNodes.length,
|
|
31
|
+
points: estimatedPoints,
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
recommendedOrder,
|
|
35
|
+
missingDocs,
|
|
36
|
+
risks,
|
|
37
|
+
summary: {
|
|
38
|
+
totalReady: eligibleNodes.length,
|
|
39
|
+
totalBlocked: blockedNodes.length,
|
|
40
|
+
estimatedPoints,
|
|
41
|
+
avgVelocity: velocity.overall.avgPointsPerSprint,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function buildRecommendedOrder(doc) {
|
|
46
|
+
// Clone the doc to simulate progressive execution
|
|
47
|
+
const remaining = new Set(doc.nodes
|
|
48
|
+
.filter((n) => (n.type === "task" || n.type === "subtask") &&
|
|
49
|
+
(n.status === "backlog" || n.status === "ready") &&
|
|
50
|
+
!n.blocked)
|
|
51
|
+
.map((n) => n.id));
|
|
52
|
+
const order = [];
|
|
53
|
+
const simulatedDone = new Set(doc.nodes.filter((n) => n.status === "done").map((n) => n.id));
|
|
54
|
+
// Iteratively pick next task (max 20 iterations)
|
|
55
|
+
for (let i = 0; i < 20 && remaining.size > 0; i++) {
|
|
56
|
+
const result = findNextTask({
|
|
57
|
+
...doc,
|
|
58
|
+
nodes: doc.nodes.map((n) => {
|
|
59
|
+
if (simulatedDone.has(n.id))
|
|
60
|
+
return { ...n, status: "done" };
|
|
61
|
+
return n;
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (!result || !remaining.has(result.node.id))
|
|
65
|
+
break;
|
|
66
|
+
order.push({
|
|
67
|
+
id: result.node.id,
|
|
68
|
+
title: result.node.title,
|
|
69
|
+
type: result.node.type,
|
|
70
|
+
priority: result.node.priority,
|
|
71
|
+
xpSize: result.node.xpSize ?? "M",
|
|
72
|
+
reason: result.reason,
|
|
73
|
+
});
|
|
74
|
+
simulatedDone.add(result.node.id);
|
|
75
|
+
remaining.delete(result.node.id);
|
|
76
|
+
}
|
|
77
|
+
return order;
|
|
78
|
+
}
|
|
79
|
+
function assessMissingDocs(store, nodes) {
|
|
80
|
+
try {
|
|
81
|
+
const knowledgeStore = new KnowledgeStore(store.getDb());
|
|
82
|
+
if (knowledgeStore.count() === 0)
|
|
83
|
+
return ["No knowledge documents indexed"];
|
|
84
|
+
const missing = [];
|
|
85
|
+
const checked = new Set();
|
|
86
|
+
for (const node of nodes) {
|
|
87
|
+
const tags = node.tags ?? [];
|
|
88
|
+
for (const tag of tags) {
|
|
89
|
+
if (checked.has(tag))
|
|
90
|
+
continue;
|
|
91
|
+
checked.add(tag);
|
|
92
|
+
const results = knowledgeStore.search(tag, 1);
|
|
93
|
+
if (results.length === 0) {
|
|
94
|
+
missing.push(tag);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return missing;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function assessRisks(doc, eligible, blocked) {
|
|
105
|
+
const risks = [];
|
|
106
|
+
// Blocked tasks are a risk
|
|
107
|
+
for (const node of blocked) {
|
|
108
|
+
risks.push({
|
|
109
|
+
nodeId: node.id,
|
|
110
|
+
title: node.title,
|
|
111
|
+
risk: "Task is blocked",
|
|
112
|
+
severity: "high",
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Tasks with many dependencies
|
|
116
|
+
for (const node of eligible) {
|
|
117
|
+
const deps = doc.edges.filter((e) => e.from === node.id && e.relationType === "depends_on");
|
|
118
|
+
if (deps.length >= 3) {
|
|
119
|
+
risks.push({
|
|
120
|
+
nodeId: node.id,
|
|
121
|
+
title: node.title,
|
|
122
|
+
risk: `Has ${deps.length} dependencies`,
|
|
123
|
+
severity: "medium",
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// XL tasks are risky
|
|
128
|
+
for (const node of eligible) {
|
|
129
|
+
if (node.xpSize === "XL") {
|
|
130
|
+
risks.push({
|
|
131
|
+
nodeId: node.id,
|
|
132
|
+
title: node.title,
|
|
133
|
+
risk: "Extra-large task — consider decomposing",
|
|
134
|
+
severity: "medium",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return risks;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=planning-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-report.js","sourceRoot":"","sources":["../../../src/core/planner/planning-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Velocity tracking: measures sprint completion metrics.
|
|
3
|
+
*
|
|
4
|
+
* Computes:
|
|
5
|
+
* - Tasks completed per sprint
|
|
6
|
+
* - Average XP size completed
|
|
7
|
+
* - Estimated completion time (based on created→done timestamps)
|
|
8
|
+
*/
|
|
9
|
+
import type { GraphDocument } from "../graph/graph-types.js";
|
|
10
|
+
export interface SprintVelocity {
|
|
11
|
+
sprint: string;
|
|
12
|
+
tasksCompleted: number;
|
|
13
|
+
totalPoints: number;
|
|
14
|
+
avgPointsPerTask: number;
|
|
15
|
+
avgCompletionHours: number | null;
|
|
16
|
+
tasks: VelocityTask[];
|
|
17
|
+
}
|
|
18
|
+
export interface VelocityTask {
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
xpSize: string;
|
|
22
|
+
points: number;
|
|
23
|
+
completionHours: number | null;
|
|
24
|
+
}
|
|
25
|
+
export interface VelocitySummary {
|
|
26
|
+
sprints: SprintVelocity[];
|
|
27
|
+
overall: {
|
|
28
|
+
totalTasksCompleted: number;
|
|
29
|
+
totalPoints: number;
|
|
30
|
+
avgPointsPerSprint: number;
|
|
31
|
+
avgCompletionHours: number | null;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate velocity metrics for all sprints in the graph.
|
|
36
|
+
*/
|
|
37
|
+
export declare function calculateVelocity(doc: GraphDocument): VelocitySummary;
|
|
38
|
+
//# sourceMappingURL=velocity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"velocity.d.ts","sourceRoot":"","sources":["../../../src/core/planner/velocity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,yBAAyB,CAAC;AAOxE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE;QACP,mBAAmB,EAAE,MAAM,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAwErE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Velocity tracking: measures sprint completion metrics.
|
|
3
|
+
*
|
|
4
|
+
* Computes:
|
|
5
|
+
* - Tasks completed per sprint
|
|
6
|
+
* - Average XP size completed
|
|
7
|
+
* - Estimated completion time (based on created→done timestamps)
|
|
8
|
+
*/
|
|
9
|
+
import { logger } from "../utils/logger.js";
|
|
10
|
+
const XP_SIZE_POINTS = {
|
|
11
|
+
XS: 1, S: 2, M: 3, L: 5, XL: 8,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Calculate velocity metrics for all sprints in the graph.
|
|
15
|
+
*/
|
|
16
|
+
export function calculateVelocity(doc) {
|
|
17
|
+
// Group done tasks by sprint
|
|
18
|
+
const doneTasks = doc.nodes.filter((n) => n.status === "done" && (n.type === "task" || n.type === "subtask"));
|
|
19
|
+
const bySprint = new Map();
|
|
20
|
+
for (const node of doneTasks) {
|
|
21
|
+
const sprint = node.sprint ?? "(no sprint)";
|
|
22
|
+
const group = bySprint.get(sprint) ?? [];
|
|
23
|
+
group.push(node);
|
|
24
|
+
bySprint.set(sprint, group);
|
|
25
|
+
}
|
|
26
|
+
const sprints = [];
|
|
27
|
+
for (const [sprint, tasks] of bySprint) {
|
|
28
|
+
const velocityTasks = tasks.map((t) => {
|
|
29
|
+
const points = XP_SIZE_POINTS[t.xpSize ?? "M"] ?? 3;
|
|
30
|
+
const completionHours = computeCompletionHours(t);
|
|
31
|
+
return {
|
|
32
|
+
id: t.id,
|
|
33
|
+
title: t.title,
|
|
34
|
+
xpSize: t.xpSize ?? "M",
|
|
35
|
+
points,
|
|
36
|
+
completionHours,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
const totalPoints = velocityTasks.reduce((sum, t) => sum + t.points, 0);
|
|
40
|
+
const hoursValues = velocityTasks
|
|
41
|
+
.map((t) => t.completionHours)
|
|
42
|
+
.filter((h) => h !== null);
|
|
43
|
+
sprints.push({
|
|
44
|
+
sprint,
|
|
45
|
+
tasksCompleted: tasks.length,
|
|
46
|
+
totalPoints,
|
|
47
|
+
avgPointsPerTask: tasks.length > 0 ? Math.round((totalPoints / tasks.length) * 10) / 10 : 0,
|
|
48
|
+
avgCompletionHours: hoursValues.length > 0
|
|
49
|
+
? Math.round((hoursValues.reduce((a, b) => a + b, 0) / hoursValues.length) * 10) / 10
|
|
50
|
+
: null,
|
|
51
|
+
tasks: velocityTasks,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Sort sprints by name
|
|
55
|
+
sprints.sort((a, b) => a.sprint.localeCompare(b.sprint));
|
|
56
|
+
const totalTasksCompleted = doneTasks.length;
|
|
57
|
+
const totalPoints = sprints.reduce((sum, s) => sum + s.totalPoints, 0);
|
|
58
|
+
const sprintCount = sprints.filter((s) => s.sprint !== "(no sprint)").length || 1;
|
|
59
|
+
const allHours = sprints
|
|
60
|
+
.flatMap((s) => s.tasks)
|
|
61
|
+
.map((t) => t.completionHours)
|
|
62
|
+
.filter((h) => h !== null);
|
|
63
|
+
logger.info(`Velocity: ${totalTasksCompleted} tasks done, ${totalPoints} points across ${sprints.length} sprints`);
|
|
64
|
+
return {
|
|
65
|
+
sprints,
|
|
66
|
+
overall: {
|
|
67
|
+
totalTasksCompleted,
|
|
68
|
+
totalPoints,
|
|
69
|
+
avgPointsPerSprint: Math.round((totalPoints / sprintCount) * 10) / 10,
|
|
70
|
+
avgCompletionHours: allHours.length > 0
|
|
71
|
+
? Math.round((allHours.reduce((a, b) => a + b, 0) / allHours.length) * 10) / 10
|
|
72
|
+
: null,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Estimate completion time in hours from createdAt to updatedAt.
|
|
78
|
+
* Returns null if timestamps are invalid or equal.
|
|
79
|
+
*/
|
|
80
|
+
function computeCompletionHours(node) {
|
|
81
|
+
try {
|
|
82
|
+
const created = new Date(node.createdAt).getTime();
|
|
83
|
+
const updated = new Date(node.updatedAt).getTime();
|
|
84
|
+
if (isNaN(created) || isNaN(updated) || updated <= created)
|
|
85
|
+
return null;
|
|
86
|
+
return Math.round(((updated - created) / (1000 * 60 * 60)) * 10) / 10;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=velocity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"velocity.js","sourceRoot":"","sources":["../../../src/core/planner/velocity.ts"],"names":[],"mappings":"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"}
|