opkg 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -186
- package/assets/openpackage_ascii_dark.png +0 -0
- package/assets/openpackage_ascii_light.png +0 -0
- package/dist/commands/add.js +34 -10
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/apply.js +16 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/delete.js +1 -1
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/install.js +177 -8
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.js +2 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/new.js +125 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/pack.js +7 -13
- package/dist/commands/pack.js.map +1 -1
- package/dist/commands/pull.js +1 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +1 -1
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/remove.js +63 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/save.js +11 -17
- package/dist/commands/save.js.map +1 -1
- package/dist/commands/set.js +33 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/show.js +16 -94
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/status.js +26 -701
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/uninstall.js +14 -427
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/constants/index.js +72 -16
- package/dist/constants/index.js.map +1 -1
- package/dist/core/add/add-conflict-handler.js +1 -8
- package/dist/core/add/add-conflict-handler.js.map +1 -1
- package/dist/core/add/add-pipeline.js +12 -10
- package/dist/core/add/add-pipeline.js.map +1 -1
- package/dist/core/add/add-to-source-pipeline.js +123 -0
- package/dist/core/add/add-to-source-pipeline.js.map +1 -0
- package/dist/core/add/package-index-updater.js +77 -78
- package/dist/core/add/package-index-updater.js.map +1 -1
- package/dist/core/add/platform-path-transformer.js +6 -4
- package/dist/core/add/platform-path-transformer.js.map +1 -1
- package/dist/core/add/source-collector.js +2 -3
- package/dist/core/add/source-collector.js.map +1 -1
- package/dist/core/apply/apply-pipeline.js +110 -0
- package/dist/core/apply/apply-pipeline.js.map +1 -0
- package/dist/core/dependency-resolver.js +263 -21
- package/dist/core/dependency-resolver.js.map +1 -1
- package/dist/core/discovery/file-discovery.js +1 -2
- package/dist/core/discovery/file-discovery.js.map +1 -1
- package/dist/core/discovery/platform-files-discovery.js +33 -18
- package/dist/core/discovery/platform-files-discovery.js.map +1 -1
- package/dist/core/flows/flow-executor.js +974 -0
- package/dist/core/flows/flow-executor.js.map +1 -0
- package/dist/core/flows/flow-inverter.js +442 -0
- package/dist/core/flows/flow-inverter.js.map +1 -0
- package/dist/core/flows/flow-key-extractor.js +101 -0
- package/dist/core/flows/flow-key-extractor.js.map +1 -0
- package/dist/core/flows/flow-key-mapper.js +382 -0
- package/dist/core/flows/flow-key-mapper.js.map +1 -0
- package/dist/core/flows/flow-transforms.js +632 -0
- package/dist/core/flows/flow-transforms.js.map +1 -0
- package/dist/core/flows/map-pipeline/context.js +73 -0
- package/dist/core/flows/map-pipeline/context.js.map +1 -0
- package/dist/core/flows/map-pipeline/index.js +156 -0
- package/dist/core/flows/map-pipeline/index.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/copy.js +104 -0
- package/dist/core/flows/map-pipeline/operations/copy.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/pipe.js +70 -0
- package/dist/core/flows/map-pipeline/operations/pipe.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/rename.js +102 -0
- package/dist/core/flows/map-pipeline/operations/rename.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/set.js +50 -0
- package/dist/core/flows/map-pipeline/operations/set.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/switch.js +79 -0
- package/dist/core/flows/map-pipeline/operations/switch.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/transform.js +543 -0
- package/dist/core/flows/map-pipeline/operations/transform.js.map +1 -0
- package/dist/core/flows/map-pipeline/operations/unset.js +65 -0
- package/dist/core/flows/map-pipeline/operations/unset.js.map +1 -0
- package/dist/core/flows/map-pipeline/types.js +8 -0
- package/dist/core/flows/map-pipeline/types.js.map +1 -0
- package/dist/core/flows/map-pipeline/utils.js +278 -0
- package/dist/core/flows/map-pipeline/utils.js.map +1 -0
- package/dist/core/flows/platform-converter.js +328 -0
- package/dist/core/flows/platform-converter.js.map +1 -0
- package/dist/core/flows/source-resolver.js +192 -0
- package/dist/core/flows/source-resolver.js.map +1 -0
- package/dist/core/flows/toml-domain-transforms.js +23 -0
- package/dist/core/flows/toml-domain-transforms.js.map +1 -0
- package/dist/core/install/bulk-install-pipeline.js +68 -7
- package/dist/core/install/bulk-install-pipeline.js.map +1 -1
- package/dist/core/install/canonical-plan.js +3 -3
- package/dist/core/install/canonical-plan.js.map +1 -1
- package/dist/core/install/dry-run.js +3 -3
- package/dist/core/install/dry-run.js.map +1 -1
- package/dist/core/install/flow-based-installer.js +1158 -0
- package/dist/core/install/flow-based-installer.js.map +1 -0
- package/dist/core/install/flow-workspace-tracker.js +111 -0
- package/dist/core/install/flow-workspace-tracker.js.map +1 -0
- package/dist/core/install/format-detector.js +228 -0
- package/dist/core/install/format-detector.js.map +1 -0
- package/dist/core/install/git-package-loader.js +20 -0
- package/dist/core/install/git-package-loader.js.map +1 -0
- package/dist/core/install/install-errors.js +1 -1
- package/dist/core/install/install-errors.js.map +1 -1
- package/dist/core/install/install-flow.js +34 -14
- package/dist/core/install/install-flow.js.map +1 -1
- package/dist/core/install/install-pipeline.js +52 -17
- package/dist/core/install/install-pipeline.js.map +1 -1
- package/dist/core/install/install-reporting.js +26 -8
- package/dist/core/install/install-reporting.js.map +1 -1
- package/dist/core/install/local-source-resolution.js +103 -0
- package/dist/core/install/local-source-resolution.js.map +1 -0
- package/dist/core/install/marketplace-handler.js +221 -0
- package/dist/core/install/marketplace-handler.js.map +1 -0
- package/dist/core/install/path-install-pipeline.js +241 -0
- package/dist/core/install/path-install-pipeline.js.map +1 -0
- package/dist/core/install/path-package-loader.js +116 -0
- package/dist/core/install/path-package-loader.js.map +1 -0
- package/dist/core/install/plugin-detector.js +72 -0
- package/dist/core/install/plugin-detector.js.map +1 -0
- package/dist/core/install/plugin-to-universal-converter.js +218 -0
- package/dist/core/install/plugin-to-universal-converter.js.map +1 -0
- package/dist/core/install/plugin-transformer.js +191 -0
- package/dist/core/install/plugin-transformer.js.map +1 -0
- package/dist/core/install/version-selection.js +1 -1
- package/dist/core/install/version-selection.js.map +1 -1
- package/dist/core/openpackage.js +40 -22
- package/dist/core/openpackage.js.map +1 -1
- package/dist/core/pack/pack-output.js +62 -0
- package/dist/core/pack/pack-output.js.map +1 -0
- package/dist/core/pack/pack-pipeline.js +186 -0
- package/dist/core/pack/pack-pipeline.js.map +1 -0
- package/dist/core/package-context.js +45 -70
- package/dist/core/package-context.js.map +1 -1
- package/dist/core/package-creation.js +203 -0
- package/dist/core/package-creation.js.map +1 -0
- package/dist/core/package.js +20 -6
- package/dist/core/package.js.map +1 -1
- package/dist/core/platforms.js +665 -209
- package/dist/core/platforms.js.map +1 -1
- package/dist/core/push/push-context.js +1 -1
- package/dist/core/push/push-context.js.map +1 -1
- package/dist/core/push/push-upload.js +2 -2
- package/dist/core/push/push-upload.js.map +1 -1
- package/dist/core/registry.js +6 -6
- package/dist/core/registry.js.map +1 -1
- package/dist/core/remote-pull.js +2 -2
- package/dist/core/remote-pull.js.map +1 -1
- package/dist/core/remove/removal-collector.js +52 -0
- package/dist/core/remove/removal-collector.js.map +1 -0
- package/dist/core/remove/removal-confirmation.js +39 -0
- package/dist/core/remove/removal-confirmation.js.map +1 -0
- package/dist/core/remove/remove-from-source-pipeline.js +173 -0
- package/dist/core/remove/remove-from-source-pipeline.js.map +1 -0
- package/dist/core/save/constants.js +3 -3
- package/dist/core/save/constants.js.map +1 -1
- package/dist/core/save/flow-based-saver.js +270 -0
- package/dist/core/save/flow-based-saver.js.map +1 -0
- package/dist/core/save/name-resolution.js +1 -1
- package/dist/core/save/name-resolution.js.map +1 -1
- package/dist/core/save/package-yml-generator.js +4 -5
- package/dist/core/save/package-yml-generator.js.map +1 -1
- package/dist/core/save/save-candidate-builder.js +215 -0
- package/dist/core/save/save-candidate-builder.js.map +1 -0
- package/dist/core/save/save-candidate-loader.js +12 -11
- package/dist/core/save/save-candidate-loader.js.map +1 -1
- package/dist/core/save/save-conflict-analyzer.js +150 -0
- package/dist/core/save/save-conflict-analyzer.js.map +1 -0
- package/dist/core/save/save-conflict-resolution.js +28 -14
- package/dist/core/save/save-conflict-resolution.js.map +1 -1
- package/dist/core/save/save-conflict-resolver.js +31 -275
- package/dist/core/save/save-conflict-resolver.js.map +1 -1
- package/dist/core/save/save-group-builder.js +52 -0
- package/dist/core/save/save-group-builder.js.map +1 -0
- package/dist/core/save/save-interactive-resolver.js +190 -0
- package/dist/core/save/save-interactive-resolver.js.map +1 -0
- package/dist/core/save/save-pipeline.js +58 -34
- package/dist/core/save/save-pipeline.js.map +1 -1
- package/dist/core/save/save-platform-handler.js +53 -0
- package/dist/core/save/save-platform-handler.js.map +1 -0
- package/dist/core/save/save-resolution-executor.js +145 -0
- package/dist/core/save/save-resolution-executor.js.map +1 -0
- package/dist/core/save/save-result-reporter.js +167 -0
- package/dist/core/save/save-result-reporter.js.map +1 -0
- package/dist/core/save/save-to-source-pipeline.js +154 -0
- package/dist/core/save/save-to-source-pipeline.js.map +1 -0
- package/dist/core/save/save-versioning.js +4 -4
- package/dist/core/save/save-versioning.js.map +1 -1
- package/dist/core/save/save-write-coordinator.js +204 -0
- package/dist/core/save/save-write-coordinator.js.map +1 -0
- package/dist/core/save/save-yml-resolution.js +28 -216
- package/dist/core/save/save-yml-resolution.js.map +1 -1
- package/dist/core/save/workspace-rename.js +7 -8
- package/dist/core/save/workspace-rename.js.map +1 -1
- package/dist/core/set/set-output.js +72 -0
- package/dist/core/set/set-output.js.map +1 -0
- package/dist/core/set/set-pipeline.js +361 -0
- package/dist/core/set/set-pipeline.js.map +1 -0
- package/dist/core/set/set-types.js +5 -0
- package/dist/core/set/set-types.js.map +1 -0
- package/dist/core/show/package-resolver.js +257 -0
- package/dist/core/show/package-resolver.js.map +1 -0
- package/dist/core/show/scope-discovery.js +165 -0
- package/dist/core/show/scope-discovery.js.map +1 -0
- package/dist/core/show/show-output.js +168 -0
- package/dist/core/show/show-output.js.map +1 -0
- package/dist/core/show/show-pipeline.js +113 -0
- package/dist/core/show/show-pipeline.js.map +1 -0
- package/dist/core/show/show-types.js +5 -0
- package/dist/core/show/show-types.js.map +1 -0
- package/dist/core/source-resolution/dependency-graph.js +104 -0
- package/dist/core/source-resolution/dependency-graph.js.map +1 -0
- package/dist/core/source-resolution/resolve-mutable-source.js +109 -0
- package/dist/core/source-resolution/resolve-mutable-source.js.map +1 -0
- package/dist/core/source-resolution/resolve-package-source.js +29 -0
- package/dist/core/source-resolution/resolve-package-source.js.map +1 -0
- package/dist/core/source-resolution/resolve-registry-version.js +35 -0
- package/dist/core/source-resolution/resolve-registry-version.js.map +1 -0
- package/dist/core/source-resolution/types.js.map +1 -0
- package/dist/core/status/status-file-discovery.js +23 -12
- package/dist/core/status/status-file-discovery.js.map +1 -1
- package/dist/core/status/status-pipeline.js +134 -0
- package/dist/core/status/status-pipeline.js.map +1 -0
- package/dist/core/sync/platform-sync-summary.js +27 -0
- package/dist/core/sync/platform-sync-summary.js.map +1 -0
- package/dist/core/uninstall/flow-aware-uninstaller.js +189 -0
- package/dist/core/uninstall/flow-aware-uninstaller.js.map +1 -0
- package/dist/core/uninstall/uninstall-file-discovery.js +11 -6
- package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
- package/dist/core/uninstall/uninstall-pipeline.js +141 -0
- package/dist/core/uninstall/uninstall-pipeline.js.map +1 -0
- package/dist/core/universal-patterns.js +64 -0
- package/dist/core/universal-patterns.js.map +1 -0
- package/dist/index.js +99 -6
- package/dist/index.js.map +1 -1
- package/dist/types/flows.js +8 -0
- package/dist/types/flows.js.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/platform-flows.js +8 -0
- package/dist/types/platform-flows.js.map +1 -0
- package/dist/types/workspace-index.js +6 -0
- package/dist/types/workspace-index.js.map +1 -0
- package/dist/utils/custom-path-resolution.js +160 -0
- package/dist/utils/custom-path-resolution.js.map +1 -0
- package/dist/utils/dependency-coverage.js +1 -1
- package/dist/utils/dependency-coverage.js.map +1 -1
- package/dist/utils/file-processing.js +1 -1
- package/dist/utils/flow-index-installer.js +209 -0
- package/dist/utils/flow-index-installer.js.map +1 -0
- package/dist/utils/formatters.js +47 -1
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/fs.js +17 -0
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/git-clone-registry.js +88 -0
- package/dist/utils/git-clone-registry.js.map +1 -0
- package/dist/utils/git-clone.js +69 -0
- package/dist/utils/git-clone.js.map +1 -0
- package/dist/utils/git-spec.js +96 -0
- package/dist/utils/git-spec.js.map +1 -0
- package/dist/utils/http-client.js +7 -0
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/index-based-installer.js +356 -163
- package/dist/utils/index-based-installer.js.map +1 -1
- package/dist/utils/install-conflict-handler.js +2 -2
- package/dist/utils/install-conflict-handler.js.map +1 -1
- package/dist/utils/install-file-discovery.js +18 -13
- package/dist/utils/install-file-discovery.js.map +1 -1
- package/dist/utils/install-helpers.js +43 -20
- package/dist/utils/install-helpers.js.map +1 -1
- package/dist/utils/jsonc.js +23 -1
- package/dist/utils/jsonc.js.map +1 -1
- package/dist/utils/manifest-paths.js +1 -1
- package/dist/utils/manifest-paths.js.map +1 -1
- package/dist/utils/markdown-frontmatter.js +46 -0
- package/dist/utils/markdown-frontmatter.js.map +1 -1
- package/dist/utils/package-copy.js +5 -103
- package/dist/utils/package-copy.js.map +1 -1
- package/dist/utils/package-filters.js +9 -105
- package/dist/utils/package-filters.js.map +1 -1
- package/dist/utils/package-index-yml.js +27 -6
- package/dist/utils/package-index-yml.js.map +1 -1
- package/dist/utils/package-input.js +98 -0
- package/dist/utils/package-input.js.map +1 -0
- package/dist/utils/package-management.js +80 -28
- package/dist/utils/package-management.js.map +1 -1
- package/dist/utils/package-name-resolution.js +327 -0
- package/dist/utils/package-name-resolution.js.map +1 -0
- package/dist/utils/package-name.js +18 -16
- package/dist/utils/package-name.js.map +1 -1
- package/dist/utils/package-versioning.js +2 -33
- package/dist/utils/package-versioning.js.map +1 -1
- package/dist/utils/package-yml.js +19 -28
- package/dist/utils/package-yml.js.map +1 -1
- package/dist/utils/path-resolution.js +102 -0
- package/dist/utils/path-resolution.js.map +1 -0
- package/dist/utils/paths.js +6 -6
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/platform-file.js +36 -24
- package/dist/utils/platform-file.js.map +1 -1
- package/dist/utils/platform-mapper.js +222 -68
- package/dist/utils/platform-mapper.js.map +1 -1
- package/dist/utils/platform-root-files.js +44 -0
- package/dist/utils/platform-root-files.js.map +1 -0
- package/dist/utils/platform-utils.js +35 -54
- package/dist/utils/platform-utils.js.map +1 -1
- package/dist/utils/platform-yaml-merge.js +20 -140
- package/dist/utils/platform-yaml-merge.js.map +1 -1
- package/dist/utils/prompts.js +92 -7
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/registry-entry-filter.js +50 -27
- package/dist/utils/registry-entry-filter.js.map +1 -1
- package/dist/utils/registry-paths.js +5 -4
- package/dist/utils/registry-paths.js.map +1 -1
- package/dist/utils/scope-resolution.js +156 -0
- package/dist/utils/scope-resolution.js.map +1 -0
- package/dist/utils/source-mutability.js +15 -0
- package/dist/utils/source-mutability.js.map +1 -0
- package/dist/utils/tarball.js +29 -4
- package/dist/utils/tarball.js.map +1 -1
- package/dist/utils/version-ranges.js +1 -32
- package/dist/utils/version-ranges.js.map +1 -1
- package/dist/utils/workspace-index-helpers.js +28 -0
- package/dist/utils/workspace-index-helpers.js.map +1 -0
- package/dist/utils/workspace-index-ownership.js +100 -0
- package/dist/utils/workspace-index-ownership.js.map +1 -0
- package/dist/utils/workspace-index-yml.js +173 -0
- package/dist/utils/workspace-index-yml.js.map +1 -0
- package/examples/custom-subdirs-platform.jsonc +157 -0
- package/package.json +7 -2
- package/platforms.jsonc +531 -84
- package/schemas/map-pipeline-v1.json +256 -0
- package/schemas/platforms-v1.json +400 -0
- package/specs/README.md +88 -0
- package/specs/add/README.md +166 -0
- package/specs/agents-claude.md +570 -0
- package/specs/agents-opencode.md +622 -0
- package/specs/apply/README.md +21 -0
- package/specs/apply/apply-behavior.md +58 -0
- package/specs/apply/apply-command.md +51 -0
- package/specs/apply/conflicts.md +41 -0
- package/specs/apply/index-effects.md +81 -0
- package/specs/architecture.md +107 -0
- package/specs/auth/README.md +17 -0
- package/specs/auth/auth-http-contract.md +25 -0
- package/specs/auth/cli/credentials.md +39 -0
- package/specs/auth/cli/login.md +32 -0
- package/specs/auth/cli/logout.md +16 -0
- package/specs/claude-mcp.md +1065 -0
- package/specs/claude-plugins-marketplace.md +363 -0
- package/specs/claude-plugins.md +413 -0
- package/specs/cli-options.md +52 -0
- package/specs/codex-mcp.md +114 -0
- package/specs/commands-overview.md +175 -0
- package/specs/directory-layout.md +95 -0
- package/specs/install/README.md +12 -4
- package/specs/install/git-sources.md +230 -0
- package/specs/install/install-behavior.md +483 -73
- package/specs/install/package-yml-canonical.md +67 -35
- package/specs/install/version-resolution.md +69 -115
- package/specs/new/README.md +769 -0
- package/specs/new/SUMMARY.md +310 -0
- package/specs/new/scope-behavior.md +793 -0
- package/specs/pack/README.md +77 -0
- package/specs/pack/package-name-resolution.md +330 -0
- package/specs/package/README.md +18 -17
- package/specs/package/nested-packages-and-parent-packages.md +32 -31
- package/specs/package/package-index-yml.md +95 -101
- package/specs/package/package-root-layout.md +64 -46
- package/specs/package/registry-payload-and-copy.md +50 -44
- package/specs/package/universal-content.md +33 -56
- package/specs/package-sources.md +248 -0
- package/specs/platforms/README.md +52 -0
- package/specs/platforms/configuration.md +571 -0
- package/specs/platforms/detection.md +552 -0
- package/specs/platforms/directory-layout.md +599 -0
- package/specs/platforms/examples.md +1146 -0
- package/specs/platforms/flow-reference.md +1240 -0
- package/specs/platforms/flows.md +1488 -0
- package/specs/platforms/map-pipeline.md +801 -0
- package/specs/platforms/overview.md +349 -0
- package/specs/platforms/specification.md +700 -0
- package/specs/platforms/troubleshooting.md +697 -0
- package/specs/platforms/universal-converter.md +520 -0
- package/specs/push/README.md +1 -0
- package/specs/push/push-behavior.md +11 -3
- package/specs/push/push-remote-upload.md +1 -1
- package/specs/push/push-scoping.md +1 -1
- package/specs/push/push-version-selection.md +1 -1
- package/specs/registry.md +111 -0
- package/specs/remove/README.md +257 -0
- package/specs/save/README.md +21 -17
- package/specs/save/save-conflict-resolution.md +205 -83
- package/specs/save/save-file-discovery.md +6 -4
- package/specs/save/save-frontmatter-overrides.md +11 -15
- package/specs/save/save-modes-inputs.md +9 -39
- package/specs/save/save-naming-scoping.md +4 -4
- package/specs/save/save-package-detection.md +13 -13
- package/specs/save/save-registry-sync.md +16 -106
- package/specs/save/save-versioning.md +80 -0
- package/specs/scope-management.md +92 -0
- package/specs/set/README.md +520 -0
- package/specs/set/set-behavior.md +563 -0
- package/specs/show/README.md +483 -0
- package/specs/show/show-remote.md +494 -0
- package/specs/status/README.md +38 -0
- package/specs/uninstall/README.md +231 -0
- package/dist/commands/duplicate.js +0 -69
- package/dist/commands/duplicate.js.map +0 -1
- package/dist/commands/init.js +0 -117
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/prune.js +0 -357
- package/dist/commands/prune.js.map +0 -1
- package/dist/commands/tui.js +0 -61
- package/dist/commands/tui.js.map +0 -1
- package/dist/core/install/index.js +0 -3
- package/dist/core/install/index.js.map +0 -1
- package/dist/core/push/push-single-file.js +0 -56
- package/dist/core/push/push-single-file.js.map +0 -1
- package/dist/core/save/package-detection.js +0 -147
- package/dist/core/save/package-detection.js.map +0 -1
- package/dist/core/save/save-single-file.js +0 -124
- package/dist/core/save/save-single-file.js.map +0 -1
- package/dist/core/token-store.js +0 -73
- package/dist/core/token-store.js.map +0 -1
- package/dist/tui/app.js +0 -95
- package/dist/tui/app.js.map +0 -1
- package/dist/tui/components/package-list.js +0 -73
- package/dist/tui/components/package-list.js.map +0 -1
- package/dist/tui/controller.js +0 -365
- package/dist/tui/controller.js.map +0 -1
- package/dist/tui/index.js +0 -12
- package/dist/tui/index.js.map +0 -1
- package/dist/tui/services/file-index.js +0 -64
- package/dist/tui/services/file-index.js.map +0 -1
- package/dist/tui/services/packages.js +0 -18
- package/dist/tui/services/packages.js.map +0 -1
- package/dist/tui/services/save.js +0 -21
- package/dist/tui/services/save.js.map +0 -1
- package/dist/tui/state/app-state.js +0 -15
- package/dist/tui/state/app-state.js.map +0 -1
- package/dist/tui/state.js +0 -17
- package/dist/tui/state.js.map +0 -1
- package/dist/tui/types.js.map +0 -1
- package/dist/tui/views/add-file-modal.js +0 -129
- package/dist/tui/views/add-file-modal.js.map +0 -1
- package/dist/tui/views/file-preview.js +0 -44
- package/dist/tui/views/file-preview.js.map +0 -1
- package/dist/tui/views/list-packages.js +0 -73
- package/dist/tui/views/list-packages.js.map +0 -1
- package/dist/tui/views/main-menu.js +0 -29
- package/dist/tui/views/main-menu.js.map +0 -1
- package/dist/tui/views/manage-view.js +0 -81
- package/dist/tui/views/manage-view.js.map +0 -1
- package/dist/tui/views/package-hub.js +0 -120
- package/dist/tui/views/package-hub.js.map +0 -1
- package/dist/tui/views/placeholder.js +0 -24
- package/dist/tui/views/placeholder.js.map +0 -1
- package/dist/utils/bun-bootstrap.js +0 -72
- package/dist/utils/bun-bootstrap.js.map +0 -1
- package/dist/utils/entity-id.js +0 -19
- package/dist/utils/entity-id.js.map +0 -1
- package/dist/utils/package-local-files.js +0 -5
- package/dist/utils/package-local-files.js.map +0 -1
- package/dist/utils/path-matching.js +0 -74
- package/dist/utils/path-matching.js.map +0 -1
- package/dist/utils/root-file-operations.js +0 -39
- package/dist/utils/root-file-operations.js.map +0 -1
- package/dist/utils/root-file-transformer.js +0 -27
- package/dist/utils/root-file-transformer.js.map +0 -1
- package/dist/utils/yaml-frontmatter.js +0 -25
- package/dist/utils/yaml-frontmatter.js.map +0 -1
- package/specs/auth/auth-device-flow.md +0 -70
- package/specs/login/login-device-flow.md +0 -70
- package/specs/platforms.md +0 -193
- package/specs/save-pack-versioning.md +0 -224
- package/specs/save-pack.md +0 -68
- /package/dist/{tui → core/source-resolution}/types.js +0 -0
|
@@ -0,0 +1,1146 @@
|
|
|
1
|
+
# Platform Examples
|
|
2
|
+
|
|
3
|
+
Practical examples and common patterns for platform flows.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Zero Configuration Installation
|
|
8
|
+
|
|
9
|
+
Built-in flows work out of the box:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Install package - flows execute automatically
|
|
13
|
+
opkg install @username/cursor-rules
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**What happens:**
|
|
17
|
+
1. CLI detects platforms (`.cursor`, `.claude`, etc.)
|
|
18
|
+
2. Loads built-in flow configurations
|
|
19
|
+
3. Transforms universal content to platform-specific formats
|
|
20
|
+
4. Writes files to workspace
|
|
21
|
+
|
|
22
|
+
**No configuration needed** for standard use cases.
|
|
23
|
+
|
|
24
|
+
## Simple Patterns
|
|
25
|
+
|
|
26
|
+
### Pattern 1: File Copy with Extension Change (Recursive)
|
|
27
|
+
|
|
28
|
+
```jsonc
|
|
29
|
+
{
|
|
30
|
+
"cursor": {
|
|
31
|
+
"flows": [
|
|
32
|
+
{
|
|
33
|
+
"from": "rules/**/*.md",
|
|
34
|
+
"to": ".cursor/rules/**/*.mdc"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Package content:**
|
|
42
|
+
```
|
|
43
|
+
rules/
|
|
44
|
+
├── typescript.md
|
|
45
|
+
├── python.md
|
|
46
|
+
└── advanced/
|
|
47
|
+
├── generics.md
|
|
48
|
+
└── types/
|
|
49
|
+
└── unions.md
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Result in workspace:**
|
|
53
|
+
```
|
|
54
|
+
.cursor/rules/
|
|
55
|
+
├── typescript.mdc
|
|
56
|
+
├── python.mdc
|
|
57
|
+
└── advanced/
|
|
58
|
+
├── generics.mdc
|
|
59
|
+
└── types/
|
|
60
|
+
└── unions.mdc
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Key features:**
|
|
64
|
+
- `**` recursively matches all subdirectories
|
|
65
|
+
- Directory structure is preserved
|
|
66
|
+
- Extension mapping applies to all files
|
|
67
|
+
|
|
68
|
+
### Pattern 2: Format Conversion
|
|
69
|
+
|
|
70
|
+
```jsonc
|
|
71
|
+
{
|
|
72
|
+
"cursor": {
|
|
73
|
+
"flows": [
|
|
74
|
+
{
|
|
75
|
+
"from": "config.yaml",
|
|
76
|
+
"to": ".cursor/config.json"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Package: config.yaml**
|
|
84
|
+
```yaml
|
|
85
|
+
theme: dark
|
|
86
|
+
fontSize: 14
|
|
87
|
+
tabSize: 2
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Workspace: .cursor/config.json**
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"theme": "dark",
|
|
94
|
+
"fontSize": 14,
|
|
95
|
+
"tabSize": 2
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Pattern 3: Copy All Files Recursively (Mixed Types)
|
|
100
|
+
|
|
101
|
+
```jsonc
|
|
102
|
+
{
|
|
103
|
+
"claude": {
|
|
104
|
+
"flows": [
|
|
105
|
+
{
|
|
106
|
+
"from": "skills/**/*",
|
|
107
|
+
"to": ".claude/skills/**/*"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Package content:**
|
|
115
|
+
```
|
|
116
|
+
skills/
|
|
117
|
+
├── code-review/
|
|
118
|
+
│ ├── analyze.md
|
|
119
|
+
│ ├── config.json
|
|
120
|
+
│ └── helpers/
|
|
121
|
+
│ ├── utils.ts
|
|
122
|
+
│ └── types.d.ts
|
|
123
|
+
└── testing/
|
|
124
|
+
├── test-gen.md
|
|
125
|
+
└── coverage.json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Result in workspace:**
|
|
129
|
+
```
|
|
130
|
+
.claude/skills/
|
|
131
|
+
├── code-review/
|
|
132
|
+
│ ├── analyze.md
|
|
133
|
+
│ ├── config.json
|
|
134
|
+
│ └── helpers/
|
|
135
|
+
│ ├── utils.ts
|
|
136
|
+
│ └── types.d.ts
|
|
137
|
+
└── testing/
|
|
138
|
+
├── test-gen.md
|
|
139
|
+
└── coverage.json
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Key features:**
|
|
143
|
+
- `**/*` matches all file types
|
|
144
|
+
- Complete directory structure preserved
|
|
145
|
+
- No extension mapping (copies as-is)
|
|
146
|
+
|
|
147
|
+
### Pattern 4: Simple Key Remapping
|
|
148
|
+
|
|
149
|
+
```jsonc
|
|
150
|
+
{
|
|
151
|
+
"cursor": {
|
|
152
|
+
"flows": [
|
|
153
|
+
{
|
|
154
|
+
"from": "settings.jsonc",
|
|
155
|
+
"to": ".cursor/settings.json",
|
|
156
|
+
"map": {
|
|
157
|
+
"theme": "workbench.colorTheme",
|
|
158
|
+
"fontSize": "editor.fontSize"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Package: settings.jsonc**
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"theme": "dark",
|
|
170
|
+
"fontSize": 14
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Workspace: .cursor/settings.json**
|
|
175
|
+
```json
|
|
176
|
+
{
|
|
177
|
+
"workbench": {
|
|
178
|
+
"colorTheme": "dark"
|
|
179
|
+
},
|
|
180
|
+
"editor": {
|
|
181
|
+
"fontSize": 14
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Multi-Package Composition
|
|
187
|
+
|
|
188
|
+
### Pattern 5: Merge Multiple Packages
|
|
189
|
+
|
|
190
|
+
**Setup:**
|
|
191
|
+
```jsonc
|
|
192
|
+
{
|
|
193
|
+
"cursor": {
|
|
194
|
+
"flows": [
|
|
195
|
+
{
|
|
196
|
+
"from": "mcp.jsonc",
|
|
197
|
+
"to": ".cursor/mcp.json",
|
|
198
|
+
"merge": "deep"
|
|
199
|
+
}
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Package A: mcp.jsonc**
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"servers": {
|
|
209
|
+
"database": {
|
|
210
|
+
"command": "mcp-db",
|
|
211
|
+
"args": ["--port", "5432"]
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Package B: mcp.jsonc**
|
|
218
|
+
```json
|
|
219
|
+
{
|
|
220
|
+
"servers": {
|
|
221
|
+
"api": {
|
|
222
|
+
"command": "mcp-api",
|
|
223
|
+
"args": ["--host", "localhost"]
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Result: .cursor/mcp.json**
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"servers": {
|
|
233
|
+
"database": {
|
|
234
|
+
"command": "mcp-db",
|
|
235
|
+
"args": ["--port", "5432"]
|
|
236
|
+
},
|
|
237
|
+
"api": {
|
|
238
|
+
"command": "mcp-api",
|
|
239
|
+
"args": ["--host", "localhost"]
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Pattern 6: Namespace Isolation
|
|
246
|
+
|
|
247
|
+
**Setup:**
|
|
248
|
+
```jsonc
|
|
249
|
+
{
|
|
250
|
+
"cursor": {
|
|
251
|
+
"flows": [
|
|
252
|
+
{
|
|
253
|
+
"from": "mcp.jsonc",
|
|
254
|
+
"to": ".cursor/mcp.json",
|
|
255
|
+
"namespace": true,
|
|
256
|
+
"merge": "deep"
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**Package A (@user/db-tools): mcp.jsonc**
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"servers": {
|
|
267
|
+
"db": { "command": "mcp-db" }
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Package B (@user/api-tools): mcp.jsonc**
|
|
273
|
+
```json
|
|
274
|
+
{
|
|
275
|
+
"servers": {
|
|
276
|
+
"api": { "command": "mcp-api" }
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Result: .cursor/mcp.json**
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"packages": {
|
|
285
|
+
"@user/db-tools": {
|
|
286
|
+
"servers": {
|
|
287
|
+
"db": { "command": "mcp-db" }
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"@user/api-tools": {
|
|
291
|
+
"servers": {
|
|
292
|
+
"api": { "command": "mcp-api" }
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
### Pattern 7: Composite Merge for Root Files
|
|
301
|
+
|
|
302
|
+
**Setup:**
|
|
303
|
+
```jsonc
|
|
304
|
+
{
|
|
305
|
+
"global": {
|
|
306
|
+
"flows": [
|
|
307
|
+
{
|
|
308
|
+
"from": "AGENTS.md",
|
|
309
|
+
"to": "AGENTS.md",
|
|
310
|
+
"when": { "exists": "AGENTS.md" },
|
|
311
|
+
"merge": "composite"
|
|
312
|
+
}
|
|
313
|
+
]
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Package A (@user/db-tools): AGENTS.md**
|
|
319
|
+
```markdown
|
|
320
|
+
# Database Tools
|
|
321
|
+
|
|
322
|
+
Use these tools for database management.
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
**Package B (@user/api-tools): AGENTS.md**
|
|
326
|
+
```markdown
|
|
327
|
+
# API Tools
|
|
328
|
+
|
|
329
|
+
Use these tools for API development.
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**Result: AGENTS.md**
|
|
333
|
+
```markdown
|
|
334
|
+
<!-- package: @user/db-tools -->
|
|
335
|
+
# Database Tools
|
|
336
|
+
|
|
337
|
+
Use these tools for database management.
|
|
338
|
+
<!-- -->
|
|
339
|
+
|
|
340
|
+
<!-- package: @user/api-tools -->
|
|
341
|
+
# API Tools
|
|
342
|
+
|
|
343
|
+
Use these tools for API development.
|
|
344
|
+
<!-- -->
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Update Package A:**
|
|
348
|
+
```markdown
|
|
349
|
+
# Database Tools - Updated
|
|
350
|
+
|
|
351
|
+
Enhanced database management tools with new features.
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**Result after update: AGENTS.md**
|
|
355
|
+
```markdown
|
|
356
|
+
<!-- package: @user/db-tools -->
|
|
357
|
+
# Database Tools - Updated
|
|
358
|
+
|
|
359
|
+
Enhanced database management tools with new features.
|
|
360
|
+
<!-- -->
|
|
361
|
+
|
|
362
|
+
<!-- package: @user/api-tools -->
|
|
363
|
+
# API Tools
|
|
364
|
+
|
|
365
|
+
Use these tools for API development.
|
|
366
|
+
<!-- -->
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Key benefit:** Each package maintains its own section. Updates don't overwrite other packages.
|
|
370
|
+
|
|
371
|
+
## Advanced Transformations
|
|
372
|
+
|
|
373
|
+
### Pattern 8: Markdown Frontmatter Transform
|
|
374
|
+
|
|
375
|
+
```jsonc
|
|
376
|
+
{
|
|
377
|
+
"claude": {
|
|
378
|
+
"flows": [
|
|
379
|
+
{
|
|
380
|
+
"from": "agents/*.md",
|
|
381
|
+
"to": ".claude/agents/*.md",
|
|
382
|
+
"map": {
|
|
383
|
+
"role": "type",
|
|
384
|
+
"model": {
|
|
385
|
+
"values": {
|
|
386
|
+
"anthropic/claude-sonnet-4.5": "claude-sonnet-4.5",
|
|
387
|
+
"openai/gpt-4": "gpt-4"
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
]
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Package: agents/reviewer.md**
|
|
398
|
+
```markdown
|
|
399
|
+
---
|
|
400
|
+
role: assistant
|
|
401
|
+
model: anthropic/claude-sonnet-4.5
|
|
402
|
+
temperature: 0.7
|
|
403
|
+
---
|
|
404
|
+
# Code Reviewer
|
|
405
|
+
|
|
406
|
+
Help review code for quality and security.
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Workspace: .claude/agents/reviewer.md**
|
|
410
|
+
```markdown
|
|
411
|
+
---
|
|
412
|
+
type: assistant
|
|
413
|
+
model: claude-sonnet-4.5
|
|
414
|
+
temperature: 0.7
|
|
415
|
+
---
|
|
416
|
+
# Code Reviewer
|
|
417
|
+
|
|
418
|
+
Help review code for quality and security.
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
**Note:** Body unchanged, only frontmatter transformed.
|
|
422
|
+
|
|
423
|
+
### Pattern 9: Content Embedding
|
|
424
|
+
|
|
425
|
+
```jsonc
|
|
426
|
+
{
|
|
427
|
+
"opencode": {
|
|
428
|
+
"flows": [
|
|
429
|
+
{
|
|
430
|
+
"from": "mcp.jsonc",
|
|
431
|
+
"to": ".opencode/opencode.json",
|
|
432
|
+
"embed": "mcp",
|
|
433
|
+
"merge": "deep"
|
|
434
|
+
}
|
|
435
|
+
]
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Package: mcp.jsonc**
|
|
441
|
+
```json
|
|
442
|
+
{
|
|
443
|
+
"servers": {
|
|
444
|
+
"db": { "command": "mcp-db" }
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
**Workspace: .opencode/opencode.json (existing)**
|
|
450
|
+
```json
|
|
451
|
+
{
|
|
452
|
+
"version": "1.0",
|
|
453
|
+
"other": "config"
|
|
454
|
+
}
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**Result: .opencode/opencode.json**
|
|
458
|
+
```json
|
|
459
|
+
{
|
|
460
|
+
"version": "1.0",
|
|
461
|
+
"other": "config",
|
|
462
|
+
"mcp": {
|
|
463
|
+
"servers": {
|
|
464
|
+
"db": { "command": "mcp-db" }
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### Pattern 10: TOML Sections
|
|
471
|
+
|
|
472
|
+
```jsonc
|
|
473
|
+
{
|
|
474
|
+
"codex": {
|
|
475
|
+
"flows": [
|
|
476
|
+
{
|
|
477
|
+
"from": "mcp.jsonc",
|
|
478
|
+
"to": ".codex/config.toml",
|
|
479
|
+
"path": "$.servers",
|
|
480
|
+
"section": "mcp_servers",
|
|
481
|
+
"merge": "deep"
|
|
482
|
+
}
|
|
483
|
+
]
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**Package: mcp.jsonc**
|
|
489
|
+
```json
|
|
490
|
+
{
|
|
491
|
+
"servers": {
|
|
492
|
+
"db": {
|
|
493
|
+
"command": "mcp-db",
|
|
494
|
+
"args": ["--port", "5432"]
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
**Workspace: .codex/config.toml**
|
|
501
|
+
```toml
|
|
502
|
+
[general]
|
|
503
|
+
version = "1.0"
|
|
504
|
+
|
|
505
|
+
[mcp_servers.db]
|
|
506
|
+
command = "mcp-db"
|
|
507
|
+
args = ["--port", "5432"]
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### Pattern 11: Multi-Target with Different Formats
|
|
511
|
+
|
|
512
|
+
```jsonc
|
|
513
|
+
{
|
|
514
|
+
"from": "mcp.jsonc",
|
|
515
|
+
"to": {
|
|
516
|
+
".cursor/mcp.json": {
|
|
517
|
+
"namespace": true,
|
|
518
|
+
"merge": "deep"
|
|
519
|
+
},
|
|
520
|
+
".opencode/opencode.json": {
|
|
521
|
+
"embed": "mcp",
|
|
522
|
+
"merge": "deep"
|
|
523
|
+
},
|
|
524
|
+
".codex/config.toml": {
|
|
525
|
+
"path": "$.servers",
|
|
526
|
+
"section": "mcp_servers",
|
|
527
|
+
"merge": "deep"
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**Single source file** → **Three different formats/structures**
|
|
534
|
+
|
|
535
|
+
## Conditional Flows
|
|
536
|
+
|
|
537
|
+
### Pattern 12: Platform-Specific Flow
|
|
538
|
+
|
|
539
|
+
```jsonc
|
|
540
|
+
{
|
|
541
|
+
"cursor": {
|
|
542
|
+
"flows": [
|
|
543
|
+
{
|
|
544
|
+
"from": "cursor-specific.jsonc",
|
|
545
|
+
"to": ".cursor/config.json",
|
|
546
|
+
"when": { "platform": "cursor" }
|
|
547
|
+
}
|
|
548
|
+
]
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
Executes only when Cursor is detected.
|
|
554
|
+
|
|
555
|
+
### Pattern 13: Development vs Production
|
|
556
|
+
|
|
557
|
+
```jsonc
|
|
558
|
+
{
|
|
559
|
+
"cursor": {
|
|
560
|
+
"flows": [
|
|
561
|
+
{
|
|
562
|
+
"from": "config-dev.yaml",
|
|
563
|
+
"to": ".cursor/config.json",
|
|
564
|
+
"when": {
|
|
565
|
+
"key": "env",
|
|
566
|
+
"equals": "development"
|
|
567
|
+
}
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"from": "config-prod.yaml",
|
|
571
|
+
"to": ".cursor/config.json",
|
|
572
|
+
"when": {
|
|
573
|
+
"key": "env",
|
|
574
|
+
"equals": "production"
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
]
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
### Pattern 14: Multi-Platform Conditional
|
|
583
|
+
|
|
584
|
+
```jsonc
|
|
585
|
+
{
|
|
586
|
+
"flows": [
|
|
587
|
+
{
|
|
588
|
+
"from": "shared-config.yaml",
|
|
589
|
+
"to": ".ai/config.json",
|
|
590
|
+
"when": {
|
|
591
|
+
"or": [
|
|
592
|
+
{ "platform": "cursor" },
|
|
593
|
+
{ "platform": "claude" },
|
|
594
|
+
{ "platform": "windsurf" }
|
|
595
|
+
]
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
Executes if **any** of the platforms are detected.
|
|
603
|
+
|
|
604
|
+
## Complete Platform Configurations
|
|
605
|
+
|
|
606
|
+
### Example 1: Cursor Configuration
|
|
607
|
+
|
|
608
|
+
```jsonc
|
|
609
|
+
{
|
|
610
|
+
"cursor": {
|
|
611
|
+
"name": "Cursor",
|
|
612
|
+
"rootDir": ".cursor",
|
|
613
|
+
"rootFile": "AGENTS.md",
|
|
614
|
+
"aliases": ["cursorcli"],
|
|
615
|
+
"flows": [
|
|
616
|
+
// Rules with extension change (recursive)
|
|
617
|
+
{
|
|
618
|
+
"from": "rules/**/*.md",
|
|
619
|
+
"to": ".cursor/rules/**/*.mdc"
|
|
620
|
+
},
|
|
621
|
+
|
|
622
|
+
// Commands (recursive, no extension change)
|
|
623
|
+
{
|
|
624
|
+
"from": "commands/**/*.md",
|
|
625
|
+
"to": ".cursor/commands/**/*.md"
|
|
626
|
+
},
|
|
627
|
+
|
|
628
|
+
// MCP with namespacing
|
|
629
|
+
{
|
|
630
|
+
"from": "mcp.jsonc",
|
|
631
|
+
"to": ".cursor/mcp.json",
|
|
632
|
+
"pipe": ["filter-comments"],
|
|
633
|
+
"merge": "deep"
|
|
634
|
+
}
|
|
635
|
+
]
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
### Example 2: Claude Configuration
|
|
641
|
+
|
|
642
|
+
```jsonc
|
|
643
|
+
{
|
|
644
|
+
"claude": {
|
|
645
|
+
"name": "Claude Code",
|
|
646
|
+
"rootDir": ".claude",
|
|
647
|
+
"rootFile": "CLAUDE.md",
|
|
648
|
+
"aliases": ["claudecode"],
|
|
649
|
+
"flows": [
|
|
650
|
+
// Root file with composite merge
|
|
651
|
+
{
|
|
652
|
+
"from": "AGENTS.md",
|
|
653
|
+
"to": "CLAUDE.md",
|
|
654
|
+
"merge": "composite"
|
|
655
|
+
},
|
|
656
|
+
|
|
657
|
+
// Rules (recursive)
|
|
658
|
+
{
|
|
659
|
+
"from": "rules/**/*.md",
|
|
660
|
+
"to": ".claude/rules/**/*.md"
|
|
661
|
+
},
|
|
662
|
+
|
|
663
|
+
// Commands (recursive)
|
|
664
|
+
{
|
|
665
|
+
"from": "commands/**/*.md",
|
|
666
|
+
"to": ".claude/commands/**/*.md"
|
|
667
|
+
},
|
|
668
|
+
|
|
669
|
+
// Agents (recursive)
|
|
670
|
+
{
|
|
671
|
+
"from": "agents/**/*.md",
|
|
672
|
+
"to": ".claude/agents/**/*.md"
|
|
673
|
+
},
|
|
674
|
+
|
|
675
|
+
// Skills (all files, recursive)
|
|
676
|
+
{
|
|
677
|
+
"from": "skills/**/*",
|
|
678
|
+
"to": ".claude/skills/**/*"
|
|
679
|
+
}
|
|
680
|
+
]
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
### Example 3: Multi-Platform Package
|
|
686
|
+
|
|
687
|
+
```jsonc
|
|
688
|
+
{
|
|
689
|
+
"global": {
|
|
690
|
+
"flows": [
|
|
691
|
+
// Universal root file with composite merge
|
|
692
|
+
{
|
|
693
|
+
"from": "AGENTS.md",
|
|
694
|
+
"to": "AGENTS.md",
|
|
695
|
+
"when": { "exists": "AGENTS.md" },
|
|
696
|
+
"merge": "composite"
|
|
697
|
+
}
|
|
698
|
+
]
|
|
699
|
+
},
|
|
700
|
+
|
|
701
|
+
"cursor": {
|
|
702
|
+
"name": "Cursor",
|
|
703
|
+
"rootDir": ".cursor",
|
|
704
|
+
"rootFile": "AGENTS.md",
|
|
705
|
+
"flows": [
|
|
706
|
+
// Recursive rules with extension change
|
|
707
|
+
{ "from": "rules/**/*.md", "to": ".cursor/rules/**/*.mdc" },
|
|
708
|
+
// MCP config
|
|
709
|
+
{
|
|
710
|
+
"from": "mcp.jsonc",
|
|
711
|
+
"to": ".cursor/mcp.json",
|
|
712
|
+
"pipe": ["filter-comments"],
|
|
713
|
+
"merge": "deep"
|
|
714
|
+
}
|
|
715
|
+
]
|
|
716
|
+
},
|
|
717
|
+
|
|
718
|
+
"claude": {
|
|
719
|
+
"name": "Claude Code",
|
|
720
|
+
"rootDir": ".claude",
|
|
721
|
+
"rootFile": "CLAUDE.md",
|
|
722
|
+
"flows": [
|
|
723
|
+
{ "from": "AGENTS.md", "to": "CLAUDE.md", "merge": "composite" },
|
|
724
|
+
{ "from": "rules/**/*.md", "to": ".claude/rules/**/*.md" },
|
|
725
|
+
{ "from": "agents/**/*.md", "to": ".claude/agents/**/*.md" },
|
|
726
|
+
{ "from": "skills/**/*", "to": ".claude/skills/**/*" }
|
|
727
|
+
]
|
|
728
|
+
},
|
|
729
|
+
|
|
730
|
+
"windsurf": {
|
|
731
|
+
"name": "Windsurf",
|
|
732
|
+
"rootDir": ".windsurf",
|
|
733
|
+
"flows": [
|
|
734
|
+
{ "from": "rules/**/*.md", "to": ".windsurf/rules/**/*.md" }
|
|
735
|
+
]
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
## Custom Platform Examples
|
|
741
|
+
|
|
742
|
+
### Example 4: Add Custom Platform
|
|
743
|
+
|
|
744
|
+
```jsonc
|
|
745
|
+
// workspace/.openpackage/platforms.jsonc
|
|
746
|
+
{
|
|
747
|
+
"my-ai-platform": {
|
|
748
|
+
"name": "My AI Platform",
|
|
749
|
+
"rootDir": ".myai",
|
|
750
|
+
"rootFile": "MYAI.md",
|
|
751
|
+
"flows": [
|
|
752
|
+
// Root file with composite merge
|
|
753
|
+
{
|
|
754
|
+
"from": "AGENTS.md",
|
|
755
|
+
"to": "MYAI.md",
|
|
756
|
+
"merge": "composite"
|
|
757
|
+
},
|
|
758
|
+
|
|
759
|
+
// Rules → prompts (recursive)
|
|
760
|
+
{
|
|
761
|
+
"from": "rules/**/*.md",
|
|
762
|
+
"to": ".myai/prompts/**/*.md"
|
|
763
|
+
},
|
|
764
|
+
|
|
765
|
+
// Agents → assistants with format conversion (recursive)
|
|
766
|
+
{
|
|
767
|
+
"from": "agents/**/*.md",
|
|
768
|
+
"to": ".myai/assistants/**/*.yaml"
|
|
769
|
+
},
|
|
770
|
+
|
|
771
|
+
// Skills → all files (recursive)
|
|
772
|
+
{
|
|
773
|
+
"from": "skills/**/*",
|
|
774
|
+
"to": ".myai/skills/**/*"
|
|
775
|
+
},
|
|
776
|
+
|
|
777
|
+
// Config with custom structure
|
|
778
|
+
{
|
|
779
|
+
"from": "mcp.jsonc",
|
|
780
|
+
"to": ".myai/config/mcp.yaml",
|
|
781
|
+
"path": "$.servers",
|
|
782
|
+
"merge": "deep"
|
|
783
|
+
}
|
|
784
|
+
]
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
### Example 5: Override Built-in Platform
|
|
790
|
+
|
|
791
|
+
```jsonc
|
|
792
|
+
// workspace/.openpackage/platforms.jsonc
|
|
793
|
+
{
|
|
794
|
+
"cursor": {
|
|
795
|
+
"flows": [
|
|
796
|
+
// Custom directory structure (recursive)
|
|
797
|
+
{
|
|
798
|
+
"from": "rules/**/*.md",
|
|
799
|
+
"to": ".cursor/custom-rules/**/*.mdc"
|
|
800
|
+
},
|
|
801
|
+
|
|
802
|
+
// Additional transform (recursive)
|
|
803
|
+
{
|
|
804
|
+
"from": "custom/**/*.jsonc",
|
|
805
|
+
"to": ".cursor/custom/**/*.json",
|
|
806
|
+
"pick": ["public"],
|
|
807
|
+
"merge": "deep"
|
|
808
|
+
}
|
|
809
|
+
]
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
### Example 6: Disable Platforms
|
|
815
|
+
|
|
816
|
+
```jsonc
|
|
817
|
+
// workspace/.openpackage/platforms.jsonc
|
|
818
|
+
{
|
|
819
|
+
// Disable unused platforms for performance
|
|
820
|
+
"windsurf": { "enabled": false },
|
|
821
|
+
"cline": { "enabled": false },
|
|
822
|
+
"roo-code": { "enabled": false },
|
|
823
|
+
"void": { "enabled": false }
|
|
824
|
+
}
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
## Testing and Validation
|
|
828
|
+
|
|
829
|
+
### Test with Dry-Run
|
|
830
|
+
|
|
831
|
+
```bash
|
|
832
|
+
# Preview what would happen
|
|
833
|
+
opkg install @user/package --dry-run
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
**Output:**
|
|
837
|
+
```
|
|
838
|
+
Would create:
|
|
839
|
+
.cursor/rules/typescript.mdc
|
|
840
|
+
.cursor/rules/python.mdc
|
|
841
|
+
.cursor/mcp.json (merged)
|
|
842
|
+
|
|
843
|
+
Would skip:
|
|
844
|
+
.windsurf/ (not detected)
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
### Validate Configuration
|
|
848
|
+
|
|
849
|
+
```bash
|
|
850
|
+
# Check configuration validity
|
|
851
|
+
opkg validate platforms --strict
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
**Output:**
|
|
855
|
+
```
|
|
856
|
+
✓ Configuration valid
|
|
857
|
+
✓ All flows valid
|
|
858
|
+
✓ All transforms found
|
|
859
|
+
✓ No circular dependencies
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
### Debug Flow Execution
|
|
863
|
+
|
|
864
|
+
```bash
|
|
865
|
+
# Enable debug logging
|
|
866
|
+
DEBUG=opkg:flows opkg install @user/package
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
**Output:**
|
|
870
|
+
```
|
|
871
|
+
[flows] Executing flow: rules/**/*.md → .cursor/rules/**/*.mdc
|
|
872
|
+
[flows] Matched: rules/typescript.md
|
|
873
|
+
[flows] Transform: extension .md → .mdc
|
|
874
|
+
[flows] Write: .cursor/rules/typescript.mdc
|
|
875
|
+
[flows] Matched: rules/advanced/generics.md
|
|
876
|
+
[flows] Transform: extension .md → .mdc
|
|
877
|
+
[flows] Write: .cursor/rules/advanced/generics.mdc
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
## Common Use Cases
|
|
881
|
+
|
|
882
|
+
### Use Case 1: Company-Wide Standards
|
|
883
|
+
|
|
884
|
+
**Global override for all projects:**
|
|
885
|
+
|
|
886
|
+
```jsonc
|
|
887
|
+
// ~/.openpackage/platforms.jsonc
|
|
888
|
+
{
|
|
889
|
+
"cursor": {
|
|
890
|
+
"flows": [
|
|
891
|
+
{
|
|
892
|
+
"from": "rules/*.md",
|
|
893
|
+
"to": ".cursor/company-rules/*.mdc"
|
|
894
|
+
}
|
|
895
|
+
]
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
### Use Case 2: Monorepo Setup
|
|
901
|
+
|
|
902
|
+
**Workspace-specific paths:**
|
|
903
|
+
|
|
904
|
+
```jsonc
|
|
905
|
+
// monorepo/.openpackage/platforms.jsonc
|
|
906
|
+
{
|
|
907
|
+
"cursor": {
|
|
908
|
+
"rootDir": ".cursor-workspace",
|
|
909
|
+
"flows": [
|
|
910
|
+
{
|
|
911
|
+
"from": "rules/*.md",
|
|
912
|
+
"to": ".cursor-workspace/shared-rules/*.mdc"
|
|
913
|
+
}
|
|
914
|
+
]
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
```
|
|
918
|
+
|
|
919
|
+
### Use Case 3: Development vs Production
|
|
920
|
+
|
|
921
|
+
**Environment-specific configs:**
|
|
922
|
+
|
|
923
|
+
```jsonc
|
|
924
|
+
{
|
|
925
|
+
"cursor": {
|
|
926
|
+
"flows": [
|
|
927
|
+
{
|
|
928
|
+
"from": "config.dev.yaml",
|
|
929
|
+
"to": ".cursor/config.json",
|
|
930
|
+
"when": { "key": "env", "equals": "development" },
|
|
931
|
+
"merge": "deep"
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
"from": "config.prod.yaml",
|
|
935
|
+
"to": ".cursor/config.json",
|
|
936
|
+
"when": { "key": "env", "equals": "production" },
|
|
937
|
+
"merge": "replace"
|
|
938
|
+
}
|
|
939
|
+
]
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
### Use Case 4: Plugin System
|
|
945
|
+
|
|
946
|
+
**Compose plugins from multiple packages:**
|
|
947
|
+
|
|
948
|
+
```jsonc
|
|
949
|
+
{
|
|
950
|
+
"cursor": {
|
|
951
|
+
"flows": [
|
|
952
|
+
{
|
|
953
|
+
"from": "plugin.jsonc",
|
|
954
|
+
"to": ".cursor/plugins.json",
|
|
955
|
+
"namespace": true,
|
|
956
|
+
"merge": "deep"
|
|
957
|
+
}
|
|
958
|
+
]
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
```
|
|
962
|
+
|
|
963
|
+
**Result:**
|
|
964
|
+
```json
|
|
965
|
+
{
|
|
966
|
+
"packages": {
|
|
967
|
+
"@user/plugin-a": { /* plugin A config */ },
|
|
968
|
+
"@user/plugin-b": { /* plugin B config */ },
|
|
969
|
+
"@user/plugin-c": { /* plugin C config */ }
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
```
|
|
973
|
+
|
|
974
|
+
## Cross-Platform Conversion Examples
|
|
975
|
+
|
|
976
|
+
**New in:** Commit `a3fdb9f2a846fa8c183bca851812c491aaf5b8e9`
|
|
977
|
+
|
|
978
|
+
The **Universal Platform Converter** enables installing platform-specific packages to any platform.
|
|
979
|
+
|
|
980
|
+
### Example 1: Install Claude Plugin to Claude (Direct AS-IS)
|
|
981
|
+
|
|
982
|
+
```bash
|
|
983
|
+
opkg install github:user/claude-plugin --platforms claude
|
|
984
|
+
```
|
|
985
|
+
|
|
986
|
+
**Source format:** Claude-specific (`.claude/` directories)
|
|
987
|
+
**Target platform:** claude
|
|
988
|
+
**Strategy:** Direct installation (no conversion)
|
|
989
|
+
|
|
990
|
+
**Console output:**
|
|
991
|
+
```
|
|
992
|
+
🔌 Detected Claude Code plugin
|
|
993
|
+
📦 Installing plugin: my-plugin@1.0.0
|
|
994
|
+
✓ Installing my-plugin AS-IS for claude platform (matching format)
|
|
995
|
+
✓ Added files: 5
|
|
996
|
+
├── .claude/commands/review.md
|
|
997
|
+
├── .claude/commands/test.md
|
|
998
|
+
└── ...
|
|
999
|
+
```
|
|
1000
|
+
|
|
1001
|
+
**Why AS-IS:** Source and target platforms match, so no transformation is needed. This is the fastest and most compatible installation method.
|
|
1002
|
+
|
|
1003
|
+
### Example 2: Install Claude Plugin to Cursor (Cross-Platform)
|
|
1004
|
+
|
|
1005
|
+
```bash
|
|
1006
|
+
opkg install github:user/claude-plugin --platforms cursor
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
**Source format:** Claude-specific (`.claude/` directories)
|
|
1010
|
+
**Target platform:** cursor
|
|
1011
|
+
**Strategy:** Convert via universal
|
|
1012
|
+
|
|
1013
|
+
**Conversion pipeline:**
|
|
1014
|
+
1. **Detect format:** Identifies Claude platform-specific structure
|
|
1015
|
+
2. **Invert Claude flows:** `.claude/commands/*.md` → `commands/*.md`
|
|
1016
|
+
3. **Apply Cursor flows:** `commands/*.md` → `.cursor/commands/*.md`
|
|
1017
|
+
|
|
1018
|
+
**Console output:**
|
|
1019
|
+
```
|
|
1020
|
+
🔌 Detected Claude Code plugin
|
|
1021
|
+
📦 Installing plugin: my-plugin@1.0.0
|
|
1022
|
+
🔄 Converting my-plugin from claude to cursor format
|
|
1023
|
+
✓ Conversion stage: platform-to-universal (5 files)
|
|
1024
|
+
✓ Applying cursor platform flows
|
|
1025
|
+
✓ Added files: 5
|
|
1026
|
+
├── .cursor/commands/review.md
|
|
1027
|
+
├── .cursor/commands/test.md
|
|
1028
|
+
└── ...
|
|
1029
|
+
```
|
|
1030
|
+
|
|
1031
|
+
### Example 3: Install to Multiple Platforms (Mixed Strategies)
|
|
1032
|
+
|
|
1033
|
+
```bash
|
|
1034
|
+
opkg install github:user/claude-plugin --platforms claude,cursor,opencode
|
|
1035
|
+
```
|
|
1036
|
+
|
|
1037
|
+
**Result:** Plugin installed to all three platforms with appropriate strategies:
|
|
1038
|
+
- **claude:** Direct AS-IS installation
|
|
1039
|
+
- **cursor:** Converted from Claude format
|
|
1040
|
+
- **opencode:** Converted from Claude format
|
|
1041
|
+
|
|
1042
|
+
**Console output:**
|
|
1043
|
+
```
|
|
1044
|
+
🔌 Detected Claude Code plugin
|
|
1045
|
+
📦 Installing plugin: my-plugin@1.0.0
|
|
1046
|
+
✓ Installing AS-IS for claude platform (matching format)
|
|
1047
|
+
🔄 Converting to cursor format
|
|
1048
|
+
🔄 Converting to opencode format
|
|
1049
|
+
✓ Added 15 files across 3 platforms
|
|
1050
|
+
```
|
|
1051
|
+
|
|
1052
|
+
### Example 4: Universal Package to All Platforms
|
|
1053
|
+
|
|
1054
|
+
```bash
|
|
1055
|
+
opkg install @user/universal-rules --platforms cursor,claude,opencode
|
|
1056
|
+
```
|
|
1057
|
+
|
|
1058
|
+
**Source format:** Universal (standard `commands/`, `agents/` structure)
|
|
1059
|
+
**Strategy:** Standard flow-based installation (existing behavior)
|
|
1060
|
+
|
|
1061
|
+
**No conversion needed** - universal packages work with the standard flow system.
|
|
1062
|
+
|
|
1063
|
+
### How It Works
|
|
1064
|
+
|
|
1065
|
+
The converter uses **flow inversion** to reverse platform transformations:
|
|
1066
|
+
|
|
1067
|
+
**Original Claude flow:**
|
|
1068
|
+
```jsonc
|
|
1069
|
+
{
|
|
1070
|
+
"from": "commands/**/*.md",
|
|
1071
|
+
"to": ".claude/commands/**/*.md"
|
|
1072
|
+
}
|
|
1073
|
+
```
|
|
1074
|
+
|
|
1075
|
+
**Automatically inverted for conversion:**
|
|
1076
|
+
```jsonc
|
|
1077
|
+
{
|
|
1078
|
+
"from": ".claude/commands/**/*.md",
|
|
1079
|
+
"to": "commands/**/*.md"
|
|
1080
|
+
}
|
|
1081
|
+
```
|
|
1082
|
+
|
|
1083
|
+
This inverted flow converts Claude-specific files back to universal format, which can then be transformed to any target platform.
|
|
1084
|
+
|
|
1085
|
+
**See:** [Universal Converter](./universal-converter.md) for complete technical details.
|
|
1086
|
+
|
|
1087
|
+
## Best Practices
|
|
1088
|
+
|
|
1089
|
+
### 1. Start Simple
|
|
1090
|
+
|
|
1091
|
+
Begin with basic flows:
|
|
1092
|
+
```jsonc
|
|
1093
|
+
{
|
|
1094
|
+
"from": "rules/*.md",
|
|
1095
|
+
"to": ".cursor/rules/*.md"
|
|
1096
|
+
}
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
Add complexity as needed.
|
|
1100
|
+
|
|
1101
|
+
### 2. Use Merge for Composition
|
|
1102
|
+
|
|
1103
|
+
Enable multi-package workflows:
|
|
1104
|
+
```jsonc
|
|
1105
|
+
{
|
|
1106
|
+
"merge": "deep"
|
|
1107
|
+
}
|
|
1108
|
+
```
|
|
1109
|
+
|
|
1110
|
+
### 3. Namespace for Safety
|
|
1111
|
+
|
|
1112
|
+
Prevent conflicts:
|
|
1113
|
+
```jsonc
|
|
1114
|
+
{
|
|
1115
|
+
"namespace": true,
|
|
1116
|
+
"merge": "deep"
|
|
1117
|
+
}
|
|
1118
|
+
```
|
|
1119
|
+
|
|
1120
|
+
### 4. Test Incrementally
|
|
1121
|
+
|
|
1122
|
+
Test each flow individually:
|
|
1123
|
+
```bash
|
|
1124
|
+
opkg install @user/package --dry-run
|
|
1125
|
+
```
|
|
1126
|
+
|
|
1127
|
+
### 5. Document Custom Flows
|
|
1128
|
+
|
|
1129
|
+
Add comments explaining intent:
|
|
1130
|
+
```jsonc
|
|
1131
|
+
{
|
|
1132
|
+
// Transform MCP config for multi-package composition
|
|
1133
|
+
"from": "mcp.jsonc",
|
|
1134
|
+
"to": ".cursor/mcp.json",
|
|
1135
|
+
"namespace": true,
|
|
1136
|
+
"merge": "deep"
|
|
1137
|
+
}
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
## Next Steps
|
|
1141
|
+
|
|
1142
|
+
- **Learn flow syntax:** [Flows](./flows.md)
|
|
1143
|
+
- **Cross-platform conversion:** [Universal Converter](./universal-converter.md)
|
|
1144
|
+
- **View flow options:** [Flow Reference](./flow-reference.md)
|
|
1145
|
+
- **Configure platforms:** [Configuration](./configuration.md)
|
|
1146
|
+
- **Debug issues:** [Troubleshooting](./troubleshooting.md)
|