@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
package/dist/merge.js ADDED
@@ -0,0 +1,154 @@
1
+ import { deepMergeJson } from './json.js';
2
+ /**
3
+ * Filter a config to only include the specified scopes.
4
+ * @param config - Full config
5
+ * @param scopes - Scopes to include (if empty, returns empty partial)
6
+ * @returns Partial config with only specified sections
7
+ */
8
+ export function filterConfigByScopes(config, scopes) {
9
+ if (scopes.length === 0) {
10
+ return {};
11
+ }
12
+ const result = {};
13
+ for (const scope of scopes) {
14
+ switch (scope) {
15
+ case 'rules':
16
+ if (config.rules) {
17
+ result.rules = config.rules;
18
+ }
19
+ break;
20
+ case 'prompts':
21
+ if (config.prompts) {
22
+ result.prompts = config.prompts;
23
+ }
24
+ break;
25
+ case 'mcp':
26
+ if (config.mcp) {
27
+ result.mcp = config.mcp;
28
+ }
29
+ break;
30
+ case 'skills':
31
+ if (config.skills) {
32
+ result.skills = config.skills;
33
+ }
34
+ break;
35
+ case 'editors':
36
+ if (config.editors) {
37
+ result.editors = config.editors;
38
+ }
39
+ break;
40
+ }
41
+ }
42
+ return result;
43
+ }
44
+ /**
45
+ * Remove entries set to false from an object.
46
+ */
47
+ function filterFalseValues(obj) {
48
+ const result = { ...obj };
49
+ for (const key of Object.keys(result)) {
50
+ if (result[key] === false) {
51
+ delete result[key];
52
+ }
53
+ }
54
+ return result;
55
+ }
56
+ /**
57
+ * Merge two object configs with key-level replacement and false-value support.
58
+ * - Keys are merged, but if same key exists in both, remote value replaces local entirely
59
+ * - If remote has `false`, the key is removed (disables the entry)
60
+ * - If local has `false` and remote has an object, the object wins (re-enables)
61
+ * - Final result has all `false` values filtered out
62
+ */
63
+ function mergeWithFalseSupport(local, remote) {
64
+ if (!remote) {
65
+ return filterFalseValues((local ?? {}));
66
+ }
67
+ if (!local) {
68
+ return filterFalseValues(remote);
69
+ }
70
+ const merged = { ...local };
71
+ for (const [key, remoteValue] of Object.entries(remote)) {
72
+ if (remoteValue === false) {
73
+ // Remote wants to disable - remove the entry
74
+ delete merged[key];
75
+ }
76
+ else {
77
+ // Remote has a value - it wins (including over local false)
78
+ merged[key] = remoteValue;
79
+ }
80
+ }
81
+ return filterFalseValues(merged);
82
+ }
83
+ /**
84
+ * Merge two AiJsonConfig objects. Remote config wins on conflicts.
85
+ *
86
+ * Merge strategy:
87
+ * - `skills`: Object merge by key, replace entire value on key conflict
88
+ * - `rules`: Object merge by key, replace entire value on key conflict
89
+ * - `prompts`: Object merge by key, replace entire value on key conflict
90
+ * - `mcp`: Object merge by key, replace entire value on key conflict
91
+ * - `editors`: Object merge by key, deep merge on key conflict
92
+ * - `$schema`, `extends`: Remote wins
93
+ *
94
+ * @param local - Existing local config
95
+ * @param remote - Remote config to merge in (may be partial if scope-filtered)
96
+ * @returns Merged config
97
+ */
98
+ export function mergeConfigs(local, remote) {
99
+ // Start with local as base
100
+ const result = { ...local };
101
+ // Merge skills (key-level replacement with false support)
102
+ if (remote.skills !== undefined) {
103
+ result.skills = mergeWithFalseSupport(local.skills, remote.skills);
104
+ }
105
+ // Merge rules (key-level replacement with false support)
106
+ if (remote.rules !== undefined) {
107
+ result.rules = mergeWithFalseSupport(local.rules, remote.rules);
108
+ }
109
+ // Merge prompts (key-level replacement with false support)
110
+ if (remote.prompts !== undefined) {
111
+ result.prompts = mergeWithFalseSupport(local.prompts, remote.prompts);
112
+ }
113
+ // Merge mcp (with false support for disabling servers)
114
+ if (remote.mcp !== undefined) {
115
+ result.mcp = mergeWithFalseSupport(local.mcp, remote.mcp);
116
+ }
117
+ // Merge editors (deep merge, remote wins on key conflict)
118
+ if (remote.editors !== undefined) {
119
+ // Handle both array and object forms - normalize to object for merging
120
+ const localEditors = normalizeEditors(local.editors), remoteEditors = normalizeEditors(remote.editors);
121
+ result.editors = deepMergeJson(localEditors, remoteEditors);
122
+ }
123
+ // Metadata fields: remote wins
124
+ if (remote.$schema !== undefined) {
125
+ result.$schema = remote.$schema;
126
+ }
127
+ if (remote.extends !== undefined) {
128
+ result.extends = remote.extends;
129
+ }
130
+ return result;
131
+ }
132
+ /**
133
+ * Normalize editors config to object form for merging.
134
+ * Array form: ["windsurf", { "cursor": {...} }] → { windsurf: { enabled: true }, cursor: {...} }
135
+ */
136
+ function normalizeEditors(editors) {
137
+ if (!editors) {
138
+ return {};
139
+ }
140
+ if (Array.isArray(editors)) {
141
+ const result = {};
142
+ for (const item of editors) {
143
+ if (typeof item === 'string') {
144
+ result[item] = { enabled: true };
145
+ }
146
+ else {
147
+ Object.assign(result, item);
148
+ }
149
+ }
150
+ return result;
151
+ }
152
+ return editors;
153
+ }
154
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAO1C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CACjC,MAAoB,EACpB,MAAqB;IAErB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC1B,QAAQ,KAAK,EAAE,CAAC;YAChB,KAAK,OAAO;gBACT,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAChB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC/B,CAAC;gBACD,MAAM;YACT,KAAK,SAAS;gBACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACnC,CAAC;gBACD,MAAM;YACT,KAAK,KAAK;gBACP,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACd,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC3B,CAAC;gBACD,MAAM;YACT,KAAK,QAAQ;gBACV,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACjB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBACjC,CAAC;gBACD,MAAM;YACT,KAAK,SAAS;gBACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACnC,CAAC;gBACD,MAAM;QACT,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAoC,GAAM;IACjE,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACJ,CAAC;IACD,OAAO,MAAW,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC3B,KAAoB,EACpB,MAAqB;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACX,OAAO,iBAAiB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAM,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACV,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;YACzB,6CAA6C;YAC7C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACL,4DAA4D;YAC3D,MAAkC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QAC1D,CAAC;IACJ,CAAC;IAED,OAAO,iBAAiB,CAAC,MAAM,CAAM,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,MAA6B;IAC5E,2BAA2B;IAC3B,MAAM,MAAM,GAAiB,EAAE,GAAG,KAAK,EAAE,CAAC;IAE1C,0DAA0D;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,GAAG,qBAAqB,CAClC,KAAK,CAAC,MAA6C,EACnD,MAAM,CAAC,MAA6C,CAC5B,CAAC;IAC/B,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,GAAG,qBAAqB,CACjC,KAAK,CAAC,KAA4C,EAClD,MAAM,CAAC,KAA4C,CACtC,CAAC;IACpB,CAAC;IAED,2DAA2D;IAC3D,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,qBAAqB,CACnC,KAAK,CAAC,OAA8C,EACpD,MAAM,CAAC,OAA8C,CACtC,CAAC;IACtB,CAAC;IAED,uDAAuD;IACvD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,qBAAqB,CAC/B,KAAK,CAAC,GAA0C,EAChD,MAAM,CAAC,GAA0C,CAC5B,CAAC;IAC5B,CAAC;IAED,0DAA0D;IAC1D,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,uEAAuE;QACvE,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAC9C,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,CAAC,OAAO,GAAG,aAAa,CAC3B,YAAuC,EACvC,aAAwC,CACf,CAAC;IAChC,CAAC;IAED,+BAA+B;IAC/B,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAgC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACL,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IACjB,CAAC;IAED,OAAO,OAAkC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { resolveNpmPath, type NpmResolveOptions } from './resolve.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/npm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { resolveNpmPath } from './resolve.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/npm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,cAAc,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface NpmResolveOptions {
2
+ packageName: string;
3
+ subpath?: string;
4
+ version?: string;
5
+ projectRoot: string;
6
+ }
7
+ /**
8
+ * Resolve a path within an npm package.
9
+ * Returns the absolute filesystem path.
10
+ *
11
+ * Resolution modes:
12
+ * - No version: Resolve from project's node_modules only (error if not found)
13
+ * - With version: Auto-install to .aix/.tmp/node_modules cache
14
+ */
15
+ export declare function resolveNpmPath(options: NpmResolveOptions): Promise<string>;
16
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/npm/resolve.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBhF"}
@@ -0,0 +1,42 @@
1
+ import { dirname, join } from 'pathe';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { ensureDependencyInstalled } from 'nypm';
4
+ import { getAixDir, getNpmCacheDir } from '../cache/paths.js';
5
+ /**
6
+ * Resolve a path within an npm package.
7
+ * Returns the absolute filesystem path.
8
+ *
9
+ * Resolution modes:
10
+ * - No version: Resolve from project's node_modules only (error if not found)
11
+ * - With version: Auto-install to .aix/.tmp/node_modules cache
12
+ */
13
+ export async function resolveNpmPath(options) {
14
+ const { packageName, subpath, version, projectRoot } = options;
15
+ if (version) {
16
+ // Auto-install mode: install specific version to cache
17
+ const aixDir = getAixDir(projectRoot), packageSpec = `${packageName}@${version}`;
18
+ await ensureDependencyInstalled(packageSpec, { cwd: aixDir });
19
+ const cachedRoot = join(getNpmCacheDir(projectRoot), packageName);
20
+ return subpath ? join(cachedRoot, subpath) : cachedRoot;
21
+ }
22
+ // Node modules mode: require package to be installed
23
+ const packageRoot = await tryFindPackageRoot(packageName, projectRoot);
24
+ if (!packageRoot) {
25
+ throw new Error(`Package "${packageName}" not found in node_modules. ` +
26
+ 'Either install it via npm/yarn/pnpm, or add a "version" field to auto-install.');
27
+ }
28
+ return subpath ? join(packageRoot, subpath) : packageRoot;
29
+ }
30
+ /**
31
+ * Find package root by resolving package.json
32
+ */
33
+ async function tryFindPackageRoot(packageName, projectRoot) {
34
+ try {
35
+ const pkgJsonPath = import.meta.resolve(`${packageName}/package.json`, `file://${projectRoot}/`);
36
+ return dirname(fileURLToPath(pkgJsonPath));
37
+ }
38
+ catch {
39
+ return undefined;
40
+ }
41
+ }
42
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/npm/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAS9D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA0B;IAC5D,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE/D,IAAI,OAAO,EAAE,CAAC;QACX,uDAAuD;QACvD,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,EAC/B,WAAW,GAAG,GAAG,WAAW,IAAI,OAAO,EAAE,CAAC;QAEhD,MAAM,yBAAyB,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QAElE,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3D,CAAC;IAED,qDAAqD;IACrD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAEvE,IAAI,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACZ,YAAY,WAAW,+BAA+B;YACnD,gFAAgF,CACrF,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC9B,WAAmB,EACnB,WAAmB;IAEnB,IAAI,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,WAAW,eAAe,EAAE,UAAU,WAAW,GAAG,CAAC,CAAC;QAEjG,OAAO,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { loadPrompt, loadPrompts, type LoadedPrompt } from './loader.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { loadPrompt, loadPrompts } from './loader.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { PromptValue, PromptsConfig } from '@a1st/aix-schema';
2
+ export interface LoadedPrompt {
3
+ name: string;
4
+ content: string;
5
+ description?: string;
6
+ argumentHint?: string;
7
+ sourcePath?: string;
8
+ }
9
+ /**
10
+ * Load a single prompt from any source.
11
+ * @param name - The prompt name (key from the prompts object)
12
+ * @param value - The prompt value (string shorthand or object)
13
+ * @param basePath - Base path for resolving relative paths
14
+ */
15
+ export declare function loadPrompt(name: string, value: PromptValue, basePath: string): Promise<LoadedPrompt>;
16
+ /**
17
+ * Load all prompts from a prompts config object.
18
+ * @param prompts - Prompts config object (keyed by name)
19
+ * @param basePath - Base path for resolving relative paths
20
+ * @returns Record of loaded prompts keyed by name
21
+ */
22
+ export declare function loadPrompts(prompts: PromptsConfig, basePath: string): Promise<Record<string, LoadedPrompt>>;
23
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/prompts/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAkCjF,MAAM,WAAW,YAAY;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAuEvB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC9B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAavC"}
@@ -0,0 +1,115 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { resolve, dirname } from 'pathe';
3
+ import { tmpdir } from 'node:os';
4
+ import { normalizeSourceRef } from '@a1st/aix-schema';
5
+ import { getPromptsCacheDir } from '../cache/paths.js';
6
+ import { loadFromGit } from '../git-loader.js';
7
+ import { resolveNpmPath } from '../npm/resolve.js';
8
+ /**
9
+ * Strip YAML frontmatter from markdown content and optionally extract metadata.
10
+ * Returns the content without frontmatter and any extracted metadata.
11
+ */
12
+ function stripFrontmatter(content) {
13
+ const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
14
+ if (!frontmatterMatch) {
15
+ return { content };
16
+ }
17
+ const frontmatterContent = frontmatterMatch[1];
18
+ const contentWithoutFrontmatter = content.slice(frontmatterMatch[0].length);
19
+ // Parse simple key: value pairs from frontmatter
20
+ const metadata = {};
21
+ for (const line of frontmatterContent.split('\n')) {
22
+ const match = line.match(/^([\w-]+):\s*["']?([^"']*)["']?\s*$/);
23
+ if (match) {
24
+ metadata[match[1]] = match[2];
25
+ }
26
+ }
27
+ return { content: contentWithoutFrontmatter.trim(), metadata };
28
+ }
29
+ /**
30
+ * Load a single prompt from any source.
31
+ * @param name - The prompt name (key from the prompts object)
32
+ * @param value - The prompt value (string shorthand or object)
33
+ * @param basePath - Base path for resolving relative paths
34
+ */
35
+ export async function loadPrompt(name, value, basePath) {
36
+ // Normalize string shorthand transparently
37
+ const promptObj = typeof value === 'string' ? normalizeSourceRef(value) : value;
38
+ const base = {
39
+ name,
40
+ description: promptObj.description,
41
+ argumentHint: promptObj.argumentHint,
42
+ };
43
+ // Inline content
44
+ if (promptObj.content) {
45
+ return {
46
+ ...base,
47
+ content: promptObj.content,
48
+ };
49
+ }
50
+ // Local file
51
+ if (promptObj.path) {
52
+ const fullPath = resolve(dirname(basePath), promptObj.path);
53
+ const rawContent = await readFile(fullPath, 'utf-8');
54
+ const { content, metadata } = stripFrontmatter(rawContent.trim());
55
+ return {
56
+ ...base,
57
+ // Use frontmatter description if not explicitly provided
58
+ description: base.description ?? metadata?.description,
59
+ content,
60
+ sourcePath: fullPath,
61
+ };
62
+ }
63
+ // Git repository
64
+ if (promptObj.git) {
65
+ const baseDir = dirname(basePath) || tmpdir();
66
+ const result = await loadFromGit({
67
+ git: promptObj.git,
68
+ cacheDir: getPromptsCacheDir(baseDir),
69
+ defaultFilePath: 'prompt.md',
70
+ });
71
+ const { content, metadata } = stripFrontmatter(result.content);
72
+ return {
73
+ ...base,
74
+ // Use frontmatter description if not explicitly provided
75
+ description: base.description ?? metadata?.description,
76
+ content,
77
+ sourcePath: result.sourcePath,
78
+ };
79
+ }
80
+ // NPM package
81
+ if (promptObj.npm) {
82
+ const filePath = await resolveNpmPath({
83
+ packageName: promptObj.npm.npm,
84
+ subpath: promptObj.npm.path,
85
+ version: promptObj.npm.version,
86
+ projectRoot: dirname(basePath),
87
+ });
88
+ const rawContent = await readFile(filePath, 'utf-8');
89
+ const { content, metadata } = stripFrontmatter(rawContent.trim());
90
+ return {
91
+ ...base,
92
+ description: base.description ?? metadata?.description,
93
+ content,
94
+ sourcePath: filePath,
95
+ };
96
+ }
97
+ throw new Error(`Invalid prompt "${name}": no content source found`);
98
+ }
99
+ /**
100
+ * Load all prompts from a prompts config object.
101
+ * @param prompts - Prompts config object (keyed by name)
102
+ * @param basePath - Base path for resolving relative paths
103
+ * @returns Record of loaded prompts keyed by name
104
+ */
105
+ export async function loadPrompts(prompts, basePath) {
106
+ // Filter out false values (disabled prompts)
107
+ const entries = Object.entries(prompts).filter(([, value]) => value !== false);
108
+ const loadedEntries = await Promise.all(entries.map(async ([name, value]) => {
109
+ // Type assertion safe because we filtered out false above
110
+ const loaded = await loadPrompt(name, value, basePath);
111
+ return [name, loaded];
112
+ }));
113
+ return Object.fromEntries(loadedEntries);
114
+ }
115
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/prompts/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACtC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAE3E,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;IAChD,MAAM,yBAAyB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5E,iDAAiD;IACjD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAEhE,IAAI,KAAK,EAAE,CAAC;YACT,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACnC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;AAClE,CAAC;AAUD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC7B,IAAY,EACZ,KAAkB,EAClB,QAAgB;IAEhB,2CAA2C;IAC3C,MAAM,SAAS,GAAiB,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9F,MAAM,IAAI,GAAG;QACV,IAAI;QACJ,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,YAAY,EAAE,SAAS,CAAC,YAAY;KACtC,CAAC;IAEF,iBAAiB;IACjB,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO;YACJ,GAAG,IAAI;YACP,OAAO,EAAE,SAAS,CAAC,OAAO;SAC5B,CAAC;IACL,CAAC;IAED,aAAa;IACb,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAElE,OAAO;YACJ,GAAG,IAAI;YACP,yDAAyD;YACzD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW;YACtD,OAAO;YACP,UAAU,EAAE,QAAQ;SACtB,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC9B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC;YACrC,eAAe,EAAE,WAAW;SAC9B,CAAC,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE/D,OAAO;YACJ,GAAG,IAAI;YACP,yDAAyD;YACzD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW;YACtD,OAAO;YACP,UAAU,EAAE,MAAM,CAAC,UAAU;SAC/B,CAAC;IACL,CAAC;IAED,cAAc;IACd,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;YACnC,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG;YAC9B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI;YAC3B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO;YAC9B,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAElE,OAAO;YACJ,GAAG,IAAI;YACP,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW;YACtD,OAAO;YACP,UAAU,EAAE,QAAQ;SACtB,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,4BAA4B,CAAC,CAAC;AACxE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC9B,OAAsB,EACtB,QAAgB;IAEhB,6CAA6C;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QACjC,0DAA0D;QAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,KAAqC,EAAE,QAAQ,CAAC,CAAC;QAEvF,OAAO,CAAC,IAAI,EAAE,MAAM,CAAU,CAAC;IAClC,CAAC,CAAC,CACJ,CAAC;IAEF,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type RemoteSourceType = 'url' | 'git' | 'local';
2
+ export interface RemoteLoadResult {
3
+ /** Parsed config content */
4
+ content: Record<string, unknown>;
5
+ /** Base path/URL for resolving relative extends */
6
+ baseUrl: string;
7
+ /** Source type */
8
+ source: RemoteSourceType;
9
+ /** Whether the base is a remote URL (for extends resolution) */
10
+ isRemote: boolean;
11
+ }
12
+ /**
13
+ * Load config from a remote URL (direct or blob URL).
14
+ */
15
+ export declare function loadFromUrl(url: string): Promise<RemoteLoadResult>;
16
+ /**
17
+ * Load config from git shorthand (github:org/repo, github:org/repo/path#ref, etc.).
18
+ * If no path is specified, looks for ai.json at repo root.
19
+ */
20
+ export declare function loadFromGitShorthand(input: string): Promise<RemoteLoadResult>;
21
+ /**
22
+ * Load config from a local file path.
23
+ */
24
+ export declare function loadFromLocalPath(path: string, cwd?: string): RemoteLoadResult;
25
+ /**
26
+ * Classify and load config from any source type.
27
+ */
28
+ export declare function loadFromSource(source: string, cwd?: string): Promise<RemoteLoadResult>;
29
+ //# sourceMappingURL=remote-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-loader.d.ts","sourceRoot":"","sources":["../src/remote-loader.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC9B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,gEAAgE;IAChE,QAAQ,EAAE,OAAO,CAAC;CACpB;AA4BD;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4BxE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,gBAAgB,CAoB7F;AA+DD;;GAEG;AACH,wBAAsB,cAAc,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,MAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Remote config loading utilities for fetching ai.json from URLs, git repos, and local paths.
3
+ */
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { resolve, dirname } from 'pathe';
6
+ import { downloadTemplate } from 'giget';
7
+ import { parseJsonc } from '@a1st/aix-schema';
8
+ import { convertBlobToRawUrl, parseGitShorthand, parseGitHubRepoUrl, parseGitHubBlobUrl, parseGitLabBlobUrl, parseBitbucketBlobUrl, isLocalPath, } from './url-parsing.js';
9
+ import { ConfigNotFoundError, ConfigParseError, RemoteFetchError, UnsupportedUrlError, } from './errors.js';
10
+ const FETCH_TIMEOUT_MS = 30000;
11
+ /**
12
+ * Fetch content from a URL with timeout.
13
+ */
14
+ async function fetchWithTimeout(url, timeoutMs = FETCH_TIMEOUT_MS) {
15
+ const controller = new AbortController(), timeout = setTimeout(() => controller.abort(), timeoutMs);
16
+ try {
17
+ const response = await fetch(url, { signal: controller.signal });
18
+ if (!response.ok) {
19
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
20
+ }
21
+ return response.text();
22
+ }
23
+ catch (error) {
24
+ if (error instanceof Error && error.name === 'AbortError') {
25
+ throw new Error(`Request timed out after ${timeoutMs}ms`, { cause: error });
26
+ }
27
+ throw error;
28
+ }
29
+ finally {
30
+ clearTimeout(timeout);
31
+ }
32
+ }
33
+ /**
34
+ * Load config from a remote URL (direct or blob URL).
35
+ */
36
+ export async function loadFromUrl(url) {
37
+ const rawUrl = convertBlobToRawUrl(url);
38
+ let content;
39
+ try {
40
+ content = await fetchWithTimeout(rawUrl);
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : String(error);
44
+ throw new RemoteFetchError(url, message);
45
+ }
46
+ const result = parseJsonc(content);
47
+ if (result.errors.length > 0) {
48
+ throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, url);
49
+ }
50
+ // Compute base URL for relative extends (directory containing the file)
51
+ const baseUrl = rawUrl.substring(0, rawUrl.lastIndexOf('/') + 1);
52
+ return {
53
+ content: result.data,
54
+ baseUrl,
55
+ source: 'url',
56
+ isRemote: true,
57
+ };
58
+ }
59
+ /**
60
+ * Load config from git shorthand (github:org/repo, github:org/repo/path#ref, etc.).
61
+ * If no path is specified, looks for ai.json at repo root.
62
+ */
63
+ export async function loadFromGitShorthand(input) {
64
+ const parsed = parseGitShorthand(input);
65
+ if (!parsed) {
66
+ throw new ConfigParseError(`Invalid git shorthand: ${input}`, input);
67
+ }
68
+ // Build the giget template string
69
+ let template = `${parsed.provider}:${parsed.user}/${parsed.repo}`;
70
+ if (parsed.subpath) {
71
+ template += `/${parsed.subpath}`;
72
+ }
73
+ if (parsed.ref) {
74
+ template += `#${parsed.ref}`;
75
+ }
76
+ let dir;
77
+ try {
78
+ const result = await downloadTemplate(template, { force: true, cwd: process.cwd() });
79
+ dir = result.dir;
80
+ }
81
+ catch (error) {
82
+ const message = error instanceof Error ? error.message : String(error);
83
+ throw new RemoteFetchError(input, message);
84
+ }
85
+ // Look for ai.json - if subpath ends with .json, use it directly; otherwise look for ai.json in dir
86
+ let configPath;
87
+ if (parsed.subpath?.endsWith('.json')) {
88
+ // The subpath itself is the config file
89
+ configPath = resolve(dir, parsed.subpath.split('/').pop());
90
+ }
91
+ else {
92
+ configPath = resolve(dir, 'ai.json');
93
+ }
94
+ if (!existsSync(configPath)) {
95
+ throw new ConfigNotFoundError(configPath);
96
+ }
97
+ const content = readFileSync(configPath, 'utf-8'), result = parseJsonc(content);
98
+ if (result.errors.length > 0) {
99
+ throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, configPath);
100
+ }
101
+ return {
102
+ content: result.data,
103
+ baseUrl: dirname(configPath),
104
+ source: 'git',
105
+ isRemote: false, // Local filesystem after download
106
+ };
107
+ }
108
+ /**
109
+ * Load config from a local file path.
110
+ */
111
+ export function loadFromLocalPath(path, cwd = process.cwd()) {
112
+ const absolutePath = resolve(cwd, path);
113
+ if (!existsSync(absolutePath)) {
114
+ throw new ConfigNotFoundError(absolutePath);
115
+ }
116
+ const content = readFileSync(absolutePath, 'utf-8'), result = parseJsonc(content);
117
+ if (result.errors.length > 0) {
118
+ throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, absolutePath);
119
+ }
120
+ return {
121
+ content: result.data,
122
+ baseUrl: dirname(absolutePath),
123
+ source: 'local',
124
+ isRemote: false,
125
+ };
126
+ }
127
+ /**
128
+ * Check if a URL points directly to a file (blob URL or direct file URL).
129
+ */
130
+ function isDirectFileUrl(url) {
131
+ // Check for blob URLs
132
+ if (parseGitHubBlobUrl(url) || parseGitLabBlobUrl(url) || parseBitbucketBlobUrl(url)) {
133
+ return true;
134
+ }
135
+ // Check for direct file URLs (ending in .json)
136
+ if (url.endsWith('.json')) {
137
+ return true;
138
+ }
139
+ return false;
140
+ }
141
+ /**
142
+ * Load config from a GitHub/GitLab/Bitbucket repo URL (not a blob URL).
143
+ * Downloads the repo and looks for ai.json at the root.
144
+ */
145
+ async function loadFromRepoUrl(url) {
146
+ // Try to parse as GitHub repo URL
147
+ const ghRepo = parseGitHubRepoUrl(url);
148
+ if (ghRepo) {
149
+ return loadFromGitShorthand(`github:${ghRepo.owner}/${ghRepo.repo}`);
150
+ }
151
+ // For other repo URLs, try using giget directly
152
+ let dir;
153
+ try {
154
+ const result = await downloadTemplate(url, { force: true, cwd: process.cwd() });
155
+ dir = result.dir;
156
+ }
157
+ catch (error) {
158
+ const message = error instanceof Error ? error.message : String(error);
159
+ throw new RemoteFetchError(url, message);
160
+ }
161
+ const configPath = resolve(dir, 'ai.json');
162
+ if (!existsSync(configPath)) {
163
+ throw new ConfigNotFoundError(configPath);
164
+ }
165
+ const content = readFileSync(configPath, 'utf-8'), result = parseJsonc(content);
166
+ if (result.errors.length > 0) {
167
+ throw new ConfigParseError(`Parse error: ${result.errors[0]?.message}`, configPath);
168
+ }
169
+ return {
170
+ content: result.data,
171
+ baseUrl: dirname(configPath),
172
+ source: 'git',
173
+ isRemote: false,
174
+ };
175
+ }
176
+ /**
177
+ * Classify and load config from any source type.
178
+ */
179
+ export async function loadFromSource(source, cwd = process.cwd()) {
180
+ // Git shorthand: github:org/repo, gitlab:org/repo, bitbucket:org/repo
181
+ if (source.startsWith('github:') || source.startsWith('gitlab:') || source.startsWith('bitbucket:')) {
182
+ return loadFromGitShorthand(source);
183
+ }
184
+ // HTTPS URL
185
+ if (source.startsWith('https://')) {
186
+ // If it's a direct file URL (blob or .json), fetch it
187
+ if (isDirectFileUrl(source)) {
188
+ return loadFromUrl(source);
189
+ }
190
+ // Otherwise, treat as repo URL and clone it
191
+ return loadFromRepoUrl(source);
192
+ }
193
+ // HTTP URL (reject for security)
194
+ if (source.startsWith('http://')) {
195
+ throw new UnsupportedUrlError(source);
196
+ }
197
+ // Local path (relative or absolute)
198
+ if (isLocalPath(source)) {
199
+ return loadFromLocalPath(source, cwd);
200
+ }
201
+ // If it looks like a file path without ./ prefix, try it as local
202
+ if (source.includes('/') || source.endsWith('.json')) {
203
+ return loadFromLocalPath(source, cwd);
204
+ }
205
+ // Unknown format
206
+ throw new UnsupportedUrlError(source);
207
+ }
208
+ //# sourceMappingURL=remote-loader.js.map