@detergent-software/atk 0.12.1-dev.2

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 (314) hide show
  1. package/build/cli.d.ts +3 -0
  2. package/build/cli.d.ts.map +1 -0
  3. package/build/cli.js +35 -0
  4. package/build/cli.js.map +1 -0
  5. package/build/commands/_app.d.ts +3 -0
  6. package/build/commands/_app.d.ts.map +1 -0
  7. package/build/commands/_app.js +12 -0
  8. package/build/commands/_app.js.map +1 -0
  9. package/build/commands/audit.d.ts +12 -0
  10. package/build/commands/audit.d.ts.map +1 -0
  11. package/build/commands/audit.js +78 -0
  12. package/build/commands/audit.js.map +1 -0
  13. package/build/commands/browse.d.ts +15 -0
  14. package/build/commands/browse.d.ts.map +1 -0
  15. package/build/commands/browse.js +284 -0
  16. package/build/commands/browse.js.map +1 -0
  17. package/build/commands/cache.d.ts +13 -0
  18. package/build/commands/cache.d.ts.map +1 -0
  19. package/build/commands/cache.js +67 -0
  20. package/build/commands/cache.js.map +1 -0
  21. package/build/commands/config.d.ts +13 -0
  22. package/build/commands/config.d.ts.map +1 -0
  23. package/build/commands/config.js +62 -0
  24. package/build/commands/config.js.map +1 -0
  25. package/build/commands/diff.d.ts +16 -0
  26. package/build/commands/diff.d.ts.map +1 -0
  27. package/build/commands/diff.js +158 -0
  28. package/build/commands/diff.js.map +1 -0
  29. package/build/commands/doctor.d.ts +11 -0
  30. package/build/commands/doctor.d.ts.map +1 -0
  31. package/build/commands/doctor.js +30 -0
  32. package/build/commands/doctor.js.map +1 -0
  33. package/build/commands/index.d.ts +3 -0
  34. package/build/commands/index.d.ts.map +1 -0
  35. package/build/commands/index.js +30 -0
  36. package/build/commands/index.js.map +1 -0
  37. package/build/commands/info.d.ts +25 -0
  38. package/build/commands/info.d.ts.map +1 -0
  39. package/build/commands/info.js +198 -0
  40. package/build/commands/info.js.map +1 -0
  41. package/build/commands/init.d.ts +17 -0
  42. package/build/commands/init.d.ts.map +1 -0
  43. package/build/commands/init.js +504 -0
  44. package/build/commands/init.js.map +1 -0
  45. package/build/commands/install.d.ts +18 -0
  46. package/build/commands/install.d.ts.map +1 -0
  47. package/build/commands/install.js +186 -0
  48. package/build/commands/install.js.map +1 -0
  49. package/build/commands/list.d.ts +20 -0
  50. package/build/commands/list.d.ts.map +1 -0
  51. package/build/commands/list.js +61 -0
  52. package/build/commands/list.js.map +1 -0
  53. package/build/commands/outdated.d.ts +21 -0
  54. package/build/commands/outdated.d.ts.map +1 -0
  55. package/build/commands/outdated.js +81 -0
  56. package/build/commands/outdated.js.map +1 -0
  57. package/build/commands/pin.d.ts +22 -0
  58. package/build/commands/pin.d.ts.map +1 -0
  59. package/build/commands/pin.js +94 -0
  60. package/build/commands/pin.js.map +1 -0
  61. package/build/commands/prune.d.ts +14 -0
  62. package/build/commands/prune.d.ts.map +1 -0
  63. package/build/commands/prune.js +203 -0
  64. package/build/commands/prune.js.map +1 -0
  65. package/build/commands/publish.d.ts +14 -0
  66. package/build/commands/publish.d.ts.map +1 -0
  67. package/build/commands/publish.js +345 -0
  68. package/build/commands/publish.js.map +1 -0
  69. package/build/commands/search.d.ts +16 -0
  70. package/build/commands/search.d.ts.map +1 -0
  71. package/build/commands/search.js +80 -0
  72. package/build/commands/search.js.map +1 -0
  73. package/build/commands/sync.d.ts +15 -0
  74. package/build/commands/sync.d.ts.map +1 -0
  75. package/build/commands/sync.js +209 -0
  76. package/build/commands/sync.js.map +1 -0
  77. package/build/commands/uninstall.d.ts +18 -0
  78. package/build/commands/uninstall.d.ts.map +1 -0
  79. package/build/commands/uninstall.js +304 -0
  80. package/build/commands/uninstall.js.map +1 -0
  81. package/build/commands/unpin.d.ts +22 -0
  82. package/build/commands/unpin.d.ts.map +1 -0
  83. package/build/commands/unpin.js +79 -0
  84. package/build/commands/unpin.js.map +1 -0
  85. package/build/commands/update.d.ts +17 -0
  86. package/build/commands/update.d.ts.map +1 -0
  87. package/build/commands/update.js +151 -0
  88. package/build/commands/update.js.map +1 -0
  89. package/build/commands/why.d.ts +23 -0
  90. package/build/commands/why.d.ts.map +1 -0
  91. package/build/commands/why.js +108 -0
  92. package/build/commands/why.js.map +1 -0
  93. package/build/components/AssetDetail.d.ts +32 -0
  94. package/build/components/AssetDetail.d.ts.map +1 -0
  95. package/build/components/AssetDetail.js +45 -0
  96. package/build/components/AssetDetail.js.map +1 -0
  97. package/build/components/AssetTable.d.ts +25 -0
  98. package/build/components/AssetTable.d.ts.map +1 -0
  99. package/build/components/AssetTable.js +96 -0
  100. package/build/components/AssetTable.js.map +1 -0
  101. package/build/components/BrowseExpandedBundle.d.ts +26 -0
  102. package/build/components/BrowseExpandedBundle.d.ts.map +1 -0
  103. package/build/components/BrowseExpandedBundle.js +59 -0
  104. package/build/components/BrowseExpandedBundle.js.map +1 -0
  105. package/build/components/BrowseExpandedRow.d.ts +14 -0
  106. package/build/components/BrowseExpandedRow.d.ts.map +1 -0
  107. package/build/components/BrowseExpandedRow.js +9 -0
  108. package/build/components/BrowseExpandedRow.js.map +1 -0
  109. package/build/components/BrowseList.d.ts +26 -0
  110. package/build/components/BrowseList.d.ts.map +1 -0
  111. package/build/components/BrowseList.js +101 -0
  112. package/build/components/BrowseList.js.map +1 -0
  113. package/build/components/BundleDetail.d.ts +7 -0
  114. package/build/components/BundleDetail.d.ts.map +1 -0
  115. package/build/components/BundleDetail.js +12 -0
  116. package/build/components/BundleDetail.js.map +1 -0
  117. package/build/components/DependencyTree.d.ts +19 -0
  118. package/build/components/DependencyTree.d.ts.map +1 -0
  119. package/build/components/DependencyTree.js +21 -0
  120. package/build/components/DependencyTree.js.map +1 -0
  121. package/build/components/DiagnosticList.d.ts +19 -0
  122. package/build/components/DiagnosticList.d.ts.map +1 -0
  123. package/build/components/DiagnosticList.js +17 -0
  124. package/build/components/DiagnosticList.js.map +1 -0
  125. package/build/components/DiffView.d.ts +30 -0
  126. package/build/components/DiffView.d.ts.map +1 -0
  127. package/build/components/DiffView.js +32 -0
  128. package/build/components/DiffView.js.map +1 -0
  129. package/build/components/DryRunBanner.d.ts +11 -0
  130. package/build/components/DryRunBanner.d.ts.map +1 -0
  131. package/build/components/DryRunBanner.js +6 -0
  132. package/build/components/DryRunBanner.js.map +1 -0
  133. package/build/components/Field.d.ts +12 -0
  134. package/build/components/Field.d.ts.map +1 -0
  135. package/build/components/Field.js +9 -0
  136. package/build/components/Field.js.map +1 -0
  137. package/build/components/FilterBar.d.ts +18 -0
  138. package/build/components/FilterBar.d.ts.map +1 -0
  139. package/build/components/FilterBar.js +21 -0
  140. package/build/components/FilterBar.js.map +1 -0
  141. package/build/components/Header.d.ts +13 -0
  142. package/build/components/Header.d.ts.map +1 -0
  143. package/build/components/Header.js +20 -0
  144. package/build/components/Header.js.map +1 -0
  145. package/build/components/HelpBar.d.ts +11 -0
  146. package/build/components/HelpBar.d.ts.map +1 -0
  147. package/build/components/HelpBar.js +9 -0
  148. package/build/components/HelpBar.js.map +1 -0
  149. package/build/components/InstallConfirmBar.d.ts +9 -0
  150. package/build/components/InstallConfirmBar.d.ts.map +1 -0
  151. package/build/components/InstallConfirmBar.js +23 -0
  152. package/build/components/InstallConfirmBar.js.map +1 -0
  153. package/build/components/InstallSummary.d.ts +29 -0
  154. package/build/components/InstallSummary.d.ts.map +1 -0
  155. package/build/components/InstallSummary.js +12 -0
  156. package/build/components/InstallSummary.js.map +1 -0
  157. package/build/components/SectionDivider.d.ts +5 -0
  158. package/build/components/SectionDivider.d.ts.map +1 -0
  159. package/build/components/SectionDivider.js +11 -0
  160. package/build/components/SectionDivider.js.map +1 -0
  161. package/build/components/Spinner.d.ts +13 -0
  162. package/build/components/Spinner.d.ts.map +1 -0
  163. package/build/components/Spinner.js +11 -0
  164. package/build/components/Spinner.js.map +1 -0
  165. package/build/components/StatusBadge.d.ts +23 -0
  166. package/build/components/StatusBadge.d.ts.map +1 -0
  167. package/build/components/StatusBadge.js +43 -0
  168. package/build/components/StatusBadge.js.map +1 -0
  169. package/build/components/index.d.ts +20 -0
  170. package/build/components/index.d.ts.map +1 -0
  171. package/build/components/index.js +20 -0
  172. package/build/components/index.js.map +1 -0
  173. package/build/hooks/useBrowseState.d.ts +122 -0
  174. package/build/hooks/useBrowseState.d.ts.map +1 -0
  175. package/build/hooks/useBrowseState.js +315 -0
  176. package/build/hooks/useBrowseState.js.map +1 -0
  177. package/build/hooks/useCommand.d.ts +23 -0
  178. package/build/hooks/useCommand.d.ts.map +1 -0
  179. package/build/hooks/useCommand.js +43 -0
  180. package/build/hooks/useCommand.js.map +1 -0
  181. package/build/lib/adapter.d.ts +40 -0
  182. package/build/lib/adapter.d.ts.map +1 -0
  183. package/build/lib/adapter.js +112 -0
  184. package/build/lib/adapter.js.map +1 -0
  185. package/build/lib/auth.d.ts +31 -0
  186. package/build/lib/auth.d.ts.map +1 -0
  187. package/build/lib/auth.js +101 -0
  188. package/build/lib/auth.js.map +1 -0
  189. package/build/lib/breakpoints.d.ts +3 -0
  190. package/build/lib/breakpoints.d.ts.map +1 -0
  191. package/build/lib/breakpoints.js +8 -0
  192. package/build/lib/breakpoints.js.map +1 -0
  193. package/build/lib/checksum.d.ts +31 -0
  194. package/build/lib/checksum.d.ts.map +1 -0
  195. package/build/lib/checksum.js +78 -0
  196. package/build/lib/checksum.js.map +1 -0
  197. package/build/lib/config.d.ts +42 -0
  198. package/build/lib/config.d.ts.map +1 -0
  199. package/build/lib/config.js +123 -0
  200. package/build/lib/config.js.map +1 -0
  201. package/build/lib/detector.d.ts +35 -0
  202. package/build/lib/detector.d.ts.map +1 -0
  203. package/build/lib/detector.js +125 -0
  204. package/build/lib/detector.js.map +1 -0
  205. package/build/lib/diagnostics.d.ts +10 -0
  206. package/build/lib/diagnostics.d.ts.map +1 -0
  207. package/build/lib/diagnostics.js +195 -0
  208. package/build/lib/diagnostics.js.map +1 -0
  209. package/build/lib/diff.d.ts +34 -0
  210. package/build/lib/diff.d.ts.map +1 -0
  211. package/build/lib/diff.js +78 -0
  212. package/build/lib/diff.js.map +1 -0
  213. package/build/lib/fetch-retry.d.ts +43 -0
  214. package/build/lib/fetch-retry.d.ts.map +1 -0
  215. package/build/lib/fetch-retry.js +137 -0
  216. package/build/lib/fetch-retry.js.map +1 -0
  217. package/build/lib/github.d.ts +57 -0
  218. package/build/lib/github.d.ts.map +1 -0
  219. package/build/lib/github.js +96 -0
  220. package/build/lib/github.js.map +1 -0
  221. package/build/lib/gitignore.d.ts +37 -0
  222. package/build/lib/gitignore.d.ts.map +1 -0
  223. package/build/lib/gitignore.js +142 -0
  224. package/build/lib/gitignore.js.map +1 -0
  225. package/build/lib/init.d.ts +100 -0
  226. package/build/lib/init.d.ts.map +1 -0
  227. package/build/lib/init.js +295 -0
  228. package/build/lib/init.js.map +1 -0
  229. package/build/lib/installer.d.ts +50 -0
  230. package/build/lib/installer.d.ts.map +1 -0
  231. package/build/lib/installer.js +435 -0
  232. package/build/lib/installer.js.map +1 -0
  233. package/build/lib/lockfile.d.ts +170 -0
  234. package/build/lib/lockfile.d.ts.map +1 -0
  235. package/build/lib/lockfile.js +437 -0
  236. package/build/lib/lockfile.js.map +1 -0
  237. package/build/lib/markdown.d.ts +9 -0
  238. package/build/lib/markdown.d.ts.map +1 -0
  239. package/build/lib/markdown.js +67 -0
  240. package/build/lib/markdown.js.map +1 -0
  241. package/build/lib/parse-json.d.ts +34 -0
  242. package/build/lib/parse-json.d.ts.map +1 -0
  243. package/build/lib/parse-json.js +52 -0
  244. package/build/lib/parse-json.js.map +1 -0
  245. package/build/lib/paths.d.ts +28 -0
  246. package/build/lib/paths.d.ts.map +1 -0
  247. package/build/lib/paths.js +68 -0
  248. package/build/lib/paths.js.map +1 -0
  249. package/build/lib/publisher.d.ts +49 -0
  250. package/build/lib/publisher.d.ts.map +1 -0
  251. package/build/lib/publisher.js +388 -0
  252. package/build/lib/publisher.js.map +1 -0
  253. package/build/lib/registry.d.ts +97 -0
  254. package/build/lib/registry.d.ts.map +1 -0
  255. package/build/lib/registry.js +248 -0
  256. package/build/lib/registry.js.map +1 -0
  257. package/build/lib/resolver.d.ts +50 -0
  258. package/build/lib/resolver.d.ts.map +1 -0
  259. package/build/lib/resolver.js +110 -0
  260. package/build/lib/resolver.js.map +1 -0
  261. package/build/lib/schemas/adapter.d.ts +33 -0
  262. package/build/lib/schemas/adapter.d.ts.map +1 -0
  263. package/build/lib/schemas/adapter.js +27 -0
  264. package/build/lib/schemas/adapter.js.map +1 -0
  265. package/build/lib/schemas/bundle.d.ts +38 -0
  266. package/build/lib/schemas/bundle.d.ts.map +1 -0
  267. package/build/lib/schemas/bundle.js +19 -0
  268. package/build/lib/schemas/bundle.js.map +1 -0
  269. package/build/lib/schemas/config.d.ts +12 -0
  270. package/build/lib/schemas/config.d.ts.map +1 -0
  271. package/build/lib/schemas/config.js +14 -0
  272. package/build/lib/schemas/config.js.map +1 -0
  273. package/build/lib/schemas/index.d.ts +7 -0
  274. package/build/lib/schemas/index.d.ts.map +1 -0
  275. package/build/lib/schemas/index.js +7 -0
  276. package/build/lib/schemas/index.js.map +1 -0
  277. package/build/lib/schemas/lockfile.d.ts +102 -0
  278. package/build/lib/schemas/lockfile.d.ts.map +1 -0
  279. package/build/lib/schemas/lockfile.js +50 -0
  280. package/build/lib/schemas/lockfile.js.map +1 -0
  281. package/build/lib/schemas/manifest.d.ts +91 -0
  282. package/build/lib/schemas/manifest.d.ts.map +1 -0
  283. package/build/lib/schemas/manifest.js +42 -0
  284. package/build/lib/schemas/manifest.js.map +1 -0
  285. package/build/lib/schemas/registry.d.ts +225 -0
  286. package/build/lib/schemas/registry.d.ts.map +1 -0
  287. package/build/lib/schemas/registry.js +59 -0
  288. package/build/lib/schemas/registry.js.map +1 -0
  289. package/build/lib/search.d.ts +23 -0
  290. package/build/lib/search.d.ts.map +1 -0
  291. package/build/lib/search.js +139 -0
  292. package/build/lib/search.js.map +1 -0
  293. package/build/lib/tool-resolver.d.ts +12 -0
  294. package/build/lib/tool-resolver.d.ts.map +1 -0
  295. package/build/lib/tool-resolver.js +24 -0
  296. package/build/lib/tool-resolver.js.map +1 -0
  297. package/build/lib/uninstaller.d.ts +109 -0
  298. package/build/lib/uninstaller.d.ts.map +1 -0
  299. package/build/lib/uninstaller.js +368 -0
  300. package/build/lib/uninstaller.js.map +1 -0
  301. package/build/lib/updater.d.ts +68 -0
  302. package/build/lib/updater.d.ts.map +1 -0
  303. package/build/lib/updater.js +230 -0
  304. package/build/lib/updater.js.map +1 -0
  305. package/build/lib/version.d.ts +13 -0
  306. package/build/lib/version.d.ts.map +1 -0
  307. package/build/lib/version.js +30 -0
  308. package/build/lib/version.js.map +1 -0
  309. package/build/windows-esm-loader.d.ts +15 -0
  310. package/build/windows-esm-loader.d.ts.map +1 -0
  311. package/build/windows-esm-loader.js +11 -0
  312. package/build/windows-esm-loader.js.map +1 -0
  313. package/package.json +67 -0
  314. package/tool-adapters/claude-code.json +34 -0
