@a1st/aix-core 0.0.3

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/dist/backup.d.ts +12 -0
  2. package/dist/backup.d.ts.map +1 -0
  3. package/dist/backup.js +70 -0
  4. package/dist/backup.js.map +1 -0
  5. package/dist/cache/cleanup.d.ts +14 -0
  6. package/dist/cache/cleanup.d.ts.map +1 -0
  7. package/dist/cache/cleanup.js +61 -0
  8. package/dist/cache/cleanup.js.map +1 -0
  9. package/dist/cache/clear.d.ts +10 -0
  10. package/dist/cache/clear.d.ts.map +1 -0
  11. package/dist/cache/clear.js +30 -0
  12. package/dist/cache/clear.js.map +1 -0
  13. package/dist/cache/index.d.ts +5 -0
  14. package/dist/cache/index.d.ts.map +1 -0
  15. package/dist/cache/index.js +5 -0
  16. package/dist/cache/index.js.map +1 -0
  17. package/dist/cache/paths.d.ts +57 -0
  18. package/dist/cache/paths.d.ts.map +1 -0
  19. package/dist/cache/paths.js +86 -0
  20. package/dist/cache/paths.js.map +1 -0
  21. package/dist/cache/status.d.ts +21 -0
  22. package/dist/cache/status.d.ts.map +1 -0
  23. package/dist/cache/status.js +67 -0
  24. package/dist/cache/status.js.map +1 -0
  25. package/dist/discovery.d.ts +14 -0
  26. package/dist/discovery.d.ts.map +1 -0
  27. package/dist/discovery.js +96 -0
  28. package/dist/discovery.js.map +1 -0
  29. package/dist/editors/adapters/base.d.ts +101 -0
  30. package/dist/editors/adapters/base.d.ts.map +1 -0
  31. package/dist/editors/adapters/base.js +399 -0
  32. package/dist/editors/adapters/base.js.map +1 -0
  33. package/dist/editors/adapters/claude-code.d.ts +27 -0
  34. package/dist/editors/adapters/claude-code.d.ts.map +1 -0
  35. package/dist/editors/adapters/claude-code.js +46 -0
  36. package/dist/editors/adapters/claude-code.js.map +1 -0
  37. package/dist/editors/adapters/codex.d.ts +30 -0
  38. package/dist/editors/adapters/codex.d.ts.map +1 -0
  39. package/dist/editors/adapters/codex.js +56 -0
  40. package/dist/editors/adapters/codex.js.map +1 -0
  41. package/dist/editors/adapters/cursor.d.ts +23 -0
  42. package/dist/editors/adapters/cursor.d.ts.map +1 -0
  43. package/dist/editors/adapters/cursor.js +39 -0
  44. package/dist/editors/adapters/cursor.js.map +1 -0
  45. package/dist/editors/adapters/index.d.ts +8 -0
  46. package/dist/editors/adapters/index.d.ts.map +1 -0
  47. package/dist/editors/adapters/index.js +8 -0
  48. package/dist/editors/adapters/index.js.map +1 -0
  49. package/dist/editors/adapters/vscode.d.ts +23 -0
  50. package/dist/editors/adapters/vscode.d.ts.map +1 -0
  51. package/dist/editors/adapters/vscode.js +36 -0
  52. package/dist/editors/adapters/vscode.js.map +1 -0
  53. package/dist/editors/adapters/windsurf.d.ts +23 -0
  54. package/dist/editors/adapters/windsurf.d.ts.map +1 -0
  55. package/dist/editors/adapters/windsurf.js +38 -0
  56. package/dist/editors/adapters/windsurf.js.map +1 -0
  57. package/dist/editors/adapters/zed.d.ts +29 -0
  58. package/dist/editors/adapters/zed.d.ts.map +1 -0
  59. package/dist/editors/adapters/zed.js +61 -0
  60. package/dist/editors/adapters/zed.js.map +1 -0
  61. package/dist/editors/import.d.ts +31 -0
  62. package/dist/editors/import.d.ts.map +1 -0
  63. package/dist/editors/import.js +271 -0
  64. package/dist/editors/import.js.map +1 -0
  65. package/dist/editors/index.d.ts +6 -0
  66. package/dist/editors/index.d.ts.map +1 -0
  67. package/dist/editors/index.js +4 -0
  68. package/dist/editors/index.js.map +1 -0
  69. package/dist/editors/install.d.ts +33 -0
  70. package/dist/editors/install.d.ts.map +1 -0
  71. package/dist/editors/install.js +186 -0
  72. package/dist/editors/install.js.map +1 -0
  73. package/dist/editors/strategies/claude-code/hooks.d.ts +13 -0
  74. package/dist/editors/strategies/claude-code/hooks.d.ts.map +1 -0
  75. package/dist/editors/strategies/claude-code/hooks.js +61 -0
  76. package/dist/editors/strategies/claude-code/hooks.js.map +1 -0
  77. package/dist/editors/strategies/claude-code/index.d.ts +5 -0
  78. package/dist/editors/strategies/claude-code/index.d.ts.map +1 -0
  79. package/dist/editors/strategies/claude-code/index.js +5 -0
  80. package/dist/editors/strategies/claude-code/index.js.map +1 -0
  81. package/dist/editors/strategies/claude-code/mcp.d.ts +10 -0
  82. package/dist/editors/strategies/claude-code/mcp.d.ts.map +1 -0
  83. package/dist/editors/strategies/claude-code/mcp.js +17 -0
  84. package/dist/editors/strategies/claude-code/mcp.js.map +1 -0
  85. package/dist/editors/strategies/claude-code/prompts.d.ts +18 -0
  86. package/dist/editors/strategies/claude-code/prompts.d.ts.map +1 -0
  87. package/dist/editors/strategies/claude-code/prompts.js +42 -0
  88. package/dist/editors/strategies/claude-code/prompts.js.map +1 -0
  89. package/dist/editors/strategies/claude-code/rules.d.ts +17 -0
  90. package/dist/editors/strategies/claude-code/rules.d.ts.map +1 -0
  91. package/dist/editors/strategies/claude-code/rules.js +61 -0
  92. package/dist/editors/strategies/claude-code/rules.js.map +1 -0
  93. package/dist/editors/strategies/codex/index.d.ts +4 -0
  94. package/dist/editors/strategies/codex/index.d.ts.map +1 -0
  95. package/dist/editors/strategies/codex/index.js +4 -0
  96. package/dist/editors/strategies/codex/index.js.map +1 -0
  97. package/dist/editors/strategies/codex/mcp.d.ts +18 -0
  98. package/dist/editors/strategies/codex/mcp.d.ts.map +1 -0
  99. package/dist/editors/strategies/codex/mcp.js +93 -0
  100. package/dist/editors/strategies/codex/mcp.js.map +1 -0
  101. package/dist/editors/strategies/codex/prompts.d.ts +37 -0
  102. package/dist/editors/strategies/codex/prompts.d.ts.map +1 -0
  103. package/dist/editors/strategies/codex/prompts.js +82 -0
  104. package/dist/editors/strategies/codex/prompts.js.map +1 -0
  105. package/dist/editors/strategies/codex/rules.d.ts +17 -0
  106. package/dist/editors/strategies/codex/rules.d.ts.map +1 -0
  107. package/dist/editors/strategies/codex/rules.js +35 -0
  108. package/dist/editors/strategies/codex/rules.js.map +1 -0
  109. package/dist/editors/strategies/cursor/hooks.d.ts +13 -0
  110. package/dist/editors/strategies/cursor/hooks.d.ts.map +1 -0
  111. package/dist/editors/strategies/cursor/hooks.js +54 -0
  112. package/dist/editors/strategies/cursor/hooks.js.map +1 -0
  113. package/dist/editors/strategies/cursor/index.d.ts +4 -0
  114. package/dist/editors/strategies/cursor/index.d.ts.map +1 -0
  115. package/dist/editors/strategies/cursor/index.js +4 -0
  116. package/dist/editors/strategies/cursor/index.js.map +1 -0
  117. package/dist/editors/strategies/cursor/prompts.d.ts +18 -0
  118. package/dist/editors/strategies/cursor/prompts.d.ts.map +1 -0
  119. package/dist/editors/strategies/cursor/prompts.js +67 -0
  120. package/dist/editors/strategies/cursor/prompts.js.map +1 -0
  121. package/dist/editors/strategies/cursor/rules.d.ts +17 -0
  122. package/dist/editors/strategies/cursor/rules.d.ts.map +1 -0
  123. package/dist/editors/strategies/cursor/rules.js +41 -0
  124. package/dist/editors/strategies/cursor/rules.js.map +1 -0
  125. package/dist/editors/strategies/index.d.ts +9 -0
  126. package/dist/editors/strategies/index.d.ts.map +1 -0
  127. package/dist/editors/strategies/index.js +10 -0
  128. package/dist/editors/strategies/index.js.map +1 -0
  129. package/dist/editors/strategies/shared/global-mcp.d.ts +74 -0
  130. package/dist/editors/strategies/shared/global-mcp.d.ts.map +1 -0
  131. package/dist/editors/strategies/shared/global-mcp.js +85 -0
  132. package/dist/editors/strategies/shared/global-mcp.js.map +1 -0
  133. package/dist/editors/strategies/shared/index.d.ts +8 -0
  134. package/dist/editors/strategies/shared/index.d.ts.map +1 -0
  135. package/dist/editors/strategies/shared/index.js +8 -0
  136. package/dist/editors/strategies/shared/index.js.map +1 -0
  137. package/dist/editors/strategies/shared/native-skills.d.ts +19 -0
  138. package/dist/editors/strategies/shared/native-skills.d.ts.map +1 -0
  139. package/dist/editors/strategies/shared/native-skills.js +72 -0
  140. package/dist/editors/strategies/shared/native-skills.js.map +1 -0
  141. package/dist/editors/strategies/shared/no-hooks.d.ts +13 -0
  142. package/dist/editors/strategies/shared/no-hooks.d.ts.map +1 -0
  143. package/dist/editors/strategies/shared/no-hooks.js +19 -0
  144. package/dist/editors/strategies/shared/no-hooks.js.map +1 -0
  145. package/dist/editors/strategies/shared/no-mcp.d.ts +16 -0
  146. package/dist/editors/strategies/shared/no-mcp.d.ts.map +1 -0
  147. package/dist/editors/strategies/shared/no-mcp.js +21 -0
  148. package/dist/editors/strategies/shared/no-mcp.js.map +1 -0
  149. package/dist/editors/strategies/shared/no-prompts.d.ts +17 -0
  150. package/dist/editors/strategies/shared/no-prompts.d.ts.map +1 -0
  151. package/dist/editors/strategies/shared/no-prompts.js +24 -0
  152. package/dist/editors/strategies/shared/no-prompts.js.map +1 -0
  153. package/dist/editors/strategies/shared/pointer-skills.d.ts +17 -0
  154. package/dist/editors/strategies/shared/pointer-skills.d.ts.map +1 -0
  155. package/dist/editors/strategies/shared/pointer-skills.js +72 -0
  156. package/dist/editors/strategies/shared/pointer-skills.js.map +1 -0
  157. package/dist/editors/strategies/shared/standard-mcp.d.ts +16 -0
  158. package/dist/editors/strategies/shared/standard-mcp.d.ts.map +1 -0
  159. package/dist/editors/strategies/shared/standard-mcp.js +68 -0
  160. package/dist/editors/strategies/shared/standard-mcp.js.map +1 -0
  161. package/dist/editors/strategies/types.d.ts +126 -0
  162. package/dist/editors/strategies/types.d.ts.map +1 -0
  163. package/dist/editors/strategies/types.js +2 -0
  164. package/dist/editors/strategies/types.js.map +1 -0
  165. package/dist/editors/strategies/vscode/index.d.ts +4 -0
  166. package/dist/editors/strategies/vscode/index.d.ts.map +1 -0
  167. package/dist/editors/strategies/vscode/index.js +4 -0
  168. package/dist/editors/strategies/vscode/index.js.map +1 -0
  169. package/dist/editors/strategies/vscode/mcp.d.ts +17 -0
  170. package/dist/editors/strategies/vscode/mcp.d.ts.map +1 -0
  171. package/dist/editors/strategies/vscode/mcp.js +85 -0
  172. package/dist/editors/strategies/vscode/mcp.js.map +1 -0
  173. package/dist/editors/strategies/vscode/prompts.d.ts +18 -0
  174. package/dist/editors/strategies/vscode/prompts.d.ts.map +1 -0
  175. package/dist/editors/strategies/vscode/prompts.js +81 -0
  176. package/dist/editors/strategies/vscode/prompts.js.map +1 -0
  177. package/dist/editors/strategies/vscode/rules.d.ts +17 -0
  178. package/dist/editors/strategies/vscode/rules.d.ts.map +1 -0
  179. package/dist/editors/strategies/vscode/rules.js +38 -0
  180. package/dist/editors/strategies/vscode/rules.js.map +1 -0
  181. package/dist/editors/strategies/windsurf/hooks.d.ts +13 -0
  182. package/dist/editors/strategies/windsurf/hooks.d.ts.map +1 -0
  183. package/dist/editors/strategies/windsurf/hooks.js +61 -0
  184. package/dist/editors/strategies/windsurf/hooks.js.map +1 -0
  185. package/dist/editors/strategies/windsurf/index.d.ts +6 -0
  186. package/dist/editors/strategies/windsurf/index.d.ts.map +1 -0
  187. package/dist/editors/strategies/windsurf/index.js +6 -0
  188. package/dist/editors/strategies/windsurf/index.js.map +1 -0
  189. package/dist/editors/strategies/windsurf/mcp.d.ts +8 -0
  190. package/dist/editors/strategies/windsurf/mcp.d.ts.map +1 -0
  191. package/dist/editors/strategies/windsurf/mcp.js +99 -0
  192. package/dist/editors/strategies/windsurf/mcp.js.map +1 -0
  193. package/dist/editors/strategies/windsurf/prompts.d.ts +18 -0
  194. package/dist/editors/strategies/windsurf/prompts.d.ts.map +1 -0
  195. package/dist/editors/strategies/windsurf/prompts.js +68 -0
  196. package/dist/editors/strategies/windsurf/prompts.js.map +1 -0
  197. package/dist/editors/strategies/windsurf/rules.d.ts +17 -0
  198. package/dist/editors/strategies/windsurf/rules.d.ts.map +1 -0
  199. package/dist/editors/strategies/windsurf/rules.js +55 -0
  200. package/dist/editors/strategies/windsurf/rules.js.map +1 -0
  201. package/dist/editors/strategies/windsurf/skills.d.ts +9 -0
  202. package/dist/editors/strategies/windsurf/skills.d.ts.map +1 -0
  203. package/dist/editors/strategies/windsurf/skills.js +11 -0
  204. package/dist/editors/strategies/windsurf/skills.js.map +1 -0
  205. package/dist/editors/strategies/zed/index.d.ts +4 -0
  206. package/dist/editors/strategies/zed/index.d.ts.map +1 -0
  207. package/dist/editors/strategies/zed/index.js +4 -0
  208. package/dist/editors/strategies/zed/index.js.map +1 -0
  209. package/dist/editors/strategies/zed/mcp.d.ts +17 -0
  210. package/dist/editors/strategies/zed/mcp.d.ts.map +1 -0
  211. package/dist/editors/strategies/zed/mcp.js +68 -0
  212. package/dist/editors/strategies/zed/mcp.js.map +1 -0
  213. package/dist/editors/strategies/zed/prompts.d.ts +18 -0
  214. package/dist/editors/strategies/zed/prompts.d.ts.map +1 -0
  215. package/dist/editors/strategies/zed/prompts.js +25 -0
  216. package/dist/editors/strategies/zed/prompts.js.map +1 -0
  217. package/dist/editors/strategies/zed/rules.d.ts +17 -0
  218. package/dist/editors/strategies/zed/rules.d.ts.map +1 -0
  219. package/dist/editors/strategies/zed/rules.js +33 -0
  220. package/dist/editors/strategies/zed/rules.js.map +1 -0
  221. package/dist/editors/types.d.ts +164 -0
  222. package/dist/editors/types.d.ts.map +1 -0
  223. package/dist/editors/types.js +2 -0
  224. package/dist/editors/types.js.map +1 -0
  225. package/dist/env/ci.d.ts +6 -0
  226. package/dist/env/ci.d.ts.map +1 -0
  227. package/dist/env/ci.js +22 -0
  228. package/dist/env/ci.js.map +1 -0
  229. package/dist/env/index.d.ts +2 -0
  230. package/dist/env/index.d.ts.map +1 -0
  231. package/dist/env/index.js +2 -0
  232. package/dist/env/index.js.map +1 -0
  233. package/dist/errors.d.ts +44 -0
  234. package/dist/errors.d.ts.map +1 -0
  235. package/dist/errors.js +68 -0
  236. package/dist/errors.js.map +1 -0
  237. package/dist/format-error.d.ts +18 -0
  238. package/dist/format-error.d.ts.map +1 -0
  239. package/dist/format-error.js +113 -0
  240. package/dist/format-error.js.map +1 -0
  241. package/dist/fs/safe-rm.d.ts +20 -0
  242. package/dist/fs/safe-rm.d.ts.map +1 -0
  243. package/dist/fs/safe-rm.js +129 -0
  244. package/dist/fs/safe-rm.js.map +1 -0
  245. package/dist/git-loader.d.ts +21 -0
  246. package/dist/git-loader.d.ts.map +1 -0
  247. package/dist/git-loader.js +61 -0
  248. package/dist/git-loader.js.map +1 -0
  249. package/dist/global/comparison.d.ts +16 -0
  250. package/dist/global/comparison.d.ts.map +1 -0
  251. package/dist/global/comparison.js +52 -0
  252. package/dist/global/comparison.js.map +1 -0
  253. package/dist/global/index.d.ts +5 -0
  254. package/dist/global/index.d.ts.map +1 -0
  255. package/dist/global/index.js +4 -0
  256. package/dist/global/index.js.map +1 -0
  257. package/dist/global/processor.d.ts +26 -0
  258. package/dist/global/processor.d.ts.map +1 -0
  259. package/dist/global/processor.js +318 -0
  260. package/dist/global/processor.js.map +1 -0
  261. package/dist/global/tracking.d.ts +109 -0
  262. package/dist/global/tracking.d.ts.map +1 -0
  263. package/dist/global/tracking.js +193 -0
  264. package/dist/global/tracking.js.map +1 -0
  265. package/dist/global/types.d.ts +54 -0
  266. package/dist/global/types.d.ts.map +1 -0
  267. package/dist/global/types.js +2 -0
  268. package/dist/global/types.js.map +1 -0
  269. package/dist/import-writer.d.ts +37 -0
  270. package/dist/import-writer.d.ts.map +1 -0
  271. package/dist/import-writer.js +129 -0
  272. package/dist/import-writer.js.map +1 -0
  273. package/dist/index.d.ts +23 -0
  274. package/dist/index.d.ts.map +1 -0
  275. package/dist/index.js +23 -0
  276. package/dist/index.js.map +1 -0
  277. package/dist/inheritance.d.ts +9 -0
  278. package/dist/inheritance.d.ts.map +1 -0
  279. package/dist/inheritance.js +133 -0
  280. package/dist/inheritance.js.map +1 -0
  281. package/dist/json.d.ts +75 -0
  282. package/dist/json.d.ts.map +1 -0
  283. package/dist/json.js +123 -0
  284. package/dist/json.js.map +1 -0
  285. package/dist/loader.d.ts +35 -0
  286. package/dist/loader.d.ts.map +1 -0
  287. package/dist/loader.js +147 -0
  288. package/dist/loader.js.map +1 -0
  289. package/dist/mcp/env.d.ts +28 -0
  290. package/dist/mcp/env.d.ts.map +1 -0
  291. package/dist/mcp/env.js +47 -0
  292. package/dist/mcp/env.js.map +1 -0
  293. package/dist/mcp/index.d.ts +4 -0
  294. package/dist/mcp/index.d.ts.map +1 -0
  295. package/dist/mcp/index.js +4 -0
  296. package/dist/mcp/index.js.map +1 -0
  297. package/dist/mcp/normalize.d.ts +33 -0
  298. package/dist/mcp/normalize.d.ts.map +1 -0
  299. package/dist/mcp/normalize.js +29 -0
  300. package/dist/mcp/normalize.js.map +1 -0
  301. package/dist/mcp/templates.d.ts +18 -0
  302. package/dist/mcp/templates.d.ts.map +1 -0
  303. package/dist/mcp/templates.js +66 -0
  304. package/dist/mcp/templates.js.map +1 -0
  305. package/dist/merge.d.ts +29 -0
  306. package/dist/merge.d.ts.map +1 -0
  307. package/dist/merge.js +154 -0
  308. package/dist/merge.js.map +1 -0
  309. package/dist/npm/index.d.ts +2 -0
  310. package/dist/npm/index.d.ts.map +1 -0
  311. package/dist/npm/index.js +2 -0
  312. package/dist/npm/index.js.map +1 -0
  313. package/dist/npm/resolve.d.ts +16 -0
  314. package/dist/npm/resolve.d.ts.map +1 -0
  315. package/dist/npm/resolve.js +42 -0
  316. package/dist/npm/resolve.js.map +1 -0
  317. package/dist/prompts/index.d.ts +2 -0
  318. package/dist/prompts/index.d.ts.map +1 -0
  319. package/dist/prompts/index.js +2 -0
  320. package/dist/prompts/index.js.map +1 -0
  321. package/dist/prompts/loader.d.ts +23 -0
  322. package/dist/prompts/loader.d.ts.map +1 -0
  323. package/dist/prompts/loader.js +115 -0
  324. package/dist/prompts/loader.js.map +1 -0
  325. package/dist/remote-loader.d.ts +29 -0
  326. package/dist/remote-loader.d.ts.map +1 -0
  327. package/dist/remote-loader.js +208 -0
  328. package/dist/remote-loader.js.map +1 -0
  329. package/dist/rules/index.d.ts +6 -0
  330. package/dist/rules/index.d.ts.map +1 -0
  331. package/dist/rules/index.js +6 -0
  332. package/dist/rules/index.js.map +1 -0
  333. package/dist/rules/interpolate.d.ts +27 -0
  334. package/dist/rules/interpolate.d.ts.map +1 -0
  335. package/dist/rules/interpolate.js +48 -0
  336. package/dist/rules/interpolate.js.map +1 -0
  337. package/dist/rules/loader.d.ts +27 -0
  338. package/dist/rules/loader.d.ts.map +1 -0
  339. package/dist/rules/loader.js +94 -0
  340. package/dist/rules/loader.js.map +1 -0
  341. package/dist/rules/merger.d.ts +37 -0
  342. package/dist/rules/merger.d.ts.map +1 -0
  343. package/dist/rules/merger.js +93 -0
  344. package/dist/rules/merger.js.map +1 -0
  345. package/dist/rules/skill-rules.d.ts +13 -0
  346. package/dist/rules/skill-rules.d.ts.map +1 -0
  347. package/dist/rules/skill-rules.js +70 -0
  348. package/dist/rules/skill-rules.js.map +1 -0
  349. package/dist/rules/utils.d.ts +36 -0
  350. package/dist/rules/utils.d.ts.map +1 -0
  351. package/dist/rules/utils.js +82 -0
  352. package/dist/rules/utils.js.map +1 -0
  353. package/dist/skills/cache.d.ts +10 -0
  354. package/dist/skills/cache.d.ts.map +1 -0
  355. package/dist/skills/cache.js +20 -0
  356. package/dist/skills/cache.js.map +1 -0
  357. package/dist/skills/index.d.ts +9 -0
  358. package/dist/skills/index.d.ts.map +1 -0
  359. package/dist/skills/index.js +9 -0
  360. package/dist/skills/index.js.map +1 -0
  361. package/dist/skills/parser.d.ts +6 -0
  362. package/dist/skills/parser.d.ts.map +1 -0
  363. package/dist/skills/parser.js +28 -0
  364. package/dist/skills/parser.js.map +1 -0
  365. package/dist/skills/reference-parser.d.ts +23 -0
  366. package/dist/skills/reference-parser.d.ts.map +1 -0
  367. package/dist/skills/reference-parser.js +162 -0
  368. package/dist/skills/reference-parser.js.map +1 -0
  369. package/dist/skills/resolve.d.ts +21 -0
  370. package/dist/skills/resolve.d.ts.map +1 -0
  371. package/dist/skills/resolve.js +43 -0
  372. package/dist/skills/resolve.js.map +1 -0
  373. package/dist/skills/resolvers/git.d.ts +8 -0
  374. package/dist/skills/resolvers/git.d.ts.map +1 -0
  375. package/dist/skills/resolvers/git.js +43 -0
  376. package/dist/skills/resolvers/git.js.map +1 -0
  377. package/dist/skills/resolvers/local.d.ts +7 -0
  378. package/dist/skills/resolvers/local.d.ts.map +1 -0
  379. package/dist/skills/resolvers/local.js +16 -0
  380. package/dist/skills/resolvers/local.js.map +1 -0
  381. package/dist/skills/resolvers/npm.d.ts +12 -0
  382. package/dist/skills/resolvers/npm.d.ts.map +1 -0
  383. package/dist/skills/resolvers/npm.js +28 -0
  384. package/dist/skills/resolvers/npm.js.map +1 -0
  385. package/dist/skills/validate.d.ts +11 -0
  386. package/dist/skills/validate.d.ts.map +1 -0
  387. package/dist/skills/validate.js +43 -0
  388. package/dist/skills/validate.js.map +1 -0
  389. package/dist/updater.d.ts +23 -0
  390. package/dist/updater.d.ts.map +1 -0
  391. package/dist/updater.js +100 -0
  392. package/dist/updater.js.map +1 -0
  393. package/dist/url-parsing.d.ts +121 -0
  394. package/dist/url-parsing.d.ts.map +1 -0
  395. package/dist/url-parsing.js +199 -0
  396. package/dist/url-parsing.js.map +1 -0
  397. package/package.json +41 -0
