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,51 @@
|
|
|
1
|
+
### Apply – Command Contract
|
|
2
|
+
|
|
3
|
+
#### 1. Overview
|
|
4
|
+
|
|
5
|
+
`opkg apply` performs a platform apply/sync pass for a package in the **effective cwd** (shell cwd or `--cwd <dir>`).
|
|
6
|
+
|
|
7
|
+
It is the standalone way to (re)materialize package content into the workspace platforms and update the unified `.openpackage/openpackage.index.yml` mapping.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
#### 2. Usage
|
|
12
|
+
|
|
13
|
+
- Apply current/root package:
|
|
14
|
+
- `opkg apply`
|
|
15
|
+
- Apply a specific package by name:
|
|
16
|
+
- `opkg apply <package-name>`
|
|
17
|
+
|
|
18
|
+
> Package resolution follows the same context detection rules as other pipelines: if `<package-name>` matches the root package, apply targets the root package; otherwise it targets a nested package when found.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
#### 3. Flags
|
|
23
|
+
|
|
24
|
+
- `--force`
|
|
25
|
+
- Overwrites on conflicts (equivalent to `conflictStrategy=overwrite`).
|
|
26
|
+
- `--dry-run`
|
|
27
|
+
- Plans apply/sync operations without writing files or updating the package index.
|
|
28
|
+
|
|
29
|
+
Global:
|
|
30
|
+
|
|
31
|
+
- `--cwd <dir>`
|
|
32
|
+
- Changes the effective cwd for package detection and apply targets. See `../cli-options.md`.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
#### 4. Output
|
|
37
|
+
|
|
38
|
+
Apply prints:
|
|
39
|
+
|
|
40
|
+
- A summary header (`Applied <name>@<version> ...`).
|
|
41
|
+
- The list of package files considered.
|
|
42
|
+
- A platform sync summary (created/updated/removed file paths) when operations occur.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
#### 5. Related
|
|
47
|
+
|
|
48
|
+
- `apply-behavior.md` – details of what is created/updated/deleted.
|
|
49
|
+
- `conflicts.md` – conflict prompting rules and strategies.
|
|
50
|
+
- `index-effects.md` – how `openpackage.index.yml` changes after apply.
|
|
51
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
### Apply – Conflicts
|
|
2
|
+
|
|
3
|
+
#### 1. Overview
|
|
4
|
+
|
|
5
|
+
Apply may need to overwrite or reconcile existing files in platform-specific directories. Conflict handling is controlled via install/apply options (notably `conflictStrategy`, `conflictDecisions`, and `--force`).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
#### 2. Strategies
|
|
10
|
+
|
|
11
|
+
Supported strategies:
|
|
12
|
+
|
|
13
|
+
- `ask` (default): prompt when interactive; choose overwrite/skip per path.
|
|
14
|
+
- `overwrite`: replace conflicting files.
|
|
15
|
+
- `skip`: do not write conflicting files.
|
|
16
|
+
- `keep-both`: preserve both versions where supported by the target layout.
|
|
17
|
+
|
|
18
|
+
CLI mapping:
|
|
19
|
+
|
|
20
|
+
- `opkg apply` defaults to `ask`.
|
|
21
|
+
- `opkg apply --force` uses `overwrite`.
|
|
22
|
+
- Apply is a standalone operation in the model (there is no `save --apply` registry-snapshot step; `save` syncs workspace edits back to source).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
#### 3. Interactive vs non-interactive
|
|
27
|
+
|
|
28
|
+
- When stdin/stdout are TTY, apply may prompt for conflict decisions under `ask`.
|
|
29
|
+
- In non-interactive contexts, apply must not hang; conflict behavior should resolve deterministically using the provided strategy/decisions.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
#### 4. Ownership and safety
|
|
34
|
+
|
|
35
|
+
Apply uses workspace-local indexes (`openpackage.index.yml`) to understand which paths are "owned" by which packages, so it can:
|
|
36
|
+
|
|
37
|
+
- avoid clobbering other packages’ files where possible, and
|
|
38
|
+
- compute deletions for stale paths that were previously installed by this package.
|
|
39
|
+
|
|
40
|
+
See `index-effects.md` for how apply updates the index after operations complete.
|
|
41
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
### Apply – `openpackage.index.yml` Effects
|
|
2
|
+
|
|
3
|
+
#### 1. Overview
|
|
4
|
+
|
|
5
|
+
Apply/sync updates `openpackage.index.yml` to reflect the **actual installed paths** created by apply. This is the mechanism by which the index "expands" from a single source path (recorded by add) to multiple platform paths (after apply).
|
|
6
|
+
|
|
7
|
+
For the index file format and general semantics, see `../package/package-index-yml.md`.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
#### 2. Index update behavior by operation
|
|
12
|
+
|
|
13
|
+
| Operation | Behavior |
|
|
14
|
+
|-----------|----------|
|
|
15
|
+
| **Add** | Records only the source path used to add the file (e.g., `.cursor/...`). |
|
|
16
|
+
| **Apply** | Updates the index to include all platform paths where files were actually created/updated during apply. |
|
|
17
|
+
| **Save** | Does not expand mappings; it uses the existing mappings to sync workspace edits back to the package source. |
|
|
18
|
+
| **Install** | Populates/updates the index with installed paths as part of install. |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
#### 3. Before/After examples
|
|
23
|
+
|
|
24
|
+
**After `opkg add .cursor/commands/test.md`** (only source path recorded):
|
|
25
|
+
|
|
26
|
+
```yaml
|
|
27
|
+
packages:
|
|
28
|
+
my-pkg:
|
|
29
|
+
path: ./.openpackage/packages/my-pkg/
|
|
30
|
+
files:
|
|
31
|
+
commands/test.md:
|
|
32
|
+
- .cursor/commands/test.md # Only the source path that exists
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**After `opkg apply`** (all synced paths recorded):
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
packages:
|
|
39
|
+
my-pkg:
|
|
40
|
+
path: ./.openpackage/packages/my-pkg/
|
|
41
|
+
version: 1.0.0
|
|
42
|
+
files:
|
|
43
|
+
commands/test.md:
|
|
44
|
+
- .cursor/commands/test.md # Original source
|
|
45
|
+
- .opencode/commands/test.md # Synced by apply
|
|
46
|
+
rules/:
|
|
47
|
+
- .cursor/rules/
|
|
48
|
+
# Note: openpackage.yml is NOT included (it's the manifest, not synced content)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Example with merged file and key tracking:**
|
|
52
|
+
|
|
53
|
+
After `opkg install my-mcp-package` where the package has a flow with `merge: deep`:
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
packages:
|
|
57
|
+
my-mcp-package:
|
|
58
|
+
path: ~/.openpackage/packages/my-mcp-package/1.0.0/
|
|
59
|
+
version: 1.0.0
|
|
60
|
+
files:
|
|
61
|
+
# Simple file mapping
|
|
62
|
+
commands/test.md:
|
|
63
|
+
- .cursor/commands/test.md
|
|
64
|
+
|
|
65
|
+
# Complex mapping with key tracking (from flow with merge: deep)
|
|
66
|
+
mcp.jsonc:
|
|
67
|
+
- target: .opencode/opencode.json
|
|
68
|
+
merge: deep
|
|
69
|
+
keys:
|
|
70
|
+
- mcp.server1
|
|
71
|
+
- mcp.server2
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The `keys` array tracks which specific keys this package contributed to `.opencode/opencode.json` after any key transformations. This enables precise removal during uninstall.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
#### 4. Notes
|
|
79
|
+
|
|
80
|
+
- The index expands to include other platform paths only **after apply/sync runs** (e.g., `opkg apply`).
|
|
81
|
+
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Architecture Overview
|
|
2
|
+
|
|
3
|
+
OpenPackage CLI adopts a **path-based source of truth** model, inspired by Git (working directories vs. commits), Docker (images), and npm (development vs. distribution). This promotes reliability by clearly separating mutable development sources from immutable distribution artifacts.
|
|
4
|
+
|
|
5
|
+
## Core Philosophy
|
|
6
|
+
|
|
7
|
+
- **Path-Centric**: All packages resolve to a concrete filesystem path. Dependencies declare `path:` or infer from `version:` (registry) / `git:` (cloned to path). Git sources support subdirectory navigation for monorepos and Claude Code plugin marketplaces.
|
|
8
|
+
- **Mutable vs. Immutable Distinction**: Guards against accidental mutation of published artifacts.
|
|
9
|
+
- Mutable: Editable sources (e.g., `./.openpackage/packages/` or `~/.openpackage/packages/`) support `save`, `add`, `pack`, `apply`.
|
|
10
|
+
- Immutable: Registry snapshots (e.g., `~/.openpackage/registry/<name>/<version>/`) support only `apply`, `install`; `save`/`add` fail with errors.
|
|
11
|
+
- **Unified Workspace Index**: Single ` .openpackage/openpackage.index.yml` tracks all installed packages, sources, and file mappings—no per-package metadata.
|
|
12
|
+
- **Directory-Based Registry**: Simple, inspectable storage without tarball extraction complexity.
|
|
13
|
+
|
|
14
|
+
See [Package Sources](package-sources.md) for resolution details and [Registry](registry.md) for storage.
|
|
15
|
+
|
|
16
|
+
## Layered Model
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
20
|
+
│ WORKSPACE │
|
|
21
|
+
│ Platform directories: .cursor/, .opencode/, docs/, etc. │
|
|
22
|
+
│ (User edits here) │
|
|
23
|
+
└────────────────────────────┬────────────────────────────────┘
|
|
24
|
+
│
|
|
25
|
+
┌─────────────────┼─────────────────┐
|
|
26
|
+
│ │ │
|
|
27
|
+
▼ ▼ │
|
|
28
|
+
save (sync) add (new files) │
|
|
29
|
+
│ │ │
|
|
30
|
+
└─────────────────┼─────────────────┘
|
|
31
|
+
▼
|
|
32
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
33
|
+
│ SOURCE OF TRUTH (MUTABLE) │
|
|
34
|
+
│ • ./.openpackage/packages/<name>/ │
|
|
35
|
+
│ • ~/.openpackage/packages/<name>/ │
|
|
36
|
+
│ • Declared paths in openpackage.yml │
|
|
37
|
+
│ │
|
|
38
|
+
│ ✅ save/add/pack/apply │
|
|
39
|
+
│ ❌ save/add fail if resolved to registry │
|
|
40
|
+
└────────────────────────────┬────────────────────────────────┘
|
|
41
|
+
│
|
|
42
|
+
pack
|
|
43
|
+
│
|
|
44
|
+
▼
|
|
45
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
46
|
+
│ REGISTRY (IMMUTABLE) │
|
|
47
|
+
│ ~/.openpackage/registry/<name>/<version>/ │
|
|
48
|
+
│ │
|
|
49
|
+
│ ⛔ save/add forbidden │
|
|
50
|
+
│ 📦 From pack only │
|
|
51
|
+
└────────────────────────────┬────────────────────────────────┘
|
|
52
|
+
│
|
|
53
|
+
install/apply
|
|
54
|
+
│
|
|
55
|
+
└──────────────────────┐
|
|
56
|
+
│ push/pull
|
|
57
|
+
▼
|
|
58
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
59
|
+
│ REMOTE REGISTRY (FUTURE) │
|
|
60
|
+
└─────────────────────────────────────────────────────────────┘
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Key Distinctions
|
|
64
|
+
|
|
65
|
+
| Concept | Analogy | Characteristics |
|
|
66
|
+
|---------|---------|-----------------|
|
|
67
|
+
| **Package Source** | Git repo / working dir | Mutable, editable; supports dev ops (save, add, pack) |
|
|
68
|
+
| **Registry Snapshot** | Git tag / Docker image | Immutable, versioned; distribution-focused (install, apply) |
|
|
69
|
+
|
|
70
|
+
## Data Flows
|
|
71
|
+
|
|
72
|
+
### Workspace → Source (save, add)
|
|
73
|
+
- User edits platform dirs or adds new files.
|
|
74
|
+
- `save`: Syncs via index mappings; resolves conflicts (mtime, overrides); writes to mutable source. Requires package to be installed (reads from workspace index).
|
|
75
|
+
- `add`: Copies files from filesystem to mutable package source (workspace or global). Does **not** update workspace index. Works independently of installation status. To sync to workspace, use `install` + `apply` or `--apply` flag.
|
|
76
|
+
- See [Save](save/) and [Add](add/) for details.
|
|
77
|
+
|
|
78
|
+
### Source → Registry (pack)
|
|
79
|
+
- Creates immutable directory copy in registry/<name>/<version>/.
|
|
80
|
+
- Version from `openpackage.yml` or computed (stable promotion).
|
|
81
|
+
- See [Pack](pack/) and [Save Versioning](save/save-versioning.md).
|
|
82
|
+
|
|
83
|
+
### Registry/Source → Workspace (install, apply)
|
|
84
|
+
- `install`: Resolves version, copies to platforms/root, updates yml/index.
|
|
85
|
+
- `apply`: Direct sync from source path (mutable or inferred immutable).
|
|
86
|
+
- See [Install](install/) and [Apply](apply/).
|
|
87
|
+
|
|
88
|
+
## Simplified Metadata Changes
|
|
89
|
+
### Removed
|
|
90
|
+
- WIP versioning complexity (now handled via prereleases in registry).
|
|
91
|
+
- Workspace hash tracking.
|
|
92
|
+
- Per-package metadata dirs (unified index replaces).
|
|
93
|
+
- Tarball registry storage (directories for simplicity).
|
|
94
|
+
|
|
95
|
+
### Retained
|
|
96
|
+
- `openpackage.yml`: Manifest with deps, version.
|
|
97
|
+
- `openpackage.index.yml`: Unified tracking of sources/mappings.
|
|
98
|
+
|
|
99
|
+
## Breaking Changes
|
|
100
|
+
The architecture introduces breaks with no auto-migration:
|
|
101
|
+
- Workspace manifests are now auto-created (no manual init needed).
|
|
102
|
+
- Create packages: `opkg new <package>` with scope support (replaces `opkg init`).
|
|
103
|
+
- Re-install packages: `opkg install`.
|
|
104
|
+
- Path-based deps replace prior models; mutable guards enforce new flows.
|
|
105
|
+
- Unified index requires manual recreation.
|
|
106
|
+
|
|
107
|
+
For prior version details, consult git history. Cross-links: [Directory Layout](directory-layout.md), [CLI Options](cli-options.md).
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Auth specs
|
|
2
|
+
|
|
3
|
+
This directory documents how `opkg` authenticates to OpenPackage APIs.
|
|
4
|
+
|
|
5
|
+
## Auth modes
|
|
6
|
+
- **OAuth (recommended)**: Device Authorization Grant (RFC 8628) via `opkg login`.
|
|
7
|
+
- **API key (backward compatible)**: Used when no valid OAuth access token is available.
|
|
8
|
+
|
|
9
|
+
## Specs
|
|
10
|
+
- **General**
|
|
11
|
+
- [`auth-http-contract.md`](./auth-http-contract.md): Backend endpoints used by CLI auth.
|
|
12
|
+
- **CLI**
|
|
13
|
+
- [`cli/login.md`](./cli/login.md): Device authorization flow and UX.
|
|
14
|
+
- [`cli/credentials.md`](./cli/credentials.md): Local credential storage and header selection/refresh rules.
|
|
15
|
+
- [`cli/logout.md`](./cli/logout.md): Logout behavior and local token clearing.
|
|
16
|
+
|
|
17
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Auth HTTP contract (CLI ↔ backend)
|
|
2
|
+
|
|
3
|
+
All endpoints in this document are called **without** authentication unless noted.
|
|
4
|
+
|
|
5
|
+
## Start device authorization
|
|
6
|
+
- **POST** `/auth/device/authorize`
|
|
7
|
+
- **Body**: `{ clientId: 'opkg-cli', scope?: 'openid', deviceName?: 'opkg-cli' }`
|
|
8
|
+
- **Response**: `{ device_code, user_code, verification_uri, verification_uri_complete, expires_in, interval }`
|
|
9
|
+
|
|
10
|
+
## Poll for tokens
|
|
11
|
+
- **POST** `/auth/device/token`
|
|
12
|
+
- **Body**: `{ deviceCode }`
|
|
13
|
+
- **Success**: `{ access_token, refresh_token, token_type: 'bearer', expires_in }`
|
|
14
|
+
- **Error codes** (HTTP 400): `authorization_pending`, `slow_down`, `expired_token`, `access_denied`
|
|
15
|
+
|
|
16
|
+
## Refresh access token
|
|
17
|
+
- **POST** `/auth/refresh`
|
|
18
|
+
- **Body**: `{ refreshToken }`
|
|
19
|
+
- **Success**: `{ accessToken, refreshToken }`
|
|
20
|
+
|
|
21
|
+
## Logout
|
|
22
|
+
- **POST** `/auth/logout` (**bearer auth required**)
|
|
23
|
+
- **Body**: `{ refreshToken }`
|
|
24
|
+
|
|
25
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Credentials storage & auth selection
|
|
2
|
+
|
|
3
|
+
This spec defines how the CLI stores per-profile credentials and selects request auth.
|
|
4
|
+
|
|
5
|
+
## Storage model
|
|
6
|
+
- Extend `ProfileCredentials` to include:
|
|
7
|
+
- `access_token`
|
|
8
|
+
- `refresh_token`
|
|
9
|
+
- `expires_at`
|
|
10
|
+
- `token_type`
|
|
11
|
+
- Credentials are persisted in the existing profile credentials INI.
|
|
12
|
+
- Preserve existing `api_key` fields when writing OAuth tokens.
|
|
13
|
+
- If profile is missing, create a credentials entry when saving tokens.
|
|
14
|
+
|
|
15
|
+
## `expires_at` derivation
|
|
16
|
+
- Derive `expires_at` from `Date.now() + expires_in*1000` or JWT `exp`.
|
|
17
|
+
|
|
18
|
+
## Header selection (per request)
|
|
19
|
+
1) If a **non-expired** access token exists:
|
|
20
|
+
- Send `Authorization: Bearer <token>`.
|
|
21
|
+
2) Else if access token is expired and a refresh token exists:
|
|
22
|
+
- Call `POST /auth/refresh`, persist new token pair, then use bearer auth.
|
|
23
|
+
3) Else if `api_key` exists:
|
|
24
|
+
- Send `X-API-Key: <key>`.
|
|
25
|
+
4) Else:
|
|
26
|
+
- Instruct user to run `opkg login` or configure an API key.
|
|
27
|
+
|
|
28
|
+
## Refresh failure behavior
|
|
29
|
+
- If refresh fails:
|
|
30
|
+
- Fallback to `X-API-Key` if present.
|
|
31
|
+
- Otherwise require login (`opkg login`).
|
|
32
|
+
|
|
33
|
+
## Browser open fallback (login UX)
|
|
34
|
+
- Platform-specific open (best-effort; ignore failures):
|
|
35
|
+
- macOS: `open`
|
|
36
|
+
- Windows: `start`
|
|
37
|
+
- Linux: `xdg-open`
|
|
38
|
+
|
|
39
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# opkg login – Device Authorization Flow (RFC 8628)
|
|
2
|
+
|
|
3
|
+
## Goals
|
|
4
|
+
- Add `opkg login [--profile <name>]` using OAuth 2.0 Device Authorization Grant.
|
|
5
|
+
- Store bearer tokens per profile; keep API-key auth backward compatible.
|
|
6
|
+
|
|
7
|
+
## Command behavior
|
|
8
|
+
- **Syntax**: `opkg login [--profile <name>]`
|
|
9
|
+
- **Profile**: optional; defaults to `default`.
|
|
10
|
+
- **Flow**:
|
|
11
|
+
1) Start device authorization → get `device_code`, `user_code`, `verification_uri`,
|
|
12
|
+
`verification_uri_complete`, `expires_in`, `interval`.
|
|
13
|
+
2) Print code and verification URL; best-effort open browser to
|
|
14
|
+
`verification_uri_complete`.
|
|
15
|
+
3) Poll token endpoint until success / denied / expired / timeout.
|
|
16
|
+
4) On success, persist access/refresh tokens to the selected profile.
|
|
17
|
+
5) On failure, print actionable error and exit non-zero.
|
|
18
|
+
|
|
19
|
+
## UX requirements
|
|
20
|
+
- Print **user code** and **verification URL**.
|
|
21
|
+
- Open browser best-effort; if it fails, user can manually visit the URL.
|
|
22
|
+
- Poll respecting `interval`; on `slow_down` add **+5s** each time.
|
|
23
|
+
- Time out when `expires_in` elapses; show: “Code expired. Please rerun opkg login.”
|
|
24
|
+
- Error messages:
|
|
25
|
+
- `access_denied`: “Access denied. Please restart opkg login.”
|
|
26
|
+
- `expired_token`: “Code expired. Please rerun opkg login.”
|
|
27
|
+
|
|
28
|
+
## Non-goals (future)
|
|
29
|
+
- Device-name flag, headless/no-browser flag.
|
|
30
|
+
- Multi-factor UX in CLI.
|
|
31
|
+
|
|
32
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# opkg logout
|
|
2
|
+
|
|
3
|
+
## Command behavior
|
|
4
|
+
- **Syntax**: `opkg logout [--profile <name>]`
|
|
5
|
+
- **Profile**: optional; defaults to `default`.
|
|
6
|
+
- Requires stored OAuth tokens for the profile; **no-op** if none.
|
|
7
|
+
|
|
8
|
+
## Remote logout
|
|
9
|
+
- Send `POST /auth/logout` with bearer auth and body `{ refreshToken }`.
|
|
10
|
+
|
|
11
|
+
## Local clearing rules
|
|
12
|
+
- On success **or failure**, clear the local OAuth token fields for the profile.
|
|
13
|
+
- Keep any configured `api_key` intact.
|
|
14
|
+
- If profile resolves as direct API key usage (no OAuth session), exit with: “no OAuth session.”
|
|
15
|
+
|
|
16
|
+
|