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
@@ -1,15 +1,19 @@
1
- ### Package Index File (`package.index.yml`)
1
+ ### Workspace Index File (`.openpackage/openpackage.index.yml`)
2
2
 
3
- The `package.index.yml` file tracks the mapping between package files and their **actually installed** workspace locations.
3
+ The `openpackage.index.yml` file is the **unified workspace index**. It tracks:
4
+
5
+ - Installed packages (by name)
6
+ - Each package’s resolved **source path**
7
+ - Optional resolved **version**
8
+ - The file/directory mapping from **package-relative paths** to **workspace paths that were actually written**
4
9
 
5
10
  ---
6
11
 
7
12
  #### Location
8
13
 
9
- - **Root package**: `cwd/.openpackage/package.index.yml`
10
- - **Nested package**: `cwd/.openpackage/packages/<name>/.openpackage/package.index.yml`
14
+ - **Workspace-local metadata**: `cwd/.openpackage/openpackage.index.yml`
11
15
 
12
- > **Note**: `package.index.yml` is **never** included in the registry payload. It's workspace-local metadata.
16
+ > **Note**: `openpackage.index.yml` is **never** included in the registry payload. It's workspace-local metadata.
13
17
 
14
18
  ---
15
19
 
@@ -19,9 +23,8 @@ The following files are **never** included in the index, even though they may ex
19
23
 
20
24
  | File | Reason |
21
25
  |------|--------|
22
- | `package.yml` | Package manifest; not synced to workspace |
23
- | `.openpackage/package.yml` | Same as above (path variant) |
24
- | `package.index.yml` | Index file itself; workspace-local metadata |
26
+ | `openpackage.yml` | Package manifest; not synced as a regular content file |
27
+ | `openpackage.index.yml` | Index file itself; workspace-local metadata |
25
28
 
26
29
  The index only contains entries for content that is **actually synced** to workspace locations.
27
30
 
@@ -32,17 +35,42 @@ The index only contains entries for content that is **actually synced** to works
32
35
  ```yaml
33
36
  # This file is managed by OpenPackage. Do not edit manually.
34
37
 
35
- workspace:
36
- hash: <workspace-hash>
37
- version: <installed-version>
38
- files:
39
- <registry-key>:
40
- - <installed-path>
41
- - <installed-path>
42
- <registry-key>:
43
- - <installed-path>
38
+ packages:
39
+ <package-name>:
40
+ path: <declared-path> # string from openpackage.yml (relative or ~) or inferred registry path
41
+ version: <installed-version> # optional semver string
42
+ dependencies: # optional cached direct deps (names)
43
+ - <dep-name>
44
+ files:
45
+ <registry-key>:
46
+ - <installed-path> # Simple mapping (string)
47
+ - target: <installed-path> # Complex mapping (object)
48
+ merge: deep # Merge strategy (if applicable)
49
+ keys: # Tracked keys (if applicable)
50
+ - key.path.1
51
+ - key.path.2
44
52
  ```
45
53
 
54
+ **File mapping formats:**
55
+
56
+ 1. **Simple mapping** (string): For files owned entirely by one package
57
+ ```yaml
58
+ rules/typescript.md:
59
+ - .cursor/rules/typescript.md
60
+ ```
61
+
62
+ 2. **Complex mapping** (object): For merged files with key-level tracking
63
+ ```yaml
64
+ mcp.jsonc:
65
+ - target: .opencode/opencode.json
66
+ merge: deep
67
+ keys:
68
+ - mcp.server1
69
+ - mcp.server2
70
+ ```
71
+
72
+ The index can contain both formats mixed, depending on how each file was installed.
73
+
46
74
  ---
47
75
 
48
76
  #### Registry Keys
@@ -51,9 +79,10 @@ Registry keys are **relative to the package root**:
51
79
 
52
80
  | Content Type | Key Format | Example |
53
81
  |--------------|------------|---------|
54
- | Universal content | `.openpackage/<subdir>/<file>` | `.openpackage/commands/test.md` |
55
- | Root-level content | `<path>` | `<dir>/helper.md` |
82
+ | Universal content | `<subdir>/<file>` | `commands/test.md` |
56
83
  | Root files | `<filename>` | `AGENTS.md` |
