opkg 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/README.md +49 -8
  2. package/dist/commands/add.js +11 -276
  3. package/dist/commands/add.js.map +1 -1
  4. package/dist/commands/init.js +73 -145
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/install.js +26 -668
  7. package/dist/commands/install.js.map +1 -1
  8. package/dist/commands/pack.js +10 -137
  9. package/dist/commands/pack.js.map +1 -1
  10. package/dist/commands/push.js +14 -8
  11. package/dist/commands/push.js.map +1 -1
  12. package/dist/commands/save.js +12 -167
  13. package/dist/commands/save.js.map +1 -1
  14. package/dist/commands/status.js +2 -2
  15. package/dist/commands/status.js.map +1 -1
  16. package/dist/commands/uninstall.js +5 -5
  17. package/dist/commands/uninstall.js.map +1 -1
  18. package/dist/constants/index.js +18 -45
  19. package/dist/constants/index.js.map +1 -1
  20. package/dist/constants/workspace.js +9 -0
  21. package/dist/constants/workspace.js.map +1 -0
  22. package/dist/core/add/add-conflict-handler.js +68 -0
  23. package/dist/core/add/add-conflict-handler.js.map +1 -0
  24. package/dist/core/add/add-pipeline.js +137 -0
  25. package/dist/core/add/add-pipeline.js.map +1 -0
  26. package/dist/core/add/package-index-updater.js +62 -33
  27. package/dist/core/add/package-index-updater.js.map +1 -1
  28. package/dist/core/add/platform-path-transformer.js +47 -0
  29. package/dist/core/add/platform-path-transformer.js.map +1 -0
  30. package/dist/core/add/source-collector.js +57 -0
  31. package/dist/core/add/source-collector.js.map +1 -0
  32. package/dist/core/dependency-resolver.js +3 -1
  33. package/dist/core/dependency-resolver.js.map +1 -1
  34. package/dist/core/directory.js +2 -2
  35. package/dist/core/directory.js.map +1 -1
  36. package/dist/core/discovery/file-discovery.js +55 -54
  37. package/dist/core/discovery/file-discovery.js.map +1 -1
  38. package/dist/core/discovery/platform-files-discovery.js +32 -17
  39. package/dist/core/discovery/platform-files-discovery.js.map +1 -1
  40. package/dist/core/install/bulk-install-pipeline.js +199 -0
  41. package/dist/core/install/bulk-install-pipeline.js.map +1 -0
  42. package/dist/core/install/canonical-plan.js +123 -0
  43. package/dist/core/install/canonical-plan.js.map +1 -0
  44. package/dist/core/install/dry-run.js +2 -2
  45. package/dist/core/install/dry-run.js.map +1 -1
  46. package/dist/core/install/index.js +3 -0
  47. package/dist/core/install/index.js.map +1 -0
  48. package/dist/core/install/install-errors.js +41 -0
  49. package/dist/core/install/install-errors.js.map +1 -0
  50. package/dist/core/install/install-flow.js +2 -5
  51. package/dist/core/install/install-flow.js.map +1 -1
  52. package/dist/core/install/install-pipeline.js +228 -0
  53. package/dist/core/install/install-pipeline.js.map +1 -0
  54. package/dist/core/install/install-reporting.js +99 -0
  55. package/dist/core/install/install-reporting.js.map +1 -0
  56. package/dist/core/install/platform-resolution.js +6 -6
  57. package/dist/core/install/platform-resolution.js.map +1 -1
  58. package/dist/core/install/remote-flow.js +67 -1
  59. package/dist/core/install/remote-flow.js.map +1 -1
  60. package/dist/core/openpackage.js +16 -8
  61. package/dist/core/openpackage.js.map +1 -1
  62. package/dist/core/package-context.js +246 -0
  63. package/dist/core/package-context.js.map +1 -0
  64. package/dist/core/package.js +3 -2
  65. package/dist/core/package.js.map +1 -1
  66. package/dist/core/platforms.js +126 -217
  67. package/dist/core/platforms.js.map +1 -1
  68. package/dist/core/registry/registry-rename.js +2 -1
  69. package/dist/core/registry/registry-rename.js.map +1 -1
  70. package/dist/core/registry.js +10 -3
  71. package/dist/core/registry.js.map +1 -1
  72. package/dist/core/remote-pull.js +2 -1
  73. package/dist/core/remote-pull.js.map +1 -1
  74. package/dist/core/save/constants.js +4 -0
  75. package/dist/core/save/constants.js.map +1 -1
  76. package/dist/core/save/name-resolution.js +31 -0
  77. package/dist/core/save/name-resolution.js.map +1 -0
  78. package/dist/core/save/package-detection.js +147 -0
  79. package/dist/core/save/package-detection.js.map +1 -0
  80. package/dist/core/save/package-saver.js +46 -43
  81. package/dist/core/save/package-saver.js.map +1 -1
  82. package/dist/core/save/package-yml-generator.js +50 -71
  83. package/dist/core/save/package-yml-generator.js.map +1 -1
  84. package/dist/core/save/root-save-candidates.js.map +1 -1
  85. package/dist/core/save/save-candidate-loader.js +89 -0
  86. package/dist/core/save/save-candidate-loader.js.map +1 -0
  87. package/dist/core/save/save-conflict-resolution.js +72 -410
  88. package/dist/core/save/save-conflict-resolution.js.map +1 -1
  89. package/dist/core/save/save-conflict-resolver.js +277 -0
  90. package/dist/core/save/save-conflict-resolver.js.map +1 -0
  91. package/dist/core/save/save-pipeline.js +151 -0
  92. package/dist/core/save/save-pipeline.js.map +1 -0
  93. package/dist/core/save/save-types.js +2 -0
  94. package/dist/core/save/save-types.js.map +1 -0
  95. package/dist/core/save/save-yml-resolution.js +77 -39
  96. package/dist/core/save/save-yml-resolution.js.map +1 -1
  97. package/dist/core/save/workspace-rename.js +6 -6
  98. package/dist/core/save/workspace-rename.js.map +1 -1
  99. package/dist/core/scoping/package-scoping.js +13 -1
  100. package/dist/core/scoping/package-scoping.js.map +1 -1
  101. package/dist/core/status/status-file-discovery.js +12 -30
  102. package/dist/core/status/status-file-discovery.js.map +1 -1
  103. package/dist/core/sync/platform-sync.js +7 -4
  104. package/dist/core/sync/platform-sync.js.map +1 -1
  105. package/dist/core/sync/root-files-sync.js +59 -1
  106. package/dist/core/sync/root-files-sync.js.map +1 -1
  107. package/dist/core/uninstall/uninstall-file-discovery.js +1 -2
  108. package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
  109. package/dist/types/index.js.map +1 -1
  110. package/dist/utils/file-processing.js +5 -58
  111. package/dist/utils/file-processing.js.map +1 -1
  112. package/dist/utils/index-based-installer.js +15 -33
  113. package/dist/utils/index-based-installer.js.map +1 -1
  114. package/dist/utils/install-file-discovery.js +3 -3
  115. package/dist/utils/install-file-discovery.js.map +1 -1
  116. package/dist/utils/install-orchestrator.js +21 -21
  117. package/dist/utils/install-orchestrator.js.map +1 -1
  118. package/dist/utils/jsonc.js +44 -0
  119. package/dist/utils/jsonc.js.map +1 -0
  120. package/dist/utils/package-copy.js +199 -0
  121. package/dist/utils/package-copy.js.map +1 -0
  122. package/dist/utils/package-filters.js +125 -0
  123. package/dist/utils/package-filters.js.map +1 -0
  124. package/dist/utils/package-index-yml.js +15 -10
  125. package/dist/utils/package-index-yml.js.map +1 -1
  126. package/dist/utils/package-installation.js +4 -113
  127. package/dist/utils/package-installation.js.map +1 -1
  128. package/dist/utils/package-local-files.js +2 -35
  129. package/dist/utils/package-local-files.js.map +1 -1
  130. package/dist/utils/package-management.js +59 -37
  131. package/dist/utils/package-management.js.map +1 -1
  132. package/dist/utils/package-yml.js +24 -0
  133. package/dist/utils/package-yml.js.map +1 -1
  134. package/dist/utils/path-normalization.js +8 -53
  135. package/dist/utils/path-normalization.js.map +1 -1
  136. package/dist/utils/paths.js +17 -9
  137. package/dist/utils/paths.js.map +1 -1
  138. package/dist/utils/platform-file.js +16 -59
  139. package/dist/utils/platform-file.js.map +1 -1
  140. package/dist/utils/platform-mapper.js +29 -41
  141. package/dist/utils/platform-mapper.js.map +1 -1
  142. package/dist/utils/platform-specific-paths.js.map +1 -1
  143. package/dist/utils/platform-utils.js +28 -139
  144. package/dist/utils/platform-utils.js.map +1 -1
  145. package/dist/utils/platform-yaml-merge.js +13 -6
  146. package/dist/utils/platform-yaml-merge.js.map +1 -1
  147. package/dist/utils/registry-entry-filter.js +38 -24
  148. package/dist/utils/registry-entry-filter.js.map +1 -1
  149. package/dist/utils/registry-paths.js +10 -0
  150. package/dist/utils/registry-paths.js.map +1 -0
  151. package/dist/utils/root-file-installer.js +19 -0
  152. package/dist/utils/root-file-installer.js.map +1 -1
  153. package/dist/utils/root-file-registry.js.map +1 -1
  154. package/package.json +3 -2
  155. package/platforms.jsonc +178 -0
  156. package/specs/package/README.md +60 -0
  157. package/specs/package/nested-packages-and-parent-packages.md +79 -0
  158. package/specs/package/package-index-yml.md +171 -0
  159. package/specs/package/package-root-layout.md +78 -0
  160. package/specs/package/registry-payload-and-copy.md +77 -0
  161. package/specs/package/universal-content.md +144 -0
  162. package/specs/platforms.md +193 -0
  163. package/specs/save/README.md +40 -0
  164. package/specs/save/save-conflict-resolution.md +146 -0
  165. package/specs/save/save-file-discovery.md +101 -0
  166. package/specs/save/save-frontmatter-overrides.md +81 -0
  167. package/specs/save/save-modes-inputs.md +53 -0
  168. package/specs/save/save-naming-scoping.md +93 -0
  169. package/specs/save/save-package-detection.md +60 -0
  170. package/specs/save/save-registry-sync.md +126 -0
  171. package/dist/commands/release.js +0 -33
  172. package/dist/commands/release.js.map +0 -1
  173. package/dist/commands/tag.js +0 -311
  174. package/dist/commands/tag.js.map +0 -1
  175. package/dist/commands/update.js +0 -30
  176. package/dist/commands/update.js.map +0 -1
  177. package/dist/core/add/formula-index-updater.js +0 -290
  178. package/dist/core/add/formula-index-updater.js.map +0 -1
  179. package/dist/core/discovery/ai-files-discovery.js +0 -2
  180. package/dist/core/discovery/ai-files-discovery.js.map +0 -1
  181. package/dist/core/discovery/formula-files-discovery.js +0 -14
  182. package/dist/core/discovery/formula-files-discovery.js.map +0 -1
  183. package/dist/core/discovery/index-files-discovery.js +0 -91
  184. package/dist/core/discovery/index-files-discovery.js.map +0 -1
  185. package/dist/core/discovery/md-files-discovery.js +0 -82
  186. package/dist/core/discovery/md-files-discovery.js.map +0 -1
  187. package/dist/core/discovery/package-files-discovery.js +0 -14
  188. package/dist/core/discovery/package-files-discovery.js.map +0 -1
  189. package/dist/core/discovery/platform-discovery.js +0 -84
  190. package/dist/core/discovery/platform-discovery.js.map +0 -1
  191. package/dist/core/discovery/root-files-discovery.js +0 -2
  192. package/dist/core/discovery/root-files-discovery.js.map +0 -1
  193. package/dist/core/formula.js +0 -170
  194. package/dist/core/formula.js.map +0 -1
  195. package/dist/core/git-registry.js +0 -46
  196. package/dist/core/git-registry.js.map +0 -1
  197. package/dist/core/groundzero.js +0 -277
  198. package/dist/core/groundzero.js.map +0 -1
  199. package/dist/core/install/scenario.js +0 -11
  200. package/dist/core/install/scenario.js.map +0 -1
  201. package/dist/core/package-sync.js +0 -219
  202. package/dist/core/package-sync.js.map +0 -1
  203. package/dist/core/save/formula-file-generator.js +0 -167
  204. package/dist/core/save/formula-file-generator.js.map +0 -1
  205. package/dist/core/save/formula-saver.js +0 -52
  206. package/dist/core/save/formula-saver.js.map +0 -1
  207. package/dist/core/save/formula-yml-generator.js +0 -89
  208. package/dist/core/save/formula-yml-generator.js.map +0 -1
  209. package/dist/core/save/formula-yml-versioning.js +0 -108
  210. package/dist/core/save/formula-yml-versioning.js.map +0 -1
  211. package/dist/core/save/generic-file-sync.js +0 -38
  212. package/dist/core/save/generic-file-sync.js.map +0 -1
  213. package/dist/core/save/md-files-sync.js +0 -33
  214. package/dist/core/save/md-files-sync.js.map +0 -1
  215. package/dist/core/save/package-yml-versioning.js +0 -108
  216. package/dist/core/save/package-yml-versioning.js.map +0 -1
  217. package/dist/core/save/platform-sync.js +0 -95
  218. package/dist/core/save/platform-sync.js.map +0 -1
  219. package/dist/core/save/root-files-sync.js +0 -140
  220. package/dist/core/save/root-files-sync.js.map +0 -1
  221. package/dist/core/save/save-candidate-types.js +0 -2
  222. package/dist/core/save/save-candidate-types.js.map +0 -1
  223. package/dist/core/save/save-conflict-types.js +0 -2
  224. package/dist/core/save/save-conflict-types.js.map +0 -1
  225. package/dist/core/save/save-file-discovery.js +0 -5
  226. package/dist/core/save/save-file-discovery.js.map +0 -1
  227. package/dist/core/status-file-discovery.js +0 -175
  228. package/dist/core/status-file-discovery.js.map +0 -1
  229. package/dist/utils/discovery/file-processing.js +0 -156
  230. package/dist/utils/discovery/file-processing.js.map +0 -1
  231. package/dist/utils/discovery/formula-discovery.js +0 -211
  232. package/dist/utils/discovery/formula-discovery.js.map +0 -1
  233. package/dist/utils/discovery/platform-discovery.js +0 -2
  234. package/dist/utils/discovery/platform-discovery.js.map +0 -1
  235. package/dist/utils/formula-discovery.js +0 -102
  236. package/dist/utils/formula-discovery.js.map +0 -1
  237. package/dist/utils/formula-index-yml.js +0 -122
  238. package/dist/utils/formula-index-yml.js.map +0 -1
  239. package/dist/utils/formula-installation.js +0 -110
  240. package/dist/utils/formula-installation.js.map +0 -1
  241. package/dist/utils/formula-local-files.js +0 -38
  242. package/dist/utils/formula-local-files.js.map +0 -1
  243. package/dist/utils/formula-management.js +0 -191
  244. package/dist/utils/formula-management.js.map +0 -1
  245. package/dist/utils/formula-name.js +0 -97
  246. package/dist/utils/formula-name.js.map +0 -1
  247. package/dist/utils/formula-versioning.js +0 -109
  248. package/dist/utils/formula-versioning.js.map +0 -1
  249. package/dist/utils/formula-yml.js +0 -82
  250. package/dist/utils/formula-yml.js.map +0 -1
  251. package/dist/utils/git.js +0 -54
  252. package/dist/utils/git.js.map +0 -1
  253. package/dist/utils/id-based-discovery.js +0 -126
  254. package/dist/utils/id-based-discovery.js.map +0 -1
  255. package/dist/utils/id-based-installer.js +0 -249
  256. package/dist/utils/id-based-installer.js.map +0 -1
  257. package/dist/utils/index-yml-based-installer.js +0 -375
  258. package/dist/utils/index-yml-based-installer.js.map +0 -1
  259. package/dist/utils/index-yml.js +0 -124
  260. package/dist/utils/index-yml.js.map +0 -1
  261. package/dist/utils/md-frontmatter.js +0 -3
  262. package/dist/utils/md-frontmatter.js.map +0 -1
  263. package/dist/utils/package-link-yml.js +0 -92
  264. package/dist/utils/package-link-yml.js.map +0 -1
  265. package/dist/utils/platform-discovery.js +0 -2
  266. package/dist/utils/platform-discovery.js.map +0 -1
  267. package/dist/utils/platform-frontmatter-split.js +0 -15
  268. package/dist/utils/platform-frontmatter-split.js.map +0 -1
  269. package/dist/utils/timestamp-encoder.js +0 -13
  270. package/dist/utils/timestamp-encoder.js.map +0 -1
  271. package/dist/utils/wip-versioning.js +0 -24
  272. 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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"}