@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.
Files changed (753) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -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 +440 -0
  10. package/dist/cli/bc-code-intel-cli.js.map +1 -0
  11. package/dist/config/config-loader.d.ts +28 -0
  12. package/dist/config/config-loader.d.ts.map +1 -0
  13. package/dist/config/config-loader.js +497 -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 +608 -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 +82 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +1211 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/layers/base-layer.d.ts +133 -0
  40. package/dist/layers/base-layer.d.ts.map +1 -0
  41. package/dist/layers/base-layer.js +290 -0
  42. package/dist/layers/base-layer.js.map +1 -0
  43. package/dist/layers/embedded-layer.d.ts +130 -0
  44. package/dist/layers/embedded-layer.d.ts.map +1 -0
  45. package/dist/layers/embedded-layer.js +612 -0
  46. package/dist/layers/embedded-layer.js.map +1 -0
  47. package/dist/layers/git-layer.d.ts +77 -0
  48. package/dist/layers/git-layer.d.ts.map +1 -0
  49. package/dist/layers/git-layer.js +529 -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 +135 -0
  56. package/dist/layers/layer-service.d.ts.map +1 -0
  57. package/dist/layers/layer-service.js +586 -0
  58. package/dist/layers/layer-service.js.map +1 -0
  59. package/dist/layers/project-layer.d.ts +58 -0
  60. package/dist/layers/project-layer.d.ts.map +1 -0
  61. package/dist/layers/project-layer.js +286 -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 +358 -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 +818 -0
  86. package/dist/services/code-analysis-service.js.map +1 -0
  87. package/dist/services/enhanced-prompt-service.d.ts +56 -0
  88. package/dist/services/enhanced-prompt-service.d.ts.map +1 -0
  89. package/dist/services/enhanced-prompt-service.js +165 -0
  90. package/dist/services/enhanced-prompt-service.js.map +1 -0
  91. package/dist/services/knowledge-service.d.ts +90 -0
  92. package/dist/services/knowledge-service.d.ts.map +1 -0
  93. package/dist/services/knowledge-service.js +342 -0
  94. package/dist/services/knowledge-service.js.map +1 -0
  95. package/dist/services/methodology-service.d.ts +91 -0
  96. package/dist/services/methodology-service.d.ts.map +1 -0
  97. package/dist/services/methodology-service.js +423 -0
  98. package/dist/services/methodology-service.js.map +1 -0
  99. package/dist/services/multi-content-layer-service.d.ts +198 -0
  100. package/dist/services/multi-content-layer-service.d.ts.map +1 -0
  101. package/dist/services/multi-content-layer-service.js +991 -0
  102. package/dist/services/multi-content-layer-service.js.map +1 -0
  103. package/dist/services/roleplay-engine.d.ts +161 -0
  104. package/dist/services/roleplay-engine.d.ts.map +1 -0
  105. package/dist/services/roleplay-engine.js +994 -0
  106. package/dist/services/roleplay-engine.js.map +1 -0
  107. package/dist/services/session-storage/file-storage.d.ts +30 -0
  108. package/dist/services/session-storage/file-storage.d.ts.map +1 -0
  109. package/dist/services/session-storage/file-storage.js +229 -0
  110. package/dist/services/session-storage/file-storage.js.map +1 -0
  111. package/dist/services/session-storage/in-memory-storage.d.ts +31 -0
  112. package/dist/services/session-storage/in-memory-storage.d.ts.map +1 -0
  113. package/dist/services/session-storage/in-memory-storage.js +142 -0
  114. package/dist/services/session-storage/in-memory-storage.js.map +1 -0
  115. package/dist/services/specialist-discovery.d.ts +98 -0
  116. package/dist/services/specialist-discovery.d.ts.map +1 -0
  117. package/dist/services/specialist-discovery.js +387 -0
  118. package/dist/services/specialist-discovery.js.map +1 -0
  119. package/dist/services/specialist-loader.d.ts +101 -0
  120. package/dist/services/specialist-loader.d.ts.map +1 -0
  121. package/dist/services/specialist-loader.js +256 -0
  122. package/dist/services/specialist-loader.js.map +1 -0
  123. package/dist/services/specialist-session-manager.d.ts +76 -0
  124. package/dist/services/specialist-session-manager.d.ts.map +1 -0
  125. package/dist/services/specialist-session-manager.js +255 -0
  126. package/dist/services/specialist-session-manager.js.map +1 -0
  127. package/dist/services/workflow-service.d.ts +146 -0
  128. package/dist/services/workflow-service.d.ts.map +1 -0
  129. package/dist/services/workflow-service.js +409 -0
  130. package/dist/services/workflow-service.js.map +1 -0
  131. package/dist/setup/post-install.d.ts +12 -0
  132. package/dist/setup/post-install.d.ts.map +1 -0
  133. package/dist/setup/post-install.js +81 -0
  134. package/dist/setup/post-install.js.map +1 -0
  135. package/dist/streamlined-handlers.d.ts +94 -0
  136. package/dist/streamlined-handlers.d.ts.map +1 -0
  137. package/dist/streamlined-handlers.js +665 -0
  138. package/dist/streamlined-handlers.js.map +1 -0
  139. package/dist/test-enhanced-mcp-server.d.ts +7 -0
  140. package/dist/test-enhanced-mcp-server.d.ts.map +1 -0
  141. package/dist/test-enhanced-mcp-server.js +177 -0
  142. package/dist/test-enhanced-mcp-server.js.map +1 -0
  143. package/dist/tools/config-diagnostic-tools.d.ts +234 -0
  144. package/dist/tools/config-diagnostic-tools.d.ts.map +1 -0
  145. package/dist/tools/config-diagnostic-tools.js +887 -0
  146. package/dist/tools/config-diagnostic-tools.js.map +1 -0
  147. package/dist/tools/core-tools.d.ts +26 -0
  148. package/dist/tools/core-tools.d.ts.map +1 -0
  149. package/dist/tools/core-tools.js +241 -0
  150. package/dist/tools/core-tools.js.map +1 -0
  151. package/dist/tools/handoff-tools.d.ts +37 -0
  152. package/dist/tools/handoff-tools.d.ts.map +1 -0
  153. package/dist/tools/handoff-tools.js +265 -0
  154. package/dist/tools/handoff-tools.js.map +1 -0
  155. package/dist/tools/index.d.ts +61 -0
  156. package/dist/tools/index.d.ts.map +1 -0
  157. package/dist/tools/index.js +75 -0
  158. package/dist/tools/index.js.map +1 -0
  159. package/dist/tools/onboarding-tools.d.ts +43 -0
  160. package/dist/tools/onboarding-tools.d.ts.map +1 -0
  161. package/dist/tools/onboarding-tools.js +353 -0
  162. package/dist/tools/onboarding-tools.js.map +1 -0
  163. package/dist/tools/specialist-discovery-tools.d.ts +27 -0
  164. package/dist/tools/specialist-discovery-tools.d.ts.map +1 -0
  165. package/dist/tools/specialist-discovery-tools.js +275 -0
  166. package/dist/tools/specialist-discovery-tools.js.map +1 -0
  167. package/dist/tools/specialist-tools.d.ts +43 -0
  168. package/dist/tools/specialist-tools.d.ts.map +1 -0
  169. package/dist/tools/specialist-tools.js +372 -0
  170. package/dist/tools/specialist-tools.js.map +1 -0
  171. package/dist/tools/workspace-tools.d.ts +96 -0
  172. package/dist/tools/workspace-tools.d.ts.map +1 -0
  173. package/dist/tools/workspace-tools.js +188 -0
  174. package/dist/tools/workspace-tools.js.map +1 -0
  175. package/dist/types/bc-knowledge.d.ts +303 -0
  176. package/dist/types/bc-knowledge.d.ts.map +1 -0
  177. package/dist/types/bc-knowledge.js +69 -0
  178. package/dist/types/bc-knowledge.js.map +1 -0
  179. package/dist/types/config-types.d.ts +186 -0
  180. package/dist/types/config-types.d.ts.map +1 -0
  181. package/dist/types/config-types.js +109 -0
  182. package/dist/types/config-types.js.map +1 -0
  183. package/dist/types/enhanced-layer-types.d.ts +193 -0
  184. package/dist/types/enhanced-layer-types.d.ts.map +1 -0
  185. package/dist/types/enhanced-layer-types.js +9 -0
  186. package/dist/types/enhanced-layer-types.js.map +1 -0
  187. package/dist/types/index.d.ts +5 -0
  188. package/dist/types/index.d.ts.map +1 -0
  189. package/dist/types/index.js +7 -0
  190. package/dist/types/index.js.map +1 -0
  191. package/dist/types/layer-types.d.ts +173 -0
  192. package/dist/types/layer-types.d.ts.map +1 -0
  193. package/dist/types/layer-types.js +27 -0
  194. package/dist/types/layer-types.js.map +1 -0
  195. package/dist/types/roleplay-types.d.ts +156 -0
  196. package/dist/types/roleplay-types.d.ts.map +1 -0
  197. package/dist/types/roleplay-types.js +8 -0
  198. package/dist/types/roleplay-types.js.map +1 -0
  199. package/dist/types/session-types.d.ts +127 -0
  200. package/dist/types/session-types.d.ts.map +1 -0
  201. package/dist/types/session-types.js +8 -0
  202. package/dist/types/session-types.js.map +1 -0
  203. package/dist/utils/path-utils.d.ts +5 -0
  204. package/dist/utils/path-utils.d.ts.map +1 -0
  205. package/dist/utils/path-utils.js +14 -0
  206. package/dist/utils/path-utils.js.map +1 -0
  207. package/dist/workflows/domain-workflows.d.ts +8 -0
  208. package/dist/workflows/domain-workflows.d.ts.map +1 -0
  209. package/dist/workflows/domain-workflows.js +360 -0
  210. package/dist/workflows/domain-workflows.js.map +1 -0
  211. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +24 -0
  212. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +24 -0
  213. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +30 -0
  214. package/embedded-knowledge/AGENTS.md +178 -0
  215. package/embedded-knowledge/CONTRIBUTING.md +58 -0
  216. package/embedded-knowledge/LICENSE +21 -0
  217. package/embedded-knowledge/README.md +32 -0
  218. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +90 -0
  219. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +113 -0
  220. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +101 -0
  221. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +87 -0
  222. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +155 -0
  223. package/embedded-knowledge/domains/alex-architect/delegating-to-github-copilot-agents.md +371 -0
  224. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +138 -0
  225. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +79 -0
  226. package/embedded-knowledge/domains/alex-architect/object-id-ninja-integration.md +281 -0
  227. package/embedded-knowledge/domains/alex-architect/recommend-object-id-ninja.md +248 -0
  228. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +280 -0
  229. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +200 -0
  230. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +565 -0
  231. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +665 -0
  232. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +325 -0
  233. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +696 -0
  234. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +320 -0
  235. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +102 -0
  236. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +433 -0
  237. package/embedded-knowledge/domains/alex-architect/samples/testability-design-patterns.md +223 -0
  238. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +66 -0
  239. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +115 -0
  240. package/embedded-knowledge/domains/alex-architect/testability-design-patterns.md +77 -0
  241. package/embedded-knowledge/domains/casey-copilot/long-running-session-instructions.md +263 -0
  242. package/embedded-knowledge/domains/casey-copilot/samples/long-running-session-instructions.md +323 -0
  243. package/embedded-knowledge/domains/chris-config/configuration-file-discovery.md +846 -0
  244. package/embedded-knowledge/domains/chris-config/configuration-file-formats.md +595 -0
  245. package/embedded-knowledge/domains/chris-config/content-types-structure.md +421 -0
  246. package/embedded-knowledge/domains/chris-config/knowledge-content-creation.md +437 -0
  247. package/embedded-knowledge/domains/chris-config/layer-system-fundamentals.md +257 -0
  248. package/embedded-knowledge/domains/chris-config/multi-team-layer-configuration.md +302 -0
  249. package/embedded-knowledge/domains/chris-config/workspace-detection-solutions.md +336 -0
  250. package/embedded-knowledge/domains/dean-debug/bc-telemetry-buddy-integration.md +453 -0
  251. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +360 -0
  252. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +86 -0
  253. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +96 -0
  254. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +70 -0
  255. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +84 -0
  256. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +93 -0
  257. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +73 -0
  258. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +78 -0
  259. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +79 -0
  260. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +87 -0
  261. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +209 -0
  262. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +246 -0
  263. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +107 -0
  264. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +105 -0
  265. package/embedded-knowledge/domains/dean-debug/recommend-bc-telemetry-buddy.md +160 -0
  266. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +186 -0
  267. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +60 -0
  268. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +139 -0
  269. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +190 -0
  270. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +516 -0
  271. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +298 -0
  272. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +324 -0
  273. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +344 -0
  274. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +137 -0
  275. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +340 -0
  276. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +810 -0
  277. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +86 -0
  278. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +110 -0
  279. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +758 -0
  280. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +665 -0
  281. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +316 -0
  282. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +223 -0
  283. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +149 -0
  284. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +412 -0
  285. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +211 -0
  286. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +155 -0
  287. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +475 -0
  288. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +238 -0
  289. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +97 -0
  290. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +666 -0
  291. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +319 -0
  292. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +236 -0
  293. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +59 -0
  294. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +67 -0
  295. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +70 -0
  296. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +90 -0
  297. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +87 -0
  298. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +70 -0
  299. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +74 -0
  300. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +81 -0
  301. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +56 -0
  302. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +66 -0
  303. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +79 -0
  304. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +78 -0
  305. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +83 -0
  306. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +76 -0
  307. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +104 -0
  308. package/embedded-knowledge/domains/eva-errors/codeunit-run-pattern.md +159 -0
  309. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +145 -0
  310. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +104 -0
  311. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +114 -0
  312. package/embedded-knowledge/domains/eva-errors/samples/codeunit-run-pattern.md +239 -0
  313. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +356 -0
  314. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +256 -0
  315. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +101 -0
  316. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +108 -0
  317. package/embedded-knowledge/domains/eva-errors/samples/try-function-usage.md +195 -0
  318. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +80 -0
  319. package/embedded-knowledge/domains/eva-errors/try-function-usage.md +129 -0
  320. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +98 -0
  321. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +123 -0
  322. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +96 -0
  323. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +115 -0
  324. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +115 -0
  325. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +114 -0
  326. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +395 -0
  327. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +479 -0
  328. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +548 -0
  329. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +287 -0
  330. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +434 -0
  331. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +508 -0
  332. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +615 -0
  333. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +144 -0
  334. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +96 -0
  335. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +124 -0
  336. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +84 -0
  337. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +75 -0
  338. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +96 -0
  339. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +385 -0
  340. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +72 -0
  341. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +48 -0
  342. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +49 -0
  343. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +67 -0
  344. package/embedded-knowledge/domains/morgan-market/partner-readiness-analysis.md +201 -0
  345. package/embedded-knowledge/domains/morgan-market/samples/partner-readiness-checklist.md +288 -0
  346. package/embedded-knowledge/domains/parker-pragmatic/README.md +39 -0
  347. package/embedded-knowledge/domains/parker-pragmatic/proposal-workflows/creating-effective-proposals.md +583 -0
  348. package/embedded-knowledge/domains/parker-pragmatic/trust-building/working-with-ai-skeptics.md +587 -0
  349. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +119 -0
  350. package/embedded-knowledge/domains/quinn-tester/isolation-testing-patterns.md +82 -0
  351. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +123 -0
  352. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +64 -0
  353. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +60 -0
  354. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +83 -0
  355. package/embedded-knowledge/domains/quinn-tester/samples/isolation-testing-patterns.md +424 -0
  356. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +716 -0
  357. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +101 -0
  358. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +91 -0
  359. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +79 -0
  360. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +79 -0
  361. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +89 -0
  362. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +76 -0
  363. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +76 -0
  364. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +76 -0
  365. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +81 -0
  366. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +76 -0
  367. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +75 -0
  368. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +76 -0
  369. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +76 -0
  370. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +76 -0
  371. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +96 -0
  372. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +76 -0
  373. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +86 -0
  374. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +90 -0
  375. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +82 -0
  376. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +78 -0
  377. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +76 -0
  378. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +78 -0
  379. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +100 -0
  380. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +115 -0
  381. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +124 -0
  382. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +110 -0
  383. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +438 -0
  384. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +255 -0
  385. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +209 -0
  386. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +218 -0
  387. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +218 -0
  388. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +280 -0
  389. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +188 -0
  390. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +245 -0
  391. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +244 -0
  392. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +278 -0
  393. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +484 -0
  394. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +64 -0
  395. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +107 -0
  396. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +280 -0
  397. package/embedded-knowledge/domains/roger-reviewer/samples/testability-code-smells.md +256 -0
  398. package/embedded-knowledge/domains/roger-reviewer/testability-code-smells.md +67 -0
  399. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +75 -0
  400. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +67 -0
  401. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +76 -0
  402. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +98 -0
  403. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +128 -0
  404. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +75 -0
  405. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +95 -0
  406. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +141 -0
  407. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +91 -0
  408. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +118 -0
  409. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +111 -0
  410. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +113 -0
  411. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +127 -0
  412. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +141 -0
  413. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +66 -0
  414. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +96 -0
  415. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +161 -0
  416. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +177 -0
  417. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +239 -0
  418. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +346 -0
  419. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +298 -0
  420. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +677 -0
  421. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +117 -0
  422. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +75 -0
  423. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +169 -0
  424. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +399 -0
  425. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +356 -0
  426. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +889 -0
  427. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +84 -0
  428. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +127 -0
  429. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +89 -0
  430. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +516 -0
  431. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +61 -0
  432. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +427 -0
  433. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +122 -0
  434. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +96 -0
  435. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +101 -0
  436. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +149 -0
  437. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +107 -0
  438. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +95 -0
  439. package/embedded-knowledge/domains/seth-security/api-permission-model.md +115 -0
  440. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +78 -0
  441. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +373 -0
  442. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +308 -0
  443. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +146 -0
  444. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +79 -0
  445. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +78 -0
  446. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +81 -0
  447. package/embedded-knowledge/indexes/bc-version-matrix.json +188 -0
  448. package/embedded-knowledge/indexes/domain-catalog.json +106 -0
  449. package/embedded-knowledge/indexes/tags/abbreviations.json +1 -0
  450. package/embedded-knowledge/indexes/tags/abstraction.json +1 -0
  451. package/embedded-knowledge/indexes/tags/access-control.json +1 -0
  452. package/embedded-knowledge/indexes/tags/accessibility.json +1 -0
  453. package/embedded-knowledge/indexes/tags/actions.json +1 -0
  454. package/embedded-knowledge/indexes/tags/advanced-patterns.json +1 -0
  455. package/embedded-knowledge/indexes/tags/advanced.json +1 -0
  456. package/embedded-knowledge/indexes/tags/al-extension.json +1 -0
  457. package/embedded-knowledge/indexes/tags/al-generics.json +1 -0
  458. package/embedded-knowledge/indexes/tags/al-objects.json +1 -0
  459. package/embedded-knowledge/indexes/tags/al-syntax.json +1 -0
  460. package/embedded-knowledge/indexes/tags/algorithm-structure.json +1 -0
  461. package/embedded-knowledge/indexes/tags/alternatives.json +1 -0
  462. package/embedded-knowledge/indexes/tags/analytics.json +1 -0
  463. package/embedded-knowledge/indexes/tags/api-delegates.json +1 -0
  464. package/embedded-knowledge/indexes/tags/api-design.json +1 -0
  465. package/embedded-knowledge/indexes/tags/api-documentation.json +1 -0
  466. package/embedded-knowledge/indexes/tags/api-endpoints.json +1 -0
  467. package/embedded-knowledge/indexes/tags/api-extensibility.json +1 -0
  468. package/embedded-knowledge/indexes/tags/api-fieldsets.json +1 -0
  469. package/embedded-knowledge/indexes/tags/api-integration.json +1 -0
  470. package/embedded-knowledge/indexes/tags/api-interfaces.json +1 -0
  471. package/embedded-knowledge/indexes/tags/api-optimization.json +1 -0
  472. package/embedded-knowledge/indexes/tags/api-pages.json +1 -0
  473. package/embedded-knowledge/indexes/tags/api-patterns.json +1 -0
  474. package/embedded-knowledge/indexes/tags/api-permissions.json +1 -0
  475. package/embedded-knowledge/indexes/tags/api-responses.json +1 -0
  476. package/embedded-knowledge/indexes/tags/api-simplification.json +1 -0
  477. package/embedded-knowledge/indexes/tags/api.json +1 -0
  478. package/embedded-knowledge/indexes/tags/architecture.json +1 -0
  479. package/embedded-knowledge/indexes/tags/async-patterns.json +1 -0
  480. package/embedded-knowledge/indexes/tags/async-processing.json +1 -0
  481. package/embedded-knowledge/indexes/tags/automatic-registration.json +1 -0
  482. package/embedded-knowledge/indexes/tags/batch-operations.json +1 -0
  483. package/embedded-knowledge/indexes/tags/bc24-migration.json +1 -0
  484. package/embedded-knowledge/indexes/tags/begin-blocks.json +1 -0
  485. package/embedded-knowledge/indexes/tags/begin-end.json +1 -0
  486. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +1 -0
  487. package/embedded-knowledge/indexes/tags/best-practices.json +1 -0
  488. package/embedded-knowledge/indexes/tags/binding.json +1 -0
  489. package/embedded-knowledge/indexes/tags/block-structure.json +1 -0
  490. package/embedded-knowledge/indexes/tags/blocks.json +1 -0
  491. package/embedded-knowledge/indexes/tags/boolean-expressions.json +1 -0
  492. package/embedded-knowledge/indexes/tags/branching.json +1 -0
  493. package/embedded-knowledge/indexes/tags/breaking-changes.json +1 -0
  494. package/embedded-knowledge/indexes/tags/breakpoints.json +1 -0
  495. package/embedded-knowledge/indexes/tags/business-foundation.json +1 -0
  496. package/embedded-knowledge/indexes/tags/business-infrastructure.json +1 -0
  497. package/embedded-knowledge/indexes/tags/business-process.json +1 -0
  498. package/embedded-knowledge/indexes/tags/business-rules.json +1 -0
  499. package/embedded-knowledge/indexes/tags/caching.json +1 -0
  500. package/embedded-knowledge/indexes/tags/case-statements.json +1 -0
  501. package/embedded-knowledge/indexes/tags/case.json +1 -0
  502. package/embedded-knowledge/indexes/tags/code-analysis.json +1 -0
  503. package/embedded-knowledge/indexes/tags/code-clarity.json +1 -0
  504. package/embedded-knowledge/indexes/tags/code-comprehension.json +1 -0
  505. package/embedded-knowledge/indexes/tags/code-conversion.json +1 -0
  506. package/embedded-knowledge/indexes/tags/code-formatting.json +1 -0
  507. package/embedded-knowledge/indexes/tags/code-organization.json +1 -0
  508. package/embedded-knowledge/indexes/tags/code-patterns.json +1 -0
  509. package/embedded-knowledge/indexes/tags/code-quality.json +1 -0
  510. package/embedded-knowledge/indexes/tags/code-reuse.json +1 -0
  511. package/embedded-knowledge/indexes/tags/code-simplification.json +1 -0
  512. package/embedded-knowledge/indexes/tags/code-standards.json +1 -0
  513. package/embedded-knowledge/indexes/tags/code-structure.json +1 -0
  514. package/embedded-knowledge/indexes/tags/code-style.json +1 -0
  515. package/embedded-knowledge/indexes/tags/codeunit-design.json +1 -0
  516. package/embedded-knowledge/indexes/tags/command-queue.json +1 -0
  517. package/embedded-knowledge/indexes/tags/comments.json +1 -0
  518. package/embedded-knowledge/indexes/tags/compile-time-validation.json +1 -0
  519. package/embedded-knowledge/indexes/tags/complex-facade.json +1 -0
  520. package/embedded-knowledge/indexes/tags/complexity-hiding.json +1 -0
  521. package/embedded-knowledge/indexes/tags/complexity-management.json +1 -0
  522. package/embedded-knowledge/indexes/tags/compound-statements.json +1 -0
  523. package/embedded-knowledge/indexes/tags/concurrency.json +1 -0
  524. package/embedded-knowledge/indexes/tags/conditional-logic.json +1 -0
  525. package/embedded-knowledge/indexes/tags/conditional.json +1 -0
  526. package/embedded-knowledge/indexes/tags/conflict-resolution.json +1 -0
  527. package/embedded-knowledge/indexes/tags/consistency.json +1 -0
  528. package/embedded-knowledge/indexes/tags/contract-design.json +1 -0
  529. package/embedded-knowledge/indexes/tags/control-flow.json +1 -0
  530. package/embedded-knowledge/indexes/tags/conversion-guide.json +1 -0
  531. package/embedded-knowledge/indexes/tags/correlation.json +1 -0
  532. package/embedded-knowledge/indexes/tags/custom-messages.json +1 -0
  533. package/embedded-knowledge/indexes/tags/data-access.json +1 -0
  534. package/embedded-knowledge/indexes/tags/data-exposure.json +1 -0
  535. package/embedded-knowledge/indexes/tags/data-integrity.json +1 -0
  536. package/embedded-knowledge/indexes/tags/data-loading.json +1 -0
  537. package/embedded-knowledge/indexes/tags/data-manipulation.json +1 -0
  538. package/embedded-knowledge/indexes/tags/data-modeling.json +1 -0
  539. package/embedded-knowledge/indexes/tags/data-patterns.json +1 -0
  540. package/embedded-knowledge/indexes/tags/data-protection.json +1 -0
  541. package/embedded-knowledge/indexes/tags/data-validation.json +1 -0
  542. package/embedded-knowledge/indexes/tags/database.json +1 -0
  543. package/embedded-knowledge/indexes/tags/debugging.json +1 -0
  544. package/embedded-knowledge/indexes/tags/decision-making.json +1 -0
  545. package/embedded-knowledge/indexes/tags/declaration.json +1 -0
  546. package/embedded-knowledge/indexes/tags/default-messages.json +1 -0
  547. package/embedded-knowledge/indexes/tags/defensive-programming.json +1 -0
  548. package/embedded-knowledge/indexes/tags/deleteall.json +1 -0
  549. package/embedded-knowledge/indexes/tags/dependencies.json +1 -0
  550. package/embedded-knowledge/indexes/tags/deployment.json +1 -0
  551. package/embedded-knowledge/indexes/tags/developer-productivity.json +1 -0
  552. package/embedded-knowledge/indexes/tags/development-workflow.json +1 -0
  553. package/embedded-knowledge/indexes/tags/diagnostics.json +1 -0
  554. package/embedded-knowledge/indexes/tags/dimensions.json +1 -0
  555. package/embedded-knowledge/indexes/tags/documentation.json +1 -0
  556. package/embedded-knowledge/indexes/tags/early-exit.json +1 -0
  557. package/embedded-knowledge/indexes/tags/else-clauses.json +1 -0
  558. package/embedded-knowledge/indexes/tags/end-statements.json +1 -0
  559. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +1 -0
  560. package/embedded-knowledge/indexes/tags/entity-relationships.json +1 -0
  561. package/embedded-knowledge/indexes/tags/error-handling.json +1 -0
  562. package/embedded-knowledge/indexes/tags/error-messages.json +1 -0
  563. package/embedded-knowledge/indexes/tags/error-prevention.json +1 -0
  564. package/embedded-knowledge/indexes/tags/error-text.json +1 -0
  565. package/embedded-knowledge/indexes/tags/etag.json +1 -0
  566. package/embedded-knowledge/indexes/tags/event-bridge.json +1 -0
  567. package/embedded-knowledge/indexes/tags/event-payload.json +1 -0
  568. package/embedded-knowledge/indexes/tags/event-routing.json +1 -0
  569. package/embedded-knowledge/indexes/tags/events.json +1 -0
  570. package/embedded-knowledge/indexes/tags/execution-flow.json +1 -0
  571. package/embedded-knowledge/indexes/tags/expressions.json +1 -0
  572. package/embedded-knowledge/indexes/tags/extensibility.json +1 -0
  573. package/embedded-knowledge/indexes/tags/extensions.json +1 -0
  574. package/embedded-knowledge/indexes/tags/facade-composition.json +1 -0
  575. package/embedded-knowledge/indexes/tags/facade-pattern.json +1 -0
  576. package/embedded-knowledge/indexes/tags/field-control.json +1 -0
  577. package/embedded-knowledge/indexes/tags/field-exclusion.json +1 -0
  578. package/embedded-knowledge/indexes/tags/field-registration.json +1 -0
  579. package/embedded-knowledge/indexes/tags/field-state.json +1 -0
  580. package/embedded-knowledge/indexes/tags/field-validation.json +1 -0
  581. package/embedded-knowledge/indexes/tags/fielderror.json +1 -0
  582. package/embedded-knowledge/indexes/tags/fields.json +1 -0
  583. package/embedded-knowledge/indexes/tags/filtering.json +1 -0
  584. package/embedded-knowledge/indexes/tags/filters.json +1 -0
  585. package/embedded-knowledge/indexes/tags/formatting.json +1 -0
  586. package/embedded-knowledge/indexes/tags/generic-methods.json +1 -0
  587. package/embedded-knowledge/indexes/tags/http-status.json +1 -0
  588. package/embedded-knowledge/indexes/tags/if-statements.json +1 -0
  589. package/embedded-knowledge/indexes/tags/implementation.json +1 -0
  590. package/embedded-knowledge/indexes/tags/indentation.json +1 -0
  591. package/embedded-knowledge/indexes/tags/index-summary.json +277 -0
  592. package/embedded-knowledge/indexes/tags/indexing.json +1 -0
  593. package/embedded-knowledge/indexes/tags/inheritance.json +1 -0
  594. package/embedded-knowledge/indexes/tags/integration.json +1 -0
  595. package/embedded-knowledge/indexes/tags/integrity-checking.json +1 -0
  596. package/embedded-knowledge/indexes/tags/intellisense.json +1 -0
  597. package/embedded-knowledge/indexes/tags/interface-design.json +1 -0
  598. package/embedded-knowledge/indexes/tags/interface-segregation.json +1 -0
  599. package/embedded-knowledge/indexes/tags/isolation.json +1 -0
  600. package/embedded-knowledge/indexes/tags/job-processing.json +1 -0
  601. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +1 -0
  602. package/embedded-knowledge/indexes/tags/keywords.json +1 -0
  603. package/embedded-knowledge/indexes/tags/legacy-modernization.json +1 -0
  604. package/embedded-knowledge/indexes/tags/line-breaks.json +1 -0
  605. package/embedded-knowledge/indexes/tags/line-organization.json +1 -0
  606. package/embedded-knowledge/indexes/tags/line-positioning.json +1 -0
  607. package/embedded-knowledge/indexes/tags/localization.json +1 -0
  608. package/embedded-knowledge/indexes/tags/logging.json +1 -0
  609. package/embedded-knowledge/indexes/tags/loose-coupling.json +1 -0
  610. package/embedded-knowledge/indexes/tags/maintainability.json +1 -0
  611. package/embedded-knowledge/indexes/tags/memory-management.json +1 -0
  612. package/embedded-knowledge/indexes/tags/memory-optimization.json +1 -0
  613. package/embedded-knowledge/indexes/tags/memory.json +1 -0
  614. package/embedded-knowledge/indexes/tags/message-design.json +1 -0
  615. package/embedded-knowledge/indexes/tags/message-formatting.json +1 -0
  616. package/embedded-knowledge/indexes/tags/message-patterns.json +1 -0
  617. package/embedded-knowledge/indexes/tags/metadata-driven.json +1 -0
  618. package/embedded-knowledge/indexes/tags/method-comparison.json +1 -0
  619. package/embedded-knowledge/indexes/tags/module-architecture.json +1 -0
  620. package/embedded-knowledge/indexes/tags/module-validation.json +1 -0
  621. package/embedded-knowledge/indexes/tags/monitoring.json +1 -0
  622. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +1 -0
  623. package/embedded-knowledge/indexes/tags/multi-tenancy.json +1 -0
  624. package/embedded-knowledge/indexes/tags/multiple-values.json +1 -0
  625. package/embedded-knowledge/indexes/tags/naming-conventions.json +1 -0
  626. package/embedded-knowledge/indexes/tags/naming.json +1 -0
  627. package/embedded-knowledge/indexes/tags/navigation.json +1 -0
  628. package/embedded-knowledge/indexes/tags/nested-statements.json +1 -0
  629. package/embedded-knowledge/indexes/tags/no-series-conversion.json +1 -0
  630. package/embedded-knowledge/indexes/tags/no-series-validation.json +1 -0
  631. package/embedded-knowledge/indexes/tags/no-series.json +1 -0
  632. package/embedded-knowledge/indexes/tags/number-generation.json +1 -0
  633. package/embedded-knowledge/indexes/tags/object-documentation.json +1 -0
  634. package/embedded-knowledge/indexes/tags/odata.json +1 -0
  635. package/embedded-knowledge/indexes/tags/ondelete.json +1 -0
  636. package/embedded-knowledge/indexes/tags/onvalidate.json +1 -0
  637. package/embedded-knowledge/indexes/tags/operation-delegation.json +1 -0
  638. package/embedded-knowledge/indexes/tags/operation-safety.json +1 -0
  639. package/embedded-knowledge/indexes/tags/operators.json +1 -0
  640. package/embedded-knowledge/indexes/tags/optimization.json +1 -0
  641. package/embedded-knowledge/indexes/tags/order.json +1 -0
  642. package/embedded-knowledge/indexes/tags/organization.json +1 -0
  643. package/embedded-knowledge/indexes/tags/pages.json +1 -0
  644. package/embedded-knowledge/indexes/tags/parameters.json +1 -0
  645. package/embedded-knowledge/indexes/tags/patterns.json +1 -0
  646. package/embedded-knowledge/indexes/tags/performance-optimization.json +1 -0
  647. package/embedded-knowledge/indexes/tags/performance.json +1 -0
  648. package/embedded-knowledge/indexes/tags/placement.json +1 -0
  649. package/embedded-knowledge/indexes/tags/posting-codeunits.json +1 -0
  650. package/embedded-knowledge/indexes/tags/posting.json +1 -0
  651. package/embedded-knowledge/indexes/tags/preconditions.json +1 -0
  652. package/embedded-knowledge/indexes/tags/primary-key.json +1 -0
  653. package/embedded-knowledge/indexes/tags/privacy.json +1 -0
  654. package/embedded-knowledge/indexes/tags/process-automation.json +1 -0
  655. package/embedded-knowledge/indexes/tags/production.json +1 -0
  656. package/embedded-knowledge/indexes/tags/productivity.json +1 -0
  657. package/embedded-knowledge/indexes/tags/query-performance.json +1 -0
  658. package/embedded-knowledge/indexes/tags/queue-management.json +1 -0
  659. package/embedded-knowledge/indexes/tags/ranges.json +1 -0
  660. package/embedded-knowledge/indexes/tags/readability.json +1 -0
  661. package/embedded-knowledge/indexes/tags/record-access.json +1 -0
  662. package/embedded-knowledge/indexes/tags/record-methods.json +1 -0
  663. package/embedded-knowledge/indexes/tags/refactoring.json +1 -0
  664. package/embedded-knowledge/indexes/tags/reference.json +1 -0
  665. package/embedded-knowledge/indexes/tags/repeat-loops.json +1 -0
  666. package/embedded-knowledge/indexes/tags/repeat-statement.json +1 -0
  667. package/embedded-knowledge/indexes/tags/runtime-errors.json +1 -0
  668. package/embedded-knowledge/indexes/tags/runtime.json +1 -0
  669. package/embedded-knowledge/indexes/tags/safeguards.json +1 -0
  670. package/embedded-knowledge/indexes/tags/security.json +1 -0
  671. package/embedded-knowledge/indexes/tags/sequence-management.json +1 -0
  672. package/embedded-knowledge/indexes/tags/serialization.json +1 -0
  673. package/embedded-knowledge/indexes/tags/session-logmessage.json +1 -0
  674. package/embedded-knowledge/indexes/tags/session.json +1 -0
  675. package/embedded-knowledge/indexes/tags/setloadfields.json +1 -0
  676. package/embedded-knowledge/indexes/tags/shortcuts.json +1 -0
  677. package/embedded-knowledge/indexes/tags/sift.json +1 -0
  678. package/embedded-knowledge/indexes/tags/singleinstance.json +1 -0
  679. package/embedded-knowledge/indexes/tags/spacing.json +1 -0
  680. package/embedded-knowledge/indexes/tags/sql-translation.json +1 -0
  681. package/embedded-knowledge/indexes/tags/standards.json +1 -0
  682. package/embedded-knowledge/indexes/tags/statements.json +1 -0
  683. package/embedded-knowledge/indexes/tags/streaming.json +1 -0
  684. package/embedded-knowledge/indexes/tags/strong-typing.json +1 -0
  685. package/embedded-knowledge/indexes/tags/structural-patterns.json +1 -0
  686. package/embedded-knowledge/indexes/tags/structure.json +1 -0
  687. package/embedded-knowledge/indexes/tags/subscribers.json +1 -0
  688. package/embedded-knowledge/indexes/tags/switch.json +1 -0
  689. package/embedded-knowledge/indexes/tags/symbol-search.json +1 -0
  690. package/embedded-knowledge/indexes/tags/syntax.json +1 -0
  691. package/embedded-knowledge/indexes/tags/systemid.json +1 -0
  692. package/embedded-knowledge/indexes/tags/table-configuration.json +1 -0
  693. package/embedded-knowledge/indexes/tags/table-events.json +1 -0
  694. package/embedded-knowledge/indexes/tags/table-keys.json +1 -0
  695. package/embedded-knowledge/indexes/tags/table-safety.json +1 -0
  696. package/embedded-knowledge/indexes/tags/task-scheduler.json +1 -0
  697. package/embedded-knowledge/indexes/tags/telemetry.json +1 -0
  698. package/embedded-knowledge/indexes/tags/template-method.json +1 -0
  699. package/embedded-knowledge/indexes/tags/temporary-tables.json +1 -0
  700. package/embedded-knowledge/indexes/tags/testfield.json +1 -0
  701. package/embedded-knowledge/indexes/tags/tradeoffs.json +1 -0
  702. package/embedded-knowledge/indexes/tags/triggers.json +1 -0
  703. package/embedded-knowledge/indexes/tags/troubleshooting.json +1 -0
  704. package/embedded-knowledge/indexes/tags/type-safety.json +1 -0
  705. package/embedded-knowledge/indexes/tags/url-structure.json +1 -0
  706. package/embedded-knowledge/indexes/tags/user-experience.json +1 -0
  707. package/embedded-knowledge/indexes/tags/user-feedback.json +1 -0
  708. package/embedded-knowledge/indexes/tags/user-interface.json +1 -0
  709. package/embedded-knowledge/indexes/tags/validation-feedback.json +1 -0
  710. package/embedded-knowledge/indexes/tags/validation.json +1 -0
  711. package/embedded-knowledge/indexes/tags/variables.json +1 -0
  712. package/embedded-knowledge/indexes/tags/verbosity.json +1 -0
  713. package/embedded-knowledge/indexes/tags/vs-code.json +1 -0
  714. package/embedded-knowledge/indexes/tags/web-services.json +1 -0
  715. package/embedded-knowledge/indexes/tags/workflow-management.json +1 -0
  716. package/embedded-knowledge/indexes/tags/workflow-optimization.json +1 -0
  717. package/embedded-knowledge/indexes/tags/workflow-templates.json +1 -0
  718. package/embedded-knowledge/indexes/tags/workspace.json +1 -0
  719. package/embedded-knowledge/indexes/tags/xml-documentation.json +1 -0
  720. package/embedded-knowledge/indexes/topic-relationships.json +128 -0
  721. package/embedded-knowledge/methodologies/index.json +81 -0
  722. package/embedded-knowledge/methodologies/phases/analysis-full.md +208 -0
  723. package/embedded-knowledge/methodologies/phases/analysis-quick.md +44 -0
  724. package/embedded-knowledge/methodologies/phases/analysis.md +182 -0
  725. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +174 -0
  726. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +31 -0
  727. package/embedded-knowledge/methodologies/phases/execution-validation.md +174 -0
  728. package/embedded-knowledge/methodologies/phases/performance-full.md +211 -0
  729. package/embedded-knowledge/methodologies/phases/performance-quick.md +32 -0
  730. package/embedded-knowledge/methodologies/phases/performance.md +211 -0
  731. package/embedded-knowledge/methodologies/phases/verification-full.md +162 -0
  732. package/embedded-knowledge/methodologies/phases/verification-quick.md +48 -0
  733. package/embedded-knowledge/methodologies/phases/verification.md +146 -0
  734. package/embedded-knowledge/methodologies/workflow-enforcement.md +142 -0
  735. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +99 -0
  736. package/embedded-knowledge/methodologies/workflows/proposal-review-workflow.md +535 -0
  737. package/embedded-knowledge/specialists/alex-architect.md +305 -0
  738. package/embedded-knowledge/specialists/casey-copilot.md +314 -0
  739. package/embedded-knowledge/specialists/chris-config.md +226 -0
  740. package/embedded-knowledge/specialists/dean-debug.md +365 -0
  741. package/embedded-knowledge/specialists/eva-errors.md +291 -0
  742. package/embedded-knowledge/specialists/jordan-bridge.md +291 -0
  743. package/embedded-knowledge/specialists/logan-legacy.md +265 -0
  744. package/embedded-knowledge/specialists/maya-mentor.md +299 -0
  745. package/embedded-knowledge/specialists/morgan-market.md +281 -0
  746. package/embedded-knowledge/specialists/parker-pragmatic.md +564 -0
  747. package/embedded-knowledge/specialists/quinn-tester.md +323 -0
  748. package/embedded-knowledge/specialists/roger-reviewer.md +317 -0
  749. package/embedded-knowledge/specialists/sam-coder.md +342 -0
  750. package/embedded-knowledge/specialists/seth-security.md +290 -0
  751. package/embedded-knowledge/specialists/taylor-docs.md +312 -0
  752. package/embedded-knowledge/specialists/uma-ux.md +291 -0
  753. 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