@@ -0,0 +1,318 @@
1
+ import { mkdir, readFile, writeFile, copyFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, dirname } from 'pathe';
5
+ import { GlobalTrackingService, makeTrackingKey } from './tracking.js';
6
+ import { mcpConfigsMatch, promptsMatch } from './comparison.js';
7
+ import { isCI } from '../env/ci.js';
8
+ import { getTransport } from '../mcp/normalize.js';
9
+ /** Set of global config paths that have been backed up in this session */
10
+ const backedUpPaths = new Set();
11
+ /**
12
+ * Backup a global config file before modifying it.
13
+ * Backups are stored in ~/.aix/backups/ with timestamps.
14
+ * Only backs up once per path per session to avoid excessive backups.
15
+ */
16
+ async function backupGlobalConfig(globalPath) {
17
+ if (!existsSync(globalPath) || backedUpPaths.has(globalPath)) {
18
+ return;
19
+ }
20
+ const backupDir = join(homedir(), '.aix', 'backups'), timestamp = new Date().toISOString().replace(/[:.]/g, '-'),
21
+ // Include relative path from home to preserve context (e.g., .codeium/windsurf/mcp_config.json)
22
+ relativePath = globalPath.replace(homedir(), '').replace(/^\//, ''), safeRelativePath = relativePath.replace(/\//g, '_'), backupPath = join(backupDir, `${safeRelativePath}.${timestamp}.bak`);
23
+ try {
24
+ await mkdir(backupDir, { recursive: true });
25
+ await copyFile(globalPath, backupPath);
26
+ backedUpPaths.add(globalPath);
27
+ }
28
+ catch {
29
+ // Silently fail backup - don't block the operation
30
+ }
31
+ }
32
+ /**
33
+ * Analyze global-only features and determine what changes are needed.
34
+ * This does NOT modify any files - it just builds a list of change requests.
35
+ */
36
+ export async function analyzeGlobalChanges(editor, editorConfig, mcpStrategy, promptsStrategy) {
37
+ const changes = [];
38
+ // Analyze MCP servers if strategy is global-only
39
+ if (mcpStrategy.isGlobalOnly?.() && Object.keys(editorConfig.mcp).length > 0) {
40
+ const globalPath = join(homedir(), mcpStrategy.getGlobalMcpConfigPath() ?? '');
41
+ // Read existing global config
42
+ let existingMcp = {};
43
+ if (existsSync(globalPath)) {
44
+ try {
45
+ const content = await readFile(globalPath, 'utf-8'), { mcp } = mcpStrategy.parseGlobalMcpConfig(content);
46
+ existingMcp = mcp;
47
+ }
48
+ catch {
49
+ // Ignore parse errors - treat as empty
50
+ }
51
+ }
52
+ // Check each MCP server
53
+ for (const [name, config] of Object.entries(editorConfig.mcp)) {
54
+ const existing = existingMcp[name];
55
+ if (existing) {
56
+ // Server exists - check if configs match
57
+ if (mcpConfigsMatch(config, existing)) {
58
+ changes.push({
59
+ editor,
60
+ type: 'mcp',
61
+ name,
62
+ action: 'skip',
63
+ skipReason: 'Already configured identically',
64
+ globalPath,
65
+ mcpConfig: config,
66
+ existingMcpConfig: existing,
67
+ configsMatch: true,
68
+ });
69
+ }
70
+ else {
71
+ // Configs differ - skip and warn
72
+ changes.push({
73
+ editor,
74
+ type: 'mcp',
75
+ name,
76
+ action: 'skip',
77
+ skipReason: 'Existing config differs from ai.json - not modifying',
78
+ globalPath,
79
+ mcpConfig: config,
80
+ existingMcpConfig: existing,
81
+ configsMatch: false,
82
+ });
83
+ }
84
+ }
85
+ else {
86
+ // Server doesn't exist - needs to be added
87
+ changes.push({
88
+ editor,
89
+ type: 'mcp',
90
+ name,
91
+ action: 'add',
92
+ globalPath,
93
+ mcpConfig: config,
94
+ });
95
+ }
96
+ }
97
+ }
98
+ // Analyze prompts if strategy is global-only
99
+ if (promptsStrategy.isGlobalOnly?.() && editorConfig.prompts.length > 0) {
100
+ const globalPromptsPath = promptsStrategy.getGlobalPromptsPath();
101
+ if (globalPromptsPath) {
102
+ const promptChanges = await analyzeGlobalPrompts(editor, editorConfig.prompts, globalPromptsPath, promptsStrategy);
103
+ changes.push(...promptChanges);
104
+ }
105
+ }
106
+ return changes;
107
+ }
108
+ /**
109
+ * Analyze global prompts and determine what changes are needed.
110
+ */
111
+ async function analyzeGlobalPrompts(editor, prompts, globalPromptsPath, promptsStrategy) {
112
+ const changes = [], globalDir = join(homedir(), globalPromptsPath), ext = promptsStrategy.getFileExtension();
113
+ for (const prompt of prompts) {
114
+ const promptPath = join(globalDir, `${prompt.name}${ext}`), formattedContent = promptsStrategy.formatPrompt(prompt);
115
+ // eslint-disable-next-line no-await-in-loop -- Sequential file reads for prompts
116
+ const change = await analyzePromptChange(editor, prompt.name, promptPath, formattedContent);
117
+ changes.push(change);
118
+ }
119
+ return changes;
120
+ }
121
+ /**
122
+ * Analyze a single prompt and determine what change is needed.
123
+ */
124
+ async function analyzePromptChange(editor, name, promptPath, formattedContent) {
125
+ if (!existsSync(promptPath)) {
126
+ return {
127
+ editor,
128
+ type: 'prompt',
129
+ name,
130
+ action: 'add',
131
+ globalPath: promptPath,
132
+ promptContent: formattedContent,
133
+ };
134
+ }
135
+ // Prompt exists - check if content matches
136
+ try {
137
+ const existingContent = await readFile(promptPath, 'utf-8'), configsMatch = promptsMatch(formattedContent, existingContent);
138
+ return {
139
+ editor,
140
+ type: 'prompt',
141
+ name,
142
+ action: 'skip',
143
+ skipReason: configsMatch
144
+ ? 'Already configured identically'
145
+ : 'Existing prompt differs from ai.json - not modifying',
146
+ globalPath: promptPath,
147
+ promptContent: formattedContent,
148
+ existingPromptContent: existingContent,
149
+ configsMatch,
150
+ };
151
+ }
152
+ catch {
153
+ // Can't read - treat as needing add
154
+ return {
155
+ editor,
156
+ type: 'prompt',
157
+ name,
158
+ action: 'add',
159
+ globalPath: promptPath,
160
+ promptContent: formattedContent,
161
+ };
162
+ }
163
+ }
164
+ /**
165
+ * Apply approved global changes. Writes files and updates tracking.
166
+ */
167
+ export async function applyGlobalChanges(changes, options) {
168
+ const tracking = new GlobalTrackingService(), applied = [], skipped = [], warnings = [];
169
+ // Check if in CI - skip all global changes
170
+ if (await isCI()) {
171
+ for (const change of changes) {
172
+ if (change.action === 'add') {
173
+ skipped.push({
174
+ ...change,
175
+ action: 'skip',
176
+ skipReason: 'Skipped in CI environment',
177
+ });
178
+ warnings.push(`[${change.editor}] Skipped global ${change.type} "${change.name}" - CI environment detected`);
179
+ }
180
+ else {
181
+ skipped.push(change);
182
+ }
183
+ }
184
+ return { applied, skipped, warnings };
185
+ }
186
+ // Process each change
187
+ for (const change of changes) {
188
+ if (change.action === 'skip') {
189
+ skipped.push(change);
190
+ // Only warn if configs don't match (not just "already configured")
191
+ if (!change.configsMatch) {
192
+ warnings.push(`[${change.editor}] ${change.type} "${change.name}": ${change.skipReason}`);
193
+ }
194
+ continue;
195
+ }
196
+ // Skip if skipGlobal option is set
197
+ if (options.skipGlobal) {
198
+ skipped.push({
199
+ ...change,
200
+ action: 'skip',
201
+ skipReason: 'Global changes disabled',
202
+ });
203
+ continue;
204
+ }
205
+ // Apply the change
206
+ if (!options.dryRun) {
207
+ try {
208
+ if (change.type === 'mcp' && change.mcpConfig) {
209
+ // For MCP, we need to merge with existing config
210
+ // eslint-disable-next-line no-await-in-loop -- Sequential for atomic operations
211
+ await applyMcpChange(change);
212
+ }
213
+ else if (change.type === 'prompt' && change.promptContent) {
214
+ // Backup before modifying
215
+ // eslint-disable-next-line no-await-in-loop -- Sequential for atomic operations
216
+ await backupGlobalConfig(change.globalPath);
217
+ // For prompts, just write the file
218
+ // eslint-disable-next-line no-await-in-loop -- Sequential for atomic operations
219
+ await mkdir(dirname(change.globalPath), { recursive: true });
220
+ // eslint-disable-next-line no-await-in-loop -- Sequential for atomic operations
221
+ await writeFile(change.globalPath, change.promptContent, 'utf-8');
222
+ }
223
+ // Update tracking
224
+ const key = makeTrackingKey(change.editor, change.type, change.name);
225
+ // eslint-disable-next-line no-await-in-loop -- Sequential for atomic operations
226
+ await tracking.addProjectDependency(key, { type: change.type, editor: change.editor, name: change.name }, options.projectPath);
227
+ }
228
+ catch (error) {
229
+ warnings.push(`[${change.editor}] Failed to apply ${change.type} "${change.name}": ${error.message}`);
230
+ skipped.push({
231
+ ...change,
232
+ action: 'skip',
233
+ skipReason: `Failed: ${error.message}`,
234
+ });
235
+ continue;
236
+ }
237
+ }
238
+ applied.push(change);
239
+ }
240
+ return { applied, skipped, warnings };
241
+ }
242
+ /**
243
+ * Apply an MCP change by merging with existing config.
244
+ */
245
+ async function applyMcpChange(change) {
246
+ const globalPath = change.globalPath;
247
+ let existingConfig = {};
248
+ // Backup before modifying
249
+ await backupGlobalConfig(globalPath);
250
+ // Read existing config if it exists
251
+ if (existsSync(globalPath)) {
252
+ try {
253
+ const content = await readFile(globalPath, 'utf-8');
254
+ existingConfig = JSON.parse(content);
255
+ }
256
+ catch {
257
+ // Start fresh if parse fails
258
+ }
259
+ }
260
+ // Merge the new server into existing config
261
+ const mcpServers = (existingConfig.mcpServers ?? {});
262
+ if (change.mcpConfig) {
263
+ const transport = getTransport(change.mcpConfig), serverConfig = {};
264
+ if (transport.type === 'stdio') {
265
+ serverConfig.command = transport.command;
266
+ serverConfig.args = transport.args ?? [];
267
+ if (transport.env && Object.keys(transport.env).length > 0) {
268
+ serverConfig.env = transport.env;
269
+ }
270
+ }
271
+ else if (transport.type === 'http') {
272
+ serverConfig.url = transport.url;
273
+ }
274
+ // Include disabledTools if present
275
+ if ('disabledTools' in change.mcpConfig && Array.isArray(change.mcpConfig.disabledTools)) {
276
+ serverConfig.disabledTools = change.mcpConfig.disabledTools;
277
+ }
278
+ mcpServers[change.name] = serverConfig;
279
+ }
280
+ existingConfig.mcpServers = mcpServers;
281
+ // Write back
282
+ await mkdir(dirname(globalPath), { recursive: true });
283
+ await writeFile(globalPath, JSON.stringify(existingConfig, null, 2) + '\n', 'utf-8');
284
+ }
285
+ /**
286
+ * Get a summary of global changes for display to the user.
287
+ */
288
+ export function summarizeGlobalChanges(changes) {
289
+ const toAdd = changes.filter((c) => c.action === 'add'), toSkip = changes.filter((c) => c.action === 'skip' && !c.configsMatch), alreadyConfigured = changes.filter((c) => c.action === 'skip' && c.configsMatch);
290
+ return { toAdd, toSkip, alreadyConfigured };
291
+ }
292
+ /**
293
+ * Remove an MCP server from a global config file.
294
+ * Returns true if the server was removed, false if it didn't exist.
295
+ */
296
+ export async function removeFromGlobalMcpConfig(globalPath, serverName) {
297
+ if (!existsSync(globalPath)) {
298
+ return false;
299
+ }
300
+ try {
301
+ const content = await readFile(globalPath, 'utf-8'), config = JSON.parse(content), mcpServers = config.mcpServers;
302
+ if (!mcpServers || !(serverName in mcpServers)) {
303
+ return false;
304
+ }
305
+ // Backup before modifying
306
+ await backupGlobalConfig(globalPath);
307
+ // Remove the server
308
+ delete mcpServers[serverName];
309
+ config.mcpServers = mcpServers;
310
+ // Write back
311
+ await writeFile(globalPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
312
+ return true;
313
+ }
314
+ catch {
315
+ return false;
316
+ }
317
+ }
318
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/global/processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * A single entry in the global tracking file, representing a global config item that aix manages.
3
+ */
4
+ export interface GlobalTrackingEntry {
5
+ /** Type of global config (mcp or prompt) */
6
+ type: 'mcp' | 'prompt';
7
+ /** Editor this entry belongs to */
8
+ editor: string;
9
+ /** Name of the config item (e.g., MCP server name, prompt name) */
10
+ name: string;
11
+ /** Absolute paths of projects that depend on this global config */
12
+ projects: string[];
13
+ /** ISO timestamp when this entry was first added */
14
+ addedAt: string;
15
+ }
16
+ /**
17
+ * Structure of the global tracking file at ~/.aix/global-tracking.json
18
+ */
19
+ export interface GlobalTrackingFile {
20
+ version: 1;
21
+ entries: Record<string, GlobalTrackingEntry>;
22
+ }
23
+ /**
24
+ * Generate a unique key for a global tracking entry.
25
+ */
26
+ export declare function makeTrackingKey(editor: string, type: 'mcp' | 'prompt', name: string): string;
27
+ /**
28
+ * Get the path to the global tracking file.
29
+ */
30
+ export declare function getTrackingFilePath(): string;
31
+ /**
32
+ * Service for managing the global tracking file. Tracks which aix projects depend on global
33
+ * configuration entries (MCP servers, prompts) that were installed by aix.
34
+ *
35
+ * The tracking file is stored at ~/.aix/global-tracking.json and is used to:
36
+ * 1. Know which projects depend on a global config entry
37
+ * 2. Inform users when they can safely remove a global config (no projects depend on it)
38
+ * 3. Detect orphaned entries (tracking says it exists but no projects use it)
39
+ *
40
+ * **Robustness**: This service does NOT verify that the actual global config still exists.
41
+ * Callers should verify global config existence before trusting tracking data.
42
+ */
43
+ export declare class GlobalTrackingService {
44
+ private readonly filePath;
45
+ constructor(filePath?: string);
46
+ /**
47
+ * Load the tracking file. Creates an empty file if it doesn't exist.
48
+ */
49
+ load(): Promise<GlobalTrackingFile>;
50
+ /**
51
+ * Save the tracking file.
52
+ */
53
+ save(data: GlobalTrackingFile): Promise<void>;
54
+ /**
55
+ * Add a project dependency to a global config entry. Creates the entry if it doesn't exist.
56
+ *
57
+ * @param key - Unique key for the entry (use makeTrackingKey)
58
+ * @param entry - Entry metadata (type, editor, name)
59
+ * @param projectPath - Absolute path to the project
60
+ */
61
+ addProjectDependency(key: string, entry: Omit<GlobalTrackingEntry, 'projects' | 'addedAt'>, projectPath: string): Promise<void>;
62
+ /**
63
+ * Remove a project dependency from a global config entry.
64
+ *
65
+ * @returns The remaining projects that still depend on this entry, or empty array if entry
66
+ * doesn't exist or was removed.
67
+ */
68
+ removeProjectDependency(key: string, projectPath: string): Promise<string[]>;
69
+ /**
70
+ * Get a single entry by key.
71
+ */
72
+ getEntry(key: string): Promise<GlobalTrackingEntry | null>;
73
+ /**
74
+ * Check if a project is registered as depending on an entry.
75
+ */
76
+ hasProjectDependency(key: string, projectPath: string): Promise<boolean>;
77
+ /**
78
+ * List all entries in the tracking file.
79
+ */
80
+ listEntries(): Promise<GlobalTrackingEntry[]>;
81
+ /**
82
+ * List entries for a specific editor.
83
+ */
84
+ listEntriesForEditor(editor: string): Promise<GlobalTrackingEntry[]>;
85
+ /**
86
+ * Get orphaned entries - entries with no projects depending on them.
87
+ * This can happen if tracking gets out of sync (e.g., project deleted without running aix).
88
+ */
89
+ getOrphanedEntries(): Promise<GlobalTrackingEntry[]>;
90
+ /**
91
+ * Remove an entry entirely from tracking by its key.
92
+ */
93
+ removeEntry(key: string): Promise<boolean>;
94
+ /**
95
+ * Get entries for a specific project.
96
+ */
97
+ getEntriesForProject(projectPath: string): Promise<GlobalTrackingEntry[]>;
98
+ /**
99
+ * Remove all entries for a project (used when uninstalling aix from a project).
100
+ *
101
+ * @returns Keys of entries that were removed entirely (no other projects depend on them)
102
+ */
103
+ removeAllForProject(projectPath: string): Promise<string[]>;
104
+ /**
105
+ * Normalize a project path for consistent comparison.
106
+ */
107
+ private normalizePath;
108
+ }
109
+ //# sourceMappingURL=tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../src/global/tracking.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACjC,4CAA4C;IAC5C,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,CAAC,EAAE,MAAM;IAI7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAwBzC;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnD;;;;;;OAMG;IACG,oBAAoB,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,SAAS,CAAC,EACxD,WAAW,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;;;;OAKG;IACG,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBlF;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAMhE;;OAEG;IACG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY9E;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAMnD;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAM1E;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAM1D;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhD;;OAEG;IACG,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAO/E;;;;OAIG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBjE;;OAEG;IACH,OAAO,CAAC,aAAa;CAIvB"}
@@ -0,0 +1,193 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, dirname } from 'pathe';
5
+ /**
6
+ * Generate a unique key for a global tracking entry.
7
+ */
8
+ export function makeTrackingKey(editor, type, name) {
9
+ return `${editor}:${type}:${name}`;
10
+ }
11
+ /**
12
+ * Get the path to the global tracking file.
13
+ */
14
+ export function getTrackingFilePath() {
15
+ return join(homedir(), '.aix', 'global-tracking.json');
16
+ }
17
+ /**
18
+ * Service for managing the global tracking file. Tracks which aix projects depend on global
19
+ * configuration entries (MCP servers, prompts) that were installed by aix.
20
+ *
21
+ * The tracking file is stored at ~/.aix/global-tracking.json and is used to:
22
+ * 1. Know which projects depend on a global config entry
23
+ * 2. Inform users when they can safely remove a global config (no projects depend on it)
24
+ * 3. Detect orphaned entries (tracking says it exists but no projects use it)
25
+ *
26
+ * **Robustness**: This service does NOT verify that the actual global config still exists.
27
+ * Callers should verify global config existence before trusting tracking data.
28
+ */
29
+ export class GlobalTrackingService {
30
+ filePath;
31
+ constructor(filePath) {
32
+ this.filePath = filePath ?? getTrackingFilePath();
33
+ }
34
+ /**
35
+ * Load the tracking file. Creates an empty file if it doesn't exist.
36
+ */
37
+ async load() {
38
+ if (!existsSync(this.filePath)) {
39
+ return { version: 1, entries: {} };
40
+ }
41
+ try {
42
+ const content = await readFile(this.filePath, 'utf-8'), data = JSON.parse(content);
43
+ // Validate version
44
+ if (data.version !== 1) {
45
+ throw new Error(`Unsupported tracking file version: ${data.version}`);
46
+ }
47
+ return data;
48
+ }
49
+ catch (error) {
50
+ if (error instanceof SyntaxError) {
51
+ // Corrupted file - return empty and let next save fix it
52
+ return { version: 1, entries: {} };
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ /**
58
+ * Save the tracking file.
59
+ */
60
+ async save(data) {
61
+ await mkdir(dirname(this.filePath), { recursive: true });
62
+ await writeFile(this.filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
63
+ }
64
+ /**
65
+ * Add a project dependency to a global config entry. Creates the entry if it doesn't exist.
66
+ *
67
+ * @param key - Unique key for the entry (use makeTrackingKey)
68
+ * @param entry - Entry metadata (type, editor, name)
69
+ * @param projectPath - Absolute path to the project
70
+ */
71
+ async addProjectDependency(key, entry, projectPath) {
72
+ const data = await this.load(), normalizedPath = this.normalizePath(projectPath);
73
+ if (data.entries[key]) {
74
+ // Entry exists - add project if not already present
75
+ if (!data.entries[key].projects.includes(normalizedPath)) {
76
+ data.entries[key].projects.push(normalizedPath);
77
+ }
78
+ }
79
+ else {
80
+ // Create new entry
81
+ data.entries[key] = {
82
+ ...entry,
83
+ projects: [normalizedPath],
84
+ addedAt: new Date().toISOString(),
85
+ };
86
+ }
87
+ await this.save(data);
88
+ }
89
+ /**
90
+ * Remove a project dependency from a global config entry.
91
+ *
92
+ * @returns The remaining projects that still depend on this entry, or empty array if entry
93
+ * doesn't exist or was removed.
94
+ */
95
+ async removeProjectDependency(key, projectPath) {
96
+ const data = await this.load(), entry = data.entries[key];
97
+ if (!entry) {
98
+ return [];
99
+ }
100
+ const normalizedPath = this.normalizePath(projectPath);
101
+ entry.projects = entry.projects.filter((p) => p !== normalizedPath);
102
+ // If no projects remain, remove the entry entirely
103
+ if (entry.projects.length === 0) {
104
+ delete data.entries[key];
105
+ }
106
+ await this.save(data);
107
+ return entry.projects;
108
+ }
109
+ /**
110
+ * Get a single entry by key.
111
+ */
112
+ async getEntry(key) {
113
+ const data = await this.load();
114
+ return data.entries[key] ?? null;
115
+ }
116
+ /**
117
+ * Check if a project is registered as depending on an entry.
118
+ */
119
+ async hasProjectDependency(key, projectPath) {
120
+ const entry = await this.getEntry(key);
121
+ if (!entry) {
122
+ return false;
123
+ }
124
+ const normalizedPath = this.normalizePath(projectPath);
125
+ return entry.projects.includes(normalizedPath);
126
+ }
127
+ /**
128
+ * List all entries in the tracking file.
129
+ */
130
+ async listEntries() {
131
+ const data = await this.load();
132
+ return Object.values(data.entries);
133
+ }
134
+ /**
135
+ * List entries for a specific editor.
136
+ */
137
+ async listEntriesForEditor(editor) {
138
+ const entries = await this.listEntries();
139
+ return entries.filter((e) => e.editor === editor);
140
+ }
141
+ /**
142
+ * Get orphaned entries - entries with no projects depending on them.
143
+ * This can happen if tracking gets out of sync (e.g., project deleted without running aix).
144
+ */
145
+ async getOrphanedEntries() {
146
+ const entries = await this.listEntries();
147
+ return entries.filter((e) => e.projects.length === 0);
148
+ }
149
+ /**
150
+ * Remove an entry entirely from tracking by its key.
151
+ */
152
+ async removeEntry(key) {
153
+ const data = await this.load();
154
+ if (!data.entries[key]) {
155
+ return false;
156
+ }
157
+ delete data.entries[key];
158
+ await this.save(data);
159
+ return true;
160
+ }
161
+ /**
162
+ * Get entries for a specific project.
163
+ */
164
+ async getEntriesForProject(projectPath) {
165
+ const entries = await this.listEntries(), normalizedPath = this.normalizePath(projectPath);
166
+ return entries.filter((e) => e.projects.includes(normalizedPath));
167
+ }
168
+ /**
169
+ * Remove all entries for a project (used when uninstalling aix from a project).
170
+ *
171
+ * @returns Keys of entries that were removed entirely (no other projects depend on them)
172
+ */
173
+ async removeAllForProject(projectPath) {
174
+ const data = await this.load(), normalizedPath = this.normalizePath(projectPath), removedKeys = [];
175
+ for (const [key, entry] of Object.entries(data.entries)) {
176
+ entry.projects = entry.projects.filter((p) => p !== normalizedPath);
177
+ if (entry.projects.length === 0) {
178
+ delete data.entries[key];
179
+ removedKeys.push(key);
180
+ }
181
+ }
182
+ await this.save(data);
183
+ return removedKeys;
184
+ }
185
+ /**
186
+ * Normalize a project path for consistent comparison.
187
+ */
188
+ normalizePath(projectPath) {
189
+ // Remove trailing slashes and normalize
190
+ return projectPath.replace(/\/+$/, '');
191
+ }
192
+ }
193
+ //# sourceMappingURL=tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../../src/global/tracking.ts"],"names":[],"mappings":"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"}