@a1st/aix 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 (245) hide show
  1. package/bin/dev.js +13 -0
  2. package/bin/run.js +5 -0
  3. package/dist/base-command.d.ts +48 -0
  4. package/dist/base-command.d.ts.map +1 -0
  5. package/dist/base-command.js +131 -0
  6. package/dist/base-command.js.map +1 -0
  7. package/dist/commands/add/index.d.ts +7 -0
  8. package/dist/commands/add/index.d.ts.map +1 -0
  9. package/dist/commands/add/index.js +10 -0
  10. package/dist/commands/add/index.js.map +1 -0
  11. package/dist/commands/add/mcp.d.ts +32 -0
  12. package/dist/commands/add/mcp.d.ts.map +1 -0
  13. package/dist/commands/add/mcp.js +209 -0
  14. package/dist/commands/add/mcp.js.map +1 -0
  15. package/dist/commands/add/prompt.d.ts +18 -0
  16. package/dist/commands/add/prompt.d.ts.map +1 -0
  17. package/dist/commands/add/prompt.js +196 -0
  18. package/dist/commands/add/prompt.js.map +1 -0
  19. package/dist/commands/add/rule.d.ts +20 -0
  20. package/dist/commands/add/rule.d.ts.map +1 -0
  21. package/dist/commands/add/rule.js +207 -0
  22. package/dist/commands/add/rule.js.map +1 -0
  23. package/dist/commands/add/skill.d.ts +16 -0
  24. package/dist/commands/add/skill.d.ts.map +1 -0
  25. package/dist/commands/add/skill.js +212 -0
  26. package/dist/commands/add/skill.js.map +1 -0
  27. package/dist/commands/backups.d.ts +9 -0
  28. package/dist/commands/backups.d.ts.map +1 -0
  29. package/dist/commands/backups.js +147 -0
  30. package/dist/commands/backups.js.map +1 -0
  31. package/dist/commands/cache/clear.d.ts +8 -0
  32. package/dist/commands/cache/clear.d.ts.map +1 -0
  33. package/dist/commands/cache/clear.js +34 -0
  34. package/dist/commands/cache/clear.js.map +1 -0
  35. package/dist/commands/cache/index.d.ts +7 -0
  36. package/dist/commands/cache/index.d.ts.map +1 -0
  37. package/dist/commands/cache/index.js +10 -0
  38. package/dist/commands/cache/index.js.map +1 -0
  39. package/dist/commands/config/get.d.ts +11 -0
  40. package/dist/commands/config/get.d.ts.map +1 -0
  41. package/dist/commands/config/get.js +49 -0
  42. package/dist/commands/config/get.js.map +1 -0
  43. package/dist/commands/config/index.d.ts +7 -0
  44. package/dist/commands/config/index.d.ts.map +1 -0
  45. package/dist/commands/config/index.js +10 -0
  46. package/dist/commands/config/index.js.map +1 -0
  47. package/dist/commands/config/set.d.ts +12 -0
  48. package/dist/commands/config/set.d.ts.map +1 -0
  49. package/dist/commands/config/set.js +58 -0
  50. package/dist/commands/config/set.js.map +1 -0
  51. package/dist/commands/config/show.d.ts +10 -0
  52. package/dist/commands/config/show.d.ts.map +1 -0
  53. package/dist/commands/config/show.js +49 -0
  54. package/dist/commands/config/show.js.map +1 -0
  55. package/dist/commands/global/cleanup.d.ts +14 -0
  56. package/dist/commands/global/cleanup.d.ts.map +1 -0
  57. package/dist/commands/global/cleanup.js +92 -0
  58. package/dist/commands/global/cleanup.js.map +1 -0
  59. package/dist/commands/global/index.d.ts +7 -0
  60. package/dist/commands/global/index.d.ts.map +1 -0
  61. package/dist/commands/global/index.js +10 -0
  62. package/dist/commands/global/index.js.map +1 -0
  63. package/dist/commands/global/list.d.ts +7 -0
  64. package/dist/commands/global/list.d.ts.map +1 -0
  65. package/dist/commands/global/list.js +40 -0
  66. package/dist/commands/global/list.js.map +1 -0
  67. package/dist/commands/init.d.ts +12 -0
  68. package/dist/commands/init.d.ts.map +1 -0
  69. package/dist/commands/init.js +110 -0
  70. package/dist/commands/init.js.map +1 -0
  71. package/dist/commands/install.d.ts +55 -0
  72. package/dist/commands/install.d.ts.map +1 -0
  73. package/dist/commands/install.js +412 -0
  74. package/dist/commands/install.js.map +1 -0
  75. package/dist/commands/list/editors.d.ts +7 -0
  76. package/dist/commands/list/editors.d.ts.map +1 -0
  77. package/dist/commands/list/editors.js +36 -0
  78. package/dist/commands/list/editors.js.map +1 -0
  79. package/dist/commands/list/index.d.ts +12 -0
  80. package/dist/commands/list/index.d.ts.map +1 -0
  81. package/dist/commands/list/index.js +60 -0
  82. package/dist/commands/list/index.js.map +1 -0
  83. package/dist/commands/list/mcp.d.ts +8 -0
  84. package/dist/commands/list/mcp.d.ts.map +1 -0
  85. package/dist/commands/list/mcp.js +45 -0
  86. package/dist/commands/list/mcp.js.map +1 -0
  87. package/dist/commands/list/rules.d.ts +7 -0
  88. package/dist/commands/list/rules.d.ts.map +1 -0
  89. package/dist/commands/list/rules.js +59 -0
  90. package/dist/commands/list/rules.js.map +1 -0
  91. package/dist/commands/list/skills.d.ts +7 -0
  92. package/dist/commands/list/skills.d.ts.map +1 -0
  93. package/dist/commands/list/skills.js +34 -0
  94. package/dist/commands/list/skills.js.map +1 -0
  95. package/dist/commands/remove/index.d.ts +7 -0
  96. package/dist/commands/remove/index.d.ts.map +1 -0
  97. package/dist/commands/remove/index.js +10 -0
  98. package/dist/commands/remove/index.js.map +1 -0
  99. package/dist/commands/remove/mcp.d.ts +15 -0
  100. package/dist/commands/remove/mcp.d.ts.map +1 -0
  101. package/dist/commands/remove/mcp.js +125 -0
  102. package/dist/commands/remove/mcp.js.map +1 -0
  103. package/dist/commands/remove/skill.d.ts +15 -0
  104. package/dist/commands/remove/skill.d.ts.map +1 -0
  105. package/dist/commands/remove/skill.js +115 -0
  106. package/dist/commands/remove/skill.js.map +1 -0
  107. package/dist/commands/search.d.ts +18 -0
  108. package/dist/commands/search.d.ts.map +1 -0
  109. package/dist/commands/search.js +221 -0
  110. package/dist/commands/search.js.map +1 -0
  111. package/dist/commands/validate.d.ts +7 -0
  112. package/dist/commands/validate.d.ts.map +1 -0
  113. package/dist/commands/validate.js +57 -0
  114. package/dist/commands/validate.js.map +1 -0
  115. package/dist/flags/local.d.ts +8 -0
  116. package/dist/flags/local.d.ts.map +1 -0
  117. package/dist/flags/local.js +13 -0
  118. package/dist/flags/local.js.map +1 -0
  119. package/dist/flags/scope.d.ts +20 -0
  120. package/dist/flags/scope.d.ts.map +1 -0
  121. package/dist/flags/scope.js +30 -0
  122. package/dist/flags/scope.js.map +1 -0
  123. package/dist/hooks/postrun/patch-autocomplete.d.ts +18 -0
  124. package/dist/hooks/postrun/patch-autocomplete.d.ts.map +1 -0
  125. package/dist/hooks/postrun/patch-autocomplete.js +49 -0
  126. package/dist/hooks/postrun/patch-autocomplete.js.map +1 -0
  127. package/dist/index.d.ts +4 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +4 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/lib/add-helper.d.ts +49 -0
  132. package/dist/lib/add-helper.d.ts.map +1 -0
  133. package/dist/lib/add-helper.js +172 -0
  134. package/dist/lib/add-helper.js.map +1 -0
  135. package/dist/lib/delete-helper.d.ts +25 -0
  136. package/dist/lib/delete-helper.d.ts.map +1 -0
  137. package/dist/lib/delete-helper.js +76 -0
  138. package/dist/lib/delete-helper.js.map +1 -0
  139. package/dist/lib/errors.d.ts +30 -0
  140. package/dist/lib/errors.d.ts.map +1 -0
  141. package/dist/lib/errors.js +41 -0
  142. package/dist/lib/errors.js.map +1 -0
  143. package/dist/lib/help.d.ts +7 -0
  144. package/dist/lib/help.d.ts.map +1 -0
  145. package/dist/lib/help.js +39 -0
  146. package/dist/lib/help.js.map +1 -0
  147. package/dist/lib/install-helper.d.ts +23 -0
  148. package/dist/lib/install-helper.d.ts.map +1 -0
  149. package/dist/lib/install-helper.js +49 -0
  150. package/dist/lib/install-helper.js.map +1 -0
  151. package/dist/lib/output.d.ts +26 -0
  152. package/dist/lib/output.d.ts.map +1 -0
  153. package/dist/lib/output.js +77 -0
  154. package/dist/lib/output.js.map +1 -0
  155. package/dist/lib/search/debounce.d.ts +17 -0
  156. package/dist/lib/search/debounce.d.ts.map +1 -0
  157. package/dist/lib/search/debounce.js +33 -0
  158. package/dist/lib/search/debounce.js.map +1 -0
  159. package/dist/lib/search/index.d.ts +5 -0
  160. package/dist/lib/search/index.d.ts.map +1 -0
  161. package/dist/lib/search/index.js +5 -0
  162. package/dist/lib/search/index.js.map +1 -0
  163. package/dist/lib/search/registry.d.ts +43 -0
  164. package/dist/lib/search/registry.d.ts.map +1 -0
  165. package/dist/lib/search/registry.js +83 -0
  166. package/dist/lib/search/registry.js.map +1 -0
  167. package/dist/lib/search/sources/claude-plugins-dev.d.ts +16 -0
  168. package/dist/lib/search/sources/claude-plugins-dev.d.ts.map +1 -0
  169. package/dist/lib/search/sources/claude-plugins-dev.js +44 -0
  170. package/dist/lib/search/sources/claude-plugins-dev.js.map +1 -0
  171. package/dist/lib/search/sources/index.d.ts +4 -0
  172. package/dist/lib/search/sources/index.d.ts.map +1 -0
  173. package/dist/lib/search/sources/index.js +4 -0
  174. package/dist/lib/search/sources/index.js.map +1 -0
  175. package/dist/lib/search/sources/mcp-registry.d.ts +14 -0
  176. package/dist/lib/search/sources/mcp-registry.d.ts.map +1 -0
  177. package/dist/lib/search/sources/mcp-registry.js +40 -0
  178. package/dist/lib/search/sources/mcp-registry.js.map +1 -0
  179. package/dist/lib/search/sources/npm.d.ts +14 -0
  180. package/dist/lib/search/sources/npm.d.ts.map +1 -0
  181. package/dist/lib/search/sources/npm.js +42 -0
  182. package/dist/lib/search/sources/npm.js.map +1 -0
  183. package/dist/lib/search/types.d.ts +52 -0
  184. package/dist/lib/search/types.d.ts.map +1 -0
  185. package/dist/lib/search/types.js +14 -0
  186. package/dist/lib/search/types.js.map +1 -0
  187. package/dist/ui/search/components/DetailsPanel.d.ts +9 -0
  188. package/dist/ui/search/components/DetailsPanel.d.ts.map +1 -0
  189. package/dist/ui/search/components/DetailsPanel.js +11 -0
  190. package/dist/ui/search/components/DetailsPanel.js.map +1 -0
  191. package/dist/ui/search/components/ResultsList.d.ts +14 -0
  192. package/dist/ui/search/components/ResultsList.d.ts.map +1 -0
  193. package/dist/ui/search/components/ResultsList.js +32 -0
  194. package/dist/ui/search/components/ResultsList.js.map +1 -0
  195. package/dist/ui/search/components/SearchApp.d.ts +4 -0
  196. package/dist/ui/search/components/SearchApp.d.ts.map +1 -0
  197. package/dist/ui/search/components/SearchApp.js +61 -0
  198. package/dist/ui/search/components/SearchApp.js.map +1 -0
  199. package/dist/ui/search/components/SearchInput.d.ts +12 -0
  200. package/dist/ui/search/components/SearchInput.d.ts.map +1 -0
  201. package/dist/ui/search/components/SearchInput.js +14 -0
  202. package/dist/ui/search/components/SearchInput.js.map +1 -0
  203. package/dist/ui/search/components/StatusBar.d.ts +10 -0
  204. package/dist/ui/search/components/StatusBar.d.ts.map +1 -0
  205. package/dist/ui/search/components/StatusBar.js +13 -0
  206. package/dist/ui/search/components/StatusBar.js.map +1 -0
  207. package/dist/ui/search/components/TabBar.d.ts +10 -0
  208. package/dist/ui/search/components/TabBar.d.ts.map +1 -0
  209. package/dist/ui/search/components/TabBar.js +6 -0
  210. package/dist/ui/search/components/TabBar.js.map +1 -0
  211. package/dist/ui/search/hooks/use-install.d.ts +18 -0
  212. package/dist/ui/search/hooks/use-install.d.ts.map +1 -0
  213. package/dist/ui/search/hooks/use-install.js +51 -0
  214. package/dist/ui/search/hooks/use-install.js.map +1 -0
  215. package/dist/ui/search/hooks/use-keyboard.d.ts +25 -0
  216. package/dist/ui/search/hooks/use-keyboard.d.ts.map +1 -0
  217. package/dist/ui/search/hooks/use-keyboard.js +58 -0
  218. package/dist/ui/search/hooks/use-keyboard.js.map +1 -0
  219. package/dist/ui/search/hooks/use-search.d.ts +21 -0
  220. package/dist/ui/search/hooks/use-search.d.ts.map +1 -0
  221. package/dist/ui/search/hooks/use-search.js +73 -0
  222. package/dist/ui/search/hooks/use-search.js.map +1 -0
  223. package/dist/ui/search/index.d.ts +10 -0
  224. package/dist/ui/search/index.d.ts.map +1 -0
  225. package/dist/ui/search/index.js +10 -0
  226. package/dist/ui/search/index.js.map +1 -0
  227. package/dist/ui/search/render.d.ts +11 -0
  228. package/dist/ui/search/render.d.ts.map +1 -0
  229. package/dist/ui/search/render.js +22 -0
  230. package/dist/ui/search/render.js.map +1 -0
  231. package/dist/ui/search/types.d.ts +37 -0
  232. package/dist/ui/search/types.d.ts.map +1 -0
  233. package/dist/ui/search/types.js +2 -0
  234. package/dist/ui/search/types.js.map +1 -0
  235. package/dist/ui/search/utils/index.d.ts +2 -0
  236. package/dist/ui/search/utils/index.d.ts.map +1 -0
  237. package/dist/ui/search/utils/index.js +2 -0
  238. package/dist/ui/search/utils/index.js.map +1 -0
  239. package/dist/ui/search/utils/sanitize.d.ts +11 -0
  240. package/dist/ui/search/utils/sanitize.d.ts.map +1 -0
  241. package/dist/ui/search/utils/sanitize.js +33 -0
  242. package/dist/ui/search/utils/sanitize.js.map +1 -0
  243. package/oclif.manifest.json +1772 -0
  244. package/package.json +103 -0
  245. package/theme.json +15 -0
