@skillsmith/cli 0.6.3 → 0.6.5

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 (182) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts +20 -0
  4. package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts.map +1 -0
  5. package/dist/src/commands/__meta__/telemetry-coverage.test.js +118 -0
  6. package/dist/src/commands/__meta__/telemetry-coverage.test.js.map +1 -0
  7. package/dist/src/commands/ab-test.d.ts +1 -0
  8. package/dist/src/commands/ab-test.d.ts.map +1 -1
  9. package/dist/src/commands/ab-test.js +17 -8
  10. package/dist/src/commands/ab-test.js.map +1 -1
  11. package/dist/src/commands/analyze.d.ts +1 -0
  12. package/dist/src/commands/analyze.d.ts.map +1 -1
  13. package/dist/src/commands/analyze.js +32 -23
  14. package/dist/src/commands/analyze.js.map +1 -1
  15. package/dist/src/commands/audit-collisions.d.ts +1 -4
  16. package/dist/src/commands/audit-collisions.d.ts.map +1 -1
  17. package/dist/src/commands/audit-collisions.js +32 -23
  18. package/dist/src/commands/audit-collisions.js.map +1 -1
  19. package/dist/src/commands/audit-sources.action.d.ts +37 -0
  20. package/dist/src/commands/audit-sources.action.d.ts.map +1 -0
  21. package/dist/src/commands/audit-sources.action.js +321 -0
  22. package/dist/src/commands/audit-sources.action.js.map +1 -0
  23. package/dist/src/commands/audit-sources.d.ts +37 -0
  24. package/dist/src/commands/audit-sources.d.ts.map +1 -0
  25. package/dist/src/commands/audit-sources.js +55 -0
  26. package/dist/src/commands/audit-sources.js.map +1 -0
  27. package/dist/src/commands/audit-sources.test.d.ts +9 -0
  28. package/dist/src/commands/audit-sources.test.d.ts.map +1 -0
  29. package/dist/src/commands/audit-sources.test.js +228 -0
  30. package/dist/src/commands/audit-sources.test.js.map +1 -0
  31. package/dist/src/commands/audit.d.ts +2 -6
  32. package/dist/src/commands/audit.d.ts.map +1 -1
  33. package/dist/src/commands/audit.js +52 -31
  34. package/dist/src/commands/audit.js.map +1 -1
  35. package/dist/src/commands/author/index.d.ts +2 -1
  36. package/dist/src/commands/author/index.d.ts.map +1 -1
  37. package/dist/src/commands/author/index.js +4 -1
  38. package/dist/src/commands/author/index.js.map +1 -1
  39. package/dist/src/commands/author/init.action.d.ts +29 -0
  40. package/dist/src/commands/author/init.action.d.ts.map +1 -0
  41. package/dist/src/commands/author/init.action.js +131 -0
  42. package/dist/src/commands/author/init.action.js.map +1 -0
  43. package/dist/src/commands/author/init.d.ts +0 -14
  44. package/dist/src/commands/author/init.d.ts.map +1 -1
  45. package/dist/src/commands/author/init.js +3 -87
  46. package/dist/src/commands/author/init.js.map +1 -1
  47. package/dist/src/commands/author/mcp-init.d.ts +1 -0
  48. package/dist/src/commands/author/mcp-init.d.ts.map +1 -1
  49. package/dist/src/commands/author/mcp-init.js +21 -13
  50. package/dist/src/commands/author/mcp-init.js.map +1 -1
  51. package/dist/src/commands/author/subagent.d.ts +1 -0
  52. package/dist/src/commands/author/subagent.d.ts.map +1 -1
  53. package/dist/src/commands/author/subagent.js +23 -15
  54. package/dist/src/commands/author/subagent.js.map +1 -1
  55. package/dist/src/commands/author/transform.d.ts +1 -0
  56. package/dist/src/commands/author/transform.d.ts.map +1 -1
  57. package/dist/src/commands/author/transform.js +23 -15
  58. package/dist/src/commands/author/transform.js.map +1 -1
  59. package/dist/src/commands/config.d.ts +2 -0
  60. package/dist/src/commands/config.d.ts.map +1 -1
  61. package/dist/src/commands/config.js +43 -28
  62. package/dist/src/commands/config.js.map +1 -1
  63. package/dist/src/commands/create.d.ts +1 -0
  64. package/dist/src/commands/create.d.ts.map +1 -1
  65. package/dist/src/commands/create.js +28 -19
  66. package/dist/src/commands/create.js.map +1 -1
  67. package/dist/src/commands/diff.d.ts +4 -0
  68. package/dist/src/commands/diff.d.ts.map +1 -1
  69. package/dist/src/commands/diff.js +90 -54
  70. package/dist/src/commands/diff.js.map +1 -1
  71. package/dist/src/commands/diff.test.js +52 -0
  72. package/dist/src/commands/diff.test.js.map +1 -1
  73. package/dist/src/commands/import-local.d.ts +7 -0
  74. package/dist/src/commands/import-local.d.ts.map +1 -1
  75. package/dist/src/commands/import-local.js +43 -34
  76. package/dist/src/commands/import-local.js.map +1 -1
  77. package/dist/src/commands/import.d.ts +6 -0
  78. package/dist/src/commands/import.d.ts.map +1 -1
  79. package/dist/src/commands/import.js +23 -14
  80. package/dist/src/commands/import.js.map +1 -1
  81. package/dist/src/commands/info.d.ts +7 -0
  82. package/dist/src/commands/info.d.ts.map +1 -1
  83. package/dist/src/commands/info.js +77 -68
  84. package/dist/src/commands/info.js.map +1 -1
  85. package/dist/src/commands/install-skill.d.ts +3 -0
  86. package/dist/src/commands/install-skill.d.ts.map +1 -1
  87. package/dist/src/commands/install-skill.js +23 -15
  88. package/dist/src/commands/install-skill.js.map +1 -1
  89. package/dist/src/commands/install.d.ts +21 -0
  90. package/dist/src/commands/install.d.ts.map +1 -1
  91. package/dist/src/commands/install.js +154 -139
  92. package/dist/src/commands/install.js.map +1 -1
  93. package/dist/src/commands/login.d.ts +4 -0
  94. package/dist/src/commands/login.d.ts.map +1 -1
  95. package/dist/src/commands/login.js +56 -47
  96. package/dist/src/commands/login.js.map +1 -1
  97. package/dist/src/commands/logout.d.ts +1 -0
  98. package/dist/src/commands/logout.d.ts.map +1 -1
  99. package/dist/src/commands/logout.js +36 -27
  100. package/dist/src/commands/logout.js.map +1 -1
  101. package/dist/src/commands/manage.d.ts +3 -9
  102. package/dist/src/commands/manage.d.ts.map +1 -1
  103. package/dist/src/commands/manage.js +69 -45
  104. package/dist/src/commands/manage.js.map +1 -1
  105. package/dist/src/commands/merge.d.ts +7 -0
  106. package/dist/src/commands/merge.d.ts.map +1 -1
  107. package/dist/src/commands/merge.js +117 -108
  108. package/dist/src/commands/merge.js.map +1 -1
  109. package/dist/src/commands/pin.d.ts +2 -0
  110. package/dist/src/commands/pin.d.ts.map +1 -1
  111. package/dist/src/commands/pin.js +88 -73
  112. package/dist/src/commands/pin.js.map +1 -1
  113. package/dist/src/commands/recommend.d.ts +1 -0
  114. package/dist/src/commands/recommend.d.ts.map +1 -1
  115. package/dist/src/commands/recommend.js +35 -27
  116. package/dist/src/commands/recommend.js.map +1 -1
  117. package/dist/src/commands/search-formatters.d.ts +1 -0
  118. package/dist/src/commands/search-formatters.d.ts.map +1 -1
  119. package/dist/src/commands/search-formatters.js +3 -0
  120. package/dist/src/commands/search-formatters.js.map +1 -1
  121. package/dist/src/commands/search.action.d.ts +16 -0
  122. package/dist/src/commands/search.action.d.ts.map +1 -0
  123. package/dist/src/commands/search.action.js +384 -0
  124. package/dist/src/commands/search.action.js.map +1 -0
  125. package/dist/src/commands/search.d.ts +3 -0
  126. package/dist/src/commands/search.d.ts.map +1 -1
  127. package/dist/src/commands/search.js +5 -354
  128. package/dist/src/commands/search.js.map +1 -1
  129. package/dist/src/commands/sync.action.d.ts +39 -0
  130. package/dist/src/commands/sync.action.d.ts.map +1 -0
  131. package/dist/src/commands/sync.action.js +353 -0
  132. package/dist/src/commands/sync.action.js.map +1 -0
  133. package/dist/src/commands/sync.d.ts +3 -0
  134. package/dist/src/commands/sync.d.ts.map +1 -1
  135. package/dist/src/commands/sync.js +8 -310
  136. package/dist/src/commands/sync.js.map +1 -1
  137. package/dist/src/commands/telemetry.action.d.ts +38 -0
  138. package/dist/src/commands/telemetry.action.d.ts.map +1 -0
  139. package/dist/src/commands/telemetry.action.js +350 -0
  140. package/dist/src/commands/telemetry.action.js.map +1 -0
  141. package/dist/src/commands/telemetry.d.ts +5 -13
  142. package/dist/src/commands/telemetry.d.ts.map +1 -1
  143. package/dist/src/commands/telemetry.js +13 -302
  144. package/dist/src/commands/telemetry.js.map +1 -1
  145. package/dist/src/commands/whoami.d.ts +1 -0
  146. package/dist/src/commands/whoami.d.ts.map +1 -1
  147. package/dist/src/commands/whoami.js +29 -21
  148. package/dist/src/commands/whoami.js.map +1 -1
  149. package/dist/src/utils/open-database.d.ts +10 -2
  150. package/dist/src/utils/open-database.d.ts.map +1 -1
  151. package/dist/src/utils/open-database.js +15 -2
  152. package/dist/src/utils/open-database.js.map +1 -1
  153. package/dist/src/utils/skills-directory.d.ts.map +1 -1
  154. package/dist/src/utils/skills-directory.js +5 -1
  155. package/dist/src/utils/skills-directory.js.map +1 -1
  156. package/dist/tests/e2e/audit-sources-affix.test.d.ts +11 -0
  157. package/dist/tests/e2e/audit-sources-affix.test.d.ts.map +1 -0
  158. package/dist/tests/e2e/audit-sources-affix.test.js +121 -0
  159. package/dist/tests/e2e/audit-sources-affix.test.js.map +1 -0
  160. package/dist/tests/e2e/audit-sources-apply.test.d.ts +13 -0
  161. package/dist/tests/e2e/audit-sources-apply.test.d.ts.map +1 -0
  162. package/dist/tests/e2e/audit-sources-apply.test.js +166 -0
  163. package/dist/tests/e2e/audit-sources-apply.test.js.map +1 -0
  164. package/dist/tests/e2e/audit-sources-recovery.test.d.ts +15 -0
  165. package/dist/tests/e2e/audit-sources-recovery.test.d.ts.map +1 -0
  166. package/dist/tests/e2e/audit-sources-recovery.test.js +179 -0
  167. package/dist/tests/e2e/audit-sources-recovery.test.js.map +1 -0
  168. package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts +23 -0
  169. package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts.map +1 -0
  170. package/dist/tests/e2e/audit-sources-roundtrip.test.js +139 -0
  171. package/dist/tests/e2e/audit-sources-roundtrip.test.js.map +1 -0
  172. package/dist/tests/e2e/utils/source-recovery-fixture.d.ts +49 -0
  173. package/dist/tests/e2e/utils/source-recovery-fixture.d.ts.map +1 -0
  174. package/dist/tests/e2e/utils/source-recovery-fixture.js +106 -0
  175. package/dist/tests/e2e/utils/source-recovery-fixture.js.map +1 -0
  176. package/dist/tests/init.test.js +2 -1
  177. package/dist/tests/init.test.js.map +1 -1
  178. package/dist/tests/install-quarantine.test.d.ts +10 -0
  179. package/dist/tests/install-quarantine.test.d.ts.map +1 -0
  180. package/dist/tests/install-quarantine.test.js +86 -0
  181. package/dist/tests/install-quarantine.test.js.map +1 -0
  182. package/package.json +4 -5
