apexrest 1.2.0 → 1.3.0

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 (239) hide show
  1. package/README.md +90 -134
  2. package/dist/codex-compat/.claude-plugin/marketplace.json +20 -0
  3. package/dist/codex-compat/plugins/apexrest-apex/.claude-plugin/plugin.json +28 -0
  4. package/dist/codex-compat/plugins/apexrest-apex/.codex-plugin/plugin.json +7 -7
  5. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aanalytics%2Fstatus-summary%401.0.0.json +19 -0
  6. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Acrud%2Freport-dialog%401.0.0.json +19 -0
  7. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fdetail%401.0.0.json +19 -0
  8. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Ffiltered-list%401.0.0.json +19 -0
  9. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fhistory%401.0.0.json +19 -0
  10. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fmaster-detail%401.0.0.json +19 -0
  11. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/generator.json +5 -0
  12. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/manifest.json +29 -0
  13. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/analytics/status-summary/1.0.0/block.yaml +59 -0
  14. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/analytics/status-summary/1.0.0/renderer.json +14 -0
  15. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/crud/report-dialog/1.0.0/block.yaml +66 -0
  16. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/crud/report-dialog/1.0.0/renderer.json +14 -0
  17. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/detail/1.0.0/block.yaml +59 -0
  18. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/detail/1.0.0/renderer.json +14 -0
  19. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/filtered-list/1.0.0/block.yaml +59 -0
  20. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/filtered-list/1.0.0/renderer.json +14 -0
  21. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/history/1.0.0/block.yaml +59 -0
  22. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/history/1.0.0/renderer.json +14 -0
  23. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/master-detail/1.0.0/block.yaml +59 -0
  24. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/master-detail/1.0.0/renderer.json +14 -0
  25. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/profiles.json +10 -0
  26. package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/revocations.json +1 -0
  27. package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/crm.yaml +172 -0
  28. package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/index.json +12 -0
  29. package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/service-desk.yaml +120 -0
  30. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-allocation.schema.json +33 -0
  31. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-block.schema.json +208 -0
  32. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-blueprint.schema.json +665 -0
  33. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-command.schema.json +106 -0
  34. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-contract.schema.json +174 -0
  35. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-diagnostic.schema.json +26 -0
  36. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-entity.schema.json +142 -0
  37. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-evidence.schema.json +95 -0
  38. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-field.schema.json +54 -0
  39. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-instance.schema.json +117 -0
  40. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-lock.schema.json +54 -0
  41. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-operation.schema.json +55 -0
  42. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-owner.schema.json +105 -0
  43. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-parameters.schema.json +61 -0
  44. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-plan.schema.json +1011 -0
  45. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-renderer.schema.json +69 -0
  46. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-state.schema.json +146 -0
  47. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/deploy-plan.schema.json +754 -169
  48. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/operations.schema.json +525 -256
  49. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/policy.schema.json +21 -0
  50. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/project.schema.json +17 -7
  51. package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/sync-state.schema.json +238 -0
  52. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.md +0 -2
  53. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.md +1 -3
  54. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.md +0 -2
  55. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__yaml__LICENSE +13 -0
  56. package/dist/codex-compat/plugins/apexrest-apex/runtime/apexrest.mjs +81 -45
  57. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-5PCC7GZM.mjs +4090 -0
  58. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-BVPAS3TD.mjs +18 -0
  59. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-CVMECW6D.mjs +65 -0
  60. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-3MDDJFXN.mjs → chunk-JYN3YHP3.mjs} +4220 -10616
  61. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-KGTE7Q5Y.mjs +23 -0
  62. package/dist/{runtime/chunk-HOKFFGSZ.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-KKRFM7Q7.mjs} +21 -4
  63. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2VBZESVC.mjs → chunk-MNU54A7W.mjs} +7 -1
  64. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-N4C2SKCN.mjs +6912 -0
  65. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-WK5GP4ES.mjs → chunk-P3CVQAZW.mjs} +822 -102
  66. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2ZUNLCLK.mjs → chunk-QKYF6N6U.mjs} +210 -112
  67. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-S24BD6PY.mjs → chunk-RBJJNQ5O.mjs} +7 -7
  68. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TMSMKVRP.mjs +10367 -0
  69. package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs} +124 -11
  70. package/dist/codex-compat/plugins/apexrest-apex/runtime/mcp.mjs +5 -10
  71. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/SKILL.md +22 -25
  72. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/agents/openai.yaml +3 -3
  73. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/references/component-routes.md +1 -5
  74. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/SKILL.md +4 -4
  75. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/agents/openai.yaml +1 -1
  76. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/references/capture-and-curation.md +2 -2
  77. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-safety/SKILL.md +18 -0
  78. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-safety/agents/openai.yaml +4 -0
  79. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/SKILL.md +20 -10
  80. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/agents/openai.yaml +3 -3
  81. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/SKILL.md +11 -6
  82. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/agents/openai.yaml +3 -3
  83. package/dist/resources/blocks/evidence/block%3Aanalytics%2Fstatus-summary%401.0.0.json +19 -0
  84. package/dist/resources/blocks/evidence/block%3Acrud%2Freport-dialog%401.0.0.json +19 -0
  85. package/dist/resources/blocks/evidence/block%3Aread%2Fdetail%401.0.0.json +19 -0
  86. package/dist/resources/blocks/evidence/block%3Aread%2Ffiltered-list%401.0.0.json +19 -0
  87. package/dist/resources/blocks/evidence/block%3Aread%2Fhistory%401.0.0.json +19 -0
  88. package/dist/resources/blocks/evidence/block%3Aread%2Fmaster-detail%401.0.0.json +19 -0
  89. package/dist/resources/blocks/generator.json +5 -0
  90. package/dist/resources/blocks/manifest.json +29 -0
  91. package/dist/resources/blocks/packages/analytics/status-summary/1.0.0/block.yaml +59 -0
  92. package/dist/resources/blocks/packages/analytics/status-summary/1.0.0/renderer.json +14 -0
  93. package/dist/resources/blocks/packages/crud/report-dialog/1.0.0/block.yaml +66 -0
  94. package/dist/resources/blocks/packages/crud/report-dialog/1.0.0/renderer.json +14 -0
  95. package/dist/resources/blocks/packages/read/detail/1.0.0/block.yaml +59 -0
  96. package/dist/resources/blocks/packages/read/detail/1.0.0/renderer.json +14 -0
  97. package/dist/resources/blocks/packages/read/filtered-list/1.0.0/block.yaml +59 -0
  98. package/dist/resources/blocks/packages/read/filtered-list/1.0.0/renderer.json +14 -0
  99. package/dist/resources/blocks/packages/read/history/1.0.0/block.yaml +59 -0
  100. package/dist/resources/blocks/packages/read/history/1.0.0/renderer.json +14 -0
  101. package/dist/resources/blocks/packages/read/master-detail/1.0.0/block.yaml +59 -0
  102. package/dist/resources/blocks/packages/read/master-detail/1.0.0/renderer.json +14 -0
  103. package/dist/resources/blocks/profiles.json +10 -0
  104. package/dist/resources/blocks/revocations.json +1 -0
  105. package/dist/resources/blueprints/crm.yaml +172 -0
  106. package/dist/resources/blueprints/index.json +12 -0
  107. package/dist/resources/blueprints/service-desk.yaml +120 -0
  108. package/dist/resources/schemas/composer-allocation.schema.json +33 -0
  109. package/dist/resources/schemas/composer-block.schema.json +208 -0
  110. package/dist/resources/schemas/composer-blueprint.schema.json +665 -0
  111. package/dist/resources/schemas/composer-command.schema.json +106 -0
  112. package/dist/resources/schemas/composer-contract.schema.json +174 -0
  113. package/dist/resources/schemas/composer-diagnostic.schema.json +26 -0
  114. package/dist/resources/schemas/composer-entity.schema.json +142 -0
  115. package/dist/resources/schemas/composer-evidence.schema.json +95 -0
  116. package/dist/resources/schemas/composer-field.schema.json +54 -0
  117. package/dist/resources/schemas/composer-instance.schema.json +117 -0
  118. package/dist/resources/schemas/composer-lock.schema.json +54 -0
  119. package/dist/resources/schemas/composer-operation.schema.json +55 -0
  120. package/dist/resources/schemas/composer-owner.schema.json +105 -0
  121. package/dist/resources/schemas/composer-parameters.schema.json +61 -0
  122. package/dist/resources/schemas/composer-plan.schema.json +1011 -0
  123. package/dist/resources/schemas/composer-renderer.schema.json +69 -0
  124. package/dist/resources/schemas/composer-state.schema.json +146 -0
  125. package/dist/resources/schemas/deploy-plan.schema.json +754 -169
  126. package/dist/resources/schemas/operations.schema.json +525 -256
  127. package/dist/resources/schemas/policy.schema.json +21 -0
  128. package/dist/resources/schemas/project.schema.json +17 -7
  129. package/dist/resources/schemas/sync-state.schema.json +238 -0
  130. package/dist/resources/templates/blank-app/README.md +0 -2
  131. package/dist/resources/templates/customer-crm/README.md +1 -3
  132. package/dist/resources/templates/existing-app/README.md +0 -2
  133. package/dist/resources/third-party/node_modules__yaml__LICENSE +13 -0
  134. package/dist/runtime/apexrest.mjs +81 -45
  135. package/dist/runtime/chunk-5PCC7GZM.mjs +4090 -0
  136. package/dist/runtime/chunk-BVPAS3TD.mjs +18 -0
  137. package/dist/runtime/chunk-CVMECW6D.mjs +65 -0
  138. package/dist/runtime/{chunk-3MDDJFXN.mjs → chunk-JYN3YHP3.mjs} +4220 -10616
  139. package/dist/runtime/chunk-KGTE7Q5Y.mjs +23 -0
  140. package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-HOKFFGSZ.mjs → runtime/chunk-KKRFM7Q7.mjs} +21 -4
  141. package/dist/runtime/{chunk-2VBZESVC.mjs → chunk-MNU54A7W.mjs} +7 -1
  142. package/dist/runtime/chunk-N4C2SKCN.mjs +6912 -0
  143. package/dist/runtime/{chunk-WK5GP4ES.mjs → chunk-P3CVQAZW.mjs} +822 -102
  144. package/dist/runtime/{chunk-2ZUNLCLK.mjs → chunk-QKYF6N6U.mjs} +210 -112
  145. package/dist/runtime/{chunk-S24BD6PY.mjs → chunk-RBJJNQ5O.mjs} +7 -7
  146. package/dist/runtime/chunk-TMSMKVRP.mjs +10367 -0
  147. package/dist/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs} +124 -11
  148. package/dist/runtime/mcp.mjs +5 -10
  149. package/package.json +14 -7
  150. package/README.uk.md +0 -206
  151. package/dist/codex-compat/plugins/apexrest-apex/resources/panel/index.html +0 -61
  152. package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.css +0 -627
  153. package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.js +0 -629
  154. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.uk.md +0 -5
  155. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.uk.md +0 -7
  156. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/database-control/install.sql +0 -17
  157. package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.uk.md +0 -9
  158. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__LICENSE +0 -202
  159. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__NOTICE +0 -5
  160. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__node__LICENSE +0 -21
  161. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__yauzl__LICENSE +0 -21
  162. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +0 -55
  163. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +0 -436
  164. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__esbuild__LICENSE.md +0 -21
  165. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fflate__LICENSE +0 -21
  166. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__marked__LICENSE +0 -44
  167. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__LICENSE +0 -202
  168. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__NOTICE +0 -5
  169. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__LICENSE +0 -202
  170. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__NOTICE +0 -5
  171. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__prettier__LICENSE +0 -7
  172. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__LICENSE +0 -55
  173. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__NOTICE.txt +0 -436
  174. package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__undici-types__LICENSE +0 -21
  175. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-4MYHJ2IU.mjs +0 -1208
  176. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-7RZW5QV2.mjs +0 -992
  177. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-AQZLLQ3D.mjs +0 -203
  178. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-BD2AVCFU.mjs +0 -367
  179. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-IX6V6ZGW.mjs +0 -18
  180. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-NDZ2RWQU.mjs +0 -13
  181. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-QIVPMPU3.mjs +0 -14
  182. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-SPZVXAM5.mjs +0 -147
  183. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TLYYCRQA.mjs +0 -329
  184. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TXVQLYTH.mjs +0 -1271
  185. package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-YLXJ6H4J.mjs +0 -14
  186. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/SKILL.md +0 -9
  187. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/agents/openai.yaml +0 -4
  188. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/SKILL.md +0 -9
  189. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/agents/openai.yaml +0 -4
  190. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/SKILL.md +0 -19
  191. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/agents/openai.yaml +0 -4
  192. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/SKILL.md +0 -38
  193. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/agents/openai.yaml +0 -4
  194. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/SKILL.md +0 -28
  195. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/agents/openai.yaml +0 -4
  196. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/references/cli-catalog.md +0 -23
  197. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/SKILL.md +0 -14
  198. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/agents/openai.yaml +0 -4
  199. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/SKILL.md +0 -9
  200. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/agents/openai.yaml +0 -4
  201. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/SKILL.md +0 -11
  202. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/agents/openai.yaml +0 -4
  203. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/SKILL.md +0 -29
  204. package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/agents/openai.yaml +0 -4
  205. package/dist/resources/panel/index.html +0 -61
  206. package/dist/resources/panel/panel.css +0 -627
  207. package/dist/resources/panel/panel.js +0 -629
  208. package/dist/resources/templates/blank-app/README.uk.md +0 -5
  209. package/dist/resources/templates/customer-crm/README.uk.md +0 -7
  210. package/dist/resources/templates/database-control/install.sql +0 -17
  211. package/dist/resources/templates/existing-app/README.uk.md +0 -9
  212. package/dist/resources/third-party/node_modules__@playwright__test__LICENSE +0 -202
  213. package/dist/resources/third-party/node_modules__@playwright__test__NOTICE +0 -5
  214. package/dist/resources/third-party/node_modules__@types__node__LICENSE +0 -21
  215. package/dist/resources/third-party/node_modules__@types__yauzl__LICENSE +0 -21
  216. package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +0 -55
  217. package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +0 -436
  218. package/dist/resources/third-party/node_modules__esbuild__LICENSE.md +0 -21
  219. package/dist/resources/third-party/node_modules__fflate__LICENSE +0 -21
  220. package/dist/resources/third-party/node_modules__marked__LICENSE +0 -44
  221. package/dist/resources/third-party/node_modules__playwright-core__LICENSE +0 -202
  222. package/dist/resources/third-party/node_modules__playwright-core__NOTICE +0 -5
  223. package/dist/resources/third-party/node_modules__playwright__LICENSE +0 -202
  224. package/dist/resources/third-party/node_modules__playwright__NOTICE +0 -5
  225. package/dist/resources/third-party/node_modules__prettier__LICENSE +0 -7
  226. package/dist/resources/third-party/node_modules__typescript__LICENSE +0 -55
  227. package/dist/resources/third-party/node_modules__typescript__NOTICE.txt +0 -436
  228. package/dist/resources/third-party/node_modules__undici-types__LICENSE +0 -21
  229. package/dist/runtime/chunk-4MYHJ2IU.mjs +0 -1208
  230. package/dist/runtime/chunk-7RZW5QV2.mjs +0 -992
  231. package/dist/runtime/chunk-AQZLLQ3D.mjs +0 -203
  232. package/dist/runtime/chunk-BD2AVCFU.mjs +0 -367
  233. package/dist/runtime/chunk-IX6V6ZGW.mjs +0 -18
  234. package/dist/runtime/chunk-NDZ2RWQU.mjs +0 -13
  235. package/dist/runtime/chunk-QIVPMPU3.mjs +0 -14
  236. package/dist/runtime/chunk-SPZVXAM5.mjs +0 -147
  237. package/dist/runtime/chunk-TLYYCRQA.mjs +0 -329
  238. package/dist/runtime/chunk-TXVQLYTH.mjs +0 -1271
  239. package/dist/runtime/chunk-YLXJ6H4J.mjs +0 -14
