@lesliechan721/aw 0.1.0-beta.5 → 0.1.0-beta.50
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/dist/authoring/assets/aw-config.mjs +100 -501
- package/dist/authoring/assets/aw-config.mjs.map +1 -1
- package/dist/authoring/assets/aw-runtime-config.d.mts +13 -0
- package/dist/authoring/assets/aw-runtime-config.mjs +199 -0
- package/dist/authoring/assets/aw-runtime-config.mjs.map +1 -0
- package/dist/authoring/scripts/add-skill.mjs +4 -4
- package/dist/authoring/scripts/add-skill.mjs.map +1 -1
- package/dist/authoring/scripts/init-plugin.mjs +67 -97
- package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/lib/plugin-root.mjs +4 -4
- package/dist/authoring/scripts/lib/plugin-root.mjs.map +1 -1
- package/dist/authoring/scripts/lib/plugin-version-check.d.mts +1 -0
- package/dist/authoring/scripts/lib/plugin-version-check.mjs +229 -8
- package/dist/authoring/scripts/lib/plugin-version-check.mjs.map +1 -1
- package/dist/authoring/scripts/lib/skill-scaffold.d.mts +77 -90
- package/dist/authoring/scripts/lib/skill-scaffold.mjs +99 -120
- package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
- package/dist/authoring/scripts/plugin-status.mjs +8 -11
- package/dist/authoring/scripts/plugin-status.mjs.map +1 -1
- package/dist/authoring/scripts/remove-plugin.mjs +3 -2
- package/dist/authoring/scripts/remove-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/validate-plugin.mjs +346 -1131
- package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
- package/dist/scripts/aw-skill-eval-materializer.d.ts +26 -0
- package/dist/scripts/aw-skill-eval-materializer.js +306 -0
- package/dist/scripts/aw-skill-eval-materializer.js.map +1 -0
- package/dist/scripts/bundle-plugins.d.ts +1 -0
- package/dist/scripts/bundle-plugins.js +20 -5
- package/dist/scripts/bundle-plugins.js.map +1 -1
- package/dist/scripts/plugin-staging.d.ts +7 -9
- package/dist/scripts/plugin-staging.js +18 -29
- package/dist/scripts/plugin-staging.js.map +1 -1
- package/dist/scripts/test-plugin-scripts.d.ts +2 -0
- package/dist/scripts/test-plugin-scripts.js +47 -76
- package/dist/scripts/test-plugin-scripts.js.map +1 -1
- package/dist/scripts/test-workers.d.mts +24 -0
- package/dist/scripts/test-workers.mjs +59 -0
- package/dist/scripts/test-workers.mjs.map +1 -0
- package/dist/src/adapters/helpers.js +2 -2
- package/dist/src/adapters/helpers.js.map +1 -1
- package/dist/src/authoring/workspace-commands.d.ts +17 -1
- package/dist/src/authoring/workspace-commands.js +21 -4
- package/dist/src/authoring/workspace-commands.js.map +1 -1
- package/dist/src/commands/aw-capabilities.d.ts +78 -0
- package/dist/src/commands/aw-capabilities.js +264 -0
- package/dist/src/commands/aw-capabilities.js.map +1 -0
- package/dist/src/commands/catalog-dev-source.d.ts +154 -0
- package/dist/src/commands/catalog-dev-source.js +655 -0
- package/dist/src/commands/catalog-dev-source.js.map +1 -0
- package/dist/src/commands/catalog-generation.d.ts +21 -0
- package/dist/src/commands/catalog-generation.js +9 -0
- package/dist/src/commands/catalog-generation.js.map +1 -0
- package/dist/src/commands/catalog-publication-inspection.d.ts +71 -30
- package/dist/src/commands/catalog-publication-inspection.js +475 -63
- package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
- package/dist/src/commands/catalog-publication-journal.d.ts +68 -0
- package/dist/src/commands/catalog-publication-journal.js +292 -0
- package/dist/src/commands/catalog-publication-journal.js.map +1 -0
- package/dist/src/commands/catalog-publication-target.d.ts +18 -0
- package/dist/src/commands/catalog-publication-target.js +95 -0
- package/dist/src/commands/catalog-publication-target.js.map +1 -0
- package/dist/src/commands/catalog-publish.d.ts +73 -15
- package/dist/src/commands/catalog-publish.js +701 -212
- package/dist/src/commands/catalog-publish.js.map +1 -1
- package/dist/src/commands/catalog-source.d.ts +60 -22
- package/dist/src/commands/catalog-source.js +311 -91
- package/dist/src/commands/catalog-source.js.map +1 -1
- package/dist/src/commands/catalog-status.d.ts +18 -22
- package/dist/src/commands/catalog-status.js +81 -115
- package/dist/src/commands/catalog-status.js.map +1 -1
- package/dist/src/commands/catalog-store.d.ts +104 -0
- package/dist/src/commands/catalog-store.js +685 -0
- package/dist/src/commands/catalog-store.js.map +1 -0
- package/dist/src/commands/catalog-workspace-resolution.d.ts +13 -0
- package/dist/src/commands/catalog-workspace-resolution.js +42 -0
- package/dist/src/commands/catalog-workspace-resolution.js.map +1 -0
- package/dist/src/commands/console.js +28 -17
- package/dist/src/commands/console.js.map +1 -1
- package/dist/src/commands/dependency-operation-plan.d.ts +52 -15
- package/dist/src/commands/dependency-operation-plan.js +289 -7
- package/dist/src/commands/dependency-operation-plan.js.map +1 -1
- package/dist/src/commands/init.d.ts +5 -11
- package/dist/src/commands/init.js +30 -51
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/offline-cleanup-evidence.d.ts +67 -0
- package/dist/src/commands/offline-cleanup-evidence.js +181 -0
- package/dist/src/commands/offline-cleanup-evidence.js.map +1 -0
- package/dist/src/commands/operation-plan.d.ts +146 -0
- package/dist/src/commands/operation-plan.js +71 -0
- package/dist/src/commands/operation-plan.js.map +1 -0
- package/dist/src/commands/operation-planner.d.ts +46 -0
- package/dist/src/commands/operation-planner.js +141 -0
- package/dist/src/commands/operation-planner.js.map +1 -0
- package/dist/src/commands/options.d.ts +9 -7
- package/dist/src/commands/options.js +83 -21
- package/dist/src/commands/options.js.map +1 -1
- package/dist/src/commands/plugin-capabilities.js +23 -3
- package/dist/src/commands/plugin-capabilities.js.map +1 -1
- package/dist/src/commands/rebuild-command.d.ts +77 -31
- package/dist/src/commands/rebuild-command.js +4862 -729
- package/dist/src/commands/rebuild-command.js.map +1 -1
- package/dist/src/commands/rebuild-integration.d.ts +131 -21
- package/dist/src/commands/rebuild-integration.js +2866 -1339
- package/dist/src/commands/rebuild-integration.js.map +1 -1
- package/dist/src/commands/rebuild-operations.d.ts +58 -30
- package/dist/src/commands/rebuild-operations.js +260 -319
- package/dist/src/commands/rebuild-operations.js.map +1 -1
- package/dist/src/commands/reconcile-operation-plan.d.ts +28 -0
- package/dist/src/commands/reconcile-operation-plan.js +47 -0
- package/dist/src/commands/reconcile-operation-plan.js.map +1 -0
- package/dist/src/commands/review-inspection.d.ts +228 -0
- package/dist/src/commands/review-inspection.js +1341 -0
- package/dist/src/commands/review-inspection.js.map +1 -0
- package/dist/src/commands/review-preparation.d.ts +49 -0
- package/dist/src/commands/review-preparation.js +427 -0
- package/dist/src/commands/review-preparation.js.map +1 -0
- package/dist/src/commands/runtime.d.ts +1 -5
- package/dist/src/commands/runtime.js +24 -50
- package/dist/src/commands/runtime.js.map +1 -1
- package/dist/src/commands/skill-eval.d.ts +39 -0
- package/dist/src/commands/skill-eval.js +400 -0
- package/dist/src/commands/skill-eval.js.map +1 -0
- package/dist/src/commands/status-v6.d.ts +279 -0
- package/dist/src/commands/status-v6.js +2787 -0
- package/dist/src/commands/status-v6.js.map +1 -0
- package/dist/src/commands/sync-command.d.ts +40 -0
- package/dist/src/commands/sync-command.js +250 -0
- package/dist/src/commands/sync-command.js.map +1 -0
- package/dist/src/commands/wizard.d.ts +8 -5
- package/dist/src/commands/wizard.js +6 -4
- package/dist/src/commands/wizard.js.map +1 -1
- package/dist/src/commands/write-commands.d.ts +9 -3
- package/dist/src/commands/write-commands.js +127 -31
- package/dist/src/commands/write-commands.js.map +1 -1
- package/dist/src/constants.d.ts +7 -1
- package/dist/src/constants.js +7 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/eval/manifest-v1.d.ts +71 -0
- package/dist/src/eval/manifest-v1.js +370 -0
- package/dist/src/eval/manifest-v1.js.map +1 -0
- package/dist/src/generators/local-plugin.d.ts +5 -1
- package/dist/src/generators/local-plugin.js +236 -109
- package/dist/src/generators/local-plugin.js.map +1 -1
- package/dist/src/index.d.ts +10 -4
- package/dist/src/index.js +1793 -486
- package/dist/src/index.js.map +1 -1
- package/dist/src/output/command-receipt.d.ts +43 -46
- package/dist/src/output/command-receipt.js +256 -80
- package/dist/src/output/command-receipt.js.map +1 -1
- package/dist/src/output/model.d.ts +3 -44
- package/dist/src/output/model.js +1 -144
- package/dist/src/output/model.js.map +1 -1
- package/dist/src/output/rebuild-progress.js +1 -13
- package/dist/src/output/rebuild-progress.js.map +1 -1
- package/dist/src/portable/commands.d.ts +46 -7
- package/dist/src/portable/commands.js +349 -37
- package/dist/src/portable/commands.js.map +1 -1
- package/dist/src/portable/materializer.d.ts +17 -4
- package/dist/src/portable/materializer.js +179 -41
- package/dist/src/portable/materializer.js.map +1 -1
- package/dist/src/portable/skills-cli.d.ts +15 -7
- package/dist/src/portable/skills-cli.js +74 -20
- package/dist/src/portable/skills-cli.js.map +1 -1
- package/dist/src/review/eval-source-input.d.ts +43 -0
- package/dist/src/review/eval-source-input.js +207 -0
- package/dist/src/review/eval-source-input.js.map +1 -0
- package/dist/src/review/review-profile.d.ts +17 -0
- package/dist/src/review/review-profile.js +234 -0
- package/dist/src/review/review-profile.js.map +1 -0
- package/dist/src/review/review-selection.d.ts +30 -0
- package/dist/src/review/review-selection.js +527 -0
- package/dist/src/review/review-selection.js.map +1 -0
- package/dist/src/review/review-types.d.ts +68 -0
- package/dist/src/review/review-types.js +16 -0
- package/dist/src/review/review-types.js.map +1 -0
- package/dist/src/review/skill-materialization.d.ts +13 -0
- package/dist/src/review/skill-materialization.js +75 -0
- package/dist/src/review/skill-materialization.js.map +1 -0
- package/dist/src/review/source-binding.d.ts +183 -0
- package/dist/src/review/source-binding.js +708 -0
- package/dist/src/review/source-binding.js.map +1 -0
- package/dist/src/tui/catalog-freshness.d.ts +1 -0
- package/dist/src/tui/catalog-freshness.js +2 -0
- package/dist/src/tui/catalog-freshness.js.map +1 -0
- package/dist/src/tui/catalog-generation.d.ts +21 -0
- package/dist/src/tui/catalog-generation.js +156 -0
- package/dist/src/tui/catalog-generation.js.map +1 -0
- package/dist/src/tui/catalog-sources/projection.d.ts +4 -0
- package/dist/src/tui/catalog-sources/projection.js +17 -0
- package/dist/src/tui/catalog-sources/projection.js.map +1 -0
- package/dist/src/tui/catalog-sources/review.d.ts +3 -0
- package/dist/src/tui/catalog-sources/review.js +13 -0
- package/dist/src/tui/catalog-sources/review.js.map +1 -0
- package/dist/src/tui/catalog-sources/screens.d.ts +12 -0
- package/dist/src/tui/catalog-sources/screens.js +40 -0
- package/dist/src/tui/catalog-sources/screens.js.map +1 -0
- package/dist/src/tui/catalog-sources/session.d.ts +32 -0
- package/dist/src/tui/catalog-sources/session.js +300 -0
- package/dist/src/tui/catalog-sources/session.js.map +1 -0
- package/dist/src/tui/catalog-sources/types.d.ts +54 -0
- package/dist/src/tui/catalog-sources/types.js +2 -0
- package/dist/src/tui/catalog-sources/types.js.map +1 -0
- package/dist/src/tui/catalog-store-task.d.ts +16 -0
- package/dist/src/tui/catalog-store-task.js +19 -0
- package/dist/src/tui/catalog-store-task.js.map +1 -0
- package/dist/src/tui/clipboard.d.ts +13 -0
- package/dist/src/tui/clipboard.js +95 -0
- package/dist/src/tui/clipboard.js.map +1 -0
- package/dist/src/tui/components.d.ts +110 -3
- package/dist/src/tui/components.js +183 -36
- package/dist/src/tui/components.js.map +1 -1
- package/dist/src/tui/config-array-draft.d.ts +29 -0
- package/dist/src/tui/config-array-draft.js +48 -0
- package/dist/src/tui/config-array-draft.js.map +1 -0
- package/dist/src/tui/config-leaf-editor.d.ts +16 -0
- package/dist/src/tui/config-leaf-editor.js +206 -0
- package/dist/src/tui/config-leaf-editor.js.map +1 -0
- package/dist/src/tui/config-value-presentation.d.ts +20 -0
- package/dist/src/tui/config-value-presentation.js +104 -0
- package/dist/src/tui/config-value-presentation.js.map +1 -0
- package/dist/src/tui/console-app-v4.d.ts +14 -4
- package/dist/src/tui/console-app-v4.js +8941 -1872
- package/dist/src/tui/console-app-v4.js.map +1 -1
- package/dist/src/tui/content-item-card.d.ts +13 -0
- package/dist/src/tui/content-item-card.js +51 -0
- package/dist/src/tui/content-item-card.js.map +1 -0
- package/dist/src/tui/controller-runtime.d.ts +10 -2
- package/dist/src/tui/controller-runtime.js +3211 -388
- package/dist/src/tui/controller-runtime.js.map +1 -1
- package/dist/src/tui/controller.d.ts +615 -45
- package/dist/src/tui/controller.js +3558 -768
- package/dist/src/tui/controller.js.map +1 -1
- package/dist/src/tui/dependency-graph-view.d.ts +39 -0
- package/dist/src/tui/dependency-graph-view.js +121 -0
- package/dist/src/tui/dependency-graph-view.js.map +1 -0
- package/dist/src/tui/dependency-graph.d.ts +81 -0
- package/dist/src/tui/dependency-graph.js +452 -0
- package/dist/src/tui/dependency-graph.js.map +1 -0
- package/dist/src/tui/diagnostic-projection.d.ts +23 -0
- package/dist/src/tui/diagnostic-projection.js +567 -0
- package/dist/src/tui/diagnostic-projection.js.map +1 -0
- package/dist/src/tui/diagnostics.d.ts +3 -3
- package/dist/src/tui/diagnostics.js +14 -2
- package/dist/src/tui/diagnostics.js.map +1 -1
- package/dist/src/tui/entity-cards.d.ts +55 -0
- package/dist/src/tui/entity-cards.js +220 -0
- package/dist/src/tui/entity-cards.js.map +1 -0
- package/dist/src/tui/glossary.d.ts +23 -0
- package/dist/src/tui/glossary.js +42 -0
- package/dist/src/tui/glossary.js.map +1 -0
- package/dist/src/tui/index.d.ts +6 -1
- package/dist/src/tui/index.js +5 -1
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/input-display.d.ts +9 -0
- package/dist/src/tui/input-display.js +58 -0
- package/dist/src/tui/input-display.js.map +1 -0
- package/dist/src/tui/keys.d.ts +44 -0
- package/dist/src/tui/keys.js +43 -15
- package/dist/src/tui/keys.js.map +1 -1
- package/dist/src/tui/lifecycle-action-view.d.ts +6 -0
- package/dist/src/tui/lifecycle-action-view.js +36 -0
- package/dist/src/tui/lifecycle-action-view.js.map +1 -0
- package/dist/src/tui/model.d.ts +223 -31
- package/dist/src/tui/model.js +1510 -397
- package/dist/src/tui/model.js.map +1 -1
- package/dist/src/tui/operation-diagnostic-screens.d.ts +8 -0
- package/dist/src/tui/operation-diagnostic-screens.js +71 -0
- package/dist/src/tui/operation-diagnostic-screens.js.map +1 -0
- package/dist/src/tui/operation-history.d.ts +81 -0
- package/dist/src/tui/operation-history.js +136 -0
- package/dist/src/tui/operation-history.js.map +1 -0
- package/dist/src/tui/operation-review-planner.d.ts +21 -0
- package/dist/src/tui/operation-review-planner.js +1295 -0
- package/dist/src/tui/operation-review-planner.js.map +1 -0
- package/dist/src/tui/plugin-content.d.ts +31 -0
- package/dist/src/tui/plugin-content.js +680 -0
- package/dist/src/tui/plugin-content.js.map +1 -0
- package/dist/src/tui/plugin-detail.d.ts +52 -0
- package/dist/src/tui/plugin-detail.js +165 -0
- package/dist/src/tui/plugin-detail.js.map +1 -0
- package/dist/src/tui/plugin-write-task.d.ts +69 -0
- package/dist/src/tui/plugin-write-task.js +286 -0
- package/dist/src/tui/plugin-write-task.js.map +1 -0
- package/dist/src/tui/project-inventory.d.ts +68 -0
- package/dist/src/tui/project-inventory.js +203 -0
- package/dist/src/tui/project-inventory.js.map +1 -0
- package/dist/src/tui/prompt.js +4 -15
- package/dist/src/tui/prompt.js.map +1 -1
- package/dist/src/tui/query-header.d.ts +30 -0
- package/dist/src/tui/query-header.js +40 -0
- package/dist/src/tui/query-header.js.map +1 -0
- package/dist/src/tui/reader.d.ts +37 -0
- package/dist/src/tui/reader.js +47 -0
- package/dist/src/tui/reader.js.map +1 -0
- package/dist/src/tui/router.d.ts +197 -10
- package/dist/src/tui/router.js +338 -50
- package/dist/src/tui/router.js.map +1 -1
- package/dist/src/tui/screen-registry.d.ts +701 -0
- package/dist/src/tui/screen-registry.js +230 -0
- package/dist/src/tui/screen-registry.js.map +1 -0
- package/dist/src/tui/session-console-app.d.ts +6 -0
- package/dist/src/tui/session-console-app.js +13 -0
- package/dist/src/tui/session-console-app.js.map +1 -0
- package/dist/src/tui/session-host.d.ts +45 -0
- package/dist/src/tui/session-host.js +209 -0
- package/dist/src/tui/session-host.js.map +1 -0
- package/dist/src/tui/source-detail-card.d.ts +29 -0
- package/dist/src/tui/source-detail-card.js +45 -0
- package/dist/src/tui/source-detail-card.js.map +1 -0
- package/dist/src/tui/source-ref-presets.d.ts +3 -0
- package/dist/src/tui/source-ref-presets.js +11 -0
- package/dist/src/tui/source-ref-presets.js.map +1 -0
- package/dist/src/tui/theme.d.ts +12 -0
- package/dist/src/tui/theme.js +12 -0
- package/dist/src/tui/theme.js.map +1 -1
- package/dist/src/tui/viewport.d.ts +1 -0
- package/dist/src/tui/viewport.js +23 -0
- package/dist/src/tui/viewport.js.map +1 -1
- package/dist/src/tui/views.js +31 -3
- package/dist/src/tui/views.js.map +1 -1
- package/dist/src/tui/wizard.js +37 -13
- package/dist/src/tui/wizard.js.map +1 -1
- package/dist/src/types.d.ts +244 -20
- package/dist/src/types.js +1 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/agent-version.d.ts +7 -1
- package/dist/src/utils/agent-version.js +41 -8
- package/dist/src/utils/agent-version.js.map +1 -1
- package/dist/src/utils/artifact-plan.d.ts +5 -4
- package/dist/src/utils/artifact-plan.js +18 -7
- package/dist/src/utils/artifact-plan.js.map +1 -1
- package/dist/src/utils/artifact-renderer.d.ts +17 -7
- package/dist/src/utils/artifact-renderer.js +214 -216
- package/dist/src/utils/artifact-renderer.js.map +1 -1
- package/dist/src/utils/artifact-request.d.ts +21 -0
- package/dist/src/utils/artifact-request.js +78 -0
- package/dist/src/utils/artifact-request.js.map +1 -0
- package/dist/src/utils/aw-home-mutation-lock.d.ts +1 -0
- package/dist/src/utils/aw-home-mutation-lock.js +32 -4
- package/dist/src/utils/aw-home-mutation-lock.js.map +1 -1
- package/dist/src/utils/bundle-integrity.d.ts +0 -1
- package/dist/src/utils/bundle-integrity.js +0 -25
- package/dist/src/utils/bundle-integrity.js.map +1 -1
- package/dist/src/utils/bundle-layout.js +22 -29
- package/dist/src/utils/bundle-layout.js.map +1 -1
- package/dist/src/utils/catalog-capability-projection.d.ts +8 -0
- package/dist/src/utils/catalog-capability-projection.js +14 -0
- package/dist/src/utils/catalog-capability-projection.js.map +1 -0
- package/dist/src/utils/catalog-digests.d.ts +10 -0
- package/dist/src/utils/catalog-digests.js +57 -20
- package/dist/src/utils/catalog-digests.js.map +1 -1
- package/dist/src/utils/catalog-generation-control-snapshot.d.ts +11 -0
- package/dist/src/utils/catalog-generation-control-snapshot.js +45 -0
- package/dist/src/utils/catalog-generation-control-snapshot.js.map +1 -0
- package/dist/src/utils/catalog-generation-error.d.ts +16 -0
- package/dist/src/utils/catalog-generation-error.js +30 -0
- package/dist/src/utils/catalog-generation-error.js.map +1 -0
- package/dist/src/utils/catalog-generation-resolver.d.ts +44 -0
- package/dist/src/utils/catalog-generation-resolver.js +273 -0
- package/dist/src/utils/catalog-generation-resolver.js.map +1 -0
- package/dist/src/utils/catalog-generation-service.d.ts +172 -0
- package/dist/src/utils/catalog-generation-service.js +1271 -0
- package/dist/src/utils/catalog-generation-service.js.map +1 -0
- package/dist/src/utils/catalog-generation-state.d.ts +22 -0
- package/dist/src/utils/catalog-generation-state.js +192 -0
- package/dist/src/utils/catalog-generation-state.js.map +1 -0
- package/dist/src/utils/catalog-generation-store.d.ts +58 -0
- package/dist/src/utils/catalog-generation-store.js +452 -0
- package/dist/src/utils/catalog-generation-store.js.map +1 -0
- package/dist/src/utils/catalog-manifest-v7.d.ts +5 -0
- package/dist/src/utils/{catalog-manifest-v4.js → catalog-manifest-v7.js} +35 -43
- package/dist/src/utils/catalog-manifest-v7.js.map +1 -0
- package/dist/src/utils/catalog-operation-context.d.ts +20 -0
- package/dist/src/utils/catalog-operation-context.js +142 -0
- package/dist/src/utils/catalog-operation-context.js.map +1 -0
- package/dist/src/utils/catalog-public-error.d.ts +7 -3
- package/dist/src/utils/catalog-public-error.js +28 -8
- package/dist/src/utils/catalog-public-error.js.map +1 -1
- package/dist/src/utils/catalog-runtime-projection.d.ts +3 -0
- package/dist/src/utils/catalog-runtime-projection.js +5 -40
- package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
- package/dist/src/utils/catalog-snapshot.d.ts +5 -3
- package/dist/src/utils/catalog-snapshot.js +11 -3
- package/dist/src/utils/catalog-snapshot.js.map +1 -1
- package/dist/src/utils/catalog-source-identity.d.ts +1 -0
- package/dist/src/utils/catalog-source-identity.js +21 -2
- package/dist/src/utils/catalog-source-identity.js.map +1 -1
- package/dist/src/utils/catalog-source-impact.d.ts +21 -0
- package/dist/src/utils/catalog-source-impact.js +344 -0
- package/dist/src/utils/catalog-source-impact.js.map +1 -0
- package/dist/src/utils/catalog-source-references.d.ts +3 -2
- package/dist/src/utils/catalog-source-references.js +195 -347
- package/dist/src/utils/catalog-source-references.js.map +1 -1
- package/dist/src/utils/catalog-sources.d.ts +15 -1
- package/dist/src/utils/catalog-sources.js +206 -27
- package/dist/src/utils/catalog-sources.js.map +1 -1
- package/dist/src/utils/codex-config.d.ts +2 -0
- package/dist/src/utils/codex-config.js +26 -5
- package/dist/src/utils/codex-config.js.map +1 -1
- package/dist/src/utils/codex-manager.d.ts +79 -0
- package/dist/src/utils/codex-manager.js +747 -0
- package/dist/src/utils/codex-manager.js.map +1 -0
- package/dist/src/utils/codex-marketplace-path.d.ts +5 -0
- package/dist/src/utils/codex-marketplace-path.js +45 -0
- package/dist/src/utils/codex-marketplace-path.js.map +1 -0
- package/dist/src/utils/codex-native-observation.d.ts +49 -0
- package/dist/src/utils/codex-native-observation.js +154 -0
- package/dist/src/utils/codex-native-observation.js.map +1 -0
- package/dist/src/utils/codex-native-render-receipt.d.ts +40 -0
- package/dist/src/utils/codex-native-render-receipt.js +205 -0
- package/dist/src/utils/codex-native-render-receipt.js.map +1 -0
- package/dist/src/utils/codex-reconciler.d.ts +126 -0
- package/dist/src/utils/codex-reconciler.js +298 -0
- package/dist/src/utils/codex-reconciler.js.map +1 -0
- package/dist/src/utils/codex-shared-native.d.ts +43 -0
- package/dist/src/utils/codex-shared-native.js +81 -0
- package/dist/src/utils/codex-shared-native.js.map +1 -0
- package/dist/src/utils/codex-skill-staging.d.ts +2 -0
- package/dist/src/utils/codex-skill-staging.js.map +1 -1
- package/dist/src/utils/codex-surface-analysis.d.ts +46 -0
- package/dist/src/utils/codex-surface-analysis.js +247 -0
- package/dist/src/utils/codex-surface-analysis.js.map +1 -0
- package/dist/src/utils/dynamic-skill-tree.d.ts +4 -0
- package/dist/src/utils/dynamic-skill-tree.js +35 -5
- package/dist/src/utils/dynamic-skill-tree.js.map +1 -1
- package/dist/src/utils/git-catalog-provider.d.ts +16 -0
- package/dist/src/utils/git-catalog-provider.js +177 -145
- package/dist/src/utils/git-catalog-provider.js.map +1 -1
- package/dist/src/utils/local-marketplace.d.ts +18 -1
- package/dist/src/utils/local-marketplace.js +354 -84
- package/dist/src/utils/local-marketplace.js.map +1 -1
- package/dist/src/utils/manifest.d.ts +1 -3
- package/dist/src/utils/manifest.js +1 -3
- package/dist/src/utils/manifest.js.map +1 -1
- package/dist/src/utils/multi-source-catalog.d.ts +3 -9
- package/dist/src/utils/multi-source-catalog.js +54 -110
- package/dist/src/utils/multi-source-catalog.js.map +1 -1
- package/dist/src/utils/native-cli.d.ts +55 -7
- package/dist/src/utils/native-cli.js +400 -58
- package/dist/src/utils/native-cli.js.map +1 -1
- package/dist/src/utils/orphan-marketplace-cleanup.js +0 -4
- package/dist/src/utils/orphan-marketplace-cleanup.js.map +1 -1
- package/dist/src/utils/ownership.d.ts +84 -20
- package/dist/src/utils/ownership.js +179 -222
- package/dist/src/utils/ownership.js.map +1 -1
- package/dist/src/utils/path-catalog-provider.d.ts +1 -1
- package/dist/src/utils/path-catalog-provider.js +54 -65
- package/dist/src/utils/path-catalog-provider.js.map +1 -1
- package/dist/src/utils/paths.d.ts +0 -1
- package/dist/src/utils/paths.js +0 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/plugin-config-impact.d.ts +33 -0
- package/dist/src/utils/plugin-config-impact.js +298 -0
- package/dist/src/utils/plugin-config-impact.js.map +1 -0
- package/dist/src/utils/plugin-config-write.d.ts +52 -27
- package/dist/src/utils/plugin-config-write.js +1000 -296
- package/dist/src/utils/plugin-config-write.js.map +1 -1
- package/dist/src/utils/plugin-config.d.ts +153 -93
- package/dist/src/utils/plugin-config.js +1116 -968
- package/dist/src/utils/plugin-config.js.map +1 -1
- package/dist/src/utils/plugin-intent-state.d.ts +49 -0
- package/dist/src/utils/plugin-intent-state.js +320 -0
- package/dist/src/utils/plugin-intent-state.js.map +1 -0
- package/dist/src/utils/plugin-scripts.d.ts +65 -125
- package/dist/src/utils/plugin-scripts.js +484 -524
- package/dist/src/utils/plugin-scripts.js.map +1 -1
- package/dist/src/utils/process-tree.d.ts +2 -2
- package/dist/src/utils/process-tree.js +1 -1
- package/dist/src/utils/process-tree.js.map +1 -1
- package/dist/src/utils/project-boundary.d.ts +11 -13
- package/dist/src/utils/project-boundary.js +28 -34
- package/dist/src/utils/project-boundary.js.map +1 -1
- package/dist/src/utils/runtime-config.d.ts +20 -0
- package/dist/src/utils/runtime-config.js +75 -0
- package/dist/src/utils/runtime-config.js.map +1 -0
- package/dist/src/utils/safe-fs.d.ts +21 -0
- package/dist/src/utils/safe-fs.js +111 -0
- package/dist/src/utils/safe-fs.js.map +1 -0
- package/dist/src/utils/safe-operation-diagnostic.d.ts +15 -0
- package/dist/src/utils/safe-operation-diagnostic.js +33 -0
- package/dist/src/utils/safe-operation-diagnostic.js.map +1 -0
- package/dist/src/utils/sensitive-content.d.ts +4 -0
- package/dist/src/utils/sensitive-content.js +36 -0
- package/dist/src/utils/sensitive-content.js.map +1 -0
- package/dist/src/utils/state-paths.js +7 -2
- package/dist/src/utils/state-paths.js.map +1 -1
- package/dist/src/utils/target-eligibility.d.ts +8 -2
- package/dist/src/utils/target-eligibility.js +17 -8
- package/dist/src/utils/target-eligibility.js.map +1 -1
- package/dist/src/utils/windows-claude-shim.d.ts +7 -0
- package/dist/src/utils/windows-claude-shim.js +10 -0
- package/dist/src/utils/windows-claude-shim.js.map +1 -0
- package/dist/src/utils/windows-npm-shim.d.ts +14 -0
- package/dist/src/utils/windows-npm-shim.js +140 -0
- package/dist/src/utils/windows-npm-shim.js.map +1 -0
- package/dist/vitest.config.js +92 -10
- package/dist/vitest.config.js.map +1 -1
- package/package.json +27 -18
- package/dist/authoring/scripts/check-plugin-versions.d.mts +0 -2
- package/dist/authoring/scripts/check-plugin-versions.mjs +0 -5
- package/dist/authoring/scripts/check-plugin-versions.mjs.map +0 -1
- package/dist/scripts/aw-skill-eval-engine.d.ts +0 -13
- package/dist/scripts/aw-skill-eval-engine.js +0 -31
- package/dist/scripts/aw-skill-eval-engine.js.map +0 -1
- package/dist/scripts/codex-eval-app-server.d.ts +0 -89
- package/dist/scripts/codex-eval-app-server.js +0 -1228
- package/dist/scripts/codex-eval-app-server.js.map +0 -1
- package/dist/scripts/codex-eval-isolation.d.ts +0 -61
- package/dist/scripts/codex-eval-isolation.js +0 -318
- package/dist/scripts/codex-eval-isolation.js.map +0 -1
- package/dist/scripts/codex-eval-process-management.d.ts +0 -8
- package/dist/scripts/codex-eval-process-management.js +0 -69
- package/dist/scripts/codex-eval-process-management.js.map +0 -1
- package/dist/scripts/codex-eval-process-tree.d.ts +0 -38
- package/dist/scripts/codex-eval-process-tree.js +0 -803
- package/dist/scripts/codex-eval-process-tree.js.map +0 -1
- package/dist/scripts/codex-eval-runtime-config.d.ts +0 -62
- package/dist/scripts/codex-eval-runtime-config.js +0 -843
- package/dist/scripts/codex-eval-runtime-config.js.map +0 -1
- package/dist/scripts/codex-trigger-eval.d.ts +0 -84
- package/dist/scripts/codex-trigger-eval.js +0 -968
- package/dist/scripts/codex-trigger-eval.js.map +0 -1
- package/dist/scripts/eval-plugin-skills-audited.d.ts +0 -6
- package/dist/scripts/eval-plugin-skills-audited.js +0 -261
- package/dist/scripts/eval-plugin-skills-audited.js.map +0 -1
- package/dist/scripts/eval-plugin-skills.d.ts +0 -45
- package/dist/scripts/eval-plugin-skills.js +0 -1586
- package/dist/scripts/eval-plugin-skills.js.map +0 -1
- package/dist/scripts/eval-run-layout.d.ts +0 -17
- package/dist/scripts/eval-run-layout.js +0 -26
- package/dist/scripts/eval-run-layout.js.map +0 -1
- package/dist/scripts/plugin-eval-contract.d.ts +0 -185
- package/dist/scripts/plugin-eval-contract.js +0 -695
- package/dist/scripts/plugin-eval-contract.js.map +0 -1
- package/dist/scripts/plugin-eval-materializer.d.ts +0 -13
- package/dist/scripts/plugin-eval-materializer.js +0 -421
- package/dist/scripts/plugin-eval-materializer.js.map +0 -1
- package/dist/scripts/skill-reporting.d.ts +0 -212
- package/dist/scripts/skill-reporting.js +0 -922
- package/dist/scripts/skill-reporting.js.map +0 -1
- package/dist/src/commands/status-v4.d.ts +0 -123
- package/dist/src/commands/status-v4.js +0 -905
- package/dist/src/commands/status-v4.js.map +0 -1
- package/dist/src/commands/status.d.ts +0 -93
- package/dist/src/commands/status.js +0 -442
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/utils/active-marketplace-runtime-lock.d.ts +0 -12
- package/dist/src/utils/active-marketplace-runtime-lock.js +0 -133
- package/dist/src/utils/active-marketplace-runtime-lock.js.map +0 -1
- package/dist/src/utils/catalog-manifest-v3.d.ts +0 -2
- package/dist/src/utils/catalog-manifest-v3.js +0 -3
- package/dist/src/utils/catalog-manifest-v3.js.map +0 -1
- package/dist/src/utils/catalog-manifest-v4.d.ts +0 -5
- package/dist/src/utils/catalog-manifest-v4.js.map +0 -1
- package/dist/src/utils/catalog-source-cache.d.ts +0 -62
- package/dist/src/utils/catalog-source-cache.js +0 -296
- package/dist/src/utils/catalog-source-cache.js.map +0 -1
- package/dist/src/utils/codex-project-surface.d.ts +0 -3
- package/dist/src/utils/codex-project-surface.js +0 -49
- package/dist/src/utils/codex-project-surface.js.map +0 -1
- package/dist/src/utils/lifecycle-active-store.d.ts +0 -175
- package/dist/src/utils/lifecycle-active-store.js +0 -1276
- package/dist/src/utils/lifecycle-active-store.js.map +0 -1
- package/dist/src/utils/plugin-release.d.ts +0 -2
- package/dist/src/utils/plugin-release.js +0 -2
- package/dist/src/utils/plugin-release.js.map +0 -1
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import fs from 'fs-extra';
|
|
3
|
-
import {
|
|
3
|
+
import { readSkillOwnerMarker } from './ownership.js';
|
|
4
4
|
import { readJsonFile } from './json.js';
|
|
5
5
|
import { assertStrictSemVer } from './manifest.js';
|
|
6
6
|
import { resolveCliPackageRoot } from './paths.js';
|
|
7
|
+
import { canonicalizePathThroughExistingAncestor } from './state-paths.js';
|
|
7
8
|
import { sanitizeCatalogSourceErrorMessage } from './catalog-public-error.js';
|
|
8
9
|
import { normalizeMarketplaceProductToken } from './platform-support.js';
|
|
10
|
+
import { CODEX_NATIVE_RENDER_RECEIPT_PATH, parseCodexNativeRenderReceipt, } from './codex-native-render-receipt.js';
|
|
11
|
+
import { calculateCodexNativeRenderPayloadDigest } from './catalog-digests.js';
|
|
12
|
+
import { createCodexSkillStagingTreeContentDigest } from './codex-skill-staging.js';
|
|
13
|
+
import { readDynamicSkillTree } from './dynamic-skill-tree.js';
|
|
9
14
|
const SOURCE_IDENTITY_PATTERN = /^sha256:[0-9a-f]{64}$/;
|
|
10
15
|
export function getNamespacedMarketplaceName(sourceId) {
|
|
11
16
|
return `aw-${sourceId}`;
|
|
@@ -32,6 +37,28 @@ export function projectMarketplaceManifestForPlatform(manifest, platform) {
|
|
|
32
37
|
export function getLocalMarketplacePluginRoot(rootDir, pluginName) {
|
|
33
38
|
return path.join(rootDir, 'plugins', pluginName);
|
|
34
39
|
}
|
|
40
|
+
export async function assertSafeNamespacedMarketplacePluginRoot(rootDir, pluginName) {
|
|
41
|
+
const pluginsRoot = path.join(rootDir, 'plugins');
|
|
42
|
+
const pluginRoot = getLocalMarketplacePluginRoot(rootDir, pluginName);
|
|
43
|
+
const pluginsStats = await lstatMarketplacePath(pluginsRoot);
|
|
44
|
+
if (pluginsStats && (!pluginsStats.isDirectory() || pluginsStats.isSymbolicLink())) {
|
|
45
|
+
throw new MarketplaceRootValidationError(pluginsRoot, 'marketplace plugins ancestor must be a regular directory.', 'unsafe');
|
|
46
|
+
}
|
|
47
|
+
const pluginStats = pluginsStats ? await lstatMarketplacePath(pluginRoot) : null;
|
|
48
|
+
if (pluginStats && (!pluginStats.isDirectory() || pluginStats.isSymbolicLink())) {
|
|
49
|
+
throw new MarketplaceRootValidationError(pluginRoot, 'marketplace plugin projection must be a regular directory.', 'unsafe');
|
|
50
|
+
}
|
|
51
|
+
const physicalRoot = await fs.realpath(rootDir);
|
|
52
|
+
for (const candidate of [pluginsStats ? pluginsRoot : null, pluginStats ? pluginRoot : null]) {
|
|
53
|
+
if (!candidate)
|
|
54
|
+
continue;
|
|
55
|
+
const relative = path.relative(physicalRoot, await fs.realpath(candidate));
|
|
56
|
+
if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
57
|
+
throw new MarketplaceRootValidationError(candidate, 'marketplace plugin path escapes its physical root.', 'unsafe');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return pluginRoot;
|
|
61
|
+
}
|
|
35
62
|
export function getLocalMarketplaceCodexSkillsRoot(rootDir, pluginName) {
|
|
36
63
|
return path.join(getLocalMarketplacePluginRoot(rootDir, pluginName), 'codex', 'skills');
|
|
37
64
|
}
|
|
@@ -47,10 +74,12 @@ export async function readCliPackageInfo() {
|
|
|
47
74
|
}
|
|
48
75
|
export class MarketplaceRootValidationError extends Error {
|
|
49
76
|
location;
|
|
77
|
+
reason;
|
|
50
78
|
code = 'marketplaceRootInvalid';
|
|
51
|
-
constructor(location, message, cause) {
|
|
79
|
+
constructor(location, message, reason, cause) {
|
|
52
80
|
super(`marketplaceRootInvalid: ${message}`, cause === undefined ? undefined : { cause });
|
|
53
81
|
this.location = location;
|
|
82
|
+
this.reason = reason;
|
|
54
83
|
this.name = 'MarketplaceRootValidationError';
|
|
55
84
|
}
|
|
56
85
|
}
|
|
@@ -59,7 +88,7 @@ function assertMarketplacePathBoundary(trustedRoot, candidatePath) {
|
|
|
59
88
|
const candidate = path.resolve(candidatePath);
|
|
60
89
|
const relative = path.relative(root, candidate);
|
|
61
90
|
if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
62
|
-
throw new MarketplaceRootValidationError(candidate, 'marketplace path escapes its trusted root.');
|
|
91
|
+
throw new MarketplaceRootValidationError(candidate, 'marketplace path escapes its trusted root.', 'unsafe');
|
|
63
92
|
}
|
|
64
93
|
return { root, candidate };
|
|
65
94
|
}
|
|
@@ -76,34 +105,48 @@ async function lstatMarketplacePath(filePath) {
|
|
|
76
105
|
}
|
|
77
106
|
async function inspectMarketplacePath(trustedRoot, candidatePath, finalKind) {
|
|
78
107
|
const { root, candidate } = assertMarketplacePathBoundary(trustedRoot, candidatePath);
|
|
79
|
-
|
|
80
|
-
let
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
108
|
+
let rootStats;
|
|
109
|
+
let candidateStats;
|
|
110
|
+
try {
|
|
111
|
+
[rootStats, candidateStats] = await Promise.all([
|
|
112
|
+
lstatMarketplacePath(root),
|
|
113
|
+
lstatMarketplacePath(candidate),
|
|
114
|
+
]);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new MarketplaceRootValidationError(candidate, 'marketplace path cannot be inspected.', 'unreadable', error);
|
|
118
|
+
}
|
|
119
|
+
if (!rootStats)
|
|
120
|
+
return null;
|
|
121
|
+
if (!rootStats.isDirectory() || rootStats.isSymbolicLink()) {
|
|
122
|
+
throw new MarketplaceRootValidationError(root, 'marketplace root must be a regular directory.', 'unsafe');
|
|
123
|
+
}
|
|
124
|
+
let physicalRoot;
|
|
125
|
+
let physicalCandidate;
|
|
126
|
+
try {
|
|
127
|
+
[physicalRoot, physicalCandidate] = await Promise.all([
|
|
128
|
+
canonicalizePathThroughExistingAncestor(root),
|
|
129
|
+
canonicalizePathThroughExistingAncestor(candidate),
|
|
130
|
+
]);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
throw new MarketplaceRootValidationError(candidate, 'marketplace path cannot be resolved.', 'unreadable', error);
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
assertMarketplacePathBoundary(physicalRoot, physicalCandidate);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
throw new MarketplaceRootValidationError(candidate, 'marketplace physical path escapes its trusted root.', 'unsafe');
|
|
140
|
+
}
|
|
141
|
+
if (!candidateStats)
|
|
142
|
+
return null;
|
|
143
|
+
const valid = finalKind === 'file'
|
|
144
|
+
? candidateStats.isFile() && !candidateStats.isSymbolicLink()
|
|
145
|
+
: candidateStats.isDirectory() && !candidateStats.isSymbolicLink();
|
|
146
|
+
if (!valid) {
|
|
147
|
+
throw new MarketplaceRootValidationError(candidate, finalKind === 'file'
|
|
148
|
+
? 'marketplace JSON target must be a regular file.'
|
|
149
|
+
: 'marketplace path must be a regular directory.', 'unsafe');
|
|
107
150
|
}
|
|
108
151
|
return candidateStats;
|
|
109
152
|
}
|
|
@@ -113,28 +156,14 @@ async function readStrictOptionalJsonObject(trustedRoot, filePath) {
|
|
|
113
156
|
try {
|
|
114
157
|
const value = await fs.readJson(filePath);
|
|
115
158
|
if (!isRecord(value)) {
|
|
116
|
-
throw new MarketplaceRootValidationError(filePath, 'marketplace JSON must contain an object.');
|
|
159
|
+
throw new MarketplaceRootValidationError(filePath, 'marketplace JSON must contain an object.', 'invalid');
|
|
117
160
|
}
|
|
118
161
|
return value;
|
|
119
162
|
}
|
|
120
163
|
catch (error) {
|
|
121
164
|
if (error instanceof MarketplaceRootValidationError)
|
|
122
165
|
throw error;
|
|
123
|
-
throw new MarketplaceRootValidationError(filePath, 'marketplace JSON cannot be read.', error);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
async function readOptionalJsonObject(filePath) {
|
|
127
|
-
try {
|
|
128
|
-
const value = await fs.readJson(filePath);
|
|
129
|
-
if (!isRecord(value))
|
|
130
|
-
throw new Error(`Expected a JSON object at ${filePath}.`);
|
|
131
|
-
return value;
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
const code = error.code;
|
|
135
|
-
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
136
|
-
return null;
|
|
137
|
-
throw error;
|
|
166
|
+
throw new MarketplaceRootValidationError(filePath, 'marketplace JSON cannot be read.', error instanceof SyntaxError ? 'invalid' : 'unreadable', error);
|
|
138
167
|
}
|
|
139
168
|
}
|
|
140
169
|
export async function readStrictNamespacedMarketplaceRoot(options) {
|
|
@@ -149,10 +178,12 @@ export async function readStrictNamespacedMarketplaceRoot(options) {
|
|
|
149
178
|
|| config.sourceId.length === 0
|
|
150
179
|
|| typeof config.sourceIdentity !== 'string'
|
|
151
180
|
|| !SOURCE_IDENTITY_PATTERN.test(config.sourceIdentity)
|
|
181
|
+
|| (config.logicalIdentity !== undefined
|
|
182
|
+
&& (typeof config.logicalIdentity !== 'string' || config.logicalIdentity.trim() === ''))
|
|
152
183
|
|| typeof config.marketplaceName !== 'string'
|
|
153
184
|
|| config.marketplaceName.length === 0
|
|
154
185
|
|| config.sourceId !== path.basename(options.rootDir)) {
|
|
155
|
-
throw new MarketplaceRootValidationError(configPath, 'marketplace config must contain a canonical schema 2 identity.');
|
|
186
|
+
throw new MarketplaceRootValidationError(configPath, 'marketplace config must contain a canonical schema 2 identity.', 'invalid');
|
|
156
187
|
}
|
|
157
188
|
if ((options.sourceId !== undefined && config.sourceId !== options.sourceId)
|
|
158
189
|
|| (options.sourceIdentity !== undefined && config.sourceIdentity !== options.sourceIdentity)
|
|
@@ -161,11 +192,11 @@ export async function readStrictNamespacedMarketplaceRoot(options) {
|
|
|
161
192
|
}
|
|
162
193
|
const agentsManifest = await readStrictOptionalJsonObject(trustedMarketplaceRoot, path.join(options.rootDir, '.agents', 'plugins', 'marketplace.json'));
|
|
163
194
|
if (!agentsManifest || agentsManifest.name !== config.marketplaceName) {
|
|
164
|
-
throw new MarketplaceRootValidationError(path.join(options.rootDir, '.agents', 'plugins', 'marketplace.json'), 'Codex marketplace manifest name does not match config.');
|
|
195
|
+
throw new MarketplaceRootValidationError(path.join(options.rootDir, '.agents', 'plugins', 'marketplace.json'), 'Codex marketplace manifest name does not match config.', 'invalid');
|
|
165
196
|
}
|
|
166
197
|
const claudeManifest = await readStrictOptionalJsonObject(trustedMarketplaceRoot, path.join(options.rootDir, '.claude-plugin', 'marketplace.json'));
|
|
167
198
|
if (claudeManifest && claudeManifest.name !== config.marketplaceName) {
|
|
168
|
-
throw new MarketplaceRootValidationError(path.join(options.rootDir, '.claude-plugin', 'marketplace.json'), 'Claude marketplace manifest name does not match config.');
|
|
199
|
+
throw new MarketplaceRootValidationError(path.join(options.rootDir, '.claude-plugin', 'marketplace.json'), 'Claude marketplace manifest name does not match config.', 'invalid');
|
|
169
200
|
}
|
|
170
201
|
return {
|
|
171
202
|
rootDir: options.rootDir,
|
|
@@ -176,8 +207,14 @@ export async function readStrictNamespacedMarketplaceRoot(options) {
|
|
|
176
207
|
}
|
|
177
208
|
function normalizePluginRelativeDirectory(value, fallback) {
|
|
178
209
|
const raw = typeof value === 'string' ? value : fallback;
|
|
179
|
-
const
|
|
180
|
-
|
|
210
|
+
const normalizedSeparators = raw.replace(/\\/gu, '/');
|
|
211
|
+
const normalized = path.posix.normalize(normalizedSeparators.replace(/^\.\//, ''));
|
|
212
|
+
if (!normalized
|
|
213
|
+
|| normalized === '.'
|
|
214
|
+
|| normalized === '..'
|
|
215
|
+
|| normalized.startsWith('../')
|
|
216
|
+
|| path.posix.isAbsolute(normalizedSeparators)
|
|
217
|
+
|| path.win32.isAbsolute(raw)) {
|
|
181
218
|
return null;
|
|
182
219
|
}
|
|
183
220
|
return normalized;
|
|
@@ -190,19 +227,258 @@ async function assertTreeHasNoSymlinks(root) {
|
|
|
190
227
|
await assertTreeHasNoSymlinks(path.join(root, entry.name));
|
|
191
228
|
}
|
|
192
229
|
}
|
|
193
|
-
|
|
230
|
+
class CodexNativeProjectionNotReusableError extends Error {
|
|
231
|
+
}
|
|
232
|
+
function nativeCodexTargets(manifest) {
|
|
233
|
+
const targets = manifest.artifacts?.targets ?? [];
|
|
234
|
+
if (!Array.isArray(targets))
|
|
235
|
+
return [];
|
|
236
|
+
return targets.flatMap((target) => {
|
|
237
|
+
if (!isRecord(target)
|
|
238
|
+
|| target.platform !== 'codex'
|
|
239
|
+
|| target.target !== 'codex.skill'
|
|
240
|
+
|| !isRecord(target.delivery)
|
|
241
|
+
|| target.delivery.mode !== 'codex-native'
|
|
242
|
+
|| typeof target.id !== 'string'
|
|
243
|
+
|| typeof target.skillKey !== 'string')
|
|
244
|
+
return [];
|
|
245
|
+
return [{ id: target.id, skillKey: target.skillKey }];
|
|
246
|
+
}).sort((left, right) => left.id < right.id ? -1 : left.id > right.id ? 1 : 0);
|
|
247
|
+
}
|
|
248
|
+
async function assertRegularProjectionTree(root, rejectOwnerMarker = false) {
|
|
249
|
+
for (const entry of await fs.readdir(root, { withFileTypes: true })) {
|
|
250
|
+
if (entry.isSymbolicLink() || (!entry.isDirectory() && !entry.isFile())) {
|
|
251
|
+
throw new Error(`codexNativeProjectionUnsafe: projection contains an unsafe node: ${entry.name}`);
|
|
252
|
+
}
|
|
253
|
+
if (rejectOwnerMarker && entry.name === '.agent-workflows-owner.json') {
|
|
254
|
+
throw new Error('codexNativeProjectionUnsafe: native Skill cannot contain an AW owner marker.');
|
|
255
|
+
}
|
|
256
|
+
if (entry.isDirectory()) {
|
|
257
|
+
await assertRegularProjectionTree(path.join(root, entry.name), rejectOwnerMarker);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function readProjectionJson(trustedRoot, filePath) {
|
|
262
|
+
const stats = await inspectMarketplacePath(trustedRoot, filePath, 'file');
|
|
263
|
+
if (!stats)
|
|
264
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
194
265
|
try {
|
|
195
|
-
await fs.
|
|
196
|
-
|
|
266
|
+
const value = await fs.readJson(filePath);
|
|
267
|
+
if (!isRecord(value))
|
|
268
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
269
|
+
return value;
|
|
197
270
|
}
|
|
198
271
|
catch (error) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
272
|
+
if (error instanceof CodexNativeProjectionNotReusableError)
|
|
273
|
+
throw error;
|
|
274
|
+
if (error.code)
|
|
275
|
+
throw error;
|
|
276
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
203
277
|
}
|
|
204
278
|
}
|
|
205
|
-
async function
|
|
279
|
+
async function preserveMarketplacePluginProjection(options) {
|
|
280
|
+
const sourcePluginRoot = path.join(options.sourceRoot, 'plugins', options.pluginName);
|
|
281
|
+
const stagingPluginRoot = path.join(options.stagingRoot, 'plugins', options.pluginName);
|
|
282
|
+
const sourceManifest = await readProjectionJson(options.sourceRoot, path.join(sourcePluginRoot, '.agents-plugin', 'plugin.json'));
|
|
283
|
+
const sourceTargets = nativeCodexTargets(sourceManifest);
|
|
284
|
+
if (sourceTargets.length === 0) {
|
|
285
|
+
await assertRegularProjectionTree(sourcePluginRoot);
|
|
286
|
+
if (sourceManifest.name !== options.pluginName) {
|
|
287
|
+
throw new Error('marketplaceProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
|
|
288
|
+
}
|
|
289
|
+
if (!await inspectMarketplacePath(options.stagingRoot, stagingPluginRoot, 'directory')) {
|
|
290
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
291
|
+
}
|
|
292
|
+
const stagingManifest = await readProjectionJson(options.stagingRoot, path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
|
|
293
|
+
if (stagingManifest.name !== options.pluginName) {
|
|
294
|
+
throw new Error('marketplaceProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
|
|
295
|
+
}
|
|
296
|
+
for (const platform of ['codex', 'claude']) {
|
|
297
|
+
const manifestPath = path.join(sourcePluginRoot, `.${platform}-plugin`, 'plugin.json');
|
|
298
|
+
if (!await inspectMarketplacePath(options.sourceRoot, manifestPath, 'file'))
|
|
299
|
+
continue;
|
|
300
|
+
const manifest = await readProjectionJson(options.sourceRoot, manifestPath);
|
|
301
|
+
if (manifest.name !== options.pluginName) {
|
|
302
|
+
throw new Error('marketplaceProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
|
|
303
|
+
}
|
|
304
|
+
if (manifest.version !== sourceManifest.version)
|
|
305
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
306
|
+
}
|
|
307
|
+
await assertRegularProjectionTree(stagingPluginRoot);
|
|
308
|
+
await fs.remove(stagingPluginRoot);
|
|
309
|
+
await fs.copy(sourcePluginRoot, stagingPluginRoot, { dereference: false });
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
await assertRegularProjectionTree(sourcePluginRoot);
|
|
313
|
+
const sourceCodexManifest = await readProjectionJson(options.sourceRoot, path.join(sourcePluginRoot, '.codex-plugin', 'plugin.json'));
|
|
314
|
+
if (sourceManifest.name !== options.pluginName || sourceCodexManifest.name !== options.pluginName) {
|
|
315
|
+
throw new Error('codexNativeProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
|
|
316
|
+
}
|
|
317
|
+
const sourceSkillsRelative = normalizePluginRelativeDirectory(sourceCodexManifest.skills, 'codex/skills');
|
|
318
|
+
if (!sourceSkillsRelative) {
|
|
319
|
+
throw new Error('codexNativeProjectionUnsafe: Codex Skills root is unsafe.');
|
|
320
|
+
}
|
|
321
|
+
const receiptPath = path.join(sourcePluginRoot, CODEX_NATIVE_RENDER_RECEIPT_PATH);
|
|
322
|
+
const receiptStats = await inspectMarketplacePath(options.sourceRoot, receiptPath, 'file');
|
|
323
|
+
if (!receiptStats)
|
|
324
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
325
|
+
let receipt;
|
|
326
|
+
try {
|
|
327
|
+
const receiptContent = await fs.readFile(receiptPath, 'utf8');
|
|
328
|
+
receipt = parseCodexNativeRenderReceipt(receiptContent);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
if (error.code)
|
|
332
|
+
throw error;
|
|
333
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
334
|
+
}
|
|
335
|
+
const logicalPluginId = `${options.sourceId}/${options.pluginName}`;
|
|
336
|
+
if (receipt.logicalPluginId !== logicalPluginId || receipt.sourceIdentity !== options.sourceIdentity) {
|
|
337
|
+
throw new Error('codexNativeProjectionIdentityMismatch: receipt identity does not match its marketplace.');
|
|
338
|
+
}
|
|
339
|
+
if (!await inspectMarketplacePath(options.stagingRoot, stagingPluginRoot, 'directory')) {
|
|
340
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
341
|
+
}
|
|
342
|
+
await assertRegularProjectionTree(stagingPluginRoot);
|
|
343
|
+
const stagingManifest = await readProjectionJson(options.stagingRoot, path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
|
|
344
|
+
if (stagingManifest.name !== options.pluginName) {
|
|
345
|
+
throw new Error('codexNativeProjectionIdentityMismatch: plugin identity does not match its marketplace path.');
|
|
346
|
+
}
|
|
347
|
+
if (sourceManifest.version !== receipt.pluginVersion
|
|
348
|
+
|| sourceCodexManifest.version !== receipt.pluginVersion) {
|
|
349
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
350
|
+
}
|
|
351
|
+
const receiptTargetIdentity = receipt.targets.map(({ id, skillKey }) => ({ id, skillKey }));
|
|
352
|
+
if (JSON.stringify(sourceTargets) !== JSON.stringify(receiptTargetIdentity)) {
|
|
353
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
354
|
+
}
|
|
355
|
+
const sourceSkillsRoot = path.join(sourcePluginRoot, ...sourceSkillsRelative.split('/'));
|
|
356
|
+
const emptyArtifactDigest = createCodexSkillStagingTreeContentDigest({ skillKey: 'empty', files: {} });
|
|
357
|
+
for (const target of receipt.targets) {
|
|
358
|
+
const skillRoot = path.join(sourceSkillsRoot, target.skillKey);
|
|
359
|
+
const stats = await inspectMarketplacePath(options.sourceRoot, skillRoot, 'directory');
|
|
360
|
+
if (stats)
|
|
361
|
+
await assertRegularProjectionTree(skillRoot, true);
|
|
362
|
+
let tree;
|
|
363
|
+
try {
|
|
364
|
+
tree = stats ? await readDynamicSkillTree(skillRoot, 'codex.skill') : null;
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
if (error.code)
|
|
368
|
+
throw error;
|
|
369
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
370
|
+
}
|
|
371
|
+
if ((stats && !tree)
|
|
372
|
+
|| (tree ? createCodexSkillStagingTreeContentDigest(tree) : emptyArtifactDigest) !== target.artifactDigest) {
|
|
373
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
if (await calculateCodexNativeRenderPayloadDigest(sourcePluginRoot) !== receipt.payloadDigest) {
|
|
377
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
378
|
+
}
|
|
379
|
+
const temporaryRoot = await fs.mkdtemp(path.join(options.stagingRoot, '.native-projection-'));
|
|
380
|
+
const candidateRoot = path.join(temporaryRoot, options.pluginName);
|
|
381
|
+
try {
|
|
382
|
+
// An unrelated operation must retain the installed version and its render inputs together.
|
|
383
|
+
await fs.copy(sourcePluginRoot, candidateRoot, { dereference: false });
|
|
384
|
+
if (await calculateCodexNativeRenderPayloadDigest(candidateRoot) !== receipt.payloadDigest) {
|
|
385
|
+
throw new CodexNativeProjectionNotReusableError();
|
|
386
|
+
}
|
|
387
|
+
await fs.remove(stagingPluginRoot);
|
|
388
|
+
await fs.move(candidateRoot, stagingPluginRoot);
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
await fs.remove(temporaryRoot).catch(() => undefined);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Replays unselected plugin copies into a fresh Catalog generation.
|
|
396
|
+
* Retains their payload and marketplace entries even when the Catalog changes.
|
|
397
|
+
* Codex native dynamic projections must also retain their original validated receipt.
|
|
398
|
+
* Damaged weak projections are skipped so their owning plugin can recover by sync.
|
|
399
|
+
*/
|
|
400
|
+
export async function replayNamespacedMarketplacePluginProjections(options) {
|
|
401
|
+
let existing;
|
|
402
|
+
try {
|
|
403
|
+
existing = await readStrictNamespacedMarketplaceRoot({
|
|
404
|
+
trustedMarketplaceRoot: path.dirname(options.sourceRoot),
|
|
405
|
+
rootDir: options.sourceRoot,
|
|
406
|
+
sourceId: options.sourceId,
|
|
407
|
+
sourceIdentity: options.sourceIdentity,
|
|
408
|
+
marketplaceName: options.marketplaceName,
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
if (error instanceof Error && error.message.startsWith('sourceChanged:'))
|
|
413
|
+
throw error;
|
|
414
|
+
throw new Error(`marketplaceProjectionReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, [options.sourceRoot, options.stagingRoot])}`);
|
|
415
|
+
}
|
|
416
|
+
if (!existing)
|
|
417
|
+
return;
|
|
418
|
+
const retainedPluginNames = new Set();
|
|
419
|
+
const pluginsRoot = path.join(options.sourceRoot, 'plugins');
|
|
420
|
+
let entries;
|
|
421
|
+
try {
|
|
422
|
+
entries = await readOverlayDirectory(options.sourceRoot, pluginsRoot, [options.sourceRoot, options.stagingRoot]);
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
throw new Error(`marketplaceProjectionReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, [options.sourceRoot, options.stagingRoot])}`);
|
|
426
|
+
}
|
|
427
|
+
for (const entry of entries) {
|
|
428
|
+
if (entry.isSymbolicLink()) {
|
|
429
|
+
throw new Error('codexNativeProjectionUnsafe: plugin root cannot be a symlink.');
|
|
430
|
+
}
|
|
431
|
+
if (!entry.isDirectory())
|
|
432
|
+
continue;
|
|
433
|
+
const logicalPluginId = `${options.sourceId}/${entry.name}`;
|
|
434
|
+
if (options.rematerializedPluginIds?.has(logicalPluginId))
|
|
435
|
+
continue;
|
|
436
|
+
try {
|
|
437
|
+
await preserveMarketplacePluginProjection({ ...options, pluginName: entry.name });
|
|
438
|
+
retainedPluginNames.add(entry.name);
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
if (error instanceof CodexNativeProjectionNotReusableError)
|
|
442
|
+
continue;
|
|
443
|
+
throw new Error(`marketplaceProjectionReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, [options.sourceRoot, options.stagingRoot])}`);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
for (const [sourceManifest, relativePath] of [
|
|
447
|
+
[existing.agentsManifest, '.agents/plugins/marketplace.json'],
|
|
448
|
+
[existing.claudeManifest, '.claude-plugin/marketplace.json'],
|
|
449
|
+
]) {
|
|
450
|
+
const manifestPath = path.join(options.stagingRoot, relativePath);
|
|
451
|
+
const stagingManifest = await readStrictOptionalJsonObject(options.stagingRoot, manifestPath);
|
|
452
|
+
if (!stagingManifest || retainedPluginNames.size === 0)
|
|
453
|
+
continue;
|
|
454
|
+
if (!Array.isArray(stagingManifest.plugins) || (sourceManifest && !Array.isArray(sourceManifest.plugins))) {
|
|
455
|
+
throw new Error('marketplaceProjectionInvalid: marketplace plugins must be an array.');
|
|
456
|
+
}
|
|
457
|
+
const retainedEntries = (sourceManifest?.plugins ?? []).filter((entry) => isRecord(entry)
|
|
458
|
+
&& typeof entry.name === 'string' && retainedPluginNames.has(entry.name));
|
|
459
|
+
await fs.writeJson(manifestPath, {
|
|
460
|
+
...stagingManifest,
|
|
461
|
+
plugins: [
|
|
462
|
+
...stagingManifest.plugins.filter((entry) => !isRecord(entry) || !retainedPluginNames.has(String(entry.name))),
|
|
463
|
+
...retainedEntries.map((entry) => ({
|
|
464
|
+
...entry,
|
|
465
|
+
source: `./plugins/${entry.name}`,
|
|
466
|
+
})),
|
|
467
|
+
],
|
|
468
|
+
}, { spaces: 2 });
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
async function inspectOverlayPath(trustedRoot, targetPath, finalKind, redactedRoots) {
|
|
472
|
+
try {
|
|
473
|
+
return await inspectMarketplacePath(trustedRoot, targetPath, finalKind);
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
throw new Error(`marketplaceOverlayReadFailed: ${sanitizeCatalogSourceErrorMessage(error instanceof Error ? error.message : String(error), process.env, redactedRoots)}`);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
async function readOverlayDirectory(trustedRoot, directoryPath, redactedRoots) {
|
|
480
|
+
if (!await inspectOverlayPath(trustedRoot, directoryPath, 'directory', redactedRoots))
|
|
481
|
+
return [];
|
|
206
482
|
try {
|
|
207
483
|
return await fs.readdir(directoryPath, { withFileTypes: true });
|
|
208
484
|
}
|
|
@@ -233,7 +509,7 @@ export async function replayNamespacedCodexSkillOverlays(options) {
|
|
|
233
509
|
return;
|
|
234
510
|
const pluginsRoot = path.join(options.sourceRoot, 'plugins');
|
|
235
511
|
const redactedRoots = [options.sourceRoot, options.stagingRoot];
|
|
236
|
-
for (const pluginEntry of await readOverlayDirectory(pluginsRoot, redactedRoots)) {
|
|
512
|
+
for (const pluginEntry of await readOverlayDirectory(options.sourceRoot, pluginsRoot, redactedRoots)) {
|
|
237
513
|
if (pluginEntry.isSymbolicLink()) {
|
|
238
514
|
throw new Error(`Codex Skill overlay plugin root cannot be a symlink: ${pluginEntry.name}`);
|
|
239
515
|
}
|
|
@@ -241,28 +517,25 @@ export async function replayNamespacedCodexSkillOverlays(options) {
|
|
|
241
517
|
continue;
|
|
242
518
|
const pluginName = pluginEntry.name;
|
|
243
519
|
const sourcePluginRoot = path.join(pluginsRoot, pluginName);
|
|
244
|
-
const sourcePlatformManifest = await
|
|
520
|
+
const sourcePlatformManifest = await readStrictOptionalJsonObject(options.sourceRoot, path.join(sourcePluginRoot, '.codex-plugin', 'plugin.json'));
|
|
245
521
|
const sourceSkillsRelative = normalizePluginRelativeDirectory(sourcePlatformManifest?.skills, 'codex/skills');
|
|
246
522
|
if (!sourceSkillsRelative)
|
|
247
523
|
continue;
|
|
248
524
|
const sourceSkillsRoot = path.join(sourcePluginRoot, ...sourceSkillsRelative.split('/'));
|
|
249
525
|
const overlays = [];
|
|
250
|
-
for (const entry of await readOverlayDirectory(sourceSkillsRoot, redactedRoots)) {
|
|
526
|
+
for (const entry of await readOverlayDirectory(options.sourceRoot, sourceSkillsRoot, redactedRoots)) {
|
|
251
527
|
if (entry.isSymbolicLink()) {
|
|
252
528
|
throw new Error(`Codex Skill overlay cannot be a symlink: ${path.join(sourceSkillsRoot, entry.name)}`);
|
|
253
529
|
}
|
|
254
530
|
if (!entry.isDirectory())
|
|
255
531
|
continue;
|
|
256
532
|
const skillRoot = path.join(sourceSkillsRoot, entry.name);
|
|
257
|
-
|
|
258
|
-
continue;
|
|
259
|
-
await readSkillOwnerMarker({
|
|
533
|
+
const owner = await readSkillOwnerMarker({
|
|
260
534
|
skillRoot,
|
|
261
535
|
allowedRoot: sourceSkillsRoot,
|
|
262
536
|
expectedIdentity: {
|
|
263
537
|
owner: 'agent-workflows',
|
|
264
538
|
sourceId: options.sourceId,
|
|
265
|
-
sourceIdentity: options.sourceIdentity,
|
|
266
539
|
pluginId: `${options.sourceId}/${pluginName}`,
|
|
267
540
|
plugin: pluginName,
|
|
268
541
|
artifactKey: entry.name,
|
|
@@ -270,47 +543,44 @@ export async function replayNamespacedCodexSkillOverlays(options) {
|
|
|
270
543
|
scope: 'user',
|
|
271
544
|
},
|
|
272
545
|
});
|
|
546
|
+
if (!owner)
|
|
547
|
+
continue;
|
|
273
548
|
overlays.push({ key: entry.name, root: skillRoot });
|
|
274
549
|
}
|
|
275
550
|
if (overlays.length === 0)
|
|
276
551
|
continue;
|
|
277
552
|
const stagingPluginRoot = path.join(options.stagingRoot, 'plugins', pluginName);
|
|
278
|
-
if (!await
|
|
279
|
-
await assertTreeHasNoSymlinks(sourcePluginRoot);
|
|
280
|
-
await fs.copy(sourcePluginRoot, stagingPluginRoot, {
|
|
281
|
-
overwrite: false, errorOnExist: true, dereference: false,
|
|
282
|
-
});
|
|
553
|
+
if (!await inspectOverlayPath(options.stagingRoot, stagingPluginRoot, 'directory', redactedRoots))
|
|
283
554
|
continue;
|
|
284
|
-
|
|
285
|
-
const stagingManifest = await readOptionalJsonObject(path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
|
|
555
|
+
const stagingManifest = await readStrictOptionalJsonObject(options.stagingRoot, path.join(stagingPluginRoot, '.agents-plugin', 'plugin.json'));
|
|
286
556
|
const targets = stagingManifest?.artifacts?.targets ?? [];
|
|
287
557
|
const dynamicKeys = new Set(targets.flatMap((target) => {
|
|
288
558
|
if (!isRecord(target))
|
|
289
559
|
return [];
|
|
290
560
|
return target.platform === 'codex'
|
|
291
561
|
&& target.target === 'codex.skill'
|
|
562
|
+
&& isRecord(target.delivery)
|
|
563
|
+
&& target.delivery.mode === 'codex-native'
|
|
292
564
|
&& Array.isArray(target.scopes)
|
|
293
565
|
&& target.scopes.includes('user')
|
|
294
566
|
&& typeof target.skillKey === 'string'
|
|
295
567
|
? [target.skillKey]
|
|
296
568
|
: [];
|
|
297
569
|
}));
|
|
298
|
-
const stagingPlatformManifest = await
|
|
570
|
+
const stagingPlatformManifest = await readStrictOptionalJsonObject(options.stagingRoot, path.join(stagingPluginRoot, '.codex-plugin', 'plugin.json'));
|
|
299
571
|
const stagingSkillsRelative = normalizePluginRelativeDirectory(stagingPlatformManifest?.skills, 'codex/skills');
|
|
300
572
|
if (!stagingSkillsRelative)
|
|
301
573
|
continue;
|
|
302
574
|
const stagingSkillsRoot = path.join(stagingPluginRoot, ...stagingSkillsRelative.split('/'));
|
|
575
|
+
await inspectOverlayPath(options.stagingRoot, stagingSkillsRoot, 'directory', redactedRoots);
|
|
303
576
|
for (const overlay of overlays) {
|
|
577
|
+
if (!dynamicKeys.has(overlay.key))
|
|
578
|
+
continue;
|
|
304
579
|
const destination = path.join(stagingSkillsRoot, overlay.key);
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
await fs.copyFile(path.join(overlay.root, SKILL_OWNER_MARKER), path.join(destination, SKILL_OWNER_MARKER));
|
|
313
|
-
}
|
|
580
|
+
await assertTreeHasNoSymlinks(overlay.root);
|
|
581
|
+
await fs.copy(overlay.root, destination, {
|
|
582
|
+
overwrite: true, errorOnExist: false, dereference: false,
|
|
583
|
+
});
|
|
314
584
|
}
|
|
315
585
|
}
|
|
316
586
|
}
|