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.
Files changed (487) hide show
  1. package/README.md +109 -186
  2. package/assets/openpackage_ascii_dark.png +0 -0
  3. package/assets/openpackage_ascii_light.png +0 -0
  4. package/dist/commands/add.js +34 -10
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/apply.js +16 -0
  7. package/dist/commands/apply.js.map +1 -0
  8. package/dist/commands/delete.js +1 -1
  9. package/dist/commands/delete.js.map +1 -1
  10. package/dist/commands/install.js +177 -8
  11. package/dist/commands/install.js.map +1 -1
  12. package/dist/commands/list.js +2 -2
  13. package/dist/commands/list.js.map +1 -1
  14. package/dist/commands/login.js +1 -1
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/logout.js +1 -1
  17. package/dist/commands/logout.js.map +1 -1
  18. package/dist/commands/new.js +125 -0
  19. package/dist/commands/new.js.map +1 -0
  20. package/dist/commands/pack.js +7 -13
  21. package/dist/commands/pack.js.map +1 -1
  22. package/dist/commands/pull.js +1 -1
  23. package/dist/commands/pull.js.map +1 -1
  24. package/dist/commands/push.js +1 -1
  25. package/dist/commands/push.js.map +1 -1
  26. package/dist/commands/remove.js +63 -0
  27. package/dist/commands/remove.js.map +1 -0
  28. package/dist/commands/save.js +11 -17
  29. package/dist/commands/save.js.map +1 -1
  30. package/dist/commands/set.js +33 -0
  31. package/dist/commands/set.js.map +1 -0
  32. package/dist/commands/show.js +16 -94
  33. package/dist/commands/show.js.map +1 -1
  34. package/dist/commands/status.js +26 -701
  35. package/dist/commands/status.js.map +1 -1
  36. package/dist/commands/uninstall.js +14 -427
  37. package/dist/commands/uninstall.js.map +1 -1
  38. package/dist/constants/index.js +72 -16
  39. package/dist/constants/index.js.map +1 -1
  40. package/dist/core/add/add-conflict-handler.js +1 -8
  41. package/dist/core/add/add-conflict-handler.js.map +1 -1
  42. package/dist/core/add/add-pipeline.js +12 -10
  43. package/dist/core/add/add-pipeline.js.map +1 -1
  44. package/dist/core/add/add-to-source-pipeline.js +123 -0
  45. package/dist/core/add/add-to-source-pipeline.js.map +1 -0
  46. package/dist/core/add/package-index-updater.js +77 -78
  47. package/dist/core/add/package-index-updater.js.map +1 -1
  48. package/dist/core/add/platform-path-transformer.js +6 -4
  49. package/dist/core/add/platform-path-transformer.js.map +1 -1
  50. package/dist/core/add/source-collector.js +2 -3
  51. package/dist/core/add/source-collector.js.map +1 -1
  52. package/dist/core/apply/apply-pipeline.js +110 -0
  53. package/dist/core/apply/apply-pipeline.js.map +1 -0
  54. package/dist/core/dependency-resolver.js +263 -21
  55. package/dist/core/dependency-resolver.js.map +1 -1
  56. package/dist/core/discovery/file-discovery.js +1 -2
  57. package/dist/core/discovery/file-discovery.js.map +1 -1
  58. package/dist/core/discovery/platform-files-discovery.js +33 -18
  59. package/dist/core/discovery/platform-files-discovery.js.map +1 -1
  60. package/dist/core/flows/flow-executor.js +974 -0
  61. package/dist/core/flows/flow-executor.js.map +1 -0
  62. package/dist/core/flows/flow-inverter.js +442 -0
  63. package/dist/core/flows/flow-inverter.js.map +1 -0
  64. package/dist/core/flows/flow-key-extractor.js +101 -0
  65. package/dist/core/flows/flow-key-extractor.js.map +1 -0
  66. package/dist/core/flows/flow-key-mapper.js +382 -0
  67. package/dist/core/flows/flow-key-mapper.js.map +1 -0
  68. package/dist/core/flows/flow-transforms.js +632 -0
  69. package/dist/core/flows/flow-transforms.js.map +1 -0
  70. package/dist/core/flows/map-pipeline/context.js +73 -0
  71. package/dist/core/flows/map-pipeline/context.js.map +1 -0
  72. package/dist/core/flows/map-pipeline/index.js +156 -0
  73. package/dist/core/flows/map-pipeline/index.js.map +1 -0
  74. package/dist/core/flows/map-pipeline/operations/copy.js +104 -0
  75. package/dist/core/flows/map-pipeline/operations/copy.js.map +1 -0
  76. package/dist/core/flows/map-pipeline/operations/pipe.js +70 -0
  77. package/dist/core/flows/map-pipeline/operations/pipe.js.map +1 -0
  78. package/dist/core/flows/map-pipeline/operations/rename.js +102 -0
  79. package/dist/core/flows/map-pipeline/operations/rename.js.map +1 -0
  80. package/dist/core/flows/map-pipeline/operations/set.js +50 -0
  81. package/dist/core/flows/map-pipeline/operations/set.js.map +1 -0
  82. package/dist/core/flows/map-pipeline/operations/switch.js +79 -0
  83. package/dist/core/flows/map-pipeline/operations/switch.js.map +1 -0
  84. package/dist/core/flows/map-pipeline/operations/transform.js +543 -0
  85. package/dist/core/flows/map-pipeline/operations/transform.js.map +1 -0
  86. package/dist/core/flows/map-pipeline/operations/unset.js +65 -0
  87. package/dist/core/flows/map-pipeline/operations/unset.js.map +1 -0
  88. package/dist/core/flows/map-pipeline/types.js +8 -0
  89. package/dist/core/flows/map-pipeline/types.js.map +1 -0
  90. package/dist/core/flows/map-pipeline/utils.js +278 -0
  91. package/dist/core/flows/map-pipeline/utils.js.map +1 -0
  92. package/dist/core/flows/platform-converter.js +328 -0
  93. package/dist/core/flows/platform-converter.js.map +1 -0
  94. package/dist/core/flows/source-resolver.js +192 -0
  95. package/dist/core/flows/source-resolver.js.map +1 -0
  96. package/dist/core/flows/toml-domain-transforms.js +23 -0
  97. package/dist/core/flows/toml-domain-transforms.js.map +1 -0
  98. package/dist/core/install/bulk-install-pipeline.js +68 -7
  99. package/dist/core/install/bulk-install-pipeline.js.map +1 -1
  100. package/dist/core/install/canonical-plan.js +3 -3
  101. package/dist/core/install/canonical-plan.js.map +1 -1
  102. package/dist/core/install/dry-run.js +3 -3
  103. package/dist/core/install/dry-run.js.map +1 -1
  104. package/dist/core/install/flow-based-installer.js +1158 -0
  105. package/dist/core/install/flow-based-installer.js.map +1 -0
  106. package/dist/core/install/flow-workspace-tracker.js +111 -0
  107. package/dist/core/install/flow-workspace-tracker.js.map +1 -0
  108. package/dist/core/install/format-detector.js +228 -0
  109. package/dist/core/install/format-detector.js.map +1 -0
  110. package/dist/core/install/git-package-loader.js +20 -0
  111. package/dist/core/install/git-package-loader.js.map +1 -0
  112. package/dist/core/install/install-errors.js +1 -1
  113. package/dist/core/install/install-errors.js.map +1 -1
  114. package/dist/core/install/install-flow.js +34 -14
  115. package/dist/core/install/install-flow.js.map +1 -1
  116. package/dist/core/install/install-pipeline.js +52 -17
  117. package/dist/core/install/install-pipeline.js.map +1 -1
  118. package/dist/core/install/install-reporting.js +26 -8
  119. package/dist/core/install/install-reporting.js.map +1 -1
  120. package/dist/core/install/local-source-resolution.js +103 -0
  121. package/dist/core/install/local-source-resolution.js.map +1 -0
  122. package/dist/core/install/marketplace-handler.js +221 -0
  123. package/dist/core/install/marketplace-handler.js.map +1 -0
  124. package/dist/core/install/path-install-pipeline.js +241 -0
  125. package/dist/core/install/path-install-pipeline.js.map +1 -0
  126. package/dist/core/install/path-package-loader.js +116 -0
  127. package/dist/core/install/path-package-loader.js.map +1 -0
  128. package/dist/core/install/plugin-detector.js +72 -0
  129. package/dist/core/install/plugin-detector.js.map +1 -0
  130. package/dist/core/install/plugin-to-universal-converter.js +218 -0
  131. package/dist/core/install/plugin-to-universal-converter.js.map +1 -0
  132. package/dist/core/install/plugin-transformer.js +191 -0
  133. package/dist/core/install/plugin-transformer.js.map +1 -0
  134. package/dist/core/install/version-selection.js +1 -1
  135. package/dist/core/install/version-selection.js.map +1 -1
  136. package/dist/core/openpackage.js +40 -22
  137. package/dist/core/openpackage.js.map +1 -1
  138. package/dist/core/pack/pack-output.js +62 -0
  139. package/dist/core/pack/pack-output.js.map +1 -0
  140. package/dist/core/pack/pack-pipeline.js +186 -0
  141. package/dist/core/pack/pack-pipeline.js.map +1 -0
  142. package/dist/core/package-context.js +45 -70
  143. package/dist/core/package-context.js.map +1 -1
  144. package/dist/core/package-creation.js +203 -0
  145. package/dist/core/package-creation.js.map +1 -0
  146. package/dist/core/package.js +20 -6
  147. package/dist/core/package.js.map +1 -1
  148. package/dist/core/platforms.js +665 -209
  149. package/dist/core/platforms.js.map +1 -1
  150. package/dist/core/push/push-context.js +1 -1
  151. package/dist/core/push/push-context.js.map +1 -1
  152. package/dist/core/push/push-upload.js +2 -2
  153. package/dist/core/push/push-upload.js.map +1 -1
  154. package/dist/core/registry.js +6 -6
  155. package/dist/core/registry.js.map +1 -1
  156. package/dist/core/remote-pull.js +2 -2
  157. package/dist/core/remote-pull.js.map +1 -1
  158. package/dist/core/remove/removal-collector.js +52 -0
  159. package/dist/core/remove/removal-collector.js.map +1 -0
  160. package/dist/core/remove/removal-confirmation.js +39 -0
  161. package/dist/core/remove/removal-confirmation.js.map +1 -0
  162. package/dist/core/remove/remove-from-source-pipeline.js +173 -0
  163. package/dist/core/remove/remove-from-source-pipeline.js.map +1 -0
  164. package/dist/core/save/constants.js +3 -3
  165. package/dist/core/save/constants.js.map +1 -1
  166. package/dist/core/save/flow-based-saver.js +270 -0
  167. package/dist/core/save/flow-based-saver.js.map +1 -0
  168. package/dist/core/save/name-resolution.js +1 -1
  169. package/dist/core/save/name-resolution.js.map +1 -1
  170. package/dist/core/save/package-yml-generator.js +4 -5
  171. package/dist/core/save/package-yml-generator.js.map +1 -1
  172. package/dist/core/save/save-candidate-builder.js +215 -0
  173. package/dist/core/save/save-candidate-builder.js.map +1 -0
  174. package/dist/core/save/save-candidate-loader.js +12 -11
  175. package/dist/core/save/save-candidate-loader.js.map +1 -1
  176. package/dist/core/save/save-conflict-analyzer.js +150 -0
  177. package/dist/core/save/save-conflict-analyzer.js.map +1 -0
  178. package/dist/core/save/save-conflict-resolution.js +28 -14
  179. package/dist/core/save/save-conflict-resolution.js.map +1 -1
  180. package/dist/core/save/save-conflict-resolver.js +31 -275
  181. package/dist/core/save/save-conflict-resolver.js.map +1 -1
  182. package/dist/core/save/save-group-builder.js +52 -0
  183. package/dist/core/save/save-group-builder.js.map +1 -0
  184. package/dist/core/save/save-interactive-resolver.js +190 -0
  185. package/dist/core/save/save-interactive-resolver.js.map +1 -0
  186. package/dist/core/save/save-pipeline.js +58 -34
  187. package/dist/core/save/save-pipeline.js.map +1 -1
  188. package/dist/core/save/save-platform-handler.js +53 -0
  189. package/dist/core/save/save-platform-handler.js.map +1 -0
  190. package/dist/core/save/save-resolution-executor.js +145 -0
  191. package/dist/core/save/save-resolution-executor.js.map +1 -0
  192. package/dist/core/save/save-result-reporter.js +167 -0
  193. package/dist/core/save/save-result-reporter.js.map +1 -0
  194. package/dist/core/save/save-to-source-pipeline.js +154 -0
  195. package/dist/core/save/save-to-source-pipeline.js.map +1 -0
  196. package/dist/core/save/save-versioning.js +4 -4
  197. package/dist/core/save/save-versioning.js.map +1 -1
  198. package/dist/core/save/save-write-coordinator.js +204 -0
  199. package/dist/core/save/save-write-coordinator.js.map +1 -0
  200. package/dist/core/save/save-yml-resolution.js +28 -216
  201. package/dist/core/save/save-yml-resolution.js.map +1 -1
  202. package/dist/core/save/workspace-rename.js +7 -8
  203. package/dist/core/save/workspace-rename.js.map +1 -1
  204. package/dist/core/set/set-output.js +72 -0
  205. package/dist/core/set/set-output.js.map +1 -0
  206. package/dist/core/set/set-pipeline.js +361 -0
  207. package/dist/core/set/set-pipeline.js.map +1 -0
  208. package/dist/core/set/set-types.js +5 -0
  209. package/dist/core/set/set-types.js.map +1 -0
  210. package/dist/core/show/package-resolver.js +257 -0
  211. package/dist/core/show/package-resolver.js.map +1 -0
  212. package/dist/core/show/scope-discovery.js +165 -0
  213. package/dist/core/show/scope-discovery.js.map +1 -0
  214. package/dist/core/show/show-output.js +168 -0
  215. package/dist/core/show/show-output.js.map +1 -0
  216. package/dist/core/show/show-pipeline.js +113 -0
  217. package/dist/core/show/show-pipeline.js.map +1 -0
  218. package/dist/core/show/show-types.js +5 -0
  219. package/dist/core/show/show-types.js.map +1 -0
  220. package/dist/core/source-resolution/dependency-graph.js +104 -0
  221. package/dist/core/source-resolution/dependency-graph.js.map +1 -0
  222. package/dist/core/source-resolution/resolve-mutable-source.js +109 -0
  223. package/dist/core/source-resolution/resolve-mutable-source.js.map +1 -0
  224. package/dist/core/source-resolution/resolve-package-source.js +29 -0
  225. package/dist/core/source-resolution/resolve-package-source.js.map +1 -0
  226. package/dist/core/source-resolution/resolve-registry-version.js +35 -0
  227. package/dist/core/source-resolution/resolve-registry-version.js.map +1 -0
  228. package/dist/core/source-resolution/types.js.map +1 -0
  229. package/dist/core/status/status-file-discovery.js +23 -12
  230. package/dist/core/status/status-file-discovery.js.map +1 -1
  231. package/dist/core/status/status-pipeline.js +134 -0
  232. package/dist/core/status/status-pipeline.js.map +1 -0
  233. package/dist/core/sync/platform-sync-summary.js +27 -0
  234. package/dist/core/sync/platform-sync-summary.js.map +1 -0
  235. package/dist/core/uninstall/flow-aware-uninstaller.js +189 -0
  236. package/dist/core/uninstall/flow-aware-uninstaller.js.map +1 -0
  237. package/dist/core/uninstall/uninstall-file-discovery.js +11 -6
  238. package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
  239. package/dist/core/uninstall/uninstall-pipeline.js +141 -0
  240. package/dist/core/uninstall/uninstall-pipeline.js.map +1 -0
  241. package/dist/core/universal-patterns.js +64 -0
  242. package/dist/core/universal-patterns.js.map +1 -0
  243. package/dist/index.js +99 -6
  244. package/dist/index.js.map +1 -1
  245. package/dist/types/flows.js +8 -0
  246. package/dist/types/flows.js.map +1 -0
  247. package/dist/types/index.js +3 -0
  248. package/dist/types/index.js.map +1 -1
  249. package/dist/types/platform-flows.js +8 -0
  250. package/dist/types/platform-flows.js.map +1 -0
  251. package/dist/types/workspace-index.js +6 -0
  252. package/dist/types/workspace-index.js.map +1 -0
  253. package/dist/utils/custom-path-resolution.js +160 -0
  254. package/dist/utils/custom-path-resolution.js.map +1 -0
  255. package/dist/utils/dependency-coverage.js +1 -1
  256. package/dist/utils/dependency-coverage.js.map +1 -1
  257. package/dist/utils/file-processing.js +1 -1
  258. package/dist/utils/flow-index-installer.js +209 -0
  259. package/dist/utils/flow-index-installer.js.map +1 -0
  260. package/dist/utils/formatters.js +47 -1
  261. package/dist/utils/formatters.js.map +1 -1
  262. package/dist/utils/fs.js +17 -0
  263. package/dist/utils/fs.js.map +1 -1
  264. package/dist/utils/git-clone-registry.js +88 -0
  265. package/dist/utils/git-clone-registry.js.map +1 -0
  266. package/dist/utils/git-clone.js +69 -0
  267. package/dist/utils/git-clone.js.map +1 -0
  268. package/dist/utils/git-spec.js +96 -0
  269. package/dist/utils/git-spec.js.map +1 -0
  270. package/dist/utils/http-client.js +7 -0
  271. package/dist/utils/http-client.js.map +1 -1
  272. package/dist/utils/index-based-installer.js +356 -163
  273. package/dist/utils/index-based-installer.js.map +1 -1
  274. package/dist/utils/install-conflict-handler.js +2 -2
  275. package/dist/utils/install-conflict-handler.js.map +1 -1
  276. package/dist/utils/install-file-discovery.js +18 -13
  277. package/dist/utils/install-file-discovery.js.map +1 -1
  278. package/dist/utils/install-helpers.js +43 -20
  279. package/dist/utils/install-helpers.js.map +1 -1
  280. package/dist/utils/jsonc.js +23 -1
  281. package/dist/utils/jsonc.js.map +1 -1
  282. package/dist/utils/manifest-paths.js +1 -1
  283. package/dist/utils/manifest-paths.js.map +1 -1
  284. package/dist/utils/markdown-frontmatter.js +46 -0
  285. package/dist/utils/markdown-frontmatter.js.map +1 -1
  286. package/dist/utils/package-copy.js +5 -103
  287. package/dist/utils/package-copy.js.map +1 -1
  288. package/dist/utils/package-filters.js +9 -105
  289. package/dist/utils/package-filters.js.map +1 -1
  290. package/dist/utils/package-index-yml.js +27 -6
  291. package/dist/utils/package-index-yml.js.map +1 -1
  292. package/dist/utils/package-input.js +98 -0
  293. package/dist/utils/package-input.js.map +1 -0
  294. package/dist/utils/package-management.js +80 -28
  295. package/dist/utils/package-management.js.map +1 -1
  296. package/dist/utils/package-name-resolution.js +327 -0
  297. package/dist/utils/package-name-resolution.js.map +1 -0
  298. package/dist/utils/package-name.js +18 -16
  299. package/dist/utils/package-name.js.map +1 -1
  300. package/dist/utils/package-versioning.js +2 -33
  301. package/dist/utils/package-versioning.js.map +1 -1
  302. package/dist/utils/package-yml.js +19 -28
  303. package/dist/utils/package-yml.js.map +1 -1
  304. package/dist/utils/path-resolution.js +102 -0
  305. package/dist/utils/path-resolution.js.map +1 -0
  306. package/dist/utils/paths.js +6 -6
  307. package/dist/utils/paths.js.map +1 -1
  308. package/dist/utils/platform-file.js +36 -24
  309. package/dist/utils/platform-file.js.map +1 -1
  310. package/dist/utils/platform-mapper.js +222 -68
  311. package/dist/utils/platform-mapper.js.map +1 -1
  312. package/dist/utils/platform-root-files.js +44 -0
  313. package/dist/utils/platform-root-files.js.map +1 -0
  314. package/dist/utils/platform-utils.js +35 -54
  315. package/dist/utils/platform-utils.js.map +1 -1
  316. package/dist/utils/platform-yaml-merge.js +20 -140
  317. package/dist/utils/platform-yaml-merge.js.map +1 -1
  318. package/dist/utils/prompts.js +92 -7
  319. package/dist/utils/prompts.js.map +1 -1
  320. package/dist/utils/registry-entry-filter.js +50 -27
  321. package/dist/utils/registry-entry-filter.js.map +1 -1
  322. package/dist/utils/registry-paths.js +5 -4
  323. package/dist/utils/registry-paths.js.map +1 -1
  324. package/dist/utils/scope-resolution.js +156 -0
  325. package/dist/utils/scope-resolution.js.map +1 -0
  326. package/dist/utils/source-mutability.js +15 -0
  327. package/dist/utils/source-mutability.js.map +1 -0
  328. package/dist/utils/tarball.js +29 -4
  329. package/dist/utils/tarball.js.map +1 -1
  330. package/dist/utils/version-ranges.js +1 -32
  331. package/dist/utils/version-ranges.js.map +1 -1
  332. package/dist/utils/workspace-index-helpers.js +28 -0
  333. package/dist/utils/workspace-index-helpers.js.map +1 -0
  334. package/dist/utils/workspace-index-ownership.js +100 -0
  335. package/dist/utils/workspace-index-ownership.js.map +1 -0
  336. package/dist/utils/workspace-index-yml.js +173 -0
  337. package/dist/utils/workspace-index-yml.js.map +1 -0
  338. package/examples/custom-subdirs-platform.jsonc +157 -0
  339. package/package.json +7 -2
  340. package/platforms.jsonc +531 -84
  341. package/schemas/map-pipeline-v1.json +256 -0
  342. package/schemas/platforms-v1.json +400 -0
  343. package/specs/README.md +88 -0
  344. package/specs/add/README.md +166 -0
  345. package/specs/agents-claude.md +570 -0
  346. package/specs/agents-opencode.md +622 -0
  347. package/specs/apply/README.md +21 -0
  348. package/specs/apply/apply-behavior.md +58 -0
  349. package/specs/apply/apply-command.md +51 -0
  350. package/specs/apply/conflicts.md +41 -0
  351. package/specs/apply/index-effects.md +81 -0
  352. package/specs/architecture.md +107 -0
  353. package/specs/auth/README.md +17 -0
  354. package/specs/auth/auth-http-contract.md +25 -0
  355. package/specs/auth/cli/credentials.md +39 -0
  356. package/specs/auth/cli/login.md +32 -0
  357. package/specs/auth/cli/logout.md +16 -0
  358. package/specs/claude-mcp.md +1065 -0
  359. package/specs/claude-plugins-marketplace.md +363 -0
  360. package/specs/claude-plugins.md +413 -0
  361. package/specs/cli-options.md +52 -0
  362. package/specs/codex-mcp.md +114 -0
  363. package/specs/commands-overview.md +175 -0
  364. package/specs/directory-layout.md +95 -0
  365. package/specs/install/README.md +12 -4
  366. package/specs/install/git-sources.md +230 -0
  367. package/specs/install/install-behavior.md +483 -73
  368. package/specs/install/package-yml-canonical.md +67 -35
  369. package/specs/install/version-resolution.md +69 -115
  370. package/specs/new/README.md +769 -0
  371. package/specs/new/SUMMARY.md +310 -0
  372. package/specs/new/scope-behavior.md +793 -0
  373. package/specs/pack/README.md +77 -0
  374. package/specs/pack/package-name-resolution.md +330 -0
  375. package/specs/package/README.md +18 -17
  376. package/specs/package/nested-packages-and-parent-packages.md +32 -31
  377. package/specs/package/package-index-yml.md +95 -101
  378. package/specs/package/package-root-layout.md +64 -46
  379. package/specs/package/registry-payload-and-copy.md +50 -44
  380. package/specs/package/universal-content.md +33 -56
  381. package/specs/package-sources.md +248 -0
  382. package/specs/platforms/README.md +52 -0
  383. package/specs/platforms/configuration.md +571 -0
  384. package/specs/platforms/detection.md +552 -0
  385. package/specs/platforms/directory-layout.md +599 -0
  386. package/specs/platforms/examples.md +1146 -0
  387. package/specs/platforms/flow-reference.md +1240 -0
  388. package/specs/platforms/flows.md +1488 -0
  389. package/specs/platforms/map-pipeline.md +801 -0
  390. package/specs/platforms/overview.md +349 -0
  391. package/specs/platforms/specification.md +700 -0
  392. package/specs/platforms/troubleshooting.md +697 -0
  393. package/specs/platforms/universal-converter.md +520 -0
  394. package/specs/push/README.md +1 -0
  395. package/specs/push/push-behavior.md +11 -3
  396. package/specs/push/push-remote-upload.md +1 -1
  397. package/specs/push/push-scoping.md +1 -1
  398. package/specs/push/push-version-selection.md +1 -1
  399. package/specs/registry.md +111 -0
  400. package/specs/remove/README.md +257 -0
  401. package/specs/save/README.md +21 -17
  402. package/specs/save/save-conflict-resolution.md +205 -83
  403. package/specs/save/save-file-discovery.md +6 -4
  404. package/specs/save/save-frontmatter-overrides.md +11 -15
  405. package/specs/save/save-modes-inputs.md +9 -39
  406. package/specs/save/save-naming-scoping.md +4 -4
  407. package/specs/save/save-package-detection.md +13 -13
  408. package/specs/save/save-registry-sync.md +16 -106
  409. package/specs/save/save-versioning.md +80 -0
  410. package/specs/scope-management.md +92 -0
  411. package/specs/set/README.md +520 -0
  412. package/specs/set/set-behavior.md +563 -0
  413. package/specs/show/README.md +483 -0
  414. package/specs/show/show-remote.md +494 -0
  415. package/specs/status/README.md +38 -0
  416. package/specs/uninstall/README.md +231 -0
  417. package/dist/commands/duplicate.js +0 -69
  418. package/dist/commands/duplicate.js.map +0 -1
  419. package/dist/commands/init.js +0 -117
  420. package/dist/commands/init.js.map +0 -1
  421. package/dist/commands/prune.js +0 -357
  422. package/dist/commands/prune.js.map +0 -1
  423. package/dist/commands/tui.js +0 -61
  424. package/dist/commands/tui.js.map +0 -1
  425. package/dist/core/install/index.js +0 -3
  426. package/dist/core/install/index.js.map +0 -1
  427. package/dist/core/push/push-single-file.js +0 -56
  428. package/dist/core/push/push-single-file.js.map +0 -1
  429. package/dist/core/save/package-detection.js +0 -147
  430. package/dist/core/save/package-detection.js.map +0 -1
  431. package/dist/core/save/save-single-file.js +0 -124
  432. package/dist/core/save/save-single-file.js.map +0 -1
  433. package/dist/core/token-store.js +0 -73
  434. package/dist/core/token-store.js.map +0 -1
  435. package/dist/tui/app.js +0 -95
  436. package/dist/tui/app.js.map +0 -1
  437. package/dist/tui/components/package-list.js +0 -73
  438. package/dist/tui/components/package-list.js.map +0 -1
  439. package/dist/tui/controller.js +0 -365
  440. package/dist/tui/controller.js.map +0 -1
  441. package/dist/tui/index.js +0 -12
  442. package/dist/tui/index.js.map +0 -1
  443. package/dist/tui/services/file-index.js +0 -64
  444. package/dist/tui/services/file-index.js.map +0 -1
  445. package/dist/tui/services/packages.js +0 -18
  446. package/dist/tui/services/packages.js.map +0 -1
  447. package/dist/tui/services/save.js +0 -21
  448. package/dist/tui/services/save.js.map +0 -1
  449. package/dist/tui/state/app-state.js +0 -15
  450. package/dist/tui/state/app-state.js.map +0 -1
  451. package/dist/tui/state.js +0 -17
  452. package/dist/tui/state.js.map +0 -1
  453. package/dist/tui/types.js.map +0 -1
  454. package/dist/tui/views/add-file-modal.js +0 -129
  455. package/dist/tui/views/add-file-modal.js.map +0 -1
  456. package/dist/tui/views/file-preview.js +0 -44
  457. package/dist/tui/views/file-preview.js.map +0 -1
  458. package/dist/tui/views/list-packages.js +0 -73
  459. package/dist/tui/views/list-packages.js.map +0 -1
  460. package/dist/tui/views/main-menu.js +0 -29
  461. package/dist/tui/views/main-menu.js.map +0 -1
  462. package/dist/tui/views/manage-view.js +0 -81
  463. package/dist/tui/views/manage-view.js.map +0 -1
  464. package/dist/tui/views/package-hub.js +0 -120
  465. package/dist/tui/views/package-hub.js.map +0 -1
  466. package/dist/tui/views/placeholder.js +0 -24
  467. package/dist/tui/views/placeholder.js.map +0 -1
  468. package/dist/utils/bun-bootstrap.js +0 -72
  469. package/dist/utils/bun-bootstrap.js.map +0 -1
  470. package/dist/utils/entity-id.js +0 -19
  471. package/dist/utils/entity-id.js.map +0 -1
  472. package/dist/utils/package-local-files.js +0 -5
  473. package/dist/utils/package-local-files.js.map +0 -1
  474. package/dist/utils/path-matching.js +0 -74
  475. package/dist/utils/path-matching.js.map +0 -1
  476. package/dist/utils/root-file-operations.js +0 -39
  477. package/dist/utils/root-file-operations.js.map +0 -1
  478. package/dist/utils/root-file-transformer.js +0 -27
  479. package/dist/utils/root-file-transformer.js.map +0 -1
  480. package/dist/utils/yaml-frontmatter.js +0 -25
  481. package/dist/utils/yaml-frontmatter.js.map +0 -1
  482. package/specs/auth/auth-device-flow.md +0 -70
  483. package/specs/login/login-device-flow.md +0 -70
  484. package/specs/platforms.md +0 -193
  485. package/specs/save-pack-versioning.md +0 -224
  486. package/specs/save-pack.md +0 -68
  487. /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
+