@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
|
@@ -0,0 +1,818 @@
|
|
|
1
|
+
import { getDomainList } from '../types/bc-knowledge.js';
|
|
2
|
+
/**
|
|
3
|
+
* AL Code Analysis Service
|
|
4
|
+
*
|
|
5
|
+
* Analyzes AL code for performance issues, anti-patterns, and optimization
|
|
6
|
+
* opportunities. Dynamically loads patterns from the layered knowledge system.
|
|
7
|
+
*/
|
|
8
|
+
export class CodeAnalysisService {
|
|
9
|
+
knowledgeService;
|
|
10
|
+
patternCache = null;
|
|
11
|
+
cacheExpiry = 0;
|
|
12
|
+
CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
13
|
+
constructor(knowledgeService) {
|
|
14
|
+
this.knowledgeService = knowledgeService;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Load AL code patterns dynamically from knowledge base
|
|
18
|
+
*/
|
|
19
|
+
async loadPatterns() {
|
|
20
|
+
// Check cache first
|
|
21
|
+
if (this.patternCache && Date.now() < this.cacheExpiry) {
|
|
22
|
+
return this.patternCache;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
// Get all code-pattern topics from the knowledge base
|
|
26
|
+
const patternTopics = await this.knowledgeService.findTopicsByType('code-pattern');
|
|
27
|
+
const patterns = patternTopics.map(topic => {
|
|
28
|
+
const frontmatter = topic.frontmatter || {};
|
|
29
|
+
return {
|
|
30
|
+
name: frontmatter.name || topic.id,
|
|
31
|
+
pattern_type: frontmatter.pattern_type || 'unknown',
|
|
32
|
+
regex_patterns: this.parseRegexPatterns(frontmatter.regex_patterns),
|
|
33
|
+
description: frontmatter.description || topic.title,
|
|
34
|
+
related_topics: frontmatter.related_topics || [],
|
|
35
|
+
severity: frontmatter.severity,
|
|
36
|
+
category: frontmatter.category,
|
|
37
|
+
impact_level: frontmatter.impact_level,
|
|
38
|
+
detection_confidence: frontmatter.detection_confidence
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
// Update cache
|
|
42
|
+
this.patternCache = patterns;
|
|
43
|
+
this.cacheExpiry = Date.now() + this.CACHE_TTL;
|
|
44
|
+
return patterns;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.warn('Failed to load code patterns from knowledge base:', error);
|
|
48
|
+
return this.getFallbackPatterns();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse regex patterns from YAML (can be strings or array)
|
|
53
|
+
*/
|
|
54
|
+
parseRegexPatterns(patterns) {
|
|
55
|
+
if (!patterns)
|
|
56
|
+
return [];
|
|
57
|
+
const patternArray = Array.isArray(patterns) ? patterns : [patterns];
|
|
58
|
+
return patternArray.map(pattern => {
|
|
59
|
+
try {
|
|
60
|
+
return new RegExp(pattern, 'gis');
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.warn(`Invalid regex pattern: ${pattern}`);
|
|
64
|
+
return new RegExp('(?!)', 'g'); // Never-matching regex
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Fallback patterns if knowledge base is unavailable
|
|
70
|
+
*/
|
|
71
|
+
getFallbackPatterns() {
|
|
72
|
+
return [
|
|
73
|
+
// Performance Anti-Patterns
|
|
74
|
+
{
|
|
75
|
+
name: 'manual-summation-instead-of-sift',
|
|
76
|
+
pattern_type: 'bad',
|
|
77
|
+
regex_patterns: [
|
|
78
|
+
/repeat\s+[\s\S]*?\+=[\s\S]*?until.*\.Next\(\)/gis,
|
|
79
|
+
/while.*\.Next\(\)\s*=\s*0[\s\S]*?\+=/gis
|
|
80
|
+
],
|
|
81
|
+
description: 'Manual record summation detected - consider using SIFT CalcSums for better performance',
|
|
82
|
+
related_topics: ['sift-technology-fundamentals', 'query-performance-patterns', 'flowfield-optimization']
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'missing-setloadfields',
|
|
86
|
+
pattern_type: 'bad',
|
|
87
|
+
regex_patterns: [
|
|
88
|
+
/FindSet\(\)[\s\S]*?repeat[\s\S]*?(\w+\."[^"]*"\s*[,;].*){3,}/gis
|
|
89
|
+
],
|
|
90
|
+
description: 'Multiple field access without SetLoadFields - this loads unnecessary data',
|
|
91
|
+
related_topics: ['setloadfields-optimization', 'memory-optimization', 'performance-patterns']
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'individual-calcfields-calls',
|
|
95
|
+
pattern_type: 'bad',
|
|
96
|
+
regex_patterns: [
|
|
97
|
+
/CalcFields\([^)]*\)[\s\S]*?CalcFields\([^)]*\)/gis
|
|
98
|
+
],
|
|
99
|
+
description: 'Multiple individual CalcFields calls - consider batching for better performance',
|
|
100
|
+
related_topics: ['flowfield-optimization', 'batch-processing-optimization']
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'inefficient-deleteall',
|
|
104
|
+
pattern_type: 'bad',
|
|
105
|
+
regex_patterns: [
|
|
106
|
+
/repeat[\s\S]*?Delete\((?:true)?\);[\s\S]*?until.*\.Next\(\)/gis
|
|
107
|
+
],
|
|
108
|
+
description: 'Individual record deletion in loop - consider using DeleteAll for better performance',
|
|
109
|
+
related_topics: ['deleteall-patterns', 'batch-processing-optimization', 'performance-optimization']
|
|
110
|
+
},
|
|
111
|
+
// Performance Good Patterns
|
|
112
|
+
{
|
|
113
|
+
name: 'sift-calcsum-usage',
|
|
114
|
+
pattern_type: 'good',
|
|
115
|
+
regex_patterns: [
|
|
116
|
+
/CalcSums\s*\(/gi,
|
|
117
|
+
/SumIndexFields.*=.*MaintainSIFTIndex.*=.*true/gis
|
|
118
|
+
],
|
|
119
|
+
description: 'Good use of SIFT CalcSums for aggregation',
|
|
120
|
+
related_topics: ['sift-technology-fundamentals', 'performance-monitoring']
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'setloadfields-optimization',
|
|
124
|
+
pattern_type: 'good',
|
|
125
|
+
regex_patterns: [
|
|
126
|
+
/SetLoadFields\s*\([^)]+\)[\s\S]*?FindSet\s*\(/gis
|
|
127
|
+
],
|
|
128
|
+
description: 'Excellent use of SetLoadFields for memory optimization',
|
|
129
|
+
related_topics: ['memory-optimization', 'performance-best-practices']
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'proper-key-usage',
|
|
133
|
+
pattern_type: 'good',
|
|
134
|
+
regex_patterns: [
|
|
135
|
+
/SetCurrentKey\s*\([^)]+\)[\s\S]*?SetRange\s*\([^)]+\)/gis
|
|
136
|
+
],
|
|
137
|
+
description: 'Good practice: setting appropriate key before filtering',
|
|
138
|
+
related_topics: ['index-optimization', 'query-performance-patterns']
|
|
139
|
+
},
|
|
140
|
+
// Validation Patterns
|
|
141
|
+
{
|
|
142
|
+
name: 'testfield-validation',
|
|
143
|
+
pattern_type: 'good',
|
|
144
|
+
regex_patterns: [
|
|
145
|
+
/TestField\s*\(/gi
|
|
146
|
+
],
|
|
147
|
+
description: 'Good use of TestField for validation',
|
|
148
|
+
related_topics: ['testfield-patterns', 'validation-strategies', 'error-handling']
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
name: 'fielderror-usage',
|
|
152
|
+
pattern_type: 'unknown',
|
|
153
|
+
regex_patterns: [
|
|
154
|
+
/FieldError\s*\(/gi
|
|
155
|
+
],
|
|
156
|
+
description: 'FieldError usage detected - ensure proper error message construction',
|
|
157
|
+
related_topics: ['fielderror-patterns', 'error-message-construction', 'user-experience']
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'missing-validation',
|
|
161
|
+
pattern_type: 'bad',
|
|
162
|
+
regex_patterns: [
|
|
163
|
+
/Insert\s*\(\s*(?:true)?\s*\);[\s\S]*?(?!TestField|FieldError|if.*=.*'')/gis
|
|
164
|
+
],
|
|
165
|
+
description: 'Record insertion without visible validation - consider adding validation',
|
|
166
|
+
related_topics: ['validation-patterns', 'data-integrity', 'business-rules']
|
|
167
|
+
},
|
|
168
|
+
// Security Patterns
|
|
169
|
+
{
|
|
170
|
+
name: 'missing-permission-check',
|
|
171
|
+
pattern_type: 'bad',
|
|
172
|
+
regex_patterns: [
|
|
173
|
+
/User\.Get\s*\([^)]+\)[^;]*?(?!UserPermissions\.Get|Permission\.)/gis,
|
|
174
|
+
/Database\.SelectLatestVersion\s*\([^)]+\)(?![\s\S]*?Permission)/gis
|
|
175
|
+
],
|
|
176
|
+
description: 'User or database access without permission validation',
|
|
177
|
+
related_topics: ['user-permissions', 'security-fundamentals', 'access-control']
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'hardcoded-credentials',
|
|
181
|
+
pattern_type: 'bad',
|
|
182
|
+
regex_patterns: [
|
|
183
|
+
/password\s*:=\s*'[^']+'/gi,
|
|
184
|
+
/token\s*:=\s*'[A-Za-z0-9]{20,}'/gi,
|
|
185
|
+
/(apikey|secret|pwd)\s*:=\s*'[^']+'/gi
|
|
186
|
+
],
|
|
187
|
+
description: 'Hardcoded credentials detected - use secure configuration',
|
|
188
|
+
related_topics: ['credential-management', 'security-configuration', 'secrets-handling']
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'sql-injection-risk',
|
|
192
|
+
pattern_type: 'bad',
|
|
193
|
+
regex_patterns: [
|
|
194
|
+
/Database\.Execute\s*\([^)]*\+[^)]*\)/gis,
|
|
195
|
+
/SELECTSQL\s*\([^)]*\+[^)]*\)/gis
|
|
196
|
+
],
|
|
197
|
+
description: 'SQL concatenation detected - potential injection risk',
|
|
198
|
+
related_topics: ['sql-injection-prevention', 'parameterized-queries', 'data-safety']
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
name: 'secure-communication',
|
|
202
|
+
pattern_type: 'good',
|
|
203
|
+
regex_patterns: [
|
|
204
|
+
/HttpClient\..*https:\/\//gi,
|
|
205
|
+
/WebServiceConnection.*SSL.*=.*true/gis
|
|
206
|
+
],
|
|
207
|
+
description: 'Good practice: using secure HTTPS communication',
|
|
208
|
+
related_topics: ['secure-communications', 'api-security', 'encryption-patterns']
|
|
209
|
+
},
|
|
210
|
+
// Enhanced Validation Patterns
|
|
211
|
+
{
|
|
212
|
+
name: 'weak-field-validation',
|
|
213
|
+
pattern_type: 'bad',
|
|
214
|
+
regex_patterns: [
|
|
215
|
+
/if\s+.*\."[^"]*"\s*=\s*''\s+then/gis,
|
|
216
|
+
/if\s+.*\."[^"]*"\s*<>\s*''\s+then[\s\S]*?else[\s\S]*?Error/gis
|
|
217
|
+
],
|
|
218
|
+
description: 'Weak field validation - consider using TestField for better UX',
|
|
219
|
+
related_topics: ['validation-patterns', 'testfield-patterns', 'user-experience']
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'missing-range-validation',
|
|
223
|
+
pattern_type: 'bad',
|
|
224
|
+
regex_patterns: [
|
|
225
|
+
/(?:Quantity|Amount|Price|Rate)\s*:=\s*[^;]*;(?![\s\S]*?if.*>.*0)/gis
|
|
226
|
+
],
|
|
227
|
+
description: 'Numeric field assignment without range validation',
|
|
228
|
+
related_topics: ['numeric-validation', 'business-rules', 'data-integrity']
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: 'comprehensive-validation',
|
|
232
|
+
pattern_type: 'good',
|
|
233
|
+
regex_patterns: [
|
|
234
|
+
/TestField\s*\([^)]+\);[\s\S]*?if.*in.*\[.*\].*then/gis,
|
|
235
|
+
/ValidateFields\s*\(/gi
|
|
236
|
+
],
|
|
237
|
+
description: 'Comprehensive validation with TestField and range checks',
|
|
238
|
+
related_topics: ['validation-best-practices', 'data-integrity', 'business-rules']
|
|
239
|
+
},
|
|
240
|
+
// Error Handling Patterns
|
|
241
|
+
{
|
|
242
|
+
name: 'silent-error-handling',
|
|
243
|
+
pattern_type: 'bad',
|
|
244
|
+
regex_patterns: [
|
|
245
|
+
/begin[\s\S]*?end;[\s\S]*?if.*GetLastError.*<>.*''.*then/gis,
|
|
246
|
+
/ClearLastError\s*\(\s*\);/gi
|
|
247
|
+
],
|
|
248
|
+
description: 'Silent error handling - consider proper error propagation',
|
|
249
|
+
related_topics: ['error-handling-patterns', 'error-propagation', 'debugging-strategies']
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
name: 'missing-transaction-handling',
|
|
253
|
+
pattern_type: 'bad',
|
|
254
|
+
regex_patterns: [
|
|
255
|
+
/(Insert|Modify|Delete)\s*\([^)]*\);[\s\S]*?(Insert|Modify|Delete)\s*\([^)]*\);(?![\s\S]*?Commit)/gis
|
|
256
|
+
],
|
|
257
|
+
description: 'Multiple data operations without transaction handling',
|
|
258
|
+
related_topics: ['transaction-patterns', 'data-consistency', 'error-recovery']
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
name: 'proper-error-handling',
|
|
262
|
+
pattern_type: 'good',
|
|
263
|
+
regex_patterns: [
|
|
264
|
+
/if.*not.*Codeunit\.Run\s*\([^)]+\).*then[\s\S]*?Error\s*\(/gis,
|
|
265
|
+
/try[\s\S]*?catch[\s\S]*?Error\s*\(/gis
|
|
266
|
+
],
|
|
267
|
+
description: 'Good practice: proper error handling with user feedback',
|
|
268
|
+
related_topics: ['error-handling-best-practices', 'user-experience', 'debugging-strategies']
|
|
269
|
+
},
|
|
270
|
+
// Data Safety Patterns
|
|
271
|
+
{
|
|
272
|
+
name: 'unsafe-bulk-operations',
|
|
273
|
+
pattern_type: 'bad',
|
|
274
|
+
regex_patterns: [
|
|
275
|
+
/DeleteAll\s*\(\s*\);(?![\s\S]*?SetRange)/gis,
|
|
276
|
+
/ModifyAll\s*\([^)]*\)(?![\s\S]*?SetRange)/gis
|
|
277
|
+
],
|
|
278
|
+
description: 'Bulk operations without filters - potential data loss risk',
|
|
279
|
+
related_topics: ['data-safety-patterns', 'bulk-operations', 'data-protection']
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: 'missing-backup-validation',
|
|
283
|
+
pattern_type: 'bad',
|
|
284
|
+
regex_patterns: [
|
|
285
|
+
/Delete\s*\((?:true)?\);(?![\s\S]*?Confirm\s*\(|[\s\S]*?if.*Count.*>)/gis
|
|
286
|
+
],
|
|
287
|
+
description: 'Record deletion without user confirmation or validation',
|
|
288
|
+
related_topics: ['data-protection', 'user-confirmation', 'deletion-patterns']
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
name: 'safe-data-operations',
|
|
292
|
+
pattern_type: 'good',
|
|
293
|
+
regex_patterns: [
|
|
294
|
+
/if.*Confirm\s*\([^)]*\).*then[\s\S]*?Delete/gis,
|
|
295
|
+
/SetRange\s*\([^)]+\);[\s\S]*?if.*FindSet.*then[\s\S]*?DeleteAll/gis
|
|
296
|
+
],
|
|
297
|
+
description: 'Safe data operations with confirmation and filtering',
|
|
298
|
+
related_topics: ['data-safety-best-practices', 'user-confirmation', 'filtering-patterns']
|
|
299
|
+
},
|
|
300
|
+
// Code Quality Patterns
|
|
301
|
+
{
|
|
302
|
+
name: 'excessive-nesting',
|
|
303
|
+
pattern_type: 'bad',
|
|
304
|
+
regex_patterns: [
|
|
305
|
+
/if[\s\S]*?if[\s\S]*?if[\s\S]*?if[\s\S]*?begin/gis
|
|
306
|
+
],
|
|
307
|
+
description: 'Excessive nesting detected - consider refactoring for readability',
|
|
308
|
+
related_topics: ['code-complexity', 'refactoring-patterns', 'maintainability']
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
name: 'magic-numbers',
|
|
312
|
+
pattern_type: 'bad',
|
|
313
|
+
regex_patterns: [
|
|
314
|
+
/(?<!Date\s*\()\b(?:365|30|12|24|60)\b(?!\s*[)])/g,
|
|
315
|
+
/\b\d{4,}\b(?![\s]*[)])/g
|
|
316
|
+
],
|
|
317
|
+
description: 'Magic numbers detected - consider using named constants',
|
|
318
|
+
related_topics: ['code-readability', 'constants-usage', 'maintainability']
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: 'good-code-structure',
|
|
322
|
+
pattern_type: 'good',
|
|
323
|
+
regex_patterns: [
|
|
324
|
+
/const[\s\S]*?=.*\d+;/gi,
|
|
325
|
+
/local\s+procedure\s+\w+[A-Za-z]+\s*\(/gi
|
|
326
|
+
],
|
|
327
|
+
description: 'Good practice: using constants and well-named local procedures',
|
|
328
|
+
related_topics: ['code-organization', 'naming-conventions', 'maintainability']
|
|
329
|
+
},
|
|
330
|
+
// Architecture Patterns
|
|
331
|
+
{
|
|
332
|
+
name: 'tight-coupling',
|
|
333
|
+
pattern_type: 'bad',
|
|
334
|
+
regex_patterns: [
|
|
335
|
+
/Codeunit\s*::\s*"[^"]*"\s*\.[A-Za-z]+/gis
|
|
336
|
+
],
|
|
337
|
+
description: 'Tight coupling between objects - consider using interfaces',
|
|
338
|
+
related_topics: ['loose-coupling', 'interface-patterns', 'dependency-injection']
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
name: 'event-subscriber-usage',
|
|
342
|
+
pattern_type: 'good',
|
|
343
|
+
regex_patterns: [
|
|
344
|
+
/\[EventSubscriber\s*\(/gi,
|
|
345
|
+
/\[IntegrationEvent\s*\(/gi
|
|
346
|
+
],
|
|
347
|
+
description: 'Good practice: using event-driven architecture',
|
|
348
|
+
related_topics: ['event-architecture', 'subscriber-patterns', 'extension-development']
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: 'proper-separation-of-concerns',
|
|
352
|
+
pattern_type: 'good',
|
|
353
|
+
regex_patterns: [
|
|
354
|
+
/interface\s+"[^"]*"/gi,
|
|
355
|
+
/implements\s+"[^"]*"/gi
|
|
356
|
+
],
|
|
357
|
+
description: 'Good architecture: using interfaces for separation of concerns',
|
|
358
|
+
related_topics: ['interface-design', 'clean-architecture', 'dependency-management']
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
name: 'temporary-table-safety',
|
|
362
|
+
pattern_type: 'good',
|
|
363
|
+
regex_patterns: [
|
|
364
|
+
/IsTemporary[\s\S]*?(?:Insert|Modify|Delete)/gis
|
|
365
|
+
],
|
|
366
|
+
description: 'Good practice: checking IsTemporary before table operations',
|
|
367
|
+
related_topics: ['temporary-table-patterns', 'data-protection', 'defensive-programming']
|
|
368
|
+
},
|
|
369
|
+
// User Experience Patterns
|
|
370
|
+
{
|
|
371
|
+
name: 'poor-error-messages',
|
|
372
|
+
pattern_type: 'bad',
|
|
373
|
+
regex_patterns: [
|
|
374
|
+
/Error\s*\(\s*'[^']{1,20}'\s*\)/gi,
|
|
375
|
+
/FieldError\s*\([^,]*,\s*'[^']{1,15}'\s*\)/gis
|
|
376
|
+
],
|
|
377
|
+
description: 'Generic or unclear error messages - improve user experience',
|
|
378
|
+
related_topics: ['error-message-design', 'user-experience', 'localization-patterns']
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: 'missing-progress-indication',
|
|
382
|
+
pattern_type: 'bad',
|
|
383
|
+
regex_patterns: [
|
|
384
|
+
/repeat[\s\S]*?until.*\.Next\(\).*=.*0(?![\s\S]*?Dialog\.Update|Window\.Update)/gis
|
|
385
|
+
],
|
|
386
|
+
description: 'Long-running process without progress indication',
|
|
387
|
+
related_topics: ['progress-indicators', 'user-experience', 'background-processing']
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: 'good-user-feedback',
|
|
391
|
+
pattern_type: 'good',
|
|
392
|
+
regex_patterns: [
|
|
393
|
+
/Dialog\.Open\s*\([^)]*\);[\s\S]*?Dialog\.Update/gis,
|
|
394
|
+
/Message\s*\([^)]*StrSubstNo\s*\(/gis
|
|
395
|
+
],
|
|
396
|
+
description: 'Good UX: providing progress feedback and formatted messages',
|
|
397
|
+
related_topics: ['user-feedback-patterns', 'progress-indication', 'message-formatting']
|
|
398
|
+
},
|
|
399
|
+
// API Design Patterns
|
|
400
|
+
{
|
|
401
|
+
name: 'inconsistent-api-design',
|
|
402
|
+
pattern_type: 'bad',
|
|
403
|
+
regex_patterns: [
|
|
404
|
+
/procedure\s+Get\w*\s*\([^)]*\)\s*:\s*Boolean[\s\S]*?procedure\s+Find\w*\s*\([^)]*\)\s*:\s*Record/gis
|
|
405
|
+
],
|
|
406
|
+
description: 'Inconsistent API patterns - standardize Get/Find naming conventions',
|
|
407
|
+
related_topics: ['api-design-consistency', 'naming-conventions', 'interface-design']
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
name: 'good-api-design',
|
|
411
|
+
pattern_type: 'good',
|
|
412
|
+
regex_patterns: [
|
|
413
|
+
/procedure\s+\w+\s*\([^)]*var\s+\w+\s*:\s*Record[^)]*\)\s*:\s*Boolean/gis
|
|
414
|
+
],
|
|
415
|
+
description: 'Good API design: consistent parameter patterns and return types',
|
|
416
|
+
related_topics: ['api-design-best-practices', 'parameter-patterns', 'return-type-consistency']
|
|
417
|
+
}
|
|
418
|
+
];
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Analyze AL code for patterns, issues, and optimization opportunities
|
|
422
|
+
*/
|
|
423
|
+
async analyzeCode(params) {
|
|
424
|
+
const code = params.code_snippet;
|
|
425
|
+
const analysisType = params.analysis_type || 'comprehensive';
|
|
426
|
+
const result = {
|
|
427
|
+
issues: [],
|
|
428
|
+
patterns_detected: [],
|
|
429
|
+
optimization_opportunities: [],
|
|
430
|
+
suggested_topics: []
|
|
431
|
+
};
|
|
432
|
+
// Detect patterns in the code
|
|
433
|
+
const detectedPatterns = await this.detectPatterns(code);
|
|
434
|
+
// Filter patterns based on analysis type
|
|
435
|
+
const filteredPatterns = this.filterPatternsByAnalysisType(detectedPatterns, analysisType);
|
|
436
|
+
result.patterns_detected = filteredPatterns.map(p => p.name);
|
|
437
|
+
// Analyze for issues and opportunities
|
|
438
|
+
for (const pattern of filteredPatterns) {
|
|
439
|
+
if (pattern.pattern_type === 'bad') {
|
|
440
|
+
result.issues.push({
|
|
441
|
+
type: 'anti-pattern',
|
|
442
|
+
severity: this.calculateSeverity(pattern, code),
|
|
443
|
+
description: pattern.description,
|
|
444
|
+
suggestion: await this.generateSuggestion(pattern),
|
|
445
|
+
related_topics: pattern.related_topics
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
else if (pattern.pattern_type === 'good') {
|
|
449
|
+
result.issues.push({
|
|
450
|
+
type: 'best-practice',
|
|
451
|
+
severity: 'low',
|
|
452
|
+
description: pattern.description,
|
|
453
|
+
suggestion: 'Continue following this pattern',
|
|
454
|
+
related_topics: pattern.related_topics
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// Generate optimization opportunities
|
|
459
|
+
result.optimization_opportunities = await this.findOptimizationOpportunities(code, detectedPatterns);
|
|
460
|
+
// Suggest relevant topics if requested
|
|
461
|
+
if (params.suggest_topics) {
|
|
462
|
+
result.suggested_topics = await this.suggestTopics(code, detectedPatterns, params.bc_version);
|
|
463
|
+
}
|
|
464
|
+
return result;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Detect AL patterns in code using dynamically loaded patterns
|
|
468
|
+
*/
|
|
469
|
+
async detectPatterns(code) {
|
|
470
|
+
const detected = [];
|
|
471
|
+
const patterns = await this.loadPatterns();
|
|
472
|
+
for (const pattern of patterns) {
|
|
473
|
+
for (const regex of pattern.regex_patterns) {
|
|
474
|
+
if (regex.test(code)) {
|
|
475
|
+
detected.push(pattern);
|
|
476
|
+
break; // Don't add the same pattern multiple times
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return detected;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Filter patterns based on analysis type
|
|
484
|
+
*/
|
|
485
|
+
filterPatternsByAnalysisType(patterns, analysisType) {
|
|
486
|
+
if (analysisType === 'comprehensive') {
|
|
487
|
+
return patterns; // Return all patterns
|
|
488
|
+
}
|
|
489
|
+
return patterns.filter(pattern => {
|
|
490
|
+
const domain = pattern.related_topics?.[0] || '';
|
|
491
|
+
const name = pattern.name.toLowerCase();
|
|
492
|
+
switch (analysisType) {
|
|
493
|
+
case 'performance':
|
|
494
|
+
return domain === 'performance' || name.includes('performance') || name.includes('optimization');
|
|
495
|
+
case 'quality':
|
|
496
|
+
return domain === 'code-quality' || domain === 'best-practices' || pattern.pattern_type === 'good';
|
|
497
|
+
case 'security':
|
|
498
|
+
return domain === 'security' || name.includes('security') || name.includes('permission');
|
|
499
|
+
case 'patterns':
|
|
500
|
+
return pattern.pattern_type === 'good' || pattern.pattern_type === 'bad';
|
|
501
|
+
case 'optimization':
|
|
502
|
+
return domain === 'performance' || name.includes('optimization') || name.includes('performance') || pattern.pattern_type === 'bad';
|
|
503
|
+
case 'general':
|
|
504
|
+
return true; // General analysis includes all patterns with balanced coverage
|
|
505
|
+
default:
|
|
506
|
+
return true; // Return all for unknown types
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Calculate severity of detected issues
|
|
512
|
+
*/
|
|
513
|
+
calculateSeverity(pattern, code) {
|
|
514
|
+
// Performance anti-patterns are generally more severe
|
|
515
|
+
if (pattern.name.includes('manual-summation') || pattern.name.includes('missing-setloadfields')) {
|
|
516
|
+
// Check if it's in a loop or processing large datasets
|
|
517
|
+
if (/repeat.*until.*\.Next\(\)/.test(code) || /FindSet.*repeat/.test(code)) {
|
|
518
|
+
return 'high';
|
|
519
|
+
}
|
|
520
|
+
return 'medium';
|
|
521
|
+
}
|
|
522
|
+
// Validation issues
|
|
523
|
+
if (pattern.name.includes('missing-validation')) {
|
|
524
|
+
return 'medium';
|
|
525
|
+
}
|
|
526
|
+
// Default severity
|
|
527
|
+
return 'low';
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Generate improvement suggestions
|
|
531
|
+
*/
|
|
532
|
+
async generateSuggestion(pattern) {
|
|
533
|
+
const suggestions = {
|
|
534
|
+
// Performance suggestions
|
|
535
|
+
'manual-summation-instead-of-sift': 'Replace manual summation loop with SIFT CalcSums method. Example: Record.CalcSums(Amount) instead of looping through records.',
|
|
536
|
+
'missing-setloadfields': 'Add SetLoadFields before FindSet to only load required fields. Example: SetLoadFields("No.", "Name") before accessing these fields.',
|
|
537
|
+
'individual-calcfields-calls': 'Combine multiple CalcFields calls into a single call. Example: CalcFields("Field1", "Field2", "Field3")',
|
|
538
|
+
'inefficient-deleteall': 'Replace record-by-record deletion with DeleteAll method for better performance.',
|
|
539
|
+
// Security suggestions
|
|
540
|
+
'missing-permission-check': 'Add permission validation before user or database access. Example: if not UserPermissions.Get(UserId) then Error(\'Access denied\');',
|
|
541
|
+
'hardcoded-credentials': 'Move credentials to secure configuration. Use IsolatedStorage or Azure Key Vault instead of hardcoded values.',
|
|
542
|
+
'sql-injection-risk': 'Use parameterized queries instead of string concatenation. Avoid direct SQL concatenation with user input.',
|
|
543
|
+
// Validation suggestions
|
|
544
|
+
'missing-validation': 'Add appropriate validation using TestField or custom validation logic before record operations.',
|
|
545
|
+
'weak-field-validation': 'Replace basic empty checks with TestField for better user experience and consistency.',
|
|
546
|
+
'missing-range-validation': 'Add range validation for numeric fields. Example: if Amount <= 0 then FieldError(Amount, \'must be positive\');',
|
|
547
|
+
// Error handling suggestions
|
|
548
|
+
'silent-error-handling': 'Implement proper error handling with user feedback. Avoid silent failures that hide issues from users.',
|
|
549
|
+
'missing-transaction-handling': 'Wrap multiple data operations in transaction handling for data consistency.',
|
|
550
|
+
// Data safety suggestions
|
|
551
|
+
'unsafe-bulk-operations': 'Add filters before bulk operations. Use SetRange to limit scope of DeleteAll/ModifyAll operations.',
|
|
552
|
+
'missing-backup-validation': 'Add user confirmation before destructive operations. Use Confirm dialog for delete operations.',
|
|
553
|
+
// Code quality suggestions
|
|
554
|
+
'excessive-nesting': 'Reduce nesting depth through guard clauses and early returns. Extract complex logic into separate procedures.',
|
|
555
|
+
'magic-numbers': 'Replace magic numbers with named constants. Example: const DaysInYear = 365;',
|
|
556
|
+
// Architecture suggestions
|
|
557
|
+
'tight-coupling': 'Use interfaces to reduce coupling between objects. Implement dependency injection patterns.',
|
|
558
|
+
// UX suggestions
|
|
559
|
+
'poor-error-messages': 'Provide clear, actionable error messages with context. Use StrSubstNo for formatted messages.',
|
|
560
|
+
'missing-progress-indication': 'Add progress indicators for long-running operations. Use Dialog.Open and Dialog.Update.',
|
|
561
|
+
// API design suggestions
|
|
562
|
+
'inconsistent-api-design': 'Standardize API naming conventions. Use consistent Get/Find patterns across procedures.'
|
|
563
|
+
};
|
|
564
|
+
return suggestions[pattern.name] || 'Consider reviewing this pattern for optimization opportunities.';
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Find optimization opportunities based on detected patterns
|
|
568
|
+
*/
|
|
569
|
+
async findOptimizationOpportunities(code, detectedPatterns) {
|
|
570
|
+
const opportunities = [];
|
|
571
|
+
// Performance opportunities
|
|
572
|
+
if (this.hasLoopedAggregation(code) && !this.hasSIFTUsage(code)) {
|
|
573
|
+
opportunities.push({
|
|
574
|
+
description: 'Implement SIFT indexes for aggregation queries to improve performance by 10-100x',
|
|
575
|
+
impact: 'high',
|
|
576
|
+
difficulty: 'moderate',
|
|
577
|
+
related_topics: ['sift-technology-fundamentals', 'maintainsiftindex-property-behavior']
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
if (this.hasMultipleFieldAccess(code) && !this.hasSetLoadFields(code)) {
|
|
581
|
+
opportunities.push({
|
|
582
|
+
description: 'Use SetLoadFields to reduce memory usage and network traffic by 50-80%',
|
|
583
|
+
impact: 'medium',
|
|
584
|
+
difficulty: 'easy',
|
|
585
|
+
related_topics: ['memory-optimization', 'setloadfields-optimization']
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
// Security opportunities
|
|
589
|
+
if (this.hasSecurityRisks(code)) {
|
|
590
|
+
opportunities.push({
|
|
591
|
+
description: 'Implement proper security validation and permission checks',
|
|
592
|
+
impact: 'high',
|
|
593
|
+
difficulty: 'moderate',
|
|
594
|
+
related_topics: ['security-fundamentals', 'user-permissions', 'access-control']
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
// Code quality opportunities
|
|
598
|
+
if (this.hasCodeQualityIssues(code)) {
|
|
599
|
+
opportunities.push({
|
|
600
|
+
description: 'Refactor code to improve readability, maintainability, and reduce complexity',
|
|
601
|
+
impact: 'medium',
|
|
602
|
+
difficulty: 'moderate',
|
|
603
|
+
related_topics: ['refactoring-patterns', 'code-complexity', 'maintainability']
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
// Error handling opportunities
|
|
607
|
+
if (this.hasPoorErrorHandling(code)) {
|
|
608
|
+
opportunities.push({
|
|
609
|
+
description: 'Implement comprehensive error handling with proper user feedback',
|
|
610
|
+
impact: 'medium',
|
|
611
|
+
difficulty: 'easy',
|
|
612
|
+
related_topics: ['error-handling-patterns', 'user-experience', 'debugging-strategies']
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
// Data safety opportunities
|
|
616
|
+
if (this.hasDataSafetyRisks(code)) {
|
|
617
|
+
opportunities.push({
|
|
618
|
+
description: 'Add data protection measures and user confirmations for destructive operations',
|
|
619
|
+
impact: 'high',
|
|
620
|
+
difficulty: 'easy',
|
|
621
|
+
related_topics: ['data-safety-patterns', 'user-confirmation', 'data-protection']
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
// Architecture opportunities
|
|
625
|
+
if (this.hasArchitectureIssues(code)) {
|
|
626
|
+
opportunities.push({
|
|
627
|
+
description: 'Improve architecture with better separation of concerns and loose coupling',
|
|
628
|
+
impact: 'medium',
|
|
629
|
+
difficulty: 'complex',
|
|
630
|
+
related_topics: ['clean-architecture', 'interface-design', 'dependency-management']
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
// User experience opportunities
|
|
634
|
+
if (this.hasUXIssues(code)) {
|
|
635
|
+
opportunities.push({
|
|
636
|
+
description: 'Enhance user experience with better feedback, progress indicators, and error messages',
|
|
637
|
+
impact: 'medium',
|
|
638
|
+
difficulty: 'easy',
|
|
639
|
+
related_topics: ['user-experience', 'progress-indicators', 'error-message-design']
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
return opportunities;
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Suggest relevant topics based on code analysis
|
|
646
|
+
*/
|
|
647
|
+
async suggestTopics(code, detectedPatterns, bcVersion) {
|
|
648
|
+
// Collect all related topics from detected patterns
|
|
649
|
+
const relatedTopicIds = new Set();
|
|
650
|
+
for (const pattern of detectedPatterns) {
|
|
651
|
+
pattern.related_topics.forEach(topic => relatedTopicIds.add(topic));
|
|
652
|
+
}
|
|
653
|
+
// Add contextual topics based on code content
|
|
654
|
+
const codeContext = this.extractCodeContext(code);
|
|
655
|
+
const searchResults = await this.knowledgeService.searchTopics({
|
|
656
|
+
code_context: codeContext,
|
|
657
|
+
bc_version: bcVersion,
|
|
658
|
+
limit: 10
|
|
659
|
+
});
|
|
660
|
+
// Combine explicit related topics with search results
|
|
661
|
+
const allSuggestions = new Map();
|
|
662
|
+
// Add search results
|
|
663
|
+
for (const result of searchResults) {
|
|
664
|
+
allSuggestions.set(result.id, result);
|
|
665
|
+
}
|
|
666
|
+
// Enhance with explicitly related topics
|
|
667
|
+
for (const topicId of relatedTopicIds) {
|
|
668
|
+
if (!allSuggestions.has(topicId)) {
|
|
669
|
+
const topic = await this.knowledgeService.getTopic(topicId);
|
|
670
|
+
if (topic) {
|
|
671
|
+
const domains = getDomainList(topic.frontmatter.domain);
|
|
672
|
+
allSuggestions.set(topicId, {
|
|
673
|
+
id: topic.id,
|
|
674
|
+
title: topic.frontmatter.title,
|
|
675
|
+
domain: domains[0] || 'unknown',
|
|
676
|
+
domains: domains.length > 1 ? domains : undefined,
|
|
677
|
+
difficulty: topic.frontmatter.difficulty,
|
|
678
|
+
relevance_score: 0.9, // High relevance for explicitly related topics
|
|
679
|
+
summary: topic.content.substring(0, 200) + '...',
|
|
680
|
+
tags: topic.frontmatter.tags,
|
|
681
|
+
prerequisites: topic.frontmatter.prerequisites || [],
|
|
682
|
+
estimated_time: topic.frontmatter.estimated_time
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
return Array.from(allSuggestions.values())
|
|
688
|
+
.sort((a, b) => b.relevance_score - a.relevance_score)
|
|
689
|
+
.slice(0, 8); // Return top 8 suggestions
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Extract meaningful context from code for search
|
|
693
|
+
*/
|
|
694
|
+
extractCodeContext(code) {
|
|
695
|
+
const contexts = [];
|
|
696
|
+
// Extract comprehensive context across all domains
|
|
697
|
+
if (/table\s+\d+/.test(code))
|
|
698
|
+
contexts.push('table design');
|
|
699
|
+
if (/FindSet|FindFirst|FindLast/.test(code))
|
|
700
|
+
contexts.push('record iteration');
|
|
701
|
+
if (/CalcFields|CalcSums/.test(code))
|
|
702
|
+
contexts.push('field calculations');
|
|
703
|
+
if (/SetRange|SetFilter/.test(code))
|
|
704
|
+
contexts.push('filtering');
|
|
705
|
+
if (/Insert|Modify|Delete/.test(code))
|
|
706
|
+
contexts.push('data modification');
|
|
707
|
+
// Security context
|
|
708
|
+
if (/User\.|Permission|Security/.test(code))
|
|
709
|
+
contexts.push('security');
|
|
710
|
+
if (/password|token|secret|credential/i.test(code))
|
|
711
|
+
contexts.push('credential management');
|
|
712
|
+
if (/Database\.Execute|SELECTSQL/.test(code))
|
|
713
|
+
contexts.push('database security');
|
|
714
|
+
// Validation context
|
|
715
|
+
if (/TestField|FieldError|Validate/.test(code))
|
|
716
|
+
contexts.push('validation');
|
|
717
|
+
if (/Confirm\s*\(/.test(code))
|
|
718
|
+
contexts.push('user confirmation');
|
|
719
|
+
// Error handling context
|
|
720
|
+
if (/Error\s*\(|GetLastError|ClearLastError/.test(code))
|
|
721
|
+
contexts.push('error handling');
|
|
722
|
+
if (/try|catch|Codeunit\.Run/.test(code))
|
|
723
|
+
contexts.push('exception management');
|
|
724
|
+
// Architecture context
|
|
725
|
+
if (/EventSubscriber|IntegrationEvent/.test(code))
|
|
726
|
+
contexts.push('event architecture');
|
|
727
|
+
if (/interface|implements/.test(code))
|
|
728
|
+
contexts.push('clean architecture');
|
|
729
|
+
if (/Codeunit\s*::|Page\s*::|Report\s*::/.test(code))
|
|
730
|
+
contexts.push('object coupling');
|
|
731
|
+
// Performance context
|
|
732
|
+
if (/repeat.*until.*Next/.test(code))
|
|
733
|
+
contexts.push('record loops');
|
|
734
|
+
if (/FlowField|CalcFormula/.test(code))
|
|
735
|
+
contexts.push('flowfields');
|
|
736
|
+
if (/SetLoadFields/.test(code))
|
|
737
|
+
contexts.push('memory optimization');
|
|
738
|
+
// User experience context
|
|
739
|
+
if (/Dialog\.|Window\.|Message\s*\(/.test(code))
|
|
740
|
+
contexts.push('user feedback');
|
|
741
|
+
if (/Progress|Update/.test(code))
|
|
742
|
+
contexts.push('progress indication');
|
|
743
|
+
// Code quality context
|
|
744
|
+
if ((code.match(/if/gi) || []).length > 5)
|
|
745
|
+
contexts.push('code complexity');
|
|
746
|
+
if (/\b\d{3,}\b/.test(code))
|
|
747
|
+
contexts.push('magic numbers');
|
|
748
|
+
// Data safety context
|
|
749
|
+
if (/DeleteAll|ModifyAll/.test(code))
|
|
750
|
+
contexts.push('bulk operations');
|
|
751
|
+
if (/IsTemporary/.test(code))
|
|
752
|
+
contexts.push('temporary tables');
|
|
753
|
+
// API design context
|
|
754
|
+
if (/procedure.*Get.*Boolean|procedure.*Find.*Record/.test(code))
|
|
755
|
+
contexts.push('api design');
|
|
756
|
+
if (/webservice|restapi|soap/i.test(code))
|
|
757
|
+
contexts.push('web services');
|
|
758
|
+
return contexts.join(' ');
|
|
759
|
+
}
|
|
760
|
+
// Performance pattern detection
|
|
761
|
+
hasLoopedAggregation(code) {
|
|
762
|
+
return /repeat[\s\S]*?\+=[\s\S]*?until.*\.Next\(\)/.test(code);
|
|
763
|
+
}
|
|
764
|
+
hasSIFTUsage(code) {
|
|
765
|
+
return /CalcSums\s*\(/.test(code);
|
|
766
|
+
}
|
|
767
|
+
hasMultipleFieldAccess(code) {
|
|
768
|
+
return /FindSet\(\)[\s\S]*?repeat[\s\S]*?(\w+\."[^"]*"\s*[,;].*){3,}/.test(code);
|
|
769
|
+
}
|
|
770
|
+
hasSetLoadFields(code) {
|
|
771
|
+
return /SetLoadFields\s*\(/.test(code);
|
|
772
|
+
}
|
|
773
|
+
hasIndividualRecordOperations(code) {
|
|
774
|
+
return /repeat[\s\S]*?(Insert|Modify|Delete)\s*\([\s\S]*?until.*\.Next\(\)/.test(code);
|
|
775
|
+
}
|
|
776
|
+
hasManualCalculations(code) {
|
|
777
|
+
return /repeat[\s\S]*?(\+=|\*=|\/=)[\s\S]*?until.*\.Next\(\)/.test(code);
|
|
778
|
+
}
|
|
779
|
+
// Security pattern detection
|
|
780
|
+
hasSecurityRisks(code) {
|
|
781
|
+
return /User\.Get\s*\([^)]+\)(?!.*Permission)/.test(code) ||
|
|
782
|
+
/password\s*:=\s*'[^']+'/i.test(code) ||
|
|
783
|
+
/Database\.Execute\s*\([^)]*\+/.test(code);
|
|
784
|
+
}
|
|
785
|
+
// Code quality pattern detection
|
|
786
|
+
hasCodeQualityIssues(code) {
|
|
787
|
+
const nestingLevel = (code.match(/if[\s\S]*?begin/gi) || []).length;
|
|
788
|
+
const magicNumbers = /\b\d{3,}\b/.test(code);
|
|
789
|
+
const longProcedures = code.split('procedure').length > 1 && code.length > 2000;
|
|
790
|
+
return nestingLevel > 3 || magicNumbers || longProcedures;
|
|
791
|
+
}
|
|
792
|
+
// Error handling pattern detection
|
|
793
|
+
hasPoorErrorHandling(code) {
|
|
794
|
+
const hasOperations = /(Insert|Modify|Delete|Codeunit\.Run)\s*\(/.test(code);
|
|
795
|
+
const hasErrorHandling = /if.*not.*then[\s\S]*?Error|try[\s\S]*?catch/.test(code);
|
|
796
|
+
return hasOperations && !hasErrorHandling;
|
|
797
|
+
}
|
|
798
|
+
// Data safety pattern detection
|
|
799
|
+
hasDataSafetyRisks(code) {
|
|
800
|
+
return /DeleteAll\s*\(\s*\)(?!.*SetRange)/.test(code) ||
|
|
801
|
+
/Delete\s*\((?:true)?\)(?!.*Confirm)/.test(code) ||
|
|
802
|
+
/ModifyAll\s*\([^)]*\)(?!.*SetRange)/.test(code);
|
|
803
|
+
}
|
|
804
|
+
// Architecture pattern detection
|
|
805
|
+
hasArchitectureIssues(code) {
|
|
806
|
+
const tightCoupling = /Codeunit\s*::\s*"[^"]*"\s*\.[A-Za-z]+/.test(code);
|
|
807
|
+
const noInterfaces = !/(interface|implements)\s+"/.test(code) && code.includes('procedure');
|
|
808
|
+
return tightCoupling || (noInterfaces && code.length > 1000);
|
|
809
|
+
}
|
|
810
|
+
// User experience pattern detection
|
|
811
|
+
hasUXIssues(code) {
|
|
812
|
+
const hasLongProcess = /repeat[\s\S]*?until.*\.Next\(\)/.test(code);
|
|
813
|
+
const hasProgressFeedback = /Dialog\.(Open|Update)|Window\.Update/.test(code);
|
|
814
|
+
const hasGenericErrors = /Error\s*\(\s*'[^']{1,20}'\s*\)/.test(code);
|
|
815
|
+
return (hasLongProcess && !hasProgressFeedback) || hasGenericErrors;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
//# sourceMappingURL=code-analysis-service.js.map
|