opkg 0.5.0 → 0.6.1

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 (397) hide show
  1. package/README.md +82 -21
  2. package/dist/commands/add.js +11 -276
  3. package/dist/commands/add.js.map +1 -1
  4. package/dist/commands/duplicate.js +5 -2
  5. package/dist/commands/duplicate.js.map +1 -1
  6. package/dist/commands/init.js +76 -145
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/install.js +30 -671
  9. package/dist/commands/install.js.map +1 -1
  10. package/dist/commands/list.js +9 -3
  11. package/dist/commands/list.js.map +1 -1
  12. package/dist/commands/login.js +58 -0
  13. package/dist/commands/login.js.map +1 -0
  14. package/dist/commands/logout.js +28 -0
  15. package/dist/commands/logout.js.map +1 -0
  16. package/dist/commands/pack.js +10 -137
  17. package/dist/commands/pack.js.map +1 -1
  18. package/dist/commands/pull.js +5 -299
  19. package/dist/commands/pull.js.map +1 -1
  20. package/dist/commands/push.js +5 -239
  21. package/dist/commands/push.js.map +1 -1
  22. package/dist/commands/save.js +29 -168
  23. package/dist/commands/save.js.map +1 -1
  24. package/dist/commands/show.js +18 -5
  25. package/dist/commands/show.js.map +1 -1
  26. package/dist/commands/status.js +21 -8
  27. package/dist/commands/status.js.map +1 -1
  28. package/dist/commands/tui.js +61 -0
  29. package/dist/commands/tui.js.map +1 -0
  30. package/dist/commands/uninstall.js +5 -5
  31. package/dist/commands/uninstall.js.map +1 -1
  32. package/dist/constants/index.js +19 -45
  33. package/dist/constants/index.js.map +1 -1
  34. package/dist/constants/workspace.js +9 -0
  35. package/dist/constants/workspace.js.map +1 -0
  36. package/dist/core/add/add-conflict-handler.js +68 -0
  37. package/dist/core/add/add-conflict-handler.js.map +1 -0
  38. package/dist/core/add/add-pipeline.js +137 -0
  39. package/dist/core/add/add-pipeline.js.map +1 -0
  40. package/dist/core/add/package-index-updater.js +66 -36
  41. package/dist/core/add/package-index-updater.js.map +1 -1
  42. package/dist/core/add/platform-path-transformer.js +47 -0
  43. package/dist/core/add/platform-path-transformer.js.map +1 -0
  44. package/dist/core/add/source-collector.js +57 -0
  45. package/dist/core/add/source-collector.js.map +1 -0
  46. package/dist/core/api-keys.js +6 -2
  47. package/dist/core/api-keys.js.map +1 -1
  48. package/dist/core/auth.js +25 -40
  49. package/dist/core/auth.js.map +1 -1
  50. package/dist/core/config.js +11 -3
  51. package/dist/core/config.js.map +1 -1
  52. package/dist/core/dependency-resolver.js +24 -11
  53. package/dist/core/dependency-resolver.js.map +1 -1
  54. package/dist/core/device-auth.js +81 -0
  55. package/dist/core/device-auth.js.map +1 -0
  56. package/dist/core/directory.js +15 -9
  57. package/dist/core/directory.js.map +1 -1
  58. package/dist/core/discovery/file-discovery.js +55 -54
  59. package/dist/core/discovery/file-discovery.js.map +1 -1
  60. package/dist/core/discovery/platform-files-discovery.js +32 -17
  61. package/dist/core/discovery/platform-files-discovery.js.map +1 -1
  62. package/dist/core/install/bulk-install-pipeline.js +200 -0
  63. package/dist/core/install/bulk-install-pipeline.js.map +1 -0
  64. package/dist/core/install/canonical-plan.js +129 -0
  65. package/dist/core/install/canonical-plan.js.map +1 -0
  66. package/dist/core/install/download-keys.js +2 -2
  67. package/dist/core/install/download-keys.js.map +1 -1
  68. package/dist/core/install/dry-run.js +2 -2
  69. package/dist/core/install/dry-run.js.map +1 -1
  70. package/dist/core/install/index.js +3 -0
  71. package/dist/core/install/index.js.map +1 -0
  72. package/dist/core/install/install-errors.js +41 -0
  73. package/dist/core/install/install-errors.js.map +1 -0
  74. package/dist/core/install/install-flow.js +8 -9
  75. package/dist/core/install/install-flow.js.map +1 -1
  76. package/dist/core/install/install-pipeline.js +296 -0
  77. package/dist/core/install/install-pipeline.js.map +1 -0
  78. package/dist/core/install/install-reporting.js +99 -0
  79. package/dist/core/install/install-reporting.js.map +1 -0
  80. package/dist/core/install/platform-resolution.js +6 -6
  81. package/dist/core/install/platform-resolution.js.map +1 -1
  82. package/dist/core/install/remote-flow.js +84 -7
  83. package/dist/core/install/remote-flow.js.map +1 -1
  84. package/dist/core/install/version-selection.js +25 -8
  85. package/dist/core/install/version-selection.js.map +1 -1
  86. package/dist/core/openpackage.js +22 -14
  87. package/dist/core/openpackage.js.map +1 -1
  88. package/dist/core/package-context.js +246 -0
  89. package/dist/core/package-context.js.map +1 -0
  90. package/dist/core/package.js +73 -9
  91. package/dist/core/package.js.map +1 -1
  92. package/dist/core/platforms.js +126 -217
  93. package/dist/core/platforms.js.map +1 -1
  94. package/dist/core/profiles.js +60 -3
  95. package/dist/core/profiles.js.map +1 -1
  96. package/dist/core/pull/pull-errors.js +62 -0
  97. package/dist/core/pull/pull-errors.js.map +1 -0
  98. package/dist/core/pull/pull-options.js +2 -0
  99. package/dist/core/pull/pull-options.js.map +1 -0
  100. package/dist/core/pull/pull-output.js +50 -0
  101. package/dist/core/pull/pull-output.js.map +1 -0
  102. package/dist/core/pull/pull-pipeline.js +141 -0
  103. package/dist/core/pull/pull-pipeline.js.map +1 -0
  104. package/dist/core/pull/pull-strategies.js +103 -0
  105. package/dist/core/pull/pull-strategies.js.map +1 -0
  106. package/dist/core/pull/pull-types.js +2 -0
  107. package/dist/core/pull/pull-types.js.map +1 -0
  108. package/dist/core/push/push-context.js +95 -0
  109. package/dist/core/push/push-context.js.map +1 -0
  110. package/dist/core/push/push-errors.js +133 -0
  111. package/dist/core/push/push-errors.js.map +1 -0
  112. package/dist/core/push/push-output.js +44 -0
  113. package/dist/core/push/push-output.js.map +1 -0
  114. package/dist/core/push/push-pipeline.js +74 -0
  115. package/dist/core/push/push-pipeline.js.map +1 -0
  116. package/dist/core/push/push-single-file.js +56 -0
  117. package/dist/core/push/push-single-file.js.map +1 -0
  118. package/dist/core/push/push-types.js +2 -0
  119. package/dist/core/push/push-types.js.map +1 -0
  120. package/dist/core/push/push-upload.js +68 -0
  121. package/dist/core/push/push-upload.js.map +1 -0
  122. package/dist/core/registry/registry-rename.js +2 -1
  123. package/dist/core/registry/registry-rename.js.map +1 -1
  124. package/dist/core/registry.js +14 -5
  125. package/dist/core/registry.js.map +1 -1
  126. package/dist/core/remote-pull.js +165 -36
  127. package/dist/core/remote-pull.js.map +1 -1
  128. package/dist/core/save/constants.js +4 -0
  129. package/dist/core/save/constants.js.map +1 -1
  130. package/dist/core/save/name-resolution.js +31 -0
  131. package/dist/core/save/name-resolution.js.map +1 -0
  132. package/dist/core/save/package-detection.js +147 -0
  133. package/dist/core/save/package-detection.js.map +1 -0
  134. package/dist/core/save/package-saver.js +82 -43
  135. package/dist/core/save/package-saver.js.map +1 -1
  136. package/dist/core/save/package-yml-generator.js +51 -71
  137. package/dist/core/save/package-yml-generator.js.map +1 -1
  138. package/dist/core/save/root-save-candidates.js.map +1 -1
  139. package/dist/core/save/save-candidate-loader.js +89 -0
  140. package/dist/core/save/save-candidate-loader.js.map +1 -0
  141. package/dist/core/save/save-conflict-resolution.js +72 -410
  142. package/dist/core/save/save-conflict-resolution.js.map +1 -1
  143. package/dist/core/save/save-conflict-resolver.js +277 -0
  144. package/dist/core/save/save-conflict-resolver.js.map +1 -0
  145. package/dist/core/save/save-pipeline.js +162 -0
  146. package/dist/core/save/save-pipeline.js.map +1 -0
  147. package/dist/core/save/save-single-file.js +124 -0
  148. package/dist/core/save/save-single-file.js.map +1 -0
  149. package/dist/core/save/save-types.js +2 -0
  150. package/dist/core/save/save-types.js.map +1 -0
  151. package/dist/core/save/save-yml-resolution.js +77 -39
  152. package/dist/core/save/save-yml-resolution.js.map +1 -1
  153. package/dist/core/save/workspace-rename.js +6 -6
  154. package/dist/core/save/workspace-rename.js.map +1 -1
  155. package/dist/core/scoping/package-scoping.js +14 -2
  156. package/dist/core/scoping/package-scoping.js.map +1 -1
  157. package/dist/core/status/status-file-discovery.js +12 -30
  158. package/dist/core/status/status-file-discovery.js.map +1 -1
  159. package/dist/core/sync/platform-sync.js +7 -4
  160. package/dist/core/sync/platform-sync.js.map +1 -1
  161. package/dist/core/sync/root-files-sync.js +59 -1
  162. package/dist/core/sync/root-files-sync.js.map +1 -1
  163. package/dist/core/token-store.js +73 -0
  164. package/dist/core/token-store.js.map +1 -0
  165. package/dist/core/uninstall/uninstall-file-discovery.js +1 -2
  166. package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
  167. package/dist/index.js +4 -0
  168. package/dist/index.js.map +1 -1
  169. package/dist/tui/app.js +95 -0
  170. package/dist/tui/app.js.map +1 -0
  171. package/dist/tui/components/package-list.js +73 -0
  172. package/dist/tui/components/package-list.js.map +1 -0
  173. package/dist/tui/controller.js +365 -0
  174. package/dist/tui/controller.js.map +1 -0
  175. package/dist/tui/index.js +12 -0
  176. package/dist/tui/index.js.map +1 -0
  177. package/dist/tui/services/file-index.js +64 -0
  178. package/dist/tui/services/file-index.js.map +1 -0
  179. package/dist/tui/services/packages.js +18 -0
  180. package/dist/tui/services/packages.js.map +1 -0
  181. package/dist/tui/services/save.js +21 -0
  182. package/dist/tui/services/save.js.map +1 -0
  183. package/dist/tui/state/app-state.js +15 -0
  184. package/dist/tui/state/app-state.js.map +1 -0
  185. package/dist/tui/state.js +17 -0
  186. package/dist/tui/state.js.map +1 -0
  187. package/dist/tui/types.js +2 -0
  188. package/dist/tui/types.js.map +1 -0
  189. package/dist/tui/views/add-file-modal.js +129 -0
  190. package/dist/tui/views/add-file-modal.js.map +1 -0
  191. package/dist/tui/views/file-preview.js +44 -0
  192. package/dist/tui/views/file-preview.js.map +1 -0
  193. package/dist/tui/views/list-packages.js +73 -0
  194. package/dist/tui/views/list-packages.js.map +1 -0
  195. package/dist/tui/views/main-menu.js +29 -0
  196. package/dist/tui/views/main-menu.js.map +1 -0
  197. package/dist/tui/views/manage-view.js +81 -0
  198. package/dist/tui/views/manage-view.js.map +1 -0
  199. package/dist/tui/views/package-hub.js +120 -0
  200. package/dist/tui/views/package-hub.js.map +1 -0
  201. package/dist/tui/views/placeholder.js +24 -0
  202. package/dist/tui/views/placeholder.js.map +1 -0
  203. package/dist/types/index.js.map +1 -1
  204. package/dist/utils/bun-bootstrap.js +72 -0
  205. package/dist/utils/bun-bootstrap.js.map +1 -0
  206. package/dist/utils/file-processing.js +5 -58
  207. package/dist/utils/file-processing.js.map +1 -1
  208. package/dist/utils/formatters.js +3 -1
  209. package/dist/utils/formatters.js.map +1 -1
  210. package/dist/utils/http-client.js +27 -5
  211. package/dist/utils/http-client.js.map +1 -1
  212. package/dist/utils/index-based-installer.js +40 -35
  213. package/dist/utils/index-based-installer.js.map +1 -1
  214. package/dist/utils/install-file-discovery.js +18 -24
  215. package/dist/utils/install-file-discovery.js.map +1 -1
  216. package/dist/utils/install-orchestrator.js +21 -21
  217. package/dist/utils/install-orchestrator.js.map +1 -1
  218. package/dist/utils/jsonc.js +44 -0
  219. package/dist/utils/jsonc.js.map +1 -0
  220. package/dist/utils/manifest-paths.js +27 -0
  221. package/dist/utils/manifest-paths.js.map +1 -0
  222. package/dist/utils/package-copy.js +199 -0
  223. package/dist/utils/package-copy.js.map +1 -0
  224. package/dist/utils/package-filters.js +125 -0
  225. package/dist/utils/package-filters.js.map +1 -0
  226. package/dist/utils/package-index-yml.js +15 -10
  227. package/dist/utils/package-index-yml.js.map +1 -1
  228. package/dist/utils/package-installation.js +4 -113
  229. package/dist/utils/package-installation.js.map +1 -1
  230. package/dist/utils/package-local-files.js +2 -35
  231. package/dist/utils/package-local-files.js.map +1 -1
  232. package/dist/utils/package-management.js +191 -75
  233. package/dist/utils/package-management.js.map +1 -1
  234. package/dist/utils/package-merge.js +48 -0
  235. package/dist/utils/package-merge.js.map +1 -0
  236. package/dist/utils/package-name.js +29 -0
  237. package/dist/utils/package-name.js.map +1 -1
  238. package/dist/utils/package-versioning.js +16 -4
  239. package/dist/utils/package-versioning.js.map +1 -1
  240. package/dist/utils/package-yml.js +41 -12
  241. package/dist/utils/package-yml.js.map +1 -1
  242. package/dist/utils/path-normalization.js +8 -53
  243. package/dist/utils/path-normalization.js.map +1 -1
  244. package/dist/utils/paths.js +17 -9
  245. package/dist/utils/paths.js.map +1 -1
  246. package/dist/utils/platform-file.js +16 -59
  247. package/dist/utils/platform-file.js.map +1 -1
  248. package/dist/utils/platform-mapper.js +29 -41
  249. package/dist/utils/platform-mapper.js.map +1 -1
  250. package/dist/utils/platform-specific-paths.js.map +1 -1
  251. package/dist/utils/platform-utils.js +28 -139
  252. package/dist/utils/platform-utils.js.map +1 -1
  253. package/dist/utils/platform-yaml-merge.js +13 -6
  254. package/dist/utils/platform-yaml-merge.js.map +1 -1
  255. package/dist/utils/prompts.js +0 -31
  256. package/dist/utils/prompts.js.map +1 -1
  257. package/dist/utils/registry-entry-filter.js +38 -24
  258. package/dist/utils/registry-entry-filter.js.map +1 -1
  259. package/dist/utils/registry-paths.js +48 -0
  260. package/dist/utils/registry-paths.js.map +1 -0
  261. package/dist/utils/root-file-installer.js +19 -0
  262. package/dist/utils/root-file-installer.js.map +1 -1
  263. package/dist/utils/root-file-registry.js.map +1 -1
  264. package/dist/utils/tarball.js +6 -2
  265. package/dist/utils/tarball.js.map +1 -1
  266. package/dist/utils/version-ranges.js +11 -8
  267. package/dist/utils/version-ranges.js.map +1 -1
  268. package/package.json +3 -2
  269. package/platforms.jsonc +178 -0
  270. package/specs/auth/auth-device-flow.md +70 -0
  271. package/specs/install/install-behavior.md +30 -0
  272. package/specs/install/package-yml-canonical.md +21 -1
  273. package/specs/install/version-resolution.md +9 -7
  274. package/specs/login/login-device-flow.md +70 -0
  275. package/specs/package/README.md +60 -0
  276. package/specs/package/nested-packages-and-parent-packages.md +79 -0
  277. package/specs/package/package-index-yml.md +171 -0
  278. package/specs/package/package-root-layout.md +78 -0
  279. package/specs/package/registry-payload-and-copy.md +77 -0
  280. package/specs/package/universal-content.md +144 -0
  281. package/specs/platforms.md +193 -0
  282. package/specs/push/push-behavior.md +38 -10
  283. package/specs/push/push-errors-and-hints.md +19 -6
  284. package/specs/push/push-remote-upload.md +3 -0
  285. package/specs/push/push-scoping.md +14 -22
  286. package/specs/push/push-version-selection.md +18 -16
  287. package/specs/save/README.md +40 -0
  288. package/specs/save/save-conflict-resolution.md +146 -0
  289. package/specs/save/save-file-discovery.md +101 -0
  290. package/specs/save/save-frontmatter-overrides.md +81 -0
  291. package/specs/save/save-modes-inputs.md +55 -0
  292. package/specs/save/save-naming-scoping.md +93 -0
  293. package/specs/save/save-package-detection.md +60 -0
  294. package/specs/save/save-registry-sync.md +126 -0
  295. package/specs/save-pack.md +1 -0
  296. package/dist/commands/release.js +0 -33
  297. package/dist/commands/release.js.map +0 -1
  298. package/dist/commands/tag.js +0 -311
  299. package/dist/commands/tag.js.map +0 -1
  300. package/dist/commands/update.js +0 -30
  301. package/dist/commands/update.js.map +0 -1
  302. package/dist/core/add/formula-index-updater.js +0 -290
  303. package/dist/core/add/formula-index-updater.js.map +0 -1
  304. package/dist/core/discovery/ai-files-discovery.js +0 -2
  305. package/dist/core/discovery/ai-files-discovery.js.map +0 -1
  306. package/dist/core/discovery/formula-files-discovery.js +0 -14
  307. package/dist/core/discovery/formula-files-discovery.js.map +0 -1
  308. package/dist/core/discovery/index-files-discovery.js +0 -91
  309. package/dist/core/discovery/index-files-discovery.js.map +0 -1
  310. package/dist/core/discovery/md-files-discovery.js +0 -82
  311. package/dist/core/discovery/md-files-discovery.js.map +0 -1
  312. package/dist/core/discovery/package-files-discovery.js +0 -14
  313. package/dist/core/discovery/package-files-discovery.js.map +0 -1
  314. package/dist/core/discovery/platform-discovery.js +0 -84
  315. package/dist/core/discovery/platform-discovery.js.map +0 -1
  316. package/dist/core/discovery/root-files-discovery.js +0 -2
  317. package/dist/core/discovery/root-files-discovery.js.map +0 -1
  318. package/dist/core/formula.js +0 -170
  319. package/dist/core/formula.js.map +0 -1
  320. package/dist/core/git-registry.js +0 -46
  321. package/dist/core/git-registry.js.map +0 -1
  322. package/dist/core/groundzero.js +0 -277
  323. package/dist/core/groundzero.js.map +0 -1
  324. package/dist/core/install/scenario.js +0 -11
  325. package/dist/core/install/scenario.js.map +0 -1
  326. package/dist/core/package-sync.js +0 -219
  327. package/dist/core/package-sync.js.map +0 -1
  328. package/dist/core/save/formula-file-generator.js +0 -167
  329. package/dist/core/save/formula-file-generator.js.map +0 -1
  330. package/dist/core/save/formula-saver.js +0 -52
  331. package/dist/core/save/formula-saver.js.map +0 -1
  332. package/dist/core/save/formula-yml-generator.js +0 -89
  333. package/dist/core/save/formula-yml-generator.js.map +0 -1
  334. package/dist/core/save/formula-yml-versioning.js +0 -108
  335. package/dist/core/save/formula-yml-versioning.js.map +0 -1
  336. package/dist/core/save/generic-file-sync.js +0 -38
  337. package/dist/core/save/generic-file-sync.js.map +0 -1
  338. package/dist/core/save/md-files-sync.js +0 -33
  339. package/dist/core/save/md-files-sync.js.map +0 -1
  340. package/dist/core/save/package-yml-versioning.js +0 -108
  341. package/dist/core/save/package-yml-versioning.js.map +0 -1
  342. package/dist/core/save/platform-sync.js +0 -95
  343. package/dist/core/save/platform-sync.js.map +0 -1
  344. package/dist/core/save/root-files-sync.js +0 -140
  345. package/dist/core/save/root-files-sync.js.map +0 -1
  346. package/dist/core/save/save-candidate-types.js +0 -2
  347. package/dist/core/save/save-candidate-types.js.map +0 -1
  348. package/dist/core/save/save-conflict-types.js +0 -2
  349. package/dist/core/save/save-conflict-types.js.map +0 -1
  350. package/dist/core/save/save-file-discovery.js +0 -5
  351. package/dist/core/save/save-file-discovery.js.map +0 -1
  352. package/dist/core/status-file-discovery.js +0 -175
  353. package/dist/core/status-file-discovery.js.map +0 -1
  354. package/dist/utils/discovery/file-processing.js +0 -156
  355. package/dist/utils/discovery/file-processing.js.map +0 -1
  356. package/dist/utils/discovery/formula-discovery.js +0 -211
  357. package/dist/utils/discovery/formula-discovery.js.map +0 -1
  358. package/dist/utils/discovery/platform-discovery.js +0 -2
  359. package/dist/utils/discovery/platform-discovery.js.map +0 -1
  360. package/dist/utils/formula-discovery.js +0 -102
  361. package/dist/utils/formula-discovery.js.map +0 -1
  362. package/dist/utils/formula-index-yml.js +0 -122
  363. package/dist/utils/formula-index-yml.js.map +0 -1
  364. package/dist/utils/formula-installation.js +0 -110
  365. package/dist/utils/formula-installation.js.map +0 -1
  366. package/dist/utils/formula-local-files.js +0 -38
  367. package/dist/utils/formula-local-files.js.map +0 -1
  368. package/dist/utils/formula-management.js +0 -191
  369. package/dist/utils/formula-management.js.map +0 -1
  370. package/dist/utils/formula-name.js +0 -97
  371. package/dist/utils/formula-name.js.map +0 -1
  372. package/dist/utils/formula-versioning.js +0 -109
  373. package/dist/utils/formula-versioning.js.map +0 -1
  374. package/dist/utils/formula-yml.js +0 -82
  375. package/dist/utils/formula-yml.js.map +0 -1
  376. package/dist/utils/git.js +0 -54
  377. package/dist/utils/git.js.map +0 -1
  378. package/dist/utils/id-based-discovery.js +0 -126
  379. package/dist/utils/id-based-discovery.js.map +0 -1
  380. package/dist/utils/id-based-installer.js +0 -249
  381. package/dist/utils/id-based-installer.js.map +0 -1
  382. package/dist/utils/index-yml-based-installer.js +0 -375
  383. package/dist/utils/index-yml-based-installer.js.map +0 -1
  384. package/dist/utils/index-yml.js +0 -124
  385. package/dist/utils/index-yml.js.map +0 -1
  386. package/dist/utils/md-frontmatter.js +0 -3
  387. package/dist/utils/md-frontmatter.js.map +0 -1
  388. package/dist/utils/package-link-yml.js +0 -92
  389. package/dist/utils/package-link-yml.js.map +0 -1
  390. package/dist/utils/platform-discovery.js +0 -2
  391. package/dist/utils/platform-discovery.js.map +0 -1
  392. package/dist/utils/platform-frontmatter-split.js +0 -15
  393. package/dist/utils/platform-frontmatter-split.js.map +0 -1
  394. package/dist/utils/timestamp-encoder.js +0 -13
  395. package/dist/utils/timestamp-encoder.js.map +0 -1
  396. package/dist/utils/wip-versioning.js +0 -24
  397. package/dist/utils/wip-versioning.js.map +0 -1