@@ -0,0 +1,172 @@
1
+ import { updateConfig, loadConfig } from '@a1st/aix-core';
2
+ import { McpRegistryClient } from '@a1st/mcp-registry-client';
3
+ import { installAfterAdd } from './install-helper.js';
4
+ /**
5
+ * Normalize a string to a valid skill name (lowercase alphanumeric with hyphens).
6
+ */
7
+ function normalizeSkillName(name) {
8
+ return name
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9-]/g, '-')
11
+ .replace(/-+/g, '-')
12
+ .replace(/^-|-$/g, '');
13
+ }
14
+ /**
15
+ * Add a skill to ai.json programmatically.
16
+ * For npm packages, the source should be the package name (e.g., "aix-skill-typescript" or just "typescript").
17
+ */
18
+ export async function addSkill(options) {
19
+ const { configPath, source, skipInstall } = options;
20
+ try {
21
+ // Determine if it's a short name or full package name
22
+ const isFullPkgName = source.startsWith('aix-skill-') || source.startsWith('@'), packageName = isFullPkgName ? source : `aix-skill-${source}`, skillName = options.name || normalizeSkillName(source.replace(/^aix-skill-/, ''));
23
+ await updateConfig(configPath, (config) => ({
24
+ ...config,
25
+ skills: {
26
+ ...config.skills,
27
+ [skillName]: packageName,
28
+ },
29
+ }));
30
+ if (!skipInstall) {
31
+ await installAfterAdd({
32
+ configPath,
33
+ scopes: ['skills'],
34
+ });
35
+ }
36
+ return { success: true, name: skillName };
37
+ }
38
+ catch (error) {
39
+ return {
40
+ success: false,
41
+ name: options.name || source,
42
+ error: error instanceof Error ? error.message : String(error),
43
+ };
44
+ }
45
+ }
46
+ /**
47
+ * Find the first npm package with stdio transport from the packages array.
48
+ */
49
+ function findNpmPackage(packages) {
50
+ if (!packages) {
51
+ return undefined;
52
+ }
53
+ return packages.find((p) => p.registryType === 'npm' && p.transport.type === 'stdio');
54
+ }
55
+ /**
56
+ * Build an MCP server config from a registry package.
57
+ */
58
+ function buildConfigFromPackage(pkg) {
59
+ const config = {
60
+ command: `npx ${pkg.identifier}${pkg.version ? `@${pkg.version}` : ''}`,
61
+ };
62
+ if (pkg.environmentVariables && pkg.environmentVariables.length > 0) {
63
+ const env = {};
64
+ for (const envVar of pkg.environmentVariables) {
65
+ if (envVar.default) {
66
+ env[envVar.name] = envVar.default;
67
+ }
68
+ else if (envVar.isRequired) {
69
+ env[envVar.name] = envVar.isSecret ? '<YOUR_SECRET>' : '<REQUIRED>';
70
+ }
71
+ }
72
+ if (Object.keys(env).length > 0) {
73
+ config.env = env;
74
+ }
75
+ }
76
+ return config;
77
+ }
78
+ /**
79
+ * Add an MCP server to ai.json programmatically by searching the MCP Registry.
80
+ */
81
+ export async function addMcp(options) {
82
+ const { configPath, name, skipInstall } = options;
83
+ try {
84
+ const client = new McpRegistryClient(), response = await client.search(name), results = response.servers ?? [];
85
+ if (results.length === 0) {
86
+ return {
87
+ success: false,
88
+ name,
89
+ error: `No MCP servers found matching "${name}"`,
90
+ };
91
+ }
92
+ // Use the first result
93
+ const selected = results[0], pkg = findNpmPackage(selected.server.packages);
94
+ if (!pkg) {
95
+ return {
96
+ success: false,
97
+ name,
98
+ error: `Server "${selected.server.name}" has no compatible npm package with stdio transport`,
99
+ };
100
+ }
101
+ const serverConfig = buildConfigFromPackage(pkg), nameParts = selected.server.name.split('/'), friendlyName = nameParts[nameParts.length - 1] ?? selected.server.name;
102
+ await updateConfig(configPath, (config) => ({
103
+ ...config,
104
+ mcp: {
105
+ ...config.mcp,
106
+ [friendlyName]: serverConfig,
107
+ },
108
+ }));
109
+ if (!skipInstall) {
110
+ await installAfterAdd({
111
+ configPath,
112
+ scopes: ['mcp'],
113
+ });
114
+ }
115
+ return { success: true, name: friendlyName };
116
+ }
117
+ catch (error) {
118
+ return {
119
+ success: false,
120
+ name,
121
+ error: error instanceof Error ? error.message : String(error),
122
+ };
123
+ }
124
+ }
125
+ /**
126
+ * Find the config path by searching up from cwd.
127
+ */
128
+ export async function findConfigPath() {
129
+ const loaded = await loadConfig({ startDir: process.cwd() });
130
+ return loaded?.path ?? null;
131
+ }
132
+ /**
133
+ * Remove a skill from ai.json programmatically.
134
+ */
135
+ export async function removeSkill(options) {
136
+ const { configPath, name } = options;
137
+ try {
138
+ await updateConfig(configPath, (config) => {
139
+ const { [name]: _, ...remainingSkills } = config.skills ?? {};
140
+ return { ...config, skills: remainingSkills };
141
+ });
142
+ return { success: true, name };
143
+ }
144
+ catch (error) {
145
+ return {
146
+ success: false,
147
+ name,
148
+ error: error instanceof Error ? error.message : String(error),
149
+ };
150
+ }
151
+ }
152
+ /**
153
+ * Remove an MCP server from ai.json programmatically.
154
+ */
155
+ export async function removeMcp(options) {
156
+ const { configPath, name } = options;
157
+ try {
158
+ await updateConfig(configPath, (config) => {
159
+ const { [name]: _, ...remainingMcp } = config.mcp ?? {};
160
+ return { ...config, mcp: remainingMcp };
161
+ });
162
+ return { success: true, name };
163
+ }
164
+ catch (error) {
165
+ return {
166
+ success: false,
167
+ name,
168
+ error: error instanceof Error ? error.message : String(error),
169
+ };
170
+ }
171
+ }
172
+ //# sourceMappingURL=add-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-helper.js","sourceRoot":"","sources":["../../src/lib/add-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type EditorName } from '@a1st/aix-core';
2
+ export type RemovableItemType = 'skill' | 'mcp';
3
+ export interface FilesToDelete {
4
+ editor: EditorName;
5
+ files: string[];
6
+ }
7
+ export interface DeleteResult {
8
+ editor: EditorName;
9
+ deleted: string[];
10
+ alreadyMissing: string[];
11
+ errors: string[];
12
+ }
13
+ /**
14
+ * Compute files that would be deleted for a given item removal.
15
+ */
16
+ export declare function computeFilesToDelete(editors: EditorName[], itemType: RemovableItemType, itemName: string, projectRoot: string): FilesToDelete[];
17
+ /**
18
+ * Delete files, handling missing files gracefully.
19
+ */
20
+ export declare function deleteFiles(filesToDelete: FilesToDelete[]): Promise<DeleteResult[]>;
21
+ /**
22
+ * Get all files that exist from the computed list.
23
+ */
24
+ export declare function getExistingFiles(filesToDelete: FilesToDelete[]): string[];
25
+ //# sourceMappingURL=delete-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-helper.d.ts","sourceRoot":"","sources":["../../src/lib/delete-helper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACjC,OAAO,EAAE,UAAU,EAAE,EACrB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GACnB,aAAa,EAAE,CA6BjB;AAuBD;;GAEG;AACH,wBAAsB,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAezF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAWzE"}
@@ -0,0 +1,76 @@
1
+ import pMap from 'p-map';
2
+ import { existsSync } from 'node:fs';
3
+ import { join } from 'pathe';
4
+ import { getAdapter, safeRm } from '@a1st/aix-core';
5
+ /**
6
+ * Compute files that would be deleted for a given item removal.
7
+ */
8
+ export function computeFilesToDelete(editors, itemType, itemName, projectRoot) {
9
+ const results = [];
10
+ for (const editor of editors) {
11
+ const adapter = getAdapter(editor), configDir = join(projectRoot, adapter.configDir), files = [];
12
+ if (itemType === 'skill') {
13
+ // Skills are installed to .aix/skills/{name}/ (shared across editors)
14
+ // Plus any pointer rules in the editor's rules directory
15
+ const skillDir = join(projectRoot, '.aix', 'skills', itemName);
16
+ files.push(skillDir);
17
+ // Pointer rule file (if editor uses pointer strategy)
18
+ // Format: {configDir}/rules/skill-{name}.md
19
+ const pointerRule = join(configDir, 'rules', `skill-${itemName}.md`);
20
+ files.push(pointerRule);
21
+ }
22
+ // Note: MCP removal doesn't delete individual files - it re-installs to regenerate config
23
+ if (files.length > 0) {
24
+ results.push({ editor, files });
25
+ }
26
+ }
27
+ return results;
28
+ }
29
+ /**
30
+ * Delete a single file, handling missing files gracefully.
31
+ */
32
+ async function deleteFile(file) {
33
+ try {
34
+ if (existsSync(file)) {
35
+ await safeRm(file, { force: true });
36
+ return { file, status: 'deleted' };
37
+ }
38
+ return { file, status: 'missing' };
39
+ }
40
+ catch (error) {
41
+ return {
42
+ file,
43
+ status: 'error',
44
+ error: error instanceof Error ? error.message : String(error),
45
+ };
46
+ }
47
+ }
48
+ /**
49
+ * Delete files, handling missing files gracefully.
50
+ */
51
+ export async function deleteFiles(filesToDelete) {
52
+ return pMap(filesToDelete, async ({ editor, files }) => {
53
+ const outcomes = await pMap(files, deleteFile, { concurrency: 5 });
54
+ return {
55
+ editor,
56
+ deleted: outcomes.filter((o) => o.status === 'deleted').map((o) => o.file),
57
+ alreadyMissing: outcomes.filter((o) => o.status === 'missing').map((o) => o.file),
58
+ errors: outcomes.filter((o) => o.status === 'error').map((o) => `${o.file}: ${o.error}`),
59
+ };
60
+ }, { concurrency: 3 });
61
+ }
62
+ /**
63
+ * Get all files that exist from the computed list.
64
+ */
65
+ export function getExistingFiles(filesToDelete) {
66
+ const existing = [];
67
+ for (const { files } of filesToDelete) {
68
+ for (const file of files) {
69
+ if (existsSync(file)) {
70
+ existing.push(file);
71
+ }
72
+ }
73
+ }
74
+ return existing;
75
+ }
76
+ //# sourceMappingURL=delete-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-helper.js","sourceRoot":"","sources":["../../src/lib/delete-helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { CLIError } from '@oclif/core/errors';
2
+ /**
3
+ * CLI-specific error for when a config file is not found. Wraps the core ConfigNotFoundError with
4
+ * CLI-friendly messaging and exit codes.
5
+ */
6
+ export declare class ConfigNotFoundError extends CLIError {
7
+ constructor(searchPath?: string);
8
+ }
9
+ /**
10
+ * CLI-specific error for config validation failures.
11
+ */
12
+ export declare class ConfigValidationError extends CLIError {
13
+ constructor(errors: Array<{
14
+ path: string;
15
+ message: string;
16
+ }>);
17
+ }
18
+ /**
19
+ * CLI-specific error for when a skill is not found.
20
+ */
21
+ export declare class SkillNotFoundError extends CLIError {
22
+ constructor(skillName: string);
23
+ }
24
+ /**
25
+ * CLI-specific error for MCP server issues.
26
+ */
27
+ export declare class McpServerError extends CLIError {
28
+ constructor(serverName: string, reason: string);
29
+ }
30
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;gBAClC,UAAU,CAAC,EAAE,MAAM;CAQjC;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,QAAQ;gBACpC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAQ9D;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,QAAQ;gBACjC,SAAS,EAAE,MAAM;CAG/B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;gBAC7B,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAGhD"}
@@ -0,0 +1,41 @@
1
+ import { CLIError } from '@oclif/core/errors';
2
+ /**
3
+ * CLI-specific error for when a config file is not found. Wraps the core ConfigNotFoundError with
4
+ * CLI-friendly messaging and exit codes.
5
+ */
6
+ export class ConfigNotFoundError extends CLIError {
7
+ constructor(searchPath) {
8
+ super(searchPath
9
+ ? `Config file not found at: ${searchPath}`
10
+ : 'No ai.json found in current directory or parents', { exit: 1 });
11
+ }
12
+ }
13
+ /**
14
+ * CLI-specific error for config validation failures.
15
+ */
16
+ export class ConfigValidationError extends CLIError {
17
+ constructor(errors) {
18
+ const message = [
19
+ 'Invalid ai.json configuration:',
20
+ ...errors.map((e) => ` - ${e.path}: ${e.message}`),
21
+ ].join('\n');
22
+ super(message, { exit: 1 });
23
+ }
24
+ }
25
+ /**
26
+ * CLI-specific error for when a skill is not found.
27
+ */
28
+ export class SkillNotFoundError extends CLIError {
29
+ constructor(skillName) {
30
+ super(`Skill not found: ${skillName}`, { exit: 1 });
31
+ }
32
+ }
33
+ /**
34
+ * CLI-specific error for MCP server issues.
35
+ */
36
+ export class McpServerError extends CLIError {
37
+ constructor(serverName, reason) {
38
+ super(`MCP server "${serverName}" error: ${reason}`, { exit: 1 });
39
+ }
40
+ }
41
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,QAAQ;IAC9C,YAAY,UAAmB;QAC5B,KAAK,CACF,UAAU;YACP,CAAC,CAAC,6BAA6B,UAAU,EAAE;YAC3C,CAAC,CAAC,kDAAkD,EACvD,EAAE,IAAI,EAAE,CAAC,EAAE,CACb,CAAC;IACL,CAAC;CACH;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,QAAQ;IAChD,YAAY,MAAgD;QACzD,MAAM,OAAO,GAAG;YACb,gCAAgC;YAChC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC7C,YAAY,SAAiB;QAC1B,KAAK,CAAC,oBAAoB,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACH;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,QAAQ;IACzC,YAAY,UAAkB,EAAE,MAAc;QAC3C,KAAK,CAAC,eAAe,UAAU,YAAY,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;CACH"}
@@ -0,0 +1,7 @@
1
+ import { Command, Help, Interfaces } from '@oclif/core';
2
+ export default class CustomHelp extends Help {
3
+ protected formatTopics(topics: Interfaces.Topic[]): string;
4
+ protected formatRoot(): string;
5
+ protected formatCommands(commands: Command.Loadable[]): string;
6
+ }
7
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/lib/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,IAAI;IACzC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,MAAM;IAgB1D,SAAS,CAAC,UAAU,IAAI,MAAM;IAM9B,SAAS,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,MAAM;CA4BhE"}
@@ -0,0 +1,39 @@
1
+ import { Help } from '@oclif/core';
2
+ export default class CustomHelp extends Help {
3
+ formatTopics(topics) {
4
+ if (topics.length === 0) {
5
+ return '';
6
+ }
7
+ const body = this.renderList(topics.map((c) => {
8
+ const name = this.config.topicSeparator !== ':' ? c.name.replaceAll(':', this.config.topicSeparator) : c.name;
9
+ return [name, c.description ? `${c.description.split('\n')[0]}` : ''];
10
+ }), { indentation: 2, spacer: '\n', stripAnsi: this.opts.stripAnsi });
11
+ return this.section('TOPIC GROUPS (use "aix <topic>" for subcommands)', body);
12
+ }
13
+ formatRoot() {
14
+ return `aix - Unified AI agent and editor configuration
15
+
16
+ ${super.formatRoot()}`;
17
+ }
18
+ formatCommands(commands) {
19
+ // Build a map of command ID to its aliases
20
+ const aliasMap = new Map();
21
+ for (const cmd of commands) {
22
+ if (cmd.aliases && cmd.aliases.length > 0) {
23
+ aliasMap.set(cmd.id, cmd.aliases);
24
+ }
25
+ }
26
+ // Filter out commands that are aliases of other commands
27
+ const aliasIds = new Set(commands.flatMap((cmd) => cmd.aliases ?? []));
28
+ const filteredCommands = commands.filter((cmd) => !aliasIds.has(cmd.id));
29
+ // Format each command with its aliases inline
30
+ const body = this.renderList(filteredCommands.map((cmd) => {
31
+ const aliases = aliasMap.get(cmd.id);
32
+ const aliasText = aliases && aliases.length > 0 ? ` (alias: ${aliases.join(', ')})` : '';
33
+ const summary = this.summary(cmd);
34
+ return [cmd.id, summary ? `${summary}${aliasText}` : aliasText];
35
+ }), { indentation: 2, spacer: '\n', stripAnsi: this.opts.stripAnsi });
36
+ return this.section('COMMANDS', body);
37
+ }
38
+ }
39
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/lib/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type EditorName, type ApplyResult, type ConfigScope } from '@a1st/aix-core';
2
+ export interface InstallAfterAddOptions {
3
+ configPath: string;
4
+ scopes: ConfigScope[];
5
+ quiet?: boolean;
6
+ }
7
+ export interface InstallAfterAddResult {
8
+ installed: boolean;
9
+ results: ApplyResult[];
10
+ editors: EditorName[];
11
+ }
12
+ /** Format install results for display */
13
+ export declare function formatInstallResults(results: ApplyResult[]): Array<{
14
+ editor: string;
15
+ message: string;
16
+ success: boolean;
17
+ }>;
18
+ /**
19
+ * Install to configured editors after an add operation. Only installs if editors are configured in
20
+ * ai.json. Returns info about what was installed.
21
+ */
22
+ export declare function installAfterAdd(options: InstallAfterAddOptions): Promise<InstallAfterAddResult>;
23
+ //# sourceMappingURL=install-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-helper.d.ts","sourceRoot":"","sources":["../../src/lib/install-helper.ts"],"names":[],"mappings":"AAEA,OAAO,EAGJ,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAClB,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,sBAAsB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,yCAAyC;AACzC,wBAAgB,oBAAoB,CACjC,OAAO,EAAE,WAAW,EAAE,GACtB,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuB9D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA4BrG"}
@@ -0,0 +1,49 @@
1
+ import { dirname } from 'pathe';
2
+ import pMap from 'p-map';
3
+ import { installToEditor, loadConfig, } from '@a1st/aix-core';
4
+ import { normalizeEditors } from '@a1st/aix-schema';
5
+ /** Format install results for display */
6
+ export function formatInstallResults(results) {
7
+ const output = [];
8
+ for (const result of results) {
9
+ if (result.success) {
10
+ const actualChanges = result.changes.filter((c) => c.action !== 'unchanged');
11
+ if (actualChanges.length > 0) {
12
+ output.push({
13
+ editor: result.editor,
14
+ message: `Installed to ${result.editor}`,
15
+ success: true,
16
+ });
17
+ }
18
+ }
19
+ else {
20
+ output.push({
21
+ editor: result.editor,
22
+ message: `Failed to install to ${result.editor}: ${result.errors.join(', ')}`,
23
+ success: false,
24
+ });
25
+ }
26
+ }
27
+ return output;
28
+ }
29
+ /**
30
+ * Install to configured editors after an add operation. Only installs if editors are configured in
31
+ * ai.json. Returns info about what was installed.
32
+ */
33
+ export async function installAfterAdd(options) {
34
+ const loaded = await loadConfig(options.configPath);
35
+ if (!loaded) {
36
+ return { installed: false, results: [], editors: [] };
37
+ }
38
+ const configuredEditors = loaded.config.editors;
39
+ if (!configuredEditors) {
40
+ return { installed: false, results: [], editors: [] };
41
+ }
42
+ const normalizedEditors = normalizeEditors(configuredEditors), editors = Object.keys(normalizedEditors);
43
+ if (editors.length === 0) {
44
+ return { installed: false, results: [], editors: [] };
45
+ }
46
+ const projectRoot = dirname(options.configPath), results = await pMap(editors, (editor) => installToEditor(editor, loaded.config, projectRoot, { scopes: options.scopes }), { concurrency: 2 });
47
+ return { installed: true, results, editors };
48
+ }
49
+ //# sourceMappingURL=install-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-helper.js","sourceRoot":"","sources":["../../src/lib/install-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,IAAI,MAAM,OAAO,CAAC;AACzB,OAAO,EACJ,eAAe,EACf,UAAU,GAIZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAcpD,yCAAyC;AACzC,MAAM,UAAU,oBAAoB,CACjC,OAAsB;IAEtB,MAAM,MAAM,GAAiE,EAAE,CAAC;IAEhF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;YAE7E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,EAAE;oBACxC,OAAO,EAAE,IAAI;iBACf,CAAC,CAAC;YACN,CAAC;QACJ,CAAC;aAAM,CAAC;YACL,MAAM,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,OAAO,EAAE,wBAAwB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC7E,OAAO,EAAE,KAAK;aAChB,CAAC,CAAC;QACN,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA+B;IAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;IAEhD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,EACvD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAiB,CAAC;IAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EACzC,OAAO,GAAG,MAAM,IAAI,CACjB,OAAO,EACP,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAC3F,EAAE,WAAW,EAAE,CAAC,EAAE,CACpB,CAAC;IAER,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type TableOptions } from '@oclif/table';
2
+ export interface OutputOptions {
3
+ quiet: boolean;
4
+ json: boolean;
5
+ }
6
+ export declare class Output {
7
+ private quiet;
8
+ private jsonMode;
9
+ private spinner?;
10
+ constructor(options: OutputOptions);
11
+ log(message: string): void;
12
+ success(message: string): void;
13
+ warn(message: string): void;
14
+ error(message: string): void;
15
+ info(message: string): void;
16
+ startSpinner(message: string): void;
17
+ stopSpinner(success?: boolean, message?: string): void;
18
+ json(data: unknown): void;
19
+ table<T extends Record<string, unknown>>(data: T[], options: Omit<TableOptions<T>, 'data'>): void;
20
+ header(text: string): void;
21
+ dim(text: string): string;
22
+ cyan(text: string): string;
23
+ green(text: string): string;
24
+ red(text: string): string;
25
+ }
26
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,MAAM;IAChB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAM;gBAEV,OAAO,EAAE,aAAa;IAKlC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM1B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnC,WAAW,CAAC,OAAO,UAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAWnD,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAMzB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI;IAMjG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAG3B"}
@@ -0,0 +1,77 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { printTable } from '@oclif/table';
4
+ export class Output {
5
+ quiet;
6
+ jsonMode;
7
+ spinner;
8
+ constructor(options) {
9
+ this.quiet = options.quiet;
10
+ this.jsonMode = options.json;
11
+ }
12
+ log(message) {
13
+ if (!this.quiet && !this.jsonMode) {
14
+ console.log(message);
15
+ }
16
+ }
17
+ success(message) {
18
+ this.log(chalk.green('✓') + ' ' + message);
19
+ }
20
+ warn(message) {
21
+ if (!this.jsonMode) {
22
+ console.warn(chalk.yellow('⚠') + ' ' + message);
23
+ }
24
+ }
25
+ error(message) {
26
+ if (!this.jsonMode) {
27
+ console.error(chalk.red('✗') + ' ' + message);
28
+ }
29
+ }
30
+ info(message) {
31
+ this.log(chalk.blue('ℹ') + ' ' + message);
32
+ }
33
+ startSpinner(message) {
34
+ if (!this.quiet && !this.jsonMode) {
35
+ this.spinner = ora(message).start();
36
+ }
37
+ }
38
+ stopSpinner(success = true, message) {
39
+ if (this.spinner) {
40
+ if (success) {
41
+ this.spinner.succeed(message);
42
+ }
43
+ else {
44
+ this.spinner.fail(message);
45
+ }
46
+ this.spinner = undefined;
47
+ }
48
+ }
49
+ json(data) {
50
+ if (this.jsonMode) {
51
+ console.log(JSON.stringify(data, null, 2));
52
+ }
53
+ }
54
+ table(data, options) {
55
+ if (!this.quiet && !this.jsonMode && data.length > 0) {
56
+ printTable({ ...options, data });
57
+ }
58
+ }
59
+ header(text) {
60
+ if (!this.quiet && !this.jsonMode) {
61
+ console.log(chalk.bold.cyan(`\n${text}`));
62
+ }
63
+ }
64
+ dim(text) {
65
+ return chalk.dim(text);
66
+ }
67
+ cyan(text) {
68
+ return chalk.cyan(text);
69
+ }
70
+ green(text) {
71
+ return chalk.green(text);
72
+ }
73
+ red(text) {
74
+ return chalk.red(text);
75
+ }
76
+ }
77
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Simple debounce utility for search API calls.
3
+ * Ensures we don't hammer APIs with rapid successive requests.
4
+ */
5
+ /**
6
+ * Ensures a minimum delay between calls to the same source.
7
+ * If called too quickly, waits until the debounce period has passed.
8
+ *
9
+ * @param sourceId - Unique identifier for the source being called
10
+ * @returns Promise that resolves when it's safe to make the call
11
+ */
12
+ export declare function debounce(sourceId: string): Promise<void>;
13
+ /**
14
+ * Clear debounce state (useful for testing).
15
+ */
16
+ export declare function clearDebounceState(): void;
17
+ //# sourceMappingURL=debounce.d.ts.map