84
+ | `root/` directory (direct copy) | `root/<path>` | `root/tools/helper.sh` |
85
+ | Directory mapping | `<dir>/` (trailing slash) | `rules/` |
57
86
 
58
87
  ---
59
88
 
@@ -64,108 +93,73 @@ Values are **relative to the workspace root (`cwd`)** and represent **paths that
64
93
  | Content Type | Value Format | Example |
65
94
  |--------------|--------------|---------|
66
95
  | Universal content | Platform-specific paths | `.cursor/commands/test.md`, `.opencode/commands/test.md` |
67
- | Root-level content | Same as key | `ai/helper.md` |
96
+ | Root files | Same as key | `AGENTS.md` |
97
+ | `root/` directory (direct copy) | Strip `root/` prefix | `tools/helper.sh` |
98
+ | Directory mapping | Workspace directory paths (end with `/`) | `.claude/rules/`, `.cursor/rules/` |
68
99
 
69
100
  > **Important**: The index only records paths where files **actually exist**. If a file is only installed to one platform (e.g., `.cursor/`), only that path appears in the index—not hypothetical paths for other platforms.
70
101
 
71
102
  ---
72
103
 
73
- #### Index Update Behavior
74
-
75
- The index is updated differently depending on the operation:
76
-
77
- | Operation | Behavior |
78
- |-----------|----------|
79
- | **Add** | Records only the source path that was used to add the file. If you add `.cursor/commands/test.md`, only that path is recorded. |
80
- | **Save/Sync** | Expands the index to include all platform paths where files were actually created during sync. |
81
- | **Install** | Populates the index with all platform paths where files were installed. |
82
-
83
- This ensures the index reflects the **current state** of the workspace, not hypothetical future states.
84
-
85
- ---
86
-
87
- #### Root Package Skip Logic
88
-
89
- For **root packages only**, when a registry key maps to the exact same value, the mapping is **skipped** because:
90
- - The file is already at the correct location
91
- - No installation/syncing needed
92
- - Avoids redundant mappings
93
-
94
- **Example**: For a root package, `<dir>/helper.md` → `<dir>/helper.md` is skipped.
95
-
96
- ---
97
-
98
- #### Nested Package Full Mapping
104
+ #### Key Tracking for Merged Files
99
105
 
100
- For **nested packages**, all mappings are included because:
101
- - Files live inside the nested package directory
102
- - Need to be mapped OUT to workspace root during install
106
+ When packages use flow-based transformations with merge strategies, the index tracks the specific keys each package contributes:
103
107
 
104
- **Example**: For nested package `foo`:
105
- - File at `.openpackage/packages/foo/<dir>/helper.md`
106
- - Key: `<dir>/helper.md`
107
- - Value: `<dir>/helper.md` (installed at workspace root)
108
+ **When keys are tracked:**
109
+ - Flow uses `merge: 'deep'` or `merge: 'shallow'`
110
+ - Target file will be shared by multiple packages
108
111
 
109
- ---
110
-
111
- #### Complete Examples
112
+ **When keys are NOT tracked:**
113
+ - `merge: 'replace'` - whole file owned by one package (simple string mapping)
114
+ - `merge: 'composite'` - delimiter-based tracking used instead
115
+ - Simple file copy - no merge (simple string mapping)
112
116
 
113
- **After `opkg add .cursor/commands/test.md`** (only source path recorded):
117
+ **Example with key tracking:**
114
118
 
115
119
  ```yaml
116
- workspace:
117
- hash: abc123
118
- version: 1.0.0-abc123.xyz
119
- files:
120
- .openpackage/commands/test.md:
121
- - .cursor/commands/test.md # Only the source path that exists
120
+ packages:
121
+ my-mcp-package:
122
+ path: ~/.openpackage/packages/my-mcp-package/1.0.0/
123
+ version: 1.0.0
124
+ files:
125
+ # Simple file mapping (no merge)
126
+ rules/typescript.md:
127
+ - .cursor/rules/typescript.md
128
+
129
+ # Complex mapping with key tracking
130
+ mcp.jsonc:
131
+ - target: .opencode/opencode.json
132
+ merge: deep
133
+ keys:
134
+ - mcp.server1
135
+ - mcp.server2
122
136
  ```
123
137
 
