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,126 +0,0 @@
1
- /**
2
- * ID-based Discovery Utilities
3
- * Provides functions for scanning, mapping, and resolving files by their frontmatter IDs
4
- * for platform-specific markdown files during installation.
5
- */
6
- import { join, dirname } from 'path';
7
- import { exists } from './fs.js';
8
- import { isValidEntityId } from './entity-id.js';
9
- import { formulaManager } from '../core/formula.js';
10
- import { getPlatformDefinition } from '../core/platforms.js';
11
- import { FILE_PATTERNS, PLATFORM_DIRS, PLATFORMS, UNIVERSAL_SUBDIRS } from '../constants/index.js';
12
- import { findFilesByExtension } from './file-processing.js';
13
- /**
14
- * Build a map of file IDs to file info for all markdown files in cwd platform directories
15
- * that have formula frontmatter matching the specified formula name.
16
- */
17
- export async function buildCwdIdMap(cwd, platforms, formulaName) {
18
- // Frontmatter support has been removed, return empty map
19
- return new Map();
20
- }
21
- /**
22
- * Build a map of registry files with their IDs and adjacent file information
23
- * for platform-specific markdown files in the formula.
24
- */
25
- export async function buildRegistryIdMap(formulaName, version) {
26
- // Frontmatter support removed, return empty map
27
- return new Map();
28
- }
29
- /**
30
- * Load platform-specific YAML override files from the registry for a formula version.
31
- * Matches files in universal subdirs with pattern: "{subdir}/{base}.{platform}.yml"
32
- */
33
- export async function loadRegistryYamlOverrides(formulaName, version) {
34
- const overrides = [];
35
- // Load formula from registry
36
- const formula = await formulaManager.loadFormula(formulaName, version);
37
- // Known platforms for suffix matching
38
- const platformValues = Object.values(PLATFORMS);
39
- const subdirs = Object.values(UNIVERSAL_SUBDIRS);
40
- for (const file of formula.files) {
41
- const path = file.path;
42
- // Must be in a universal subdir
43
- if (!subdirs.some(sd => path.startsWith(sd + '/')))
44
- continue;
45
- // Must end with .yml and have a platform suffix before it
46
- if (!path.endsWith(FILE_PATTERNS.YML_FILE))
47
- continue;
48
- const lastDot = path.lastIndexOf('.');
49
- const secondLastDot = path.lastIndexOf('.', lastDot - 1);
50
- if (secondLastDot === -1)
51
- continue;
52
- const possiblePlatform = path.slice(secondLastDot + 1, lastDot);
53
- if (!platformValues.includes(possiblePlatform))
54
- continue;
55
- overrides.push({ path: file.path, content: file.content, encoding: 'utf8' });
56
- }
57
- return overrides;
58
- }
59
- /**
60
- * Find where to install a new file based on adjacent file locations in cwd
61
- * Returns the directory path where the file should be installed, or null if no adjacent files found
62
- */
63
- export async function resolveInstallPathFromAdjacent(adjacentIds, cwdIdMap) {
64
- // Look for any adjacent file that exists in cwd
65
- for (const adjacentId of adjacentIds) {
66
- const cwdEntries = cwdIdMap.get(adjacentId);
67
- if (cwdEntries && cwdEntries.length > 0) {
68
- // Found adjacent files - use the first one's directory
69
- return dirname(cwdEntries[0].fullPath);
70
- }
71
- }
72
- return null;
73
- }
74
- /**
75
- * Validate and clean invalid formula files in cwd
76
- * - Files with valid IDs matching formula but not in registry → delete file
77
- */
78
- export async function cleanupInvalidFormulaFiles(cwd, platforms, formulaName, registryIdMap) {
79
- const cleaned = [];
80
- const deleted = [];
81
- // Build set of valid registry IDs
82
- const validRegistryIds = new Set();
83
- for (const [, info] of registryIdMap) {
84
- if (info.id && isValidEntityId(info.id)) {
85
- validRegistryIds.add(info.id);
86
- }
87
- }
88
- // Helper to process a file for cleanup
89
- const processFileForCleanup = async (filePath) => {
90
- // Frontmatter support removed - no cleanup needed
91
- };
92
- // 1) AI directory
93
- const aiDir = join(cwd, PLATFORM_DIRS.AI);
94
- if (await exists(aiDir)) {
95
- const aiFiles = await findFilesByExtension(aiDir);
96
- await Promise.all(aiFiles.map(f => processFileForCleanup(f.fullPath)));
97
- }
98
- // 2) All platform subdirectories
99
- for (const platform of platforms) {
100
- const platformDef = getPlatformDefinition(platform);
101
- for (const [, subdirDef] of Object.entries(platformDef.subdirs)) {
102
- const subdirPath = join(cwd, platformDef.rootDir, subdirDef.path);
103
- if (!(await exists(subdirPath))) {
104
- continue;
105
- }
106
- const patterns = subdirDef.readExts.length > 0 ? subdirDef.readExts : [];
107
- const files = await findFilesByExtension(subdirPath, patterns);
108
- await Promise.all(files.map(f => processFileForCleanup(f.fullPath)));
109
- }
110
- }
111
- return { cleaned, deleted };
112
- }
113
- /**
114
- * Extract file ID information from a file path
115
- */
116
- export async function extractFileIdInfo(filePath) {
117
- // Frontmatter support removed
118
- return {
119
- fullPath: filePath,
120
- id: null,
121
- formulaName: null,
122
- isValid: false,
123
- frontmatter: null
124
- };
125
- }
126
- //# sourceMappingURL=id-based-discovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id-based-discovery.js","sourceRoot":"","sources":["../../src/utils/id-based-discovery.ts"],"names":[],"mappings":"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"}
@@ -1,249 +0,0 @@
1
- /**
2
- * ID-based Installer
3
- * Handles installation of platform-specific markdown files using ID-based matching
4
- * instead of path-based matching, allowing custom file organization in cwd.
5
- */
6
- import { join, dirname, relative } from 'path';
7
- import { exists, ensureDir, writeTextFile, remove } from './fs.js';
8
- import { logger } from './logger.js';
9
- import { getFirstPathComponent, getPathAfterFirstComponent } from './path-normalization.js';
10
- import { getPlatformDefinition } from '../core/platforms.js';
11
- import { PLATFORM_DIRS } from '../constants/index.js';
12
- import { buildCwdIdMap, resolveInstallPathFromAdjacent, cleanupInvalidFormulaFiles } from './id-based-discovery.js';
13
- import { getPlatformSpecificFilename, parseUniversalPath } from './platform-file.js';
14
- import { mergePlatformYamlOverride } from './platform-yaml-merge.js';
15
- import { loadRegistryYamlOverrides } from './id-based-discovery.js';
16
- import { rename } from 'fs/promises';
17
- /**
18
- * Variant that accepts a pre-discovered registry ID map to avoid duplicate discovery.
19
- */
20
- export async function installFilesByIdWithMap(cwd, formulaName, version, platforms, registryIdMap, options, forceOverwrite = false) {
21
- const result = {
22
- installed: 0,
23
- updated: 0,
24
- renamed: 0,
25
- cleaned: 0,
26
- deleted: 0,
27
- skipped: 0,
28
- files: [],
29
- installedFiles: [],
30
- updatedFiles: []
31
- };
32
- logger.debug(`Installing platform files by ID (pre-discovered) for ${formulaName}@${version}`, {
33
- platforms,
34
- prediscovered: registryIdMap.size
35
- });
36
- // Load YAML overrides once per install (used lazily per platform)
37
- const yamlOverrides = await loadRegistryYamlOverrides(formulaName, version);
38
- // Step 1: Build cwd ID map
39
- const cwdIdMap = await buildCwdIdMap(cwd, platforms, formulaName);
40
- // Step 3: Clean up invalid files in cwd
41
- const cleanupResult = await cleanupInvalidFormulaFiles(cwd, platforms, formulaName, registryIdMap);
42
- result.cleaned = cleanupResult.cleaned.length;
43
- result.deleted = cleanupResult.deleted.length;
44
- // Split registry files into AI-scoped and platform-scoped
45
- const aiFiles = [];
46
- const nonAiFiles = [];
47
- for (const [, fileInfo] of registryIdMap) {
48
- if (fileInfo.parentDir === PLATFORM_DIRS.AI || fileInfo.parentDir.startsWith(PLATFORM_DIRS.AI + '/')) {
49
- aiFiles.push(fileInfo);
50
- }
51
- else {
52
- nonAiFiles.push(fileInfo);
53
- }
54
- }
55
- // Process AI files once (not per-platform)
56
- if (aiFiles.length > 0) {
57
- const aiFilesByDir = new Map();
58
- for (const fileInfo of aiFiles) {
59
- const parentDir = fileInfo.parentDir;
60
- if (!aiFilesByDir.has(parentDir))
61
- aiFilesByDir.set(parentDir, []);
62
- aiFilesByDir.get(parentDir).push(fileInfo);
63
- }
64
- for (const [parentDir, files] of aiFilesByDir) {
65
- await processBatchOfFilesForAi(cwd, parentDir, files, cwdIdMap, options, result);
66
- }
67
- }
68
- // Step 4: Process each platform separately for non-AI files
69
- for (const platform of platforms) {
70
- const filesByDir = new Map();
71
- for (const fileInfo of nonAiFiles) {
72
- const parentDir = fileInfo.parentDir;
73
- if (!filesByDir.has(parentDir))
74
- filesByDir.set(parentDir, []);
75
- filesByDir.get(parentDir).push(fileInfo);
76
- }
77
- for (const [parentDir, files] of filesByDir) {
78
- await processBatchOfFilesForPlatform(cwd, platform, parentDir, files, cwdIdMap, options, forceOverwrite, result, yamlOverrides);
79
- }
80
- }
81
- logger.info(`ID-based installation (pre-discovered) complete: ${result.installed} installed, ${result.updated} updated, ${result.renamed} renamed, ${result.skipped} skipped`);
82
- return result;
83
- }
84
- /**
85
- * Split files into matching (existing ID in scope) and new (fresh) categories
86
- */
87
- function splitMatchingAndNew(files, cwdIdMap, inScope) {
88
- const matching = [];
89
- const fresh = [];
90
- for (const file of files) {
91
- const entries = file.id ? cwdIdMap.get(file.id) : null;
92
- const exists = entries?.some(inScope) ?? false;
93
- (file.id && exists ? matching : fresh).push(file);
94
- }
95
- return { matching, fresh };
96
- }
97
- /**
98
- * Update matching entries with new content and optional rename
99
- */
100
- async function updateMatchingEntries(cwd, registryFile, entries, computeTargetFileName, getContent, canOverwriteRename, options, result) {
101
- for (const entry of entries) {
102
- const currentPath = entry.fullPath;
103
- const currentFileName = entry.fileName;
104
- const targetFileName = computeTargetFileName(registryFile);
105
- const needsRename = currentFileName !== targetFileName;
106
- const targetPath = needsRename ? join(dirname(currentPath), targetFileName) : currentPath;
107
- if (needsRename && (await exists(targetPath))) {
108
- if (!(canOverwriteRename || options.force)) {
109
- logger.warn(`Cannot rename ${currentFileName} to ${targetFileName}: target exists`);
110
- result.skipped++;
111
- continue;
112
- }
113
- await remove(targetPath);
114
- }
115
- try {
116
- const content = await getContent(registryFile);
117
- await writeTextFile(currentPath, content);
118
- if (needsRename) {
119
- await rename(currentPath, targetPath);
120
- result.renamed++;
121
- }
122
- result.updated++;
123
- const rel = relative(cwd, targetPath);
124
- result.files.push(rel);
125
- result.updatedFiles.push(rel);
126
- }
127
- catch (err) {
128
- logger.error(`Failed to update file ${currentPath}: ${err}`);
129
- result.skipped++;
130
- }
131
- }
132
- }
133
- /**
134
- * Collect all adjacent IDs from a list of files (excluding each file's own ID)
135
- */
136
- function collectAdjacentIds(files) {
137
- const s = new Set();
138
- for (const f of files)
139
- for (const id of f.adjacentIds)
140
- if (id !== f.id)
141
- s.add(id);
142
- return Array.from(s);
143
- }
144
- /**
145
- * Resolve fallback target directory for a given scope (AI or platform)
146
- */
147
- async function resolveTargetDirForScope(cwd, registryParentDir, scope) {
148
- if (scope === PLATFORM_DIRS.AI) {
149
- const relAfterAi = registryParentDir === PLATFORM_DIRS.AI
150
- ? ''
151
- : registryParentDir.startsWith(PLATFORM_DIRS.AI + '/')
152
- ? registryParentDir.slice(PLATFORM_DIRS.AI.length + 1)
153
- : registryParentDir;
154
- return relAfterAi ? join(cwd, PLATFORM_DIRS.AI, relAfterAi) : join(cwd, PLATFORM_DIRS.AI);
155
- }
156
- return mapRegistryPathToCwd(cwd, [scope], registryParentDir);
157
- }
158
- /**
159
- * Generic installer for new files with injected behavior
160
- */
161
- async function installNewFilesGeneric(cwd, registryParentDir, files, cwdIdMap, resolveFallbackDir, getFileName, getContent, options, result) {
162
- const resolvedDir = await resolveInstallPathFromAdjacent(collectAdjacentIds(files), cwdIdMap);
163
- const targetDir = resolvedDir ?? (await resolveFallbackDir(cwd, registryParentDir));
164
- if (!targetDir)
165
- return;
166
- for (const file of files) {
167
- const fileName = getFileName(file);
168
- const targetPath = join(targetDir, fileName);
169
- if (await exists(targetPath)) {
170
- if (!options.force) {
171
- console.log(`Skipping ${fileName} - already exists at ${targetPath}`);
172
- result.skipped++;
173
- continue;
174
- }
175
- }
176
- try {
177
- await ensureDir(targetDir);
178
- const content = await getContent(file);
179
- await writeTextFile(targetPath, content);
180
- result.installed++;
181
- const rel = relative(cwd, targetPath);
182
- result.files.push(rel);
183
- result.installedFiles.push(rel);
184
- }
185
- catch (e) {
186
- logger.error(`Failed to install ${fileName}: ${e}`);
187
- result.skipped++;
188
- }
189
- }
190
- }
191
- /**
192
- * Process a batch of files from the same parent directory in the registry for a specific platform
193
- */
194
- async function processBatchOfFilesForPlatform(cwd, platform, parentDir, files, cwdIdMap, options, forceOverwrite, result, yamlOverrides) {
195
- const { matching, fresh } = splitMatchingAndNew(files, cwdIdMap, e => e.platform === platform);
196
- for (const file of matching) {
197
- const entries = (file.id ? cwdIdMap.get(file.id) : [])?.filter(e => e.platform === platform) ?? [];
198
- await updateMatchingEntries(cwd, file, entries, r => getPlatformSpecificFilename(r.registryPath, platform), r => {
199
- const parsed = parseUniversalPath(r.registryPath);
200
- return parsed
201
- ? mergePlatformYamlOverride(r.content, platform, parsed.universalSubdir, parsed.relPath, yamlOverrides)
202
- : r.content;
203
- },
204
- /* canOverwriteRename */ forceOverwrite, options, result);
205
- }
206
- if (fresh.length > 0) {
207
- await installNewFilesGeneric(cwd, parentDir, fresh, cwdIdMap, (cwd2, parent) => mapRegistryPathToCwd(cwd2, [platform], parent), f => getPlatformSpecificFilename(f.registryPath, platform), f => {
208
- const parsed = parseUniversalPath(f.registryPath);
209
- return parsed
210
- ? mergePlatformYamlOverride(f.content, platform, parsed.universalSubdir, parsed.relPath, yamlOverrides)
211
- : f.content;
212
- }, options, result);
213
- }
214
- }
215
- /**
216
- * Map a registry parent directory path to a cwd platform directory
217
- * E.g., "rules/subdir" → ".cursor/rules/subdir" (for first available platform)
218
- * Returns null if the platform doesn't support the universal subdirectory
219
- */
220
- async function mapRegistryPathToCwd(cwd, platforms, registryParentDir) {
221
- // Extract the universal subdir and relative path
222
- const universalSubdir = getFirstPathComponent(registryParentDir);
223
- const relativePath = getPathAfterFirstComponent(registryParentDir);
224
- // Use the first platform to determine the target directory
225
- const platform = platforms[0];
226
- const platformDef = getPlatformDefinition(platform);
227
- const subdirDef = platformDef.subdirs[universalSubdir];
228
- if (!subdirDef) {
229
- // Platform doesn't support this universal subdirectory
230
- return null;
231
- }
232
- const baseDir = join(cwd, platformDef.rootDir, subdirDef.path);
233
- return relativePath ? join(baseDir, relativePath) : baseDir;
234
- }
235
- /**
236
- * Process a batch of AI files from the same parent directory in the registry
237
- */
238
- async function processBatchOfFilesForAi(cwd, parentDir, files, cwdIdMap, options, result) {
239
- const { matching, fresh } = splitMatchingAndNew(files, cwdIdMap, e => e.platform === PLATFORM_DIRS.AI);
240
- for (const file of matching) {
241
- const entries = (file.id ? cwdIdMap.get(file.id) : [])?.filter(e => e.platform === PLATFORM_DIRS.AI) ?? [];
242
- await updateMatchingEntries(cwd, file, entries, r => r.fileName, r => r.content,
243
- /* canOverwriteRename */ false, options, result);
244
- }
245
- if (fresh.length > 0) {
246
- await installNewFilesGeneric(cwd, parentDir, fresh, cwdIdMap, (cwd2, parent) => resolveTargetDirForScope(cwd2, parent, PLATFORM_DIRS.AI), f => f.fileName, f => f.content, options, result);
247
- }
248
- }
249
- //# sourceMappingURL=id-based-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"id-based-installer.js","sourceRoot":"","sources":["../../src/utils/id-based-installer.ts"],"names":[],"mappings":"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"}