@jwikman/bc-code-intelligence-mcp 1.5.7-dev.1
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 +165 -0
- package/dist/cache/cache-manager.d.ts +95 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +328 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cli/bc-code-intel-cli.d.ts +9 -0
- package/dist/cli/bc-code-intel-cli.d.ts.map +1 -0
- package/dist/cli/bc-code-intel-cli.js +440 -0
- package/dist/cli/bc-code-intel-cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +28 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +497 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-validator.d.ts +84 -0
- package/dist/config/config-validator.d.ts.map +1 -0
- package/dist/config/config-validator.js +608 -0
- package/dist/config/config-validator.js.map +1 -0
- package/dist/config/test-config-loader.d.ts +10 -0
- package/dist/config/test-config-loader.d.ts.map +1 -0
- package/dist/config/test-config-loader.js +135 -0
- package/dist/config/test-config-loader.js.map +1 -0
- package/dist/config/test-enhanced-layer-service.d.ts +7 -0
- package/dist/config/test-enhanced-layer-service.d.ts.map +1 -0
- package/dist/config/test-enhanced-layer-service.js +104 -0
- package/dist/config/test-enhanced-layer-service.js.map +1 -0
- package/dist/config/test-git-layer.d.ts +7 -0
- package/dist/config/test-git-layer.d.ts.map +1 -0
- package/dist/config/test-git-layer.js +68 -0
- package/dist/config/test-git-layer.js.map +1 -0
- package/dist/dev/hot-reload.d.ts +91 -0
- package/dist/dev/hot-reload.d.ts.map +1 -0
- package/dist/dev/hot-reload.js +358 -0
- package/dist/dev/hot-reload.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1211 -0
- package/dist/index.js.map +1 -0
- package/dist/layers/base-layer.d.ts +133 -0
- package/dist/layers/base-layer.d.ts.map +1 -0
- package/dist/layers/base-layer.js +290 -0
- package/dist/layers/base-layer.js.map +1 -0
- package/dist/layers/embedded-layer.d.ts +130 -0
- package/dist/layers/embedded-layer.d.ts.map +1 -0
- package/dist/layers/embedded-layer.js +612 -0
- package/dist/layers/embedded-layer.js.map +1 -0
- package/dist/layers/git-layer.d.ts +77 -0
- package/dist/layers/git-layer.d.ts.map +1 -0
- package/dist/layers/git-layer.js +529 -0
- package/dist/layers/git-layer.js.map +1 -0
- package/dist/layers/index.d.ts +12 -0
- package/dist/layers/index.d.ts.map +1 -0
- package/dist/layers/index.js +11 -0
- package/dist/layers/index.js.map +1 -0
- package/dist/layers/layer-service.d.ts +135 -0
- package/dist/layers/layer-service.d.ts.map +1 -0
- package/dist/layers/layer-service.js +586 -0
- package/dist/layers/layer-service.js.map +1 -0
- package/dist/layers/project-layer.d.ts +58 -0
- package/dist/layers/project-layer.d.ts.map +1 -0
- package/dist/layers/project-layer.js +286 -0
- package/dist/layers/project-layer.js.map +1 -0
- package/dist/monitoring/production-monitor.d.ts +148 -0
- package/dist/monitoring/production-monitor.d.ts.map +1 -0
- package/dist/monitoring/production-monitor.js +463 -0
- package/dist/monitoring/production-monitor.js.map +1 -0
- package/dist/performance/performance-monitor.d.ts +99 -0
- package/dist/performance/performance-monitor.d.ts.map +1 -0
- package/dist/performance/performance-monitor.js +253 -0
- package/dist/performance/performance-monitor.js.map +1 -0
- package/dist/sdk/bc-code-intel-client.d.ts +175 -0
- package/dist/sdk/bc-code-intel-client.d.ts.map +1 -0
- package/dist/sdk/bc-code-intel-client.js +380 -0
- package/dist/sdk/bc-code-intel-client.js.map +1 -0
- package/dist/search/intelligent-search.d.ts +97 -0
- package/dist/search/intelligent-search.d.ts.map +1 -0
- package/dist/search/intelligent-search.js +358 -0
- package/dist/search/intelligent-search.js.map +1 -0
- package/dist/security/access-control.d.ts +110 -0
- package/dist/security/access-control.d.ts.map +1 -0
- package/dist/security/access-control.js +353 -0
- package/dist/security/access-control.js.map +1 -0
- package/dist/services/code-analysis-service.d.ts +72 -0
- package/dist/services/code-analysis-service.d.ts.map +1 -0
- package/dist/services/code-analysis-service.js +818 -0
- package/dist/services/code-analysis-service.js.map +1 -0
- package/dist/services/enhanced-prompt-service.d.ts +56 -0
- package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
- package/dist/services/enhanced-prompt-service.js +165 -0
- package/dist/services/enhanced-prompt-service.js.map +1 -0
- package/dist/services/knowledge-service.d.ts +90 -0
- package/dist/services/knowledge-service.d.ts.map +1 -0
- package/dist/services/knowledge-service.js +342 -0
- package/dist/services/knowledge-service.js.map +1 -0
- package/dist/services/methodology-service.d.ts +91 -0
- package/dist/services/methodology-service.d.ts.map +1 -0
- package/dist/services/methodology-service.js +423 -0
- package/dist/services/methodology-service.js.map +1 -0
- package/dist/services/multi-content-layer-service.d.ts +198 -0
- package/dist/services/multi-content-layer-service.d.ts.map +1 -0
- package/dist/services/multi-content-layer-service.js +991 -0
- package/dist/services/multi-content-layer-service.js.map +1 -0
- package/dist/services/roleplay-engine.d.ts +161 -0
- package/dist/services/roleplay-engine.d.ts.map +1 -0
- package/dist/services/roleplay-engine.js +994 -0
- package/dist/services/roleplay-engine.js.map +1 -0
- package/dist/services/session-storage/file-storage.d.ts +30 -0
- package/dist/services/session-storage/file-storage.d.ts.map +1 -0
- package/dist/services/session-storage/file-storage.js +229 -0
- package/dist/services/session-storage/file-storage.js.map +1 -0
- package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
- package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
- package/dist/services/session-storage/in-memory-storage.js +142 -0
- package/dist/services/session-storage/in-memory-storage.js.map +1 -0
- package/dist/services/specialist-discovery.d.ts +98 -0
- package/dist/services/specialist-discovery.d.ts.map +1 -0
- package/dist/services/specialist-discovery.js +387 -0
- package/dist/services/specialist-discovery.js.map +1 -0
- package/dist/services/specialist-loader.d.ts +101 -0
- package/dist/services/specialist-loader.d.ts.map +1 -0
- package/dist/services/specialist-loader.js +256 -0
- package/dist/services/specialist-loader.js.map +1 -0
- package/dist/services/specialist-session-manager.d.ts +76 -0
- package/dist/services/specialist-session-manager.d.ts.map +1 -0
- package/dist/services/specialist-session-manager.js +255 -0
- package/dist/services/specialist-session-manager.js.map +1 -0
- package/dist/services/workflow-service.d.ts +146 -0
- package/dist/services/workflow-service.d.ts.map +1 -0
- package/dist/services/workflow-service.js +409 -0
- package/dist/services/workflow-service.js.map +1 -0
- package/dist/setup/post-install.d.ts +12 -0
- package/dist/setup/post-install.d.ts.map +1 -0
- package/dist/setup/post-install.js +81 -0
- package/dist/setup/post-install.js.map +1 -0
- package/dist/streamlined-handlers.d.ts +94 -0
- package/dist/streamlined-handlers.d.ts.map +1 -0
- package/dist/streamlined-handlers.js +665 -0
- package/dist/streamlined-handlers.js.map +1 -0
- package/dist/test-enhanced-mcp-server.d.ts +7 -0
- package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
- package/dist/test-enhanced-mcp-server.js +177 -0
- package/dist/test-enhanced-mcp-server.js.map +1 -0
- package/dist/tools/config-diagnostic-tools.d.ts +234 -0
- package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
- package/dist/tools/config-diagnostic-tools.js +887 -0
- package/dist/tools/config-diagnostic-tools.js.map +1 -0
- package/dist/tools/core-tools.d.ts +26 -0
- package/dist/tools/core-tools.d.ts.map +1 -0
- package/dist/tools/core-tools.js +241 -0
- package/dist/tools/core-tools.js.map +1 -0
- package/dist/tools/handoff-tools.d.ts +37 -0
- package/dist/tools/handoff-tools.d.ts.map +1 -0
- package/dist/tools/handoff-tools.js +265 -0
- package/dist/tools/handoff-tools.js.map +1 -0
- package/dist/tools/index.d.ts +61 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +75 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/onboarding-tools.d.ts +43 -0
- package/dist/tools/onboarding-tools.d.ts.map +1 -0
- package/dist/tools/onboarding-tools.js +353 -0
- package/dist/tools/onboarding-tools.js.map +1 -0
- package/dist/tools/specialist-discovery-tools.d.ts +27 -0
- package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
- package/dist/tools/specialist-discovery-tools.js +275 -0
- package/dist/tools/specialist-discovery-tools.js.map +1 -0
- package/dist/tools/specialist-tools.d.ts +43 -0
- package/dist/tools/specialist-tools.d.ts.map +1 -0
- package/dist/tools/specialist-tools.js +372 -0
- package/dist/tools/specialist-tools.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +96 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +188 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types/bc-knowledge.d.ts +303 -0
- package/dist/types/bc-knowledge.d.ts.map +1 -0
- package/dist/types/bc-knowledge.js +69 -0
- package/dist/types/bc-knowledge.js.map +1 -0
- package/dist/types/config-types.d.ts +186 -0
- package/dist/types/config-types.d.ts.map +1 -0
- package/dist/types/config-types.js +109 -0
- package/dist/types/config-types.js.map +1 -0
- package/dist/types/enhanced-layer-types.d.ts +193 -0
- package/dist/types/enhanced-layer-types.d.ts.map +1 -0
- package/dist/types/enhanced-layer-types.js +9 -0
- package/dist/types/enhanced-layer-types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/layer-types.d.ts +173 -0
- package/dist/types/layer-types.d.ts.map +1 -0
- package/dist/types/layer-types.js +27 -0
- package/dist/types/layer-types.js.map +1 -0
- package/dist/types/roleplay-types.d.ts +156 -0
- package/dist/types/roleplay-types.d.ts.map +1 -0
- package/dist/types/roleplay-types.js +8 -0
- package/dist/types/roleplay-types.js.map +1 -0
- package/dist/types/session-types.d.ts +127 -0
- package/dist/types/session-types.d.ts.map +1 -0
- package/dist/types/session-types.js +8 -0
- package/dist/types/session-types.js.map +1 -0
- package/dist/utils/path-utils.d.ts +5 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +14 -0
- package/dist/utils/path-utils.js.map +1 -0
- package/dist/workflows/domain-workflows.d.ts +8 -0
- package/dist/workflows/domain-workflows.d.ts.map +1 -0
- package/dist/workflows/domain-workflows.js +360 -0
- package/dist/workflows/domain-workflows.js.map +1 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
- package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
- package/embedded-knowledge/AGENTS.md +178 -0
- package/embedded-knowledge/CONTRIBUTING.md +58 -0
- package/embedded-knowledge/LICENSE +21 -0
- package/embedded-knowledge/README.md +32 -0
- package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
- package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
- package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
- package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
- package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
- package/embedded-knowledge/domains/alex-architect/delegating-to-github-copilot-agents.md +371 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
- package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
- package/embedded-knowledge/domains/alex-architect/object-id-ninja-integration.md +281 -0
- package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
- package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
- package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
- package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
- package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
- package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
- package/embedded-knowledge/domains/alex-architect/samples/testability-design-patterns.md +223 -0
- package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
- package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
- package/embedded-knowledge/domains/alex-architect/testability-design-patterns.md +77 -0
- package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
- package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
- package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
- package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
- package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
- package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
- package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
- package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
- package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
- package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
- package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
- package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
- package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
- package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
- package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
- package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
- package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
- package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
- package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
- package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
- package/embedded-knowledge/domains/dean-debug/recommend-bc-telemetry-buddy.md +160 -0
- package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
- package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
- package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
- package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
- package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
- package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
- package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
- package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
- package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
- package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
- package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
- package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
- package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
- package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
- package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
- package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
- package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
- package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
- package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
- package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
- package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
- package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
- package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
- package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
- package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
- package/embedded-knowledge/domains/eva-errors/codeunit-run-pattern.md +159 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
- package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
- package/embedded-knowledge/domains/eva-errors/samples/codeunit-run-pattern.md +239 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
- package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
- package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
- package/embedded-knowledge/domains/eva-errors/samples/try-function-usage.md +195 -0
- package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
- package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -0
- package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
- package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
- package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
- package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
- package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
- package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
- package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
- package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
- package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
- package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
- package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
- package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
- package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
- package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
- package/embedded-knowledge/domains/morgan-market/partner-readiness-analysis.md +201 -0
- package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
- package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
- package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
- package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
- package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
- package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -0
- package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
- package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
- package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
- package/embedded-knowledge/domains/quinn-tester/samples/isolation-testing-patterns.md +424 -0
- package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
- package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
- package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
- package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
- package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
- package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
- package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
- package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
- package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
- package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
- package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
- package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
- package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
- package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
- package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
- package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
- package/embedded-knowledge/domains/roger-reviewer/samples/testability-code-smells.md +256 -0
- package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
- package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
- package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
- package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
- package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
- package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
- package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
- package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
- package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
- package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
- package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
- package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
- package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
- package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
- package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
- package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
- package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
- package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
- package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
- package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
- package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
- package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
- package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
- package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
- package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
- package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
- package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
- package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
- package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
- package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
- package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
- package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
- package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
- package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
- package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
- package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
- package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
- package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
- package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
- package/embedded-knowledge/indexes/domain-catalog.json +106 -0
- package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
- package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
- package/embedded-knowledge/indexes/tags/access-control.json +1 -0
- package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
- package/embedded-knowledge/indexes/tags/actions.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/advanced.json +1 -0
- package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
- package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
- package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
- package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
- package/embedded-knowledge/indexes/tags/analytics.json +1 -0
- package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
- package/embedded-knowledge/indexes/tags/api-design.json +1 -0
- package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
- package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
- package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
- package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
- package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
- package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
- package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/api.json +1 -0
- package/embedded-knowledge/indexes/tags/architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
- package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
- package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
- package/embedded-knowledge/indexes/tags/binding.json +1 -0
- package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/blocks.json +1 -0
- package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/branching.json +1 -0
- package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
- package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
- package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
- package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
- package/embedded-knowledge/indexes/tags/business-process.json +1 -0
- package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
- package/embedded-knowledge/indexes/tags/caching.json +1 -0
- package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/case.json +1 -0
- package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
- package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
- package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
- package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
- package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
- package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
- package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
- package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/code-style.json +1 -0
- package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
- package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
- package/embedded-knowledge/indexes/tags/comments.json +1 -0
- package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
- package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
- package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
- package/embedded-knowledge/indexes/tags/conditional.json +1 -0
- package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
- package/embedded-knowledge/indexes/tags/consistency.json +1 -0
- package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
- package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
- package/embedded-knowledge/indexes/tags/correlation.json +1 -0
- package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/data-access.json +1 -0
- package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
- package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
- package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
- package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
- package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
- package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
- package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/database.json +1 -0
- package/embedded-knowledge/indexes/tags/debugging.json +1 -0
- package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
- package/embedded-knowledge/indexes/tags/declaration.json +1 -0
- package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
- package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
- package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
- package/embedded-knowledge/indexes/tags/deployment.json +1 -0
- package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
- package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
- package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
- package/embedded-knowledge/indexes/tags/documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
- package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
- package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
- package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
- package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
- package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
- package/embedded-knowledge/indexes/tags/error-text.json +1 -0
- package/embedded-knowledge/indexes/tags/etag.json +1 -0
- package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
- package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
- package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
- package/embedded-knowledge/indexes/tags/events.json +1 -0
- package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
- package/embedded-knowledge/indexes/tags/expressions.json +1 -0
- package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
- package/embedded-knowledge/indexes/tags/extensions.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
- package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
- package/embedded-knowledge/indexes/tags/field-control.json +1 -0
- package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
- package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
- package/embedded-knowledge/indexes/tags/field-state.json +1 -0
- package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
- package/embedded-knowledge/indexes/tags/fields.json +1 -0
- package/embedded-knowledge/indexes/tags/filtering.json +1 -0
- package/embedded-knowledge/indexes/tags/filters.json +1 -0
- package/embedded-knowledge/indexes/tags/formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/http-status.json +1 -0
- package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/implementation.json +1 -0
- package/embedded-knowledge/indexes/tags/indentation.json +1 -0
- package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
- package/embedded-knowledge/indexes/tags/indexing.json +1 -0
- package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
- package/embedded-knowledge/indexes/tags/integration.json +1 -0
- package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
- package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
- package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
- package/embedded-knowledge/indexes/tags/isolation.json +1 -0
- package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
- package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/keywords.json +1 -0
- package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
- package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
- package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
- package/embedded-knowledge/indexes/tags/localization.json +1 -0
- package/embedded-knowledge/indexes/tags/logging.json +1 -0
- package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
- package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
- package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/memory.json +1 -0
- package/embedded-knowledge/indexes/tags/message-design.json +1 -0
- package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
- package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
- package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
- package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
- package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
- package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
- package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
- package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
- package/embedded-knowledge/indexes/tags/naming.json +1 -0
- package/embedded-knowledge/indexes/tags/navigation.json +1 -0
- package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
- package/embedded-knowledge/indexes/tags/no-series.json +1 -0
- package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
- package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
- package/embedded-knowledge/indexes/tags/odata.json +1 -0
- package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
- package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
- package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/operators.json +1 -0
- package/embedded-knowledge/indexes/tags/optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/order.json +1 -0
- package/embedded-knowledge/indexes/tags/organization.json +1 -0
- package/embedded-knowledge/indexes/tags/pages.json +1 -0
- package/embedded-knowledge/indexes/tags/parameters.json +1 -0
- package/embedded-knowledge/indexes/tags/patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/performance.json +1 -0
- package/embedded-knowledge/indexes/tags/placement.json +1 -0
- package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
- package/embedded-knowledge/indexes/tags/posting.json +1 -0
- package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
- package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
- package/embedded-knowledge/indexes/tags/privacy.json +1 -0
- package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
- package/embedded-knowledge/indexes/tags/production.json +1 -0
- package/embedded-knowledge/indexes/tags/productivity.json +1 -0
- package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
- package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
- package/embedded-knowledge/indexes/tags/ranges.json +1 -0
- package/embedded-knowledge/indexes/tags/readability.json +1 -0
- package/embedded-knowledge/indexes/tags/record-access.json +1 -0
- package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
- package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
- package/embedded-knowledge/indexes/tags/reference.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
- package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
- package/embedded-knowledge/indexes/tags/runtime.json +1 -0
- package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
- package/embedded-knowledge/indexes/tags/security.json +1 -0
- package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
- package/embedded-knowledge/indexes/tags/serialization.json +1 -0
- package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
- package/embedded-knowledge/indexes/tags/session.json +1 -0
- package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
- package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
- package/embedded-knowledge/indexes/tags/sift.json +1 -0
- package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
- package/embedded-knowledge/indexes/tags/spacing.json +1 -0
- package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
- package/embedded-knowledge/indexes/tags/standards.json +1 -0
- package/embedded-knowledge/indexes/tags/statements.json +1 -0
- package/embedded-knowledge/indexes/tags/streaming.json +1 -0
- package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
- package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
- package/embedded-knowledge/indexes/tags/structure.json +1 -0
- package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
- package/embedded-knowledge/indexes/tags/switch.json +1 -0
- package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
- package/embedded-knowledge/indexes/tags/syntax.json +1 -0
- package/embedded-knowledge/indexes/tags/systemid.json +1 -0
- package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
- package/embedded-knowledge/indexes/tags/table-events.json +1 -0
- package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
- package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
- package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
- package/embedded-knowledge/indexes/tags/template-method.json +1 -0
- package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
- package/embedded-knowledge/indexes/tags/testfield.json +1 -0
- package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
- package/embedded-knowledge/indexes/tags/triggers.json +1 -0
- package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
- package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
- package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
- package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
- package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
- package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
- package/embedded-knowledge/indexes/tags/validation.json +1 -0
- package/embedded-knowledge/indexes/tags/variables.json +1 -0
- package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
- package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
- package/embedded-knowledge/indexes/tags/web-services.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
- package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
- package/embedded-knowledge/indexes/tags/workspace.json +1 -0
- package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
- package/embedded-knowledge/indexes/topic-relationships.json +128 -0
- package/embedded-knowledge/methodologies/index.json +81 -0
- package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
- package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
- package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
- package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
- package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
- package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
- package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
- package/embedded-knowledge/methodologies/phases/performance.md +211 -0
- package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
- package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
- package/embedded-knowledge/methodologies/phases/verification.md +146 -0
- package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
- package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
- package/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
- package/embedded-knowledge/specialists/alex-architect.md +305 -0
- package/embedded-knowledge/specialists/casey-copilot.md +314 -0
- package/embedded-knowledge/specialists/chris-config.md +226 -0
- package/embedded-knowledge/specialists/dean-debug.md +365 -0
- package/embedded-knowledge/specialists/eva-errors.md +291 -0
- package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
- package/embedded-knowledge/specialists/logan-legacy.md +265 -0
- package/embedded-knowledge/specialists/maya-mentor.md +299 -0
- package/embedded-knowledge/specialists/morgan-market.md +281 -0
- package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
- package/embedded-knowledge/specialists/quinn-tester.md +323 -0
- package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
- package/embedded-knowledge/specialists/sam-coder.md +342 -0
- package/embedded-knowledge/specialists/seth-security.md +290 -0
- package/embedded-knowledge/specialists/taylor-docs.md +312 -0
- package/embedded-knowledge/specialists/uma-ux.md +291 -0
- package/package.json +82 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,1211 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { readFileSync, existsSync } from 'fs';
|
|
8
|
+
import { getAllToolDefinitions, STREAMLINED_TOOL_NAMES, SpecialistTools, SpecialistDiscoveryTools, AgentOnboardingTools, SpecialistHandoffTools } from './tools/index.js';
|
|
9
|
+
import { createStreamlinedHandlers } from './streamlined-handlers.js';
|
|
10
|
+
import { KnowledgeService } from './services/knowledge-service.js';
|
|
11
|
+
import { CodeAnalysisService } from './services/code-analysis-service.js';
|
|
12
|
+
import { MethodologyService } from './services/methodology-service.js';
|
|
13
|
+
import { WorkflowService } from './services/workflow-service.js';
|
|
14
|
+
import { getDomainList } from './types/bc-knowledge.js';
|
|
15
|
+
import { MultiContentLayerService } from './services/multi-content-layer-service.js';
|
|
16
|
+
import { SpecialistSessionManager } from './services/specialist-session-manager.js';
|
|
17
|
+
import { SpecialistDiscoveryService } from './services/specialist-discovery.js';
|
|
18
|
+
import { EnhancedPromptService } from './services/enhanced-prompt-service.js';
|
|
19
|
+
import { ConfigurationLoader } from './config/config-loader.js';
|
|
20
|
+
import { ConfigurationValidator } from './config/config-validator.js';
|
|
21
|
+
import { ConfigDiagnosticTools } from './tools/config-diagnostic-tools.js';
|
|
22
|
+
import { domainWorkflows } from './workflows/domain-workflows.js';
|
|
23
|
+
import { LayerSourceType } from './types/index.js';
|
|
24
|
+
import { WorkspaceTools } from './tools/workspace-tools.js';
|
|
25
|
+
/**
|
|
26
|
+
* BC Code Intelligence MCP Server
|
|
27
|
+
*
|
|
28
|
+
* Business Central Code Intelligence Model Context Protocol Server
|
|
29
|
+
* Surfaces atomic BC knowledge topics for intelligent AI consumption
|
|
30
|
+
* via GitHub Copilot, Claude, and other LLM tools.
|
|
31
|
+
*/
|
|
32
|
+
class BCCodeIntelligenceServer {
|
|
33
|
+
server;
|
|
34
|
+
knowledgeService;
|
|
35
|
+
codeAnalysisService;
|
|
36
|
+
methodologyService;
|
|
37
|
+
workflowService;
|
|
38
|
+
layerService;
|
|
39
|
+
specialistSessionManager;
|
|
40
|
+
specialistTools;
|
|
41
|
+
specialistDiscoveryService;
|
|
42
|
+
specialistDiscoveryTools;
|
|
43
|
+
enhancedPromptService;
|
|
44
|
+
agentOnboardingTools;
|
|
45
|
+
specialistHandoffTools;
|
|
46
|
+
configDiagnosticTools;
|
|
47
|
+
configuration;
|
|
48
|
+
configLoader;
|
|
49
|
+
workspaceRoot = null;
|
|
50
|
+
availableMcps = [];
|
|
51
|
+
hasWarnedAboutWorkspace = false;
|
|
52
|
+
workspaceTools;
|
|
53
|
+
servicesInitialized = false;
|
|
54
|
+
getPackageVersion() {
|
|
55
|
+
try {
|
|
56
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
57
|
+
const __dirname = dirname(__filename);
|
|
58
|
+
const packagePath = join(__dirname, '..', 'package.json');
|
|
59
|
+
console.error(`🔍 Looking for package.json at: ${packagePath}`);
|
|
60
|
+
console.error(` Exists: ${existsSync(packagePath)}`);
|
|
61
|
+
if (!existsSync(packagePath)) {
|
|
62
|
+
console.error(`⚠️ package.json not found at expected location`);
|
|
63
|
+
return '1.0.0'; // fallback
|
|
64
|
+
}
|
|
65
|
+
const packageJson = JSON.parse(readFileSync(packagePath, 'utf8'));
|
|
66
|
+
const version = packageJson.version || '1.0.0';
|
|
67
|
+
console.error(` Version: ${version}`);
|
|
68
|
+
return version;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
console.error(`⚠️ Error reading package.json:`, error instanceof Error ? error.message : String(error));
|
|
72
|
+
return '1.0.0'; // fallback
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
constructor() {
|
|
76
|
+
// Log startup diagnostics
|
|
77
|
+
console.error(`[startup] MCP Server starting...`);
|
|
78
|
+
console.error(`[startup] Process CWD: ${process.cwd()}`);
|
|
79
|
+
console.error(`[startup] Node version: ${process.version}`);
|
|
80
|
+
// Initialize MCP server with capabilities declaration (required by SDK 1.x)
|
|
81
|
+
this.server = new Server({
|
|
82
|
+
name: 'bc-code-intelligence-mcp',
|
|
83
|
+
version: this.getPackageVersion(),
|
|
84
|
+
}, {
|
|
85
|
+
capabilities: {
|
|
86
|
+
tools: {},
|
|
87
|
+
prompts: {}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// Initialize configuration loader
|
|
91
|
+
this.configLoader = new ConfigurationLoader();
|
|
92
|
+
// Initialize workspace tools
|
|
93
|
+
const workspaceContext = {
|
|
94
|
+
setWorkspaceInfo: this.setWorkspaceInfo.bind(this),
|
|
95
|
+
getWorkspaceInfo: () => ({
|
|
96
|
+
workspace_root: this.workspaceRoot,
|
|
97
|
+
available_mcps: this.availableMcps
|
|
98
|
+
})
|
|
99
|
+
};
|
|
100
|
+
this.workspaceTools = new WorkspaceTools(workspaceContext);
|
|
101
|
+
// Services will be initialized asynchronously in run()
|
|
102
|
+
this.setupToolHandlers();
|
|
103
|
+
this.setupPrompts();
|
|
104
|
+
}
|
|
105
|
+
setupToolHandlers() {
|
|
106
|
+
// List available tools - now using centralized registry
|
|
107
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
108
|
+
const tools = getAllToolDefinitions({
|
|
109
|
+
specialistTools: this.specialistTools,
|
|
110
|
+
specialistDiscoveryTools: this.specialistDiscoveryTools,
|
|
111
|
+
onboardingTools: this.agentOnboardingTools,
|
|
112
|
+
handoffTools: this.specialistHandoffTools
|
|
113
|
+
});
|
|
114
|
+
// Add workspace tools (always available)
|
|
115
|
+
tools.push(...this.workspaceTools.getToolDefinitions());
|
|
116
|
+
// Add configuration diagnostic tools if available AND enabled
|
|
117
|
+
if (this.configDiagnosticTools) {
|
|
118
|
+
tools.push(...this.configDiagnosticTools.getToolDefinitions());
|
|
119
|
+
}
|
|
120
|
+
return { tools };
|
|
121
|
+
});
|
|
122
|
+
// Handle tool calls - now using centralized tool names
|
|
123
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
124
|
+
const { name, arguments: args } = request.params;
|
|
125
|
+
try {
|
|
126
|
+
// Workspace tools are always available (no interception)
|
|
127
|
+
if (['set_workspace_info', 'get_workspace_info', 'set_workspace_root', 'get_workspace_root'].includes(name)) {
|
|
128
|
+
return await this.workspaceTools.handleToolCall(request);
|
|
129
|
+
}
|
|
130
|
+
// Intercept all other tools if services not initialized
|
|
131
|
+
if (!this.servicesInitialized) {
|
|
132
|
+
return {
|
|
133
|
+
content: [{
|
|
134
|
+
type: 'text',
|
|
135
|
+
text: `⚠️ **Workspace Not Configured**
|
|
136
|
+
|
|
137
|
+
The BC Code Intelligence server needs workspace information to load project-specific configuration and knowledge layers.
|
|
138
|
+
|
|
139
|
+
**Option 1: Set workspace info** (recommended for project-specific layers and MCP ecosystem awareness)
|
|
140
|
+
\`\`\`
|
|
141
|
+
set_workspace_info({
|
|
142
|
+
workspace_root: "C:/your/project/path",
|
|
143
|
+
available_mcps: [] // REQUIRED: Examine your available tools and infer MCP servers (see tool description)
|
|
144
|
+
})
|
|
145
|
+
\`\`\`
|
|
146
|
+
|
|
147
|
+
**How to populate available_mcps:**
|
|
148
|
+
Check which tools you have available and add the corresponding MCP server IDs:
|
|
149
|
+
- Have \`search_telemetry_traces\`? Add "bc-telemetry-buddy"
|
|
150
|
+
- Have \`reserve_object_ids\`? Add "al-objid-mcp-server"
|
|
151
|
+
- Have \`analyze_dependencies\`? Add "al-dependency-mcp-server"
|
|
152
|
+
- Have \`get_lsp_diagnostics\`? Add "serena-mcp"
|
|
153
|
+
- Have \`create_work_item\`? Add "azure-devops-mcp"
|
|
154
|
+
- Have \`track_time_entry\`? Add "clockify-mcp"
|
|
155
|
+
- Have \`translate_xliff\`? Add "nab-al-tools-mcp"
|
|
156
|
+
|
|
157
|
+
**Option 2: Use user-level config** (works without workspace)
|
|
158
|
+
Place a configuration file at:
|
|
159
|
+
- Windows: \`%USERPROFILE%\\.bckb\\config.yml\`
|
|
160
|
+
- Linux/Mac: \`~/.bckb/config.yml\`
|
|
161
|
+
|
|
162
|
+
Use absolute paths in the config for git/local layers.
|
|
163
|
+
|
|
164
|
+
Currently only embedded knowledge is loaded. Call \`set_workspace_info\` to enable project layers and MCP ecosystem awareness.`
|
|
165
|
+
}]
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Check if it's a specialist tool
|
|
169
|
+
if (this.specialistTools && ['suggest_specialist', 'get_specialist_advice', 'list_specialists'].includes(name)) {
|
|
170
|
+
return await this.specialistTools.handleToolCall(request);
|
|
171
|
+
}
|
|
172
|
+
// Check if it's a specialist discovery tool
|
|
173
|
+
if (this.specialistDiscoveryTools && ['discover_specialists', 'browse_specialists', 'get_specialist_info'].includes(name)) {
|
|
174
|
+
return await this.specialistDiscoveryTools.handleToolCall(request);
|
|
175
|
+
}
|
|
176
|
+
// Check if it's an agent onboarding tool
|
|
177
|
+
if (this.agentOnboardingTools && ['introduce_bc_specialists', 'get_specialist_introduction', 'suggest_next_specialist'].includes(name)) {
|
|
178
|
+
return await this.agentOnboardingTools.handleToolCall(request);
|
|
179
|
+
}
|
|
180
|
+
// Check if it's a specialist handoff tool
|
|
181
|
+
if (this.specialistHandoffTools && ['handoff_to_specialist', 'bring_in_specialist', 'get_handoff_summary'].includes(name)) {
|
|
182
|
+
return await this.specialistHandoffTools.handleToolCall(request);
|
|
183
|
+
}
|
|
184
|
+
// Check if it's a configuration diagnostic tool
|
|
185
|
+
if (this.configDiagnosticTools && ['diagnose_git_layer', 'validate_layer_config', 'test_azure_devops_pat', 'get_layer_diagnostics', 'diagnose_local_layer', 'reload_layers'].includes(name)) {
|
|
186
|
+
return await this.configDiagnosticTools.handleToolCall(request);
|
|
187
|
+
}
|
|
188
|
+
// Create streamlined handlers with all services
|
|
189
|
+
const handlers = createStreamlinedHandlers(this.server, {
|
|
190
|
+
knowledgeService: this.knowledgeService,
|
|
191
|
+
codeAnalysisService: this.codeAnalysisService,
|
|
192
|
+
methodologyService: this.methodologyService,
|
|
193
|
+
workflowService: this.workflowService,
|
|
194
|
+
layerService: this.layerService
|
|
195
|
+
});
|
|
196
|
+
// Execute the appropriate handler
|
|
197
|
+
const handler = handlers[name];
|
|
198
|
+
if (!handler) {
|
|
199
|
+
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
200
|
+
}
|
|
201
|
+
return await handler(args);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (error instanceof McpError) {
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Setup prompts for workflow pipelines
|
|
213
|
+
*/
|
|
214
|
+
setupPrompts() {
|
|
215
|
+
console.error('🎯 Setting up MCP Prompts for workflow pipelines...');
|
|
216
|
+
// Define workflow prompts that guide users through structured pipelines
|
|
217
|
+
const workflowPrompts = [
|
|
218
|
+
{
|
|
219
|
+
name: 'code_optimization',
|
|
220
|
+
description: 'Optimize existing Business Central code using systematic analysis phases',
|
|
221
|
+
arguments: [
|
|
222
|
+
{
|
|
223
|
+
name: 'code_location',
|
|
224
|
+
description: 'Path to the code file or description of the code to optimize',
|
|
225
|
+
required: false // No more required fields - specialist will ask conversationally
|
|
226
|
+
}
|
|
227
|
+
]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
name: 'architecture_review',
|
|
231
|
+
description: 'Conduct comprehensive architecture review of Business Central solution',
|
|
232
|
+
arguments: [
|
|
233
|
+
{
|
|
234
|
+
name: 'scope',
|
|
235
|
+
description: 'Scope of review (module, solution, or specific components)',
|
|
236
|
+
required: false // Specialist will ask about scope naturally
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: 'security_audit',
|
|
242
|
+
description: 'Perform security analysis and compliance check for Business Central implementation',
|
|
243
|
+
arguments: [
|
|
244
|
+
{
|
|
245
|
+
name: 'audit_scope',
|
|
246
|
+
description: 'Security audit scope (permissions, data access, API security, etc.)',
|
|
247
|
+
required: false // Specialist will gather this in conversation
|
|
248
|
+
}
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
name: 'perf_review',
|
|
253
|
+
description: 'Analyze and optimize Business Central performance issues',
|
|
254
|
+
arguments: [
|
|
255
|
+
{
|
|
256
|
+
name: 'performance_concern',
|
|
257
|
+
description: 'Description of performance issue or area to analyze',
|
|
258
|
+
required: false
|
|
259
|
+
}
|
|
260
|
+
]
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
name: 'integration_design',
|
|
264
|
+
description: 'Design robust integration patterns for Business Central',
|
|
265
|
+
arguments: [
|
|
266
|
+
{
|
|
267
|
+
name: 'integration_type',
|
|
268
|
+
description: 'Type of integration (API, data sync, external service, etc.)',
|
|
269
|
+
required: false
|
|
270
|
+
}
|
|
271
|
+
]
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
name: 'upgrade_planning',
|
|
275
|
+
description: 'Plan Business Central version upgrade with risk assessment',
|
|
276
|
+
arguments: [
|
|
277
|
+
{
|
|
278
|
+
name: 'current_version',
|
|
279
|
+
description: 'Current Business Central version',
|
|
280
|
+
required: false
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
name: 'target_version',
|
|
284
|
+
description: 'Target Business Central version',
|
|
285
|
+
required: false
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: 'testing_strategy',
|
|
291
|
+
description: 'Develop comprehensive testing strategy for Business Central solutions',
|
|
292
|
+
arguments: [
|
|
293
|
+
{
|
|
294
|
+
name: 'testing_scope',
|
|
295
|
+
description: 'Scope of testing (unit, integration, user acceptance, etc.)',
|
|
296
|
+
required: false
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
name: 'dev_onboarding',
|
|
302
|
+
description: 'Guide new developer through Business Central development onboarding',
|
|
303
|
+
arguments: [
|
|
304
|
+
{
|
|
305
|
+
name: 'experience_level',
|
|
306
|
+
description: 'Developer experience level (beginner, intermediate, expert)',
|
|
307
|
+
required: false
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: 'focus_area',
|
|
311
|
+
description: 'Primary focus area for onboarding (development, customization, integration)',
|
|
312
|
+
required: false
|
|
313
|
+
}
|
|
314
|
+
]
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: 'app_takeover',
|
|
318
|
+
description: 'Analyze and orient developer taking over an unfamiliar Business Central app',
|
|
319
|
+
arguments: [
|
|
320
|
+
{
|
|
321
|
+
name: 'app_source',
|
|
322
|
+
description: 'Source of the app (path, repository, AppSource, or description)',
|
|
323
|
+
required: false
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: 'takeover_context',
|
|
327
|
+
description: 'Context for takeover (maintenance, enhancement, migration, or handoff scenario)',
|
|
328
|
+
required: false
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: 'spec_analysis',
|
|
334
|
+
description: 'Analyze requirements and specifications to determine development readiness',
|
|
335
|
+
arguments: [
|
|
336
|
+
{
|
|
337
|
+
name: 'spec_source',
|
|
338
|
+
description: 'Source of specifications (document, user story, requirements, or description)',
|
|
339
|
+
required: false
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
name: 'analysis_focus',
|
|
343
|
+
description: 'Analysis focus (completeness, feasibility, technical-gaps, or dependencies)',
|
|
344
|
+
required: false
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
name: 'bug_investigation',
|
|
350
|
+
description: 'Systematically investigate and resolve Business Central bugs and issues',
|
|
351
|
+
arguments: [
|
|
352
|
+
{
|
|
353
|
+
name: 'bug_context',
|
|
354
|
+
description: 'Available context (call-stack, repro-steps, snapshot, sandbox-access, or description)',
|
|
355
|
+
required: false
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: 'issue_severity',
|
|
359
|
+
description: 'Issue severity level (critical, high, medium, low)',
|
|
360
|
+
required: false
|
|
361
|
+
}
|
|
362
|
+
]
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: 'monolith_to_modules',
|
|
366
|
+
description: 'Refactor monolithic Business Central code into modular architecture using SOLID principles',
|
|
367
|
+
arguments: [
|
|
368
|
+
{
|
|
369
|
+
name: 'current_structure',
|
|
370
|
+
description: 'Current code structure (monolithic-object, large-codeunit, tightly-coupled, or description)',
|
|
371
|
+
required: false
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
name: 'modularization_goal',
|
|
375
|
+
description: 'Modularization goal (dependency-injection, interface-patterns, loose-coupling, or testability)',
|
|
376
|
+
required: false
|
|
377
|
+
}
|
|
378
|
+
]
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: 'data_flow_tracing',
|
|
382
|
+
description: 'Trace data flow and dependencies across Business Central objects and codeunits',
|
|
383
|
+
arguments: [
|
|
384
|
+
{
|
|
385
|
+
name: 'trace_target',
|
|
386
|
+
description: 'What to trace (field-usage, table-relationships, posting-flow, or process-chain)',
|
|
387
|
+
required: false
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: 'trace_scope',
|
|
391
|
+
description: 'Tracing scope (single-object, module-level, cross-module, or end-to-end)',
|
|
392
|
+
required: false
|
|
393
|
+
}
|
|
394
|
+
]
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
name: 'full_review',
|
|
398
|
+
description: 'Conduct comprehensive review and analysis without implementation changes',
|
|
399
|
+
arguments: [
|
|
400
|
+
{
|
|
401
|
+
name: 'review_target',
|
|
402
|
+
description: 'What to review (code, architecture, documentation, processes)',
|
|
403
|
+
required: false
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
name: 'review_depth',
|
|
407
|
+
description: 'Review depth (surface, detailed, comprehensive)',
|
|
408
|
+
required: false
|
|
409
|
+
}
|
|
410
|
+
]
|
|
411
|
+
}
|
|
412
|
+
];
|
|
413
|
+
// Register prompt list handler
|
|
414
|
+
this.server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
415
|
+
prompts: workflowPrompts.map(p => ({
|
|
416
|
+
name: p.name,
|
|
417
|
+
description: p.description,
|
|
418
|
+
arguments: p.arguments
|
|
419
|
+
}))
|
|
420
|
+
}));
|
|
421
|
+
// Register get prompt handler for all workflows
|
|
422
|
+
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
423
|
+
const { name, arguments: args } = request.params;
|
|
424
|
+
const prompt = workflowPrompts.find(p => p.name === name);
|
|
425
|
+
if (!prompt) {
|
|
426
|
+
throw new McpError(ErrorCode.InvalidRequest, `Unknown prompt: ${name}`);
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
// Convert workflow name to type and create start request
|
|
430
|
+
const workflowTypeMap = {
|
|
431
|
+
'code_optimization': 'new-bc-app',
|
|
432
|
+
'architecture_review': 'enhance-bc-app',
|
|
433
|
+
'security_audit': 'debug-bc-issues',
|
|
434
|
+
'perf_review': 'debug-bc-issues',
|
|
435
|
+
'integration_design': 'add-ecosystem-features',
|
|
436
|
+
'upgrade_planning': 'upgrade-bc-version',
|
|
437
|
+
'testing_strategy': 'modernize-bc-code',
|
|
438
|
+
'dev_onboarding': 'onboard-developer',
|
|
439
|
+
'app_takeover': 'enhance-bc-app',
|
|
440
|
+
'spec_analysis': 'review-bc-code',
|
|
441
|
+
'bug_investigation': 'debug-bc-issues',
|
|
442
|
+
'monolith_to_modules': 'modernize-bc-code',
|
|
443
|
+
'data_flow_tracing': 'review-bc-code',
|
|
444
|
+
'full_review': 'review-bc-code'
|
|
445
|
+
};
|
|
446
|
+
const workflowType = workflowTypeMap[name];
|
|
447
|
+
if (!workflowType) {
|
|
448
|
+
throw new Error(`Unknown workflow type: ${name}`);
|
|
449
|
+
}
|
|
450
|
+
const startRequest = {
|
|
451
|
+
workflow_type: workflowType,
|
|
452
|
+
project_context: args?.code_location || args?.scope || args?.audit_scope ||
|
|
453
|
+
args?.performance_concern || args?.integration_type ||
|
|
454
|
+
args?.testing_scope || args?.review_target ||
|
|
455
|
+
'General workflow request',
|
|
456
|
+
bc_version: args?.target_version || args?.current_version,
|
|
457
|
+
additional_context: args
|
|
458
|
+
};
|
|
459
|
+
// Start the workflow session
|
|
460
|
+
const session = await this.workflowService.startWorkflow(startRequest);
|
|
461
|
+
// Get the initial guidance for this workflow
|
|
462
|
+
const initialGuidance = await this.workflowService.getPhaseGuidance(session.id);
|
|
463
|
+
// Enhance with specialist routing
|
|
464
|
+
const userContext = args?.code_location || args?.scope || args?.audit_scope ||
|
|
465
|
+
args?.performance_concern || args?.integration_type ||
|
|
466
|
+
args?.testing_scope || args?.review_target ||
|
|
467
|
+
'General workflow request';
|
|
468
|
+
const enhancedResult = await this.enhancedPromptService.enhanceWorkflowPrompt(name, userContext, initialGuidance);
|
|
469
|
+
// Construct explicit prompt that bypasses VS Code prompt creation
|
|
470
|
+
const promptContent = `# ${prompt.description}
|
|
471
|
+
|
|
472
|
+
**IMPORTANT: This is a complete, ready-to-use prompt. Do not create additional prompts or ask for more information. Proceed directly with the requested workflow.**
|
|
473
|
+
|
|
474
|
+
${enhancedResult.enhancedContent}
|
|
475
|
+
|
|
476
|
+
## 🎯 Next Actions
|
|
477
|
+
|
|
478
|
+
**Use these MCP tools immediately to proceed:**
|
|
479
|
+
${enhancedResult.routingOptions.map(option => `- ${option.replace('🎯 Start session with', '**Use MCP tool:**')}`).join('\n')}
|
|
480
|
+
|
|
481
|
+
**Remember:** You have access to 20+ MCP tools from bc-code-intelligence-mcp. Use them actively for specialist consultation and knowledge access.`;
|
|
482
|
+
return {
|
|
483
|
+
description: `Starting ${workflowType} workflow with specialist guidance`,
|
|
484
|
+
messages: [
|
|
485
|
+
{
|
|
486
|
+
role: 'user',
|
|
487
|
+
content: {
|
|
488
|
+
type: 'text',
|
|
489
|
+
text: promptContent
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
]
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
throw new McpError(ErrorCode.InternalError, `Failed to start workflow: ${error instanceof Error ? error.message : String(error)}`);
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
console.error('✅ MCP Prompts configured for workflow orchestration');
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Initialize all services with configuration
|
|
503
|
+
*/
|
|
504
|
+
async initializeServices(configResult) {
|
|
505
|
+
// Store configuration
|
|
506
|
+
this.configuration = configResult.config;
|
|
507
|
+
// Initialize layer service with configuration
|
|
508
|
+
this.layerService = new MultiContentLayerService();
|
|
509
|
+
let totalTopics = 0;
|
|
510
|
+
// Initialize legacy knowledge service for backward compatibility
|
|
511
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
512
|
+
const __dirname = dirname(__filename);
|
|
513
|
+
const legacyConfig = {
|
|
514
|
+
knowledge_base_path: process.env['BCKB_KB_PATH'] || join(__dirname, '../embedded-knowledge'),
|
|
515
|
+
indexes_path: process.env['BCKB_INDEXES_PATH'] || join(__dirname, '../embedded-knowledge/indexes'),
|
|
516
|
+
methodologies_path: process.env['BCKB_METHODOLOGIES_PATH'] || join(__dirname, '../embedded-knowledge/methodologies'),
|
|
517
|
+
cache_size: this.configuration.cache.max_size_mb * 1024, // Convert MB to entries approximation
|
|
518
|
+
max_search_results: 20,
|
|
519
|
+
default_bc_version: 'BC22',
|
|
520
|
+
enable_fuzzy_search: true,
|
|
521
|
+
search_threshold: 0.6
|
|
522
|
+
};
|
|
523
|
+
// Initialize specialist services using a dedicated MultiContentLayerService FIRST
|
|
524
|
+
this.layerService = new MultiContentLayerService();
|
|
525
|
+
// Iterate over configured layers and instantiate each based on type
|
|
526
|
+
for (const layerConfig of this.configuration.layers) {
|
|
527
|
+
if (!layerConfig.enabled) {
|
|
528
|
+
console.error(`⏭️ Skipping disabled layer: ${layerConfig.name}`);
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
let layer;
|
|
532
|
+
try {
|
|
533
|
+
switch (layerConfig.source.type) {
|
|
534
|
+
case LayerSourceType.EMBEDDED: {
|
|
535
|
+
// Embedded layer - ALWAYS use the server's embedded knowledge directory
|
|
536
|
+
// The 'path' field is ignored for embedded layers since they reference the built-in knowledge
|
|
537
|
+
const embeddedPath = join(__dirname, '../embedded-knowledge');
|
|
538
|
+
console.error(`📋 Embedded layer using built-in knowledge: ${embeddedPath}`);
|
|
539
|
+
const { EmbeddedKnowledgeLayer } = await import('./layers/embedded-layer.js');
|
|
540
|
+
layer = new EmbeddedKnowledgeLayer(embeddedPath);
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
case LayerSourceType.LOCAL: {
|
|
544
|
+
// Local filesystem layer - use ProjectKnowledgeLayer
|
|
545
|
+
const { ProjectKnowledgeLayer } = await import('./layers/project-layer.js');
|
|
546
|
+
layer = new ProjectKnowledgeLayer(layerConfig.source.path);
|
|
547
|
+
// Override name and priority from config
|
|
548
|
+
layer.name = layerConfig.name;
|
|
549
|
+
layer.priority = layerConfig.priority;
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
case LayerSourceType.GIT: {
|
|
553
|
+
// Git repository layer
|
|
554
|
+
const { GitKnowledgeLayer } = await import('./layers/git-layer.js');
|
|
555
|
+
const gitSource = layerConfig.source; // GitLayerSource
|
|
556
|
+
layer = new GitKnowledgeLayer(layerConfig.name, layerConfig.priority, {
|
|
557
|
+
type: LayerSourceType.GIT,
|
|
558
|
+
url: gitSource.url,
|
|
559
|
+
branch: gitSource.branch,
|
|
560
|
+
subpath: gitSource.subpath
|
|
561
|
+
}, layerConfig.auth);
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
case LayerSourceType.HTTP:
|
|
565
|
+
case LayerSourceType.NPM: {
|
|
566
|
+
// Future layer types - not yet implemented
|
|
567
|
+
// HTTP: Would load knowledge from HTTP endpoints (ZIP/tarball downloads)
|
|
568
|
+
// NPM: Would load knowledge from NPM packages
|
|
569
|
+
console.warn(`⚠️ Layer type '${layerConfig.source.type}' not yet implemented - skipping ${layerConfig.name}`);
|
|
570
|
+
continue;
|
|
571
|
+
}
|
|
572
|
+
default:
|
|
573
|
+
console.error(`❌ Unknown layer type: ${layerConfig.source.type} - skipping ${layerConfig.name}`);
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
console.error(`📋 Successfully instantiated layer: ${layerConfig.name}`);
|
|
577
|
+
this.layerService.addLayer(layer);
|
|
578
|
+
}
|
|
579
|
+
catch (layerError) {
|
|
580
|
+
// CRITICAL FIX: Handle individual layer instantiation failures gracefully
|
|
581
|
+
// This prevents one failing layer (e.g. git auth issues) from breaking the entire service
|
|
582
|
+
console.error(`❌ Failed to instantiate layer '${layerConfig.name}': ${layerError instanceof Error ? layerError.message : String(layerError)}`);
|
|
583
|
+
if (layerConfig.source.type === LayerSourceType.GIT) {
|
|
584
|
+
console.error(`💡 Git layer '${layerConfig.name}' failed - check repository URL, authentication, or network connection`);
|
|
585
|
+
}
|
|
586
|
+
else if (layerConfig.source.type === LayerSourceType.LOCAL) {
|
|
587
|
+
console.error(`💡 Local layer '${layerConfig.name}' failed - check that path '${layerConfig.source.path}' exists and is readable`);
|
|
588
|
+
}
|
|
589
|
+
// Continue to next layer instead of aborting entire initialization
|
|
590
|
+
continue;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
await this.layerService.initialize();
|
|
594
|
+
// Now create KnowledgeService with the initialized layerService
|
|
595
|
+
this.knowledgeService = new KnowledgeService(legacyConfig, this.layerService);
|
|
596
|
+
await this.knowledgeService.initialize();
|
|
597
|
+
this.codeAnalysisService = new CodeAnalysisService(this.knowledgeService);
|
|
598
|
+
this.methodologyService = new MethodologyService(this.knowledgeService, legacyConfig.methodologies_path);
|
|
599
|
+
// Report layer-by-layer counts after initialization
|
|
600
|
+
const layerStats = this.layerService.getStatistics();
|
|
601
|
+
for (const stats of layerStats) {
|
|
602
|
+
console.error(`📁 Layer '${stats.name}': ${stats.topicCount} topics`);
|
|
603
|
+
totalTopics += stats.topicCount;
|
|
604
|
+
}
|
|
605
|
+
// Get session storage configuration from layer service
|
|
606
|
+
const sessionStorageConfig = this.layerService.getSessionStorageConfig();
|
|
607
|
+
this.specialistSessionManager = new SpecialistSessionManager(this.layerService, sessionStorageConfig);
|
|
608
|
+
this.specialistTools = new SpecialistTools(this.layerService, this.specialistSessionManager, this.knowledgeService);
|
|
609
|
+
// Initialize specialist discovery service and tools
|
|
610
|
+
this.specialistDiscoveryService = new SpecialistDiscoveryService(this.layerService);
|
|
611
|
+
this.specialistDiscoveryTools = new SpecialistDiscoveryTools(this.specialistDiscoveryService, this.specialistSessionManager, this.layerService);
|
|
612
|
+
// Initialize enhanced prompt service for specialist routing
|
|
613
|
+
this.enhancedPromptService = new EnhancedPromptService(this.specialistDiscoveryService, this.specialistSessionManager, this.workflowService);
|
|
614
|
+
// Initialize agent onboarding tools for natural specialist introduction
|
|
615
|
+
this.agentOnboardingTools = new AgentOnboardingTools(this.specialistDiscoveryService, this.layerService);
|
|
616
|
+
// Initialize specialist handoff tools for seamless transitions
|
|
617
|
+
this.specialistHandoffTools = new SpecialistHandoffTools(this.specialistSessionManager, this.specialistDiscoveryService, this.layerService);
|
|
618
|
+
// Initialize configuration diagnostic tools ONLY if enabled (reduces token overhead)
|
|
619
|
+
if (this.configuration.developer.enable_diagnostic_tools) {
|
|
620
|
+
this.configDiagnosticTools = new ConfigDiagnosticTools(this.layerService, this.configLoader);
|
|
621
|
+
console.error('🔧 Configuration diagnostic tools enabled');
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
console.error('💡 Tip: Set developer.enable_diagnostic_tools=true for git layer diagnostics');
|
|
625
|
+
}
|
|
626
|
+
// Initialize workflow service with specialist discovery
|
|
627
|
+
const specialistDiscoveryService = new SpecialistDiscoveryService(this.layerService);
|
|
628
|
+
this.workflowService = new WorkflowService(this.knowledgeService, this.methodologyService, specialistDiscoveryService);
|
|
629
|
+
// Report final totals
|
|
630
|
+
const specialists = await this.layerService.getAllSpecialists();
|
|
631
|
+
console.error(`📊 Total: ${totalTopics} topics, ${specialists.length} specialists`);
|
|
632
|
+
// Validate tool contracts at startup
|
|
633
|
+
await this.validateToolContracts();
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Validate that all tool schemas match service implementations
|
|
637
|
+
*/
|
|
638
|
+
async validateToolContracts() {
|
|
639
|
+
try {
|
|
640
|
+
const handlers = createStreamlinedHandlers(this.server, {
|
|
641
|
+
knowledgeService: this.knowledgeService,
|
|
642
|
+
codeAnalysisService: this.codeAnalysisService,
|
|
643
|
+
methodologyService: this.methodologyService,
|
|
644
|
+
workflowService: this.workflowService,
|
|
645
|
+
layerService: this.layerService
|
|
646
|
+
});
|
|
647
|
+
const tools = getAllToolDefinitions({
|
|
648
|
+
specialistTools: this.specialistTools,
|
|
649
|
+
specialistDiscoveryTools: this.specialistDiscoveryTools,
|
|
650
|
+
onboardingTools: this.agentOnboardingTools,
|
|
651
|
+
handoffTools: this.specialistHandoffTools
|
|
652
|
+
});
|
|
653
|
+
let hasIssues = false;
|
|
654
|
+
for (const tool of tools) {
|
|
655
|
+
// Only validate core streamlined tools (others handle their own routing)
|
|
656
|
+
if (Object.values(STREAMLINED_TOOL_NAMES).includes(tool.name)) {
|
|
657
|
+
if (!handlers[tool.name]) {
|
|
658
|
+
console.error(`❌ No handler found for core tool: ${tool.name}`);
|
|
659
|
+
hasIssues = true;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
if (hasIssues) {
|
|
664
|
+
console.error('💥 Contract validation failed! Server may have dead ends.');
|
|
665
|
+
// Don't fail startup, but warn loudly
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
catch (error) {
|
|
669
|
+
console.error(`⚠️ Contract validation error: ${error}`);
|
|
670
|
+
// Don't fail startup for validation errors
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Generate comprehensive system analytics
|
|
675
|
+
*/
|
|
676
|
+
async generateSystemAnalytics(includeTopicAnalytics, includeLayerPerformance, includeConfigurationInsights) {
|
|
677
|
+
const analytics = {
|
|
678
|
+
timestamp: new Date().toISOString(),
|
|
679
|
+
system_overview: {
|
|
680
|
+
server_version: this.getPackageVersion(),
|
|
681
|
+
layers_active: this.layerService?.getLayers().length || 0,
|
|
682
|
+
configuration_loaded: !!this.configuration,
|
|
683
|
+
total_topics: this.layerService?.getAllTopicIds().length || 0
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
if (includeTopicAnalytics && this.layerService) {
|
|
687
|
+
analytics.topic_analytics = await this.generateTopicAnalytics();
|
|
688
|
+
}
|
|
689
|
+
if (includeLayerPerformance && this.layerService) {
|
|
690
|
+
analytics.layer_performance = this.generateLayerPerformanceAnalytics();
|
|
691
|
+
}
|
|
692
|
+
if (includeConfigurationInsights && this.configuration) {
|
|
693
|
+
analytics.configuration_insights = await this.generateConfigurationInsights();
|
|
694
|
+
}
|
|
695
|
+
return analytics;
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Generate topic distribution and coverage analytics
|
|
699
|
+
*/
|
|
700
|
+
async generateTopicAnalytics() {
|
|
701
|
+
const allTopicIds = this.layerService.getAllTopicIds();
|
|
702
|
+
const domainDistribution = {};
|
|
703
|
+
const difficultyDistribution = {};
|
|
704
|
+
const overrideStats = this.layerService.getOverriddenTopics();
|
|
705
|
+
// Analyze a sample of topics for domain/difficulty distribution
|
|
706
|
+
const sampleSize = Math.min(50, allTopicIds.length);
|
|
707
|
+
const sampleTopics = allTopicIds.slice(0, sampleSize);
|
|
708
|
+
for (const topicId of sampleTopics) {
|
|
709
|
+
const resolution = await this.layerService.resolveTopic(topicId);
|
|
710
|
+
if (resolution) {
|
|
711
|
+
const domains = getDomainList(resolution.topic.frontmatter.domain);
|
|
712
|
+
const difficulty = resolution.topic.frontmatter.difficulty;
|
|
713
|
+
// Count each domain the topic belongs to
|
|
714
|
+
for (const domain of domains) {
|
|
715
|
+
domainDistribution[domain] = (domainDistribution[domain] || 0) + 1;
|
|
716
|
+
}
|
|
717
|
+
if (difficulty) {
|
|
718
|
+
difficultyDistribution[difficulty] = (difficultyDistribution[difficulty] || 0) + 1;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
return {
|
|
723
|
+
total_topics: allTopicIds.length,
|
|
724
|
+
analyzed_sample: sampleSize,
|
|
725
|
+
domain_distribution: domainDistribution,
|
|
726
|
+
difficulty_distribution: difficultyDistribution,
|
|
727
|
+
override_statistics: {
|
|
728
|
+
total_overrides: Object.keys(overrideStats).length,
|
|
729
|
+
override_percentage: allTopicIds.length > 0
|
|
730
|
+
? ((Object.keys(overrideStats).length / allTopicIds.length) * 100).toFixed(1) + '%'
|
|
731
|
+
: '0%'
|
|
732
|
+
},
|
|
733
|
+
coverage_insights: {
|
|
734
|
+
domains_covered: Object.keys(domainDistribution).length,
|
|
735
|
+
difficulty_levels: Object.keys(difficultyDistribution).length,
|
|
736
|
+
most_common_domain: Object.entries(domainDistribution).sort(([, a], [, b]) => b - a)[0]?.[0] || 'N/A',
|
|
737
|
+
most_common_difficulty: Object.entries(difficultyDistribution).sort(([, a], [, b]) => b - a)[0]?.[0] || 'N/A'
|
|
738
|
+
}
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Generate layer performance analytics
|
|
743
|
+
*/
|
|
744
|
+
generateLayerPerformanceAnalytics() {
|
|
745
|
+
const layerStats = this.layerService.getLayerStatistics();
|
|
746
|
+
const layerMetrics = this.layerService.getStatistics();
|
|
747
|
+
const formattedMetrics = layerMetrics.map(stats => {
|
|
748
|
+
return {
|
|
749
|
+
name: stats.name,
|
|
750
|
+
priority: stats.priority,
|
|
751
|
+
enabled: stats.enabled,
|
|
752
|
+
topic_count: stats.topicCount,
|
|
753
|
+
index_count: stats.indexCount,
|
|
754
|
+
memory_usage_mb: stats.memoryUsage?.total ? (stats.memoryUsage.total / (1024 * 1024)).toFixed(2) : 'N/A',
|
|
755
|
+
load_time_ms: stats.loadTimeMs || 0,
|
|
756
|
+
type: 'MultiContentLayer'
|
|
757
|
+
};
|
|
758
|
+
});
|
|
759
|
+
const totalTopics = layerMetrics.reduce((sum, stats) => sum + stats.topicCount, 0);
|
|
760
|
+
return {
|
|
761
|
+
system_totals: {
|
|
762
|
+
total_layers: layerMetrics.length,
|
|
763
|
+
total_topics: totalTopics,
|
|
764
|
+
total_indexes: layerMetrics.reduce((sum, stats) => sum + stats.indexCount, 0),
|
|
765
|
+
total_memory_mb: 'N/A' // Memory tracking not implemented in new system
|
|
766
|
+
},
|
|
767
|
+
layer_metrics: formattedMetrics,
|
|
768
|
+
performance_insights: {
|
|
769
|
+
fastest_layer: formattedMetrics.sort((a, b) => a.load_time_ms - b.load_time_ms)[0]?.name || 'N/A',
|
|
770
|
+
most_topics: formattedMetrics.sort((a, b) => b.topic_count - a.topic_count)[0]?.name || 'N/A',
|
|
771
|
+
layer_efficiency: layerMetrics.length > 0
|
|
772
|
+
? (totalTopics / layerMetrics.length).toFixed(1) + ' topics/layer avg'
|
|
773
|
+
: 'N/A'
|
|
774
|
+
}
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
/**
|
|
778
|
+
* Generate configuration optimization insights
|
|
779
|
+
*/
|
|
780
|
+
async generateConfigurationInsights() {
|
|
781
|
+
const validator = new ConfigurationValidator();
|
|
782
|
+
const validation = await validator.validate(this.configuration);
|
|
783
|
+
const insights = {
|
|
784
|
+
configuration_quality: {
|
|
785
|
+
overall_score: validation.score,
|
|
786
|
+
is_valid: validation.valid,
|
|
787
|
+
error_count: validation.errors.length,
|
|
788
|
+
warning_count: validation.warnings.length
|
|
789
|
+
},
|
|
790
|
+
layer_configuration: {
|
|
791
|
+
total_layers: this.configuration.layers.length,
|
|
792
|
+
enabled_layers: this.configuration.layers.filter(l => l.enabled).length,
|
|
793
|
+
layer_types: this.configuration.layers.reduce((acc, layer) => {
|
|
794
|
+
acc[layer.source.type] = (acc[layer.source.type] || 0) + 1;
|
|
795
|
+
return acc;
|
|
796
|
+
}, {}),
|
|
797
|
+
priority_distribution: this.configuration.layers.map(l => l.priority).sort((a, b) => a - b)
|
|
798
|
+
},
|
|
799
|
+
optimization_recommendations: []
|
|
800
|
+
};
|
|
801
|
+
// Generate optimization recommendations
|
|
802
|
+
if (this.configuration.layers.filter(l => l.enabled).length < 2) {
|
|
803
|
+
insights.optimization_recommendations.push({
|
|
804
|
+
type: 'layer_diversity',
|
|
805
|
+
message: 'Consider adding more layer types (git, local overrides) for better customization',
|
|
806
|
+
impact: 'medium'
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
if (this.configuration.performance.max_concurrent_loads < 3) {
|
|
810
|
+
insights.optimization_recommendations.push({
|
|
811
|
+
type: 'performance',
|
|
812
|
+
message: 'Increase max_concurrent_loads for better performance on modern systems',
|
|
813
|
+
impact: 'low'
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
if (!this.configuration.security.validate_sources) {
|
|
817
|
+
insights.optimization_recommendations.push({
|
|
818
|
+
type: 'security',
|
|
819
|
+
message: 'Enable source validation for better security',
|
|
820
|
+
impact: 'high'
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
if (validation.warnings.length > 0) {
|
|
824
|
+
insights.optimization_recommendations.push({
|
|
825
|
+
type: 'configuration',
|
|
826
|
+
message: `Address ${validation.warnings.length} configuration warnings`,
|
|
827
|
+
impact: 'medium'
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
return insights;
|
|
831
|
+
}
|
|
832
|
+
async generateOptimizationWorkflow(params) {
|
|
833
|
+
// Use domain workflows for comprehensive scenario coverage
|
|
834
|
+
const baseWorkflows = domainWorkflows;
|
|
835
|
+
// Additional legacy workflow mapping
|
|
836
|
+
const legacyWorkflows = {
|
|
837
|
+
'slow report': {
|
|
838
|
+
steps: [
|
|
839
|
+
{
|
|
840
|
+
step_number: 1,
|
|
841
|
+
title: 'Analyze Current Data Access Patterns',
|
|
842
|
+
description: 'Review report dataset access, joins, and aggregations to identify bottlenecks',
|
|
843
|
+
related_topics: ['query-performance-patterns', 'sift-technology-fundamentals'],
|
|
844
|
+
validation_criteria: ['Query execution times documented', 'Data volume assessed'],
|
|
845
|
+
estimated_time: '30 minutes'
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
step_number: 2,
|
|
849
|
+
title: 'Implement SIFT Indexes',
|
|
850
|
+
description: 'Add SIFT indexes for aggregation operations and enable MaintainSIFTIndex',
|
|
851
|
+
related_topics: ['sift-index-fundamentals', 'maintainsiftindex-property-behavior'],
|
|
852
|
+
validation_criteria: ['SIFT keys created', 'MaintainSIFTIndex enabled', 'Aggregations use CalcSums'],
|
|
853
|
+
estimated_time: '45 minutes'
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
step_number: 3,
|
|
857
|
+
title: 'Optimize Field Loading',
|
|
858
|
+
description: 'Use SetLoadFields to reduce memory usage and network traffic',
|
|
859
|
+
related_topics: ['setloadfields-optimization', 'memory-optimization'],
|
|
860
|
+
validation_criteria: ['SetLoadFields implemented', 'Only required fields loaded'],
|
|
861
|
+
estimated_time: '20 minutes'
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
step_number: 4,
|
|
865
|
+
title: 'Performance Testing and Validation',
|
|
866
|
+
description: 'Measure performance improvements and validate against targets',
|
|
867
|
+
related_topics: ['performance-monitoring', 'performance-best-practices'],
|
|
868
|
+
validation_criteria: ['Performance metrics collected', 'Target response time achieved'],
|
|
869
|
+
estimated_time: '30 minutes'
|
|
870
|
+
}
|
|
871
|
+
],
|
|
872
|
+
learning_path: ['sift-technology-fundamentals', 'query-performance-patterns', 'performance-monitoring'],
|
|
873
|
+
success_metrics: ['Report execution time reduced by 70%+', 'Memory usage optimized', 'User satisfaction improved'],
|
|
874
|
+
common_pitfalls: ['Not enabling MaintainSIFTIndex', 'Loading unnecessary fields', 'Missing performance baselines']
|
|
875
|
+
}
|
|
876
|
+
};
|
|
877
|
+
// Merge domain workflows with legacy workflows
|
|
878
|
+
const allWorkflows = { ...baseWorkflows, ...legacyWorkflows };
|
|
879
|
+
// Find matching workflow or create generic one
|
|
880
|
+
const scenario = params.scenario.toLowerCase();
|
|
881
|
+
let workflow = null;
|
|
882
|
+
for (const [key, value] of Object.entries(allWorkflows)) {
|
|
883
|
+
if (scenario.includes(key)) {
|
|
884
|
+
workflow = value;
|
|
885
|
+
break;
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
if (!workflow) {
|
|
889
|
+
// Generate generic optimization workflow
|
|
890
|
+
workflow = {
|
|
891
|
+
steps: [
|
|
892
|
+
{
|
|
893
|
+
step_number: 1,
|
|
894
|
+
title: 'Identify Performance Bottlenecks',
|
|
895
|
+
description: 'Analyze the scenario to pinpoint specific performance issues',
|
|
896
|
+
related_topics: ['performance-monitoring', 'query-performance-patterns'],
|
|
897
|
+
validation_criteria: ['Bottlenecks identified', 'Performance baseline established'],
|
|
898
|
+
estimated_time: '30 minutes'
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
step_number: 2,
|
|
902
|
+
title: 'Apply Targeted Optimizations',
|
|
903
|
+
description: 'Implement specific BC optimization patterns based on identified issues',
|
|
904
|
+
related_topics: ['performance-best-practices', 'memory-optimization'],
|
|
905
|
+
validation_criteria: ['Optimizations implemented', 'Code patterns improved'],
|
|
906
|
+
estimated_time: '60 minutes'
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
step_number: 3,
|
|
910
|
+
title: 'Validate and Monitor',
|
|
911
|
+
description: 'Test improvements and establish ongoing monitoring',
|
|
912
|
+
related_topics: ['performance-monitoring'],
|
|
913
|
+
validation_criteria: ['Performance improved', 'Monitoring established'],
|
|
914
|
+
estimated_time: '20 minutes'
|
|
915
|
+
}
|
|
916
|
+
],
|
|
917
|
+
learning_path: ['performance-best-practices', 'performance-monitoring'],
|
|
918
|
+
success_metrics: ['Measurable performance improvement', 'Sustainable solution implemented'],
|
|
919
|
+
common_pitfalls: ['Premature optimization', 'Insufficient testing', 'Missing monitoring']
|
|
920
|
+
};
|
|
921
|
+
}
|
|
922
|
+
return {
|
|
923
|
+
scenario: params.scenario,
|
|
924
|
+
workflow,
|
|
925
|
+
constraints: params.constraints || [],
|
|
926
|
+
target_performance: params.target_performance
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
async run() {
|
|
930
|
+
try {
|
|
931
|
+
// Ultra-early diagnostics for platform issues
|
|
932
|
+
console.error('=== BC Code Intelligence MCP Server Startup Diagnostics ===');
|
|
933
|
+
console.error(`Platform: ${process.platform}`);
|
|
934
|
+
console.error(`Node version: ${process.version}`);
|
|
935
|
+
console.error(`Architecture: ${process.arch}`);
|
|
936
|
+
console.error(`Working directory: ${process.cwd()}`);
|
|
937
|
+
console.error(`Script path: ${process.argv[1]}`);
|
|
938
|
+
const version = this.getPackageVersion();
|
|
939
|
+
console.error(`🚀 BC Code Intelligence MCP Server v${version} starting...`);
|
|
940
|
+
// Verify embedded knowledge path BEFORE any service initialization
|
|
941
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
942
|
+
const __dirname = dirname(__filename);
|
|
943
|
+
const embeddedPath = join(__dirname, '..', 'embedded-knowledge');
|
|
944
|
+
console.error(`Embedded knowledge path: ${embeddedPath}`);
|
|
945
|
+
console.error(`Embedded knowledge exists: ${existsSync(embeddedPath)}`);
|
|
946
|
+
if (existsSync(embeddedPath)) {
|
|
947
|
+
const expectedDirs = ['domains', 'specialists', 'methodologies'];
|
|
948
|
+
for (const dir of expectedDirs) {
|
|
949
|
+
const dirPath = join(embeddedPath, dir);
|
|
950
|
+
console.error(` ${dir}/: ${existsSync(dirPath)}`);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
// Try to load user-level configuration first (company layers)
|
|
954
|
+
// If no user config exists, fall back to embedded-only mode
|
|
955
|
+
console.error('📦 Checking for user-level configuration (company layers)...');
|
|
956
|
+
try {
|
|
957
|
+
const userConfigResult = await this.configLoader.loadConfiguration();
|
|
958
|
+
if (userConfigResult.config.layers && userConfigResult.config.layers.length > 1) {
|
|
959
|
+
// User has configured layers (embedded + company/git layers)
|
|
960
|
+
console.error(`✅ Found user-level configuration with ${userConfigResult.config.layers.length} layers`);
|
|
961
|
+
this.configuration = userConfigResult.config;
|
|
962
|
+
try {
|
|
963
|
+
await this.initializeWithConfiguration(userConfigResult);
|
|
964
|
+
}
|
|
965
|
+
catch (configError) {
|
|
966
|
+
// CRITICAL FIX: If user config initialization fails (e.g. git layer auth failure),
|
|
967
|
+
// fall back to embedded-only mode instead of crashing the server
|
|
968
|
+
console.error('❌ Failed to initialize with user configuration:', configError instanceof Error ? configError.message : String(configError));
|
|
969
|
+
console.error('🔄 Falling back to embedded-only mode...');
|
|
970
|
+
await this.initializeEmbeddedOnly();
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
else {
|
|
974
|
+
// No user config or only embedded layer - use embedded-only mode
|
|
975
|
+
console.error('📦 No user-level configuration found, loading embedded knowledge only...');
|
|
976
|
+
await this.initializeEmbeddedOnly();
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
catch (error) {
|
|
980
|
+
console.error('⚠️ Failed to load user configuration, falling back to embedded-only:', error instanceof Error ? error.message : String(error));
|
|
981
|
+
await this.initializeEmbeddedOnly();
|
|
982
|
+
} // Start MCP server
|
|
983
|
+
const transport = new StdioServerTransport();
|
|
984
|
+
await this.server.connect(transport);
|
|
985
|
+
console.error(`✅ BC Code Intelligence MCP Server v${this.getPackageVersion()} started successfully`);
|
|
986
|
+
console.error(`💡 To enable project-specific layers, call set_workspace_info with your project path`);
|
|
987
|
+
}
|
|
988
|
+
catch (error) {
|
|
989
|
+
console.error('💥 Fatal error during server startup:', error);
|
|
990
|
+
console.error('Error stack:', error instanceof Error ? error.stack : 'No stack trace');
|
|
991
|
+
process.exit(1);
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* Initialize only embedded knowledge layer at startup
|
|
996
|
+
*/
|
|
997
|
+
async initializeEmbeddedOnly() {
|
|
998
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
999
|
+
const __dirname = dirname(__filename);
|
|
1000
|
+
const embeddedPath = join(__dirname, '../embedded-knowledge');
|
|
1001
|
+
// Initialize minimal layer service with only embedded
|
|
1002
|
+
this.layerService = new MultiContentLayerService();
|
|
1003
|
+
const { EmbeddedKnowledgeLayer } = await import('./layers/embedded-layer.js');
|
|
1004
|
+
const embeddedLayer = new EmbeddedKnowledgeLayer(embeddedPath);
|
|
1005
|
+
this.layerService.addLayer(embeddedLayer);
|
|
1006
|
+
await this.layerService.initialize();
|
|
1007
|
+
// Initialize minimal services for embedded-only mode
|
|
1008
|
+
const legacyConfig = {
|
|
1009
|
+
knowledge_base_path: embeddedPath,
|
|
1010
|
+
indexes_path: join(embeddedPath, 'indexes'),
|
|
1011
|
+
methodologies_path: join(embeddedPath, 'methodologies'),
|
|
1012
|
+
cache_size: 1000,
|
|
1013
|
+
max_search_results: 20,
|
|
1014
|
+
default_bc_version: 'BC22',
|
|
1015
|
+
enable_fuzzy_search: true,
|
|
1016
|
+
search_threshold: 0.6
|
|
1017
|
+
};
|
|
1018
|
+
this.knowledgeService = new KnowledgeService(legacyConfig);
|
|
1019
|
+
await this.knowledgeService.initialize();
|
|
1020
|
+
this.codeAnalysisService = new CodeAnalysisService(this.knowledgeService);
|
|
1021
|
+
this.methodologyService = new MethodologyService(this.knowledgeService);
|
|
1022
|
+
const specialistDiscoveryService = new SpecialistDiscoveryService(this.layerService);
|
|
1023
|
+
this.workflowService = new WorkflowService(this.knowledgeService, this.methodologyService, specialistDiscoveryService);
|
|
1024
|
+
// Initialize tool classes (but servicesInitialized = false will intercept them)
|
|
1025
|
+
// We need these initialized so they appear in the tool list, but they won't execute
|
|
1026
|
+
const sessionStorageConfig = this.layerService.getSessionStorageConfig();
|
|
1027
|
+
this.specialistSessionManager = new SpecialistSessionManager(this.layerService, sessionStorageConfig);
|
|
1028
|
+
this.specialistTools = new SpecialistTools(this.layerService, this.specialistSessionManager, this.knowledgeService);
|
|
1029
|
+
this.specialistDiscoveryService = new SpecialistDiscoveryService(this.layerService);
|
|
1030
|
+
this.specialistDiscoveryTools = new SpecialistDiscoveryTools(this.specialistDiscoveryService, this.specialistSessionManager, this.layerService);
|
|
1031
|
+
this.agentOnboardingTools = new AgentOnboardingTools(this.specialistDiscoveryService, this.layerService);
|
|
1032
|
+
this.specialistHandoffTools = new SpecialistHandoffTools(this.specialistSessionManager, this.specialistDiscoveryService, this.layerService);
|
|
1033
|
+
// Note: Services and tools are initialized, but servicesInitialized = false
|
|
1034
|
+
// This prevents tools from being called until workspace is set
|
|
1035
|
+
console.error('✅ Embedded knowledge loaded. Workspace-specific services pending set_workspace_info.');
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Initialize with user-level configuration (company layers from ~/.bc-code-intel/config.yaml)
|
|
1039
|
+
*/
|
|
1040
|
+
async initializeWithConfiguration(configResult) {
|
|
1041
|
+
console.error(`🚀 Initializing with user-level configuration...`);
|
|
1042
|
+
this.configuration = configResult.config; // Initialize services with the loaded configuration
|
|
1043
|
+
await this.initializeServices(configResult);
|
|
1044
|
+
this.servicesInitialized = true;
|
|
1045
|
+
const specialists = await this.layerService.getAllSpecialists();
|
|
1046
|
+
const topics = this.layerService.getAllTopicIds();
|
|
1047
|
+
const layers = this.layerService.getLayers();
|
|
1048
|
+
console.error(`✅ User configuration loaded: ${topics.length} topics from ${layers.length} layers, ${specialists.length} specialists`);
|
|
1049
|
+
layers.forEach(layer => {
|
|
1050
|
+
const topicCount = layer.getTopicIds().length;
|
|
1051
|
+
console.error(` 📚 ${layer.name}: ${topicCount} topics (priority ${layer.priority})`);
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
/**
|
|
1055
|
+
* Set workspace root and MCP ecosystem info, initialize full services
|
|
1056
|
+
*/
|
|
1057
|
+
async setWorkspaceInfo(path, availableMcps = []) {
|
|
1058
|
+
try {
|
|
1059
|
+
// Normalize and validate path
|
|
1060
|
+
const { resolve } = await import('path');
|
|
1061
|
+
const { existsSync } = await import('fs');
|
|
1062
|
+
const resolvedPath = resolve(path);
|
|
1063
|
+
if (!existsSync(resolvedPath)) {
|
|
1064
|
+
return {
|
|
1065
|
+
success: false,
|
|
1066
|
+
message: `Path does not exist: ${resolvedPath}`,
|
|
1067
|
+
reloaded: false
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
// Check if this is the same workspace
|
|
1071
|
+
if (this.workspaceRoot === resolvedPath) {
|
|
1072
|
+
// Update availableMcps even if workspace unchanged
|
|
1073
|
+
this.availableMcps = availableMcps;
|
|
1074
|
+
// Update layer service with new MCP availability (dynamic filtering)
|
|
1075
|
+
if (this.layerService) {
|
|
1076
|
+
this.layerService.setAvailableMcps(availableMcps);
|
|
1077
|
+
}
|
|
1078
|
+
return {
|
|
1079
|
+
success: true,
|
|
1080
|
+
message: `Workspace root already set to: ${resolvedPath}${availableMcps.length > 0 ? ` | Updated MCP ecosystem: ${availableMcps.length} servers` : ''}`,
|
|
1081
|
+
reloaded: false
|
|
1082
|
+
};
|
|
1083
|
+
}
|
|
1084
|
+
console.error(`📁 Setting workspace root to: ${resolvedPath}`);
|
|
1085
|
+
if (availableMcps.length > 0) {
|
|
1086
|
+
console.error(`🔧 MCP Ecosystem: ${availableMcps.join(', ')}`);
|
|
1087
|
+
}
|
|
1088
|
+
// Change working directory
|
|
1089
|
+
process.chdir(resolvedPath);
|
|
1090
|
+
this.workspaceRoot = resolvedPath;
|
|
1091
|
+
this.availableMcps = availableMcps;
|
|
1092
|
+
// Update layer service with available MCPs for conditional topic filtering
|
|
1093
|
+
if (this.layerService) {
|
|
1094
|
+
this.layerService.setAvailableMcps(availableMcps);
|
|
1095
|
+
}
|
|
1096
|
+
// Load configuration with workspace context (merges user + project configs)
|
|
1097
|
+
const configResult = await this.configLoader.loadConfiguration(resolvedPath);
|
|
1098
|
+
if (configResult.validation_errors.length > 0) {
|
|
1099
|
+
console.error('⚠️ Configuration validation errors:');
|
|
1100
|
+
configResult.validation_errors.forEach(error => {
|
|
1101
|
+
console.error(` - ${error.field}: ${error.message}`);
|
|
1102
|
+
});
|
|
1103
|
+
}
|
|
1104
|
+
// Initialize full services with configuration
|
|
1105
|
+
await this.initializeServices(configResult);
|
|
1106
|
+
this.servicesInitialized = true;
|
|
1107
|
+
const specialists = await this.layerService.getAllSpecialists();
|
|
1108
|
+
const topics = this.layerService.getAllTopicIds();
|
|
1109
|
+
const mcpInfo = availableMcps.length > 0 ? ` | MCP Ecosystem: ${availableMcps.length} servers` : '';
|
|
1110
|
+
return {
|
|
1111
|
+
success: true,
|
|
1112
|
+
message: `Workspace configured successfully. Loaded ${topics.length} topics from ${this.layerService.getLayers().length} layers, ${specialists.length} specialists available.${mcpInfo}`,
|
|
1113
|
+
reloaded: true
|
|
1114
|
+
};
|
|
1115
|
+
}
|
|
1116
|
+
catch (error) {
|
|
1117
|
+
console.error('❌ Error setting workspace info:', error);
|
|
1118
|
+
return {
|
|
1119
|
+
success: false,
|
|
1120
|
+
message: `Failed to set workspace info: ${error instanceof Error ? error.message : String(error)}`,
|
|
1121
|
+
reloaded: false
|
|
1122
|
+
};
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* Get configuration quality score for startup diagnostics
|
|
1127
|
+
*/
|
|
1128
|
+
async getConfigurationQuality() {
|
|
1129
|
+
if (!this.configuration)
|
|
1130
|
+
return 0;
|
|
1131
|
+
try {
|
|
1132
|
+
const validator = new ConfigurationValidator();
|
|
1133
|
+
const validation = await validator.validate(this.configuration);
|
|
1134
|
+
return validation.score;
|
|
1135
|
+
}
|
|
1136
|
+
catch {
|
|
1137
|
+
return 0;
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
// Start the server
|
|
1142
|
+
async function main() {
|
|
1143
|
+
try {
|
|
1144
|
+
// Ultra-early platform diagnostics (before any server initialization)
|
|
1145
|
+
console.error('=== Pre-Initialization Platform Check ===');
|
|
1146
|
+
console.error(`Node.js: ${process.version}`);
|
|
1147
|
+
console.error(`Platform: ${process.platform} (${process.arch})`);
|
|
1148
|
+
console.error(`PWD: ${process.cwd()}`);
|
|
1149
|
+
console.error(`Script: ${process.argv[1]}`);
|
|
1150
|
+
// Check for workspace root argument (e.g., "." passed from MCP client)
|
|
1151
|
+
const workspaceArg = process.argv[2];
|
|
1152
|
+
if (workspaceArg) {
|
|
1153
|
+
console.error(`Workspace argument provided: "${workspaceArg}"`);
|
|
1154
|
+
const { resolve } = await import('path');
|
|
1155
|
+
const resolvedPath = resolve(workspaceArg);
|
|
1156
|
+
console.error(`Resolved to: ${resolvedPath}`);
|
|
1157
|
+
// Override process.cwd() for config/layer discovery
|
|
1158
|
+
process.chdir(resolvedPath);
|
|
1159
|
+
console.error(`Changed working directory to: ${process.cwd()}`);
|
|
1160
|
+
}
|
|
1161
|
+
const server = new BCCodeIntelligenceServer();
|
|
1162
|
+
await server.run();
|
|
1163
|
+
}
|
|
1164
|
+
catch (error) {
|
|
1165
|
+
console.error('💥 Fatal error in main():', error);
|
|
1166
|
+
console.error('Error details:', {
|
|
1167
|
+
name: error instanceof Error ? error.name : 'Unknown',
|
|
1168
|
+
message: error instanceof Error ? error.message : String(error),
|
|
1169
|
+
stack: error instanceof Error ? error.stack : 'No stack trace'
|
|
1170
|
+
});
|
|
1171
|
+
process.exit(1);
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
// Handle process termination
|
|
1175
|
+
process.on('SIGINT', async () => {
|
|
1176
|
+
console.error('BC Code Intelligence MCP Server shutting down (SIGINT)...');
|
|
1177
|
+
process.exit(0);
|
|
1178
|
+
});
|
|
1179
|
+
process.on('SIGTERM', async () => {
|
|
1180
|
+
console.error('BC Code Intelligence MCP Server shutting down (SIGTERM)...');
|
|
1181
|
+
process.exit(0);
|
|
1182
|
+
});
|
|
1183
|
+
// Catch unhandled promise rejections (common cause of silent crashes)
|
|
1184
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
1185
|
+
console.error('💥 Unhandled Promise Rejection:');
|
|
1186
|
+
console.error('Reason:', reason);
|
|
1187
|
+
console.error('Promise:', promise);
|
|
1188
|
+
if (reason instanceof Error) {
|
|
1189
|
+
console.error('Stack:', reason.stack);
|
|
1190
|
+
}
|
|
1191
|
+
process.exit(1);
|
|
1192
|
+
});
|
|
1193
|
+
// Catch uncaught exceptions
|
|
1194
|
+
process.on('uncaughtException', (error) => {
|
|
1195
|
+
console.error('💥 Uncaught Exception:');
|
|
1196
|
+
console.error('Error:', error);
|
|
1197
|
+
console.error('Stack:', error.stack);
|
|
1198
|
+
process.exit(1);
|
|
1199
|
+
});
|
|
1200
|
+
// Run server if this is the main module
|
|
1201
|
+
// Check both direct execution (index.js) and binary execution (bc-code-intelligence-mcp, bc-code-intel-server)
|
|
1202
|
+
if (process.argv[1]?.endsWith('index.js') ||
|
|
1203
|
+
process.argv[1]?.endsWith('bc-code-intelligence-mcp') ||
|
|
1204
|
+
process.argv[1]?.endsWith('bc-code-intel-server')) {
|
|
1205
|
+
main().catch((error) => {
|
|
1206
|
+
console.error('Fatal error in BC Code Intelligence MCP Server:', error);
|
|
1207
|
+
process.exit(1);
|
|
1208
|
+
});
|
|
1209
|
+
}
|
|
1210
|
+
export { BCCodeIntelligenceServer };
|
|
1211
|
+
//# sourceMappingURL=index.js.map
|