@@ -0,0 +1,315 @@
1
+ import { useCallback, useReducer } from 'react';
2
+ import { isInstalled } from '../lib/lockfile.js';
3
+ export const TYPE_TABS = [
4
+ 'all',
5
+ 'skill',
6
+ 'agent',
7
+ 'rule',
8
+ 'hook',
9
+ 'memory-template',
10
+ 'mcp-config',
11
+ 'bundle',
12
+ ];
13
+ export const TYPE_TAB_LABELS = {
14
+ agent: 'Agents',
15
+ all: 'All',
16
+ bundle: 'Bundles',
17
+ hook: 'Hooks',
18
+ 'mcp-config': 'MCP Configs',
19
+ 'memory-template': 'Memory Templates',
20
+ rule: 'Rules',
21
+ skill: 'Skills',
22
+ };
23
+ // --- Reducer ---
24
+ export function browseReducer(state, action) {
25
+ switch (action.type) {
26
+ case 'LOAD_ERROR':
27
+ if (state.status !== 'loading')
28
+ return state;
29
+ return { message: action.message, status: 'error' };
30
+ case 'SET_VIEWPORT_HEIGHT':
31
+ if (state.status === 'ready' || state.status === 'loading') {
32
+ return { ...state, viewportHeight: action.height };
33
+ }
34
+ return state;
35
+ }
36
+ if (action.type === 'LOAD_SUCCESS') {
37
+ if (state.status !== 'loading')
38
+ return state;
39
+ const allAssets = action.registry.assets;
40
+ const allBundles = action.registry.bundles ?? [];
41
+ const typeFilter = action.initialTypeFilter ?? 'all';
42
+ const filterText = action.initialFilterText ?? '';
43
+ return {
44
+ allAssets,
45
+ allBundles,
46
+ cursorIndex: 0,
47
+ expandedIndex: null,
48
+ filteredItems: computeFilteredItems(allAssets, allBundles, typeFilter, filterText),
49
+ filterText,
50
+ lockfile: action.lockfile,
51
+ mode: { inputMode: 'navigate', kind: 'browsing' },
52
+ registry: action.registry,
53
+ scrollOffset: 0,
54
+ status: 'ready',
55
+ typeFilter,
56
+ viewportHeight: state.viewportHeight,
57
+ };
58
+ }
59
+ if (state.status !== 'ready')
60
+ return state;
61
+ switch (action.type) {
62
+ case 'APPEND_FILTER_CHAR': {
63
+ const newText = state.filterText + action.char;
64
+ const newItems = computeFilteredItems(state.allAssets, state.allBundles, state.typeFilter, newText);
65
+ return {
66
+ ...state,
67
+ cursorIndex: 0,
68
+ expandedIndex: null,
69
+ filteredItems: newItems,
70
+ filterText: newText,
71
+ scrollOffset: 0,
72
+ };
73
+ }
74
+ case 'BEGIN_INSTALL': {
75
+ if (state.mode.kind !== 'browsing')
76
+ return state;
77
+ if (state.filteredItems.length === 0)
78
+ return state;
79
+ const item = state.filteredItems[state.cursorIndex];
80
+ if (item.kind === 'asset') {
81
+ return {
82
+ ...state,
83
+ mode: {
84
+ alreadyInstalled: isInstalled(state.lockfile, item.data.name, item.data.type),
85
+ assetName: item.data.name,
86
+ assetVersion: item.data.latest,
87
+ itemKind: 'asset',
88
+ kind: 'confirming-install',
89
+ },
90
+ };
91
+ }
92
+ const bundleAssets = item.data.assets ?? [];
93
+ const anyBundleAssetInstalled = bundleAssets.length > 0 && bundleAssets.some((a) => isInstalled(state.lockfile, a.name, a.type));
94
+ return {
95
+ ...state,
96
+ mode: {
97
+ alreadyInstalled: anyBundleAssetInstalled,
98
+ assetName: item.data.name,
99
+ assetVersion: item.data.version,
100
+ bundleAssetCount: item.data.assetCount,
101
+ bundleName: item.data.name,
102
+ itemKind: 'bundle',
103
+ kind: 'confirming-install',
104
+ },
105
+ };
106
+ }
107
+ case 'CANCEL_INSTALL': {
108
+ if (state.mode.kind !== 'confirming-install')
109
+ return state;
110
+ return { ...state, mode: { inputMode: 'navigate', kind: 'browsing' } };
111
+ }
112
+ case 'COLLAPSE': {
113
+ if (state.expandedIndex === null)
114
+ return state;
115
+ return { ...state, expandedIndex: null };
116
+ }
117
+ case 'CONFIRM_INSTALL': {
118
+ if (state.mode.kind !== 'confirming-install')
119
+ return state;
120
+ return {
121
+ ...state,
122
+ mode: {
123
+ assetName: state.mode.assetName,
124
+ assetVersion: state.mode.assetVersion,
125
+ bundleAssetCount: state.mode.bundleAssetCount,
126
+ bundleName: state.mode.bundleName,
127
+ itemKind: state.mode.itemKind,
128
+ kind: 'installing',
129
+ message: `Installing ${state.mode.assetName}...`,
130
+ },
131
+ };
132
+ }
133
+ case 'CURSOR_DOWN': {
134
+ if (state.filteredItems.length === 0)
135
+ return state;
136
+ const newIndex = Math.min(state.filteredItems.length - 1, state.cursorIndex + 1);
137
+ if (newIndex === state.cursorIndex)
138
+ return state;
139
+ const newScroll = clampScroll(newIndex, state.scrollOffset, state.viewportHeight);
140
+ return {
141
+ ...state,
142
+ cursorIndex: newIndex,
143
+ expandedIndex: null,
144
+ scrollOffset: newScroll,
145
+ };
146
+ }
147
+ case 'CURSOR_UP': {
148
+ if (state.filteredItems.length === 0)
149
+ return state;
150
+ const newIndex = Math.max(0, state.cursorIndex - 1);
151
+ if (newIndex === state.cursorIndex)
152
+ return state;
153
+ const newScroll = clampScroll(newIndex, state.scrollOffset, state.viewportHeight);
154
+ return {
155
+ ...state,
156
+ cursorIndex: newIndex,
157
+ expandedIndex: null,
158
+ scrollOffset: newScroll,
159
+ };
160
+ }
161
+ case 'CYCLE_TYPE': {
162
+ const currentIdx = TYPE_TABS.indexOf(state.typeFilter);
163
+ const nextIdx = (currentIdx + 1) % TYPE_TABS.length;
164
+ const newTypeFilter = TYPE_TABS[nextIdx];
165
+ const newItems = computeFilteredItems(state.allAssets, state.allBundles, newTypeFilter, state.filterText);
166
+ return {
167
+ ...state,
168
+ cursorIndex: 0,
169
+ expandedIndex: null,
170
+ filteredItems: newItems,
171
+ scrollOffset: 0,
172
+ typeFilter: newTypeFilter,
173
+ };
174
+ }
175
+ case 'DELETE_FILTER_CHAR': {
176
+ if (state.filterText.length === 0)
177
+ return state;
178
+ const newText = state.filterText.slice(0, -1);
179
+ const newItems = computeFilteredItems(state.allAssets, state.allBundles, state.typeFilter, newText);
180
+ return {
181
+ ...state,
182
+ cursorIndex: 0,
183
+ expandedIndex: null,
184
+ filteredItems: newItems,
185
+ filterText: newText,
186
+ scrollOffset: 0,
187
+ };
188
+ }
189
+ case 'DISMISS_RESULT': {
190
+ if (state.mode.kind !== 'install-result')
191
+ return state;
192
+ return { ...state, mode: { inputMode: 'navigate', kind: 'browsing' } };
193
+ }
194
+ case 'ENTER_FILTER_MODE': {
195
+ if (state.mode.kind !== 'browsing')
196
+ return state;
197
+ return { ...state, mode: { inputMode: 'filter', kind: 'browsing' } };
198
+ }
199
+ case 'EXIT_FILTER_MODE': {
200
+ if (state.mode.kind !== 'browsing')
201
+ return state;
202
+ return { ...state, mode: { inputMode: 'navigate', kind: 'browsing' } };
203
+ }
204
+ case 'EXPAND_TOGGLE': {
205
+ if (state.filteredItems.length === 0)
206
+ return state;
207
+ const newExpanded = state.expandedIndex === state.cursorIndex ? null : state.cursorIndex;
208
+ return { ...state, expandedIndex: newExpanded };
209
+ }
210
+ case 'INSTALL_COMPLETE': {
211
+ if (state.mode.kind !== 'installing')
212
+ return state;
213
+ return {
214
+ ...state,
215
+ lockfile: action.newLockfile ?? state.lockfile,
216
+ mode: {
217
+ assetName: state.mode.assetName,
218
+ bundleAssetCount: state.mode.bundleAssetCount,
219
+ bundleName: state.mode.bundleName,
220
+ itemKind: state.mode.itemKind,
221
+ kind: 'install-result',
222
+ message: action.message,
223
+ success: action.success,
224
+ },
225
+ };
226
+ }
227
+ case 'INSTALL_PROGRESS': {
228
+ if (state.mode.kind !== 'installing')
229
+ return state;
230
+ return {
231
+ ...state,
232
+ mode: { ...state.mode, message: action.message },
233
+ };
234
+ }
235
+ default:
236
+ return state;
237
+ }
238
+ }
239
+ // --- Helpers ---
240
+ export function computeFilteredItems(allAssets, allBundles, typeFilter, filterText) {
241
+ const query = filterText.toLowerCase().trim();
242
+ function matchesText(name, description, tags, author) {
243
+ if (!query)
244
+ return true;
245
+ return (name.toLowerCase().includes(query) ||
246
+ description.toLowerCase().includes(query) ||
247
+ tags.some((t) => t.toLowerCase().includes(query)) ||
248
+ author.toLowerCase().includes(query));
249
+ }
250
+ const items = [];
251
+ if (typeFilter === 'bundle') {
252
+ // Bundles only
253
+ for (const b of allBundles) {
254
+ if (matchesText(b.name, b.description, b.tags, b.author)) {
255
+ items.push({ data: b, kind: 'bundle' });
256
+ }
257
+ }
258
+ }
259
+ else if (typeFilter === 'all') {
260
+ // Assets + bundles mixed
261
+ for (const a of allAssets) {
262
+ const latestVersion = a.versions[a.latest];
263
+ if (matchesText(a.name, latestVersion?.description ?? '', a.tags, latestVersion?.author ?? '')) {
264
+ items.push({ data: a, kind: 'asset' });
265
+ }
266
+ }
267
+ for (const b of allBundles) {
268
+ if (matchesText(b.name, b.description, b.tags, b.author)) {
269
+ items.push({ data: b, kind: 'bundle' });
270
+ }
271
+ }
272
+ }
273
+ else {
274
+ // Specific asset type (no bundles)
275
+ for (const a of allAssets) {
276
+ const latestVersion = a.versions[a.latest];
277
+ if (a.type === typeFilter &&
278
+ matchesText(a.name, latestVersion?.description ?? '', a.tags, latestVersion?.author ?? '')) {
279
+ items.push({ data: a, kind: 'asset' });
280
+ }
281
+ }
282
+ }
283
+ return items.sort((a, b) => a.data.name.localeCompare(b.data.name));
284
+ }
285
+ // --- Hook ---
286
+ export function useBrowseState(initialFilterText, initialTypeFilter) {
287
+ const initialState = {
288
+ message: 'Loading registry...',
289
+ status: 'loading',
290
+ viewportHeight: 20,
291
+ };
292
+ const [state, dispatch] = useReducer(browseReducer, initialState);
293
+ const dispatchLoad = useCallback((registry, lockfile) => {
294
+ dispatch({
295
+ initialFilterText: initialFilterText || undefined,
296
+ initialTypeFilter: initialTypeFilter !== 'all' ? initialTypeFilter : undefined,
297
+ lockfile,
298
+ registry,
299
+ type: 'LOAD_SUCCESS',
300
+ });
301
+ }, [initialFilterText, initialTypeFilter]);
302
+ return [state, dispatch, dispatchLoad];
303
+ }
304
+ function clampScroll(cursorIndex, scrollOffset, viewportHeight) {
305
+ if (viewportHeight <= 0)
306
+ return 0;
307
+ if (cursorIndex < scrollOffset) {
308
+ return cursorIndex;
309
+ }
310
+ if (cursorIndex >= scrollOffset + viewportHeight) {
311
+ return cursorIndex - viewportHeight + 1;
312
+ }
313
+ return scrollOffset;
314
+ }
315
+ //# sourceMappingURL=useBrowseState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBrowseState.js","sourceRoot":"","sources":["../../src/hooks/useBrowseState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { DependencyList } from 'react';
2
+ export type CommandState<T> = {
3
+ data: T;
4
+ status: 'done';
5
+ } | {
6
+ message: string;
7
+ status: 'error';
8
+ } | {
9
+ message: string;
10
+ status: 'loading';
11
+ };
12
+ /**
13
+ * Generic hook that manages the loading → done | error state machine for CLI commands.
14
+ *
15
+ * Accepts an async `execute` function that receives a `progress` callback for updating
16
+ * loading messages. The execute function's return value becomes `state.data` when done.
17
+ * Thrown errors are caught and surfaced as `state.status === 'error'`.
18
+ *
19
+ * Intermediate command outcomes (not-found, already-installed, deprecated, etc.) should
20
+ * be modeled as variants of `T`, not as additional hook states.
21
+ */
22
+ export declare function useCommand<T>(execute: (progress: (message: string) => void) => Promise<T>, deps: DependencyList, initialMessage?: string): CommandState<T>;
23
+ //# sourceMappingURL=useCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCommand.d.ts","sourceRoot":"","sources":["../../src/hooks/useCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAI5C,MAAM,MAAM,YAAY,CAAC,CAAC,IACtB;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC;AAE3C;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAC5D,IAAI,EAAE,cAAc,EACpB,cAAc,SAAoB,GACjC,YAAY,CAAC,CAAC,CAAC,CAoCjB"}
@@ -0,0 +1,43 @@
1
+ import { useEffect, useState } from 'react';
2
+ /**
3
+ * Generic hook that manages the loading → done | error state machine for CLI commands.
4
+ *
5
+ * Accepts an async `execute` function that receives a `progress` callback for updating
6
+ * loading messages. The execute function's return value becomes `state.data` when done.
7
+ * Thrown errors are caught and surfaced as `state.status === 'error'`.
8
+ *
9
+ * Intermediate command outcomes (not-found, already-installed, deprecated, etc.) should
10
+ * be modeled as variants of `T`, not as additional hook states.
11
+ */
12
+ export function useCommand(execute, deps, initialMessage = 'Initializing...') {
13
+ const [state, setState] = useState({ message: initialMessage, status: 'loading' });
14
+ useEffect(() => {
15
+ let cancelled = false;
16
+ setState({ message: initialMessage, status: 'loading' });
17
+ const progress = (message) => {
18
+ if (!cancelled) {
19
+ setState({ message, status: 'loading' });
20
+ }
21
+ };
22
+ execute(progress)
23
+ .then((data) => {
24
+ if (!cancelled) {
25
+ setState({ data, status: 'done' });
26
+ }
27
+ })
28
+ .catch((err) => {
29
+ if (!cancelled) {
30
+ setState({
31
+ message: err instanceof Error ? err.message : String(err),
32
+ status: 'error',
33
+ });
34
+ }
35
+ });
36
+ return () => {
37
+ cancelled = true;
38
+ };
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ }, deps);
41
+ return state;
42
+ }
43
+ //# sourceMappingURL=useCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCommand.js","sourceRoot":"","sources":["../../src/hooks/useCommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAO5C;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CACxB,OAA4D,EAC5D,IAAoB,EACpB,cAAc,GAAG,iBAAiB;IAElC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,QAAQ,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,EAAE;YACnC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,QAAQ,CAAC;aACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,QAAQ,CAAC;oBACP,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;oBACzD,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { AssetType } from './schemas/manifest.js';
2
+ import { type Adapter, type PlacementConfig } from './schemas/adapter.js';
3
+ export declare class AdapterError extends Error {
4
+ constructor(message: string);
5
+ }
6
+ /**
7
+ * Clear the adapter cache (useful for testing).
8
+ */
9
+ export declare function clearAdapterCache(): void;
10
+ /**
11
+ * Get the placement config for an asset type from an adapter.
12
+ * Returns undefined if the adapter has no placement for that type.
13
+ */
14
+ export declare function getPlacement(adapter: Adapter, assetType: AssetType): PlacementConfig | undefined;
15
+ /**
16
+ * Get all asset types that an adapter supports placements for.
17
+ */
18
+ export declare function getSupportedAssetTypes(adapter: Adapter): AssetType[];
19
+ /**
20
+ * Load a tool adapter by tool name.
21
+ * Looks for `tool-adapters/{tool}.json` bundled with the repo.
22
+ */
23
+ export declare function loadAdapter(tool: string): Promise<Adapter>;
24
+ /**
25
+ * Load all adapter JSON files from the tool-adapters directory.
26
+ * Reads all `.json` files (excluding files starting with `_`),
27
+ * parses each with AdapterSchema, and returns all valid adapters.
28
+ * Leverages the adapter cache to avoid redundant file reads.
29
+ */
30
+ export declare function loadAllAdapters(): Promise<Adapter[]>;
31
+ /**
32
+ * Resolve a placement path template by replacing {name} with the asset name.
33
+ * The basePath is the project root directory.
34
+ */
35
+ export declare function resolvePlacementPath(placement: PlacementConfig, assetName: string, basePath: string): string;
36
+ /**
37
+ * Check if an adapter supports a given asset type.
38
+ */
39
+ export declare function supportsAssetType(adapter: Adapter, assetType: AssetType): boolean;
40
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/lib/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,KAAK,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAOzF,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAKD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,CAEhG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,CAEpE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBhE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAoC1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5G;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAEjF"}
@@ -0,0 +1,112 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { readdir, readFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { parseAndValidate } from './parse-json.js';
6
+ import { AdapterSchema } from './schemas/adapter.js';
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ /** Resolve tool-adapters directory relative to the package root (works both in dev and when installed via npm). */
9
+ const ADAPTERS_DIR = join(__dirname, '..', '..', 'tool-adapters');
10
+ export class AdapterError extends Error {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = 'AdapterError';
14
+ }
15
+ }
16
+ /** Cache loaded adapters by tool name. */
17
+ const adapterCache = new Map();
18
+ /**
19
+ * Clear the adapter cache (useful for testing).
20
+ */
21
+ export function clearAdapterCache() {
22
+ adapterCache.clear();
23
+ }
24
+ /**
25
+ * Get the placement config for an asset type from an adapter.
26
+ * Returns undefined if the adapter has no placement for that type.
27
+ */
28
+ export function getPlacement(adapter, assetType) {
29
+ return adapter.placements[assetType];
30
+ }
31
+ /**
32
+ * Get all asset types that an adapter supports placements for.
33
+ */
34
+ export function getSupportedAssetTypes(adapter) {
35
+ return Object.keys(adapter.placements);
36
+ }
37
+ /**
38
+ * Load a tool adapter by tool name.
39
+ * Looks for `tool-adapters/{tool}.json` bundled with the repo.
40
+ */
41
+ export async function loadAdapter(tool) {
42
+ const cached = adapterCache.get(tool);
43
+ if (cached) {
44
+ return cached;
45
+ }
46
+ const filePath = join(ADAPTERS_DIR, `${tool}.json`);
47
+ if (!existsSync(filePath)) {
48
+ throw new AdapterError(`No adapter found for tool "${tool}". Expected file at: ${filePath}`);
49
+ }
50
+ const raw = await readFile(filePath, 'utf-8');
51
+ try {
52
+ const adapter = parseAndValidate(raw, AdapterSchema, `Invalid adapter file for "${tool}"`);
53
+ adapterCache.set(tool, adapter);
54
+ return adapter;
55
+ }
56
+ catch (err) {
57
+ throw new AdapterError(err.message);
58
+ }
59
+ }
60
+ /**
61
+ * Load all adapter JSON files from the tool-adapters directory.
62
+ * Reads all `.json` files (excluding files starting with `_`),
63
+ * parses each with AdapterSchema, and returns all valid adapters.
64
+ * Leverages the adapter cache to avoid redundant file reads.
65
+ */
66
+ export async function loadAllAdapters() {
67
+ if (!existsSync(ADAPTERS_DIR)) {
68
+ return [];
69
+ }
70
+ const entries = await readdir(ADAPTERS_DIR);
71
+ const adapters = [];
72
+ for (const entry of entries) {
73
+ if (entry.startsWith('_') || !entry.endsWith('.json')) {
74
+ continue;
75
+ }
76
+ // Derive the tool name from the filename (e.g., "claude-code.json" -> "claude-code")
77
+ const tool = entry.replace(/\.json$/, '');
78
+ // Use cache if already loaded
79
+ const cached = adapterCache.get(tool);
80
+ if (cached) {
81
+ adapters.push(cached);
82
+ continue;
83
+ }
84
+ const filePath = join(ADAPTERS_DIR, entry);
85
+ try {
86
+ const raw = await readFile(filePath, 'utf-8');
87
+ const adapter = parseAndValidate(raw, AdapterSchema, `Invalid adapter file for "${tool}"`);
88
+ adapterCache.set(tool, adapter);
89
+ adapters.push(adapter);
90
+ }
91
+ catch {
92
+ // Skip adapters that fail to parse — callers can use loadAdapter() for specific error handling
93
+ continue;
94
+ }
95
+ }
96
+ return adapters;
97
+ }
98
+ /**
99
+ * Resolve a placement path template by replacing {name} with the asset name.
100
+ * The basePath is the project root directory.
101
+ */
102
+ export function resolvePlacementPath(placement, assetName, basePath) {
103
+ const resolvedPath = placement.path.replace(/\{name\}/g, assetName);
104
+ return join(basePath, resolvedPath);
105
+ }
106
+ /**
107
+ * Check if an adapter supports a given asset type.
108
+ */
109
+ export function supportsAssetType(adapter, assetType) {
110
+ return assetType in adapter.placements;
111
+ }
112
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/lib/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare class AuthError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ /**
5
+ * Clear the cached GitHub token. Useful for testing.
6
+ */
7
+ export declare function clearTokenCache(): void;
8
+ /**
9
+ * Get a GitHub token for API access.
10
+ *
11
+ * Resolution order:
12
+ * 1. Config file githubToken (from ~/.atkrc.json)
13
+ * 2. GITHUB_TOKEN environment variable
14
+ * 3. `gh auth token` subprocess call
15
+ *
16
+ * The resolved token is cached for the lifetime of the process.
17
+ */
18
+ export declare function getGitHubToken(): Promise<string>;
19
+ /**
20
+ * Check if the gh CLI is installed and available.
21
+ */
22
+ export declare function isGhCliAvailable(): Promise<boolean>;
23
+ /**
24
+ * Validate that a GitHub token has access to the registry repo.
25
+ * Makes a lightweight API call to check access.
26
+ */
27
+ export declare function validateToken(token: string): Promise<{
28
+ username?: string;
29
+ valid: boolean;
30
+ }>;
31
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAMA,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAKD;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAsBtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAMnD;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAoBjG"}