@@ -40,7 +40,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
40
40
  ));
41
41
 
42
42
  // packages/core/src/fs.ts
43
- import { mkdir, open, readFile, readdir, realpath, rename, lstat, rm } from "node:fs/promises";
43
+ import { mkdir, open, readFile, readdir, realpath, rename, lstat, rm, link } from "node:fs/promises";
44
44
  import { createReadStream } from "node:fs";
45
45
  import path from "node:path";
46
46
  import { hostname } from "node:os";
@@ -48,17 +48,54 @@ import { createHash, randomUUID as randomUUID2 } from "node:crypto";
48
48
 
49
49
  // packages/core/src/result.ts
50
50
  import { randomUUID } from "node:crypto";
51
+ var DIAGNOSTIC_LIMIT = 50;
51
52
  var Fault = class extends Error {
52
- constructor(code, message, exitCode = 1, status = "failed") {
53
+ constructor(code, message, exitCode = 1, status = "failed", details) {
53
54
  super(message);
54
55
  this.code = code;
55
56
  this.exitCode = exitCode;
56
57
  this.status = status;
58
+ this.details = details;
57
59
  }
58
60
  code;
59
61
  exitCode;
60
62
  status;
63
+ details;
61
64
  };
65
+ var faultNextActions = {
66
+ VALIDATION_FAILED: "Fix the listed diagnostics in the named .apx files, then rerun apexrest_apex_validate until it reports no errors.",
67
+ VALIDATION_UNCONFIRMED: "The compiler returned no success marker. Read the diagnostics, fix the source and rerun apexrest_apex_validate.",
68
+ SOURCE_DRIFT: "Sources changed after review. Rerun apexrest_ship with mode:plan, review it, then apply.",
69
+ TARGET_DRIFT: "The target changed after review. Rerun apexrest_ship with mode:plan and review the new plan.",
70
+ PLAN_EXPIRED: "Rerun apexrest_ship with mode:plan; plans expire 30 minutes after creation.",
71
+ DEPLOY_APPROVAL_REQUIRED: "Run apexrest_ship with mode:apply and userRequest set to the user's literal instruction; it records a plan-bound deploy grant for this attempt.",
72
+ PRODUCTION_CI_REQUIRED: "Production targets need a signed external approval in a protected CI runner; apexrest_ship cannot apply them. Report this to the user.",
73
+ RECOVERY_REVIEW_REQUIRED: "The plan carries destructive, privileged or security risks. Review them with the user and provide a recovery path before applying.",
74
+ PROJECT_TRUST_REQUIRED: "Ask the user to add the project's canonical path to trustedProjects in APEXREST_HOME/policy.json (CLI: apexrest status --detail project shows the path), then retry.",
75
+ PROJECT_NOT_CONFIGURED: "Pass the absolute directory containing apexrest.json, or create one with apexrest_project action:init.",
76
+ CONNECTION_REQUIRED: "Configure the named connection reference with apexrest_project action:connection_add (never send passwords in chat).",
77
+ ENVIRONMENT_REQUIRED: "Pass env with a configured environment name; apexrest_project action:inspect lists them.",
78
+ UNKNOWN_ENVIRONMENT: "Use an environment listed by apexrest_project action:inspect.",
79
+ OUTCOME_UNKNOWN: "Do not retry. Read apexrest_job status for the same jobId and reconcile the target before any new deployment.",
80
+ SYNC_BLOCKED: "Reconcile the interrupted import before syncing or deploying again; do not clear ownership.",
81
+ SYNC_DIRTY: "Local sources differ from the checkpoint. Review or commit them before refreshing the working copy.",
82
+ UNSUPPORTED_CAPABILITY: "The installed SQLcl lacks this apex command. Run apexrest_status detail:doctor and install the pinned toolchain.",
83
+ JOB_OUTCOME_UNKNOWN: "Read apexrest_job status with this jobId; do not repeat the operation."
84
+ };
85
+ function normalizeDiagnostic(entry, code) {
86
+ const d = {
87
+ severity: entry.severity ?? "error",
88
+ code: entry.code ?? code,
89
+ message: redact(String(entry.message))
90
+ };
91
+ if (typeof entry.file === "string") d.file = redact(entry.file);
92
+ if (Number.isInteger(entry.line)) d.line = entry.line;
93
+ if (Number.isInteger(entry.column)) d.column = entry.column;
94
+ if (typeof entry.type === "string") d.type = entry.type;
95
+ if (typeof entry.hint === "string") d.hint = redact(entry.hint);
96
+ if (Array.isArray(entry.validValues)) d.validValues = entry.validValues.map(String);
97
+ return d;
98
+ }
62
99
  var safeArtifactPages = /* @__PURE__ */ new WeakSet();
63
100
  function artifactPage(content, format, id, offset, limit, metadata = {}) {
64
101
  const safe = format === "json" ? JSON.stringify(sanitized(JSON.parse(content))) : redact(content);
@@ -125,6 +162,12 @@ function success(operation, data, summary = "Operation completed.") {
125
162
  }
126
163
  function failure(operation, error) {
127
164
  const e = error instanceof Fault ? error : new Fault("INTERNAL_ERROR", error instanceof Error ? error.message : "Unknown failure");
165
+ const structured = Array.isArray(e.details?.diagnostics) ? e.details.diagnostics : [];
166
+ const diagnostics = structured.length ? structured.slice(0, DIAGNOSTIC_LIMIT).map((entry) => normalizeDiagnostic(entry, e.code)) : [{ severity: "error", code: e.code, message: redact(e.message) }];
167
+ const nextActions = [
168
+ ...Array.isArray(e.details?.nextActions) ? e.details.nextActions.map(redact) : [],
169
+ ...faultNextActions[e.code] ? [faultNextActions[e.code]] : []
170
+ ];
128
171
  return {
129
172
  schemaVersion: 1,
130
173
  ok: false,
@@ -132,9 +175,10 @@ function failure(operation, error) {
132
175
  status: e.status,
133
176
  runId: randomUUID(),
134
177
  summary: redact(e.message),
135
- diagnostics: [{ severity: "error", code: e.code, message: redact(e.message) }],
178
+ diagnostics,
136
179
  artifacts: [],
137
- nextActions: [],
180
+ nextActions,
181
+ ...structured.length > DIAGNOSTIC_LIMIT ? { data: { diagnosticsOmitted: structured.length - DIAGNOSTIC_LIMIT } } : {},
138
182
  exitCode: e.exitCode
139
183
  };
140
184
  }
@@ -169,6 +213,21 @@ async function atomicWrite(file, value) {
169
213
  await rm(temporary, { force: true });
170
214
  throw error;
171
215
  }
216
+ await syncDirectory(path.dirname(file));
217
+ }
218
+ async function syncDirectory(directory) {
219
+ let handle;
220
+ try {
221
+ handle = await open(directory, "r");
222
+ await handle.sync();
223
+ } catch (error) {
224
+ const code = error.code;
225
+ if (process.platform === "win32" || ["EPERM", "EISDIR", "EINVAL", "ENOTSUP", "EBADF"].includes(code ?? ""))
226
+ return;
227
+ throw error;
228
+ } finally {
229
+ await handle?.close();
230
+ }
172
231
  }
173
232
  var writeJson = (file, value) => atomicWrite(file, JSON.stringify(value, null, 2) + "\n");
174
233
  async function readJson(file) {
@@ -184,15 +243,25 @@ async function exists(file) {
184
243
  }
185
244
  }
186
245
  async function contained(root, candidate) {
246
+ return containedPath(root, candidate, false);
247
+ }
248
+ async function containedChild(root, candidate) {
249
+ return containedPath(root, candidate, true);
250
+ }
251
+ async function containedPath(root, candidate, child) {
187
252
  const base = await realpath(root), target = path.resolve(base, candidate);
188
253
  const rel = path.relative(base, target);
189
254
  if (rel === ".." || rel.startsWith(".." + path.sep) || path.isAbsolute(rel))
190
255
  throw new Fault("PATH_ESCAPE", "Path escapes the permitted root.", 2);
256
+ if (child && rel === "")
257
+ throw new Fault("PATH_ESCAPE", "Path must be inside, not equal to, the permitted root.", 2);
191
258
  let probe = target;
192
259
  while (!await exists(probe)) probe = path.dirname(probe);
193
260
  const physical = await realpath(probe), physicalRel = path.relative(base, physical);
194
261
  if (physicalRel === ".." || physicalRel.startsWith(".." + path.sep) || path.isAbsolute(physicalRel))
195
262
  throw new Fault("SYMLINK_ESCAPE", "Symlink escapes the permitted root.", 2);
263
+ if (child && probe === target && physicalRel === "")
264
+ throw new Fault("PATH_ESCAPE", "Path must be inside, not equal to, the permitted root.", 2);
196
265
  return target;
197
266
  }
198
267
  async function inventory(root) {
@@ -211,6 +280,36 @@ async function inventory(root) {
211
280
  await walk(root);
212
281
  return Object.fromEntries(Object.entries(out).sort());
213
282
  }
283
+ var LOCK_CORRUPT_AFTER_MS = 3e4;
284
+ async function createLock(file, owner) {
285
+ const temporary = file + "." + randomUUID2() + ".owner";
286
+ const handle = await open(temporary, "wx", 384);
287
+ try {
288
+ try {
289
+ await handle.writeFile(owner);
290
+ await handle.sync();
291
+ } finally {
292
+ await handle.close();
293
+ }
294
+ try {
295
+ await link(temporary, file);
296
+ return;
297
+ } catch (error) {
298
+ const code = error.code;
299
+ if (code === "EEXIST") throw error;
300
+ if (!["EPERM", "ENOTSUP", "ENOSYS", "EXDEV", "EOPNOTSUPP"].includes(code ?? "")) throw error;
301
+ }
302
+ const fallback = await open(file, "wx", 384);
303
+ try {
304
+ await fallback.writeFile(owner);
305
+ await fallback.sync();
306
+ } finally {
307
+ await fallback.close();
308
+ }
309
+ } finally {
310
+ await rm(temporary, { force: true });
311
+ }
312
+ }
214
313
  async function withLock(file, action) {
215
314
  await mkdir(path.dirname(file), { recursive: true, mode: 448 });
216
315
  const recovery = file + ".recovery";
@@ -227,6 +326,20 @@ async function withLock(file, action) {
227
326
  owner = await readJson(file);
228
327
  } catch {
229
328
  }
329
+ if (!owner || typeof owner !== "object" || !Number.isInteger(owner.pid)) {
330
+ let age = 0;
331
+ try {
332
+ age = Date.now() - (await lstat(file)).mtimeMs;
333
+ } catch {
334
+ }
335
+ if (age > LOCK_CORRUPT_AFTER_MS)
336
+ throw new Fault(
337
+ "LOCK_CORRUPT",
338
+ `Lock file ${file} has no readable owner (an interrupted earlier process left it). Confirm no apexrest operation is running on any host, then delete that file and retry.`,
339
+ 5,
340
+ "conflict"
341
+ );
342
+ }
230
343
  if (owner && owner.hostname === hostname() && Number.isInteger(owner.pid) && owner.pid > 0) {
231
344
  let dead = false;
232
345
  try {
@@ -249,9 +362,11 @@ async function withLock(file, action) {
249
362
  }
250
363
  }
251
364
  }
252
- let handle;
253
365
  try {
254
- handle = await open(file, "wx", 384);
366
+ await createLock(
367
+ file,
368
+ JSON.stringify({ pid: process.pid, hostname: hostname(), createdAt: (/* @__PURE__ */ new Date()).toISOString() })
369
+ );
255
370
  } catch (e) {
256
371
  if (e.code === "EEXIST")
257
372
  throw new Fault(
@@ -263,13 +378,8 @@ async function withLock(file, action) {
263
378
  throw e;
264
379
  }
265
380
  try {
266
- await handle.writeFile(
267
- JSON.stringify({ pid: process.pid, hostname: hostname(), createdAt: (/* @__PURE__ */ new Date()).toISOString() })
268
- );
269
- await handle.sync();
270
381
  return await action();
271
382
  } finally {
272
- await handle.close();
273
383
  await rm(file, { force: true });
274
384
  }
275
385
  }
@@ -289,10 +399,13 @@ export {
289
399
  hashFile,
290
400
  canonical,
291
401
  atomicWrite,
402
+ syncDirectory,
292
403
  writeJson,
293
404
  readJson,
294
405
  exists,
295
406
  contained,
407
+ containedChild,
296
408
  inventory,
409
+ LOCK_CORRUPT_AFTER_MS,
297
410
  withLock
298
411
  };
@@ -1,14 +1,9 @@
1
1
  import { createRequire as __createRequire } from 'node:module'; const require = __createRequire(import.meta.url);
2
- import {
3
- startMcp
4
- } from "./chunk-2ZUNLCLK.mjs";
5
- import "./chunk-TXVQLYTH.mjs";
6
- import "./chunk-AQZLLQ3D.mjs";
7
- import "./chunk-BD2AVCFU.mjs";
8
- import "./chunk-4MYHJ2IU.mjs";
9
- import "./chunk-S24BD6PY.mjs";
10
- import "./chunk-3MDDJFXN.mjs";
11
- import "./chunk-2Z3BZF66.mjs";
12
2
 
13
3
  // packages/mcp/src/main.ts
4
+ if (Number(process.versions.node.split(".")[0]) < 24) {
5
+ process.stderr.write("APEXREST requires Node.js 24 or newer.\n");
6
+ process.exit(3);
7
+ }
8
+ var { startMcp } = await import("./chunk-QKYF6N6U.mjs");
14
9
  await startMcp();
@@ -1,40 +1,37 @@
1
1
  ---
2
2
  name: apexrest-apexlang
3
- description: Create or edit Oracle APEXlang (.apx) using pinned Oracle references and compiler validation. Excludes Salesforce Apex.
3
+ description: Write or edit Oracle APEXlang (.apx) sources using pinned Oracle references, bundled component and pattern recipes, and compiler validation. Read when a change needs syntax, a component contract or a page composition. Excludes Salesforce Apex.
4
4
  ---
5
5
 
6
- Pass the user's absolute workspace as `project` on project-scoped calls.
6
+ # APEXlang
7
7
 
8
- ## Reuse first
8
+ Pass the absolute project directory as `project`. Reuse source already read; retrieve only what changes the edit, with at most 3 `apexrest_reference` lookups per change. Never guess grammar or leave placeholders; `apexrest_apex_validate` is the arbiter.
9
9
 
10
- Inspect relevant source and pinned toolchain once. Reuse existing components, IDs, templates and shared components; export only for missing/stale source. For a new app, use `apexrest_apex_generate` or an installed project template. Preserve `.apex/apexlang.json` and MMD; generate/export into new destinations.
10
+ ## Retrieval
11
11
 
12
- For a reusable component, search `apexrest_reference_search` with `corpus: "components"`, the requested English or Ukrainian name, target `version`, `kind: "template"` and `limit: 3`. Read the selected `component:` recipe and its required parameter/Oracle contracts. Compare its APEX, theme and MMD compatibility with the project. `ready` proves the recorded offline compilation only; inspect SQL/import/browser statuses separately. Read an unresolved result's reason instead of inventing support. The catalog is local reference data: ordinary lookup never connects to the source application. Do not read the complete inventory unless maintaining the catalog.
12
+ - Known entry: `apexrest_reference` `mode:read` with the ID. `oracle:` is a complete document, `grammar:production-name` one production, `component:`/`pattern:` a bundled recipe. Follow only the `requires` and `related` links you need; page with `offset`/`nextOffset`.
13
+ - Unknown syntax: `mode:search` with the exact property or short English terms, `kind` (`grammar`, `template`, `contract`, `guide`), the route `family` from the table below and `limit:3`. `version` `26.1` is the bundled snapshot. Empty results do not prove a feature absent.
14
+ - Reusable component: `mode:search`, `corpus:components`, `kind:template`, English or Ukrainian name, `limit:3`; read the `component:` recipe and its parameter contract. `ready` proves offline compilation only.
15
+ - UX flow across components: `corpus:patterns` the same way; read the `pattern:` recipe and its required `component:`/`oracle:` contracts and keep its page, item and action relationships.
13
16
 
14
- Keep component hosts distinct (for example, a Media List list template versus its template component). Adapt recipe page/item names, DOM IDs, source projections, keys, shared references and submitted items together. Merge into the existing application; the recipe compiler scaffold is not permission to replace authentication, authorization or app settings. Synthetic sources show a data contract and do not establish the user's business schema.
17
+ Entry IDs are `oracle:templates/<family>/<name>._index`; `family` is the search filter:
15
18
 
16
- For a reusable UX flow or page composition, search the separate pattern catalog with `corpus: "patterns"`, a short English or Ukrainian query, `kind: "template"`, the target `version` and `limit: 3`. Read the returned `pattern:` recipe and its required component/Oracle contracts. Preserve its dependency closure and adapt the actual interaction, not just its layout. Ordinary pattern lookup is offline and adds no source-application dependency. Use [pattern catalog maintenance](../apexrest-pattern-catalog/SKILL.md) only when asked to add or update catalog entries from an application.
19
+ - Form page `page-examples/form-page`; form region `region-components/form`.
20
+ - Interactive report, interactive grid, classic report: `region-components/<name>`.
21
+ - Dashboard page `page-examples/dashboard-page`; chart `region-components/chart`; cards `region-components/cards`; metric card `template-components/metric-card`.
22
+ - Media List, Comments: `template-components/<name>`.
23
+ - Smart Filters/Search `region-components/smart-filter-search`; Region Display Selector `region-components/region-display-selector`.
24
+ - Dynamic actions, processes, validations: `business-logic/<name>`.
25
+ - Buttons `buttons`; select list, date picker, popup LOV: `items/<name>`; shared SQL LOV `shared-components/lovs` (`lovs.dynamic.query`).
17
26
 
18
- ## Retrieve only what changes the edit
27
+ Other families: search the English type with `kind:contract`, then use the returned `family`. Read the owning component production to establish valid nesting; grammar presence does not prove that a combination compiles.
19
28
 
20
- Read the selected contract through [component routes](references/component-routes.md). Reuse prior reads; do not dump the reference index or load unrelated families.
29
+ ## Contract notes
21
30
 
22
- - Known ID: `apexrest_reference_read`; `oracle:` selects a complete document, `grammar:production-name` a production.
23
- - Unknown syntax: `apexrest_reference_search` with exact property/short English terms, relevant `kind` (`grammar`, `template`, `contract`, `guide`), route `family` and `limit: 3`. Check the returned version against the toolchain: `26.1` selects the bundled snapshot; `26.1@...` stays exact. Empty results do not prove a feature absent.
24
- - Read the full relevant block using its `offset`/`nextOffset`; `nextResultOffset` pages matches. Follow template `requires` and relevant production `related` links. Batch independent reads only.
31
+ Read the family section in [component contracts](references/component-contracts.md) before Media List, Comments, Metric Card, Cards, Smart Filters/Search or Region Display Selector. Key points: Media List and Comments need column metadata for every projection and one source variant (never mix named and unnamed columns); partial regions need a provably single-row source; Smart Filters need the results region mapped and submitted items on every dependent source; Region Display Selector lists only regions on the same page; Cards and Metric Card bind title/value/icon columns explicitly. Theme option inventories and release notes do not prove compiler support.
25
32
 
26
- Oracle documents supply versioned syntax/template contracts; their orchestration, design defaults and deploy commands do not override user choices or plugin workflows. Bind template variables and remove unused alternatives. Never guess grammar or leave placeholders in `.apx` files.
33
+ Filtered dashboards: submit each filter item with every dependent region or chart series (`pageItemsToSubmit`), refresh dependent regions together with one Dynamic Action, keep date-range text inside a refreshed region, and reconcile source queries for default, changed, single-entity and empty cases ([native dashboard notes](references/native-dashboard.md)). A compiler-checked filtered chart/cards composition is in [p00020-filtered-components.apx](assets/p00020-filtered-components.apx): adapt page number, alias, item names and theme references together; it uses synthetic DUAL data.
27
34
 
28
- For Media List, Comments, Metric Card, Cards, Smart Filters/Search or Region Display Selector, read the relevant [component contract notes](references/component-contracts.md) before choosing source mappings, nested blocks or actions. Theme option inventories and release notes do not prove target-build compiler support. When a requested capability lacks a resolved contract, report that specific gap and continue independent work.
35
+ ## Editing rules
29
36
 
30
- ## Make a coherent change
31
-
32
- Establish tables, joins, keys, bindings and metric meanings. Batch independent metadata/read-only source-query checks within authorization and reuse their results. Resolve unknown fields/units instead of inventing data.
33
-
34
- Edit related components together. Check column mappings, shared-component references and submitted items for every AJAX-dependent query. For filtered dashboards, read [native dashboard guidance](references/native-dashboard.md). Preserve authentication/authorization unless explicitly requested otherwise.
35
-
36
- ## Compile and finish
37
-
38
- Compile coherent edits with the pinned Oracle compiler; deployment planning already does this for unchanged source. Fix errors using the owning production/template and rerun relevant checks. Resolve warnings about ignored requested behavior; report actual output.
39
-
40
- Continue identified development/test application requests through [authorized import](../apexrest-deploy/SKILL.md); existing apps use a reviewed full-application import. Verify UI using the [selected browser](../apexrest-test/SKILL.md#in-app-browser-verification). Separate source, compiler and browser evidence; report unavailable verification and why.
37
+ Establish tables, joins, keys and metric meanings from metadata (`apexrest_metadata_read`, batched `requests` for several objects) before binding sources. Edit related components together: column mappings, shared-component references, submitted items and refresh actions for every AJAX-dependent query. Preserve `.apex/apexlang.json`, Oracle IDs, templates, authentication and authorization; merge recipes into the existing application rather than replacing settings. Resolve warnings that say a requested behavior was ignored. Then continue with validation, shipping and browser checks in [work](../apexrest-work/SKILL.md).
@@ -1,4 +1,4 @@
1
1
  interface:
2
- display_name: "APEX applications"
3
- short_description: "Build, edit, export and validate APEX applications"
4
- default_prompt: "Use $apexrest-apexlang. Help me build or update an Oracle APEX application with APEXlang."
2
+ display_name: 'APEXlang'
3
+ short_description: 'Write APEXlang with pinned Oracle references and recipes'
4
+ default_prompt: 'Use $apexrest-apexlang to write or fix the APEXlang for this Oracle APEX change using the bundled references.'
@@ -1,10 +1,6 @@
1
1
  # APEXlang routes for Codex
2
2
 
3
- For ready component recipes, first search the bundled component catalog with `corpus: "components"` and the relevant name, `kind: "template"`, target `version` and `limit: 3`. Read the returned `component:` ID and its dependencies. Known entrypoints include `component:template-components/metric-card`, `component:regions/cards`, `component:reports/interactive-grid` and `component:regions/region-display-selector`. English and Ukrainian names are searchable. Keep recipe readiness separate from SQL, import and browser evidence. The complete inventory is `component:catalog`; do not load it for an ordinary component edit.
4
-
5
- For a UX pattern spanning several components, use `corpus: "patterns"` with the requested workflow, `kind: "template"`, target `version` and `limit: 3`. Read the selected `pattern:` recipe, then only its required `component:`/`oracle:` contracts. Preserve the page/item/action relationships and data contract. Adding another application's patterns to the catalog uses [pattern catalog maintenance](../../apexrest-pattern-catalog/SKILL.md); using an existing pattern does not invoke capture or refresh its source.
6
-
7
- Read the selected entry with `apexrest_reference_read`, then its `requires` and one scenario template. No search is needed for these entrypoints. The IDs below resolve inside the installed plugin outside the source repository. The bundled Oracle APEXlang skills release is 2026.09.21 for APEX 26.1; compiler metadata remains authoritative for the actual target.
3
+ Read the selected entry with `apexrest_reference` `mode:read`, then its `requires` and one scenario template. No search is needed for these entrypoints. The IDs below resolve inside the installed plugin outside the source repository. The bundled Oracle APEXlang skills release is 2026.09.21 for APEX 26.1; compiler metadata remains authoritative for the actual target.
8
4
 
9
5
  | Requested work | Entry ID | Search family |
10
6
  | --- | --- | --- |
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: apexrest-pattern-catalog
3
- description: Add or update reusable Oracle APEX UX patterns in the bundled catalog from an identified application. Use for catalog maintenance; ordinary pattern use belongs to apexrest-apexlang.
3
+ description: Maintainer-only - add or update reusable Oracle APEX UX patterns in the bundled catalog from an identified application. Not for ordinary application work; using a pattern belongs to apexrest-apexlang.
4
4
  ---
5
5
 
6
- # Maintain the pattern catalog
6
+ # Maintain the pattern catalog (maintainers)
7
7
 
8
8
  Turn an identified source application's reusable page compositions into reviewed catalog records and APEXlang recipes. Keep this workflow separate from using a pattern to change the user's application: route that work to [APEXlang](../apexrest-apexlang/SKILL.md).
9
9
 
@@ -11,7 +11,7 @@ Turn an identified source application's reusable page compositions into reviewed
11
11
 
12
12
  Resolve the requested saved SQLcl connection, application ID, workspace and parsing schema from the user's request and available configuration. Check the live identity before capture. Read-only inspection/export does not authorize imports, business-table changes or changing authentication. Preserve existing authorization; ask only for a missing target or an action outside it. Never request credentials in chat.
13
13
 
14
- Read [capture and curation](references/capture-and-curation.md) for maintainer commands and the source record. Capture/build helpers run from a source checkout of `https://github.com/apexrest-dev/apexrest-codex`; do not assume those repository scripts exist relative to an installed skill. An installed plugin can retrieve existing patterns offline. Locate an available checkout for maintenance, or explain the missing checkout while completing source inspection and a local candidate inventory. Do not mutate the installed plugin cache.
14
+ Read [capture and curation](references/capture-and-curation.md) for maintainer commands and the source record. Capture/build helpers run from a source checkout of `https://github.com/apexrest-dev/apexrest`; do not assume those repository scripts exist relative to an installed skill. An installed plugin can retrieve existing patterns offline. Locate an available checkout for maintenance, or explain the missing checkout while completing source inspection and a local candidate inventory. Do not mutate the installed plugin cache.
15
15
 
16
16
  ## Curate a reusable composition
17
17
 
@@ -29,4 +29,4 @@ Create an original or redistribution-authorized recipe with synthetic data or an
29
29
 
30
30
  Resolve the recipe's complete local dependency closure and compile it with its declared scaffold before marking it `ready`. Bind evidence to the recipe, dependencies, scaffold and compiler inputs so edits invalidate stale results. Record source inspection, offline compilation, SQL execution, import and browser behavior separately; an unavailable check remains `not-run`.
31
31
 
32
- Review the source/ID/content diff, then merge only the selected source's curated records. Build and check the pattern catalog, including rejection of missing/stale reviews, orphan patterns and unknown source anchors. Verify focused recipe and coverage retrieval (`pattern:source/<sourceId>/review` and `/review/page-<id>`, family `coverage`), installed-package portability, and paired English/Ukrainian documentation. Preserve raw captures outside the public package. Report added/updated IDs, compatibility, actual checks and unresolved items. Catalog maintenance does not authorize publishing a release or importing into any application.
32
+ Review the source/ID/content diff, then merge only the selected source's curated records. Build and check the pattern catalog, including rejection of missing/stale reviews, orphan patterns and unknown source anchors. Verify focused recipe and coverage retrieval (`pattern:source/<sourceId>/review` and `/review/page-<id>`, family `coverage`), installed-package portability, and the English documentation. Preserve raw captures outside the public package. Report added/updated IDs, compatibility, actual checks and unresolved items. Catalog maintenance does not authorize publishing a release or importing into any application.
@@ -1,3 +1,3 @@
1
1
  interface:
2
- display_name: "APEXREST Pattern Catalog"
2
+ display_name: "Pattern catalog (maintainers)"
3
3
  short_description: "Add reusable APEX UX patterns to the catalog"
@@ -78,9 +78,9 @@ Source redistribution rights must be evaluated independently for each applicatio
78
78
 
79
79
  The verifier must compile every recipe declared `ready` with its complete local dependency set and the exact scaffold/MMD. Review diagnostics about ignored behavior. A positive compiler result does not establish that a query runs, navigation reaches a real target, or a dynamic action behaves correctly in a browser.
80
80
 
81
- Keep SQL/import/browser results separate and retain `not-run` with a reason when unavailable. Do not import into the source application to establish catalog readiness. A runtime verification request needs its own identified authorized target and the existing [deployment workflow](../../apexrest-deploy/SKILL.md).
81
+ Keep SQL/import/browser results separate and retain `not-run` with a reason when unavailable. Do not import into the source application to establish catalog readiness. A runtime verification request needs its own identified authorized target and the existing [deployment workflow](../../apexrest-work/SKILL.md).
82
82
 
83
- After review, rebuild the catalog and validate deterministic output, ID/link integrity, source isolation, evidence hashes and search/read bounds. Use the repository's normal build, packaging and plugin synchronization checks. Ordinary retrieval uses `apexrest_reference_search` with `corpus: "patterns"`, then `apexrest_reference_read` for a returned `pattern:` ID; it must work offline outside the source checkout.
83
+ After review, rebuild the catalog and validate deterministic output, ID/link integrity, source isolation, evidence hashes and search/read bounds. Use the repository's normal build, packaging and plugin synchronization checks. Ordinary retrieval uses `apexrest_reference` `mode:search` with `corpus: "patterns"`, then `mode:read` for a returned `pattern:` ID; it must work offline outside the source checkout.
84
84
 
85
85
  ```sh
86
86
  node scripts/verify-pattern-recipes.mjs
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: apexrest-safety
3
+ description: Deployment, test, production and unknown-outcome policy for APEXREST. Read when apexrest_ship, apexrest_test_run or apexrest_job returns blocked, failed or outcome_unknown, or before any production or database change.
4
+ ---
5
+
6
+ # Safety policy
7
+
8
+ Authorization. An explicit user request to create, update or import an identified development/test application authorizes that import; `apexrest_ship` records it as a short-lived grant bound to the exact project, target and plan digest, deploy only, and removes it. Never invent consent, widen it to business-table writes, authentication changes or other targets, or edit `policy.json` grants by hand. Production targets (`kind: production` or listed in the administrator-owned `production-trust.json`) refuse `mode:apply`; they need a signed external approval in a protected CI runner. Never create, edit or relax that file.
9
+
10
+ Trust. `PROJECT_TRUST_REQUIRED` means the user must add the project path to `trustedProjects` in `APEXREST_HOME/policy.json` after reviewing its code. Ask; do not write it.
11
+
12
+ Plans. A plan expires after 30 minutes and binds sources, configuration, toolchain and target. `SOURCE_DRIFT`, `TARGET_DRIFT`, `PLAN_EXPIRED` or `SYNC_REPLAN_REQUIRED`: run `apexrest_ship` `mode:plan` again and review the new preview. `RECOVERY_REVIEW_REQUIRED`: the plan carries destructive, privileged or security risks; present them and the recovery path to the user before applying. Working-copy plans cannot run migrations or packages; invalidate the sync explicitly first.
13
+
14
+ Unknown outcomes. `outcome_unknown`, `OUTCOME_UNKNOWN`, an expired heartbeat or a lost import response mean the database may have changed. Do not retry, cancel or clear ownership. Read `apexrest_job` `action:status` for the same `jobId`, then reconcile with the CLI `deploy status --run RUNID` before any new plan. Cancellation never implies rollback. Backups under `.apexrest/backups` restore application metadata only through a separate restore plan.
15
+
16
+ Tests. Required suites fail when absent, empty, skipped or blocked; never relabel them as passed. Remote suites (sql, api, e2e) mutate data and need a non-production environment listed in `mutationAllowedEnvironments` plus a user test grant. Application-only page changes are verified by the compiler, their read-only source queries and the browser; do not install utPLSQL or add empty suites just to import a page. Changing an established required-suite scope needs user authorization.
17
+
18
+ Evidence. Separate implemented code, fixture results, real Oracle results and browser observations. Report blockers with their fault code and `nextActions`; never describe a partial or unverified change as complete. Secrets never travel through chat, tool input or evidence.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: 'Safety policy'
3
+ short_description: 'Deployment, test and recovery rules for APEX changes'
4
+ default_prompt: 'Use $apexrest-safety to explain what blocked my APEX deployment or test and what is allowed next.'
@@ -1,15 +1,25 @@
1
1
  ---
2
2
  name: apexrest-setup
3
- description: Set up APEXREST for Codex, diagnose local toolchain capabilities and guide connection onboarding. Use for APEXREST setup or missing runtime tools.
3
+ description: Check and set up the APEXREST toolchain and connections - doctor, Node/Java/SQLcl/Playwright dependencies, SQLcl mode and ORDS transport, connection references and the project status snapshot. Use for setup, missing tools or connection onboarding.
4
4
  ---
5
5
 
6
- Pass the user's absolute workspace as `project` on project-scoped calls.
7
- Call apexrest_doctor first. Distinguish detected tools, validated compiler, installed native plugin and database connectivity.
8
- The doctor's `sqlcl.mode` selects the Oracle backend: `cli` invokes SQLcl directly; `mcp` invokes the official SQLcl stdio server (`sql -mcp`). This is independent of the APEXREST MCP interface exposed to Codex. Use the TUI's **SQLcl mode: CLI / MCP** action or the bundled CLI `sqlcl configure --mode cli|mcp`; `sqlcl status --json` reads the saved choice. Resolve `../../runtime/apexrest.mjs` from this skill directory and invoke it with Node when no launcher is on PATH. The choice is saved under the active `APEXREST_HOME` and applies to new Oracle operations without reinstalling the plugin. Preserve the selected backend; never silently retry through the other backend after failure. MCP restrict level 4 is the default; use `--mcp-restrict-level 1` only when the user requests script execution. Connected Oracle MCP operations may write Oracle's own `DBTOOLS$MCP_LOG`; do not call them strictly read-only database activity. Keep application imports in the existing plan/apply workflow in both modes.
9
- Run the bundled installer only under the host's approved filesystem/network scope. Never change host trust or copy login tokens.
10
- Request connection references through local onboarding; never ask for passwords in chat.
11
- If a dependency is missing, use [Install dependencies](../apexrest-install-dependencies/SKILL.md) and the bundled `dependencies install` command. This installs the client toolchain without reinstalling the native plugin. Reserve `setup` for bootstrap plus native registration. No download runs during MCP startup.
12
- An existing clean supported APEX installation is sufficient for ordinary deployment. APEXREST service tables and utPLSQL are not client/deploy setup prerequisites. Local deployment history/coordination is the default; utPLSQL is needed only for SQL suites, and database control tables only for the explicitly selected optional database mode.
13
- After reinstall, use a new Codex thread. A saved JSON file does not prove host discovery or readiness.
6
+ # Setup
14
7
 
15
- For `sqlcl.databaseTransport: ords`, read [ORDS setup](references/ords.md) before connection or transport changes; never silently switch transport or send passwords through chat/MCP.
8
+ Call `apexrest_status` `detail:doctor` first. It probes SQLcl and Java; Codex availability is informational for Claude Code without downloads or database calls and reports `sqlcl.mode` (`cli` direct SQLcl, `mcp` the official SQLcl stdio server) and `databaseTransport` (`direct` or `ords`). A detected tool is not a validated compiler or a live connection; say which was observed.
9
+
10
+ Dependencies. Missing SQLcl or Java is a reason to install, not to stop. Use the bundled CLI at `../../runtime/apexrest.mjs` relative to this skill directory, resolved to an absolute path and run with `node` from the user's project directory (native installation adds nothing to PATH):
11
+
12
+ ```sh
13
+ node "<plugin-root>/runtime/apexrest.mjs" dependencies install --dry-run --json
14
+ node "<plugin-root>/runtime/apexrest.mjs" dependencies install --yes --json
15
+ ```
16
+
17
+ Preview first and summarize versions, destinations and license requirements. Add `--accept-oracle-license` only after the user accepted the Oracle terms linked in the preview; `--skip-browser` omits Playwright/Chromium; `--install-os-deps` needs explicit authorization. Use the pinned lockfile versions only. Rerun the doctor afterwards; with a custom `--home`, set `APEXREST_HOME` for the CLI and the MCP process.
18
+
19
+ SQLcl backend. `apexrest sqlcl configure --mode cli|mcp --database-transport direct|ords --json`; `sqlcl status --json` reads it. ORDS requires `cli` mode and plugin-level connection credentials ([ORDS notes](references/ords.md)). Never silently retry through the other backend or transport.
20
+
21
+ Connections. `apexrest_project` `action:connection_add` with `name` plus either `sqlclName` (saved SQLcl connection) or `ordsUrl` and `ordsUsername` with `passwordFile` (a private local file). `action:connection_list` and `action:connection_test` check references. Never ask for or relay passwords in chat; each environment in `apexrest.json` needs `readConnectionRef` and `deployConnectionRef`, the workspace, parsing schema, application ID, base URL and database identity. Ask only for missing non-secret values; never infer production.
22
+
23
+ Project status. `apexrest_status` `detail:project` returns one read-only snapshot: configuration, SQLcl settings, connection references without secrets, browser preference (`.apexrest/panel/preferences.json`, `browserMode: codex|external`), Git changes, sync state, recent jobs and deployments, and active grants. `trusted: false` or `configured: false` are findings; trust is granted by the user in `APEXREST_HOME/policy.json`.
24
+
25
+ A clean supported APEX installation is enough: APEXREST service tables and utPLSQL are not prerequisites. After reinstalling the plugin, start a new host session. Implementation continues in [work](../apexrest-work/SKILL.md).
@@ -1,4 +1,4 @@
1
1
  interface:
2
- display_name: "Setup and connections"
3
- short_description: "Check tools and manage local connection references"
4
- default_prompt: "Use $apexrest-setup. Check my APEXREST setup and show the connection and toolchain actions available."
2
+ display_name: 'Setup and connections'
3
+ short_description: 'Check tools, install dependencies and manage connection references'
4
+ default_prompt: 'Use $apexrest-setup. Check my APEXREST setup and show the connection and toolchain actions available.'
@@ -1,14 +1,19 @@
1
1
  ---
2
2
  name: apexrest-work
3
- description: Complete Oracle APEX changes directly in the current Codex chat. Excludes setup, reference questions and Salesforce Apex.
3
+ description: Create or change an Oracle APEX application end to end - project, references, APEXlang edits, compiler validation, shipping to a dev/test environment and browser verification. Use for any APEX build or change request. Excludes Salesforce Apex.
4
4
  ---
5
5
 
6
6
  # APEX work
7
7
 
8
- Work directly in the user's current Codex session. Preserve its task, context, model, permissions and read-only constraints. Resolve the absolute application project containing `apexrest.json`; reuse known project settings or call `apexrest_project_inspect` with `detail: "summary"` when needed. No plugin task registration or startup call is required. Configured target identity is not live verification.
8
+ Work in the current host session (Codex or Claude Code). Every project-scoped tool takes `project`: the absolute directory containing `apexrest.json`, never the plugin directory.
9
9
 
10
- Read relevant source and focused reference matches; follow offsets/contracts when needed. Reuse discovery until its inputs change, batch coherent edits and independent reads, and run relevant checks once per change. Broaden checks only for a failure or unresolved risk. Long MCP tools wait up to 25 seconds automatically. For completed jobs, inspect `data.result.ok` and actual checks; completion alone is not success. For queued/running jobs, use `apexrest_job_status` with the existing ID and `waitSeconds: 25`. Never rerun an operation to retrieve output. Read full artifacts only for omitted details needed to proceed; reconcile uncertain writes before retrying.
10
+ 1. Project. New app: `apexrest_project` `action:init` with `directory` and `template` (`blank-app` or `customer-crm`); it generates real Oracle sources, no separate generate call. Existing app: `action:inspect` (summary) for source directories and environments; `apexrest_apex_sync` `action:status` shows a working copy.
11
+ 2. References, at most 3 lookups per change: `apexrest_reference` `mode:search` with short English terms, `kind` and `limit:3`, then `mode:read` the chosen ID. Routes and contracts: [apexlang](../apexrest-apexlang/SKILL.md).
12
+ 3. Edit `.apx` files under the application source directory. Keep `.apex/apexlang.json`, Oracle IDs, authentication and authorization. Edit related components together; never leave placeholders.
13
+ 4. `apexrest_apex_validate` until `diagnostics` is empty: fix the named file and line, rerun. Never ship with errors.
14
+ 5. `apexrest_ship` `mode:plan` with `env` and `userRequest` (the user's literal instruction). Review `risks`, `sources` and `target`.
15
+ 6. `apexrest_ship` `mode:apply` with the same `userRequest` when the user asked for the change in that dev/test environment. That explicit request to create, update or import an identified dev/test app is the authorization: do not ask again. The runtime records a grant bound to this plan and removes it afterwards. Wait for the result (`waitSeconds` default 25); if still running, `apexrest_job` `action:status` with the returned `jobId`. Never rerun ship to fetch results.
16
+ 7. Verify visibly changed pages: `apexrest_browser_open` for `env`, then open the returned URL with the selected browser's controls (`codex` host browser or `external` system browser). Check rendering, navigation and the changed interaction; opening a page is not verification.
17
+ 8. Report files changed, validation result, ship status and runId, pages verified in the browser, and anything not verified with its reason.
11
18
 
12
- For visible changes, call `apexrest_browser_open` for the configured environment and honor the returned browser preference; follow [browser verification](../apexrest-test/SKILL.md#in-app-browser-verification). A URL is not verified behavior; report missing controls/login. Open the [development panel](../apexrest-panel/SKILL.md) only when useful or requested.
13
-
14
- An identified authorized application import follows [deploy](../apexrest-deploy/SKILL.md): fresh target checks, backup, source/target drift, plan/apply and runtime verification remain required. Preserve required suites and unknown-outcome recovery. Report actual changes, checks and limitations in this conversation. No broader DB changes, downloads, publication or external messages are implied.
19
+ Blocked, failed or unknown outcomes: [safety](../apexrest-safety/SKILL.md). Missing tools or connections: [setup](../apexrest-setup/SKILL.md).
@@ -1,7 +1,7 @@
1
1
  interface:
2
- display_name: 'APEX work from chat'
3
- short_description: 'Complete APEX changes directly in this Codex session'
4
- default_prompt: 'Use $apexrest-work to complete my Oracle APEX change directly in this Codex session using my project and browser settings; report actual results here.'
2
+ display_name: 'APEX work'
3
+ short_description: 'Build or change an Oracle APEX application in this session'
4
+ default_prompt: 'Use $apexrest-work to build or change my Oracle APEX application in this session using my project settings; report actual results here.'
5
5
 
6
6
  policy:
7
7
  allow_implicit_invocation: true
@@ -0,0 +1,19 @@
1
+ [
2
+ {
3
+ "schemaVersion": 1,
4
+ "kind": "compiler",
5
+ "status": "passed",
6
+ "sourceDigest": "a38b31d68964a3175d17af8598b81c6d2c0d90f4143cc33c4f6c94febc913d3f",
7
+ "generatorDigest": "b6664f483ba51882e81ccb44bccbd2f99d8b94f74ce58f5bb10297209fa7c196",
8
+ "configurationDigest": "4b5d1204a620cea10ca6e8253e7e68dd9677d9be73bacac4271126898ce95400",
9
+ "fixtureDigest": "e81e5fdbbf8203d148e3c70e958cd40b14ccc95de6541b60b000d2d7a195959c",
10
+ "profile": "profile:apex261-ut261-mmd3102",
11
+ "tool": "SQLcl: Release 26.1.2.0 Production Build: 26.1.2.132.1334; MMD 26.1.0+3102",
12
+ "runner": "local",
13
+ "timestamp": "2026-09-29T17:58:15.026524+00:00",
14
+ "artifacts": [
15
+ "docs/evidence/composer-local.json"
16
+ ],
17
+ "reason": "Real offline SQLcl validation of complete crm fixture containing this block. No live SQL, import, DML or browser qualification."
18
+ }
19
+ ]
@@ -0,0 +1,19 @@
1
+ [
2
+ {
3
+ "schemaVersion": 1,
4
+ "kind": "compiler",
5
+ "status": "passed",
6
+ "sourceDigest": "3f22afdd45513ac6819f0be2562a3525f5971265cd4de22f183c607d3ced2431",
7
+ "generatorDigest": "b6664f483ba51882e81ccb44bccbd2f99d8b94f74ce58f5bb10297209fa7c196",
8
+ "configurationDigest": "4b5d1204a620cea10ca6e8253e7e68dd9677d9be73bacac4271126898ce95400",
9
+ "fixtureDigest": "e81e5fdbbf8203d148e3c70e958cd40b14ccc95de6541b60b000d2d7a195959c",
10
+ "profile": "profile:apex261-ut261-mmd3102",
11
+ "tool": "SQLcl: Release 26.1.2.0 Production Build: 26.1.2.132.1334; MMD 26.1.0+3102",
12
+ "runner": "local",
13
+ "timestamp": "2026-09-29T17:58:15.028028+00:00",
14
+ "artifacts": [
15
+ "docs/evidence/composer-local.json"
16
+ ],
17
+ "reason": "Real offline SQLcl validation of complete crm fixture containing this block. No live SQL, import, DML or browser qualification."
18
+ }
19
+ ]
@@ -0,0 +1,19 @@
1
+ [
2
+ {
3
+ "schemaVersion": 1,
4
+ "kind": "compiler",
5
+ "status": "passed",
6
+ "sourceDigest": "fd38f4d780ae0a9af3b77e9375ebd26f86391092505c55bd5a16090eb662f7e6",
7
+ "generatorDigest": "b6664f483ba51882e81ccb44bccbd2f99d8b94f74ce58f5bb10297209fa7c196",
8
+ "configurationDigest": "4b5d1204a620cea10ca6e8253e7e68dd9677d9be73bacac4271126898ce95400",
9
+ "fixtureDigest": "83171baefa7b1cf5cbab5bd9d63b95dc5ae56223626e30175a27c4136eb19ff9",
10
+ "profile": "profile:apex261-ut261-mmd3102",
11
+ "tool": "SQLcl: Release 26.1.2.0 Production Build: 26.1.2.132.1334; MMD 26.1.0+3102",
12
+ "runner": "local",
13
+ "timestamp": "2026-09-29T17:58:15.027755+00:00",
14
+ "artifacts": [
15
+ "docs/evidence/composer-local.json"
16
+ ],
17
+ "reason": "Real offline SQLcl validation of complete library fixture containing this block. No live SQL, import, DML or browser qualification."
18
+ }
19
+ ]
@@ -0,0 +1,19 @@
1
+ [
2
+ {
3
+ "schemaVersion": 1,
4
+ "kind": "compiler",
5
+ "status": "passed",
6
+ "sourceDigest": "fec688afd7be366569f71dac270d619fb813ccb7d99b218450f4e5da80fa21f9",
7
+ "generatorDigest": "b6664f483ba51882e81ccb44bccbd2f99d8b94f74ce58f5bb10297209fa7c196",
8
+ "configurationDigest": "4b5d1204a620cea10ca6e8253e7e68dd9677d9be73bacac4271126898ce95400",
9
+ "fixtureDigest": "83171baefa7b1cf5cbab5bd9d63b95dc5ae56223626e30175a27c4136eb19ff9",
10
+ "profile": "profile:apex261-ut261-mmd3102",
11
+ "tool": "SQLcl: Release 26.1.2.0 Production Build: 26.1.2.132.1334; MMD 26.1.0+3102",
12
+ "runner": "local",
13
+ "timestamp": "2026-09-29T17:58:15.027399+00:00",
14
+ "artifacts": [
15
+ "docs/evidence/composer-local.json"
16
+ ],
17
+ "reason": "Real offline SQLcl validation of complete library fixture containing this block. No live SQL, import, DML or browser qualification."
18
+ }
19
+ ]