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