124
- **After `opkg save`** (all synced paths recorded):
125
-
126
- ```yaml
127
- workspace:
128
- hash: abc123
129
- version: 1.0.0-abc123.xyz
130
- files:
131
- .openpackage/commands/test.md:
132
- - .cursor/commands/test.md # Original source
133
- - .opencode/command/test.md # Synced by save
134
- .openpackage/rules/auth.md:
135
- - .cursor/rules/auth.mdc
136
- # Note: package.yml is NOT included (it's the manifest, not synced content)
137
- # Note: <dir>/helper.md is SKIPPED for root packages (maps to itself)
138
- ```
138
+ **Key notation:** Dot-notation represents nested object paths:
139
+ - `mcp.server1` → `{ mcp: { server1: {...} } }`
140
+ - `editor.fontSize` → `{ editor: { fontSize: 14 } }`
141
+ - `servers.db.host` → `{ servers: { db: { host: "..." } } }`
139
142
 
140
- **Nested package** (`cwd/.openpackage/packages/foo/.openpackage/package.index.yml`):
143
+ **Purpose:** Enables precise removal during uninstall. Only the tracked keys are removed from the target file, preserving content from other packages.
141
144
 
142
- ```yaml
143
- workspace:
144
- hash: abc123
145
- version: 1.0.0
146
- files:
147
- .openpackage/commands/test.md:
148
- - .cursor/commands/test.md
149
- - .opencode/command/test.md
150
- <dir>/helper.md:
151
- - <dir>/helper.md
152
- AGENTS.md:
153
- - AGENTS.md
154
- ```
145
+ See [Uninstall](../uninstall/README.md) for details on key-based removal.
155
146
 
156
147
  ---
157
148
 
158
- #### Add Command Examples
149
+ #### Index Update Behavior
150
+
151
+ The unified workspace index is updated differently depending on the operation:
159
152
 
160
- When adding files, the index only records the **source path that exists**:
153
+ | Operation | Behavior |
154
+ |-----------|----------|
155
+ | **Add** | Does **not** update the index. Add operates on package sources independently of workspace installation state. To sync added files to workspace and update the index, run `install` + `apply` or use `add --apply`. |
156
+ | **Apply** | Writes/updates `packages[<name>].files` based on what was actually written during apply. |
157
+ | **Install** | Writes/updates `packages[<name>].files` based on what was installed. |
158
+ | **Save** | Uses `packages[<name>].files` as the authoritative mapping when syncing workspace edits back to the package source. Requires package to be installed (reads from index). |
161
159
 
162
- | Command | Package | Stored At | Registry Key | Values (in index) |
163
- |---------|---------|-----------|--------------|-------------------|
164
- | `opkg add foo <dir>/foo.md` | Nested `foo` | `.openpackage/packages/foo/<dir>/foo.md` | `<dir>/foo.md` | `<dir>/foo.md` |
165
- | `opkg add foo .cursor/test/foo.md` | Nested `foo` | `.openpackage/packages/foo/.openpackage/test/foo.md` | `.openpackage/test/foo.md` | `.cursor/test/foo.md` (only source) |
166
- | `opkg add <dir>/foo.md` | Root | `.openpackage/<dir>/foo.md` | `<dir>/foo.md` | SKIPPED |
167
- | `opkg add .cursor/test/foo.md` | Root | `.openpackage/test/foo.md` | `.openpackage/test/foo.md` | `.cursor/test/foo.md` (only source) |
160
+ This ensures the index reflects the **current state** of the workspace, not hypothetical future states.
168
161
 
169
- > **Note**: After `opkg save`, the index will expand to include other platform paths (e.g., `.opencode/test/foo.md`) once those files are actually synced.
162
+ **Key principle**: The index is a record of what exists in the workspace, not what exists in package sources. Commands that materialize content to the workspace (`install`, `apply`) update the index. Commands that only modify sources (`add`) do not.
170
163
 
164
+ See `../apply/index-effects.md` for concrete before/after examples.
171
165
 
@@ -1,78 +1,96 @@
1
1
  ### Package Root Layout
2
2
 
3
- Every package root directory (workspace root, nested, or registry) uses this structure:
3
+ This document describes the **package payload layout** and how it relates to
4
+ workspace-local metadata.
4
5
 