@@ -1,14 +1,18 @@
1
1
  import { join, dirname } from 'path';
2
2
  import * as yaml from 'js-yaml';
3
+ import { FILE_PATTERNS } from '../constants/index.js';
3
4
  import { exists, readTextFile, writeTextFile, ensureDir } from './fs.js';
4
- import { getLocalPackageDir } from './paths.js';
5
+ import { getLocalOpenPackageDir, getLocalPackageContentDir } from './paths.js';
5
6
  import { normalizePathForProcessing } from './path-normalization.js';
6
7
  import { logger } from './logger.js';
7
- export const PACKAGE_INDEX_FILENAME = 'package.index.yml';
8
8
  const HEADER_COMMENT = '# This file is managed by OpenPackage. Do not edit manually.';
9
- export function getPackageIndexPath(cwd, packageName) {
10
- const packageDir = getLocalPackageDir(cwd, packageName);
11
- return join(packageDir, PACKAGE_INDEX_FILENAME);
9
+ export function getPackageIndexPath(cwd, packageName, location = 'nested') {
10
+ if (location === 'root') {
11
+ return join(getLocalOpenPackageDir(cwd), FILE_PATTERNS.PACKAGE_INDEX_YML);
12
+ }
13
+ // Nested: use content directory (cwd/.openpackage/packages/<name>/.openpackage/)
14
+ const contentDir = getLocalPackageContentDir(cwd, packageName);
15
+ return join(contentDir, FILE_PATTERNS.PACKAGE_INDEX_YML);
12
16
  }
13
17
  export function ensureTrailingSlash(value) {
14
18
  return value.endsWith('/') ? value : `${value}/`;
@@ -63,8 +67,9 @@ export function sanitizeIndexData(data) {
63
67
  files: sortMapping(entries)
64
68
  };
65
69
  }
66
- export async function readPackageIndex(cwd, packageName) {
67
- const indexPath = getPackageIndexPath(cwd, packageName);
70
+ export async function readPackageIndex(cwd, packageName, location = 'nested') {
71
+ const canonicalPath = getPackageIndexPath(cwd, packageName, location);
72
+ const indexPath = canonicalPath;
68
73
  if (!(await exists(indexPath))) {
69
74
  return null;
70
75
  }
@@ -82,7 +87,7 @@ export async function readPackageIndex(cwd, packageName) {
82
87
  };
83
88
  }
84
89
  return {
85
- path: indexPath,
90
+ path: canonicalPath,
86
91
  packageName,
87
92
  workspace: sanitized.workspace,
88
93
  files: sanitized.files
@@ -91,7 +96,7 @@ export async function readPackageIndex(cwd, packageName) {
91
96
  catch (error) {
92
97
  logger.warn(`Failed to read package index at ${indexPath}: ${error}`);
93
98
  return {
94
- path: indexPath,
99
+ path: canonicalPath,
95
100
  packageName,
96
101
  workspace: { version: '', hash: undefined },
97
102
  files: {}
@@ -102,7 +107,7 @@ export async function writePackageIndex(record) {
102
107
  const { path: indexPath, files } = record;
103
108
  const workspaceVer = record.workspace?.version;
104
109
  if (!workspaceVer) {
105
- throw new Error('workspace.version is required when writing package.index.yml');
110
+ throw new Error(`workspace.version is required when writing ${FILE_PATTERNS.PACKAGE_INDEX_YML}`);
106
111
  }
107
112
  const workspace = {
108
113
  hash: record.workspace?.hash,
@@ -1 +1 @@
1
- {"version":3,"file":"package-index-yml.js","sourceRoot":"","sources":["../../src/utils/package-index-yml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-index-yml.js","sourceRoot":"","sources":["../../src/utils/package-index-yml.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,12 @@
1
1
  import { logger } from './logger.js';
2
2
  import { promptPlatformSelection } from './prompts.js';
3
- import { detectAllPlatforms } from '../core/platforms.js';
4
- import { extractRemoteErrorReason } from './error-reasons.js';
3
+ import { getDetectedPlatforms } from '../core/platforms.js';
5
4
  /**
6
5
  * Detect existing platforms in the project
6
+ * Wrapper around getDetectedPlatforms that adds debug logging
7
7
  */
8
8
  export async function detectPlatforms(targetDir) {
9
- const platformDetectionResults = await detectAllPlatforms(targetDir);
10
- const detectedPlatforms = platformDetectionResults
11
- .filter(result => result.detected)
12
- .map(result => result.name);
9
+ const detectedPlatforms = await getDetectedPlatforms(targetDir);
13
10
  if (detectedPlatforms.length > 0) {
14
11
  logger.debug(`Auto-detected platforms: ${detectedPlatforms.join(', ')}`);
15
12
  }
@@ -21,112 +18,6 @@ export async function detectPlatforms(targetDir) {
21
18
  export async function promptForPlatformSelection() {
22
19
  console.log('\n🤖 Platform Detection');
23
20
  console.log('No AI development platform detected in this project.');
24
- return await promptPlatformSelection();
25
- }
26
- /**
27
- * Display installation summary
28
- */
29
- export function displayInstallationSummary(totalInstalled, totalSkipped, totalPackages, results) {
30
- console.log(`\n✓ Installation Summary:`);
31
- console.log(`✓ Successfully installed: ${totalInstalled}/${totalPackages} packages`);
32
- if (totalSkipped > 0) {
33
- console.log(`❌ Failed to install: ${totalSkipped} packages`);
34
- console.log('\nFailed packages:');
35
- results.filter(r => !r.success).forEach(result => {
36
- console.log(` • ${result.name}: ${result.error}`);
37
- });
38
- }
39
- }
40
- /**
41
- * Display installation results
42
- */
43
- export function displayInstallationResults(packageName, resolvedPackages, platformResult, options, mainPackage, allAddedFiles, allUpdatedFiles, rootFileResults, missingPackages, missingPackageOutcomes) {
44
- // Build installation summary
45
- let summaryText = `✓ Installed ${packageName}`;
46
- if (mainPackage) {
47
- summaryText += `@${mainPackage.version}`;
48
- }
49
- console.log(`${summaryText}`);
50
- const dependencyPackages = resolvedPackages.filter(f => !f.isRoot);
51
- if (dependencyPackages.length > 0) {
52
- console.log(`✓ Installed dependencies: ${dependencyPackages.length}`);
53
- for (const dep of dependencyPackages) {
54
- const packageSpecifier = typeof dep.name === 'string' && dep.name.startsWith('@')
55
- ? dep.name
56
- : `@${dep.name}`;
57
- console.log(` ├── ${packageSpecifier}@${dep.version}`);
58
- }
59
- }
60
- console.log(`✓ Total packages processed: ${resolvedPackages.length}`);
61
- // Show detailed file list
62
- if (allAddedFiles && allAddedFiles.length > 0) {
63
- console.log(`✓ Added files: ${allAddedFiles.length}`);
64
- const sortedFiles = [...allAddedFiles].sort((a, b) => a.localeCompare(b));
65
- for (const file of sortedFiles) {
66
- console.log(` ├── ${file}`);
67
- }
68
- }
69
- if (allUpdatedFiles && allUpdatedFiles.length > 0) {
70
- console.log(`✓ Updated files: ${allUpdatedFiles.length}`);
71
- const sortedFiles = [...allUpdatedFiles].sort((a, b) => a.localeCompare(b));
72
- for (const file of sortedFiles) {
73
- console.log(` ├── ${file}`);
74
- }
75
- }
76
- // Root file installation results
77
- if (rootFileResults) {
78
- const totalRootFiles = rootFileResults.installed.length + rootFileResults.updated.length;
79
- if (totalRootFiles > 0) {
80
- console.log(`✓ Root files: ${totalRootFiles} file(s)`);
81
- // Show newly created root files
82
- if (rootFileResults.installed.length > 0) {
83
- const sortedInstalled = [...rootFileResults.installed].sort((a, b) => a.localeCompare(b));
84
- for (const file of sortedInstalled) {
85
- console.log(` ├── ${file} (created)`);
86
- }
87
- }
88
- // Show updated root files
89
- if (rootFileResults.updated.length > 0) {
90
- const sortedUpdated = [...rootFileResults.updated].sort((a, b) => a.localeCompare(b));
91
- for (const file of sortedUpdated) {
92
- console.log(` ├── ${file} (updated)`);
93
- }
94
- }
95
- }
96
- }
97
- // Platform and IDE template output
98
- if (platformResult.created.length > 0) {
99
- console.log(`✓ Created platform directories: ${platformResult.created.join(', ')}`);
100
- }
101
- // Report missing packages (displayed last)
102
- if (missingPackages && missingPackages.length > 0) {
103
- console.log(`\n⚠️ Missing dependencies detected:`);
104
- for (const missing of missingPackages) {
105
- const reasonLabel = formatMissingDependencyReason(missingPackageOutcomes?.[missing]);
106
- console.log(` • ${missing} (${reasonLabel})`);
107
- }
108
- console.log(`\n💡 To resolve missing dependencies:`);
109
- console.log(` • Create locally: opkg init && opkg save`);
110
- console.log(` • Pull from remote: opkg pull ${missingPackages.join(' ')}`);
111
- console.log(` • Remove from package.yml`);
112
- console.log('');
113
- }
114
- }
115
- function formatMissingDependencyReason(outcome) {
116
- if (!outcome) {
117
- return 'not found in registry';
118
- }
119
- switch (outcome.reason) {
120
- case 'not-found':
121
- return 'not found in remote registry';
122
- case 'access-denied':
123
- return 'access denied';
124
- case 'network':
125
- return 'network error';
126
- case 'integrity':
127
- return 'integrity check failed';
128
- default:
129
- return extractRemoteErrorReason(outcome.message || 'unknown error');
130
- }
21
+ return (await promptPlatformSelection());
131
22
  }
132
23
  //# sourceMappingURL=package-installation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-installation.js","sourceRoot":"","sources":["../../src/utils/package-installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,wBAAwB,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,wBAAwB;SAC/C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;SACjC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,4BAA4B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpE,OAAO,MAAM,uBAAuB,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,cAAsB,EACtB,YAAoB,EACpB,aAAqB,EACrB,OAAkE;IAElE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,6BAA6B,cAAc,IAAI,aAAa,WAAW,CAAC,CAAC;IAErF,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,WAAW,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/C,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAmB,EACnB,gBAAuB,EACvB,cAA0D,EAC1D,OAAY,EACZ,WAAiB,EACjB,aAAwB,EACxB,eAA0B,EAC1B,eAA+E,EAC/E,eAA0B,EAC1B,sBAAuE;IAEvE,6BAA6B;IAC7B,IAAI,WAAW,GAAG,eAAe,WAAW,EAAE,CAAC;IAC/C,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;IAE9B,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnE,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,6BAA6B,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACrC,MAAM,gBAAgB,GACpB,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACtD,CAAC,CAAC,GAAG,CAAC,IAAI;gBACV,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,UAAU,gBAAgB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,+BAA+B,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtE,0BAA0B;IAC1B,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;QACzF,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,cAAc,UAAU,CAAC,CAAC;YAEvD,gCAAgC;YAChC,IAAI,eAAe,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,eAAe,GAAG,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1F,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YAED,0BAA0B;YAC1B,IAAI,eAAe,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,aAAa,GAAG,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,IAAI,cAAc,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,mCAAmC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,2CAA2C;IAC3C,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,6BAA6B,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,KAAK,WAAW,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,oCAAoC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AAEH,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAwC;IAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,8BAA8B,CAAC;QACxC,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC;QACzB,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,wBAAwB,CAAC;QAClC;YACE,OAAO,wBAAwB,CAAC,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"package-installation.js","sourceRoot":"","sources":["../../src/utils/package-installation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAiB,MAAM,sBAAsB,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEhE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,4BAA4B,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpE,OAAO,CAAC,MAAM,uBAAuB,EAAE,CAAe,CAAC;AACzD,CAAC"}
@@ -1,38 +1,5 @@
1
- import { FILE_PATTERNS } from '../constants/index.js';
2
- import { exists, isDirectory, readTextFile } from './fs.js';
3
- import { findFilesByExtension } from './file-processing.js';
4
- import { PACKAGE_INDEX_FILENAME } from './package-index-yml.js';
5
- import { isAllowedRegistryPath, isRootRegistryPath, isSkippableRegistryPath, normalizeRegistryPath } from './registry-entry-filter.js';
6
- const UTF8_ENCODING = 'utf8';
1
+ import { readPackageFilesForRegistry } from './package-copy.js';
7
2
  export async function readLocalPackageFilesForIndex(packageDir) {
8
- if (!(await exists(packageDir)) || !(await isDirectory(packageDir))) {
9
- return [];
10
- }
11
- const entries = await findFilesByExtension(packageDir, [], packageDir);
12
- const files = [];
13
- for (const entry of entries) {
14
- const normalizedPath = normalizeRegistryPath(entry.relativePath);
15
- if (normalizedPath === PACKAGE_INDEX_FILENAME) {
16
- continue;
17
- }
18
- const isAllowed = isAllowedRegistryPath(normalizedPath);
19
- const isRoot = isRootRegistryPath(normalizedPath);
20
- const isYamlOverride = isYamlOverrideFile(normalizedPath);
21
- const isPackageYml = normalizedPath === FILE_PATTERNS.PACKAGE_YML;
22
- const isRootLevelFile = !normalizedPath.includes('/');
23
- if (!isAllowed && !isRoot && !isYamlOverride && !isPackageYml && !isRootLevelFile) {
24
- continue;
25
- }
26
- const content = await readTextFile(entry.fullPath, UTF8_ENCODING);
27
- files.push({
28
- path: normalizedPath,
29
- content,
30
- encoding: UTF8_ENCODING
31
- });
32
- }
33
- return files;
34
- }
35
- function isYamlOverrideFile(normalizedPath) {
36
- return normalizedPath !== FILE_PATTERNS.PACKAGE_YML && isSkippableRegistryPath(normalizedPath);
3
+ return await readPackageFilesForRegistry(packageDir);
37
4
  }
38
5
  //# sourceMappingURL=package-local-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-local-files.js","sourceRoot":"","sources":["../../src/utils/package-local-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,MAAM,EACN,WAAW,EACX,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,UAAkB;IACpE,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC;IACvE,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEjE,IAAI,cAAc,KAAK,sBAAsB,EAAE,CAAC;YAC9C,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,cAAc,KAAK,aAAa,CAAC,WAAW,CAAC;QAClE,MAAM,eAAe,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEtD,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE,CAAC;YAClF,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,cAAc;YACpB,OAAO;YACP,QAAQ,EAAE,aAAa;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,cAAsB;IAChD,OAAO,cAAc,KAAK,aAAa,CAAC,WAAW,IAAI,uBAAuB,CAAC,cAAc,CAAC,CAAC;AACjG,CAAC"}
1
+ {"version":3,"file":"package-local-files.js","sourceRoot":"","sources":["../../src/utils/package-local-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,UAAkB;IACpE,OAAO,MAAM,2BAA2B,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC"}
@@ -1,15 +1,19 @@
1
- import { basename, join, relative } from 'path';
1
+ import { basename, relative } from 'path';
2
2
  import semver from 'semver';
3
3
  import { parsePackageYml, writePackageYml } from './package-yml.js';
4
- import { exists, ensureDir, writeTextFile, walkFiles, remove } from './fs.js';
4
+ import { exists, ensureDir } from './fs.js';
5
5
  import { logger } from './logger.js';
6
6
  import { getLocalOpenPackageDir, getLocalPackageYmlPath, getLocalPackagesDir, getLocalPackageDir } from './paths.js';
7
- import { DEPENDENCY_ARRAYS } from '../constants/index.js';
7
+ import { DEPENDENCY_ARRAYS, PACKAGE_PATHS } from '../constants/index.js';
8
8
  import { createCaretRange, hasExplicitPrereleaseIntent, isPrereleaseVersion } from './version-ranges.js';
9
9
  import { extractBaseVersion } from './version-generator.js';
10
+ import { isUnversionedVersion } from './package-versioning.js';
10
11
  import { normalizePackageName, arePackageNamesEquivalent } from './package-name.js';
11
12
  import { packageManager } from '../core/package.js';
12
- import { PACKAGE_INDEX_FILENAME } from './package-index-yml.js';
13
+ import { promptPackageDetailsForNamed } from './prompts.js';
14
+ import { writePackageFilesToDirectory } from './package-copy.js';
15
+ import { getPackageFilesDir, getPackageYmlPath } from '../core/package-context.js';
16
+ import { buildNormalizedIncludeSet, isManifestPath, normalizePackagePath } from './manifest-paths.js';
13
17
  /**
14
18
  * Ensure local OpenPackage directory structure exists
15
19
  * Shared utility for both install and save commands
@@ -23,18 +27,17 @@ export async function ensureLocalOpenPackageStructure(cwd) {
23
27
  ]);
24
28
  }
25
29
  /**
26
- * Create a basic package.yml file if it doesn't exist
30
+ * Create a basic package.yml file for workspace if it doesn't exist
27
31
  * Shared utility for both install and save commands
28
32
  * @param force - If true, overwrite existing package.yml
29
33
  * @returns the package.yml if it was created, null if it already existed and force=false
30
34
  */
31
- export async function createBasicPackageYml(cwd, force = false) {
35
+ export async function createWorkspacePackageYml(cwd, force = false) {
32
36
  await ensureLocalOpenPackageStructure(cwd);
33
37
  const packageYmlPath = getLocalPackageYmlPath(cwd);
34
38
  const projectName = basename(cwd);
35
39
  const basicPackageYml = {
36
40
  name: projectName,
37
- version: '0.1.0',
38
41
  packages: [],
39
42
  'dev-packages': []
40
43
  };
@@ -52,12 +55,84 @@ export async function createBasicPackageYml(cwd, force = false) {
52
55
  console.log(`📋 Initialized workspace package.yml in .openpackage/`);
53
56
  return basicPackageYml;
54
57
  }
58
+ /**
59
+ * Ensure a nested package directory and package.yml exist, optionally prompting for details.
60
+ * This is for NESTED packages only. Root packages use different flow.
61
+ */
62
+ export async function ensurePackageWithYml(cwd, packageName, options = {}) {
63
+ await ensureLocalOpenPackageStructure(cwd);
64
+ const normalizedName = normalizePackageName(packageName);
65
+ const packageDir = getPackageFilesDir(cwd, 'nested', normalizedName);
66
+ const packageYmlPath = getPackageYmlPath(cwd, 'nested', normalizedName);
67
+ await ensureDir(packageDir);
68
+ let packageConfig;
69
+ let isNew = false;
70
+ if (await exists(packageYmlPath)) {
71
+ packageConfig = await parsePackageYml(packageYmlPath);
72
+ }
73
+ else {
74
+ isNew = true;
75
+ // Try to seed from existing local registry copy to avoid prompts and preserve metadata.
76
+ try {
77
+ const registryExists = await packageManager.packageExists(normalizedName);
78
+ if (registryExists) {
79
+ const existing = await packageManager.loadPackage(normalizedName);
80
+ packageConfig = {
81
+ ...existing.metadata,
82
+ name: normalizedName,
83
+ partial: true
84
+ };
85
+ logger.info(`Loaded package.yml for '${normalizedName}' from local registry copy`);
86
+ console.log(`✓ Loaded package.yml from local registry for ${normalizedName}`);
87
+ }
88
+ }
89
+ catch (error) {
90
+ logger.debug('Unable to seed package.yml from registry; falling back to prompts', { normalizedName, error });
91
+ }
92
+ if (!packageConfig) {
93
+ if (options.interactive) {
94
+ console.log(`Create new package "${normalizedName}"`);
95
+ packageConfig = await promptPackageDetailsForNamed(normalizedName);
96
+ }
97
+ else {
98
+ packageConfig = {
99
+ name: normalizedName,
100
+ ...(options.defaultVersion ? { version: options.defaultVersion } : {})
101
+ };
102
+ }
103
+ packageConfig = {
104
+ ...packageConfig,
105
+ partial: true
106
+ };
107
+ }
108
+ if (!packageConfig.include || packageConfig.include.length === 0) {
109
+ packageConfig = {
110
+ ...packageConfig,
111
+ include: ['**']
112
+ };
113
+ }
114
+ await writePackageYml(packageYmlPath, packageConfig);
115
+ logger.info(`Created new package '${packageConfig.name}${packageConfig.version ? `@${packageConfig.version}` : ''}' at ${relative(cwd, packageDir)}`);
116
+ }
117
+ if (packageConfig.name !== normalizedName) {
118
+ const updatedConfig = { ...packageConfig, name: normalizedName };
119
+ await writePackageYml(packageYmlPath, updatedConfig);
120
+ packageConfig = updatedConfig;
121
+ }
122
+ return {
123
+ normalizedName,
124
+ packageDir,
125
+ packageYmlPath,
126
+ packageConfig,
127
+ isNew
128
+ };
129
+ }
55
130
  /**
56
131
  * Add a package dependency to package.yml with smart placement logic
57
132
  * Shared utility for both install and save commands
58
133
  */
59
134
  export async function addPackageToYml(cwd, packageName, packageVersion, isDev = false, originalVersion, // The original version/range that was requested
60
- silent = false) {
135
+ silent = false, include) {
61
136
  const packageYmlPath = getLocalPackageYmlPath(cwd);
62
137
  if (!(await exists(packageYmlPath))) {
63
138
  return; // If no package.yml exists, ignore this step
@@ -68,6 +143,7 @@ silent = false) {
68
143
  if (!config[DEPENDENCY_ARRAYS.DEV_PACKAGES])
69
144
  config[DEPENDENCY_ARRAYS.DEV_PACKAGES] = [];
70
145
  const normalizedPackageName = normalizePackageName(packageName);
146
+ const nameWithVersion = packageVersion ? `${packageName}@${packageVersion}` : packageName;
71
147
  const packagesArray = config.packages;
72
148
  const devPackagesArray = config[DEPENDENCY_ARRAYS.DEV_PACKAGES];
73
149
  const findIndex = (arr) => arr.findIndex(dep => arePackageNamesEquivalent(dep.name, normalizedPackageName));
@@ -88,50 +164,67 @@ silent = false) {
88
164
  const existingRange = currentLocation && existingIndex >= 0
89
165
  ? config[currentLocation][existingIndex]?.version
90
166
  : undefined;
91
- const baseVersion = extractBaseVersion(packageVersion);
92
- const defaultRange = createCaretRange(baseVersion);
93
- let versionToWrite = originalVersion ?? defaultRange;
94
- if (!originalVersion && existingRange) {
95
- const hasPrereleaseIntent = hasExplicitPrereleaseIntent(existingRange);
96
- const isNewVersionStable = !isPrereleaseVersion(packageVersion);
97
- if (hasPrereleaseIntent) {
98
- if (isNewVersionStable) {
99
- // Constraint has explicit prerelease intent and we're packing a stable
100
- // version on the same base line: normalize to a stable caret.
101
- versionToWrite = createCaretRange(baseVersion);
102
- logger.debug(`Updating range from prerelease-including '${existingRange}' to stable '${versionToWrite}' ` +
103
- `for ${packageName} (pack transition to ${packageVersion})`);
167
+ const shouldOmitVersion = isUnversionedVersion(packageVersion) || isUnversionedVersion(originalVersion);
168
+ let versionToWrite = shouldOmitVersion ? undefined : originalVersion;
169
+ if (!shouldOmitVersion && packageVersion) {
170
+ const baseVersion = extractBaseVersion(packageVersion);
171
+ const defaultRange = createCaretRange(baseVersion);
172
+ versionToWrite = originalVersion ?? defaultRange;
173
+ if (!originalVersion && existingRange) {
174
+ const hasPrereleaseIntent = hasExplicitPrereleaseIntent(existingRange);
175
+ const isNewVersionStable = !isPrereleaseVersion(packageVersion);
176
+ if (hasPrereleaseIntent) {
177
+ if (isNewVersionStable) {
178
+ // Constraint has explicit prerelease intent and we're packing a stable
179
+ // version on the same base line: normalize to a stable caret.
180
+ versionToWrite = createCaretRange(baseVersion);
181
+ logger.debug(`Updating range from prerelease-including '${existingRange}' to stable '${versionToWrite}' ` +
182
+ `for ${packageName} (pack transition to ${packageVersion})`);
183
+ }
184
+ else {
185
+ // For prerelease-intent ranges during saves (prerelease versions),
186
+ // always preserve the existing constraint.
187
+ versionToWrite = existingRange;
188
+ }
104
189
  }
105
- else {
106
- // For prerelease-intent ranges during saves (prerelease versions),
107
- // always preserve the existing constraint.
190
+ else if (rangeIncludesVersion(existingRange, baseVersion)) {
191
+ // Stable (non-prerelease) constraint that already includes the new base
192
+ // version: keep it unchanged.
108
193
  versionToWrite = existingRange;
109
194
  }
195
+ else {
196
+ // Stable constraint that does not include the new base version: bump to
197
+ // a new caret on the packed stable.
198
+ versionToWrite = defaultRange;
199
+ }
110
200
  }
111
- else if (rangeIncludesVersion(existingRange, baseVersion)) {
112
- // Stable (non-prerelease) constraint that already includes the new base
113
- // version: keep it unchanged.
114
- versionToWrite = existingRange;
115
- }
116
- else {
117
- // Stable constraint that does not include the new base version: bump to
118
- // a new caret on the packed stable.
119
- versionToWrite = defaultRange;
120
- }
201
+ }
202
+ const existingDep = currentLocation && existingIndex >= 0 ? config[currentLocation][existingIndex] : null;
203
+ let includeToWrite;
204
+ if (include === undefined) {
205
+ includeToWrite = existingDep?.include;
206
+ }
207
+ else if (include === null) {
208
+ includeToWrite = undefined;
209
+ }
210
+ else {
211
+ const unique = Array.from(new Set(include));
212
+ includeToWrite = unique.length > 0 ? unique : undefined;
121
213
  }
122
214
  const dependency = {
123
215
  name: normalizedPackageName,
124
- version: versionToWrite
216
+ ...(versionToWrite ? { version: versionToWrite } : {}),
217
+ ...(includeToWrite ? { include: includeToWrite } : {})
125
218
  };
126
219
  // Determine target location (packages vs dev-packages)
127
220
  let targetArray;
128
221
  if (currentLocation === DEPENDENCY_ARRAYS.DEV_PACKAGES && !isDev) {
129
222
  targetArray = DEPENDENCY_ARRAYS.DEV_PACKAGES;
130
- logger.info(`Keeping package in dev-packages: ${packageName}@${packageVersion}`);
223
+ logger.info(`Keeping package in dev-packages: ${nameWithVersion}`);
131
224
  }
132
225
  else if (currentLocation === DEPENDENCY_ARRAYS.PACKAGES && isDev) {
133
226
  targetArray = DEPENDENCY_ARRAYS.DEV_PACKAGES;
134
- logger.info(`Moving package from packages to dev-packages: ${packageName}@${packageVersion}`);
227
+ logger.info(`Moving package from packages to dev-packages: ${nameWithVersion}`);
135
228
  }
136
229
  else {
137
230
  targetArray = isDev ? DEPENDENCY_ARRAYS.DEV_PACKAGES : DEPENDENCY_ARRAYS.PACKAGES;
@@ -146,63 +239,86 @@ silent = false) {
146
239
  const targetArrayRef = config[targetArray];
147
240
  const existingTargetIndex = currentLocation === targetArray ? findIndex(targetArrayRef) : -1;
148
241
  if (existingTargetIndex >= 0) {
149
- const existingDep = targetArrayRef[existingTargetIndex];
150
- const versionChanged = existingDep.version !== dependency.version;
151
- if (versionChanged) {
242
+ const existingDepForTarget = targetArrayRef[existingTargetIndex];
243
+ const versionChanged = existingDepForTarget.version !== dependency.version;
244
+ const includeChanged = JSON.stringify(existingDepForTarget.include ?? []) !== JSON.stringify(includeToWrite ?? []);
245
+ if (versionChanged || includeChanged) {
152
246
  targetArrayRef[existingTargetIndex] = dependency;
153
247
  if (!silent) {
154
- logger.info(`Updated existing package dependency: ${packageName}@${packageVersion}`);
155
- console.log(`✓ Updated ${packageName}@${packageVersion} in main package.yml`);
248
+ logger.info(`Updated existing package dependency: ${nameWithVersion}`);
249
+ console.log(`✓ Updated ${nameWithVersion} in main package.yml`);
156
250
  }
157
251
  }
158
252
  }
159
253
  else {
160
254
  targetArrayRef.push(dependency);
161
255
  if (!silent) {
162
- logger.info(`Added new package dependency: ${packageName}@${packageVersion}`);
163
- console.log(`✓ Added ${packageName}@${packageVersion} to main package.yml`);
256
+ logger.info(`Added new package dependency: ${nameWithVersion}`);
257
+ console.log(`✓ Added ${nameWithVersion} to main package.yml`);
164
258
  }
165
259
  }
166
260
  await writePackageYml(packageYmlPath, config);
167
261
  }
168
262
  /**
169
263
  * Copy the full package directory from the local registry into the project structure
170
- * Removes all existing files except package.index.yml before writing new files
264
+ * Removes all existing files except the package index file before writing new files
171
265
  */
172
266
  export async function writeLocalPackageFromRegistry(cwd, packageName, version) {
173
267
  const pkg = await packageManager.loadPackage(packageName, version);
174
268
  const localPackageDir = getLocalPackageDir(cwd, packageName);
175
- await ensureDir(localPackageDir);
176
- // Build set of files that should exist after installation
177
- const filesToKeep = new Set(pkg.files.map(file => file.path));
178
- // Always preserve package.index.yml
179
- filesToKeep.add(PACKAGE_INDEX_FILENAME);
180
- // List all existing files in the directory
181
- const existingFiles = [];
182
- if (await exists(localPackageDir)) {
183
- for await (const filePath of walkFiles(localPackageDir)) {
184
- const relPath = relative(localPackageDir, filePath);
185
- existingFiles.push(relPath);
186
- }
269
+ await writePackageFilesToDirectory(localPackageDir, pkg.files, {
270
+ preserveIndexFile: true
271
+ });
272
+ }
273
+ /**
274
+ * Copy a subset of package files from the local registry into the project cache (.openpackage/packages/<pkg>/),
275
+ * always including package.yml. Used for partial installs.
276
+ */
277
+ export async function writePartialLocalPackageFromRegistry(cwd, packageName, version, includePaths) {
278
+ const pkg = await packageManager.loadPackage(packageName, version);
279
+ const localPackageDir = getLocalPackageDir(cwd, packageName);
280
+ const normalizedIncludes = buildNormalizedIncludeSet(includePaths);
281
+ const filteredFiles = pkg.files.filter(file => {
282
+ const p = normalizePackagePath(file.path);
283
+ if (isManifestPath(p))
284
+ return true; // always keep manifest
285
+ if (p === PACKAGE_PATHS.INDEX_RELATIVE)
286
+ return false; // never copy index from registry
287
+ if (!normalizedIncludes)
288
+ return true;
289
+ return normalizedIncludes.has(p);
290
+ });
291
+ await writePackageFilesToDirectory(localPackageDir, filteredFiles, {
292
+ preserveIndexFile: true
293
+ });
294
+ }
295
+ /**
296
+ * Update only the include list for an existing dependency in package.yml.
297
+ * - include: string[] => set/dedupe
298
+ * - include: null => clear include field
299
+ * - include: undefined => no-op
300
+ */
301
+ export async function updatePackageDependencyInclude(cwd, packageName, target, include) {
302
+ if (include === undefined)
303
+ return;
304
+ const packageYmlPath = getLocalPackageYmlPath(cwd);
305
+ if (!(await exists(packageYmlPath)))
306
+ return;
307
+ const config = await parsePackageYml(packageYmlPath);
308
+ const arr = config[target];
309
+ if (!arr)
310
+ return;
311
+ const idx = arr.findIndex(dep => arePackageNamesEquivalent(dep.name, packageName));
312
+ if (idx === -1)
313
+ return;
314
+ const unique = include === null ? undefined : Array.from(new Set(include));
315
+ if (unique && unique.length > 0) {
316
+ arr[idx].include = unique;
187
317
  }
188
- // Remove files that are no longer in the package (except package.index.yml)
189
- const filesToRemove = existingFiles.filter(file => !filesToKeep.has(file));
190
- await Promise.all(filesToRemove.map(async (file) => {
191
- const filePath = join(localPackageDir, file);
192
- try {
193
- await remove(filePath);
194
- logger.debug(`Removed residual file: ${filePath}`);
195
- }
196
- catch (error) {
197
- logger.warn(`Failed to remove residual file ${filePath}: ${error}`);
198
- }
199
- }));
200
- // Write all files from the package
201
- await Promise.all(pkg.files.map(async (file) => {
202
- const targetPath = join(localPackageDir, file.path);
203
- const encoding = (file.encoding ?? 'utf8');
204
- await writeTextFile(targetPath, file.content, encoding);
205
- }));
318
+ else {
319
+ delete arr[idx].include;
320
+ }
321
+ await writePackageYml(packageYmlPath, config);
206
322
  }
207
323
  function rangeIncludesVersion(range, version) {
208
324
  if (!range || !version) {