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
|
@@ -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
|
};
|
package/dist/runtime/mcp.mjs
CHANGED
|
@@ -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();
|
package/package.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "apexrest",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist/runtime/",
|
|
6
6
|
"dist/resources/",
|
|
7
7
|
"dist/codex-compat/",
|
|
8
8
|
"README.md",
|
|
9
|
-
"README.uk.md",
|
|
10
9
|
"LICENSE",
|
|
11
10
|
"NOTICE"
|
|
12
11
|
],
|
|
13
12
|
"publishConfig": {
|
|
14
13
|
"access": "public",
|
|
15
|
-
"registry": "https://registry.npmjs.org/"
|
|
14
|
+
"registry": "https://registry.npmjs.org/",
|
|
15
|
+
"tag": "latest"
|
|
16
16
|
},
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
|
-
"url": "git+https://github.com/apexrest-dev/apexrest
|
|
19
|
+
"url": "git+https://github.com/apexrest-dev/apexrest.git"
|
|
20
20
|
},
|
|
21
|
-
"description": "
|
|
21
|
+
"description": "Plugin for Codex and Claude Code for Oracle APEX development, deployment and testing",
|
|
22
22
|
"license": "Apache-2.0",
|
|
23
23
|
"type": "module",
|
|
24
24
|
"engines": {
|
|
@@ -48,16 +48,23 @@
|
|
|
48
48
|
"test:installers": "node scripts/test.mjs installers",
|
|
49
49
|
"test:integration": "node scripts/integration.mjs",
|
|
50
50
|
"site:build": "node scripts/build-site.mjs",
|
|
51
|
-
"release:dry-run": "node scripts/package-release.mjs",
|
|
51
|
+
"release:dry-run": "node scripts/package-release.mjs --dry-run",
|
|
52
|
+
"release:package": "node scripts/package-release.mjs",
|
|
52
53
|
"check-release-readiness": "node scripts/check-release-readiness.mjs",
|
|
53
54
|
"plugin:sync": "npm run build && node scripts/sync-repository-plugin.mjs",
|
|
54
55
|
"plugin:check": "node scripts/sync-repository-plugin.mjs --check",
|
|
55
56
|
"test:repository-plugin": "node scripts/repository-plugin-smoke.mjs",
|
|
56
|
-
"docs:check": "node scripts/check-docs.mjs"
|
|
57
|
+
"docs:check": "node scripts/check-docs.mjs",
|
|
58
|
+
"composer:catalog": "node scripts/build-composer-catalog.mjs",
|
|
59
|
+
"composer:check": "node scripts/build-composer-catalog.mjs --check",
|
|
60
|
+
"composer:verify": "node scripts/verify-composer.mjs",
|
|
61
|
+
"composer:author": "node scripts/composer-author.mjs",
|
|
62
|
+
"composer:benchmark": "node scripts/benchmark-composer.mjs"
|
|
57
63
|
},
|
|
58
64
|
"dependencies": {
|
|
59
65
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
60
66
|
"tar": "7.5.22",
|
|
67
|
+
"yaml": "2.9.1",
|
|
61
68
|
"yauzl": "3.4.0",
|
|
62
69
|
"zod": "4.6.2"
|
|
63
70
|
},
|
package/README.uk.md
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
# APEXREST для Codex
|
|
2
|
-
|
|
3
|
-
[English](README.md) | Українська
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-
|
|
7
|
-
[](https://github.com/apexrest-dev/apexrest-codex/actions/workflows/ci.yml)
|
|
8
|
-
|
|
9
|
-
**Створюйте й змінюйте застосунки Oracle APEX за допомогою Codex: від вихідного коду до перевіреного імпорту.**
|
|
10
|
-
|
|
11
|
-
Ще не знайомі з Oracle APEX? Це платформа для створення бізнес-вебзастосунків на основі Oracle Database: форм, дашбордів, звітів і внутрішніх інструментів. APEXREST поєднує цей процес із Codex, агентом OpenAI для роботи з кодом: запит на кшталт «додай звіт про статус замовлень» перетворюється на зміни коду застосунку, перевірки й контрольоване розгортання.
|
|
12
|
-
|
|
13
|
-
APEXREST поєднує нативні навички Codex та інструменти MCP з Oracle SQLcl. Генеруйте APEXlang, переносьте наявний застосунок у проєкт, редагуйте сторінки й спільні компоненти, плануйте зміни, імпортуйте їх у дозволену ціль і перевіряйте результат у вбудованому браузері Codex.
|
|
14
|
-
|
|
15
|
-
[Початок роботи](docs/getting-started.uk.md) · [Документація](docs/index.uk.md) · [Безпека розгортання](docs/deployment-safety.uk.md) · [Стан перевірки](docs/implementation-status.uk.md) · [Участь у розробці](CONTRIBUTING.uk.md)
|
|
16
|
-
|
|
17
|
-

|
|
18
|
-
|
|
19
|
-
> **Випуск `1.2.0`.** Працюйте безпосередньо в поточній сесії Codex з 18 MCP-інструментами та 13 спеціалізованими skills. Codex керує розмовою й виконанням; APEXREST виконує операції Oracle/APEX. Програмне очікування завдань, пакетні метадані, стисла перевірка проєкту й цільова довідка скорочують рутинні виклики. Зміни й межі доказів — у [примітках до випуску](docs/release-notes.uk.md). Незалежні інструменти; це не офіційний продукт Oracle чи OpenAI.
|
|
20
|
-
|
|
21
|
-
Опишіть зміну в чаті Codex або використовуйте `$apexrest-work`. Реалізація починається в тому самому контексті без виклику запуску плагіна. Дивіться [сценарій чату](docs/chat-workflow.uk.md) та [інтеграцію Codex](docs/codex-integration.uk.md). Для перевірки APEX оберіть **Codex in-app browser / External system browser** у Settings.
|
|
22
|
-
|
|
23
|
-
**Settings → Database network transport** задає **Direct Oracle listener** або **ORDS HTTP(S)** для нових операцій у всіх проєктах. Прямий режим пропонує вибір збережених з’єднань SQLcl. ORDS використовує наявні ім’я користувача й пароль бази даних та ORDS URL схеми, коли listener, зазвичай на порту 1521, недоступний. Налаштування й пароль зберігаються у приватних локальних файлах плагіна; вводьте пароль у локальній панелі або через CLI `--password-file`. ORDS використовує SQLcl CLI та підтримує імпорт/експорт APEXlang. Перемикання назад зберігає обидва налаштування з’єднання. Посібник [SQL через ORDS](docs/ords.uk.md) описує налаштування й межі перевірки.
|
|
24
|
-
|
|
25
|
-
Відкрийте `$apexrest-panel` для налаштувань проєкту й з’єднань, фактичних завдань Oracle/APEX і діагностики в Codex. Консольне подання — `apexrest panel tui`. Дивіться [панель розробки](docs/panel.uk.md).
|
|
26
|
-
|
|
27
|
-
[Каталог компонентів](docs/component-catalog.uk.md) дає офлайн-пошук серед 109 сімейств, параметри з контекстом і 138 перевірених компілятором рецептів APEXlang; один непідтриманий рецепт має явний статус unresolved. [Список компонентів і приклади](https://apex.oracle.com/ut) доступні онлайн. Використовуйте наявні довідкові інструменти або CLI з `--corpus components`; докази компіляції, SQL, імпорту й браузерної перевірки розділено.
|
|
28
|
-
|
|
29
|
-
Випуск 1.2.0 додає окремий офлайн-[каталог патернів](docs/pattern-catalog.uk.md): 58 готових UX-патернів і 84 рецепти, з яких 69 перевірено компілятором, а 15 мають явні прогалини. Огляд охоплює 150 сторінок джерел і 818 рішень щодо варіантів. Шукайте через `--corpus patterns`; використовуйте новий skill `$apexrest-pattern-catalog`, щоб додати перевірені патерни з іншого застосунку APEX. Готовність за компілятором не означає перевірку SQL, імпорту чи браузера.
|
|
30
|
-
|
|
31
|
-
## ORDS SQL: шлях до Codex Cloud
|
|
32
|
-
|
|
33
|
-
APEXREST підтримує SQL через **Oracle REST Data Services (ORDS)**. ORDS дає інструментам доступ до бази через HTTPS без прямого з’єднання з Oracle listener. Це дозволяє налаштувати роботу комплектних інструментів командного рядка APEXREST у контейнері Codex Cloud. База даних залишається там, де вона розміщена.
|
|
34
|
-
|
|
35
|
-
Приклад у SQLcl — інструменті командного рядка Oracle:
|
|
36
|
-
|
|
37
|
-
```sql
|
|
38
|
-
connect -orest app_user@https://example.com/ords/app_user/
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Параметр `-orest` обирає REST-з’єднання. Замініть приклади облікового запису й URL схеми на свою дозволену ціль; REST-Enabled SQL має бути ввімкнено. Обліковому запису все одно потрібні дані для входу до бази та права на запитану роботу. Дивіться [SQL через ORDS](docs/ords.uk.md).
|
|
42
|
-
|
|
43
|
-
| | Локальний режим | Налаштування Codex Cloud |
|
|
44
|
-
| ------------------------ | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
|
|
45
|
-
| Де виконуються задачі | На вашому комп’ютері; він має залишатися ввімкненим, поки виконуються операції. | У хмарному контейнері; домашній комп’ютер може бути вимкнений. |
|
|
46
|
-
| Інструменти й залежності | Встановлюються й підтримуються на вашому комп’ютері. | Готуються скриптами налаштування й обслуговування для повторного використання. |
|
|
47
|
-
| Доступ до бази | Пряме з’єднання Oracle або ORDS HTTP(S). | Описане налаштування використовує дозволену точку доступу ORDS через HTTPS. |
|
|
48
|
-
|
|
49
|
-
### Делегуйте роботу з телефона
|
|
50
|
-
|
|
51
|
-
Після налаштування [нативної інтеграції Codex зі Slack](https://learn.chatgpt.com/docs/third-party/slack) можна надсилати запити з `@Codex` і стежити за їхніми задачами у Cloud. Завдяки [мобільним повідомленням Slack](https://slack.com/help/articles/201457107-Send-and-read-messages) це можна робити з телефона. Хмарне виконання звільняє ноутбук для іншої роботи й не залежить від увімкненого домашнього комп’ютера.
|
|
52
|
-
|
|
53
|
-
**[Режим Remote](https://learn.chatgpt.com/docs/remote) мобільного застосунку ChatGPT** підключається до комп’ютера, який має залишатися активним і в мережі. Його вимоги до виконання відрізняються від задачі у Cloud.
|
|
54
|
-
|
|
55
|
-
[Посібник Cloud](docs/codex-cloud.uk.md) описує CLI + ORDS у налаштованому контейнері. Він не підтверджує нативне виявлення плагіна/MCP чи підтримку панелі у Cloud. Локальні й підключені докази зберігають свої версії та межі.
|
|
56
|
-
|
|
57
|
-
## Встановлення з npm
|
|
58
|
-
|
|
59
|
-
Використовуйте Node 24 LTS (підтримуваний діапазон: Node 24–26). Встановіть [apexrest](https://www.npmjs.com/package/apexrest) з npm. Версія цього пакета — `1.2.0`; наведені нижче команди використовують `latest`. Стан розповсюдження й перевірок — у [примітках до випуску](docs/release-notes.uk.md).
|
|
60
|
-
|
|
61
|
-
Встановіть CLI глобально та перевірте версію:
|
|
62
|
-
|
|
63
|
-
```sh
|
|
64
|
-
npm install -g apexrest
|
|
65
|
-
apexrest --version
|
|
66
|
-
apexrest
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Остання команда відкриває термінальне меню. Виберіть **Install tools** для відсутніх залежностей, потім **Install plugin**, щоб зареєструвати APEXREST у Codex. npm встановлює CLI й комплектні ресурси; реєстрація плагіна є окремою дією меню.
|
|
70
|
-
|
|
71
|
-
Для локального встановлення в проєкті:
|
|
72
|
-
|
|
73
|
-
```sh
|
|
74
|
-
npm install apexrest
|
|
75
|
-
npx apexrest --version
|
|
76
|
-
npx apexrest
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Щоб зафіксувати цю версію, використовуйте `npm install -g apexrest@1.2.0`. npm містить готове середовище виконання, тому копія Git-репозиторію чи локальне збирання не потрібні. Наведене нижче встановлення з репозиторію також доступне.
|
|
80
|
-
|
|
81
|
-
## Встановлення через термінал
|
|
82
|
-
|
|
83
|
-
Маючи Git і Node 24 LTS, відкрийте готовий TUI з репозиторію. Для **Install plugin** також потрібен Codex CLI з підтримкою плагінів.
|
|
84
|
-
|
|
85
|
-
```sh
|
|
86
|
-
git clone https://github.com/apexrest-dev/apexrest-codex.git
|
|
87
|
-
cd apexrest-codex
|
|
88
|
-
node plugins/apexrest-apex/runtime/apexrest.mjs
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
1. Виберіть **Install tools** для встановлення Node.js, Java, SQLcl і браузерних інструментів. Прочитайте умови Oracle й увімкніть **Accept Oracle license terms**, якщо погоджуєтеся. **Skip browser installation** пропускає браузерні інструменти.
|
|
92
|
-
2. Виберіть **Install plugin**, щоб зареєструвати APEXREST у Codex із наявним середовищем виконання.
|
|
93
|
-
3. Перезапустіть Codex і почніть нову задачу. Додайте керований каталог `bin` до PATH за [інструкцією засобу запуску](docs/getting-started.uk.md#використання-cli), щоб відкривати меню командою `apexrest` з будь-якої папки.
|
|
94
|
-
|
|
95
|
-
На екрані **Review** натисніть Enter, щоб виконати вибрану дію. Перемикачів **Preview only** і **Approve changes** немає. Готовий пакет не потребує `npm ci` або збирання TypeScript. Повна [інструкція встановлення](docs/getting-started.uk.md#встановлення-через-термінал) також описує перевірку з’єднань і видалення.
|
|
96
|
-
|
|
97
|
-
## Встановлення в Codex
|
|
98
|
-
|
|
99
|
-
Для прямої реєстрації плагіна через Codex CLI використовуйте Node 24 LTS у `PATH` і виконайте:
|
|
100
|
-
|
|
101
|
-
```sh
|
|
102
|
-
codex plugin marketplace add apexrest-dev/apexrest-codex
|
|
103
|
-
codex plugin add apexrest-apex@apexrest
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Репозиторій містить зібране середовище виконання; для цього встановлення не потрібні `npm ci` або локальне збирання. Після реєстрації почніть нову задачу Codex. [Посібник зі встановлення](docs/getting-started.uk.md#встановлення-плагіна) описує перевірку, налаштування Oracle, кероване встановлення та видалення. Встановлення не створює базу даних і не розгортає застосунок.
|
|
107
|
-
|
|
108
|
-
Після встановлення почніть нову задачу Codex і надайте запит:
|
|
109
|
-
|
|
110
|
-
> Скористайся APEXREST, щоб перевірити моє налаштування. Повідом, які перевірки компілятора, з’єднання та цільового середовища ще потребують уваги.
|
|
111
|
-
|
|
112
|
-
Потрібен хост Codex із підтримкою нативних плагінів. Для роботи з Oracle також потрібні перевірені версії Node, Java та SQLcl, наявна підтримувана ціль APEX і збережене пряме з’єднання SQLcl або локальні облікові дані ORDS у плагіні. [Посібник](docs/getting-started.uk.md) пояснює кожен крок; ніколи не вставляйте паролі в запит.
|
|
113
|
-
|
|
114
|
-
Надішліть `Use $apexrest-menu` у полі повідомлення Codex, щоб показати **All functions** у розмові: налаштування, проєкти, APEX, базу даних, розгортання, тестування, діагностику та рев’ю. Це навичка, яка показує меню в розмові; плагін не додає постійну кнопку APEXREST у бічну панель або верхнє меню. Навігацію через вибір навичок і сторінку плагінів описано в [пошуку меню](docs/getting-started.uk.md#усі-функції-в-меню-плагіна-codex).
|
|
115
|
-
|
|
116
|
-
Щоб встановити Java, SQLcl та інші клієнтські інструменти, виберіть **Install dependencies** у меню плагіна або викличте `$apexrest-install-dependencies`. Доступні всі залежності, інструменти Oracle без браузера або попередній перегляд. Параметри та згоду з ліцензією описано в [команді залежностей](docs/getting-started.uk.md#встановлення-залежностей-із-меню-плагіна).
|
|
117
|
-
|
|
118
|
-
## Термінальний інтерфейс
|
|
119
|
-
|
|
120
|
-
**Install plugin** створює керований засіб запуску; пряма реєстрація через `codex plugin add` сама по собі не додає `apexrest` до PATH. Збережені з’єднання беруться безпосередньо зі сховища SQLcl; для їх перегляду й перевірки псевдоніми APEXREST не потрібні.
|
|
121
|
-
|
|
122
|
-
Запустіть `apexrest` в інтерактивному терміналі: логотип APEXREST і сім прямих дій — встановлення/видалення інструментів, встановлення/видалення плагіна, список/перевірка збережених з’єднань SQLcl. Вибирайте стрілками або вводьте текст для пошуку. У списку з’єднань Enter перевіряє вибрану назву, Ctrl+R оновлює список. Інші дії залишаються явними CLI-командами. Явні команди та `--json` зберігають поведінку для скриптів; запуск через канал друкує довідку.
|
|
123
|
-
|
|
124
|
-
Вибір **SQLcl mode: CLI / MCP** зберігає спосіб виконання Oracle-команд: SQLcl CLI або офіційний SQLcl MCP (`sql -mcp`). Це окрема дія TUI; вона не змінює реєстрацію плагіна. Див. [режими SQLcl](docs/tui.uk.md#режим-sqlcl-cli-або-mcp).
|
|
125
|
-
|
|
126
|
-
Головний екран також містить таблицю APEXlang: 99 типів у 9 групах із комплектного довідника Oracle, зокрема 23 елементи сторінки. Tab перемикає дії й каталог; вводьте назву або групу для пошуку, стрілками прокручуйте список. Каталог працює локально без з’єднання з базою.
|
|
127
|
-
|
|
128
|
-
[Посібник термінала](docs/tui.uk.md) описує клавіші та засоби запуску. У копії репозиторію `node plugins/apexrest-apex/runtime/apexrest.mjs` відкриває той самий інтерфейс. Сама реєстрація нативного плагіна Codex не додає `apexrest` до `PATH` оболонки.
|
|
129
|
-
|
|
130
|
-
## Що можна створювати
|
|
131
|
-
|
|
132
|
-
| Сценарій | Що робить APEXREST |
|
|
133
|
-
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
134
|
-
| Створення застосунку | Генерує справжній Oracle APEXlang із порожнього застосунку або шаблону CRM клієнтів. |
|
|
135
|
-
| Зміна наявного застосунку | Експортує в новий каталог, зберігає Oracle ID та метадані `.apex`, дає змогу редагувати код під контролем версій. |
|
|
136
|
-
| Створення дашборда | Використовує реальні вихідні запити, нативні компоненти APEX, передані на сервер елементи фільтрів і перевірки виконання. |
|
|
137
|
-
| Розгортання зміни | Прив’язує незмінний план до коду, інструментарію та цілі; резервує наявний застосунок; імпортує за належним дозволом. |
|
|
138
|
-
| Тестування й діагностика | Запускає налаштовані модульні, SQL, API або браузерні набори; надає обмежену діагностику та результати фонових завдань. |
|
|
139
|
-
|
|
140
|
-
Явний запит створити, оновити чи імпортувати визначений застосунок розробки/тестування включає необхідний імпорт у цих межах. Codex фіксує вже наданий дозвіл і завершує процес. Для production потрібне окреме зовнішнє підписане схвалення на захищеному runner.
|
|
141
|
-
|
|
142
|
-
## Почніть із конкретного запиту
|
|
143
|
-
|
|
144
|
-
**Створити застосунок**
|
|
145
|
-
|
|
146
|
-
> Скористайся APEXREST, щоб створити CRM клієнтів у налаштованому середовищі розробки. Додай пошук клієнтів, форму редагування з валідацією та дашборд. Заверши планування, дозволений імпорт і відповідні перевірки виконання.
|
|
147
|
-
|
|
148
|
-
**Змінити наявний застосунок**
|
|
149
|
-
|
|
150
|
-
> Скористайся APEXREST, щоб перенести наявний застосунок із налаштованого тестового середовища в новий проєкт. Додай дашборд продажів із реальними показниками бази даних. Збережи наявні сторінки, спільні компоненти й автентифікацію, потім імпортуй і перевір зміну.
|
|
151
|
-
|
|
152
|
-
**Внести наступну зміну**
|
|
153
|
-
|
|
154
|
-
> Онови фільтри дашборда так, щоб вони оновлювали відповідні нативні регіони. Використай наявний проєкт і з’єднання, звір показники, імпортуй у той самий тестовий застосунок і перевір взаємодії у вбудованому браузері.
|
|
155
|
-
|
|
156
|
-
Замініть приклади ID та назв середовищ на справжню ціль. Codex запитує відсутні несекретні ідентифікаційні дані; він не вгадує базу даних і не розширює запит на сторонні записи в схему.
|
|
157
|
-
|
|
158
|
-
## Короткий шлях від редагування до імпорту
|
|
159
|
-
|
|
160
|
-

|
|
161
|
-
|
|
162
|
-
Процес повторно використовує результати огляду проєкту, групує пов’язані зміни та уникає зайвого запуску компілятора безпосередньо перед плануванням. Незалежні попередні перевірки лише для читання виконуються паралельно. Кожен запис усе ще потребує свіжої перевірки цілі, перевірок розбіжностей коду й цілі, координації та перевіреної резервної копії наявного застосунку.
|
|
163
|
-
|
|
164
|
-
Достатньо чистої підтримуваної інсталяції APEX. Службові таблиці APEXREST **не потрібні**: типово використовуються стійка локальна історія міграцій і координація. Для незалежних машин потрібне зовнішнє послідовне виконання або явно вибраний режим координації через базу даних. [Межі розгортання](docs/deployment-safety.uk.md).
|
|
165
|
-
|
|
166
|
-
## Що перевірено
|
|
167
|
-
|
|
168
|
-
| Область | Наявні докази | Що залишається |
|
|
169
|
-
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
170
|
-
| Нативний плагін Codex | Ізольоване встановлення, виявлення, виклики інструментів і життєвий цикл на Codex 0.154.0 / macOS arm64 | Інші поєднання хоста й платформи; оновлення доказів для стабільного випуску |
|
|
171
|
-
| Oracle APEXlang | Реальна компіляція blank/CRM через локальний SQLcl без з’єднання з базою даних | Імпорти зміненого коду, ширше покриття компонентів і фікстури непідтримуваних компонентів |
|
|
172
|
-
| Підключення ORDS | [Дозволений експорт/імпорт/експорт незміненого застосунку](docs/evidence/ords-connected.json), створення SQL-копії та 21 побайтово ідентичний файл | Імпорти змін, SQL-відновлення, відновлення після перерваної відповіді та браузерні перевірки застосунку |
|
|
173
|
-
| Локальне виконання | Модульні, контрактні CLI/MCP, інсталяційні й пакувальні перевірки з явно позначеними фікстурами | Відновлення з підключенням, ін’єкція збоїв, інтеграція SQL/CRUD і браузерні перевірки застосунку |
|
|
174
|
-
|
|
175
|
-
Модульні тести, змодельовані збої, реальні операції Oracle й перевірки нативного хоста записуються окремо. Див. [матрицю приймання](docs/acceptance.json), [стан реалізації](docs/implementation-status.uk.md) і [решту умов випуску](docs/next-actions.uk.md). Відсутній чи пропущений інтеграційний набір не є успішним результатом.
|
|
176
|
-
|
|
177
|
-
## Локальна розробка
|
|
178
|
-
|
|
179
|
-
Використовуйте Node 24 LTS і зафіксований npm lockfile:
|
|
180
|
-
|
|
181
|
-
```sh
|
|
182
|
-
npm ci --ignore-scripts
|
|
183
|
-
npm run build
|
|
184
|
-
npm run lint
|
|
185
|
-
npm run typecheck
|
|
186
|
-
npm run test:unit
|
|
187
|
-
npm run test:contracts
|
|
188
|
-
npm run test:installers
|
|
189
|
-
npm run site:build
|
|
190
|
-
npm run test:packaging
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
Після змін коду чи ресурсів виконайте `npm run plugin:sync`, щоб оновити нативний пакет у репозиторії. `npm run plugin:check` порівнює його зі свіжою збіркою. `npm run test:repository-plugin` перевіряє нативне встановлення в ізольованому профілі Codex. Перевірки нативного хоста й Oracle потребують описаних передумов. `npm run release:dry-run` створює локальні артефакти та звіт готовності; `npm run check-release-readiness` завершується помилкою, доки бракує обов’язкових доказів. Жодна з цих команд не публікує випуск. Див. [участь у розробці](CONTRIBUTING.uk.md) і [тестування](docs/testing.uk.md).
|
|
194
|
-
|
|
195
|
-
## Документація та підтримка
|
|
196
|
-
|
|
197
|
-
- [Початок роботи](docs/getting-started.uk.md): встановлення, підключення, створення чи перенесення, планування й перевірка.
|
|
198
|
-
- [Codex Cloud](docs/codex-cloud.uk.md): налаштування контейнера, CLI через ORDS, секрети, proxy та maintenance.
|
|
199
|
-
- [Конфігурація](docs/configuration.uk.md): явні цілі, посилання на з’єднання та приватна політика.
|
|
200
|
-
- [SQL через ORDS](docs/ords.uk.md): HTTP(S)-транспорт, облікові дані бази та імпорт/експорт APEXlang.
|
|
201
|
-
- [Архітектура](docs/architecture.uk.md): єдине ядро для CLI, MCP і навичок.
|
|
202
|
-
- [Усунення несправностей](docs/troubleshooting.uk.md): діагностика налаштування, компілятора, автентифікації та відновлення.
|
|
203
|
-
- [Безпека](SECURITY.uk.md): межі роботи з обліковими даними, довіра до коду та приватні звіти.
|
|
204
|
-
- [Налаштування публікації](docs/publishing.uk.md): захищений процес випуску й відкриті передумови.
|
|
205
|
-
|
|
206
|
-
Повідомляйте про відтворювані помилки через [GitHub issues](https://github.com/apexrest-dev/apexrest-codex/issues), додавши очищену діагностику. Для чутливих повідомлень дотримуйтеся [SECURITY.uk.md](SECURITY.uk.md). Ліцензія — [Apache-2.0](LICENSE).
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
5
|
-
<title>APEXREST · Development panel</title>
|
|
6
|
-
<link rel="stylesheet" href="/panel.css">
|
|
7
|
-
<script src="/panel.js" defer></script>
|
|
8
|
-
</head>
|
|
9
|
-
<body>
|
|
10
|
-
<aside class="sidebar">
|
|
11
|
-
<div class="brand"><span class="brand-mark" aria-hidden="true">⌘</span><div>APEXREST<small>CODEX WORKSPACE</small></div></div>
|
|
12
|
-
<div class="project-label">PROJECT</div><strong id="project-name">Connecting…</strong><div id="project-path" class="subtle path"></div>
|
|
13
|
-
<nav aria-label="Development views">
|
|
14
|
-
<button data-view="overview" aria-current="page"><span>◈</span> Overview</button>
|
|
15
|
-
<button data-view="operations"><span>↗</span> APEX operations</button>
|
|
16
|
-
<button data-view="settings"><span>☷</span> Settings</button>
|
|
17
|
-
</nav>
|
|
18
|
-
<div class="sidebar-bottom"><span id="connection" class="badge">Connecting</span><p id="updated" class="subtle">Waiting for workspace data</p><button id="refresh" class="quiet">Refresh now</button></div>
|
|
19
|
-
</aside>
|
|
20
|
-
<main>
|
|
21
|
-
<header><div><p class="eyebrow">DEVELOPMENT CONTROL</p><h1 id="view-title">Workspace overview</h1><p id="view-subtitle" class="subtle">Project settings and APEX operations for your current Codex session.</p></div></header>
|
|
22
|
-
<div id="notice" role="status" class="notice" hidden></div>
|
|
23
|
-
<div id="connection-error" role="alert" class="notice error" hidden></div>
|
|
24
|
-
<section id="metrics" class="metrics" aria-label="Workspace summary"></section>
|
|
25
|
-
<section data-page="overview"><div id="overview-live"></div></section>
|
|
26
|
-
<section data-page="operations" hidden>
|
|
27
|
-
<div class="card"><div class="section-heading"><div><h2>Run a check</h2><p class="subtle">Use the selected project's existing toolchain and authorization.</p></div></div><div class="actions"><button id="validate">Compile APEX source</button><label>Environment<select id="environment"><option value="">Choose environment</option></select></label><label>Test suite<select id="suite"><option value="unit">Unit</option><option value="sql">SQL</option><option value="api">API</option><option value="e2e">Playwright E2E</option><option value="all">All configured</option></select></label><button id="run-tests">Run checks</button><button id="plan">Prepare deployment plan</button><button id="open-browser">Open verification browser</button></div><p class="subtle">Application imports keep their existing plan, backup and approval gates. This panel does not grant deployment permission.</p></div>
|
|
28
|
-
<div id="operations-live"></div>
|
|
29
|
-
</section>
|
|
30
|
-
<section data-page="settings" hidden>
|
|
31
|
-
<div class="two-columns">
|
|
32
|
-
<form id="sqlcl-form" class="card"><p class="eyebrow">ORACLE CONNECTION</p><h2>Database connectivity</h2><p class="subtle">Saved at plugin level for new APEXREST operations across projects.</p><label>Database network transport<select id="sqlcl-transport"><option value="direct">Direct Oracle listener</option><option value="ords">ORDS HTTP(S)</option></select></label><p id="sqlcl-transport-note" class="subtle"></p><label>SQLcl execution<select id="sqlcl-mode"><option value="cli">SQLcl CLI</option><option value="mcp">Official SQLcl MCP</option></select></label><label>MCP restriction level<select id="sqlcl-level"><option value="4">Level 4 · restricted (default)</option><option value="1">Level 1 · allow SQLcl scripts</option></select></label><button type="submit">Save SQLcl settings</button></form>
|
|
33
|
-
<form id="preferences-form" class="card"><p class="eyebrow">BROWSER VERIFICATION</p><h2>Verification browser</h2><label>Browser for APEX verification<select id="default-browser-mode"><option value="codex">Codex in-app browser</option><option value="external">External system browser</option></select></label><p class="subtle">The external browser uses your normal browser session for interactive login, including SSO. Automated Playwright suites use separate authentication. The dashboard stays in Codex.</p><button type="submit">Save browser preference</button></form>
|
|
34
|
-
</div>
|
|
35
|
-
<form id="connection-form" class="card" autocomplete="off">
|
|
36
|
-
<p class="eyebrow">PLUGIN CONNECTION SETTINGS</p><h2>Connection references</h2>
|
|
37
|
-
<p class="subtle">Choose a project's read or deploy connection reference. Its connection settings are shared across projects using that reference.</p>
|
|
38
|
-
<label>Connection reference<input id="connection-ref" list="connection-refs" maxlength="100" required placeholder="Your read or deploy connection reference"></label><datalist id="connection-refs"></datalist>
|
|
39
|
-
<p id="connection-mode-note" class="subtle"></p>
|
|
40
|
-
<fieldset id="connection-direct-group" class="connection-group">
|
|
41
|
-
<legend>Direct Oracle listener</legend>
|
|
42
|
-
<p class="subtle">Choose a connection from your local SQLcl connection store. SQLcl manages its database credentials.</p>
|
|
43
|
-
<div class="connection-picker"><label>Saved SQLcl connection<select id="connection-direct"><option value="">Choose a saved connection</option></select></label><button id="saved-connections-refresh" type="button" class="quiet">Load saved connections</button></div>
|
|
44
|
-
<p id="saved-connections-status" class="subtle" role="status" aria-live="polite" data-state="idle">Saved connections load when you open Direct connection settings.</p>
|
|
45
|
-
<details><summary>Manage saved connections</summary><p class="subtle">Save a direct database connection in SQLcl, then refresh this list. Selecting a name here maps it to the connection reference above.</p><pre>connmgr list -flat</pre></details>
|
|
46
|
-
</fieldset>
|
|
47
|
-
<fieldset id="connection-ords-group" class="connection-group" hidden disabled>
|
|
48
|
-
<legend>ORDS HTTP(S)</legend>
|
|
49
|
-
<p class="subtle">Use your existing Oracle database username and password through ORDS. No separate ORDS account is needed. The schema must be REST-enabled and permit REST-enabled SQL.</p>
|
|
50
|
-
<label>ORDS schema URL<input id="connection-ords-url" type="url" maxlength="2048" placeholder="https://example.com/ords/schema-alias/"></label><p class="subtle">Use the schema URL provided by your administrator. Its schema alias can differ from your database username.</p>
|
|
51
|
-
<div class="two-columns"><label>Database username<input id="connection-ords-user" maxlength="128" autocomplete="off" placeholder="Your Oracle database username"></label><label>Database password<input id="connection-ords-password" type="password" autocomplete="new-password"></label></div><p id="connection-password-note" class="subtle">Leave the password blank to keep it for the same URL and database username. A changed URL or username requires a password.</p>
|
|
52
|
-
<p class="subtle connection-storage-note">SQLcl cannot save ORDS connections. APEXREST stores these settings and the database password locally at plugin level.</p>
|
|
53
|
-
<details><summary>Configure ORDS from the CLI</summary><p class="subtle">Provide your database password through a local file:</p><pre>apexrest connection add --name REF --ords-url https://example.com/ords/schema-alias/ --ords-username DATABASE_USER --password-file PATH</pre><p class="subtle">Interactive SQLcl example:</p><pre>connect -orest DATABASE_USER@https://example.com/ords/schema-alias/</pre></details>
|
|
54
|
-
</fieldset>
|
|
55
|
-
<button id="connection-save" type="submit">Save direct connection</button>
|
|
56
|
-
</form><div id="settings-live"></div>
|
|
57
|
-
</section>
|
|
58
|
-
<footer>APEXREST for Codex <span id="version"></span><span>Local workspace · Refreshes while open</span></footer>
|
|
59
|
-
</main>
|
|
60
|
-
</body>
|
|
61
|
-
</html>
|