5
6
  ```text
6
7
  <package-root>/
7
- .openpackage/ # REQUIRED – package content directory
8
- package.yml # REQUIRED – package manifest (marks this as a package)
9
- package.index.yml # OPTIONAL install/index metadata (never in registry payload)
10
- agents/ # universal content subdirs
11
- rules/
12
- commands/
13
- skills/
14
- <custom-subdirs>/ # any additional universal content
15
- <root-dirs>/ # OPTIONAL – root-level content (outside .openpackage/)
8
+ openpackage.yml # REQUIRED – package manifest (marks this as a package)
9
+
10
+ # Universal content (platform-mapped)
11
+ commands/ # standard + custom universal subdirs (from platforms.jsonc)
12
+ rules/
13
+ agents/
14
+ skills/
15
+ <custom-subdirs>/
16
+
17
+ # Root files (installed/processed)
16
18
  AGENTS.md # OPTIONAL – universal root file
17
- <other-root-files> # OPTIONAL – platform-specific root files (e.g. CLAUDE.md)
18
- README.md # OPTIONAL – documentation
19
- packages/ # OPTIONAL nested packages (workspace root only)
19
+ <platform-root-files> # OPTIONAL – platform-specific root files (e.g. CLAUDE.md)
20
+
21
+ # Direct copy to workspace root
22
+ root/ # OPTIONAL – files copied 1:1 into the workspace root
23
+ <any-files-or-dirs>/
24
+
25
+ # Other root-level files/dirs (not installed by default)
26
+ README.md # OPTIONAL – documentation (not installed)
27
+ LICENSE.md # OPTIONAL – license (not installed)
20
28
  ```
21
29
 
22
30
  ---
23
31
 
24
- #### Two Types of Package Content
32
+ #### Installation Semantics
33
+
34
+ 1. **Universal subdirs at package root** (`commands/`, `rules/`, `agents/`, `skills/`, plus any platform-defined custom subdirs):
35
+ - Stored in a platform-normalized “universal” format.
36
+ - Mapped to platform-specific locations during install (e.g., `.cursor/commands/`, `.opencode/commands/`).
25
37
 
26
- 1. **Root-level content** (outside `.openpackage/`):
27
- - Any files/directories at the package root (e.g., `<dir>/foo.md`, `AGENTS.md`, `CLAUDE.md`)
28
- - Live directly at the package root level, outside `.openpackage/`
29
- - Stored and mapped without transformation
38
+ 2. **Root files at package root**:
39
+ - `AGENTS.md` is universal and can be used to populate platform root files during install.
40
+ - Platform-specific root files at package root (e.g., `CLAUDE.md`) act as **overrides** when present.
30
41
 
31
- 2. **Universal content** (inside `.openpackage/`):
32
- - Platform-normalized files stored under `.openpackage/<subdir>/`
33
- - Source files like `.cursor/commands/test.md` are normalized to `.openpackage/commands/test.md`
34
- - Mapped to platform-specific locations during install (e.g., `.cursor/commands/`, `.opencode/commands/`)
42
+ 3. **`root/` directory**:
43
+ - Files under `root/**` are copied **1:1 to the workspace root**, stripping the `root/` prefix.
44
+ - Example: `root/tools/helper.sh` `<workspace>/tools/helper.sh`.
35
45
 
36
46
  ---
37
47
 
38
48
  #### Key Invariants
39
49
 
40
- - **`.openpackage/package.yml`** marks a directory as a package root.
41
- - **Universal content** (rules, agents, commands, skills, custom subdirs) lives **under `.openpackage/`**.
42
- - **Root-level content** (any directories/files outside `.openpackage/`) lives **at the package root** (sibling of `.openpackage/`).
43
- - **Nested packages** live under `packages/` and are treated as **independent packages**.
44
- - The **same structure** applies to workspace root packages, nested packages, and registry copies.
50
+ - **`openpackage.yml`** marks a directory as a package root.
51
+ - **Universal content** lives at the **package root** under universal subdirs (no `.openpackage/<subdir>/` container in package payloads).
52
+ - **Install mapping**:
53
+ - Universal-subdir paths are platform-mapped.
54
+ - `root/` is the only prefix that uses a **strip-prefix** rule (copy-to-root).
55
+ - Other root-level files/dirs are **not installed** by default.
56
+ - **Reserved directory**:
57
+ - `packages/` is reserved and **never included** in the package payload.
58
+ - **Nested workspace packages** live under `cwd/.openpackage/packages/<name>/` and are **canonical package roots** (same internal layout as any package root).
59
+ - **Global registry copies** (under `~/.openpackage/registry/...`) store the package payload layout and **never include** workspace index files.
45
60
 
