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