mcp-adr-analysis-server 2.1.9 → 2.1.19
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/README.md +55 -8
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/index.d.ts +78 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1793 -577
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompts/index.d.ts.map +1 -1
- package/dist/src/prompts/index.js +23 -6
- package/dist/src/prompts/index.js.map +1 -1
- package/dist/src/prompts/validated-pattern-prompts.d.ts +33 -0
- package/dist/src/prompts/validated-pattern-prompts.d.ts.map +1 -0
- package/dist/src/prompts/validated-pattern-prompts.js +337 -0
- package/dist/src/prompts/validated-pattern-prompts.js.map +1 -0
- package/dist/src/resources/adr-by-id-resource.d.ts +116 -0
- package/dist/src/resources/adr-by-id-resource.d.ts.map +1 -0
- package/dist/src/resources/adr-by-id-resource.js +213 -0
- package/dist/src/resources/adr-by-id-resource.js.map +1 -0
- package/dist/src/resources/code-quality-resource.d.ts +105 -0
- package/dist/src/resources/code-quality-resource.d.ts.map +1 -0
- package/dist/src/resources/code-quality-resource.js +282 -0
- package/dist/src/resources/code-quality-resource.js.map +1 -0
- package/dist/src/resources/deployment-history-resource.d.ts +214 -0
- package/dist/src/resources/deployment-history-resource.d.ts.map +1 -0
- package/dist/src/resources/deployment-history-resource.js +308 -0
- package/dist/src/resources/deployment-history-resource.js.map +1 -0
- package/dist/src/resources/deployment-status-resource.d.ts +256 -0
- package/dist/src/resources/deployment-status-resource.d.ts.map +1 -0
- package/dist/src/resources/deployment-status-resource.js +665 -0
- package/dist/src/resources/deployment-status-resource.js.map +1 -0
- package/dist/src/resources/environment-analysis-resource.d.ts +237 -0
- package/dist/src/resources/environment-analysis-resource.d.ts.map +1 -0
- package/dist/src/resources/environment-analysis-resource.js +646 -0
- package/dist/src/resources/environment-analysis-resource.js.map +1 -0
- package/dist/src/resources/index.d.ts +6 -2
- package/dist/src/resources/index.d.ts.map +1 -1
- package/dist/src/resources/index.js +247 -492
- package/dist/src/resources/index.js.map +1 -1
- package/dist/src/resources/memory-snapshots-resource.d.ts +180 -0
- package/dist/src/resources/memory-snapshots-resource.d.ts.map +1 -0
- package/dist/src/resources/memory-snapshots-resource.js +847 -0
- package/dist/src/resources/memory-snapshots-resource.js.map +1 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.d.ts +35 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.d.ts.map +1 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.js +72 -0
- package/dist/src/resources/pattern-base-code-by-platform-resource.js.map +1 -0
- package/dist/src/resources/pattern-by-name-resource.d.ts +53 -0
- package/dist/src/resources/pattern-by-name-resource.d.ts.map +1 -0
- package/dist/src/resources/pattern-by-name-resource.js +200 -0
- package/dist/src/resources/pattern-by-name-resource.js.map +1 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.d.ts +26 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.d.ts.map +1 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.js +59 -0
- package/dist/src/resources/pattern-sources-by-platform-resource.js.map +1 -0
- package/dist/src/resources/project-metrics-resource.d.ts +180 -0
- package/dist/src/resources/project-metrics-resource.d.ts.map +1 -0
- package/dist/src/resources/project-metrics-resource.js +487 -0
- package/dist/src/resources/project-metrics-resource.js.map +1 -0
- package/dist/src/resources/project-status-resource.d.ts +75 -0
- package/dist/src/resources/project-status-resource.d.ts.map +1 -0
- package/dist/src/resources/project-status-resource.js +189 -0
- package/dist/src/resources/project-status-resource.js.map +1 -0
- package/dist/src/resources/research-by-topic-resource.d.ts +21 -0
- package/dist/src/resources/research-by-topic-resource.d.ts.map +1 -0
- package/dist/src/resources/research-by-topic-resource.js +125 -0
- package/dist/src/resources/research-by-topic-resource.js.map +1 -0
- package/dist/src/resources/research-index-resource.d.ts +100 -0
- package/dist/src/resources/research-index-resource.d.ts.map +1 -0
- package/dist/src/resources/research-index-resource.js +200 -0
- package/dist/src/resources/research-index-resource.js.map +1 -0
- package/dist/src/resources/resource-cache.d.ts +144 -0
- package/dist/src/resources/resource-cache.d.ts.map +1 -0
- package/dist/src/resources/resource-cache.js +316 -0
- package/dist/src/resources/resource-cache.js.map +1 -0
- package/dist/src/resources/resource-router.d.ts +45 -0
- package/dist/src/resources/resource-router.d.ts.map +1 -0
- package/dist/src/resources/resource-router.js +96 -0
- package/dist/src/resources/resource-router.js.map +1 -0
- package/dist/src/resources/rule-by-id-resource.d.ts +38 -0
- package/dist/src/resources/rule-by-id-resource.d.ts.map +1 -0
- package/dist/src/resources/rule-by-id-resource.js +104 -0
- package/dist/src/resources/rule-by-id-resource.js.map +1 -0
- package/dist/src/resources/rule-catalog-resource.d.ts +126 -0
- package/dist/src/resources/rule-catalog-resource.d.ts.map +1 -0
- package/dist/src/resources/rule-catalog-resource.js +224 -0
- package/dist/src/resources/rule-catalog-resource.js.map +1 -0
- package/dist/src/resources/rule-generation-resource.d.ts +80 -0
- package/dist/src/resources/rule-generation-resource.d.ts.map +1 -0
- package/dist/src/resources/rule-generation-resource.js +282 -0
- package/dist/src/resources/rule-generation-resource.js.map +1 -0
- package/dist/src/resources/technology-by-name-resource.d.ts +43 -0
- package/dist/src/resources/technology-by-name-resource.d.ts.map +1 -0
- package/dist/src/resources/technology-by-name-resource.js +176 -0
- package/dist/src/resources/technology-by-name-resource.js.map +1 -0
- package/dist/src/resources/todo-by-id-resource.d.ts +46 -0
- package/dist/src/resources/todo-by-id-resource.d.ts.map +1 -0
- package/dist/src/resources/todo-by-id-resource.js +192 -0
- package/dist/src/resources/todo-by-id-resource.js.map +1 -0
- package/dist/src/resources/todo-list-resource.d.ts +96 -0
- package/dist/src/resources/todo-list-resource.d.ts.map +1 -0
- package/dist/src/resources/todo-list-resource.js +209 -0
- package/dist/src/resources/todo-list-resource.js.map +1 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.d.ts +14 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.d.ts.map +1 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.js +45 -0
- package/dist/src/resources/validated-pattern-by-platform-resource.js.map +1 -0
- package/dist/src/resources/validated-patterns-catalog-resource.d.ts +36 -0
- package/dist/src/resources/validated-patterns-catalog-resource.d.ts.map +1 -0
- package/dist/src/resources/validated-patterns-catalog-resource.js +57 -0
- package/dist/src/resources/validated-patterns-catalog-resource.js.map +1 -0
- package/dist/src/templates/domain-knowledge-templates.d.ts.map +1 -1
- package/dist/src/templates/domain-knowledge-templates.js +49 -49
- package/dist/src/templates/domain-knowledge-templates.js.map +1 -1
- package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-bootstrap-validation-tool.js +214 -4
- package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.d.ts +2 -2
- package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.js +129 -12
- package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
- package/dist/src/tools/adr-validation-tool.d.ts +98 -0
- package/dist/src/tools/adr-validation-tool.d.ts.map +1 -0
- package/dist/src/tools/adr-validation-tool.js +372 -0
- package/dist/src/tools/adr-validation-tool.js.map +1 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +262 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.js +1934 -0
- package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -0
- package/dist/src/tools/conversation-memory-tool.d.ts +48 -0
- package/dist/src/tools/conversation-memory-tool.d.ts.map +1 -0
- package/dist/src/tools/conversation-memory-tool.js +254 -0
- package/dist/src/tools/conversation-memory-tool.js.map +1 -0
- package/dist/src/tools/deployment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-analysis-tool.js +82 -6
- package/dist/src/tools/deployment-analysis-tool.js.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-guidance-tool.js +126 -25
- package/dist/src/tools/deployment-guidance-tool.js.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.js +166 -5
- package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
- package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/environment-analysis-tool.js +36 -1
- package/dist/src/tools/environment-analysis-tool.js.map +1 -1
- package/dist/src/tools/expand-analysis-tool.d.ts +23 -0
- package/dist/src/tools/expand-analysis-tool.d.ts.map +1 -0
- package/dist/src/tools/expand-analysis-tool.js +107 -0
- package/dist/src/tools/expand-analysis-tool.js.map +1 -0
- package/dist/src/tools/get-server-context-tool.d.ts +67 -0
- package/dist/src/tools/get-server-context-tool.d.ts.map +1 -0
- package/dist/src/tools/get-server-context-tool.js +75 -0
- package/dist/src/tools/get-server-context-tool.js.map +1 -0
- package/dist/src/tools/interactive-adr-planning-tool.d.ts.map +1 -1
- package/dist/src/tools/interactive-adr-planning-tool.js +82 -9
- package/dist/src/tools/interactive-adr-planning-tool.js.map +1 -1
- package/dist/src/tools/llm-cloud-management-tool.d.ts +62 -0
- package/dist/src/tools/llm-cloud-management-tool.d.ts.map +1 -0
- package/dist/src/tools/llm-cloud-management-tool.js +202 -0
- package/dist/src/tools/llm-cloud-management-tool.js.map +1 -0
- package/dist/src/tools/llm-database-management-tool.d.ts +62 -0
- package/dist/src/tools/llm-database-management-tool.d.ts.map +1 -0
- package/dist/src/tools/llm-database-management-tool.js +203 -0
- package/dist/src/tools/llm-database-management-tool.js.map +1 -0
- package/dist/src/tools/llm-web-search-tool.d.ts +59 -0
- package/dist/src/tools/llm-web-search-tool.d.ts.map +1 -0
- package/dist/src/tools/llm-web-search-tool.js +165 -0
- package/dist/src/tools/llm-web-search-tool.js.map +1 -0
- package/dist/src/tools/mcp-planning-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-planning-tool.js +10 -3
- package/dist/src/tools/mcp-planning-tool.js.map +1 -1
- package/dist/src/tools/memory-loading-tool.d.ts.map +1 -1
- package/dist/src/tools/memory-loading-tool.js +4 -2
- package/dist/src/tools/memory-loading-tool.js.map +1 -1
- package/dist/src/tools/perform-research-tool.d.ts +61 -0
- package/dist/src/tools/perform-research-tool.d.ts.map +1 -0
- package/dist/src/tools/perform-research-tool.js +324 -0
- package/dist/src/tools/perform-research-tool.js.map +1 -0
- package/dist/src/tools/research-question-tool.d.ts.map +1 -1
- package/dist/src/tools/research-question-tool.js +11 -9
- package/dist/src/tools/research-question-tool.js.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.js +42 -3
- package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.d.ts +15 -94
- package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.js +2 -2
- package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +25 -120
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +91 -2
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
- package/dist/src/types/ape-framework.d.ts +50 -283
- package/dist/src/types/ape-framework.d.ts.map +1 -1
- package/dist/src/types/conversation-context.d.ts.map +1 -1
- package/dist/src/types/conversation-context.js +12 -12
- package/dist/src/types/conversation-context.js.map +1 -1
- package/dist/src/types/conversation-memory.d.ts +184 -0
- package/dist/src/types/conversation-memory.d.ts.map +1 -0
- package/dist/src/types/conversation-memory.js +8 -0
- package/dist/src/types/conversation-memory.js.map +1 -0
- package/dist/src/types/index.d.ts +112 -339
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/knowledge-generation.d.ts +96 -401
- package/dist/src/types/knowledge-generation.d.ts.map +1 -1
- package/dist/src/types/knowledge-graph-schemas.d.ts +77 -715
- package/dist/src/types/knowledge-graph-schemas.d.ts.map +1 -1
- package/dist/src/types/knowledge-graph-schemas.js +8 -8
- package/dist/src/types/knowledge-graph-schemas.js.map +1 -1
- package/dist/src/types/memory-entities.d.ts +1230 -6164
- package/dist/src/types/memory-entities.d.ts.map +1 -1
- package/dist/src/types/memory-entities.js +8 -8
- package/dist/src/types/memory-entities.js.map +1 -1
- package/dist/src/types/reflexion-framework.d.ts +35 -264
- package/dist/src/types/reflexion-framework.d.ts.map +1 -1
- package/dist/src/types/reflexion-framework.js +1 -1
- package/dist/src/types/reflexion-framework.js.map +1 -1
- package/dist/src/types/state-reinforcement.d.ts +87 -0
- package/dist/src/types/state-reinforcement.d.ts.map +1 -0
- package/dist/src/types/state-reinforcement.js +5 -0
- package/dist/src/types/state-reinforcement.js.map +1 -0
- package/dist/src/types/tiered-response.d.ts +61 -0
- package/dist/src/types/tiered-response.d.ts.map +1 -0
- package/dist/src/types/tiered-response.js +8 -0
- package/dist/src/types/tiered-response.js.map +1 -0
- package/dist/src/types/tool-context.d.ts +50 -0
- package/dist/src/types/tool-context.d.ts.map +1 -0
- package/dist/src/types/tool-context.js +20 -0
- package/dist/src/types/tool-context.js.map +1 -0
- package/dist/src/utils/adr-action-analyzer.d.ts +23 -0
- package/dist/src/utils/adr-action-analyzer.d.ts.map +1 -0
- package/dist/src/utils/adr-action-analyzer.js +323 -0
- package/dist/src/utils/adr-action-analyzer.js.map +1 -0
- package/dist/src/utils/adr-context-detector.d.ts +33 -0
- package/dist/src/utils/adr-context-detector.d.ts.map +1 -0
- package/dist/src/utils/adr-context-detector.js +279 -0
- package/dist/src/utils/adr-context-detector.js.map +1 -0
- package/dist/src/utils/adr-discovery.d.ts +28 -2
- package/dist/src/utils/adr-discovery.d.ts.map +1 -1
- package/dist/src/utils/adr-discovery.js +91 -7
- package/dist/src/utils/adr-discovery.js.map +1 -1
- package/dist/src/utils/adr-knowledge-initializer.d.ts +54 -0
- package/dist/src/utils/adr-knowledge-initializer.d.ts.map +1 -0
- package/dist/src/utils/adr-knowledge-initializer.js +240 -0
- package/dist/src/utils/adr-knowledge-initializer.js.map +1 -0
- package/dist/src/utils/adr-timeline-extractor.d.ts +21 -0
- package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -0
- package/dist/src/utils/adr-timeline-extractor.js +294 -0
- package/dist/src/utils/adr-timeline-extractor.js.map +1 -0
- package/dist/src/utils/adr-timeline-types.d.ts +234 -0
- package/dist/src/utils/adr-timeline-types.d.ts.map +1 -0
- package/dist/src/utils/adr-timeline-types.js +7 -0
- package/dist/src/utils/adr-timeline-types.js.map +1 -0
- package/dist/src/utils/ai-executor.d.ts +36 -0
- package/dist/src/utils/ai-executor.d.ts.map +1 -1
- package/dist/src/utils/ai-executor.js +39 -3
- package/dist/src/utils/ai-executor.js.map +1 -1
- package/dist/src/utils/apply-cot-enhancement.d.ts.map +1 -1
- package/dist/src/utils/apply-cot-enhancement.js +15 -15
- package/dist/src/utils/apply-cot-enhancement.js.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.js +68 -58
- package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
- package/dist/src/utils/conditional-request.d.ts +105 -0
- package/dist/src/utils/conditional-request.d.ts.map +1 -0
- package/dist/src/utils/conditional-request.js +186 -0
- package/dist/src/utils/conditional-request.js.map +1 -0
- package/dist/src/utils/config.d.ts +72 -18
- package/dist/src/utils/config.d.ts.map +1 -1
- package/dist/src/utils/config.js +75 -0
- package/dist/src/utils/config.js.map +1 -1
- package/dist/src/utils/context-document-manager.d.ts +112 -0
- package/dist/src/utils/context-document-manager.d.ts.map +1 -0
- package/dist/src/utils/context-document-manager.js +351 -0
- package/dist/src/utils/context-document-manager.js.map +1 -0
- package/dist/src/utils/conversation-memory-manager.d.ts +86 -0
- package/dist/src/utils/conversation-memory-manager.d.ts.map +1 -0
- package/dist/src/utils/conversation-memory-manager.js +443 -0
- package/dist/src/utils/conversation-memory-manager.js.map +1 -0
- package/dist/src/utils/dag-executor.d.ts +106 -0
- package/dist/src/utils/dag-executor.d.ts.map +1 -0
- package/dist/src/utils/dag-executor.js +420 -0
- package/dist/src/utils/dag-executor.js.map +1 -0
- package/dist/src/utils/deployment-analysis.d.ts.map +1 -1
- package/dist/src/utils/deployment-analysis.js +17 -9
- package/dist/src/utils/deployment-analysis.js.map +1 -1
- package/dist/src/utils/deployment-type-registry.d.ts +52 -0
- package/dist/src/utils/deployment-type-registry.d.ts.map +1 -0
- package/dist/src/utils/deployment-type-registry.js +543 -0
- package/dist/src/utils/deployment-type-registry.js.map +1 -0
- package/dist/src/utils/dynamic-deployment-intelligence.d.ts +117 -0
- package/dist/src/utils/dynamic-deployment-intelligence.d.ts.map +1 -0
- package/dist/src/utils/dynamic-deployment-intelligence.js +445 -0
- package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -0
- package/dist/src/utils/environment-analysis.d.ts.map +1 -1
- package/dist/src/utils/environment-analysis.js +63 -44
- package/dist/src/utils/environment-analysis.js.map +1 -1
- package/dist/src/utils/environment-capability-registry.d.ts +101 -0
- package/dist/src/utils/environment-capability-registry.d.ts.map +1 -0
- package/dist/src/utils/environment-capability-registry.js +489 -0
- package/dist/src/utils/environment-capability-registry.js.map +1 -0
- package/dist/src/utils/index.d.ts +3 -3
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +3 -3
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/knowledge-generation.d.ts.map +1 -1
- package/dist/src/utils/knowledge-generation.js +61 -35
- package/dist/src/utils/knowledge-generation.js.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.d.ts +19 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.js +165 -1
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
- package/dist/src/utils/llm-artifact-detector.d.ts.map +1 -1
- package/dist/src/utils/llm-artifact-detector.js +28 -24
- package/dist/src/utils/llm-artifact-detector.js.map +1 -1
- package/dist/src/utils/mermaid-diagrams.d.ts +101 -0
- package/dist/src/utils/mermaid-diagrams.d.ts.map +1 -0
- package/dist/src/utils/mermaid-diagrams.js +445 -0
- package/dist/src/utils/mermaid-diagrams.js.map +1 -0
- package/dist/src/utils/monitoring.d.ts +249 -0
- package/dist/src/utils/monitoring.d.ts.map +1 -0
- package/dist/src/utils/monitoring.js +513 -0
- package/dist/src/utils/monitoring.js.map +1 -0
- package/dist/src/utils/pattern-contribution-helper.d.ts +60 -0
- package/dist/src/utils/pattern-contribution-helper.d.ts.map +1 -0
- package/dist/src/utils/pattern-contribution-helper.js +308 -0
- package/dist/src/utils/pattern-contribution-helper.js.map +1 -0
- package/dist/src/utils/pattern-loader.d.ts +183 -0
- package/dist/src/utils/pattern-loader.d.ts.map +1 -0
- package/dist/src/utils/pattern-loader.js +200 -0
- package/dist/src/utils/pattern-loader.js.map +1 -0
- package/dist/src/utils/pattern-research-utility.d.ts +107 -0
- package/dist/src/utils/pattern-research-utility.d.ts.map +1 -0
- package/dist/src/utils/pattern-research-utility.js +360 -0
- package/dist/src/utils/pattern-research-utility.js.map +1 -0
- package/dist/src/utils/pattern-to-dag-converter.d.ts +62 -0
- package/dist/src/utils/pattern-to-dag-converter.d.ts.map +1 -0
- package/dist/src/utils/pattern-to-dag-converter.js +265 -0
- package/dist/src/utils/pattern-to-dag-converter.js.map +1 -0
- package/dist/src/utils/platform-detector.d.ts +86 -0
- package/dist/src/utils/platform-detector.d.ts.map +1 -0
- package/dist/src/utils/platform-detector.js +509 -0
- package/dist/src/utils/platform-detector.js.map +1 -0
- package/dist/src/utils/prompt-composition.d.ts.map +1 -1
- package/dist/src/utils/prompt-composition.js +1 -4
- package/dist/src/utils/prompt-composition.js.map +1 -1
- package/dist/src/utils/reflexion.d.ts.map +1 -1
- package/dist/src/utils/reflexion.js +51 -42
- package/dist/src/utils/reflexion.js.map +1 -1
- package/dist/src/utils/research-integration.d.ts.map +1 -1
- package/dist/src/utils/research-integration.js +8 -2
- package/dist/src/utils/research-integration.js.map +1 -1
- package/dist/src/utils/research-orchestrator.d.ts +209 -0
- package/dist/src/utils/research-orchestrator.d.ts.map +1 -0
- package/dist/src/utils/research-orchestrator.js +863 -0
- package/dist/src/utils/research-orchestrator.js.map +1 -0
- package/dist/src/utils/research-questions.d.ts.map +1 -1
- package/dist/src/utils/research-questions.js +4 -1
- package/dist/src/utils/research-questions.js.map +1 -1
- package/dist/src/utils/resource-extractor.d.ts +57 -0
- package/dist/src/utils/resource-extractor.d.ts.map +1 -0
- package/dist/src/utils/resource-extractor.js +323 -0
- package/dist/src/utils/resource-extractor.js.map +1 -0
- package/dist/src/utils/resource-versioning.d.ts +124 -0
- package/dist/src/utils/resource-versioning.d.ts.map +1 -0
- package/dist/src/utils/resource-versioning.js +272 -0
- package/dist/src/utils/resource-versioning.js.map +1 -0
- package/dist/src/utils/root-manager.d.ts +118 -0
- package/dist/src/utils/root-manager.d.ts.map +1 -0
- package/dist/src/utils/root-manager.js +154 -0
- package/dist/src/utils/root-manager.js.map +1 -0
- package/dist/src/utils/rule-generation.d.ts.map +1 -1
- package/dist/src/utils/rule-generation.js +4 -1
- package/dist/src/utils/rule-generation.js.map +1 -1
- package/dist/src/utils/server-context-generator.d.ts +47 -0
- package/dist/src/utils/server-context-generator.d.ts.map +1 -0
- package/dist/src/utils/server-context-generator.js +666 -0
- package/dist/src/utils/server-context-generator.js.map +1 -0
- package/dist/src/utils/state-reinforcement-manager.d.ts +60 -0
- package/dist/src/utils/state-reinforcement-manager.d.ts.map +1 -0
- package/dist/src/utils/state-reinforcement-manager.js +200 -0
- package/dist/src/utils/state-reinforcement-manager.js.map +1 -0
- package/dist/src/utils/system-card-manager.d.ts +194 -0
- package/dist/src/utils/system-card-manager.d.ts.map +1 -0
- package/dist/src/utils/system-card-manager.js +336 -0
- package/dist/src/utils/system-card-manager.js.map +1 -0
- package/dist/src/utils/tiered-response-manager.d.ts +40 -0
- package/dist/src/utils/tiered-response-manager.d.ts.map +1 -0
- package/dist/src/utils/tiered-response-manager.js +243 -0
- package/dist/src/utils/tiered-response-manager.js.map +1 -0
- package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/src/utils/tree-sitter-analyzer.js +83 -11
- package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
- package/dist/src/utils/validated-pattern-definitions.d.ts +219 -0
- package/dist/src/utils/validated-pattern-definitions.d.ts.map +1 -0
- package/dist/src/utils/validated-pattern-definitions.js +1511 -0
- package/dist/src/utils/validated-pattern-definitions.js.map +1 -0
- package/package.json +21 -12
- package/dist/src/prompts/todo-prompts.d.ts +0 -49
- package/dist/src/prompts/todo-prompts.d.ts.map +0 -1
- package/dist/src/prompts/todo-prompts.js +0 -824
- package/dist/src/prompts/todo-prompts.js.map +0 -1
- package/dist/src/types/todo-json-schemas.d.ts +0 -17
- package/dist/src/types/todo-json-schemas.d.ts.map +0 -1
- package/dist/src/types/todo-json-schemas.js +0 -9
- package/dist/src/types/todo-json-schemas.js.map +0 -1
- package/dist/src/utils/todo-file-watcher.d.ts +0 -14
- package/dist/src/utils/todo-file-watcher.d.ts.map +0 -1
- package/dist/src/utils/todo-file-watcher.js +0 -25
- package/dist/src/utils/todo-file-watcher.js.map +0 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR Knowledge Initializer
|
|
3
|
+
*
|
|
4
|
+
* Initializes the knowledge base with existing ADRs from the project
|
|
5
|
+
* on first run of analyze_project_ecosystem. This ensures that future
|
|
6
|
+
* ADR suggestions and analysis build on established architectural decisions.
|
|
7
|
+
*/
|
|
8
|
+
import { discoverAdrsInDirectory } from './adr-discovery.js';
|
|
9
|
+
import { createLogger } from './config.js';
|
|
10
|
+
const logger = createLogger({ logLevel: process.env['LOG_LEVEL'] || 'info' });
|
|
11
|
+
/**
|
|
12
|
+
* Initialize knowledge base with existing ADRs
|
|
13
|
+
*
|
|
14
|
+
* @param kgManager - Knowledge graph manager instance
|
|
15
|
+
* @param adrDirectory - Directory containing ADRs
|
|
16
|
+
* @param projectPath - Root project path
|
|
17
|
+
* @returns Promise resolving to initialization result
|
|
18
|
+
*/
|
|
19
|
+
export async function initializeAdrKnowledgeBase(kgManager, adrDirectory, projectPath) {
|
|
20
|
+
logger.info(`Initializing ADR knowledge base from: ${adrDirectory}`);
|
|
21
|
+
const errors = [];
|
|
22
|
+
const nodes = [];
|
|
23
|
+
try {
|
|
24
|
+
// Discover all existing ADRs
|
|
25
|
+
const discoveryResult = await discoverAdrsInDirectory(adrDirectory, projectPath, {
|
|
26
|
+
includeContent: true,
|
|
27
|
+
includeTimeline: false,
|
|
28
|
+
});
|
|
29
|
+
logger.info(`Discovered ${discoveryResult.totalAdrs} ADRs for knowledge base initialization`);
|
|
30
|
+
if (discoveryResult.totalAdrs === 0) {
|
|
31
|
+
logger.info('No ADRs found - skipping knowledge base initialization');
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
adrsIndexed: 0,
|
|
35
|
+
nodes: [],
|
|
36
|
+
errors: [],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Parse and index each ADR
|
|
40
|
+
for (const adr of discoveryResult.adrs) {
|
|
41
|
+
try {
|
|
42
|
+
const node = await indexAdrToKnowledgeGraph(adr, discoveryResult.adrs, kgManager);
|
|
43
|
+
nodes.push(node);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const errorMsg = `Failed to index ADR ${adr.filename}: ${error instanceof Error ? error.message : String(error)}`;
|
|
47
|
+
logger.warn(errorMsg);
|
|
48
|
+
errors.push(errorMsg);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Create relationships between ADRs
|
|
52
|
+
await createAdrRelationships(nodes, kgManager);
|
|
53
|
+
logger.info(`✅ Successfully initialized ADR knowledge base with ${nodes.length} ADRs`);
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
adrsIndexed: nodes.length,
|
|
57
|
+
nodes,
|
|
58
|
+
errors,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const errorMsg = `Failed to initialize ADR knowledge base: ${error instanceof Error ? error.message : String(error)}`;
|
|
63
|
+
logger.error(errorMsg);
|
|
64
|
+
errors.push(errorMsg);
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
adrsIndexed: 0,
|
|
68
|
+
nodes: [],
|
|
69
|
+
errors,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Index a single ADR to the knowledge graph
|
|
75
|
+
*/
|
|
76
|
+
async function indexAdrToKnowledgeGraph(adr, allAdrs, kgManager) {
|
|
77
|
+
// Extract related ADRs from content
|
|
78
|
+
const relatedAdrs = extractRelatedAdrs(adr, allAdrs);
|
|
79
|
+
// Create ADR knowledge node
|
|
80
|
+
const metadata = {
|
|
81
|
+
tags: adr.metadata?.tags || [],
|
|
82
|
+
};
|
|
83
|
+
// Only include optional metadata if they exist
|
|
84
|
+
if (adr.metadata?.number) {
|
|
85
|
+
metadata.number = adr.metadata.number;
|
|
86
|
+
}
|
|
87
|
+
if (adr.metadata?.category) {
|
|
88
|
+
metadata.category = adr.metadata.category;
|
|
89
|
+
}
|
|
90
|
+
const node = {
|
|
91
|
+
id: adr.metadata?.number || adr.filename.replace(/\.md$/, ''),
|
|
92
|
+
type: 'adr',
|
|
93
|
+
title: adr.title,
|
|
94
|
+
status: adr.status,
|
|
95
|
+
context: adr.context || '',
|
|
96
|
+
decision: adr.decision || '',
|
|
97
|
+
consequences: adr.consequences || '',
|
|
98
|
+
filePath: adr.path,
|
|
99
|
+
metadata,
|
|
100
|
+
relationships: {
|
|
101
|
+
relatedAdrs,
|
|
102
|
+
supersedes: extractSupersedes(adr),
|
|
103
|
+
supersededBy: extractSupersededBy(adr),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
// Add date if it exists
|
|
107
|
+
if (adr.date) {
|
|
108
|
+
node.date = adr.date;
|
|
109
|
+
}
|
|
110
|
+
// Add memory execution tracking for ADR indexing
|
|
111
|
+
await kgManager.addMemoryExecution('adr_knowledge_initializer', 'index', 'adr', true, {
|
|
112
|
+
adrId: node.id,
|
|
113
|
+
title: node.title,
|
|
114
|
+
status: node.status,
|
|
115
|
+
relatedAdrs: relatedAdrs.length,
|
|
116
|
+
});
|
|
117
|
+
logger.debug(`Indexed ADR to knowledge graph: ${node.id} - ${node.title}`);
|
|
118
|
+
return node;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Extract related ADR references from content
|
|
122
|
+
*/
|
|
123
|
+
function extractRelatedAdrs(adr, allAdrs) {
|
|
124
|
+
const related = [];
|
|
125
|
+
const content = `${adr.context || ''} ${adr.decision || ''} ${adr.consequences || ''}`;
|
|
126
|
+
// Match patterns like "ADR-001", "ADR 001", "adr-1", etc.
|
|
127
|
+
const adrReferences = content.match(/ADR[-\s]?(\d+)/gi);
|
|
128
|
+
if (adrReferences) {
|
|
129
|
+
for (const ref of adrReferences) {
|
|
130
|
+
const id = ref.match(/\d+/)?.[0];
|
|
131
|
+
if (id) {
|
|
132
|
+
const relatedAdr = allAdrs.find(a => a.metadata?.number === id || a.filename.includes(id));
|
|
133
|
+
if (relatedAdr && relatedAdr.filename !== adr.filename) {
|
|
134
|
+
const relatedId = relatedAdr.metadata?.number || relatedAdr.filename.replace(/\.md$/, '');
|
|
135
|
+
related.push(relatedId);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return [...new Set(related)];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Extract ADRs that this ADR supersedes
|
|
144
|
+
*/
|
|
145
|
+
function extractSupersedes(adr) {
|
|
146
|
+
const content = `${adr.context || ''} ${adr.decision || ''} ${adr.consequences || ''}`;
|
|
147
|
+
const supersedes = [];
|
|
148
|
+
// Match patterns like "supersedes ADR-001", "replaces ADR 002", etc.
|
|
149
|
+
const supersedesMatches = content.match(/(?:supersedes|replaces)\s+ADR[-\s]?(\d+)/gi);
|
|
150
|
+
if (supersedesMatches) {
|
|
151
|
+
for (const match of supersedesMatches) {
|
|
152
|
+
const id = match.match(/\d+/)?.[0];
|
|
153
|
+
if (id) {
|
|
154
|
+
supersedes.push(id);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return [...new Set(supersedes)];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Extract ADRs that supersede this ADR
|
|
162
|
+
*/
|
|
163
|
+
function extractSupersededBy(adr) {
|
|
164
|
+
// Check status for "superseded" indication
|
|
165
|
+
if (adr.status.toLowerCase() === 'superseded') {
|
|
166
|
+
const content = `${adr.context || ''} ${adr.decision || ''} ${adr.consequences || ''}`;
|
|
167
|
+
// Match patterns like "superseded by ADR-003"
|
|
168
|
+
const supersededByMatches = content.match(/superseded\s+by\s+ADR[-\s]?(\d+)/gi);
|
|
169
|
+
if (supersededByMatches) {
|
|
170
|
+
const supersededBy = [];
|
|
171
|
+
for (const match of supersededByMatches) {
|
|
172
|
+
const id = match.match(/\d+/)?.[0];
|
|
173
|
+
if (id) {
|
|
174
|
+
supersededBy.push(id);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return [...new Set(supersededBy)];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create relationship tracking between ADRs in the knowledge graph
|
|
184
|
+
*/
|
|
185
|
+
async function createAdrRelationships(nodes, kgManager) {
|
|
186
|
+
logger.info(`Creating relationships between ${nodes.length} ADRs`);
|
|
187
|
+
for (const node of nodes) {
|
|
188
|
+
// Track related ADRs
|
|
189
|
+
for (const relatedId of node.relationships.relatedAdrs) {
|
|
190
|
+
await kgManager.addMemoryExecution('adr_knowledge_initializer', 'relate', 'adr_relationship', true, {
|
|
191
|
+
sourceAdr: node.id,
|
|
192
|
+
targetAdr: relatedId,
|
|
193
|
+
relationshipType: 'related',
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// Track supersedes relationships
|
|
197
|
+
if (node.relationships.supersedes && node.relationships.supersedes.length > 0) {
|
|
198
|
+
for (const supersededId of node.relationships.supersedes) {
|
|
199
|
+
await kgManager.addMemoryExecution('adr_knowledge_initializer', 'supersede', 'adr_relationship', true, {
|
|
200
|
+
sourceAdr: node.id,
|
|
201
|
+
targetAdr: supersededId,
|
|
202
|
+
relationshipType: 'supersedes',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Track superseded-by relationships
|
|
207
|
+
if (node.relationships.supersededBy && node.relationships.supersededBy.length > 0) {
|
|
208
|
+
for (const supersedingId of node.relationships.supersededBy) {
|
|
209
|
+
await kgManager.addMemoryExecution('adr_knowledge_initializer', 'superseded-by', 'adr_relationship', true, {
|
|
210
|
+
sourceAdr: node.id,
|
|
211
|
+
targetAdr: supersedingId,
|
|
212
|
+
relationshipType: 'superseded-by',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
logger.info('✅ ADR relationships created successfully');
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if ADR knowledge base has been initialized
|
|
221
|
+
*
|
|
222
|
+
* @param kgManager - Knowledge graph manager instance
|
|
223
|
+
* @returns Promise resolving to whether ADRs have been indexed
|
|
224
|
+
*/
|
|
225
|
+
export async function isAdrKnowledgeBaseInitialized(kgManager) {
|
|
226
|
+
try {
|
|
227
|
+
const kg = await kgManager.loadKnowledgeGraph();
|
|
228
|
+
// Check if we have any ADR-related memory operations
|
|
229
|
+
if (kg.memoryOperations && kg.memoryOperations.length > 0) {
|
|
230
|
+
const adrOperations = kg.memoryOperations.filter((op) => op.entityType === 'adr' && op.action === 'index');
|
|
231
|
+
return adrOperations.length > 0;
|
|
232
|
+
}
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
logger.warn('Failed to check ADR knowledge base initialization status:', error);
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=adr-knowledge-initializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adr-knowledge-initializer.js","sourceRoot":"","sources":["../../../src/utils/adr-knowledge-initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR Timeline Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts timeline information from ADRs using git history,
|
|
5
|
+
* content parsing, or filesystem metadata with smart conditional logic
|
|
6
|
+
*/
|
|
7
|
+
import type { BasicTimeline, TimelineExtractionOptions } from './adr-timeline-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Extract basic timeline for an ADR with smart conditional logic
|
|
10
|
+
*
|
|
11
|
+
* Only extracts when necessary:
|
|
12
|
+
* - No timestamp in content
|
|
13
|
+
* - File modified recently
|
|
14
|
+
* - Cache miss or stale
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractBasicTimeline(adrPath: string, adrContent: string, options?: TimelineExtractionOptions): Promise<BasicTimeline>;
|
|
17
|
+
/**
|
|
18
|
+
* Helper to extract keywords from ADR content for implementation tracking
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractKeywordsFromAdr(title: string, decision?: string): string[];
|
|
21
|
+
//# sourceMappingURL=adr-timeline-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adr-timeline-extractor.d.ts","sourceRoot":"","sources":["../../../src/utils/adr-timeline-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAsCxF;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,aAAa,CAAC,CAiFxB;AA2MD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BjF"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR Timeline Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts timeline information from ADRs using git history,
|
|
5
|
+
* content parsing, or filesystem metadata with smart conditional logic
|
|
6
|
+
*/
|
|
7
|
+
import { exec } from 'child_process';
|
|
8
|
+
import { promisify } from 'util';
|
|
9
|
+
import { stat } from 'fs/promises';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
const timelineCache = new Map();
|
|
12
|
+
function getCachedTimeline(key) {
|
|
13
|
+
const entry = timelineCache.get(key);
|
|
14
|
+
if (!entry)
|
|
15
|
+
return null;
|
|
16
|
+
const age = Date.now() - entry.timestamp;
|
|
17
|
+
if (age > entry.ttl * 1000) {
|
|
18
|
+
timelineCache.delete(key);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return entry.data;
|
|
22
|
+
}
|
|
23
|
+
function setCachedTimeline(key, data, ttl) {
|
|
24
|
+
timelineCache.set(key, {
|
|
25
|
+
data,
|
|
26
|
+
timestamp: Date.now(),
|
|
27
|
+
ttl,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extract basic timeline for an ADR with smart conditional logic
|
|
32
|
+
*
|
|
33
|
+
* Only extracts when necessary:
|
|
34
|
+
* - No timestamp in content
|
|
35
|
+
* - File modified recently
|
|
36
|
+
* - Cache miss or stale
|
|
37
|
+
*/
|
|
38
|
+
export async function extractBasicTimeline(adrPath, adrContent, options = {}) {
|
|
39
|
+
const { useCache = true, cacheTTL = 3600, // 1 hour default
|
|
40
|
+
forceExtract = false, } = options;
|
|
41
|
+
// Check if extraction can be skipped (unless forced)
|
|
42
|
+
if (!forceExtract) {
|
|
43
|
+
const decision = await shouldExtractTimeline(adrPath, adrContent);
|
|
44
|
+
if (!decision.shouldExtract && decision.useExisting) {
|
|
45
|
+
// Use existing date from content
|
|
46
|
+
return createTimelineFromContent(adrContent, decision.useExisting, decision.reason);
|
|
47
|
+
}
|
|
48
|
+
if (!decision.shouldExtract && !decision.useExisting) {
|
|
49
|
+
// Use cached data
|
|
50
|
+
const cached = getCachedTimeline(`timeline:${adrPath}`);
|
|
51
|
+
if (cached) {
|
|
52
|
+
return cached;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Log extraction reason for debugging
|
|
56
|
+
if (decision.shouldExtract) {
|
|
57
|
+
console.log(`[Timeline] Extracting for ${adrPath}: ${decision.reason}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Perform extraction using priority order: git → content → filesystem
|
|
61
|
+
let timeline = null;
|
|
62
|
+
// Try git extraction first
|
|
63
|
+
timeline = await tryGitExtraction(adrPath);
|
|
64
|
+
// Fallback to content parsing
|
|
65
|
+
if (!timeline || !timeline.created_at) {
|
|
66
|
+
const contentDate = extractDateFromContent(adrContent);
|
|
67
|
+
if (contentDate) {
|
|
68
|
+
timeline = {
|
|
69
|
+
created_at: contentDate,
|
|
70
|
+
updated_at: contentDate,
|
|
71
|
+
extraction_method: 'content',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Final fallback to filesystem
|
|
76
|
+
if (!timeline || !timeline.created_at) {
|
|
77
|
+
timeline = await fallbackToFilesystem(adrPath);
|
|
78
|
+
}
|
|
79
|
+
// Calculate derived fields
|
|
80
|
+
const stats = await stat(adrPath);
|
|
81
|
+
const ageDays = calculateAgeDays(timeline.created_at);
|
|
82
|
+
const daysSinceUpdate = calculateAgeDays(timeline.updated_at);
|
|
83
|
+
const fullTimeline = {
|
|
84
|
+
created_at: timeline.created_at,
|
|
85
|
+
updated_at: timeline.updated_at,
|
|
86
|
+
age_days: ageDays,
|
|
87
|
+
days_since_update: daysSinceUpdate,
|
|
88
|
+
staleness_warnings: generateBasicWarnings(ageDays, daysSinceUpdate),
|
|
89
|
+
extraction_method: timeline.extraction_method,
|
|
90
|
+
};
|
|
91
|
+
// Cache result with file modification time for future checks
|
|
92
|
+
if (useCache) {
|
|
93
|
+
setCachedTimeline(`timeline:${adrPath}`, {
|
|
94
|
+
...fullTimeline,
|
|
95
|
+
_fileModifiedAt: stats.mtime.toISOString(),
|
|
96
|
+
_cachedAt: new Date().toISOString(),
|
|
97
|
+
}, cacheTTL);
|
|
98
|
+
}
|
|
99
|
+
return fullTimeline;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Determine if timeline extraction should run
|
|
103
|
+
*/
|
|
104
|
+
async function shouldExtractTimeline(adrPath, adrContent) {
|
|
105
|
+
// Check if ADR content has a date field
|
|
106
|
+
const dateInContent = extractDateFromContent(adrContent);
|
|
107
|
+
// Check file modification time
|
|
108
|
+
const stats = await stat(adrPath);
|
|
109
|
+
const fileModifiedAt = stats.mtime;
|
|
110
|
+
// Check cache
|
|
111
|
+
const cacheKey = `timeline:${adrPath}`;
|
|
112
|
+
const cached = getCachedTimeline(cacheKey);
|
|
113
|
+
// CONDITION 1: No date in content → MUST extract
|
|
114
|
+
if (!dateInContent) {
|
|
115
|
+
return {
|
|
116
|
+
shouldExtract: true,
|
|
117
|
+
reason: 'No timestamp found in ADR content',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// CONDITION 2: Has date + cached + file unchanged → SKIP
|
|
121
|
+
if (cached && cached._fileModifiedAt) {
|
|
122
|
+
const cachedModTime = new Date(cached._fileModifiedAt);
|
|
123
|
+
if (fileModifiedAt <= cachedModTime) {
|
|
124
|
+
return {
|
|
125
|
+
shouldExtract: false,
|
|
126
|
+
reason: 'File unchanged since last extraction',
|
|
127
|
+
useExisting: dateInContent,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// CONDITION 3: Has date + file modified recently → RE-EXTRACT
|
|
132
|
+
const daysSinceModification = (Date.now() - fileModifiedAt.getTime()) / (1000 * 60 * 60 * 24);
|
|
133
|
+
if (daysSinceModification < 7) {
|
|
134
|
+
// Modified within last week
|
|
135
|
+
return {
|
|
136
|
+
shouldExtract: true,
|
|
137
|
+
reason: `File modified ${Math.floor(daysSinceModification)} days ago`,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// CONDITION 4: Has date + old file → USE CONTENT DATE
|
|
141
|
+
return {
|
|
142
|
+
shouldExtract: false,
|
|
143
|
+
reason: 'File has valid date and is stable (not recently modified)',
|
|
144
|
+
useExisting: dateInContent,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract date from ADR content using regex
|
|
149
|
+
*/
|
|
150
|
+
function extractDateFromContent(content) {
|
|
151
|
+
const dateMatch = content.match(/(?:##?\s*date|date:|\*\*date\*\*:)\s*(.+?)(?:\n|$)/i);
|
|
152
|
+
if (dateMatch && dateMatch[1]) {
|
|
153
|
+
const dateStr = dateMatch[1].trim();
|
|
154
|
+
try {
|
|
155
|
+
// Validate it's a parseable date
|
|
156
|
+
const date = new Date(dateStr);
|
|
157
|
+
if (!isNaN(date.getTime())) {
|
|
158
|
+
return date.toISOString();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Invalid date format
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Create timeline from ADR content date (no git extraction needed)
|
|
169
|
+
*/
|
|
170
|
+
function createTimelineFromContent(_content, dateStr, reason) {
|
|
171
|
+
let decisionDate;
|
|
172
|
+
try {
|
|
173
|
+
decisionDate = new Date(dateStr);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Fallback to current time if parsing fails
|
|
177
|
+
decisionDate = new Date();
|
|
178
|
+
}
|
|
179
|
+
const isoDate = decisionDate.toISOString();
|
|
180
|
+
const ageDays = calculateAgeDays(isoDate);
|
|
181
|
+
return {
|
|
182
|
+
created_at: isoDate,
|
|
183
|
+
updated_at: isoDate, // Assume same as creation
|
|
184
|
+
age_days: ageDays,
|
|
185
|
+
days_since_update: ageDays,
|
|
186
|
+
staleness_warnings: generateBasicWarnings(ageDays, ageDays),
|
|
187
|
+
extraction_method: 'content',
|
|
188
|
+
extraction_skipped: true,
|
|
189
|
+
skip_reason: reason,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Try to extract timeline from git history
|
|
194
|
+
*/
|
|
195
|
+
async function tryGitExtraction(adrPath) {
|
|
196
|
+
try {
|
|
197
|
+
// Creation date (first commit)
|
|
198
|
+
const { stdout: created } = await execAsync(`git log --diff-filter=A --follow --format=%aI -- "${adrPath}" | tail -1`, { timeout: 5000 });
|
|
199
|
+
// Last modification date
|
|
200
|
+
const { stdout: updated } = await execAsync(`git log -1 --format=%aI -- "${adrPath}"`, {
|
|
201
|
+
timeout: 5000,
|
|
202
|
+
});
|
|
203
|
+
if (!created.trim() || !updated.trim()) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
created_at: created.trim(),
|
|
208
|
+
updated_at: updated.trim(),
|
|
209
|
+
extraction_method: 'git',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
// Git not available, not a git repo, or command failed
|
|
214
|
+
console.warn(`[Timeline] Git extraction failed for ${adrPath}:`, error);
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Fallback to filesystem timestamps
|
|
220
|
+
*/
|
|
221
|
+
async function fallbackToFilesystem(adrPath) {
|
|
222
|
+
try {
|
|
223
|
+
const stats = await stat(adrPath);
|
|
224
|
+
return {
|
|
225
|
+
created_at: stats.birthtime.toISOString(),
|
|
226
|
+
updated_at: stats.mtime.toISOString(),
|
|
227
|
+
extraction_method: 'filesystem',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Last resort: use current time
|
|
232
|
+
const now = new Date().toISOString();
|
|
233
|
+
return {
|
|
234
|
+
created_at: now,
|
|
235
|
+
updated_at: now,
|
|
236
|
+
extraction_method: 'filesystem',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Calculate age in days from ISO timestamp
|
|
242
|
+
*/
|
|
243
|
+
function calculateAgeDays(isoTimestamp) {
|
|
244
|
+
const date = new Date(isoTimestamp);
|
|
245
|
+
const now = new Date();
|
|
246
|
+
const diffMs = now.getTime() - date.getTime();
|
|
247
|
+
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Generate basic staleness warnings
|
|
251
|
+
*/
|
|
252
|
+
function generateBasicWarnings(ageDays, daysSinceUpdate) {
|
|
253
|
+
const warnings = [];
|
|
254
|
+
// Warning: Old ADR
|
|
255
|
+
if (ageDays > 180) {
|
|
256
|
+
warnings.push(`ADR is ${ageDays} days old (>6 months)`);
|
|
257
|
+
}
|
|
258
|
+
// Warning: No recent updates
|
|
259
|
+
if (daysSinceUpdate > 365) {
|
|
260
|
+
warnings.push(`No updates in ${daysSinceUpdate} days (>1 year)`);
|
|
261
|
+
}
|
|
262
|
+
// Warning: Very old dormant ADR
|
|
263
|
+
if (daysSinceUpdate > 730) {
|
|
264
|
+
warnings.push(`Dormant for ${Math.floor(daysSinceUpdate / 365)} years - may be obsolete`);
|
|
265
|
+
}
|
|
266
|
+
return warnings;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Helper to extract keywords from ADR content for implementation tracking
|
|
270
|
+
*/
|
|
271
|
+
export function extractKeywordsFromAdr(title, decision) {
|
|
272
|
+
const text = `${title} ${decision || ''}`.toLowerCase();
|
|
273
|
+
const keywords = [];
|
|
274
|
+
// Extract technology names
|
|
275
|
+
const techPatterns = [
|
|
276
|
+
/\b(redis|postgres|mongodb|mysql|kafka|rabbitmq|docker|kubernetes|aws|gcp|azure)\b/gi,
|
|
277
|
+
/\b(react|vue|angular|node|express|fastapi|django|flask|spring)\b/gi,
|
|
278
|
+
/\b(graphql|rest|grpc|websocket|oauth|jwt|saml)\b/gi,
|
|
279
|
+
];
|
|
280
|
+
techPatterns.forEach(pattern => {
|
|
281
|
+
const matches = text.match(pattern);
|
|
282
|
+
if (matches) {
|
|
283
|
+
keywords.push(...matches.map(m => m.toLowerCase()));
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
// Extract quoted terms (likely important concepts)
|
|
287
|
+
const quoted = text.match(/"([^"]+)"/g);
|
|
288
|
+
if (quoted) {
|
|
289
|
+
keywords.push(...quoted.map(q => q.replace(/"/g, '').toLowerCase()));
|
|
290
|
+
}
|
|
291
|
+
// Remove duplicates
|
|
292
|
+
return [...new Set(keywords)];
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=adr-timeline-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adr-timeline-extractor.js","sourceRoot":"","sources":["../../../src/utils/adr-timeline-extractor.ts"],"names":[],"mappings":"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"}
|