46
61
  ---
47
62
 
48
63
  #### Concrete Examples
49
64
 
50
- **Workspace root package** (package root = `cwd/`):
65
+ **Package repo on disk** (payload shape; same shape used in registry copies):
51
66
 
52
67
  ```text
53
- cwd/
54
- .openpackage/
55
- package.yml
56
- package.index.yml
57
- commands/
58
- test.md
59
- rules/
60
- auth.md
61
- <root-dir>/ # any root-level directory
62
- helper.md
68
+ <package-root>/
69
+ openpackage.yml
70
+ commands/
71
+ test.md
72
+ rules/
73
+ auth.md
63
74
  AGENTS.md
75
+ root/
76
+ tools/
77
+ helper.sh
78
+ README.md
64
79
  ```
65
80
 
66
- **Nested package** (package root = `cwd/.openpackage/packages/foo/`):
81
+ **Workspace metadata + nested workspace package** (package root = `cwd/.openpackage/packages/foo/`):
67
82
 
68
83
  ```text
69
- cwd/.openpackage/packages/foo/
84
+ cwd/
70
85
  .openpackage/
71
- package.yml
72
- package.index.yml
73
- commands/
74
- test.md
75
- <root-dir>/ # any root-level directory
76
- helper.md
86
+ openpackage.yml # workspace manifest (dependency intent)
87
+ openpackage.index.yml # workspace index (never in registry payload)
88
+ packages/
89
+ foo/
90
+ openpackage.yml # nested package manifest (package root)
91
+ commands/
92
+ test.md
93
+ root/
94
+ tools/helper.sh
77
95
  ```
78
96
 
@@ -1,77 +1,83 @@
1
1
  ### Registry Payload and 1:1 Copy
2
2
 
3
- The **registry payload** for a given version is defined by two layers of rules.
3
+ The **registry payload** for a given version is defined structurally. There is
4
+ no manifest-level include/exclude filtering.
4
5
 
5
6
  ---
6
7
 
7
- #### 1. Static Rules
8
+ #### 1. Payload membership
8
9
 
9
- **Always exclude:**
10
- - `package.index.yml` (workspace-local metadata)
11
- - Anything under `packages/` (nested packages are separate units)
10
+ **Never include (always excluded):**
11
+ - `.openpackage/**` (workspace-local metadata directory; never part of payload)
12
+ - `openpackage.index.yml` (workspace-local index; never part of payload)
13
+ - `packages/**` (reserved; never part of payload)
12
14
 
13
- **Always include (cannot be excluded):**
14
- - `.openpackage/package.yml` (package manifest)
15
+ **Always include:**
16
+ - `openpackage.yml` (package manifest; marks the package root)
15
17
 
16
- **Included by default (removable via manifest `exclude`):**
17
- - Every platform root file declared in `platforms.jsonc` (e.g., `CLAUDE.md`, `WARP.md`, `AGENTS.md`) when it exists
18
- - Any `.openpackage/<universal-subdir>/…` directory (agents, rules, commands, skills, etc.)
19
- - Any root-level content (directories/files at package root, outside `.openpackage/`)
18
+ **Included in the payload when present at the package root:**
19
+ - Universal subdirs (standard: `commands/`, `rules/`, `agents/`, `skills/`, plus custom from `platforms.jsonc`)
20
+ - Root files (e.g., `AGENTS.md`, and platform root files like `CLAUDE.md`)
21
+ - `root/**` (direct copy; copied 1:1 to workspace root with `root/` stripped on install)
22
+ - Other root-level files/dirs (e.g., `README.md`, `LICENSE.md`, arbitrary folders)
20
23
 
21
- **Everything else starts excluded by default.**
24
+ > **Note**: Some root-level content is not installed by default, but it can still be
25
+ > part of the payload (e.g., docs or license files).
22
26
 
