opkg 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -21
- package/dist/commands/add.js +11 -276
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/duplicate.js +5 -2
- package/dist/commands/duplicate.js.map +1 -1
- package/dist/commands/init.js +76 -145
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +30 -671
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.js +9 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.js +58 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +28 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/pack.js +10 -137
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/pull.js +5 -299
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +5 -239
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/save.js +29 -168
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/show.js +18 -5
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.js +21 -8
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tui.js +61 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/uninstall.js +5 -5
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/constants/index.js +19 -45
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/workspace.js +9 -0
- package/dist/constants/workspace.js.map +1 -0
- package/dist/core/add/add-conflict-handler.js +68 -0
- package/dist/core/add/add-conflict-handler.js.map +1 -0
- package/dist/core/add/add-pipeline.js +137 -0
- package/dist/core/add/add-pipeline.js.map +1 -0
- package/dist/core/add/package-index-updater.js +66 -36
- package/dist/core/add/package-index-updater.js.map +1 -1
- package/dist/core/add/platform-path-transformer.js +47 -0
- package/dist/core/add/platform-path-transformer.js.map +1 -0
- package/dist/core/add/source-collector.js +57 -0
- package/dist/core/add/source-collector.js.map +1 -0
- package/dist/core/api-keys.js +6 -2
- package/dist/core/api-keys.js.map +1 -1
- package/dist/core/auth.js +25 -40
- package/dist/core/auth.js.map +1 -1
- package/dist/core/config.js +11 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/dependency-resolver.js +24 -11
- package/dist/core/dependency-resolver.js.map +1 -1
- package/dist/core/device-auth.js +81 -0
- package/dist/core/device-auth.js.map +1 -0
- package/dist/core/directory.js +15 -9
- package/dist/core/directory.js.map +1 -1
- package/dist/core/discovery/file-discovery.js +55 -54
- package/dist/core/discovery/file-discovery.js.map +1 -1
- package/dist/core/discovery/platform-files-discovery.js +32 -17
- package/dist/core/discovery/platform-files-discovery.js.map +1 -1
- package/dist/core/install/bulk-install-pipeline.js +200 -0
- package/dist/core/install/bulk-install-pipeline.js.map +1 -0
- package/dist/core/install/canonical-plan.js +129 -0
- package/dist/core/install/canonical-plan.js.map +1 -0
- package/dist/core/install/download-keys.js +2 -2
- package/dist/core/install/download-keys.js.map +1 -1
- package/dist/core/install/dry-run.js +2 -2
- package/dist/core/install/dry-run.js.map +1 -1
- package/dist/core/install/index.js +3 -0
- package/dist/core/install/index.js.map +1 -0
- package/dist/core/install/install-errors.js +41 -0
- package/dist/core/install/install-errors.js.map +1 -0
- package/dist/core/install/install-flow.js +8 -9
- package/dist/core/install/install-flow.js.map +1 -1
- package/dist/core/install/install-pipeline.js +296 -0
- package/dist/core/install/install-pipeline.js.map +1 -0
- package/dist/core/install/install-reporting.js +99 -0
- package/dist/core/install/install-reporting.js.map +1 -0
- package/dist/core/install/platform-resolution.js +6 -6
- package/dist/core/install/platform-resolution.js.map +1 -1
- package/dist/core/install/remote-flow.js +84 -7
- package/dist/core/install/remote-flow.js.map +1 -1
- package/dist/core/install/version-selection.js +25 -8
- package/dist/core/install/version-selection.js.map +1 -1
- package/dist/core/openpackage.js +22 -14
- package/dist/core/openpackage.js.map +1 -1
- package/dist/core/package-context.js +246 -0
- package/dist/core/package-context.js.map +1 -0
- package/dist/core/package.js +73 -9
- package/dist/core/package.js.map +1 -1
- package/dist/core/platforms.js +126 -217
- package/dist/core/platforms.js.map +1 -1
- package/dist/core/profiles.js +60 -3
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/pull/pull-errors.js +62 -0
- package/dist/core/pull/pull-errors.js.map +1 -0
- package/dist/core/pull/pull-options.js +2 -0
- package/dist/core/pull/pull-options.js.map +1 -0
- package/dist/core/pull/pull-output.js +50 -0
- package/dist/core/pull/pull-output.js.map +1 -0
- package/dist/core/pull/pull-pipeline.js +141 -0
- package/dist/core/pull/pull-pipeline.js.map +1 -0
- package/dist/core/pull/pull-strategies.js +103 -0
- package/dist/core/pull/pull-strategies.js.map +1 -0
- package/dist/core/pull/pull-types.js +2 -0
- package/dist/core/pull/pull-types.js.map +1 -0
- package/dist/core/push/push-context.js +95 -0
- package/dist/core/push/push-context.js.map +1 -0
- package/dist/core/push/push-errors.js +133 -0
- package/dist/core/push/push-errors.js.map +1 -0
- package/dist/core/push/push-output.js +44 -0
- package/dist/core/push/push-output.js.map +1 -0
- package/dist/core/push/push-pipeline.js +74 -0
- package/dist/core/push/push-pipeline.js.map +1 -0
- package/dist/core/push/push-single-file.js +56 -0
- package/dist/core/push/push-single-file.js.map +1 -0
- package/dist/core/push/push-types.js +2 -0
- package/dist/core/push/push-types.js.map +1 -0
- package/dist/core/push/push-upload.js +68 -0
- package/dist/core/push/push-upload.js.map +1 -0
- package/dist/core/registry/registry-rename.js +2 -1
- package/dist/core/registry/registry-rename.js.map +1 -1
- package/dist/core/registry.js +14 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/core/remote-pull.js +165 -36
- package/dist/core/remote-pull.js.map +1 -1
- package/dist/core/save/constants.js +4 -0
- package/dist/core/save/constants.js.map +1 -1
- package/dist/core/save/name-resolution.js +31 -0
- package/dist/core/save/name-resolution.js.map +1 -0
- package/dist/core/save/package-detection.js +147 -0
- package/dist/core/save/package-detection.js.map +1 -0
- package/dist/core/save/package-saver.js +82 -43
- package/dist/core/save/package-saver.js.map +1 -1
- package/dist/core/save/package-yml-generator.js +51 -71
- package/dist/core/save/package-yml-generator.js.map +1 -1
- package/dist/core/save/root-save-candidates.js.map +1 -1
- package/dist/core/save/save-candidate-loader.js +89 -0
- package/dist/core/save/save-candidate-loader.js.map +1 -0
- package/dist/core/save/save-conflict-resolution.js +72 -410
- package/dist/core/save/save-conflict-resolution.js.map +1 -1
- package/dist/core/save/save-conflict-resolver.js +277 -0
- package/dist/core/save/save-conflict-resolver.js.map +1 -0
- package/dist/core/save/save-pipeline.js +162 -0
- package/dist/core/save/save-pipeline.js.map +1 -0
- package/dist/core/save/save-single-file.js +124 -0
- package/dist/core/save/save-single-file.js.map +1 -0
- package/dist/core/save/save-types.js +2 -0
- package/dist/core/save/save-types.js.map +1 -0
- package/dist/core/save/save-yml-resolution.js +77 -39
- package/dist/core/save/save-yml-resolution.js.map +1 -1
- package/dist/core/save/workspace-rename.js +6 -6
- package/dist/core/save/workspace-rename.js.map +1 -1
- package/dist/core/scoping/package-scoping.js +14 -2
- package/dist/core/scoping/package-scoping.js.map +1 -1
- package/dist/core/status/status-file-discovery.js +12 -30
- package/dist/core/status/status-file-discovery.js.map +1 -1
- package/dist/core/sync/platform-sync.js +7 -4
- package/dist/core/sync/platform-sync.js.map +1 -1
- package/dist/core/sync/root-files-sync.js +59 -1
- package/dist/core/sync/root-files-sync.js.map +1 -1
- package/dist/core/token-store.js +73 -0
- package/dist/core/token-store.js.map +1 -0
- package/dist/core/uninstall/uninstall-file-discovery.js +1 -2
- package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/tui/app.js +95 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components/package-list.js +73 -0
- package/dist/tui/components/package-list.js.map +1 -0
- package/dist/tui/controller.js +365 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/index.js +12 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/services/file-index.js +64 -0
- package/dist/tui/services/file-index.js.map +1 -0
- package/dist/tui/services/packages.js +18 -0
- package/dist/tui/services/packages.js.map +1 -0
- package/dist/tui/services/save.js +21 -0
- package/dist/tui/services/save.js.map +1 -0
- package/dist/tui/state/app-state.js +15 -0
- package/dist/tui/state/app-state.js.map +1 -0
- package/dist/tui/state.js +17 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/views/add-file-modal.js +129 -0
- package/dist/tui/views/add-file-modal.js.map +1 -0
- package/dist/tui/views/file-preview.js +44 -0
- package/dist/tui/views/file-preview.js.map +1 -0
- package/dist/tui/views/list-packages.js +73 -0
- package/dist/tui/views/list-packages.js.map +1 -0
- package/dist/tui/views/main-menu.js +29 -0
- package/dist/tui/views/main-menu.js.map +1 -0
- package/dist/tui/views/manage-view.js +81 -0
- package/dist/tui/views/manage-view.js.map +1 -0
- package/dist/tui/views/package-hub.js +120 -0
- package/dist/tui/views/package-hub.js.map +1 -0
- package/dist/tui/views/placeholder.js +24 -0
- package/dist/tui/views/placeholder.js.map +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/bun-bootstrap.js +72 -0
- package/dist/utils/bun-bootstrap.js.map +1 -0
- package/dist/utils/file-processing.js +5 -58
- package/dist/utils/file-processing.js.map +1 -1
- package/dist/utils/formatters.js +3 -1
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/http-client.js +27 -5
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/index-based-installer.js +40 -35
- package/dist/utils/index-based-installer.js.map +1 -1
- package/dist/utils/install-file-discovery.js +18 -24
- package/dist/utils/install-file-discovery.js.map +1 -1
- package/dist/utils/install-orchestrator.js +21 -21
- package/dist/utils/install-orchestrator.js.map +1 -1
- package/dist/utils/jsonc.js +44 -0
- package/dist/utils/jsonc.js.map +1 -0
- package/dist/utils/manifest-paths.js +27 -0
- package/dist/utils/manifest-paths.js.map +1 -0
- package/dist/utils/package-copy.js +199 -0
- package/dist/utils/package-copy.js.map +1 -0
- package/dist/utils/package-filters.js +125 -0
- package/dist/utils/package-filters.js.map +1 -0
- package/dist/utils/package-index-yml.js +15 -10
- package/dist/utils/package-index-yml.js.map +1 -1
- package/dist/utils/package-installation.js +4 -113
- package/dist/utils/package-installation.js.map +1 -1
- package/dist/utils/package-local-files.js +2 -35
- package/dist/utils/package-local-files.js.map +1 -1
- package/dist/utils/package-management.js +191 -75
- package/dist/utils/package-management.js.map +1 -1
- package/dist/utils/package-merge.js +48 -0
- package/dist/utils/package-merge.js.map +1 -0
- package/dist/utils/package-name.js +29 -0
- package/dist/utils/package-name.js.map +1 -1
- package/dist/utils/package-versioning.js +16 -4
- package/dist/utils/package-versioning.js.map +1 -1
- package/dist/utils/package-yml.js +41 -12
- package/dist/utils/package-yml.js.map +1 -1
- package/dist/utils/path-normalization.js +8 -53
- package/dist/utils/path-normalization.js.map +1 -1
- package/dist/utils/paths.js +17 -9
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/platform-file.js +16 -59
- package/dist/utils/platform-file.js.map +1 -1
- package/dist/utils/platform-mapper.js +29 -41
- package/dist/utils/platform-mapper.js.map +1 -1
- package/dist/utils/platform-specific-paths.js.map +1 -1
- package/dist/utils/platform-utils.js +28 -139
- package/dist/utils/platform-utils.js.map +1 -1
- package/dist/utils/platform-yaml-merge.js +13 -6
- package/dist/utils/platform-yaml-merge.js.map +1 -1
- package/dist/utils/prompts.js +0 -31
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/registry-entry-filter.js +38 -24
- package/dist/utils/registry-entry-filter.js.map +1 -1
- package/dist/utils/registry-paths.js +48 -0
- package/dist/utils/registry-paths.js.map +1 -0
- package/dist/utils/root-file-installer.js +19 -0
- package/dist/utils/root-file-installer.js.map +1 -1
- package/dist/utils/root-file-registry.js.map +1 -1
- package/dist/utils/tarball.js +6 -2
- package/dist/utils/tarball.js.map +1 -1
- package/dist/utils/version-ranges.js +11 -8
- package/dist/utils/version-ranges.js.map +1 -1
- package/package.json +3 -2
- package/platforms.jsonc +178 -0
- package/specs/auth/auth-device-flow.md +70 -0
- package/specs/install/install-behavior.md +30 -0
- package/specs/install/package-yml-canonical.md +21 -1
- package/specs/install/version-resolution.md +9 -7
- package/specs/login/login-device-flow.md +70 -0
- package/specs/package/README.md +60 -0
- package/specs/package/nested-packages-and-parent-packages.md +79 -0
- package/specs/package/package-index-yml.md +171 -0
- package/specs/package/package-root-layout.md +78 -0
- package/specs/package/registry-payload-and-copy.md +77 -0
- package/specs/package/universal-content.md +144 -0
- package/specs/platforms.md +193 -0
- package/specs/push/push-behavior.md +38 -10
- package/specs/push/push-errors-and-hints.md +19 -6
- package/specs/push/push-remote-upload.md +3 -0
- package/specs/push/push-scoping.md +14 -22
- package/specs/push/push-version-selection.md +18 -16
- package/specs/save/README.md +40 -0
- package/specs/save/save-conflict-resolution.md +146 -0
- package/specs/save/save-file-discovery.md +101 -0
- package/specs/save/save-frontmatter-overrides.md +81 -0
- package/specs/save/save-modes-inputs.md +55 -0
- package/specs/save/save-naming-scoping.md +93 -0
- package/specs/save/save-package-detection.md +60 -0
- package/specs/save/save-registry-sync.md +126 -0
- package/specs/save-pack.md +1 -0
- package/dist/commands/release.js +0 -33
- package/dist/commands/release.js.map +0 -1
- package/dist/commands/tag.js +0 -311
- package/dist/commands/tag.js.map +0 -1
- package/dist/commands/update.js +0 -30
- package/dist/commands/update.js.map +0 -1
- package/dist/core/add/formula-index-updater.js +0 -290
- package/dist/core/add/formula-index-updater.js.map +0 -1
- package/dist/core/discovery/ai-files-discovery.js +0 -2
- package/dist/core/discovery/ai-files-discovery.js.map +0 -1
- package/dist/core/discovery/formula-files-discovery.js +0 -14
- package/dist/core/discovery/formula-files-discovery.js.map +0 -1
- package/dist/core/discovery/index-files-discovery.js +0 -91
- package/dist/core/discovery/index-files-discovery.js.map +0 -1
- package/dist/core/discovery/md-files-discovery.js +0 -82
- package/dist/core/discovery/md-files-discovery.js.map +0 -1
- package/dist/core/discovery/package-files-discovery.js +0 -14
- package/dist/core/discovery/package-files-discovery.js.map +0 -1
- package/dist/core/discovery/platform-discovery.js +0 -84
- package/dist/core/discovery/platform-discovery.js.map +0 -1
- package/dist/core/discovery/root-files-discovery.js +0 -2
- package/dist/core/discovery/root-files-discovery.js.map +0 -1
- package/dist/core/formula.js +0 -170
- package/dist/core/formula.js.map +0 -1
- package/dist/core/git-registry.js +0 -46
- package/dist/core/git-registry.js.map +0 -1
- package/dist/core/groundzero.js +0 -277
- package/dist/core/groundzero.js.map +0 -1
- package/dist/core/install/scenario.js +0 -11
- package/dist/core/install/scenario.js.map +0 -1
- package/dist/core/package-sync.js +0 -219
- package/dist/core/package-sync.js.map +0 -1
- package/dist/core/save/formula-file-generator.js +0 -167
- package/dist/core/save/formula-file-generator.js.map +0 -1
- package/dist/core/save/formula-saver.js +0 -52
- package/dist/core/save/formula-saver.js.map +0 -1
- package/dist/core/save/formula-yml-generator.js +0 -89
- package/dist/core/save/formula-yml-generator.js.map +0 -1
- package/dist/core/save/formula-yml-versioning.js +0 -108
- package/dist/core/save/formula-yml-versioning.js.map +0 -1
- package/dist/core/save/generic-file-sync.js +0 -38
- package/dist/core/save/generic-file-sync.js.map +0 -1
- package/dist/core/save/md-files-sync.js +0 -33
- package/dist/core/save/md-files-sync.js.map +0 -1
- package/dist/core/save/package-yml-versioning.js +0 -108
- package/dist/core/save/package-yml-versioning.js.map +0 -1
- package/dist/core/save/platform-sync.js +0 -95
- package/dist/core/save/platform-sync.js.map +0 -1
- package/dist/core/save/root-files-sync.js +0 -140
- package/dist/core/save/root-files-sync.js.map +0 -1
- package/dist/core/save/save-candidate-types.js +0 -2
- package/dist/core/save/save-candidate-types.js.map +0 -1
- package/dist/core/save/save-conflict-types.js +0 -2
- package/dist/core/save/save-conflict-types.js.map +0 -1
- package/dist/core/save/save-file-discovery.js +0 -5
- package/dist/core/save/save-file-discovery.js.map +0 -1
- package/dist/core/status-file-discovery.js +0 -175
- package/dist/core/status-file-discovery.js.map +0 -1
- package/dist/utils/discovery/file-processing.js +0 -156
- package/dist/utils/discovery/file-processing.js.map +0 -1
- package/dist/utils/discovery/formula-discovery.js +0 -211
- package/dist/utils/discovery/formula-discovery.js.map +0 -1
- package/dist/utils/discovery/platform-discovery.js +0 -2
- package/dist/utils/discovery/platform-discovery.js.map +0 -1
- package/dist/utils/formula-discovery.js +0 -102
- package/dist/utils/formula-discovery.js.map +0 -1
- package/dist/utils/formula-index-yml.js +0 -122
- package/dist/utils/formula-index-yml.js.map +0 -1
- package/dist/utils/formula-installation.js +0 -110
- package/dist/utils/formula-installation.js.map +0 -1
- package/dist/utils/formula-local-files.js +0 -38
- package/dist/utils/formula-local-files.js.map +0 -1
- package/dist/utils/formula-management.js +0 -191
- package/dist/utils/formula-management.js.map +0 -1
- package/dist/utils/formula-name.js +0 -97
- package/dist/utils/formula-name.js.map +0 -1
- package/dist/utils/formula-versioning.js +0 -109
- package/dist/utils/formula-versioning.js.map +0 -1
- package/dist/utils/formula-yml.js +0 -82
- package/dist/utils/formula-yml.js.map +0 -1
- package/dist/utils/git.js +0 -54
- package/dist/utils/git.js.map +0 -1
- package/dist/utils/id-based-discovery.js +0 -126
- package/dist/utils/id-based-discovery.js.map +0 -1
- package/dist/utils/id-based-installer.js +0 -249
- package/dist/utils/id-based-installer.js.map +0 -1
- package/dist/utils/index-yml-based-installer.js +0 -375
- package/dist/utils/index-yml-based-installer.js.map +0 -1
- package/dist/utils/index-yml.js +0 -124
- package/dist/utils/index-yml.js.map +0 -1
- package/dist/utils/md-frontmatter.js +0 -3
- package/dist/utils/md-frontmatter.js.map +0 -1
- package/dist/utils/package-link-yml.js +0 -92
- package/dist/utils/package-link-yml.js.map +0 -1
- package/dist/utils/platform-discovery.js +0 -2
- package/dist/utils/platform-discovery.js.map +0 -1
- package/dist/utils/platform-frontmatter-split.js +0 -15
- package/dist/utils/platform-frontmatter-split.js.map +0 -1
- package/dist/utils/timestamp-encoder.js +0 -13
- package/dist/utils/timestamp-encoder.js.map +0 -1
- package/dist/utils/wip-versioning.js +0 -24
- package/dist/utils/wip-versioning.js.map +0 -1
|
@@ -1,40 +1,34 @@
|
|
|
1
1
|
import { packageManager } from '../core/package.js';
|
|
2
|
-
import { FILE_PATTERNS } from '../constants/index.js';
|
|
2
|
+
import { FILE_PATTERNS, PACKAGE_PATHS } from '../constants/index.js';
|
|
3
3
|
import { getPlatformDefinition } from '../core/platforms.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
//
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
//
|
|
4
|
+
import { buildNormalizedIncludeSet, isManifestPath, normalizePackagePath } from './manifest-paths.js';
|
|
5
|
+
export async function discoverAndCategorizeFiles(packageName, version, platforms, includePaths) {
|
|
6
|
+
// Load once
|
|
7
|
+
const pkg = await packageManager.loadPackage(packageName, version);
|
|
8
|
+
const normalizedIncludes = buildNormalizedIncludeSet(includePaths);
|
|
9
|
+
const shouldInclude = (path) => !normalizedIncludes || normalizedIncludes.has(normalizePackagePath(path));
|
|
10
|
+
// Precompute platform root filenames
|
|
11
11
|
const platformRootNames = new Set();
|
|
12
12
|
for (const platform of platforms) {
|
|
13
13
|
const def = getPlatformDefinition(platform);
|
|
14
14
|
if (def.rootFile)
|
|
15
15
|
platformRootNames.add(def.rootFile);
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
if (platformRootNames.has(file.path)) {
|
|
19
|
-
rootFiles.set(file.path, file.content);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return rootFiles;
|
|
23
|
-
}
|
|
24
|
-
export async function discoverAndCategorizeFiles(packageName, version, platforms) {
|
|
25
|
-
// Load once
|
|
26
|
-
const pkg = await packageManager.loadPackage(packageName, version);
|
|
27
|
-
// Priority 1: Path-based files (all files from package)
|
|
17
|
+
// Single pass classification
|
|
28
18
|
const pathBasedFiles = [];
|
|
19
|
+
const rootFiles = new Map();
|
|
29
20
|
for (const file of pkg.files) {
|
|
30
21
|
const p = file.path;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
// Never install registry package metadata files
|
|
23
|
+
if (isManifestPath(p) || normalizePackagePath(p) === PACKAGE_PATHS.INDEX_RELATIVE)
|
|
24
|
+
continue;
|
|
25
|
+
if (!shouldInclude(p))
|
|
26
|
+
continue;
|
|
34
27
|
pathBasedFiles.push(file);
|
|
28
|
+
if (p === FILE_PATTERNS.AGENTS_MD || platformRootNames.has(p)) {
|
|
29
|
+
rootFiles.set(p, file.content);
|
|
30
|
+
}
|
|
35
31
|
}
|
|
36
|
-
// Priority 2: Root files (platform root + AGENTS.md)
|
|
37
|
-
const rootFiles = collectRootFiles(pkg.files, platforms);
|
|
38
32
|
return { pathBasedFiles, rootFiles };
|
|
39
33
|
}
|
|
40
34
|
//# sourceMappingURL=install-file-discovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-file-discovery.js","sourceRoot":"","sources":["../../src/utils/install-file-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"install-file-discovery.js","sourceRoot":"","sources":["../../src/utils/install-file-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAiB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAOtG,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,OAAe,EACf,SAAqB,EACrB,YAAuB;IAEvB,YAAY;IACZ,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEnE,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAEnE,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE,CAC9C,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5E,qCAAqC;IACrC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,GAAG,CAAC,QAAQ;YAAE,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,6BAA6B;IAC7B,MAAM,cAAc,GAAkB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACpB,gDAAgD;QAChD,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,cAAc;YAAE,SAAS;QAC5F,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAAE,SAAS;QAEhC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,KAAK,aAAa,CAAC,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { join, dirname } from 'path';
|
|
2
|
-
import {
|
|
2
|
+
import { DEFAULT_INSTALL_ROOT } from '../constants/workspace.js';
|
|
3
3
|
import { logger } from './logger.js';
|
|
4
4
|
import { packageManager } from '../core/package.js';
|
|
5
5
|
import { exists, ensureDir, writeTextFile } from './fs.js';
|
|
6
6
|
/**
|
|
7
|
-
* Install package files to
|
|
7
|
+
* Install package files to the workspace install root directory
|
|
8
8
|
* @param packageName - Name of the package to install
|
|
9
9
|
* @param targetDir - Target directory for installation
|
|
10
10
|
* @param options - Installation options including force and dry-run flags
|
|
@@ -12,22 +12,22 @@ import { exists, ensureDir, writeTextFile } from './fs.js';
|
|
|
12
12
|
* @param forceOverwrite - Force overwrite existing files
|
|
13
13
|
* @returns Object containing installation results including file counts and status flags
|
|
14
14
|
*/
|
|
15
|
-
export async function
|
|
16
|
-
logger.debug(`Installing
|
|
15
|
+
export async function installWorkspaceFiles(packageName, targetDir, options, version, forceOverwrite) {
|
|
16
|
+
logger.debug(`Installing workspace files for ${packageName} to ${targetDir}`, { version, forceOverwrite });
|
|
17
17
|
try {
|
|
18
18
|
// Get package from registry
|
|
19
19
|
const pkg = await packageManager.loadPackage(packageName, version);
|
|
20
|
-
//
|
|
21
|
-
const
|
|
22
|
-
const filesToInstall = pkg.files.filter(file => file.path.startsWith(
|
|
20
|
+
// Only install files that live under the workspace install root prefix
|
|
21
|
+
const installRootPrefix = `${DEFAULT_INSTALL_ROOT}/`;
|
|
22
|
+
const filesToInstall = pkg.files.filter(file => file.path.startsWith(installRootPrefix));
|
|
23
23
|
if (filesToInstall.length === 0) {
|
|
24
|
-
logger.debug(`No
|
|
24
|
+
logger.debug(`No workspace files to install for ${packageName}@${version || 'latest'}`);
|
|
25
25
|
return { installedCount: 0, files: [], overwritten: false, skipped: true };
|
|
26
26
|
}
|
|
27
|
-
// Check for existing files in parallel, rebasing paths under
|
|
27
|
+
// Check for existing files in parallel, rebasing paths under <installRoot>/<targetDir>/...
|
|
28
28
|
const existenceChecks = await Promise.all(filesToInstall.map(async (file) => {
|
|
29
|
-
const
|
|
30
|
-
const targetPath = join(
|
|
29
|
+
const installRelPath = file.path.slice(installRootPrefix.length);
|
|
30
|
+
const targetPath = join(DEFAULT_INSTALL_ROOT, targetDir || '.', installRelPath);
|
|
31
31
|
const fileExists = await exists(targetPath);
|
|
32
32
|
return { file, targetPath, exists: fileExists };
|
|
33
33
|
}));
|
|
@@ -50,10 +50,10 @@ export async function installAiFiles(packageName, targetDir, options, version, f
|
|
|
50
50
|
const installPromises = existenceChecks.map(async ({ file, targetPath }) => {
|
|
51
51
|
await writeTextFile(targetPath, file.content);
|
|
52
52
|
installedFiles.push(targetPath);
|
|
53
|
-
logger.debug(`Installed
|
|
53
|
+
logger.debug(`Installed workspace file: ${targetPath}`);
|
|
54
54
|
});
|
|
55
55
|
await Promise.all(installPromises);
|
|
56
|
-
logger.info(`Successfully installed ${installedFiles.length}
|
|
56
|
+
logger.info(`Successfully installed ${installedFiles.length} workspace files for ${packageName}@${version || 'latest'}`);
|
|
57
57
|
return {
|
|
58
58
|
installedCount: installedFiles.length,
|
|
59
59
|
files: installedFiles,
|
|
@@ -62,7 +62,7 @@ export async function installAiFiles(packageName, targetDir, options, version, f
|
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
catch (error) {
|
|
65
|
-
logger.error(`Failed to install
|
|
65
|
+
logger.error(`Failed to install workspace files for package ${packageName}: ${error}`);
|
|
66
66
|
return {
|
|
67
67
|
installedCount: 0,
|
|
68
68
|
files: [],
|
|
@@ -72,19 +72,19 @@ export async function installAiFiles(packageName, targetDir, options, version, f
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* Install
|
|
75
|
+
* Install workspace files from a pre-filtered list of package files (avoids re-loading registry)
|
|
76
76
|
*/
|
|
77
|
-
export async function
|
|
77
|
+
export async function installWorkspaceFilesFromList(cwd, targetDir, files, options, forceOverwrite = false) {
|
|
78
78
|
try {
|
|
79
79
|
if (files.length === 0) {
|
|
80
80
|
return { installedCount: 0, files: [], overwritten: false, skipped: true };
|
|
81
81
|
}
|
|
82
|
-
const
|
|
82
|
+
const installRootPrefix = `${DEFAULT_INSTALL_ROOT}/`;
|
|
83
83
|
// Pre-create dirs
|
|
84
84
|
const directories = new Set();
|
|
85
85
|
const targets = await Promise.all(files.map(async (file) => {
|
|
86
|
-
const
|
|
87
|
-
const targetPath = join(
|
|
86
|
+
const installRelPath = file.path.startsWith(installRootPrefix) ? file.path.slice(installRootPrefix.length) : file.path;
|
|
87
|
+
const targetPath = join(DEFAULT_INSTALL_ROOT, targetDir || '.', installRelPath);
|
|
88
88
|
directories.add(dirname(targetPath));
|
|
89
89
|
const existsFlag = await exists(targetPath);
|
|
90
90
|
return { file, targetPath, existsFlag };
|
|
@@ -99,12 +99,12 @@ export async function installAiFilesFromList(cwd, targetDir, files, options, for
|
|
|
99
99
|
await Promise.all(targets.map(async ({ file, targetPath }) => {
|
|
100
100
|
await writeTextFile(targetPath, file.content);
|
|
101
101
|
installedFiles.push(targetPath);
|
|
102
|
-
logger.debug(`Installed
|
|
102
|
+
logger.debug(`Installed workspace file: ${targetPath}`);
|
|
103
103
|
}));
|
|
104
104
|
return { installedCount: installedFiles.length, files: installedFiles, overwritten: hasOverwritten, skipped: false };
|
|
105
105
|
}
|
|
106
106
|
catch (error) {
|
|
107
|
-
logger.error(`Failed to install
|
|
107
|
+
logger.error(`Failed to install workspace files from list: ${error}`);
|
|
108
108
|
return { installedCount: 0, files: [], overwritten: false, skipped: true };
|
|
109
109
|
}
|
|
110
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-orchestrator.js","sourceRoot":"","sources":["../../src/utils/install-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAY,MAAM,MAAM,CAAC;AAE/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install-orchestrator.js","sourceRoot":"","sources":["../../src/utils/install-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONC (JSON with Comments) file utilities
|
|
3
|
+
* Handles reading and parsing JSONC files with comment support
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from 'fs';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { parse } from 'jsonc-parser';
|
|
9
|
+
import { logger } from './logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Get the project root directory
|
|
12
|
+
* Works in both development (src/) and production (dist/) environments
|
|
13
|
+
*/
|
|
14
|
+
function getProjectRoot() {
|
|
15
|
+
// Get the directory of the current file
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
// If we're in dist/utils, go up two levels to project root
|
|
19
|
+
// If we're in src/utils, go up two levels to project root
|
|
20
|
+
// Both src/utils and dist/utils are 2 levels deep from root
|
|
21
|
+
return join(__dirname, '..', '..');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Read and parse a JSONC file from the project root
|
|
25
|
+
* @param relativePath - Path relative to project root (e.g., 'platforms.jsonc')
|
|
26
|
+
* @returns Parsed JSON object
|
|
27
|
+
*/
|
|
28
|
+
export function readJsoncFileSync(relativePath) {
|
|
29
|
+
const projectRoot = getProjectRoot();
|
|
30
|
+
const fullPath = join(projectRoot, relativePath);
|
|
31
|
+
try {
|
|
32
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
33
|
+
const parsed = parse(content);
|
|
34
|
+
if (parsed === undefined) {
|
|
35
|
+
throw new Error(`Failed to parse JSONC file: ${relativePath}`);
|
|
36
|
+
}
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.error(`Failed to read JSONC file: ${relativePath}`, { error, fullPath });
|
|
41
|
+
throw new Error(`Failed to read JSONC file ${relativePath}: ${error}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=jsonc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonc.js","sourceRoot":"","sources":["../../src/utils/jsonc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,SAAS,cAAc;IACrB,wCAAwC;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,2DAA2D;IAC3D,0DAA0D;IAC1D,4DAA4D;IAC5D,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAc,YAAoB;IACjE,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,MAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,KAAK,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { FILE_PATTERNS, PACKAGE_PATHS } from '../constants/index.js';
|
|
2
|
+
import { normalizePathForProcessing } from './path-normalization.js';
|
|
3
|
+
/**
|
|
4
|
+
* Normalize package-internal paths for consistent comparisons.
|
|
5
|
+
* Strips leading slash and converts to forward slashes.
|
|
6
|
+
*/
|
|
7
|
+
export function normalizePackagePath(path) {
|
|
8
|
+
const trimmed = path.startsWith('/') ? path.slice(1) : path;
|
|
9
|
+
return normalizePathForProcessing(trimmed);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Determine if a path points to a package manifest (either bare or canonical).
|
|
13
|
+
*/
|
|
14
|
+
export function isManifestPath(path) {
|
|
15
|
+
const normalized = normalizePackagePath(path);
|
|
16
|
+
return (normalized === FILE_PATTERNS.PACKAGE_YML ||
|
|
17
|
+
normalized === PACKAGE_PATHS.MANIFEST_RELATIVE);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build a normalized include set (or null if empty) for registry path filtering.
|
|
21
|
+
*/
|
|
22
|
+
export function buildNormalizedIncludeSet(paths) {
|
|
23
|
+
if (!paths || paths.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
return new Set(paths.map(normalizePackagePath));
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=manifest-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-paths.js","sourceRoot":"","sources":["../../src/utils/manifest-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CACL,UAAU,KAAK,aAAa,CAAC,WAAW;QACxC,UAAU,KAAK,aAAa,CAAC,iBAAiB,CAC/C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAA2B;IACnE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package file I/O utilities for reading from and writing to package directories.
|
|
3
|
+
*
|
|
4
|
+
* This module provides two main operations:
|
|
5
|
+
* - readPackageFilesForRegistry: Collect files from a package directory into a
|
|
6
|
+
* registry-ready payload, applying static exclusions and manifest-based filters.
|
|
7
|
+
* - writePackageFilesToDirectory: Write a set of PackageFile entries to disk,
|
|
8
|
+
* syncing the directory contents (removing stale files).
|
|
9
|
+
*/
|
|
10
|
+
import { join, relative, dirname } from 'path';
|
|
11
|
+
import { DIR_PATTERNS, FILE_PATTERNS, PACKAGE_PATHS } from '../constants/index.js';
|
|
12
|
+
import { getAllPlatforms, getPlatformDefinition } from '../core/platforms.js';
|
|
13
|
+
import { exists, ensureDir, readTextFile, writeTextFile, walkFiles, remove } from './fs.js';
|
|
14
|
+
import { logger } from './logger.js';
|
|
15
|
+
import { normalizePathForProcessing } from './path-normalization.js';
|
|
16
|
+
import { parsePackageYml } from './package-yml.js';
|
|
17
|
+
import { createPackageFileFilter, isExcludedFromPackage } from './package-filters.js';
|
|
18
|
+
const MANIFEST_RELATIVE_PATHS = Object.freeze([
|
|
19
|
+
FILE_PATTERNS.PACKAGE_YML,
|
|
20
|
+
PACKAGE_PATHS.MANIFEST_RELATIVE
|
|
21
|
+
]);
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
// Reading package files
|
|
24
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Read package files from disk and return a registry-ready payload.
|
|
27
|
+
*
|
|
28
|
+
* Applies two layers of filtering:
|
|
29
|
+
* 1. Static exclusions (package index file, packages/** nested dirs).
|
|
30
|
+
* 2. Manifest-based include/exclude patterns from package.yml.
|
|
31
|
+
*
|
|
32
|
+
* @param packageDir - Absolute path to the package root directory.
|
|
33
|
+
* @returns Array of PackageFile entries representing the canonical payload.
|
|
34
|
+
*/
|
|
35
|
+
export async function readPackageFilesForRegistry(packageDir) {
|
|
36
|
+
if (!(await exists(packageDir))) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const manifestFilter = await loadManifestFilter(packageDir);
|
|
40
|
+
const files = [];
|
|
41
|
+
for await (const fullPath of walkFiles(packageDir)) {
|
|
42
|
+
const relativePath = normalizePathForProcessing(relative(packageDir, fullPath));
|
|
43
|
+
// Layer 1: static exclusions (always enforced)
|
|
44
|
+
if (isExcludedFromPackage(relativePath)) {
|
|
45
|
+
logger.debug(`Skipping static-excluded path: ${relativePath}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Layer 2: manifest-based include/exclude
|
|
49
|
+
if (!manifestFilter(relativePath)) {
|
|
50
|
+
logger.debug(`Skipping path by manifest filter: ${relativePath}`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const content = await readTextFile(fullPath);
|
|
54
|
+
files.push({ path: relativePath, content, encoding: 'utf8' });
|
|
55
|
+
}
|
|
56
|
+
return files;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a filter function from the package.yml include/exclude fields.
|
|
60
|
+
* Returns a pass-all filter if no manifest or no patterns are defined.
|
|
61
|
+
*/
|
|
62
|
+
async function loadManifestFilter(packageDir) {
|
|
63
|
+
const manifestInfo = await findPackageManifest(packageDir);
|
|
64
|
+
let manifestConfigInclude;
|
|
65
|
+
let manifestConfigExclude;
|
|
66
|
+
if (manifestInfo) {
|
|
67
|
+
try {
|
|
68
|
+
const config = await parsePackageYml(manifestInfo.fullPath);
|
|
69
|
+
manifestConfigInclude = config.include;
|
|
70
|
+
manifestConfigExclude = config.exclude;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
logger.warn(`Failed to load manifest filters from ${manifestInfo.fullPath}: ${String(error)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const defaults = await buildDefaultIncludeConfig(packageDir, manifestInfo);
|
|
77
|
+
const includePatterns = [
|
|
78
|
+
...defaults.includePatterns,
|
|
79
|
+
...(manifestConfigInclude ?? [])
|
|
80
|
+
];
|
|
81
|
+
const excludePatterns = manifestConfigExclude ?? [];
|
|
82
|
+
const baseFilter = createPackageFileFilter({
|
|
83
|
+
include: includePatterns,
|
|
84
|
+
exclude: excludePatterns
|
|
85
|
+
});
|
|
86
|
+
return (relativePath) => {
|
|
87
|
+
const normalized = normalizePathForProcessing(relativePath);
|
|
88
|
+
if (!normalized) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (defaults.hardIncludeFiles.has(normalized)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return baseFilter(relativePath);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async function findPackageManifest(packageDir) {
|
|
98
|
+
for (const relativePath of MANIFEST_RELATIVE_PATHS) {
|
|
99
|
+
const fullPath = join(packageDir, relativePath);
|
|
100
|
+
if (await exists(fullPath)) {
|
|
101
|
+
return { fullPath, relativePath };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
async function buildDefaultIncludeConfig(packageDir, manifestInfo) {
|
|
107
|
+
const includePatterns = new Set();
|
|
108
|
+
const hardIncludeFiles = new Set();
|
|
109
|
+
// Include package.yml (at .openpackage/package.yml relative to package root)
|
|
110
|
+
includePatterns.add(PACKAGE_PATHS.MANIFEST_RELATIVE);
|
|
111
|
+
hardIncludeFiles.add(normalizePathForProcessing(PACKAGE_PATHS.MANIFEST_RELATIVE));
|
|
112
|
+
if (manifestInfo) {
|
|
113
|
+
includePatterns.add(manifestInfo.relativePath);
|
|
114
|
+
hardIncludeFiles.add(normalizePathForProcessing(manifestInfo.relativePath));
|
|
115
|
+
}
|
|
116
|
+
const rootFiles = new Set([FILE_PATTERNS.AGENTS_MD]);
|
|
117
|
+
const universalSubdirs = new Set();
|
|
118
|
+
for (const platform of getAllPlatforms({ includeDisabled: true })) {
|
|
119
|
+
const definition = getPlatformDefinition(platform);
|
|
120
|
+
if (definition.rootFile) {
|
|
121
|
+
rootFiles.add(definition.rootFile);
|
|
122
|
+
}
|
|
123
|
+
for (const subdirKey of Object.keys(definition.subdirs ?? {})) {
|
|
124
|
+
universalSubdirs.add(subdirKey);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const rootFile of rootFiles) {
|
|
128
|
+
includePatterns.add(rootFile);
|
|
129
|
+
}
|
|
130
|
+
// packageDir is the package root, so look for subdirs at packageDir/.openpackage/<subdir>/
|
|
131
|
+
await Promise.all(Array.from(universalSubdirs).map(async (subdirName) => {
|
|
132
|
+
const absoluteDir = join(packageDir, DIR_PATTERNS.OPENPACKAGE, subdirName);
|
|
133
|
+
if (await exists(absoluteDir)) {
|
|
134
|
+
includePatterns.add(`${DIR_PATTERNS.OPENPACKAGE}/${subdirName}/**`);
|
|
135
|
+
}
|
|
136
|
+
}));
|
|
137
|
+
return {
|
|
138
|
+
includePatterns: Array.from(includePatterns),
|
|
139
|
+
hardIncludeFiles
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Write package files to a directory, syncing its contents.
|
|
144
|
+
*
|
|
145
|
+
* - Creates the target directory if it doesn't exist.
|
|
146
|
+
* - Removes files that are no longer part of the payload (except protected paths).
|
|
147
|
+
* - Writes all incoming files, creating subdirectories as needed.
|
|
148
|
+
*
|
|
149
|
+
* @param targetDir - Absolute path to the destination directory.
|
|
150
|
+
* @param files - Array of PackageFile entries to write.
|
|
151
|
+
* @param options - Optional settings (e.g., preserveIndexFile).
|
|
152
|
+
*/
|
|
153
|
+
export async function writePackageFilesToDirectory(targetDir, files, options = {}) {
|
|
154
|
+
await ensureDir(targetDir);
|
|
155
|
+
// Build the set of paths that should remain after the write
|
|
156
|
+
const pathsToKeep = new Set(files.map(f => normalizePathForProcessing(f.path)));
|
|
157
|
+
if (options.preserveIndexFile) {
|
|
158
|
+
pathsToKeep.add(FILE_PATTERNS.PACKAGE_INDEX_YML);
|
|
159
|
+
}
|
|
160
|
+
// Remove stale files (but never touch protected paths like packages/**)
|
|
161
|
+
await removeStaleFiles(targetDir, pathsToKeep);
|
|
162
|
+
// Write all incoming files in parallel
|
|
163
|
+
await Promise.all(files.map(file => writeFile(targetDir, file)));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Remove files in targetDir that are not in pathsToKeep and are not protected.
|
|
167
|
+
*/
|
|
168
|
+
async function removeStaleFiles(targetDir, pathsToKeep) {
|
|
169
|
+
if (!(await exists(targetDir))) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
for await (const fullPath of walkFiles(targetDir)) {
|
|
173
|
+
const relPath = normalizePathForProcessing(relative(targetDir, fullPath));
|
|
174
|
+
// Skip files we want to keep
|
|
175
|
+
if (pathsToKeep.has(relPath)) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
// Never delete protected paths (e.g., packages/**)
|
|
179
|
+
if (isExcludedFromPackage(relPath)) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
await remove(fullPath);
|
|
184
|
+
logger.debug(`Removed stale file: ${relPath}`);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
logger.warn(`Failed to remove stale file ${relPath}: ${error}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Write a single PackageFile to disk under targetDir.
|
|
193
|
+
*/
|
|
194
|
+
async function writeFile(targetDir, file) {
|
|
195
|
+
const targetPath = join(targetDir, file.path);
|
|
196
|
+
await ensureDir(dirname(targetPath));
|
|
197
|
+
await writeTextFile(targetPath, file.content, file.encoding ?? 'utf8');
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=package-copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-copy.js","sourceRoot":"","sources":["../../src/utils/package-copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { normalizePathForProcessing } from './path-normalization.js';
|
|
2
|
+
import { DIR_PATTERNS, FILE_PATTERNS, OPENPACKAGE_DIRS } from '../constants/index.js';
|
|
3
|
+
const EXCLUDED_DIR_PREFIXES = [
|
|
4
|
+
'packages', // Nested packages are independent units; never copy inline
|
|
5
|
+
`${DIR_PATTERNS.OPENPACKAGE}/${OPENPACKAGE_DIRS.PACKAGES}` // Current nested package layout under .openpackage/
|
|
6
|
+
];
|
|
7
|
+
const EXCLUDED_FILES = new Set([FILE_PATTERNS.PACKAGE_INDEX_YML]);
|
|
8
|
+
const MATCH_ALL = () => true;
|
|
9
|
+
const SPECIAL_REGEX_CHARS = /[\\^$+?.()|[\]{}]/g;
|
|
10
|
+
function escapeRegexCharacter(segment) {
|
|
11
|
+
return segment.replace(SPECIAL_REGEX_CHARS, '\\$&');
|
|
12
|
+
}
|
|
13
|
+
function normalizePattern(rawPattern) {
|
|
14
|
+
if (typeof rawPattern !== 'string') {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
let pattern = rawPattern.trim();
|
|
18
|
+
if (pattern.length === 0) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
pattern = pattern.replace(/\\/g, '/');
|
|
22
|
+
pattern = pattern.replace(/^\.\/+/, '');
|
|
23
|
+
pattern = pattern.replace(/^\/+/, '');
|
|
24
|
+
pattern = pattern.replace(/\/+/g, '/');
|
|
25
|
+
if (pattern.length === 0) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
if (pattern.endsWith('/')) {
|
|
29
|
+
pattern = `${pattern}**`;
|
|
30
|
+
}
|
|
31
|
+
return pattern;
|
|
32
|
+
}
|
|
33
|
+
function globToRegExp(pattern) {
|
|
34
|
+
let regex = '^';
|
|
35
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
36
|
+
const char = pattern[i];
|
|
37
|
+
if (char === '*') {
|
|
38
|
+
const nextChar = pattern[i + 1];
|
|
39
|
+
if (nextChar === '*') {
|
|
40
|
+
const slashChar = pattern[i + 2];
|
|
41
|
+
if (slashChar === '/') {
|
|
42
|
+
regex += '(?:.*/)?';
|
|
43
|
+
i += 2;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
regex += '.*';
|
|
47
|
+
i += 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
regex += '[^/]*';
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (char === '?') {
|
|
56
|
+
regex += '[^/]';
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
regex += escapeRegexCharacter(char);
|
|
60
|
+
}
|
|
61
|
+
regex += '$';
|
|
62
|
+
return new RegExp(regex);
|
|
63
|
+
}
|
|
64
|
+
function compilePatterns(patterns) {
|
|
65
|
+
if (!patterns) {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
const compiled = [];
|
|
69
|
+
for (const rawPattern of patterns) {
|
|
70
|
+
const normalized = normalizePattern(rawPattern);
|
|
71
|
+
if (!normalized) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
compiled.push(globToRegExp(normalized));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Skip invalid patterns to avoid blocking save/pack flows.
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return compiled;
|
|
82
|
+
}
|
|
83
|
+
function matches(path, patterns) {
|
|
84
|
+
return patterns.some(pattern => pattern.test(path));
|
|
85
|
+
}
|
|
86
|
+
export function isExcludedFromPackage(relativePath) {
|
|
87
|
+
const normalized = normalizePathForProcessing(relativePath);
|
|
88
|
+
if (!normalized) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
const baseName = normalized.split('/').pop();
|
|
92
|
+
if (baseName && EXCLUDED_FILES.has(baseName)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return EXCLUDED_DIR_PREFIXES.some(prefix => {
|
|
96
|
+
const normalizedPrefix = normalizePathForProcessing(prefix);
|
|
97
|
+
return (normalized === normalizedPrefix ||
|
|
98
|
+
normalized.startsWith(`${normalizedPrefix}/`));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
export function createPackageFileFilter(config) {
|
|
102
|
+
if (!config) {
|
|
103
|
+
return MATCH_ALL;
|
|
104
|
+
}
|
|
105
|
+
const includePatterns = compilePatterns(config.include);
|
|
106
|
+
const excludePatterns = compilePatterns(config.exclude);
|
|
107
|
+
const hasInclude = includePatterns.length > 0;
|
|
108
|
+
if (!hasInclude && excludePatterns.length === 0) {
|
|
109
|
+
return MATCH_ALL;
|
|
110
|
+
}
|
|
111
|
+
return (relativePath) => {
|
|
112
|
+
const normalized = normalizePathForProcessing(relativePath);
|
|
113
|
+
if (!normalized) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
if (hasInclude && !matches(normalized, includePatterns)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (excludePatterns.length > 0 && matches(normalized, excludePatterns)) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=package-filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-filters.js","sourceRoot":"","sources":["../../src/utils/package-filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,MAAM,qBAAqB,GAAG;IAC5B,UAAU,EAAE,2DAA2D;IACvE,GAAG,YAAY,CAAC,WAAW,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,oDAAoD;CAChH,CAAC;AAEF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAS1E,MAAM,SAAS,GAAe,GAAG,EAAE,CAAC,IAAI,CAAC;AACzC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAEjD,SAAS,oBAAoB,CAAC,OAAe;IAC3C,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,GAAG,OAAO,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACrB,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;oBACtB,KAAK,IAAI,UAAU,CAAC;oBACpB,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,KAAK,IAAI,IAAI,CAAC;oBACd,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,OAAO,CAAC;YACnB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,MAAM,CAAC;YAChB,SAAS;QACX,CAAC;QAED,KAAK,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,IAAI,GAAG,CAAC;IACb,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,eAAe,CAAC,QAAmB;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,UAAU,IAAI,QAAQ,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,QAAkB;IAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB;IACxD,MAAM,UAAU,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAC7C,IAAI,QAAQ,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QACzC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAC5D,OAAO,CACL,UAAU,KAAK,gBAAgB;YAC/B,UAAU,CAAC,UAAU,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA4B;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,YAAoB,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,UAAU,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|