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,552 @@
|
|
|
1
|
+
# Platform Detection
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The platform system detects which AI coding platforms are present in a workspace to determine which flows should execute. Detection uses multiple signals and respects configuration settings.
|
|
6
|
+
|
|
7
|
+
## Detection Signals
|
|
8
|
+
|
|
9
|
+
### 1. Root Directory Detection
|
|
10
|
+
|
|
11
|
+
A platform is detected if its **root directory** exists in the workspace.
|
|
12
|
+
|
|
13
|
+
**Example:**
|
|
14
|
+
```bash
|
|
15
|
+
# Cursor detected
|
|
16
|
+
.cursor/ # Directory exists
|
|
17
|
+
├── rules/
|
|
18
|
+
└── settings.json
|
|
19
|
+
|
|
20
|
+
# Claude detected
|
|
21
|
+
.claude/ # Directory exists
|
|
22
|
+
├── agents/
|
|
23
|
+
└── skills/
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Configuration:**
|
|
27
|
+
```jsonc
|
|
28
|
+
{
|
|
29
|
+
"cursor": {
|
|
30
|
+
"rootDir": ".cursor" // Checked for existence
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Detection logic:**
|
|
36
|
+
```typescript
|
|
37
|
+
const cursorDetected = fs.existsSync(path.join(workspace, ".cursor"));
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 2. Root File Detection
|
|
41
|
+
|
|
42
|
+
A platform is detected if its **root file** exists at the project root.
|
|
43
|
+
|
|
44
|
+
**Example:**
|
|
45
|
+
```bash
|
|
46
|
+
project/
|
|
47
|
+
├── CLAUDE.md # Claude detected (even without .claude/ dir)
|
|
48
|
+
├── GEMINI.md # Gemini detected
|
|
49
|
+
└── src/
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Configuration:**
|
|
53
|
+
```jsonc
|
|
54
|
+
{
|
|
55
|
+
"claude": {
|
|
56
|
+
"rootDir": ".claude",
|
|
57
|
+
"rootFile": "CLAUDE.md" // Checked for existence
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Detection logic:**
|
|
63
|
+
```typescript
|
|
64
|
+
const claudeDetected =
|
|
65
|
+
fs.existsSync(path.join(workspace, ".claude")) ||
|
|
66
|
+
fs.existsSync(path.join(workspace, "CLAUDE.md"));
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Combined Detection
|
|
70
|
+
|
|
71
|
+
Both signals are checked independently:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Scenario 1: Directory only
|
|
75
|
+
.cursor/ # ✓ Cursor detected
|
|
76
|
+
|
|
77
|
+
# Scenario 2: Root file only
|
|
78
|
+
CLAUDE.md # ✓ Claude detected (no .claude/ dir needed)
|
|
79
|
+
|
|
80
|
+
# Scenario 3: Both present
|
|
81
|
+
.gemini/ # ✓ Gemini detected
|
|
82
|
+
GEMINI.md # ✓ (redundant but valid)
|
|
83
|
+
|
|
84
|
+
# Scenario 4: Neither present
|
|
85
|
+
# ✗ Windsurf not detected
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Enabled Flag
|
|
89
|
+
|
|
90
|
+
Platforms must be **enabled** to execute flows, even if detected.
|
|
91
|
+
|
|
92
|
+
### Default Behavior
|
|
93
|
+
|
|
94
|
+
Platforms are **enabled by default** if not specified:
|
|
95
|
+
|
|
96
|
+
```jsonc
|
|
97
|
+
{
|
|
98
|
+
"cursor": {
|
|
99
|
+
"name": "Cursor",
|
|
100
|
+
"rootDir": ".cursor",
|
|
101
|
+
// enabled: true (implicit)
|
|
102
|
+
"flows": []
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Disabling Platforms
|
|
108
|
+
|
|
109
|
+
Set `enabled: false` to disable a platform:
|
|
110
|
+
|
|
111
|
+
```jsonc
|
|
112
|
+
{
|
|
113
|
+
"windsurf": {
|
|
114
|
+
"enabled": false // Flows won't execute even if detected
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Use cases:**
|
|
120
|
+
- Temporarily disable platform without removing config
|
|
121
|
+
- Override built-in platform in workspace
|
|
122
|
+
- Testing/debugging specific platforms
|
|
123
|
+
|
|
124
|
+
### Detection vs. Enabled
|
|
125
|
+
|
|
126
|
+
| Detected | Enabled | Result |
|
|
127
|
+
|----------|---------|--------|
|
|
128
|
+
| ✓ | ✓ | **Flows execute** |
|
|
129
|
+
| ✓ | ✗ | Flows skipped (disabled) |
|
|
130
|
+
| ✗ | ✓ | Flows skipped (not present) |
|
|
131
|
+
| ✗ | ✗ | Flows skipped |
|
|
132
|
+
|
|
133
|
+
## Platform Identities
|
|
134
|
+
|
|
135
|
+
### Platform IDs
|
|
136
|
+
|
|
137
|
+
Each platform has a **lowercase identifier** used as the top-level key:
|
|
138
|
+
|
|
139
|
+
```jsonc
|
|
140
|
+
{
|
|
141
|
+
"cursor": { /* ... */ }, // ID: cursor
|
|
142
|
+
"claude": { /* ... */ }, // ID: claude
|
|
143
|
+
"windsurf": { /* ... */ } // ID: windsurf
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Naming convention:**
|
|
148
|
+
- Lowercase
|
|
149
|
+
- Kebab-case for multi-word names
|
|
150
|
+
- Must be unique
|
|
151
|
+
|
|
152
|
+
### Platform Names
|
|
153
|
+
|
|
154
|
+
Human-readable display names:
|
|
155
|
+
|
|
156
|
+
```jsonc
|
|
157
|
+
{
|
|
158
|
+
"cursor": {
|
|
159
|
+
"name": "Cursor" // Display name
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Used in:**
|
|
165
|
+
- CLI output
|
|
166
|
+
- Status displays
|
|
167
|
+
- Error messages
|
|
168
|
+
|
|
169
|
+
## Aliases
|
|
170
|
+
|
|
171
|
+
Platforms can define **CLI-friendly aliases** for easier reference.
|
|
172
|
+
|
|
173
|
+
### Configuration
|
|
174
|
+
|
|
175
|
+
```jsonc
|
|
176
|
+
{
|
|
177
|
+
"claude": {
|
|
178
|
+
"name": "Claude Code",
|
|
179
|
+
"aliases": ["claudecode", "claude-code"]
|
|
180
|
+
},
|
|
181
|
+
"cursor": {
|
|
182
|
+
"name": "Cursor",
|
|
183
|
+
"aliases": ["cursorcli", "cursor-editor"]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Alias Resolution
|
|
189
|
+
|
|
190
|
+
Aliases are resolved **case-insensitively** to canonical platform IDs:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# All resolve to 'cursor'
|
|
194
|
+
opkg install --platform=cursor
|
|
195
|
+
opkg install --platform=Cursor
|
|
196
|
+
opkg install --platform=cursorcli
|
|
197
|
+
opkg install --platform=CURSORCLI
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Resolution order:**
|
|
201
|
+
1. Check if input matches platform ID (case-insensitive)
|
|
202
|
+
2. Check if input matches any alias (case-insensitive)
|
|
203
|
+
3. If no match, treat as unknown platform
|
|
204
|
+
|
|
205
|
+
### Built-in Aliases
|
|
206
|
+
|
|
207
|
+
Common built-in aliases:
|
|
208
|
+
|
|
209
|
+
| Platform | ID | Aliases |
|
|
210
|
+
|----------|----|----|
|
|
211
|
+
| Cursor | `cursor` | `cursorcli` |
|
|
212
|
+
| Claude | `claude` | `claudecode` |
|
|
213
|
+
| Windsurf | `windsurf` | `windsurfcli` |
|
|
214
|
+
| Gemini | `gemini` | `geminicli`, `geminicode` |
|
|
215
|
+
| Kilo | `kilo` | `kilocode` |
|
|
216
|
+
| Codex | `codex` | `codexcli` |
|
|
217
|
+
|
|
218
|
+
## Detection API
|
|
219
|
+
|
|
220
|
+
### Detecting All Platforms
|
|
221
|
+
|
|
222
|
+
Check which platforms are present:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
import { detectPlatforms } from '@/core/platforms';
|
|
226
|
+
|
|
227
|
+
const results = detectPlatforms(workspaceDir);
|
|
228
|
+
// [
|
|
229
|
+
// { id: 'cursor', name: 'Cursor', detected: true },
|
|
230
|
+
// { id: 'claude', name: 'Claude Code', detected: false },
|
|
231
|
+
// ...
|
|
232
|
+
// ]
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Getting Detected Platforms
|
|
236
|
+
|
|
237
|
+
Filter to only detected platforms:
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
const detected = results.filter(r => r.detected);
|
|
241
|
+
// [{ id: 'cursor', name: 'Cursor', detected: true }]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Checking Specific Platform
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
const isCursorDetected = results.some(r => r.id === 'cursor' && r.detected);
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Universal Root Files
|
|
251
|
+
|
|
252
|
+
Some root files are **universal** and not attributed to a specific platform.
|
|
253
|
+
|
|
254
|
+
### AGENTS.md
|
|
255
|
+
|
|
256
|
+
The `AGENTS.md` file is treated as universal:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
project/
|
|
260
|
+
├── AGENTS.md # Universal, not platform-specific
|
|
261
|
+
├── CLAUDE.md # Claude-specific
|
|
262
|
+
└── .cursor/
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Behavior:**
|
|
266
|
+
- Not used for platform detection
|
|
267
|
+
- Installed to workspace root for all platforms
|
|
268
|
+
- Typically defined in `global.flows`
|
|
269
|
+
|
|
270
|
+
```jsonc
|
|
271
|
+
{
|
|
272
|
+
"global": {
|
|
273
|
+
"flows": [
|
|
274
|
+
{ "from": "AGENTS.md", "to": "AGENTS.md" }
|
|
275
|
+
]
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## CLI Commands
|
|
281
|
+
|
|
282
|
+
### Check Detected Platforms
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
opkg status
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Output:**
|
|
289
|
+
```
|
|
290
|
+
Detected platforms:
|
|
291
|
+
✓ Cursor (.cursor/)
|
|
292
|
+
✓ Claude (CLAUDE.md)
|
|
293
|
+
✗ Windsurf
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Validate Platform Configuration
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
opkg validate platforms
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Checks:**
|
|
303
|
+
- All platforms properly configured
|
|
304
|
+
- Required fields present
|
|
305
|
+
- Detection signals valid
|
|
306
|
+
|
|
307
|
+
### List Available Platforms
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
opkg platforms list
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Output:**
|
|
314
|
+
```
|
|
315
|
+
Available platforms:
|
|
316
|
+
cursor Cursor
|
|
317
|
+
claude Claude Code
|
|
318
|
+
windsurf Windsurf
|
|
319
|
+
...
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Show Platform Details
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
opkg platforms show cursor
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Output:**
|
|
329
|
+
```
|
|
330
|
+
Platform: Cursor
|
|
331
|
+
ID: cursor
|
|
332
|
+
Root Directory: .cursor
|
|
333
|
+
Aliases: cursorcli
|
|
334
|
+
Enabled: true
|
|
335
|
+
Flows: 5 configured
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Detection in Flows
|
|
339
|
+
|
|
340
|
+
### Platform-Conditional Flows
|
|
341
|
+
|
|
342
|
+
Flows can check platform detection:
|
|
343
|
+
|
|
344
|
+
```jsonc
|
|
345
|
+
{
|
|
346
|
+
"from": "mcp.jsonc",
|
|
347
|
+
"to": ".cursor/mcp.json",
|
|
348
|
+
"when": { "platform": "cursor" }
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Behavior:**
|
|
353
|
+
- Flow executes only if Cursor is **detected**
|
|
354
|
+
- Respects `enabled` flag
|
|
355
|
+
- Skipped silently if not detected
|
|
356
|
+
|
|
357
|
+
### Multi-Platform Conditionals
|
|
358
|
+
|
|
359
|
+
```jsonc
|
|
360
|
+
{
|
|
361
|
+
"from": "config.yaml",
|
|
362
|
+
"to": ".ai/config.json",
|
|
363
|
+
"when": {
|
|
364
|
+
"or": [
|
|
365
|
+
{ "platform": "cursor" },
|
|
366
|
+
{ "platform": "claude" }
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Executes if **any** platform is detected.
|
|
373
|
+
|
|
374
|
+
## Advanced Detection Scenarios
|
|
375
|
+
|
|
376
|
+
### Scenario 1: Legacy Directory Structure
|
|
377
|
+
|
|
378
|
+
Platform detected but incomplete:
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
.cursor/ # ✓ Detected
|
|
382
|
+
# Missing: .cursor/rules/, .cursor/commands/
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**Behavior:**
|
|
386
|
+
- Platform detected
|
|
387
|
+
- Flows execute
|
|
388
|
+
- Directories created as needed
|
|
389
|
+
|
|
390
|
+
### Scenario 2: Root File Only
|
|
391
|
+
|
|
392
|
+
Platform detected via root file:
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
CLAUDE.md # ✓ Claude detected
|
|
396
|
+
# No .claude/ directory
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Behavior:**
|
|
400
|
+
- Platform detected
|
|
401
|
+
- Flows create `.claude/` as needed
|
|
402
|
+
- Root file preserved
|
|
403
|
+
|
|
404
|
+
### Scenario 3: Custom Root Directory
|
|
405
|
+
|
|
406
|
+
Override built-in root directory:
|
|
407
|
+
|
|
408
|
+
```jsonc
|
|
409
|
+
{
|
|
410
|
+
"cursor": {
|
|
411
|
+
"rootDir": ".cursor-custom"
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Detection:**
|
|
417
|
+
```bash
|
|
418
|
+
.cursor-custom/ # ✓ Detected (not .cursor/)
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Scenario 4: Disabled Built-in Platform
|
|
422
|
+
|
|
423
|
+
Workspace disables a platform:
|
|
424
|
+
|
|
425
|
+
```jsonc
|
|
426
|
+
// workspace/.openpackage/platforms.jsonc
|
|
427
|
+
{
|
|
428
|
+
"windsurf": {
|
|
429
|
+
"enabled": false
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
.windsurf/ # ✓ Directory exists
|
|
436
|
+
# ✗ Platform disabled - flows skipped
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## Detection Best Practices
|
|
440
|
+
|
|
441
|
+
### 1. Use Standard Directories
|
|
442
|
+
|
|
443
|
+
Stick to built-in root directories when possible:
|
|
444
|
+
```bash
|
|
445
|
+
.cursor/
|
|
446
|
+
.claude/
|
|
447
|
+
.windsurf/
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### 2. Add Root Files for Clarity
|
|
451
|
+
|
|
452
|
+
Use platform-specific root files:
|
|
453
|
+
```bash
|
|
454
|
+
CLAUDE.md
|
|
455
|
+
GEMINI.md
|
|
456
|
+
QWEN.md
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### 3. Test Detection
|
|
460
|
+
|
|
461
|
+
Always verify detection before assuming:
|
|
462
|
+
```bash
|
|
463
|
+
opkg status
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 4. Document Custom Directories
|
|
467
|
+
|
|
468
|
+
If overriding, document why:
|
|
469
|
+
```jsonc
|
|
470
|
+
{
|
|
471
|
+
"cursor": {
|
|
472
|
+
// Custom directory for monorepo setup
|
|
473
|
+
"rootDir": ".cursor-workspace"
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### 5. Disable Unused Platforms
|
|
479
|
+
|
|
480
|
+
For performance, disable unused platforms:
|
|
481
|
+
```jsonc
|
|
482
|
+
{
|
|
483
|
+
"cline": { "enabled": false },
|
|
484
|
+
"roo-code": { "enabled": false }
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## Troubleshooting
|
|
489
|
+
|
|
490
|
+
### Platform Not Detected
|
|
491
|
+
|
|
492
|
+
**Check directory:**
|
|
493
|
+
```bash
|
|
494
|
+
ls -la .cursor
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
**Check root file:**
|
|
498
|
+
```bash
|
|
499
|
+
ls -la CLAUDE.md
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Check configuration:**
|
|
503
|
+
```bash
|
|
504
|
+
opkg validate platforms
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Platform Detected But Flows Not Running
|
|
508
|
+
|
|
509
|
+
**Check enabled flag:**
|
|
510
|
+
```jsonc
|
|
511
|
+
{
|
|
512
|
+
"cursor": {
|
|
513
|
+
"enabled": true // Must be true
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**Check flow conditions:**
|
|
519
|
+
```jsonc
|
|
520
|
+
{
|
|
521
|
+
"when": { "platform": "cursor" } // Must match detected platform
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### Wrong Platform Detected
|
|
526
|
+
|
|
527
|
+
**Check root directory naming:**
|
|
528
|
+
```bash
|
|
529
|
+
# Wrong
|
|
530
|
+
.Cursor/ # Case-sensitive on Linux
|
|
531
|
+
.cursor_old/ # Different name
|
|
532
|
+
|
|
533
|
+
# Correct
|
|
534
|
+
.cursor/
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
### Multiple Platforms Detected
|
|
538
|
+
|
|
539
|
+
This is normal and expected:
|
|
540
|
+
```bash
|
|
541
|
+
.cursor/ # ✓ Cursor
|
|
542
|
+
.claude/ # ✓ Claude
|
|
543
|
+
.windsurf/ # ✓ Windsurf
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
All detected platforms execute their flows.
|
|
547
|
+
|
|
548
|
+
## Next Steps
|
|
549
|
+
|
|
550
|
+
- **Learn directory layout:** [Directory Layout](./directory-layout.md)
|
|
551
|
+
- **Configure platforms:** [Configuration](./configuration.md)
|
|
552
|
+
- **Debug detection:** [Troubleshooting](./troubleshooting.md)
|