23
27
  ---
24
28
 
25
- #### 2. Manifest Filters
29
+ #### Save, Pack, and Install Operations
26
30
 
27
- In `package.yml`:
31
+ **Pack (Source → Registry)**:
32
+ - From mutable source, creates immutable snapshot in `~/.openpackage/registry/<name>/<version>/`.
33
+ - Copies full package root (per payload rules); idempotent overwrite.
34
+ - Example: `opkg pack my-pkg` → dir copy, no extraction.
28
35
 
29
- - **`include`** (array): Expands the payload by listing additional glob-like patterns relative to the package root
30
- - **`exclude`** (array): Removes matches after include rules are applied (but never overrides hard includes/excludes)
36
+ **Save (Workspace Source, then optional pack)**:
37
+ - Syncs edits to mutable source root.
38
+ - Files written unchanged; can pack after to registry.
39
+ - Does not directly write to registry (pack does that).
31
40
 
32
- > **Note**: Newly created nested packages default their `package.yml` to `include: ["**"]`, so they start including all files until the author narrows the list.
41
+ **Install/Apply (Registry/Source Workspace)**:
42
+ - Reads from registry version dir or source path.
43
+ - Maps payload to workspace (universal → platforms, root/ → root, root files → root).
44
+ - Updates index with mappings; yml with intent (no path for registry).
45
+ - Example: `opkg install my-pkg@1.0.0` → copies from registry dir.
33
46
 
34
- ---
35
-
36
- #### Save and Install Operations
37
-
38
- **When saving:**
39
-
40
- 1. The save pipeline reads files from the package root using the rules above
41
- 2. Files are written **unchanged** to: `~/.openpackage/registry/<name>/<version>/...`
42
-
43
- **When installing:**
44
-
45
- 1. The install pipeline loads `pkg.files` from the registry
46
- 2. Files are written 1:1 to: `cwd/.openpackage/packages/<name>/...` for local cache
47
- 3. Universal content is mapped to platform-specific locations in the workspace
47
+ > **Note**: `cwd/.openpackage/packages/` reserved for nested workspace packages. See [Pack](pack/), [Install](install/), [Save](save/) for flows; [Registry](registry.md) for storage.
48
48
 
49
49
  ---
50
50
 
51
- #### Package Structure in Registry
51
+ #### Example Registry Version Directory
52
52
 
53
- Registry copies maintain the same structure as workspace packages:
53
+ Each version directory in the registry is a complete, self-contained copy of the package root (per payload rules above):
54
54
 
55
55
  ```text
56
- ~/.openpackage/registry/<name>/<version>/
57
- .openpackage/
58
- package.yml # package manifest
59
- commands/ # universal content
60
- test.md
61
- rules/
62
- auth.md
63
- <root-dir>/ # root-level content (any directory)
64
- helper.md
65
- AGENTS.md # root files
56
+ ~/.openpackage/registry/my-rules/1.0.0/
57
+ ├── openpackage.yml # Package manifest (name, version, deps)
58
+ ├── commands/ # Universal subdirs (from platforms.jsonc)
59
+ │ └── *.md
60
+ ├── rules/
61
+ │ └── *.md
62
+ ├── agents/ # Example universal subdir
63
+ │ └── *.md
64
+ ├── root/ # Copy-to-root content (prefix stripped on install)
65
+ │ └── utils/
66
+ │ └── helper.md
67
+ ├── AGENTS.md # Root files (universal or platform-specific)
68
+ └── README.md # Other root files (docs, etc.)
66
69
  ```
67
70
 
71
+ - Matches [Package Root Layout](package-root-layout.md).
72
+ - Installed via [Install Flow](install/install-behavior.md).
73
+
68
74
  ---
69
75
 
70
76
  #### Guarantees
71
77
 
72
78
  This system guarantees that:
73
79
 
74
- - The **workspace package**, **local cache**, and **registry version directory** all share the **same tree shape**
80
+ - The **workspace package root** (root or nested) and the **registry version directory** share the **same tree shape**
75
81
  - Save and install operations are **pure copies** at the package boundary, without structural rewrites
76
82
  - Packages can be moved between locations (workspace root ↔ nested ↔ registry) without modification
77
83