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.
- package/README.md +90 -134
- package/dist/codex-compat/.claude-plugin/marketplace.json +20 -0
- package/dist/codex-compat/plugins/apexrest-apex/.claude-plugin/plugin.json +28 -0
- package/dist/codex-compat/plugins/apexrest-apex/.codex-plugin/plugin.json +7 -7
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aanalytics%2Fstatus-summary%401.0.0.json +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Acrud%2Freport-dialog%401.0.0.json +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fdetail%401.0.0.json +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Ffiltered-list%401.0.0.json +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fhistory%401.0.0.json +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/evidence/block%3Aread%2Fmaster-detail%401.0.0.json +19 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/generator.json +5 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/manifest.json +29 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/analytics/status-summary/1.0.0/block.yaml +59 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/analytics/status-summary/1.0.0/renderer.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/crud/report-dialog/1.0.0/block.yaml +66 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/crud/report-dialog/1.0.0/renderer.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/detail/1.0.0/block.yaml +59 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/detail/1.0.0/renderer.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/filtered-list/1.0.0/block.yaml +59 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/filtered-list/1.0.0/renderer.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/history/1.0.0/block.yaml +59 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/history/1.0.0/renderer.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/master-detail/1.0.0/block.yaml +59 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/packages/read/master-detail/1.0.0/renderer.json +14 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/profiles.json +10 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blocks/revocations.json +1 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/crm.yaml +172 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/index.json +12 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/blueprints/service-desk.yaml +120 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-allocation.schema.json +33 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-block.schema.json +208 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-blueprint.schema.json +665 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-command.schema.json +106 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-contract.schema.json +174 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-diagnostic.schema.json +26 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-entity.schema.json +142 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-evidence.schema.json +95 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-field.schema.json +54 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-instance.schema.json +117 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-lock.schema.json +54 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-operation.schema.json +55 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-owner.schema.json +105 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-parameters.schema.json +61 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-plan.schema.json +1011 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-renderer.schema.json +69 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/composer-state.schema.json +146 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/deploy-plan.schema.json +754 -169
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/operations.schema.json +525 -256
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/policy.schema.json +21 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/project.schema.json +17 -7
- package/dist/codex-compat/plugins/apexrest-apex/resources/schemas/sync-state.schema.json +238 -0
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.md +0 -2
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.md +1 -3
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.md +0 -2
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__yaml__LICENSE +13 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/apexrest.mjs +81 -45
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-5PCC7GZM.mjs +4090 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-BVPAS3TD.mjs +18 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-CVMECW6D.mjs +65 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-3MDDJFXN.mjs → chunk-JYN3YHP3.mjs} +4220 -10616
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-KGTE7Q5Y.mjs +23 -0
- package/dist/{runtime/chunk-HOKFFGSZ.mjs → codex-compat/plugins/apexrest-apex/runtime/chunk-KKRFM7Q7.mjs} +21 -4
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2VBZESVC.mjs → chunk-MNU54A7W.mjs} +7 -1
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-N4C2SKCN.mjs +6912 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-WK5GP4ES.mjs → chunk-P3CVQAZW.mjs} +822 -102
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2ZUNLCLK.mjs → chunk-QKYF6N6U.mjs} +210 -112
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-S24BD6PY.mjs → chunk-RBJJNQ5O.mjs} +7 -7
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TMSMKVRP.mjs +10367 -0
- package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs} +124 -11
- package/dist/codex-compat/plugins/apexrest-apex/runtime/mcp.mjs +5 -10
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/SKILL.md +22 -25
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/agents/openai.yaml +3 -3
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-apexlang/references/component-routes.md +1 -5
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/SKILL.md +4 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/agents/openai.yaml +1 -1
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-pattern-catalog/references/capture-and-curation.md +2 -2
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-safety/SKILL.md +18 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-safety/agents/openai.yaml +4 -0
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/SKILL.md +20 -10
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-setup/agents/openai.yaml +3 -3
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/SKILL.md +11 -6
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-work/agents/openai.yaml +3 -3
- package/dist/resources/blocks/evidence/block%3Aanalytics%2Fstatus-summary%401.0.0.json +19 -0
- package/dist/resources/blocks/evidence/block%3Acrud%2Freport-dialog%401.0.0.json +19 -0
- package/dist/resources/blocks/evidence/block%3Aread%2Fdetail%401.0.0.json +19 -0
- package/dist/resources/blocks/evidence/block%3Aread%2Ffiltered-list%401.0.0.json +19 -0
- package/dist/resources/blocks/evidence/block%3Aread%2Fhistory%401.0.0.json +19 -0
- package/dist/resources/blocks/evidence/block%3Aread%2Fmaster-detail%401.0.0.json +19 -0
- package/dist/resources/blocks/generator.json +5 -0
- package/dist/resources/blocks/manifest.json +29 -0
- package/dist/resources/blocks/packages/analytics/status-summary/1.0.0/block.yaml +59 -0
- package/dist/resources/blocks/packages/analytics/status-summary/1.0.0/renderer.json +14 -0
- package/dist/resources/blocks/packages/crud/report-dialog/1.0.0/block.yaml +66 -0
- package/dist/resources/blocks/packages/crud/report-dialog/1.0.0/renderer.json +14 -0
- package/dist/resources/blocks/packages/read/detail/1.0.0/block.yaml +59 -0
- package/dist/resources/blocks/packages/read/detail/1.0.0/renderer.json +14 -0
- package/dist/resources/blocks/packages/read/filtered-list/1.0.0/block.yaml +59 -0
- package/dist/resources/blocks/packages/read/filtered-list/1.0.0/renderer.json +14 -0
- package/dist/resources/blocks/packages/read/history/1.0.0/block.yaml +59 -0
- package/dist/resources/blocks/packages/read/history/1.0.0/renderer.json +14 -0
- package/dist/resources/blocks/packages/read/master-detail/1.0.0/block.yaml +59 -0
- package/dist/resources/blocks/packages/read/master-detail/1.0.0/renderer.json +14 -0
- package/dist/resources/blocks/profiles.json +10 -0
- package/dist/resources/blocks/revocations.json +1 -0
- package/dist/resources/blueprints/crm.yaml +172 -0
- package/dist/resources/blueprints/index.json +12 -0
- package/dist/resources/blueprints/service-desk.yaml +120 -0
- package/dist/resources/schemas/composer-allocation.schema.json +33 -0
- package/dist/resources/schemas/composer-block.schema.json +208 -0
- package/dist/resources/schemas/composer-blueprint.schema.json +665 -0
- package/dist/resources/schemas/composer-command.schema.json +106 -0
- package/dist/resources/schemas/composer-contract.schema.json +174 -0
- package/dist/resources/schemas/composer-diagnostic.schema.json +26 -0
- package/dist/resources/schemas/composer-entity.schema.json +142 -0
- package/dist/resources/schemas/composer-evidence.schema.json +95 -0
- package/dist/resources/schemas/composer-field.schema.json +54 -0
- package/dist/resources/schemas/composer-instance.schema.json +117 -0
- package/dist/resources/schemas/composer-lock.schema.json +54 -0
- package/dist/resources/schemas/composer-operation.schema.json +55 -0
- package/dist/resources/schemas/composer-owner.schema.json +105 -0
- package/dist/resources/schemas/composer-parameters.schema.json +61 -0
- package/dist/resources/schemas/composer-plan.schema.json +1011 -0
- package/dist/resources/schemas/composer-renderer.schema.json +69 -0
- package/dist/resources/schemas/composer-state.schema.json +146 -0
- package/dist/resources/schemas/deploy-plan.schema.json +754 -169
- package/dist/resources/schemas/operations.schema.json +525 -256
- package/dist/resources/schemas/policy.schema.json +21 -0
- package/dist/resources/schemas/project.schema.json +17 -7
- package/dist/resources/schemas/sync-state.schema.json +238 -0
- package/dist/resources/templates/blank-app/README.md +0 -2
- package/dist/resources/templates/customer-crm/README.md +1 -3
- package/dist/resources/templates/existing-app/README.md +0 -2
- package/dist/resources/third-party/node_modules__yaml__LICENSE +13 -0
- package/dist/runtime/apexrest.mjs +81 -45
- package/dist/runtime/chunk-5PCC7GZM.mjs +4090 -0
- package/dist/runtime/chunk-BVPAS3TD.mjs +18 -0
- package/dist/runtime/chunk-CVMECW6D.mjs +65 -0
- package/dist/runtime/{chunk-3MDDJFXN.mjs → chunk-JYN3YHP3.mjs} +4220 -10616
- package/dist/runtime/chunk-KGTE7Q5Y.mjs +23 -0
- package/dist/{codex-compat/plugins/apexrest-apex/runtime/chunk-HOKFFGSZ.mjs → runtime/chunk-KKRFM7Q7.mjs} +21 -4
- package/dist/runtime/{chunk-2VBZESVC.mjs → chunk-MNU54A7W.mjs} +7 -1
- package/dist/runtime/chunk-N4C2SKCN.mjs +6912 -0
- package/dist/runtime/{chunk-WK5GP4ES.mjs → chunk-P3CVQAZW.mjs} +822 -102
- package/dist/runtime/{chunk-2ZUNLCLK.mjs → chunk-QKYF6N6U.mjs} +210 -112
- package/dist/runtime/{chunk-S24BD6PY.mjs → chunk-RBJJNQ5O.mjs} +7 -7
- package/dist/runtime/chunk-TMSMKVRP.mjs +10367 -0
- package/dist/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs} +124 -11
- package/dist/runtime/mcp.mjs +5 -10
- package/package.json +14 -7
- package/README.uk.md +0 -206
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/index.html +0 -61
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.css +0 -627
- package/dist/codex-compat/plugins/apexrest-apex/resources/panel/panel.js +0 -629
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/blank-app/README.uk.md +0 -5
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/customer-crm/README.uk.md +0 -7
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/database-control/install.sql +0 -17
- package/dist/codex-compat/plugins/apexrest-apex/resources/templates/existing-app/README.uk.md +0 -9
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__LICENSE +0 -202
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@playwright__test__NOTICE +0 -5
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__node__LICENSE +0 -21
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@types__yauzl__LICENSE +0 -21
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +0 -55
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +0 -436
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__esbuild__LICENSE.md +0 -21
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__fflate__LICENSE +0 -21
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__marked__LICENSE +0 -44
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__LICENSE +0 -202
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright-core__NOTICE +0 -5
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__LICENSE +0 -202
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__playwright__NOTICE +0 -5
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__prettier__LICENSE +0 -7
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__LICENSE +0 -55
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__typescript__NOTICE.txt +0 -436
- package/dist/codex-compat/plugins/apexrest-apex/resources/third-party/node_modules__undici-types__LICENSE +0 -21
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-4MYHJ2IU.mjs +0 -1208
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-7RZW5QV2.mjs +0 -992
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-AQZLLQ3D.mjs +0 -203
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-BD2AVCFU.mjs +0 -367
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-IX6V6ZGW.mjs +0 -18
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-NDZ2RWQU.mjs +0 -13
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-QIVPMPU3.mjs +0 -14
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-SPZVXAM5.mjs +0 -147
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TLYYCRQA.mjs +0 -329
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-TXVQLYTH.mjs +0 -1271
- package/dist/codex-compat/plugins/apexrest-apex/runtime/chunk-YLXJ6H4J.mjs +0 -14
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/SKILL.md +0 -9
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-database/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/SKILL.md +0 -9
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-debug/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/SKILL.md +0 -19
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-deploy/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/SKILL.md +0 -38
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-install-dependencies/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/SKILL.md +0 -28
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-menu/references/cli-catalog.md +0 -23
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/SKILL.md +0 -14
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-panel/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/SKILL.md +0 -9
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-project/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/SKILL.md +0 -11
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-review/agents/openai.yaml +0 -4
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/SKILL.md +0 -29
- package/dist/codex-compat/plugins/apexrest-apex/skills/apexrest-test/agents/openai.yaml +0 -4
- package/dist/resources/panel/index.html +0 -61
- package/dist/resources/panel/panel.css +0 -627
- package/dist/resources/panel/panel.js +0 -629
- package/dist/resources/templates/blank-app/README.uk.md +0 -5
- package/dist/resources/templates/customer-crm/README.uk.md +0 -7
- package/dist/resources/templates/database-control/install.sql +0 -17
- package/dist/resources/templates/existing-app/README.uk.md +0 -9
- package/dist/resources/third-party/node_modules__@playwright__test__LICENSE +0 -202
- package/dist/resources/third-party/node_modules__@playwright__test__NOTICE +0 -5
- package/dist/resources/third-party/node_modules__@types__node__LICENSE +0 -21
- package/dist/resources/third-party/node_modules__@types__yauzl__LICENSE +0 -21
- package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__LICENSE +0 -55
- package/dist/resources/third-party/node_modules__@typescript__typescript-darwin-arm64__NOTICE.txt +0 -436
- package/dist/resources/third-party/node_modules__esbuild__LICENSE.md +0 -21
- package/dist/resources/third-party/node_modules__fflate__LICENSE +0 -21
- package/dist/resources/third-party/node_modules__marked__LICENSE +0 -44
- package/dist/resources/third-party/node_modules__playwright-core__LICENSE +0 -202
- package/dist/resources/third-party/node_modules__playwright-core__NOTICE +0 -5
- package/dist/resources/third-party/node_modules__playwright__LICENSE +0 -202
- package/dist/resources/third-party/node_modules__playwright__NOTICE +0 -5
- package/dist/resources/third-party/node_modules__prettier__LICENSE +0 -7
- package/dist/resources/third-party/node_modules__typescript__LICENSE +0 -55
- package/dist/resources/third-party/node_modules__typescript__NOTICE.txt +0 -436
- package/dist/resources/third-party/node_modules__undici-types__LICENSE +0 -21
- package/dist/runtime/chunk-4MYHJ2IU.mjs +0 -1208
- package/dist/runtime/chunk-7RZW5QV2.mjs +0 -992
- package/dist/runtime/chunk-AQZLLQ3D.mjs +0 -203
- package/dist/runtime/chunk-BD2AVCFU.mjs +0 -367
- package/dist/runtime/chunk-IX6V6ZGW.mjs +0 -18
- package/dist/runtime/chunk-NDZ2RWQU.mjs +0 -13
- package/dist/runtime/chunk-QIVPMPU3.mjs +0 -14
- package/dist/runtime/chunk-SPZVXAM5.mjs +0 -147
- package/dist/runtime/chunk-TLYYCRQA.mjs +0 -329
- package/dist/runtime/chunk-TXVQLYTH.mjs +0 -1271
- package/dist/runtime/chunk-YLXJ6H4J.mjs +0 -14
package/dist/codex-compat/plugins/apexrest-apex/runtime/{chunk-2Z3BZF66.mjs → chunk-WPS3CSQJ.mjs}
RENAMED
|
@@ -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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
6
|
+
# APEXlang
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
10
|
+
## Retrieval
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
17
|
+
Entry IDs are `oracle:templates/<family>/<name>._index`; `family` is the search filter:
|
|
15
18
|
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
|
|
29
|
+
## Contract notes
|
|
21
30
|
|
|
22
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
+
## Editing rules
|
|
29
36
|
|
|
30
|
-
|
|
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:
|
|
3
|
-
short_description:
|
|
4
|
-
default_prompt:
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
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.
|
|
@@ -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-
|
|
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 `
|
|
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.
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: apexrest-setup
|
|
3
|
-
description:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
3
|
-
short_description:
|
|
4
|
-
default_prompt:
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
3
|
-
short_description: '
|
|
4
|
-
default_prompt: 'Use $apexrest-work to
|
|
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
|
+
]
|