@skillsmith/cli 0.6.3 → 0.6.4
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 +5 -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 +300 -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 +57 -42
- package/dist/src/commands/diff.js.map +1 -1
- package/dist/src/commands/diff.test.js +30 -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-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 +107 -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
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* @fileoverview `skillsmith telemetry` command group — opt-in telemetry management.
|
|
3
3
|
* @module @skillsmith/cli/commands/telemetry
|
|
4
4
|
* @see SMI-5021 Wave 3 Step 2 — CLI subcommands for telemetry (plan lines 195–196, 576)
|
|
5
|
+
* @see SMI-5128 batch D — action impls + run* logic moved to telemetry.action.ts
|
|
6
|
+
* (sibling-split convention) so the 6 subcommand handlers are withTelemetry-
|
|
7
|
+
* wrapped without this file exceeding the 500-LOC gate. This file retains the
|
|
8
|
+
* commander factory and re-exports the run* test helpers for back-compat.
|
|
5
9
|
*
|
|
6
10
|
* Subcommands:
|
|
7
11
|
* skillsmith telemetry enable
|
|
@@ -20,245 +24,8 @@
|
|
|
20
24
|
* - Refuses on foreign Skill matcher (security gate)
|
|
21
25
|
* - manifest read/write always via loadManifest / saveManifest (atomic rename)
|
|
22
26
|
*/
|
|
23
|
-
import { existsSync, copyFileSync, chmodSync, mkdirSync } from 'node:fs';
|
|
24
|
-
import { homedir } from 'node:os';
|
|
25
|
-
import { join, dirname } from 'node:path';
|
|
26
|
-
import { fileURLToPath } from 'node:url';
|
|
27
|
-
import { readdirSync, unlinkSync, statSync } from 'node:fs';
|
|
28
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
29
27
|
import { Command } from 'commander';
|
|
30
|
-
import
|
|
31
|
-
import { loadManifest, saveManifest, generateAnonymousId, shouldRotateAnonymousId, rotateAnonymousId, sweepExpiredPreviousId, } from '../utils/manifest.js';
|
|
32
|
-
import { loadClaudeSettings, addSkillHookEntries, removeSkillHookEntries, writeClaudeSettings, TelemetryHookError, } from './telemetry.helpers.js';
|
|
33
|
-
import { sanitizeError } from '../utils/sanitize.js';
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
// Constants
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
const PRIVACY_URL = 'https://skillsmith.app/privacy#telemetry';
|
|
38
|
-
const DEFAULT_ENDPOINT = 'https://vrcnzpmndtroqxxoqkzy.supabase.co/functions/v1/events';
|
|
39
|
-
const ORPHAN_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
40
|
-
// All path helpers resolved at call time so test harnesses that swap HOME work.
|
|
41
|
-
function hookScriptPath() {
|
|
42
|
-
return join(homedir(), '.skillsmith', 'hooks', 'skill-telemetry.sh');
|
|
43
|
-
}
|
|
44
|
-
function runDir() {
|
|
45
|
-
return join(homedir(), '.skillsmith', 'run');
|
|
46
|
-
}
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
// Privacy helper — NEVER print full anonymousId
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
function idTail(id) {
|
|
51
|
-
if (!id)
|
|
52
|
-
return '(none)';
|
|
53
|
-
return `...${id.slice(-8)}`;
|
|
54
|
-
}
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
// Orphan GC (plan line 714)
|
|
57
|
-
// ---------------------------------------------------------------------------
|
|
58
|
-
function gcOrphanRunFiles() {
|
|
59
|
-
try {
|
|
60
|
-
const dir = runDir();
|
|
61
|
-
if (!existsSync(dir))
|
|
62
|
-
return;
|
|
63
|
-
const now = Date.now();
|
|
64
|
-
for (const f of readdirSync(dir)) {
|
|
65
|
-
if (!f.startsWith('skill-'))
|
|
66
|
-
continue;
|
|
67
|
-
const fp = join(dir, f);
|
|
68
|
-
try {
|
|
69
|
-
const st = statSync(fp);
|
|
70
|
-
if (now - st.mtimeMs > ORPHAN_TTL_MS)
|
|
71
|
-
unlinkSync(fp);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// best-effort
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// never throw from GC
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
// enable
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
async function runEnable() {
|
|
86
|
-
const manifest = await loadManifest();
|
|
87
|
-
const t = manifest.telemetry ?? { enabled: false };
|
|
88
|
-
if (t.enabled) {
|
|
89
|
-
console.log(chalk.green('Telemetry is already enabled.'));
|
|
90
|
-
console.log(chalk.dim(` Anonymous ID tail: ${idTail(t.anonymousId)}`));
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const now = new Date().toISOString();
|
|
94
|
-
const updated = {
|
|
95
|
-
...t,
|
|
96
|
-
enabled: true,
|
|
97
|
-
anonymousId: t.anonymousId ?? generateAnonymousId(),
|
|
98
|
-
anonymousIdCreatedAt: t.anonymousIdCreatedAt ?? now,
|
|
99
|
-
scope: t.scope ?? 'personal',
|
|
100
|
-
endpoint: t.endpoint ?? DEFAULT_ENDPOINT,
|
|
101
|
-
};
|
|
102
|
-
await saveManifest({ ...manifest, telemetry: updated });
|
|
103
|
-
console.log(chalk.green('Telemetry enabled.'));
|
|
104
|
-
console.log();
|
|
105
|
-
console.log('Skillsmith telemetry collects anonymous skill-invocation counts to help improve\n' +
|
|
106
|
-
'the registry and surface stale skills. No personal data, file contents, or\n' +
|
|
107
|
-
`paths are captured. Full privacy policy: ${chalk.cyan(PRIVACY_URL)}`);
|
|
108
|
-
console.log();
|
|
109
|
-
console.log(chalk.dim(` Anonymous ID tail: ${idTail(updated.anonymousId)}`));
|
|
110
|
-
console.log(chalk.dim(' Disable at any time: ') + chalk.cyan('skillsmith telemetry disable'));
|
|
111
|
-
}
|
|
112
|
-
// ---------------------------------------------------------------------------
|
|
113
|
-
// disable
|
|
114
|
-
// ---------------------------------------------------------------------------
|
|
115
|
-
async function runDisable() {
|
|
116
|
-
const manifest = await loadManifest();
|
|
117
|
-
const t = manifest.telemetry ?? { enabled: false };
|
|
118
|
-
if (!t.enabled) {
|
|
119
|
-
console.log(chalk.dim('Telemetry is already disabled.'));
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
await saveManifest({ ...manifest, telemetry: { ...t, enabled: false } });
|
|
123
|
-
console.log(chalk.yellow('Telemetry disabled.'));
|
|
124
|
-
console.log(chalk.dim(' The anonymous ID is retained in the local manifest for continuity if you re-enable.\n' +
|
|
125
|
-
' To fully clear it: skillsmith telemetry reset-id'));
|
|
126
|
-
}
|
|
127
|
-
// ---------------------------------------------------------------------------
|
|
128
|
-
// status
|
|
129
|
-
// ---------------------------------------------------------------------------
|
|
130
|
-
async function runStatus() {
|
|
131
|
-
let manifest = await loadManifest();
|
|
132
|
-
let rotationTriggered = false;
|
|
133
|
-
// Annual auto-rotation (plan line 706, 713)
|
|
134
|
-
if (shouldRotateAnonymousId(manifest)) {
|
|
135
|
-
const rotated = rotateAnonymousId(manifest);
|
|
136
|
-
manifest = { ...manifest, telemetry: rotated };
|
|
137
|
-
await saveManifest(manifest);
|
|
138
|
-
rotationTriggered = true;
|
|
139
|
-
}
|
|
140
|
-
// Sweep expired previous id
|
|
141
|
-
const swept = sweepExpiredPreviousId(manifest);
|
|
142
|
-
if (swept !== manifest.telemetry) {
|
|
143
|
-
manifest = { ...manifest, telemetry: swept };
|
|
144
|
-
await saveManifest(manifest);
|
|
145
|
-
}
|
|
146
|
-
// GC orphan run files (plan line 714)
|
|
147
|
-
gcOrphanRunFiles();
|
|
148
|
-
const t = manifest.telemetry ?? { enabled: false };
|
|
149
|
-
const endpoint = t.endpoint ?? DEFAULT_ENDPOINT;
|
|
150
|
-
let ageDays = null;
|
|
151
|
-
if (t.anonymousIdCreatedAt) {
|
|
152
|
-
ageDays = Math.floor((Date.now() - new Date(t.anonymousIdCreatedAt).getTime()) / 86_400_000);
|
|
153
|
-
}
|
|
154
|
-
console.log(chalk.bold('Skillsmith Telemetry Status'));
|
|
155
|
-
console.log();
|
|
156
|
-
console.log(` Enabled: ${t.enabled ? chalk.green('yes') : chalk.dim('no')}`);
|
|
157
|
-
console.log(` Endpoint: ${chalk.dim(endpoint)}`);
|
|
158
|
-
console.log(` Anonymous ID: ${chalk.dim(idTail(t.anonymousId))}`);
|
|
159
|
-
console.log(` ID age (days): ${ageDays !== null ? String(ageDays) : chalk.dim('n/a')}`);
|
|
160
|
-
console.log(` Scope: ${t.scope ?? chalk.dim('personal')}`);
|
|
161
|
-
if (t.installedAt) {
|
|
162
|
-
console.log(` Hook installed: ${chalk.dim(t.installedAt)}`);
|
|
163
|
-
}
|
|
164
|
-
if (rotationTriggered) {
|
|
165
|
-
console.log();
|
|
166
|
-
console.log(chalk.yellow(' Annual rotation triggered.') +
|
|
167
|
-
chalk.dim(' New ID tail: ') +
|
|
168
|
-
chalk.cyan(idTail(t.anonymousId)));
|
|
169
|
-
if (t.previousAnonymousId) {
|
|
170
|
-
console.log(chalk.dim(` Previous ID retained for 7-day overlap window (retired: ${t.previousAnonymousIdRetiredAt ?? 'unknown'})`));
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
|
-
// install-hook
|
|
176
|
-
// ---------------------------------------------------------------------------
|
|
177
|
-
async function runInstallHook(options) {
|
|
178
|
-
// Resolve the template source — relative to this file's compiled output.
|
|
179
|
-
// src/commands/telemetry.ts → ../../templates/skill-telemetry.sh (via dist/commands)
|
|
180
|
-
// and one level up for the src layout during tests.
|
|
181
|
-
const templateCandidates = [
|
|
182
|
-
join(__dirname, '..', '..', 'templates', 'skill-telemetry.sh'),
|
|
183
|
-
join(__dirname, '..', 'templates', 'skill-telemetry.sh'),
|
|
184
|
-
];
|
|
185
|
-
const templateSrc = templateCandidates.find((p) => existsSync(p));
|
|
186
|
-
if (!templateSrc) {
|
|
187
|
-
throw new Error('skill-telemetry.sh template not found. ' +
|
|
188
|
-
'Ensure the CLI package is fully built: npm run build');
|
|
189
|
-
}
|
|
190
|
-
// Load + validate settings.json — throws TelemetryHookError on foreign Skill matcher
|
|
191
|
-
const scope = options.scope;
|
|
192
|
-
const settings = loadClaudeSettings(scope);
|
|
193
|
-
const hookPath = hookScriptPath();
|
|
194
|
-
const updated = addSkillHookEntries(settings, hookPath);
|
|
195
|
-
// Copy hook script to ~/.skillsmith/hooks/
|
|
196
|
-
const destPath = hookScriptPath();
|
|
197
|
-
const hooksDir = dirname(destPath);
|
|
198
|
-
mkdirSync(hooksDir, { recursive: true, mode: 0o700 });
|
|
199
|
-
copyFileSync(templateSrc, destPath);
|
|
200
|
-
try {
|
|
201
|
-
chmodSync(destPath, 0o755);
|
|
202
|
-
}
|
|
203
|
-
catch {
|
|
204
|
-
// best-effort on Windows
|
|
205
|
-
}
|
|
206
|
-
// Persist settings.json atomically
|
|
207
|
-
writeClaudeSettings(scope, updated);
|
|
208
|
-
// Record installation timestamp in manifest
|
|
209
|
-
const manifest = await loadManifest();
|
|
210
|
-
const t = manifest.telemetry ?? { enabled: false };
|
|
211
|
-
await saveManifest({ ...manifest, telemetry: { ...t, installedAt: new Date().toISOString() } });
|
|
212
|
-
// Update endpoint in manifest if provided
|
|
213
|
-
if (options.endpoint) {
|
|
214
|
-
const m2 = await loadManifest();
|
|
215
|
-
const t2 = m2.telemetry ?? { enabled: false };
|
|
216
|
-
await saveManifest({ ...m2, telemetry: { ...t2, endpoint: options.endpoint } });
|
|
217
|
-
}
|
|
218
|
-
const scopeLabel = scope === 'user' ? '~/.claude/settings.json' : './.claude/settings.json';
|
|
219
|
-
console.log(chalk.green('Skillsmith telemetry hook installed.'));
|
|
220
|
-
console.log(chalk.dim(` Hook script: ${destPath}`));
|
|
221
|
-
console.log(chalk.dim(` Settings file: ${scopeLabel}`));
|
|
222
|
-
console.log();
|
|
223
|
-
console.log(chalk.dim('Enable telemetry to start collecting: ') + chalk.cyan('skillsmith telemetry enable'));
|
|
224
|
-
}
|
|
225
|
-
// ---------------------------------------------------------------------------
|
|
226
|
-
// uninstall-hook
|
|
227
|
-
// ---------------------------------------------------------------------------
|
|
228
|
-
async function runUninstallHook(options) {
|
|
229
|
-
const scope = options.scope;
|
|
230
|
-
const hookPath = hookScriptPath();
|
|
231
|
-
const settings = loadClaudeSettings(scope);
|
|
232
|
-
const updated = removeSkillHookEntries(settings, hookPath);
|
|
233
|
-
writeClaudeSettings(scope, updated);
|
|
234
|
-
// Optionally remove the script file
|
|
235
|
-
try {
|
|
236
|
-
const scriptPath = hookScriptPath();
|
|
237
|
-
if (existsSync(scriptPath))
|
|
238
|
-
unlinkSync(scriptPath);
|
|
239
|
-
}
|
|
240
|
-
catch {
|
|
241
|
-
// best-effort
|
|
242
|
-
}
|
|
243
|
-
const scopeLabel = scope === 'user' ? '~/.claude/settings.json' : './.claude/settings.json';
|
|
244
|
-
console.log(chalk.yellow('Skillsmith telemetry hook removed.'));
|
|
245
|
-
console.log(chalk.dim(` Removed from: ${scopeLabel}`));
|
|
246
|
-
console.log(chalk.dim(' Foreign hooks (if any) were not touched.'));
|
|
247
|
-
}
|
|
248
|
-
// ---------------------------------------------------------------------------
|
|
249
|
-
// reset-id
|
|
250
|
-
// ---------------------------------------------------------------------------
|
|
251
|
-
async function runResetId() {
|
|
252
|
-
const manifest = await loadManifest();
|
|
253
|
-
const rotated = rotateAnonymousId(manifest); // unconditional rotation
|
|
254
|
-
await saveManifest({ ...manifest, telemetry: rotated });
|
|
255
|
-
console.log(chalk.green('Anonymous ID rotated.'));
|
|
256
|
-
console.log(chalk.dim(` New ID tail: ${idTail(rotated.anonymousId)}`));
|
|
257
|
-
if (rotated.previousAnonymousId) {
|
|
258
|
-
console.log(chalk.dim(` Previous ID tail: ${idTail(rotated.previousAnonymousId)}`));
|
|
259
|
-
console.log(chalk.dim(` Previous ID retirement: ${rotated.previousAnonymousIdRetiredAt ?? 'unknown'} (7-day overlap window)`));
|
|
260
|
-
}
|
|
261
|
-
}
|
|
28
|
+
import { telemetryEnableAction, telemetryDisableAction, telemetryStatusAction, telemetryInstallHookAction, telemetryUninstallHookAction, telemetryResetIdAction, } from './telemetry.action.js';
|
|
262
29
|
// ---------------------------------------------------------------------------
|
|
263
30
|
// Command factory
|
|
264
31
|
// ---------------------------------------------------------------------------
|
|
@@ -267,88 +34,32 @@ export function createTelemetryCommand() {
|
|
|
267
34
|
telemetry
|
|
268
35
|
.command('enable')
|
|
269
36
|
.description('Opt in to anonymous skill-invocation telemetry')
|
|
270
|
-
.action(
|
|
271
|
-
try {
|
|
272
|
-
await runEnable();
|
|
273
|
-
}
|
|
274
|
-
catch (err) {
|
|
275
|
-
console.error(chalk.red('Error:'), sanitizeError(err));
|
|
276
|
-
process.exit(1);
|
|
277
|
-
}
|
|
278
|
-
});
|
|
37
|
+
.action(telemetryEnableAction);
|
|
279
38
|
telemetry
|
|
280
39
|
.command('disable')
|
|
281
40
|
.description('Opt out of telemetry (anonymous ID is retained for re-enable continuity)')
|
|
282
|
-
.action(
|
|
283
|
-
try {
|
|
284
|
-
await runDisable();
|
|
285
|
-
}
|
|
286
|
-
catch (err) {
|
|
287
|
-
console.error(chalk.red('Error:'), sanitizeError(err));
|
|
288
|
-
process.exit(1);
|
|
289
|
-
}
|
|
290
|
-
});
|
|
41
|
+
.action(telemetryDisableAction);
|
|
291
42
|
telemetry
|
|
292
43
|
.command('status')
|
|
293
44
|
.description('Show current telemetry state; triggers annual ID rotation if due')
|
|
294
|
-
.action(
|
|
295
|
-
try {
|
|
296
|
-
await runStatus();
|
|
297
|
-
}
|
|
298
|
-
catch (err) {
|
|
299
|
-
console.error(chalk.red('Error:'), sanitizeError(err));
|
|
300
|
-
process.exit(1);
|
|
301
|
-
}
|
|
302
|
-
});
|
|
45
|
+
.action(telemetryStatusAction);
|
|
303
46
|
telemetry
|
|
304
47
|
.command('install-hook')
|
|
305
48
|
.description('Install the Skill telemetry hook into ~/.claude/settings.json')
|
|
306
49
|
.option('--scope <scope>', 'Settings scope: user (~/.claude/settings.json) or project (./.claude/settings.json)', 'user')
|
|
307
50
|
.option('--endpoint <url>', 'Override the telemetry endpoint (default: prod Supabase events)')
|
|
308
|
-
.action(
|
|
309
|
-
const scope = options.scope === 'project' ? 'project' : 'user';
|
|
310
|
-
try {
|
|
311
|
-
await runInstallHook(options.endpoint !== undefined ? { scope, endpoint: options.endpoint } : { scope });
|
|
312
|
-
}
|
|
313
|
-
catch (err) {
|
|
314
|
-
if (err instanceof TelemetryHookError) {
|
|
315
|
-
console.error(chalk.red(`Error [${err.code}]:`));
|
|
316
|
-
console.error(err.message);
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
console.error(chalk.red('Error:'), sanitizeError(err));
|
|
320
|
-
}
|
|
321
|
-
process.exit(1);
|
|
322
|
-
}
|
|
323
|
-
});
|
|
51
|
+
.action(telemetryInstallHookAction);
|
|
324
52
|
telemetry
|
|
325
53
|
.command('uninstall-hook')
|
|
326
54
|
.description('Remove the Skillsmith Skill hook entries from settings.json')
|
|
327
55
|
.option('--scope <scope>', 'Settings scope: user or project', 'user')
|
|
328
|
-
.action(
|
|
329
|
-
const scope = options.scope === 'project' ? 'project' : 'user';
|
|
330
|
-
try {
|
|
331
|
-
await runUninstallHook({ scope });
|
|
332
|
-
}
|
|
333
|
-
catch (err) {
|
|
334
|
-
console.error(chalk.red('Error:'), sanitizeError(err));
|
|
335
|
-
process.exit(1);
|
|
336
|
-
}
|
|
337
|
-
});
|
|
56
|
+
.action(telemetryUninstallHookAction);
|
|
338
57
|
telemetry
|
|
339
58
|
.command('reset-id')
|
|
340
59
|
.description('Immediately rotate the anonymous ID (previous ID kept for 7-day overlap window)')
|
|
341
|
-
.action(
|
|
342
|
-
try {
|
|
343
|
-
await runResetId();
|
|
344
|
-
}
|
|
345
|
-
catch (err) {
|
|
346
|
-
console.error(chalk.red('Error:'), sanitizeError(err));
|
|
347
|
-
process.exit(1);
|
|
348
|
-
}
|
|
349
|
-
});
|
|
60
|
+
.action(telemetryResetIdAction);
|
|
350
61
|
return telemetry;
|
|
351
62
|
}
|
|
352
|
-
// Internal exports for tests
|
|
353
|
-
export { runEnable, runDisable, runStatus, runInstallHook, runUninstallHook, runResetId, idTail };
|
|
63
|
+
// Internal exports for tests — sourced from telemetry.action.ts (SMI-5128 split).
|
|
64
|
+
export { runEnable, runDisable, runStatus, runInstallHook, runUninstallHook, runResetId, idTail, } from './telemetry.action.js';
|
|
354
65
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/commands/telemetry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/commands/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,uBAAuB,CAAA;AAE9B,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,UAAU,sBAAsB;IACpC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CACpD,2EAA2E,CAC5E,CAAA;IAED,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,qBAAqB,CAAC,CAAA;IAEhC,SAAS;SACN,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0EAA0E,CAAC;SACvF,MAAM,CAAC,sBAAsB,CAAC,CAAA;IAEjC,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,qBAAqB,CAAC,CAAA;IAEhC,SAAS;SACN,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CACL,iBAAiB,EACjB,qFAAqF,EACrF,MAAM,CACP;SACA,MAAM,CAAC,kBAAkB,EAAE,iEAAiE,CAAC;SAC7F,MAAM,CAAC,0BAA0B,CAAC,CAAA;IAErC,SAAS;SACN,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,iBAAiB,EAAE,iCAAiC,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,4BAA4B,CAAC,CAAA;IAEvC,SAAS;SACN,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,iFAAiF,CAAC;SAC9F,MAAM,CAAC,sBAAsB,CAAC,CAAA;IAEjC,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,kFAAkF;AAClF,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,MAAM,GACP,MAAM,uBAAuB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6CnC,eAAO,MAAM,YAAY,qBAIvB,CAAA;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { Command } from 'commander';
|
|
10
10
|
import chalk from 'chalk';
|
|
11
11
|
import { getAuthStatus } from '@skillsmith/core';
|
|
12
|
+
import { withTelemetry } from '@skillsmith/core/telemetry';
|
|
12
13
|
/** Human-readable labels for each credential source */
|
|
13
14
|
const SOURCE_LABELS = {
|
|
14
15
|
keyring: 'OS keyring',
|
|
@@ -16,32 +17,39 @@ const SOURCE_LABELS = {
|
|
|
16
17
|
env: 'environment variable (SKILLSMITH_API_KEY)',
|
|
17
18
|
none: 'none',
|
|
18
19
|
};
|
|
20
|
+
// SMI-5040: extracted from inline .action() closure for withTelemetry wrap.
|
|
21
|
+
async function whoamiActionImpl() {
|
|
22
|
+
const status = await getAuthStatus();
|
|
23
|
+
if (!status.authenticated || !status.keyPrefix) {
|
|
24
|
+
console.log(`Not authenticated. Run ${chalk.cyan('`skillsmith login`')} to authenticate.`);
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
// Mask: show first 12 chars + ellipsis
|
|
28
|
+
// The full key is sk_live_ (8 chars) + 32-128 chars.
|
|
29
|
+
// 12 chars shows "sk_live_xxxx" without revealing the secret suffix.
|
|
30
|
+
const masked = `${status.keyPrefix}...`;
|
|
31
|
+
console.log(chalk.bold('Skillsmith CLI'));
|
|
32
|
+
console.log(chalk.dim(' Key: ') + chalk.cyan(masked));
|
|
33
|
+
console.log(chalk.dim(' Source: ') + (SOURCE_LABELS[status.source] ?? status.source));
|
|
34
|
+
console.log(chalk.dim(' Format: ') + chalk.green('valid'));
|
|
35
|
+
// Hint: when using file fallback, let the user know they can upgrade to keyring
|
|
36
|
+
if (status.source === 'config') {
|
|
37
|
+
console.log(chalk.dim(' Tip: Install @isaacs/keytar for more secure OS keyring storage: ' +
|
|
38
|
+
'npm install -g @isaacs/keytar'));
|
|
39
|
+
}
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
export const whoamiAction = withTelemetry(whoamiActionImpl, {
|
|
43
|
+
source: 'cli',
|
|
44
|
+
extractSkillId: () => 'whoami',
|
|
45
|
+
extractFramework: () => 'cli',
|
|
46
|
+
});
|
|
19
47
|
/**
|
|
20
48
|
* Create the `skillsmith whoami` command.
|
|
21
49
|
*/
|
|
22
50
|
export function createWhoamiCommand() {
|
|
23
51
|
return new Command('whoami')
|
|
24
52
|
.description('Show current authentication status')
|
|
25
|
-
.action(
|
|
26
|
-
const status = await getAuthStatus();
|
|
27
|
-
if (!status.authenticated || !status.keyPrefix) {
|
|
28
|
-
console.log(`Not authenticated. Run ${chalk.cyan('`skillsmith login`')} to authenticate.`);
|
|
29
|
-
process.exit(0);
|
|
30
|
-
}
|
|
31
|
-
// Mask: show first 12 chars + ellipsis
|
|
32
|
-
// The full key is sk_live_ (8 chars) + 32-128 chars.
|
|
33
|
-
// 12 chars shows "sk_live_xxxx" without revealing the secret suffix.
|
|
34
|
-
const masked = `${status.keyPrefix}...`;
|
|
35
|
-
console.log(chalk.bold('Skillsmith CLI'));
|
|
36
|
-
console.log(chalk.dim(' Key: ') + chalk.cyan(masked));
|
|
37
|
-
console.log(chalk.dim(' Source: ') + (SOURCE_LABELS[status.source] ?? status.source));
|
|
38
|
-
console.log(chalk.dim(' Format: ') + chalk.green('valid'));
|
|
39
|
-
// Hint: when using file fallback, let the user know they can upgrade to keyring
|
|
40
|
-
if (status.source === 'config') {
|
|
41
|
-
console.log(chalk.dim(' Tip: Install @isaacs/keytar for more secure OS keyring storage: ' +
|
|
42
|
-
'npm install -g @isaacs/keytar'));
|
|
43
|
-
}
|
|
44
|
-
process.exit(0);
|
|
45
|
-
});
|
|
53
|
+
.action(whoamiAction);
|
|
46
54
|
}
|
|
47
55
|
//# sourceMappingURL=whoami.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,uDAAuD;AACvD,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,yCAAyC;IACjD,GAAG,EAAE,2CAA2C;IAChD,IAAI,EAAE,MAAM;CACb,CAAA;AAED,4EAA4E;AAC5E,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IAEpC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAA;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,uCAAuC;IACvC,qDAAqD;IACrD,qEAAqE;IACrE,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,KAAK,CAAA;IAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;IAE3D,gFAAgF;IAChF,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,uEAAuE;YACrE,+BAA+B,CAClC,CACF,CAAA;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,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;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,YAAY,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -21,7 +21,15 @@ import { type DatabaseType } from '@skillsmith/core';
|
|
|
21
21
|
* bare `createDatabaseAsync` directly.
|
|
22
22
|
*
|
|
23
23
|
* @param path - Filesystem path to the SQLite database (e.g. `DEFAULT_DB_PATH`).
|
|
24
|
-
* @
|
|
24
|
+
* @param options.readonly - SMI-5139: open read-only for pure-read consumers
|
|
25
|
+
* (e.g. version lookups). A read-only handle CANNOT run schema DDL, so
|
|
26
|
+
* `initializeSchema` is skipped — the caller must tolerate an absent schema
|
|
27
|
+
* (queries on a missing table throw, which read consumers already catch).
|
|
28
|
+
* This also prevents the WASM `SqlJsDatabaseAdapter` from persisting (writing)
|
|
29
|
+
* on `close()`, which would throw `EROFS` on an unwritable/absent db path.
|
|
30
|
+
* @returns A connected database. Caller owns `db.close()`.
|
|
25
31
|
*/
|
|
26
|
-
export declare function openCliDatabase(path: string
|
|
32
|
+
export declare function openCliDatabase(path: string, options?: {
|
|
33
|
+
readonly?: boolean;
|
|
34
|
+
}): Promise<DatabaseType>;
|
|
27
35
|
//# sourceMappingURL=open-database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-database.d.ts","sourceRoot":"","sources":["../../../src/utils/open-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAA;AAGzB
|
|
1
|
+
{"version":3,"file":"open-database.d.ts","sourceRoot":"","sources":["../../../src/utils/open-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAA;AAGzB;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,OAAO,CAAC,YAAY,CAAC,CAwCvB"}
|
|
@@ -22,9 +22,22 @@ import { existsSync } from 'node:fs';
|
|
|
22
22
|
* bare `createDatabaseAsync` directly.
|
|
23
23
|
*
|
|
24
24
|
* @param path - Filesystem path to the SQLite database (e.g. `DEFAULT_DB_PATH`).
|
|
25
|
-
* @
|
|
25
|
+
* @param options.readonly - SMI-5139: open read-only for pure-read consumers
|
|
26
|
+
* (e.g. version lookups). A read-only handle CANNOT run schema DDL, so
|
|
27
|
+
* `initializeSchema` is skipped — the caller must tolerate an absent schema
|
|
28
|
+
* (queries on a missing table throw, which read consumers already catch).
|
|
29
|
+
* This also prevents the WASM `SqlJsDatabaseAdapter` from persisting (writing)
|
|
30
|
+
* on `close()`, which would throw `EROFS` on an unwritable/absent db path.
|
|
31
|
+
* @returns A connected database. Caller owns `db.close()`.
|
|
26
32
|
*/
|
|
27
|
-
export async function openCliDatabase(path) {
|
|
33
|
+
export async function openCliDatabase(path, options) {
|
|
34
|
+
// SMI-5139: read-only consumers open read-only and skip schema init (DDL is
|
|
35
|
+
// impossible on a read-only handle; sql.js close() then skips persist()).
|
|
36
|
+
// The open itself may throw (native better-sqlite3 read-only-opens of an
|
|
37
|
+
// absent file throw) — that is the caller's signal to degrade gracefully.
|
|
38
|
+
if (options?.readonly) {
|
|
39
|
+
return createDatabaseAsync(path, { readonly: true });
|
|
40
|
+
}
|
|
28
41
|
let db;
|
|
29
42
|
try {
|
|
30
43
|
db = await createDatabaseAsync(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-database.js","sourceRoot":"","sources":["../../../src/utils/open-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC
|
|
1
|
+
{"version":3,"file":"open-database.js","sourceRoot":"","sources":["../../../src/utils/open-database.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GAEpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,OAAgC;IAEhC,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,EAA4B,CAAA;IAChC,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA;QACpC,gBAAgB,CAAC,EAAE,CAAC,CAAA;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,GAAG,CAAA;QACX,CAAC;QACD,sEAAsE;QACtE,4BAA4B;QAC5B,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAA;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CACV,sCAAsC,IAAI,wCAAwC;YAChF,4BAA4B,UAAU,wCAAwC,CACjF,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAC7C,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACvB,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-directory.d.ts","sourceRoot":"","sources":["../../../src/utils/skills-directory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAA;AAGjC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAA;CACjC;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,GAAE,QAAQ,GAAG,OAA0B,GAClD,OAAO,CAAC,cAAc,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"skills-directory.d.ts","sourceRoot":"","sources":["../../../src/utils/skills-directory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAA;AAGjC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAA;CACjC;AAiBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,GAAE,QAAQ,GAAG,OAA0B,GAClD,OAAO,CAAC,cAAc,EAAE,CAAC,CAsG3B;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwCnF"}
|
|
@@ -42,7 +42,11 @@ export async function getSkillsFromDirectory(skillsDir, dbPath, installedVia = C
|
|
|
42
42
|
let dbConn = null;
|
|
43
43
|
if (dbPath) {
|
|
44
44
|
try {
|
|
45
|
-
|
|
45
|
+
// SMI-5139: this is a pure-read version lookup — open read-only so the
|
|
46
|
+
// WASM driver does not persist (write) on close() and throw EROFS when
|
|
47
|
+
// dbPath is unwritable/absent. A read-only open of an absent db throws
|
|
48
|
+
// (native driver), which the catch below degrades to hasUpdates: false.
|
|
49
|
+
dbConn = await openCliDatabase(dbPath, { readonly: true });
|
|
46
50
|
versionRepo = new SkillVersionRepository(dbConn);
|
|
47
51
|
}
|
|
48
52
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-directory.js","sourceRoot":"","sources":["../../../src/utils/skills-directory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EACL,WAAW,EACX,sBAAsB,GAGvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,mBAAmB,GAEpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAiB9C;;;;;GAKG;AAEH;;;GAGG;AACH,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAiB,EACjB,MAAe,EACf,eAAmC,gBAAgB;IAEnD,MAAM,MAAM,GAAqB,EAAE,CAAA;IAEnC,wDAAwD;IACxD,IAAI,WAAW,GAAkC,IAAI,CAAA;IACrD,IAAI,MAAM,GAAoB,IAAI,CAAA;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"skills-directory.js","sourceRoot":"","sources":["../../../src/utils/skills-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SMI-5407 end-to-end — `sklx audit sources --apply` write paths.
|
|
3
|
+
*
|
|
4
|
+
* Real temp manifest (redirected via $HOME) + real temp SQLite. Covers:
|
|
5
|
+
* 3. Collision safety — ambiguous low match is NOT auto-written; `--set` then
|
|
6
|
+
* writes the user-specified owner/skill-name id + https source.
|
|
7
|
+
* 6. Idempotency + never-clobber — a second `--apply` is a no-op; a pre-existing
|
|
8
|
+
* healthy entry with a differing source is left untouched.
|
|
9
|
+
* 8. --write-frontmatter churn guard — never writes `repository:` into a `.git`
|
|
10
|
+
* dir or when one already exists; DOES write into a non-git dir lacking it.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=audit-sources-apply.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sources-apply.test.d.ts","sourceRoot":"","sources":["../../../tests/e2e/audit-sources-apply.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|