@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.
- package/CHANGELOG.md +11 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts +20 -0
- package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts.map +1 -0
- package/dist/src/commands/__meta__/telemetry-coverage.test.js +118 -0
- package/dist/src/commands/__meta__/telemetry-coverage.test.js.map +1 -0
- package/dist/src/commands/ab-test.d.ts +1 -0
- package/dist/src/commands/ab-test.d.ts.map +1 -1
- package/dist/src/commands/ab-test.js +17 -8
- package/dist/src/commands/ab-test.js.map +1 -1
- package/dist/src/commands/analyze.d.ts +1 -0
- package/dist/src/commands/analyze.d.ts.map +1 -1
- package/dist/src/commands/analyze.js +32 -23
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/audit-collisions.d.ts +1 -4
- package/dist/src/commands/audit-collisions.d.ts.map +1 -1
- package/dist/src/commands/audit-collisions.js +32 -23
- package/dist/src/commands/audit-collisions.js.map +1 -1
- package/dist/src/commands/audit-sources.action.d.ts +37 -0
- package/dist/src/commands/audit-sources.action.d.ts.map +1 -0
- package/dist/src/commands/audit-sources.action.js +321 -0
- package/dist/src/commands/audit-sources.action.js.map +1 -0
- package/dist/src/commands/audit-sources.d.ts +37 -0
- package/dist/src/commands/audit-sources.d.ts.map +1 -0
- package/dist/src/commands/audit-sources.js +55 -0
- package/dist/src/commands/audit-sources.js.map +1 -0
- package/dist/src/commands/audit-sources.test.d.ts +9 -0
- package/dist/src/commands/audit-sources.test.d.ts.map +1 -0
- package/dist/src/commands/audit-sources.test.js +228 -0
- package/dist/src/commands/audit-sources.test.js.map +1 -0
- package/dist/src/commands/audit.d.ts +2 -6
- package/dist/src/commands/audit.d.ts.map +1 -1
- package/dist/src/commands/audit.js +52 -31
- package/dist/src/commands/audit.js.map +1 -1
- package/dist/src/commands/author/index.d.ts +2 -1
- package/dist/src/commands/author/index.d.ts.map +1 -1
- package/dist/src/commands/author/index.js +4 -1
- package/dist/src/commands/author/index.js.map +1 -1
- package/dist/src/commands/author/init.action.d.ts +29 -0
- package/dist/src/commands/author/init.action.d.ts.map +1 -0
- package/dist/src/commands/author/init.action.js +131 -0
- package/dist/src/commands/author/init.action.js.map +1 -0
- package/dist/src/commands/author/init.d.ts +0 -14
- package/dist/src/commands/author/init.d.ts.map +1 -1
- package/dist/src/commands/author/init.js +3 -87
- package/dist/src/commands/author/init.js.map +1 -1
- package/dist/src/commands/author/mcp-init.d.ts +1 -0
- package/dist/src/commands/author/mcp-init.d.ts.map +1 -1
- package/dist/src/commands/author/mcp-init.js +21 -13
- package/dist/src/commands/author/mcp-init.js.map +1 -1
- package/dist/src/commands/author/subagent.d.ts +1 -0
- package/dist/src/commands/author/subagent.d.ts.map +1 -1
- package/dist/src/commands/author/subagent.js +23 -15
- package/dist/src/commands/author/subagent.js.map +1 -1
- package/dist/src/commands/author/transform.d.ts +1 -0
- package/dist/src/commands/author/transform.d.ts.map +1 -1
- package/dist/src/commands/author/transform.js +23 -15
- package/dist/src/commands/author/transform.js.map +1 -1
- package/dist/src/commands/config.d.ts +2 -0
- package/dist/src/commands/config.d.ts.map +1 -1
- package/dist/src/commands/config.js +43 -28
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/create.d.ts +1 -0
- package/dist/src/commands/create.d.ts.map +1 -1
- package/dist/src/commands/create.js +28 -19
- package/dist/src/commands/create.js.map +1 -1
- package/dist/src/commands/diff.d.ts +4 -0
- package/dist/src/commands/diff.d.ts.map +1 -1
- package/dist/src/commands/diff.js +90 -54
- package/dist/src/commands/diff.js.map +1 -1
- package/dist/src/commands/diff.test.js +52 -0
- package/dist/src/commands/diff.test.js.map +1 -1
- package/dist/src/commands/import-local.d.ts +7 -0
- package/dist/src/commands/import-local.d.ts.map +1 -1
- package/dist/src/commands/import-local.js +43 -34
- package/dist/src/commands/import-local.js.map +1 -1
- package/dist/src/commands/import.d.ts +6 -0
- package/dist/src/commands/import.d.ts.map +1 -1
- package/dist/src/commands/import.js +23 -14
- package/dist/src/commands/import.js.map +1 -1
- package/dist/src/commands/info.d.ts +7 -0
- package/dist/src/commands/info.d.ts.map +1 -1
- package/dist/src/commands/info.js +77 -68
- package/dist/src/commands/info.js.map +1 -1
- package/dist/src/commands/install-skill.d.ts +3 -0
- package/dist/src/commands/install-skill.d.ts.map +1 -1
- package/dist/src/commands/install-skill.js +23 -15
- package/dist/src/commands/install-skill.js.map +1 -1
- package/dist/src/commands/install.d.ts +21 -0
- package/dist/src/commands/install.d.ts.map +1 -1
- package/dist/src/commands/install.js +154 -139
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/login.d.ts +4 -0
- package/dist/src/commands/login.d.ts.map +1 -1
- package/dist/src/commands/login.js +56 -47
- package/dist/src/commands/login.js.map +1 -1
- package/dist/src/commands/logout.d.ts +1 -0
- package/dist/src/commands/logout.d.ts.map +1 -1
- package/dist/src/commands/logout.js +36 -27
- package/dist/src/commands/logout.js.map +1 -1
- package/dist/src/commands/manage.d.ts +3 -9
- package/dist/src/commands/manage.d.ts.map +1 -1
- package/dist/src/commands/manage.js +69 -45
- package/dist/src/commands/manage.js.map +1 -1
- package/dist/src/commands/merge.d.ts +7 -0
- package/dist/src/commands/merge.d.ts.map +1 -1
- package/dist/src/commands/merge.js +117 -108
- package/dist/src/commands/merge.js.map +1 -1
- package/dist/src/commands/pin.d.ts +2 -0
- package/dist/src/commands/pin.d.ts.map +1 -1
- package/dist/src/commands/pin.js +88 -73
- package/dist/src/commands/pin.js.map +1 -1
- package/dist/src/commands/recommend.d.ts +1 -0
- package/dist/src/commands/recommend.d.ts.map +1 -1
- package/dist/src/commands/recommend.js +35 -27
- package/dist/src/commands/recommend.js.map +1 -1
- package/dist/src/commands/search-formatters.d.ts +1 -0
- package/dist/src/commands/search-formatters.d.ts.map +1 -1
- package/dist/src/commands/search-formatters.js +3 -0
- package/dist/src/commands/search-formatters.js.map +1 -1
- package/dist/src/commands/search.action.d.ts +16 -0
- package/dist/src/commands/search.action.d.ts.map +1 -0
- package/dist/src/commands/search.action.js +384 -0
- package/dist/src/commands/search.action.js.map +1 -0
- package/dist/src/commands/search.d.ts +3 -0
- package/dist/src/commands/search.d.ts.map +1 -1
- package/dist/src/commands/search.js +5 -354
- package/dist/src/commands/search.js.map +1 -1
- package/dist/src/commands/sync.action.d.ts +39 -0
- package/dist/src/commands/sync.action.d.ts.map +1 -0
- package/dist/src/commands/sync.action.js +353 -0
- package/dist/src/commands/sync.action.js.map +1 -0
- package/dist/src/commands/sync.d.ts +3 -0
- package/dist/src/commands/sync.d.ts.map +1 -1
- package/dist/src/commands/sync.js +8 -310
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/telemetry.action.d.ts +38 -0
- package/dist/src/commands/telemetry.action.d.ts.map +1 -0
- package/dist/src/commands/telemetry.action.js +350 -0
- package/dist/src/commands/telemetry.action.js.map +1 -0
- package/dist/src/commands/telemetry.d.ts +5 -13
- package/dist/src/commands/telemetry.d.ts.map +1 -1
- package/dist/src/commands/telemetry.js +13 -302
- package/dist/src/commands/telemetry.js.map +1 -1
- package/dist/src/commands/whoami.d.ts +1 -0
- package/dist/src/commands/whoami.d.ts.map +1 -1
- package/dist/src/commands/whoami.js +29 -21
- package/dist/src/commands/whoami.js.map +1 -1
- package/dist/src/utils/open-database.d.ts +10 -2
- package/dist/src/utils/open-database.d.ts.map +1 -1
- package/dist/src/utils/open-database.js +15 -2
- package/dist/src/utils/open-database.js.map +1 -1
- package/dist/src/utils/skills-directory.d.ts.map +1 -1
- package/dist/src/utils/skills-directory.js +5 -1
- package/dist/src/utils/skills-directory.js.map +1 -1
- package/dist/tests/e2e/audit-sources-affix.test.d.ts +11 -0
- package/dist/tests/e2e/audit-sources-affix.test.d.ts.map +1 -0
- package/dist/tests/e2e/audit-sources-affix.test.js +121 -0
- package/dist/tests/e2e/audit-sources-affix.test.js.map +1 -0
- package/dist/tests/e2e/audit-sources-apply.test.d.ts +13 -0
- package/dist/tests/e2e/audit-sources-apply.test.d.ts.map +1 -0
- package/dist/tests/e2e/audit-sources-apply.test.js +166 -0
- package/dist/tests/e2e/audit-sources-apply.test.js.map +1 -0
- package/dist/tests/e2e/audit-sources-recovery.test.d.ts +15 -0
- package/dist/tests/e2e/audit-sources-recovery.test.d.ts.map +1 -0
- package/dist/tests/e2e/audit-sources-recovery.test.js +179 -0
- package/dist/tests/e2e/audit-sources-recovery.test.js.map +1 -0
- package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts +23 -0
- package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts.map +1 -0
- package/dist/tests/e2e/audit-sources-roundtrip.test.js +139 -0
- package/dist/tests/e2e/audit-sources-roundtrip.test.js.map +1 -0
- package/dist/tests/e2e/utils/source-recovery-fixture.d.ts +49 -0
- package/dist/tests/e2e/utils/source-recovery-fixture.d.ts.map +1 -0
- package/dist/tests/e2e/utils/source-recovery-fixture.js +106 -0
- package/dist/tests/e2e/utils/source-recovery-fixture.js.map +1 -0
- package/dist/tests/init.test.js +2 -1
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/install-quarantine.test.d.ts +10 -0
- package/dist/tests/install-quarantine.test.d.ts.map +1 -0
- package/dist/tests/install-quarantine.test.js +86 -0
- package/dist/tests/install-quarantine.test.js.map +1 -0
- 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":"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"}
|
|
@@ -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
|
|
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"}
|