@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,412 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import { Args, Flags } from '@oclif/core';
4
+ import { dirname, join } from 'pathe';
5
+ import { select, confirm } from '@inquirer/prompts';
6
+ import { parseConfig, normalizeEditors } from '@a1st/aix-schema';
7
+ import { BaseCommand } from '../base-command.js';
8
+ import { ConfigParseError } from '@a1st/aix-core';
9
+ import { scopeFlag, parseScopes } from '../flags/scope.js';
10
+ import { installToEditor, getAvailableEditors, detectEditors, updateConfig, loadConfig, createBackup, mergeConfigs, filterConfigByScopes, cleanStaleCache, } from '@a1st/aix-core';
11
+ const VALID_EDITORS = getAvailableEditors();
12
+ export default class Install extends BaseCommand {
13
+ static aliases = ['i'];
14
+ static description = 'Install configuration to editors';
15
+ static examples = [
16
+ '<%= config.bin %> <%= command.id %>',
17
+ '<%= config.bin %> <%= command.id %> https://github.com/org/repo/blob/main/ai.json',
18
+ '<%= config.bin %> <%= command.id %> github:org/shared-config',
19
+ '<%= config.bin %> <%= command.id %> ./configs/team-config.json',
20
+ '<%= config.bin %> <%= command.id %> --target windsurf',
21
+ '<%= config.bin %> <%= command.id %> -t cursor -t windsurf',
22
+ '<%= config.bin %> <%= command.id %> --dry-run',
23
+ '<%= config.bin %> <%= command.id %> --scope mcp',
24
+ '<%= config.bin %> <%= command.id %> github:org/shared-config --save',
25
+ '<%= config.bin %> <%= command.id %> github:org/shared-config --save --overwrite',
26
+ '<%= config.bin %> <%= command.id %> github:org/shared-config --save --scope mcp --scope rules',
27
+ ];
28
+ static args = {
29
+ source: Args.string({
30
+ description: 'Config source: URL, git shorthand (github:org/repo), or local path. If omitted, uses local ai.json.',
31
+ required: false,
32
+ }),
33
+ };
34
+ static flags = {
35
+ ...scopeFlag,
36
+ target: Flags.string({
37
+ char: 't',
38
+ description: 'Target specific editor (repeatable, case-insensitive)',
39
+ multiple: true,
40
+ options: getAvailableEditors(),
41
+ }),
42
+ 'dry-run': Flags.boolean({
43
+ char: 'd',
44
+ description: 'Preview changes without applying',
45
+ default: false,
46
+ }),
47
+ save: Flags.boolean({
48
+ description: 'Save remote config to local ai.json (creates or merges)',
49
+ default: false,
50
+ }),
51
+ overwrite: Flags.boolean({
52
+ description: 'Overwrite existing local ai.json instead of merging (only with --save)',
53
+ default: false,
54
+ }),
55
+ clean: Flags.boolean({
56
+ description: 'Remove .aix folder before installing to ensure exact match with ai.json',
57
+ default: false,
58
+ }),
59
+ };
60
+ async run() {
61
+ const { args } = await this.parse(Install);
62
+ // Load config from source argument or fall back to local discovery
63
+ let loaded;
64
+ if (args.source) {
65
+ const result = await loadConfig({ remoteSource: args.source });
66
+ if (!result) {
67
+ this.error(`Could not load config from: ${args.source}`);
68
+ }
69
+ loaded = result;
70
+ }
71
+ else {
72
+ loaded = await this.requireConfig();
73
+ }
74
+ const scopes = parseScopes(this.flags), projectRoot = args.source ? process.cwd() : dirname(loaded.path), isSaveMode = this.flags.save, isDryRun = this.flags['dry-run'];
75
+ // Handle --save flag: save remote config to local ai.json
76
+ if (isSaveMode) {
77
+ if (!args.source) {
78
+ this.error('--save requires a remote source argument (URL, git shorthand, or path)');
79
+ }
80
+ await this.saveRemoteConfig(loaded.config, scopes, this.flags.overwrite, isDryRun);
81
+ // If only saving (no editor installation needed), we're done
82
+ if (!this.flags.target && !loaded.config.editors) {
83
+ return;
84
+ }
85
+ }
86
+ // Resolve which editors to install to
87
+ const resolved = await this.resolveEditors(loaded.config, projectRoot);
88
+ if (!resolved) {
89
+ return;
90
+ }
91
+ const { editors, shouldPromptToSave } = resolved;
92
+ // Install to editors sequentially to avoid overwhelming the system with concurrent file I/O
93
+ // and to provide clear sequential output to the user
94
+ const results = [];
95
+ for (const editor of editors) {
96
+ // eslint-disable-next-line no-await-in-loop -- Sequential for user feedback and file safety
97
+ const result = await this.installToSingleEditor(editor, loaded.config, projectRoot, {
98
+ isDryRun,
99
+ scopes,
100
+ clean: this.flags.clean,
101
+ });
102
+ results.push(result);
103
+ }
104
+ // After successful installation, clean stale cache entries
105
+ const allSucceeded = results.every((r) => r.success);
106
+ if (allSucceeded && !isDryRun) {
107
+ const cleanup = await cleanStaleCache(projectRoot, {
108
+ maxCacheAgeDays: loaded.config.aix?.cache?.maxCacheAgeDays ?? 7,
109
+ maxBackupAgeDays: loaded.config.aix?.cache?.maxBackupAgeDays ?? 30,
110
+ });
111
+ if (cleanup.deletedPaths.length > 0 && !this.flags.quiet) {
112
+ this.output.info(`Cleaned ${cleanup.deletedPaths.length} stale cache entries`);
113
+ }
114
+ }
115
+ // After successful installation, prompt to save editor to ai.json
116
+ if (shouldPromptToSave && allSucceeded && !isDryRun && editors.length === 1) {
117
+ const editor = editors[0], saveToConfig = await confirm({
118
+ message: `Save "${editor}" as the default editor in ai.json?`,
119
+ default: true,
120
+ });
121
+ if (saveToConfig) {
122
+ await updateConfig(loaded.path, (config) => ({
123
+ ...config,
124
+ editors: {
125
+ ...config.editors,
126
+ [editor]: { enabled: true },
127
+ },
128
+ }));
129
+ this.output.success(`Added "${editor}" to ai.json. Future installs will target this editor.`);
130
+ }
131
+ }
132
+ if (this.flags.json) {
133
+ this.output.json({
134
+ dryRun: isDryRun,
135
+ scopes,
136
+ results,
137
+ });
138
+ }
139
+ }
140
+ /**
141
+ * Resolve which editors to install to based on flags, config, and detection.
142
+ */
143
+ async resolveEditors(config, projectRoot) {
144
+ let editors = [];
145
+ let shouldPromptToSave = false;
146
+ if (this.flags.target && this.flags.target.length > 0) {
147
+ editors = this.flags.target.map((e) => e.toLowerCase());
148
+ for (const editor of editors) {
149
+ if (!VALID_EDITORS.includes(editor)) {
150
+ this.error(`Unknown editor: ${editor}. Valid options: ${VALID_EDITORS.join(', ')}`);
151
+ }
152
+ }
153
+ }
154
+ else {
155
+ const configEditors = config.editors;
156
+ if (configEditors) {
157
+ const normalized = normalizeEditors(configEditors);
158
+ editors = Object.keys(normalized);
159
+ }
160
+ if (editors.length === 0) {
161
+ const detected = await detectEditors(projectRoot);
162
+ if (detected.length === 0) {
163
+ this.output.warn('No editors detected. Use --target to specify an editor.');
164
+ return null;
165
+ }
166
+ if (detected.length === 1) {
167
+ editors = detected;
168
+ this.output.info(`Detected editor: ${detected[0]}`);
169
+ shouldPromptToSave = true;
170
+ }
171
+ else {
172
+ const selectedEditor = await select({
173
+ message: 'Multiple editors detected. Which one should aix install to?',
174
+ choices: detected.map((e) => ({ name: e, value: e })),
175
+ });
176
+ editors = [selectedEditor];
177
+ shouldPromptToSave = true;
178
+ }
179
+ }
180
+ }
181
+ if (editors.length === 0) {
182
+ this.output.warn('No editors found. Use --target to specify an editor.');
183
+ return null;
184
+ }
185
+ return { editors, shouldPromptToSave };
186
+ }
187
+ /**
188
+ * Install to a single editor and handle output.
189
+ */
190
+ async installToSingleEditor(editor, config, projectRoot, options) {
191
+ const { isDryRun, scopes, clean } = options;
192
+ this.output.startSpinner(isDryRun ? `Analyzing ${editor}...` : `Installing to ${editor}...`);
193
+ try {
194
+ const result = await installToEditor(editor, config, projectRoot, {
195
+ dryRun: isDryRun,
196
+ scopes,
197
+ overwrite: this.flags.overwrite,
198
+ clean,
199
+ });
200
+ this.handleInstallResult(editor, result, projectRoot, isDryRun);
201
+ return result;
202
+ }
203
+ catch (error) {
204
+ this.output.stopSpinner(false, `Failed to install to ${editor}`);
205
+ const message = error instanceof Error ? error.message : String(error);
206
+ this.output.error(message);
207
+ return { editor, success: false, changes: [], errors: [message] };
208
+ }
209
+ }
210
+ /**
211
+ * Handle the result of installing to an editor.
212
+ */
213
+ handleInstallResult(editor, result, projectRoot, isDryRun) {
214
+ if (isDryRun) {
215
+ this.output.stopSpinner(true, `Changes for ${editor}:`);
216
+ if (result.changes.length === 0) {
217
+ this.output.info('No changes needed (no rules or MCP servers configured)');
218
+ }
219
+ else {
220
+ this.displayChanges(result.changes, projectRoot, true);
221
+ }
222
+ this.showUnsupportedFeatureWarnings(editor, result.unsupportedFeatures);
223
+ return;
224
+ }
225
+ if (!result.success) {
226
+ this.output.stopSpinner(false, `Failed to install to ${editor}`);
227
+ for (const err of result.errors) {
228
+ this.output.error(err);
229
+ }
230
+ return;
231
+ }
232
+ if (result.changes.length === 0) {
233
+ this.output.stopSpinner(true, `Nothing to install for ${editor} (no rules or MCP servers configured)`);
234
+ return;
235
+ }
236
+ this.output.stopSpinner(true, `Installed to ${editor}`);
237
+ if (!this.flags.quiet) {
238
+ this.displayChanges(result.changes, projectRoot);
239
+ }
240
+ // Show Codex-specific usage instructions when MCP flags were generated
241
+ if (editor === 'codex') {
242
+ const hasCodexFlags = result.changes.some((c) => c.action !== 'unchanged' && c.path.endsWith('codex-flags'));
243
+ if (hasCodexFlags) {
244
+ this.output.info('MCP servers configured via CLI flags.');
245
+ this.output.info('Usage: .aix/codex [prompt]');
246
+ }
247
+ }
248
+ this.showUnsupportedFeatureWarnings(editor, result.unsupportedFeatures);
249
+ }
250
+ /**
251
+ * Save remote config to local ai.json (creates, merges, or overwrites).
252
+ */
253
+ async saveRemoteConfig(remoteConfig, scopes, overwrite, dryRun) {
254
+ const localPath = join(process.cwd(), 'ai.json'), localExists = existsSync(localPath);
255
+ // Filter remote config by scopes
256
+ const filteredRemote = filterConfigByScopes(remoteConfig, scopes);
257
+ let finalConfig;
258
+ let action;
259
+ if (!localExists) {
260
+ // No local file - create new one with filtered remote config
261
+ finalConfig = { ...filteredRemote };
262
+ action = 'created';
263
+ }
264
+ else if (overwrite) {
265
+ // Overwrite mode - replace local with filtered remote
266
+ finalConfig = { ...filteredRemote };
267
+ action = 'overwrote';
268
+ }
269
+ else {
270
+ // Merge mode - load local and merge remote into it
271
+ const localLoaded = await loadConfig(localPath);
272
+ if (!localLoaded) {
273
+ this.error(`Could not load local config from: ${localPath}`);
274
+ }
275
+ finalConfig = mergeConfigs(localLoaded.config, filteredRemote);
276
+ action = 'merged';
277
+ }
278
+ // Validate the final config
279
+ try {
280
+ parseConfig(finalConfig);
281
+ }
282
+ catch (error) {
283
+ if (error instanceof Error && 'issues' in error) {
284
+ const zodError = error;
285
+ const parseError = new ConfigParseError(`${action === 'merged' ? 'Merged' : 'Resulting'} configuration is invalid`, localPath, zodError.issues.map((issue) => ({
286
+ path: issue.path.join('.'),
287
+ message: issue.message,
288
+ })));
289
+ this.displayConfigParseError(parseError);
290
+ this.log(`\nThe ${action === 'merged' ? 'merge' : 'save'} was aborted. Your local ai.json was not modified.`);
291
+ this.exit(1);
292
+ }
293
+ throw error;
294
+ }
295
+ if (dryRun) {
296
+ this.output.info(`Would ${action === 'created' ? 'create' : action} ./ai.json`);
297
+ if (action === 'merged') {
298
+ this.output.info(' Sections merged: ' + scopes.join(', '));
299
+ }
300
+ return;
301
+ }
302
+ // Create backup before modifying existing file
303
+ if (localExists) {
304
+ await createBackup(localPath);
305
+ }
306
+ // Write the final config
307
+ await writeFile(localPath, JSON.stringify(finalConfig, null, 2) + '\n', 'utf-8');
308
+ const actionVerb = action === 'created' ? 'Created' : action === 'merged' ? 'Merged into' : 'Overwrote';
309
+ this.output.success(`${actionVerb} ./ai.json`);
310
+ if (action === 'merged') {
311
+ this.output.info(' Sections merged: ' + scopes.join(', '));
312
+ }
313
+ }
314
+ /**
315
+ * Display warnings for features that the editor doesn't support.
316
+ */
317
+ showUnsupportedFeatureWarnings(editor, unsupported) {
318
+ if (!unsupported || this.flags.quiet) {
319
+ return;
320
+ }
321
+ if (unsupported.mcp) {
322
+ this.output.warn(`${editor} does not support MCP. Skipped servers: ${unsupported.mcp.servers.join(', ')}`);
323
+ }
324
+ if (unsupported.hooks) {
325
+ if (unsupported.hooks.allUnsupported) {
326
+ this.output.warn(`${editor} does not support hooks. All hooks skipped.`);
327
+ }
328
+ else if (unsupported.hooks.unsupportedEvents?.length) {
329
+ this.output.warn(`${editor} does not support these hook events: ${unsupported.hooks.unsupportedEvents.join(', ')}`);
330
+ }
331
+ }
332
+ if (unsupported.prompts) {
333
+ this.output.warn(`${editor} does not support prompts. Skipped: ${unsupported.prompts.prompts.join(', ')}`);
334
+ }
335
+ }
336
+ /**
337
+ * Display changes grouped by category with better visual hierarchy.
338
+ */
339
+ displayChanges(changes, _projectRoot, showAction = false) {
340
+ // Group changes by category
341
+ const byCategory = new Map();
342
+ for (const change of changes) {
343
+ const category = change.category ?? 'other';
344
+ const list = byCategory.get(category) ?? [];
345
+ list.push(change);
346
+ byCategory.set(category, list);
347
+ }
348
+ // Display order and labels
349
+ const categoryOrder = [
350
+ { key: 'skill', label: 'Skills' },
351
+ { key: 'rule', label: 'Rules' },
352
+ { key: 'workflow', label: 'Workflows' },
353
+ { key: 'mcp', label: 'MCP' },
354
+ { key: 'hook', label: 'Hooks' },
355
+ { key: 'other', label: 'Other' },
356
+ ];
357
+ for (const { key, label } of categoryOrder) {
358
+ const categoryChanges = byCategory.get(key);
359
+ if (!categoryChanges || categoryChanges.length === 0) {
360
+ continue;
361
+ }
362
+ this.output.log('');
363
+ this.output.log(this.output.cyan(` ${label}`));
364
+ // For skills, deduplicate by name (each skill has both .aix and editor symlink changes)
365
+ const seenNames = new Set();
366
+ for (const change of categoryChanges) {
367
+ const name = key === 'skill' ? this.extractSkillName(change.path) : this.extractFileName(change.path);
368
+ // Skip duplicate skill names
369
+ if (key === 'skill') {
370
+ if (seenNames.has(name)) {
371
+ continue;
372
+ }
373
+ seenNames.add(name);
374
+ }
375
+ const prefix = this.getChangePrefix(change.action), action = showAction ? ` ${this.output.dim(`(${change.action})`)}` : '';
376
+ this.output.log(` ${prefix} ${name}${action}`);
377
+ }
378
+ }
379
+ this.output.log('');
380
+ }
381
+ /**
382
+ * Get the display prefix for a change action.
383
+ */
384
+ getChangePrefix(action) {
385
+ switch (action) {
386
+ case 'create':
387
+ return this.output.green('✓');
388
+ case 'update':
389
+ return this.output.green('✓');
390
+ case 'unchanged':
391
+ return this.output.green('✓');
392
+ case 'delete':
393
+ return this.output.red('-');
394
+ }
395
+ }
396
+ /**
397
+ * Extract skill name from path like .aix/skills/pdf or .windsurf/skills/pdf -> pdf
398
+ */
399
+ extractSkillName(path) {
400
+ // Match both .aix/skills/{name} and editor skills dirs like .windsurf/skills/{name}
401
+ const match = path.match(/(?:\.aix|\.windsurf|\.cursor|\.claude|\.vscode)\/skills\/([^/]+)/);
402
+ return match?.[1] ?? this.extractFileName(path);
403
+ }
404
+ /**
405
+ * Extract filename from path
406
+ */
407
+ extractFileName(path) {
408
+ const parts = path.split('/'), last = parts[parts.length - 1];
409
+ return last !== undefined ? last : path;
410
+ }
411
+ }
412
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class ListEditors extends BaseCommand<typeof ListEditors> {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=editors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editors.d.ts","sourceRoot":"","sources":["../../../src/commands/list/editors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW,CAAC,OAAO,WAAW,CAAC;IACrE,OAAgB,WAAW,SAA6B;IAExD,OAAgB,QAAQ,WAGtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgC5B"}
@@ -0,0 +1,36 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class ListEditors extends BaseCommand {
3
+ static description = 'List configured editors';
4
+ static examples = [
5
+ '<%= config.bin %> <%= command.id %>',
6
+ '<%= config.bin %> <%= command.id %> --json',
7
+ ];
8
+ async run() {
9
+ const loaded = await this.requireConfig();
10
+ const editors = loaded.config.editors ?? {};
11
+ if (this.flags.json) {
12
+ this.output.json({ editors });
13
+ return;
14
+ }
15
+ const entries = Object.entries(editors);
16
+ if (entries.length === 0) {
17
+ this.output.info('No editor-specific configuration');
18
+ return;
19
+ }
20
+ const rows = entries.map(([name, config]) => ({
21
+ name,
22
+ status: config.enabled === false ? 'disabled' : 'enabled',
23
+ rules: config.rules?.length ? `${config.rules.length} rule(s)` : '-',
24
+ }));
25
+ this.output.header('Editors');
26
+ this.output.table(rows, {
27
+ columns: [
28
+ { key: 'name', name: 'Name' },
29
+ { key: 'status', name: 'Status' },
30
+ { key: 'rules', name: 'Rules' },
31
+ ],
32
+ overflow: 'wrap',
33
+ });
34
+ }
35
+ }
36
+ //# sourceMappingURL=editors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editors.js","sourceRoot":"","sources":["../../../src/commands/list/editors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAA+B;IACrE,MAAM,CAAU,WAAW,GAAG,yBAAyB,CAAC;IAExD,MAAM,CAAU,QAAQ,GAAG;QACxB,qCAAqC;QACrC,4CAA4C;KAC9C,CAAC;IAEF,KAAK,CAAC,GAAG;QACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAE5C,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9B,OAAO;QACV,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACrD,OAAO;QACV,CAAC;QAED,MAAM,IAAI,GAAgB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACzD,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG;SACtE,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;YACrB,OAAO,EAAE;gBACN,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC7B,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACjC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;aACjC;YACD,QAAQ,EAAE,MAAM;SAClB,CAAC,CAAC;IACN,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class List extends BaseCommand<typeof List> {
3
+ static aliases: string[];
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ scope: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ private formatScopeName;
11
+ }
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW,CAAC,OAAO,IAAI,CAAC;IACvD,OAAgB,OAAO,WAAU;IAEjC,OAAgB,WAAW,SAA2B;IAEtD,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C1B,OAAO,CAAC,eAAe;CAUzB"}
@@ -0,0 +1,60 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ import { scopeFlag, parseScopes, includesScope } from '../../flags/scope.js';
3
+ export default class List extends BaseCommand {
4
+ static aliases = ['ls'];
5
+ static description = 'List configured items';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ '<%= config.bin %> <%= command.id %> --scope skills',
9
+ '<%= config.bin %> <%= command.id %> -s rules -s mcp',
10
+ ];
11
+ static flags = {
12
+ ...scopeFlag,
13
+ };
14
+ async run() {
15
+ const loaded = await this.requireConfig();
16
+ const scopes = parseScopes(this.flags), config = loaded.config, result = {};
17
+ if (includesScope(scopes, 'skills')) {
18
+ result.skills = config.skills ?? {};
19
+ }
20
+ if (includesScope(scopes, 'mcp')) {
21
+ result.mcp = config.mcp ?? {};
22
+ }
23
+ if (includesScope(scopes, 'rules')) {
24
+ result.rules = config.rules ?? {};
25
+ }
26
+ if (includesScope(scopes, 'editors')) {
27
+ result.editors = config.editors ?? {};
28
+ }
29
+ if (this.flags.json) {
30
+ this.output.json(result);
31
+ return;
32
+ }
33
+ for (const [scope, items] of Object.entries(result)) {
34
+ const entries = Object.entries(items);
35
+ this.output.header(this.formatScopeName(scope));
36
+ if (entries.length === 0) {
37
+ this.output.log(this.output.dim(' (none)'));
38
+ }
39
+ else {
40
+ for (const [name, value] of entries) {
41
+ const formatted = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
42
+ this.output.log(` ${this.output.cyan(name)}`);
43
+ for (const line of formatted.split('\n')) {
44
+ this.output.log(` ${line}`);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ formatScopeName(scope) {
51
+ const names = {
52
+ skills: 'Skills',
53
+ mcp: 'MCP Servers',
54
+ rules: 'Rules',
55
+ editors: 'Editors',
56
+ };
57
+ return names[scope] ?? scope;
58
+ }
59
+ }
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class ListMcp extends BaseCommand<typeof ListMcp> {
3
+ static aliases: string[];
4
+ static description: string;
5
+ static examples: string[];
6
+ run(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/commands/list/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW,CAAC,OAAO,OAAO,CAAC;IAC7D,OAAgB,OAAO,WAAiB;IAExC,OAAgB,WAAW,SAAiC;IAE5D,OAAgB,QAAQ,WAGtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2C5B"}
@@ -0,0 +1,45 @@
1
+ import { getTransport } from '@a1st/aix-core';
2
+ import { BaseCommand } from '../../base-command.js';
3
+ export default class ListMcp extends BaseCommand {
4
+ static aliases = ['list:mcps'];
5
+ static description = 'List configured MCP servers';
6
+ static examples = [
7
+ '<%= config.bin %> <%= command.id %>',
8
+ '<%= config.bin %> <%= command.id %> --json',
9
+ ];
10
+ async run() {
11
+ const loaded = await this.requireConfig();
12
+ const mcp = loaded.config.mcp ?? {};
13
+ if (this.flags.json) {
14
+ this.output.json({ mcp });
15
+ return;
16
+ }
17
+ // Filter out false values (disabled servers)
18
+ const entries = Object.entries(mcp).filter(([, config]) => config !== false);
19
+ if (entries.length === 0) {
20
+ this.output.info('No MCP servers configured');
21
+ return;
22
+ }
23
+ const rows = entries.map(([name, config]) => {
24
+ // Type assertion safe because we filtered out false above
25
+ const serverConfig = config, transport = getTransport(serverConfig), type = transport.type, command = type === 'stdio' ? transport.command : transport.url;
26
+ return {
27
+ name,
28
+ transport: type,
29
+ command,
30
+ status: serverConfig.enabled === false ? 'disabled' : 'enabled',
31
+ };
32
+ });
33
+ this.output.header('MCP Servers');
34
+ this.output.table(rows, {
35
+ columns: [
36
+ { key: 'name', name: 'Name' },
37
+ { key: 'transport', name: 'Transport' },
38
+ { key: 'command', name: 'Command/URL' },
39
+ { key: 'status', name: 'Status' },
40
+ ],
41
+ overflow: 'wrap',
42
+ });
43
+ }
44
+ }
45
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/list/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAA2B;IAC7D,MAAM,CAAU,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC;IAExC,MAAM,CAAU,WAAW,GAAG,6BAA6B,CAAC;IAE5D,MAAM,CAAU,QAAQ,GAAG;QACxB,qCAAqC;QACrC,4CAA4C;KAC9C,CAAC;IAEF,KAAK,CAAC,GAAG;QACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1B,OAAO;QACV,CAAC;QAED,6CAA6C;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;QAE7E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC9C,OAAO;QACV,CAAC;QAED,MAAM,IAAI,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YACnD,0DAA0D;YAC1D,MAAM,YAAY,GAAG,MAAuC,EACtD,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,EACtC,IAAI,GAAG,SAAS,CAAC,IAAI,EACrB,OAAO,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;YAErE,OAAO;gBACJ,IAAI;gBACJ,SAAS,EAAE,IAAI;gBACf,OAAO;gBACP,MAAM,EAAE,YAAY,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;aACjE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;YACrB,OAAO,EAAE;gBACN,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;gBAC7B,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;gBACvC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE;gBACvC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;aACnC;YACD,QAAQ,EAAE,MAAM;SAClB,CAAC,CAAC;IACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class ListRules extends BaseCommand<typeof ListRules> {
3
+ static description: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/commands/list/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW,CAAC,OAAO,SAAS,CAAC;IACjE,OAAgB,WAAW,SAA2B;IAEtD,OAAgB,QAAQ,WAGtB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqD5B"}