@@ -0,0 +1,384 @@
1
+ /**
2
+ * SMI-5127: Search command action implementation + telemetry wrapper.
3
+ *
4
+ * Sibling-split from search.ts following the <command>.action.ts convention
5
+ * established by SMI-5040. The action impl is extracted here and wrapped with
6
+ * withTelemetry so the CLI_DISPATCHER_MAP coverage test can assert coverage
7
+ * without importing the full commander tree.
8
+ *
9
+ * Opts-adaptation choice: searchActionImpl accepts the same (query, opts)
10
+ * signature that commander passes to .action() — the factory in search.ts
11
+ * passes the wrapped action directly to .action() with no closure needed.
12
+ * The interactive sub-functions (runInteractiveSearch, runSearch) remain
13
+ * private to this module.
14
+ */
15
+ import chalk from 'chalk';
16
+ import ora from 'ora';
17
+ import { input, checkbox, number, select } from '@inquirer/prompts';
18
+ import { SearchService, SkillRepository, SkillDependencyRepository, SkillInstallationService, } from '@skillsmith/core';
19
+ // SMI-5039: lazy embedding-capability probe. CLI `search` is the only
20
+ // embedding-relevant command — it surfaces a degraded-search warning to the
21
+ // operator without blocking the FTS fallback path. The probe is hard-bounded
22
+ // at 2 s, stderr-only, and never throws; `SKILLSMITH_QUIET=true` suppresses
23
+ // the warning line for scripted use.
24
+ import { probeEmbeddingCapability } from '@skillsmith/core/embeddings/probe';
25
+ import { withTelemetry } from '@skillsmith/core/telemetry';
26
+ import { openCliDatabase } from '../utils/open-database.js';
27
+ import { autoSyncIfEmpty, isLocalIndexEmpty, formatEmptyIndexHint } from './search.helpers.js';
28
+ import { sanitizeError } from '../utils/sanitize.js';
29
+ import { PAGE_SIZE } from './search-types.js';
30
+ import { TRUST_TIER_COLORS, displayResults, displaySkillDetails } from './search-formatters.js';
31
+ // ---------------------------------------------------------------------------
32
+ // Private helpers (not exported — used only by searchActionImpl)
33
+ // ---------------------------------------------------------------------------
34
+ /**
35
+ * Run interactive search loop using state machine pattern (SMI-759)
36
+ * Uses iterative while loop instead of recursion for new searches.
37
+ */
38
+ async function runInteractiveSearch(dbPath) {
39
+ const db = await openCliDatabase(dbPath);
40
+ // SMI-4917 Bug 3: bootstrap the local registry on a first-time search.
41
+ await autoSyncIfEmpty(db);
42
+ const searchService = new SearchService(db);
43
+ console.log(chalk.bold.blue('\n=== Skillsmith Interactive Search ===\n'));
44
+ try {
45
+ // State machine: phase controls the loop behavior
46
+ let phase = 'collect_query';
47
+ let state = null;
48
+ // Main state machine loop - replaces recursive calls
49
+ while (phase !== 'exit') {
50
+ // Phase: Collect search query and filters
51
+ if (phase === 'collect_query') {
52
+ // Step 1: Enter search query (optional if filters will be provided)
53
+ const query = await input({
54
+ message: 'Enter search query (or press Enter to browse with filters):',
55
+ default: '',
56
+ });
57
+ // Step 2: Filter by trust tier
58
+ const trustTiers = await checkbox({
59
+ message: 'Filter by trust tier (select with space, enter to continue):',
60
+ choices: [
61
+ { name: chalk.green('Verified'), value: 'verified' },
62
+ { name: chalk.blue('Curated'), value: 'curated' },
63
+ { name: chalk.yellow('Community'), value: 'community' },
64
+ { name: chalk.red('Experimental'), value: 'experimental' },
65
+ { name: chalk.gray('Unknown'), value: 'unknown' },
66
+ { name: chalk.cyan('Local'), value: 'local' },
67
+ ],
68
+ });
69
+ // Step 3: Minimum quality score
70
+ const minQualityScore = await number({
71
+ message: 'Minimum quality score (0-100, leave empty for no filter):',
72
+ default: 0,
73
+ min: 0,
74
+ max: 100,
75
+ });
76
+ // Validate: require query OR at least one filter
77
+ const hasQuery = query.trim().length > 0;
78
+ const hasFilters = trustTiers.length > 0 || (minQualityScore !== undefined && minQualityScore > 0);
79
+ if (!hasQuery && !hasFilters) {
80
+ console.log(chalk.red('Please provide a search query or select at least one filter.'));
81
+ continue; // Stay in collect_query phase
82
+ }
83
+ state = {
84
+ query,
85
+ trustTiers,
86
+ minQualityScore: (minQualityScore || 0) / 100,
87
+ offset: 0,
88
+ };
89
+ phase = 'searching';
90
+ continue;
91
+ }
92
+ // Phase: Search and display results
93
+ if (phase === 'searching' && state !== null) {
94
+ // Build search options - only add optional properties when they have values
95
+ const searchOptions = {
96
+ query: state.query,
97
+ limit: PAGE_SIZE,
98
+ offset: state.offset,
99
+ };
100
+ // Add optional filters only when they have values (exactOptionalPropertyTypes)
101
+ if (state.minQualityScore > 0) {
102
+ searchOptions.minQualityScore = state.minQualityScore;
103
+ }
104
+ // Filter by first selected trust tier (API only supports one)
105
+ if (state.trustTiers.length === 1 && state.trustTiers[0] !== undefined) {
106
+ searchOptions.trustTier = state.trustTiers[0];
107
+ }
108
+ // Execute search
109
+ const results = searchService.search(searchOptions);
110
+ // If filtering by multiple trust tiers, filter client-side
111
+ let filteredItems = results.items;
112
+ const trustTiersForFilter = state.trustTiers;
113
+ if (trustTiersForFilter.length > 1) {
114
+ filteredItems = results.items.filter((r) => trustTiersForFilter.includes(r.skill.trustTier));
115
+ }
116
+ if (results.items.length === 0) {
117
+ // SMI-4926: distinguish an empty/unsynced local index from a no-match.
118
+ if (isLocalIndexEmpty(db)) {
119
+ console.log(formatEmptyIndexHint(db));
120
+ }
121
+ else {
122
+ displayResults(filteredItems, results.total, state.offset, PAGE_SIZE);
123
+ }
124
+ phase = 'exit';
125
+ continue;
126
+ }
127
+ displayResults(filteredItems, results.total, state.offset, PAGE_SIZE);
128
+ // Build action choices
129
+ const choices = [];
130
+ // Add skill selection options
131
+ for (let i = 0; i < filteredItems.length; i++) {
132
+ const skill = filteredItems[i].skill;
133
+ const colorFn = TRUST_TIER_COLORS[skill.trustTier];
134
+ choices.push({
135
+ name: `${i + 1}. ${colorFn(skill.name)} - View details`,
136
+ value: `view_${i}`,
137
+ });
138
+ }
139
+ // Add navigation options
140
+ choices.push({ name: chalk.dim('---'), value: 'separator' });
141
+ if (state.offset > 0) {
142
+ choices.push({ name: chalk.cyan('<< Previous page'), value: 'prev' });
143
+ }
144
+ if (results.hasMore) {
145
+ choices.push({ name: chalk.cyan('Next page >>'), value: 'next' });
146
+ }
147
+ choices.push({ name: chalk.magenta('New search'), value: 'new' });
148
+ choices.push({ name: chalk.red('Exit'), value: 'exit' });
149
+ const action = await select({
150
+ message: 'Select a skill to view or navigate:',
151
+ choices,
152
+ });
153
+ if (action === 'separator') {
154
+ continue;
155
+ }
156
+ else if (action === 'exit') {
157
+ phase = 'exit';
158
+ }
159
+ else if (action === 'new') {
160
+ // SMI-759: Reset to collect_query phase instead of recursive call
161
+ phase = 'collect_query';
162
+ console.log(chalk.bold.blue('\n=== New Search ===\n'));
163
+ }
164
+ else if (action === 'prev') {
165
+ state.offset = Math.max(0, state.offset - PAGE_SIZE);
166
+ }
167
+ else if (action === 'next') {
168
+ state.offset += PAGE_SIZE;
169
+ }
170
+ else if (action.startsWith('view_')) {
171
+ const index = parseInt(action.replace('view_', ''), 10);
172
+ const selectedResult = filteredItems[index];
173
+ if (selectedResult) {
174
+ displaySkillDetails(selectedResult);
175
+ // Ask what to do next
176
+ const nextAction = await select({
177
+ message: 'What would you like to do?',
178
+ choices: [
179
+ { name: 'Back to results', value: 'back' },
180
+ { name: 'Install this skill', value: 'install' },
181
+ { name: 'Exit', value: 'exit' },
182
+ ],
183
+ });
184
+ if (nextAction === 'install') {
185
+ const installSpinner = ora('Installing skill...').start();
186
+ try {
187
+ const skillRepo = new SkillRepository(db);
188
+ const skillDependencyRepo = new SkillDependencyRepository(db);
189
+ const registryLookup = {
190
+ async lookup(sid) {
191
+ const s = skillRepo.findById(sid);
192
+ if (!s || !s.repoUrl)
193
+ return null;
194
+ return {
195
+ repoUrl: s.repoUrl,
196
+ name: s.name,
197
+ trustTier: s.trustTier,
198
+ quarantined: false,
199
+ };
200
+ },
201
+ };
202
+ const installService = new SkillInstallationService({
203
+ db,
204
+ skillRepo,
205
+ skillDependencyRepo,
206
+ registryLookup,
207
+ onProgress: (_stage, detail) => {
208
+ installSpinner.text = detail;
209
+ },
210
+ });
211
+ const installResult = await installService.install(selectedResult.skill.id, {});
212
+ if (installResult.success) {
213
+ installSpinner.succeed(chalk.green(`Installed "${selectedResult.skill.name}" successfully`));
214
+ if (installResult.installPath) {
215
+ console.log(chalk.dim(` Path: ${installResult.installPath}`));
216
+ }
217
+ }
218
+ else {
219
+ installSpinner.fail(chalk.red(`Installation failed: ${installResult.error}`));
220
+ }
221
+ }
222
+ catch (installError) {
223
+ installSpinner.fail(chalk.red(`Installation error: ${installError instanceof Error ? installError.message : String(installError)}`));
224
+ }
225
+ }
226
+ else if (nextAction === 'exit') {
227
+ phase = 'exit';
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ finally {
235
+ db.close();
236
+ }
237
+ console.log(chalk.dim('\nGoodbye!\n'));
238
+ }
239
+ /**
240
+ * Run non-interactive search
241
+ */
242
+ async function runSearch(query, options) {
243
+ const db = await openCliDatabase(options.db);
244
+ // SMI-4917 Bug 3: bootstrap the local registry on a first-time search.
245
+ await autoSyncIfEmpty(db);
246
+ const searchService = new SearchService(db);
247
+ try {
248
+ // Build search options - only add optional properties when they have values
249
+ const searchOptions = {
250
+ query,
251
+ limit: options.limit,
252
+ };
253
+ // Add optional filters only when they have values (exactOptionalPropertyTypes)
254
+ if (options.tier !== undefined) {
255
+ searchOptions.trustTier = options.tier;
256
+ }
257
+ if (options.category !== undefined) {
258
+ searchOptions.category = options.category;
259
+ }
260
+ if (options.minScore !== undefined) {
261
+ searchOptions.minQualityScore = options.minScore / 100;
262
+ }
263
+ // SMI-825: Security filters
264
+ if (options.safeOnly !== undefined) {
265
+ searchOptions.safeOnly = options.safeOnly;
266
+ }
267
+ if (options.maxRisk !== undefined) {
268
+ searchOptions.maxRiskScore = options.maxRisk;
269
+ }
270
+ const results = searchService.search(searchOptions);
271
+ // SMI-4926: an empty local index produces 0 results that look like a
272
+ // genuine no-match — surface a sync-state-aware hint instead.
273
+ if (results.items.length === 0 && isLocalIndexEmpty(db)) {
274
+ console.log(formatEmptyIndexHint(db));
275
+ return;
276
+ }
277
+ displayResults(results.items, results.total, 0, options.limit);
278
+ }
279
+ finally {
280
+ db.close();
281
+ }
282
+ }
283
+ // ---------------------------------------------------------------------------
284
+ // Action impl (matches commander's .action() signature)
285
+ // ---------------------------------------------------------------------------
286
+ async function searchActionImpl(query, opts) {
287
+ try {
288
+ // SMI-5039: lazy probe — only fires on the search command, NOT on
289
+ // --version / --help (those short-circuit at commander level before
290
+ // any .action runs). Honors SKILLSMITH_QUIET=true for scripted use.
291
+ // Probe cannot throw; safe to await unconditionally.
292
+ await probeEmbeddingCapability();
293
+ const interactive = opts['interactive'];
294
+ const dbPath = opts['db'];
295
+ const limit = parseInt(opts['limit'], 10);
296
+ const tier = opts['tier'];
297
+ const category = opts['category'];
298
+ const minScore = opts['min-score'] ? parseInt(opts['min-score'], 10) : undefined;
299
+ // SMI-825: Security filters
300
+ const safeOnly = opts['safe-only'];
301
+ const maxRisk = opts['max-risk'] ? parseInt(opts['max-risk'], 10) : undefined;
302
+ if (interactive) {
303
+ await runInteractiveSearch(dbPath);
304
+ }
305
+ else if (query) {
306
+ // Query provided - run search with optional filters
307
+ const searchOpts = {
308
+ db: dbPath,
309
+ limit,
310
+ };
311
+ if (tier !== undefined) {
312
+ searchOpts.tier = tier;
313
+ }
314
+ if (category !== undefined) {
315
+ searchOpts.category = category;
316
+ }
317
+ if (minScore !== undefined) {
318
+ searchOpts.minScore = minScore;
319
+ }
320
+ // SMI-825: Security filters
321
+ if (safeOnly !== undefined) {
322
+ searchOpts.safeOnly = safeOnly;
323
+ }
324
+ if (maxRisk !== undefined) {
325
+ searchOpts.maxRisk = maxRisk;
326
+ }
327
+ await runSearch(query, searchOpts);
328
+ }
329
+ else if (tier !== undefined ||
330
+ category !== undefined ||
331
+ minScore !== undefined ||
332
+ safeOnly !== undefined ||
333
+ maxRisk !== undefined) {
334
+ // No query but filters provided - run filter-only search
335
+ console.log(chalk.blue('Running filter-only search...'));
336
+ const searchOpts = {
337
+ db: dbPath,
338
+ limit,
339
+ };
340
+ if (tier !== undefined) {
341
+ searchOpts.tier = tier;
342
+ }
343
+ if (category !== undefined) {
344
+ searchOpts.category = category;
345
+ }
346
+ if (minScore !== undefined) {
347
+ searchOpts.minScore = minScore;
348
+ }
349
+ // SMI-825: Security filters
350
+ if (safeOnly !== undefined) {
351
+ searchOpts.safeOnly = safeOnly;
352
+ }
353
+ if (maxRisk !== undefined) {
354
+ searchOpts.maxRisk = maxRisk;
355
+ }
356
+ await runSearch('', searchOpts);
357
+ }
358
+ else {
359
+ // No query and no filters
360
+ console.log(chalk.yellow('Please provide a search query, filters (--tier, --category, --min-score, --safe-only, --max-risk), or use -i for interactive mode'));
361
+ console.log(chalk.dim('Examples:'));
362
+ console.log(chalk.dim(' skillsmith search "authentication"'));
363
+ console.log(chalk.dim(' skillsmith search --tier verified'));
364
+ console.log(chalk.dim(' skillsmith search --category security'));
365
+ console.log(chalk.dim(' skillsmith search --tier community --min-score 70'));
366
+ console.log(chalk.dim(' skillsmith search --safe-only'));
367
+ console.log(chalk.dim(' skillsmith search --max-risk 30'));
368
+ console.log(chalk.dim(' skillsmith search -i'));
369
+ }
370
+ }
371
+ catch (error) {
372
+ console.error(chalk.red('Search error:'), sanitizeError(error));
373
+ process.exit(1);
374
+ }
375
+ }
376
+ // ---------------------------------------------------------------------------
377
+ // Telemetry-wrapped export (SMI-5127)
378
+ // ---------------------------------------------------------------------------
379
+ export const searchAction = withTelemetry(searchActionImpl, {
380
+ source: 'cli',
381
+ extractSkillId: () => 'search',
382
+ extractFramework: () => 'cli',
383
+ });
384
+ //# sourceMappingURL=search.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.action.js","sourceRoot":"","sources":["../../../src/commands/search.action.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EACL,aAAa,EACb,eAAe,EACf,yBAAyB,EACzB,wBAAwB,GAKzB,MAAM,kBAAkB,CAAA;AACzB,sEAAsE;AACtE,4EAA4E;AAC5E,6EAA6E;AAC7E,4EAA4E;AAC5E,qCAAqC;AACrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAiD,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC5F,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAE/F,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CAAC,MAAc;IAChD,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAA;IACxC,uEAAuE;IACvE,MAAM,eAAe,CAAC,EAAE,CAAC,CAAA;IACzB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAA;IAEzE,IAAI,CAAC;QACH,kDAAkD;QAClD,IAAI,KAAK,GAAgB,eAAe,CAAA;QACxC,IAAI,KAAK,GAAkC,IAAI,CAAA;QAE/C,qDAAqD;QACrD,OAAO,KAAK,KAAK,MAAM,EAAE,CAAC;YACxB,0CAA0C;YAC1C,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;gBAC9B,oEAAoE;gBACpE,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC;oBACxB,OAAO,EAAE,6DAA6D;oBACtE,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAA;gBAEF,+BAA+B;gBAC/B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAY;oBAC3C,OAAO,EAAE,8DAA8D;oBACvE,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;wBACpD,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;wBACjD,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;wBACvD,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE;wBAC1D,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;wBACjD,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;qBAC9C;iBACF,CAAC,CAAA;gBAEF,gCAAgC;gBAChC,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC;oBACnC,OAAO,EAAE,2DAA2D;oBACpE,OAAO,EAAE,CAAC;oBACV,GAAG,EAAE,CAAC;oBACN,GAAG,EAAE,GAAG;iBACT,CAAC,CAAA;gBAEF,iDAAiD;gBACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;gBACxC,MAAM,UAAU,GACd,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,GAAG,CAAC,CAAC,CAAA;gBAEjF,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC,CAAA;oBACtF,SAAQ,CAAC,8BAA8B;gBACzC,CAAC;gBAED,KAAK,GAAG;oBACN,KAAK;oBACL,UAAU;oBACV,eAAe,EAAE,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,GAAG;oBAC7C,MAAM,EAAE,CAAC;iBACV,CAAA;gBAED,KAAK,GAAG,WAAW,CAAA;gBACnB,SAAQ;YACV,CAAC;YAED,oCAAoC;YACpC,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC5C,4EAA4E;gBAC5E,MAAM,aAAa,GAAkB;oBACnC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAA;gBAED,+EAA+E;gBAC/E,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;oBAC9B,aAAa,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAA;gBACvD,CAAC;gBAED,8DAA8D;gBAC9D,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBACvE,aAAa,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;gBAC/C,CAAC;gBAED,iBAAiB;gBACjB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;gBAEnD,2DAA2D;gBAC3D,IAAI,aAAa,GAAG,OAAO,CAAC,KAAK,CAAA;gBACjC,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAAA;gBAC5C,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAChD,CAAA;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,uEAAuE;oBACvE,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvC,CAAC;yBAAM,CAAC;wBACN,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;oBACvE,CAAC;oBACD,KAAK,GAAG,MAAM,CAAA;oBACd,SAAQ;gBACV,CAAC;gBAED,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;gBAErE,uBAAuB;gBACvB,MAAM,OAAO,GAA2C,EAAE,CAAA;gBAE1D,8BAA8B;gBAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAE,CAAC,KAAK,CAAA;oBACrC,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;oBAClD,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB;wBACvD,KAAK,EAAE,QAAQ,CAAC,EAAE;qBACnB,CAAC,CAAA;gBACJ,CAAC;gBAED,yBAAyB;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;gBAE5D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;gBACvE,CAAC;gBAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;gBACnE,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;gBACjE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;gBAExD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;oBAC1B,OAAO,EAAE,qCAAqC;oBAC9C,OAAO;iBACR,CAAC,CAAA;gBAEF,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC3B,SAAQ;gBACV,CAAC;qBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC7B,KAAK,GAAG,MAAM,CAAA;gBAChB,CAAC;qBAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBAC5B,kEAAkE;oBAClE,KAAK,GAAG,eAAe,CAAA;oBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAA;gBACxD,CAAC;qBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC7B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;gBACtD,CAAC;qBAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC7B,KAAK,CAAC,MAAM,IAAI,SAAS,CAAA;gBAC3B,CAAC;qBAAM,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;oBACvD,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;oBAC3C,IAAI,cAAc,EAAE,CAAC;wBACnB,mBAAmB,CAAC,cAAc,CAAC,CAAA;wBAEnC,sBAAsB;wBACtB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC;4BAC9B,OAAO,EAAE,4BAA4B;4BACrC,OAAO,EAAE;gCACP,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE;gCAC1C,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;gCAChD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;6BAChC;yBACF,CAAC,CAAA;wBAEF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;4BAC7B,MAAM,cAAc,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAA;4BACzD,IAAI,CAAC;gCACH,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAA;gCACzC,MAAM,mBAAmB,GAAG,IAAI,yBAAyB,CAAC,EAAE,CAAC,CAAA;gCAC7D,MAAM,cAAc,GAAmB;oCACrC,KAAK,CAAC,MAAM,CAAC,GAAW;wCACtB,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;wCACjC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;4CAAE,OAAO,IAAI,CAAA;wCACjC,OAAO;4CACL,OAAO,EAAE,CAAC,CAAC,OAAO;4CAClB,IAAI,EAAE,CAAC,CAAC,IAAI;4CACZ,SAAS,EAAE,CAAC,CAAC,SAAS;4CACtB,WAAW,EAAE,KAAK;yCACnB,CAAA;oCACH,CAAC;iCACF,CAAA;gCACD,MAAM,cAAc,GAAG,IAAI,wBAAwB,CAAC;oCAClD,EAAE;oCACF,SAAS;oCACT,mBAAmB;oCACnB,cAAc;oCACd,UAAU,EAAE,CAAC,MAAc,EAAE,MAAc,EAAE,EAAE;wCAC7C,cAAc,CAAC,IAAI,GAAG,MAAM,CAAA;oCAC9B,CAAC;iCACF,CAAC,CAAA;gCACF,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;gCAC/E,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;oCAC1B,cAAc,CAAC,OAAO,CACpB,KAAK,CAAC,KAAK,CAAC,cAAc,cAAc,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,CACrE,CAAA;oCACD,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;wCAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;oCAChE,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;gCAC/E,CAAC;4BACH,CAAC;4BAAC,OAAO,YAAY,EAAE,CAAC;gCACtB,cAAc,CAAC,IAAI,CACjB,KAAK,CAAC,GAAG,CACP,uBAAuB,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CACrG,CACF,CAAA;4BACH,CAAC;wBACH,CAAC;6BAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;4BACjC,KAAK,GAAG,MAAM,CAAA;wBAChB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAA;AACxC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,OASC;IAED,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC5C,uEAAuE;IACvE,MAAM,eAAe,CAAC,EAAE,CAAC,CAAA;IACzB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,EAAE,CAAC,CAAA;IAE3C,IAAI,CAAC;QACH,4EAA4E;QAC5E,MAAM,aAAa,GAAkB;YACnC,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAA;QAED,+EAA+E;QAC/E,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,aAAa,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAA;QACxC,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,aAAa,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAC3C,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,aAAa,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAA;QACxD,CAAC;QACD,4BAA4B;QAC5B,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,aAAa,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAC3C,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,aAAa,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAA;QAC9C,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACnD,qEAAqE;QACrE,8DAA8D;QAC9D,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QACD,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,KAAK,UAAU,gBAAgB,CAC7B,KAAyB,EACzB,IAAkD;IAElD,IAAI,CAAC;QACH,kEAAkE;QAClE,oEAAoE;QACpE,oEAAoE;QACpE,qDAAqD;QACrD,MAAM,wBAAwB,EAAE,CAAA;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAwB,CAAA;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAW,CAAA;QACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAW,EAAE,EAAE,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAA0B,CAAA;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAuB,CAAA;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1F,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAwB,CAAA;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAEvF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAA;QACpC,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,oDAAoD;YACpD,MAAM,UAAU,GAQZ;gBACF,EAAE,EAAE,MAAM;gBACV,KAAK;aACN,CAAA;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAA;YACxB,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAChC,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAChC,CAAC;YACD,4BAA4B;YAC5B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAChC,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;YAC9B,CAAC;YACD,MAAM,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QACpC,CAAC;aAAM,IACL,IAAI,KAAK,SAAS;YAClB,QAAQ,KAAK,SAAS;YACtB,QAAQ,KAAK,SAAS;YACtB,QAAQ,KAAK,SAAS;YACtB,OAAO,KAAK,SAAS,EACrB,CAAC;YACD,yDAAyD;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAA;YACxD,MAAM,UAAU,GAQZ;gBACF,EAAE,EAAE,MAAM;gBACV,KAAK;aACN,CAAA;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAA;YACxB,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAChC,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAChC,CAAC;YACD,4BAA4B;YAC5B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAA;YAChC,CAAC;YACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;YAC9B,CAAC;YACD,MAAM,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,CAAA;QACjC,CAAC;aAAM,CAAC;YACN,0BAA0B;YAC1B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,mIAAmI,CACpI,CACF,CAAA;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAA;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAA;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAA;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAA;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAA;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,gBAAgB,EAAE;IAC1D,MAAM,EAAE,KAAK;IACb,cAAc,EAAE,GAAG,EAAE,CAAC,QAAQ;IAC9B,gBAAgB,EAAE,GAAG,EAAE,CAAC,KAAK;CAC9B,CAAC,CAAA"}
@@ -2,6 +2,9 @@
2
2
  * SMI-744: Interactive Search Mode
3
3
  *
4
4
  * Provides interactive CLI for searching skills with filters and pagination.
5
+ *
6
+ * SMI-5127: Action implementation moved to search.action.ts.
7
+ * This file retains only the commander factory function and re-exports.
5
8
  */
6
9
  import { Command } from 'commander';
7
10
  export type { InteractiveSearchState, SearchPhase, SearchCommandOptions } from './search-types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA4BnC,YAAY,EAAE,sBAAsB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAClG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAoS/B;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAuJ7C;AAED,eAAe,mBAAmB,CAAA"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKnC,YAAY,EAAE,sBAAsB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAClG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAE/B;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAyC7C;AAED,eAAe,mBAAmB,CAAA"}