@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,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SMI-5413 e2e — affix-tolerant registry-name recovery.
|
|
3
|
+
*
|
|
4
|
+
* A skill installed under a SHORT local dir name (`affixdemo`) is recovered from
|
|
5
|
+
* its `claude-skill-affixdemo` registry entry; an EXACT name match is preferred
|
|
6
|
+
* over affix variants so a clean hit is never downgraded to ambiguous. Real temp
|
|
7
|
+
* filesystem + real temp SQLite (seeded `skills`); $HOME redirected before the
|
|
8
|
+
* dynamic import so the action's module-level MANIFEST_PATH freezes onto it.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as os from 'node:os';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import { skillMd, seedSkillsDb } from './utils/source-recovery-fixture.js';
|
|
15
|
+
let runAuditSources;
|
|
16
|
+
let tempHome = '';
|
|
17
|
+
let originalHome;
|
|
18
|
+
beforeAll(async () => {
|
|
19
|
+
originalHome = process.env['HOME'];
|
|
20
|
+
tempHome = fs.mkdtempSync(path.join(os.tmpdir(), 'smi5413-home-'));
|
|
21
|
+
process.env['HOME'] = tempHome;
|
|
22
|
+
({ runAuditSources } = await import('../../src/commands/audit-sources.action.js'));
|
|
23
|
+
});
|
|
24
|
+
afterAll(() => {
|
|
25
|
+
if (originalHome === undefined)
|
|
26
|
+
delete process.env['HOME'];
|
|
27
|
+
else
|
|
28
|
+
process.env['HOME'] = originalHome;
|
|
29
|
+
if (tempHome)
|
|
30
|
+
fs.rmSync(tempHome, { recursive: true, force: true });
|
|
31
|
+
});
|
|
32
|
+
function writeLocalSkill(root, name) {
|
|
33
|
+
const dir = path.join(root, name);
|
|
34
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
35
|
+
fs.writeFileSync(path.join(dir, 'SKILL.md'), skillMd(name));
|
|
36
|
+
}
|
|
37
|
+
function makeOpts(skillsRoot, db) {
|
|
38
|
+
return {
|
|
39
|
+
skillsRoot,
|
|
40
|
+
apply: false,
|
|
41
|
+
yes: false,
|
|
42
|
+
set: undefined,
|
|
43
|
+
minConfidence: 'high',
|
|
44
|
+
json: true,
|
|
45
|
+
embedding: false,
|
|
46
|
+
catalogHint: false,
|
|
47
|
+
writeFrontmatter: false,
|
|
48
|
+
forceWriteFrontmatter: false,
|
|
49
|
+
db,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function recover(skillsRoot, db) {
|
|
53
|
+
const chunks = [];
|
|
54
|
+
const spy = vi
|
|
55
|
+
.spyOn(process.stdout, 'write')
|
|
56
|
+
.mockImplementation((chunk) => {
|
|
57
|
+
chunks.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf-8'));
|
|
58
|
+
return true;
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
await runAuditSources(makeOpts(skillsRoot, db));
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
spy.mockRestore();
|
|
65
|
+
}
|
|
66
|
+
return JSON.parse(chunks.join('').trim()).skills;
|
|
67
|
+
}
|
|
68
|
+
function tmpRoot(tag) {
|
|
69
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), `smi5413-${tag}-`));
|
|
70
|
+
}
|
|
71
|
+
function tmpDb(tag) {
|
|
72
|
+
return path.join(fs.mkdtempSync(path.join(os.tmpdir(), `smi5413-db-${tag}-`)), 'skills.db');
|
|
73
|
+
}
|
|
74
|
+
describe('SMI-5413 e2e — affix-tolerant registry-name recovery', () => {
|
|
75
|
+
it('recovers a short local name from its claude-skill-<name> registry entry', async () => {
|
|
76
|
+
const root = tmpRoot('affix');
|
|
77
|
+
writeLocalSkill(root, 'affixdemo');
|
|
78
|
+
const db = tmpDb('affix');
|
|
79
|
+
await seedSkillsDb(db, [
|
|
80
|
+
{
|
|
81
|
+
id: 'uuid-affix',
|
|
82
|
+
name: 'claude-skill-affixdemo',
|
|
83
|
+
repoUrl: 'https://github.com/wrsmith108/claude-skill-affixdemo',
|
|
84
|
+
qualityScore: 0.5,
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
const skills = await recover(root, db);
|
|
88
|
+
const s = skills.find((x) => x.skillName === 'affixdemo');
|
|
89
|
+
expect(s?.method).toBe('registry-name');
|
|
90
|
+
expect(s?.confidence).toBe('medium');
|
|
91
|
+
expect(s?.recoveredSource?.url).toBe('https://github.com/wrsmith108/claude-skill-affixdemo');
|
|
92
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
93
|
+
});
|
|
94
|
+
it('prefers an EXACT name match over affix variants (no ambiguous downgrade)', async () => {
|
|
95
|
+
const root = tmpRoot('exact');
|
|
96
|
+
writeLocalSkill(root, 'affixdemo');
|
|
97
|
+
const db = tmpDb('exact');
|
|
98
|
+
// Both an exact `affixdemo` and an affixed `claude-skill-affixdemo` exist;
|
|
99
|
+
// the exact one must win as a single medium candidate, not become low/ambiguous.
|
|
100
|
+
await seedSkillsDb(db, [
|
|
101
|
+
{
|
|
102
|
+
id: 'uuid-exact',
|
|
103
|
+
name: 'affixdemo',
|
|
104
|
+
repoUrl: 'https://github.com/someone/affixdemo',
|
|
105
|
+
qualityScore: 0.4,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: 'uuid-affix2',
|
|
109
|
+
name: 'claude-skill-affixdemo',
|
|
110
|
+
repoUrl: 'https://github.com/wrsmith108/claude-skill-affixdemo',
|
|
111
|
+
qualityScore: 0.9,
|
|
112
|
+
},
|
|
113
|
+
]);
|
|
114
|
+
const skills = await recover(root, db);
|
|
115
|
+
const s = skills.find((x) => x.skillName === 'affixdemo');
|
|
116
|
+
expect(s?.confidence).toBe('medium');
|
|
117
|
+
expect(s?.recoveredSource?.url).toBe('https://github.com/someone/affixdemo');
|
|
118
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=audit-sources-affix.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sources-affix.test.js","sourceRoot":"","sources":["../../../tests/e2e/audit-sources-affix.test.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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
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
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import { writeSourceFixture, seedSkillsDb, skillMd, FIXTURE_DIRS, } from './utils/source-recovery-fixture.js';
|
|
17
|
+
let runAuditSources;
|
|
18
|
+
let tempHome = '';
|
|
19
|
+
let skillsRoot = '';
|
|
20
|
+
let manifestPath = '';
|
|
21
|
+
let originalHome;
|
|
22
|
+
let dbCounter = 0;
|
|
23
|
+
function makeOpts(o) {
|
|
24
|
+
return {
|
|
25
|
+
skillsRoot: o.skillsRoot ?? skillsRoot,
|
|
26
|
+
apply: o.apply ?? false,
|
|
27
|
+
yes: o.yes ?? false,
|
|
28
|
+
set: o.set,
|
|
29
|
+
minConfidence: o.minConfidence ?? 'high',
|
|
30
|
+
json: o.json ?? false,
|
|
31
|
+
embedding: false,
|
|
32
|
+
catalogHint: false,
|
|
33
|
+
writeFrontmatter: o.writeFrontmatter ?? false,
|
|
34
|
+
forceWriteFrontmatter: o.forceWriteFrontmatter ?? false,
|
|
35
|
+
db: o.db,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function readManifest() {
|
|
39
|
+
return JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
40
|
+
}
|
|
41
|
+
function entry(name) {
|
|
42
|
+
return readManifest().installedSkills[name];
|
|
43
|
+
}
|
|
44
|
+
async function seededDb() {
|
|
45
|
+
const dbPath = path.join(tempHome, `cands-${dbCounter++}.db`);
|
|
46
|
+
await seedSkillsDb(dbPath, [
|
|
47
|
+
{ id: 'coll-1', name: FIXTURE_DIRS.collision, repoUrl: 'https://github.com/coll1/repoA' },
|
|
48
|
+
{ id: 'coll-2', name: FIXTURE_DIRS.collision, repoUrl: 'https://github.com/coll2/repoB' },
|
|
49
|
+
]);
|
|
50
|
+
return dbPath;
|
|
51
|
+
}
|
|
52
|
+
async function emptyDb() {
|
|
53
|
+
const dbPath = path.join(tempHome, `empty-${dbCounter++}.db`);
|
|
54
|
+
await seedSkillsDb(dbPath, []);
|
|
55
|
+
return dbPath;
|
|
56
|
+
}
|
|
57
|
+
beforeAll(async () => {
|
|
58
|
+
originalHome = process.env['HOME'];
|
|
59
|
+
tempHome = fs.mkdtempSync(path.join(os.tmpdir(), 'smi5407-apply-home-'));
|
|
60
|
+
process.env['HOME'] = tempHome;
|
|
61
|
+
skillsRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'smi5407-apply-skills-'));
|
|
62
|
+
manifestPath = path.join(tempHome, '.skillsmith', 'manifest.json');
|
|
63
|
+
writeSourceFixture(skillsRoot);
|
|
64
|
+
({ runAuditSources } = await import('../../src/commands/audit-sources.action.js'));
|
|
65
|
+
});
|
|
66
|
+
afterAll(() => {
|
|
67
|
+
if (originalHome === undefined)
|
|
68
|
+
delete process.env['HOME'];
|
|
69
|
+
else
|
|
70
|
+
process.env['HOME'] = originalHome;
|
|
71
|
+
for (const dir of [tempHome, skillsRoot]) {
|
|
72
|
+
if (dir)
|
|
73
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
fs.rmSync(manifestPath, { force: true });
|
|
78
|
+
});
|
|
79
|
+
describe('SMI-5407 e2e — collision safety (scenario 3)', () => {
|
|
80
|
+
it('does not auto-write an ambiguous (low) collision, then writes it via --set', async () => {
|
|
81
|
+
const db = await seededDb();
|
|
82
|
+
// Default min high: the low collision match must NOT land in the manifest.
|
|
83
|
+
await runAuditSources(makeOpts({ db, apply: true, yes: true }));
|
|
84
|
+
expect(entry(FIXTURE_DIRS.collision)).toBeUndefined();
|
|
85
|
+
// git + plugin (exact/high) DID land.
|
|
86
|
+
expect(entry(FIXTURE_DIRS.git)).toBeDefined();
|
|
87
|
+
expect(entry(FIXTURE_DIRS.plugin)).toBeDefined();
|
|
88
|
+
// --set resolves it explicitly at user-specified confidence.
|
|
89
|
+
await runAuditSources(makeOpts({
|
|
90
|
+
db,
|
|
91
|
+
apply: true,
|
|
92
|
+
yes: true,
|
|
93
|
+
set: [`${FIXTURE_DIRS.collision}=picked-owner/picked-repo`],
|
|
94
|
+
}));
|
|
95
|
+
const resolved = entry(FIXTURE_DIRS.collision);
|
|
96
|
+
expect(resolved).toBeDefined();
|
|
97
|
+
expect(resolved.id).toBe(`picked-owner/${FIXTURE_DIRS.collision}`);
|
|
98
|
+
expect(resolved.source).toBe('https://github.com/picked-owner/picked-repo');
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('SMI-5407 e2e — idempotency + never-clobber (scenario 6)', () => {
|
|
102
|
+
it('a second --apply writes nothing and leaves the manifest byte-identical', async () => {
|
|
103
|
+
const db = await emptyDb();
|
|
104
|
+
await runAuditSources(makeOpts({ db, apply: true, yes: true }));
|
|
105
|
+
const afterFirst = fs.readFileSync(manifestPath, 'utf-8');
|
|
106
|
+
await runAuditSources(makeOpts({ db, apply: true, yes: true }));
|
|
107
|
+
const afterSecond = fs.readFileSync(manifestPath, 'utf-8');
|
|
108
|
+
expect(afterSecond).toBe(afterFirst);
|
|
109
|
+
});
|
|
110
|
+
it('never clobbers a healthy pre-existing entry whose source differs', async () => {
|
|
111
|
+
const preExisting = {
|
|
112
|
+
version: '1.0.0',
|
|
113
|
+
installedSkills: {
|
|
114
|
+
[FIXTURE_DIRS.git]: {
|
|
115
|
+
id: 'preexisting-id',
|
|
116
|
+
name: FIXTURE_DIRS.git,
|
|
117
|
+
version: '9.9.9',
|
|
118
|
+
source: 'https://github.com/someoneelse/different',
|
|
119
|
+
installPath: path.join(skillsRoot, FIXTURE_DIRS.git),
|
|
120
|
+
installedAt: '2020-01-01T00:00:00.000Z',
|
|
121
|
+
lastUpdated: '2020-01-01T00:00:00.000Z',
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
|
|
126
|
+
fs.writeFileSync(manifestPath, JSON.stringify(preExisting, null, 2));
|
|
127
|
+
await runAuditSources(makeOpts({ db: await emptyDb(), apply: true, yes: true }));
|
|
128
|
+
const git = entry(FIXTURE_DIRS.git);
|
|
129
|
+
expect(git.id).toBe('preexisting-id');
|
|
130
|
+
expect(git.source).toBe('https://github.com/someoneelse/different');
|
|
131
|
+
expect(git.version).toBe('9.9.9');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('SMI-5407 e2e — --write-frontmatter churn guard (scenario 8)', () => {
|
|
135
|
+
it('writes repository: only into non-git dirs lacking one', async () => {
|
|
136
|
+
// Isolated, mutable fixture (write-frontmatter rewrites SKILL.md).
|
|
137
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'smi5407-fm-'));
|
|
138
|
+
writeSourceFixture(root); // provides git-skill (.git) + plugin-skill (plugin.json)
|
|
139
|
+
const nosrc = path.join(root, 'nosrc-skill');
|
|
140
|
+
fs.mkdirSync(nosrc, { recursive: true });
|
|
141
|
+
fs.writeFileSync(path.join(nosrc, 'SKILL.md'), skillMd('nosrc-skill'));
|
|
142
|
+
const hasrepo = path.join(root, 'hasrepo-skill');
|
|
143
|
+
fs.mkdirSync(hasrepo, { recursive: true });
|
|
144
|
+
fs.writeFileSync(path.join(hasrepo, 'SKILL.md'), skillMd('hasrepo-skill', 'repository: https://github.com/existing/existing'));
|
|
145
|
+
const gitBefore = fs.readFileSync(path.join(root, FIXTURE_DIRS.git, 'SKILL.md'), 'utf-8');
|
|
146
|
+
const hasrepoBefore = fs.readFileSync(path.join(hasrepo, 'SKILL.md'), 'utf-8');
|
|
147
|
+
await runAuditSources(makeOpts({
|
|
148
|
+
db: await emptyDb(),
|
|
149
|
+
skillsRoot: root,
|
|
150
|
+
apply: true,
|
|
151
|
+
yes: true,
|
|
152
|
+
writeFrontmatter: true,
|
|
153
|
+
forceWriteFrontmatter: true,
|
|
154
|
+
set: ['nosrc-skill=me/no', 'hasrepo-skill=me/has'],
|
|
155
|
+
}));
|
|
156
|
+
// .git dir: never rewritten.
|
|
157
|
+
expect(fs.readFileSync(path.join(root, FIXTURE_DIRS.git, 'SKILL.md'), 'utf-8')).toBe(gitBefore);
|
|
158
|
+
// Non-git, no existing repository: gets the recovered source written in.
|
|
159
|
+
expect(fs.readFileSync(path.join(root, FIXTURE_DIRS.plugin, 'SKILL.md'), 'utf-8')).toContain('repository: https://github.com/o/r');
|
|
160
|
+
expect(fs.readFileSync(path.join(nosrc, 'SKILL.md'), 'utf-8')).toContain('repository: https://github.com/me/no');
|
|
161
|
+
// Already-present repository: never duplicated / overwritten.
|
|
162
|
+
expect(fs.readFileSync(path.join(hasrepo, 'SKILL.md'), 'utf-8')).toBe(hasrepoBefore);
|
|
163
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=audit-sources-apply.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sources-apply.test.js","sourceRoot":"","sources":["../../../tests/e2e/audit-sources-apply.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SMI-5407 end-to-end — `sklx audit sources` recovery (read paths).
|
|
3
|
+
*
|
|
4
|
+
* Real temp filesystem fixture + real temp SQLite (seeded `skills`) + real temp
|
|
5
|
+
* manifest (redirected via $HOME). No value-baked mocks: the only injected edge
|
|
6
|
+
* is network absence (an empty / unseeded candidate DB). Covers:
|
|
7
|
+
* 1. CLI full-path `--json` — per-dir method/confidence/status; no manifest write.
|
|
8
|
+
* 4. ssh-vs-https — both git fixtures normalize to one owner/repo + parse via buildRawUrl.
|
|
9
|
+
* 7. Offline degradation — empty DB: git+plugin resolve, registry/collision unknown, no throw.
|
|
10
|
+
*
|
|
11
|
+
* $HOME is set BEFORE the dynamic import of the action module so its
|
|
12
|
+
* module-level MANIFEST_PATH (utils/manifest.ts) freezes onto the temp home.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=audit-sources-recovery.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sources-recovery.test.d.ts","sourceRoot":"","sources":["../../../tests/e2e/audit-sources-recovery.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SMI-5407 end-to-end — `sklx audit sources` recovery (read paths).
|
|
3
|
+
*
|
|
4
|
+
* Real temp filesystem fixture + real temp SQLite (seeded `skills`) + real temp
|
|
5
|
+
* manifest (redirected via $HOME). No value-baked mocks: the only injected edge
|
|
6
|
+
* is network absence (an empty / unseeded candidate DB). Covers:
|
|
7
|
+
* 1. CLI full-path `--json` — per-dir method/confidence/status; no manifest write.
|
|
8
|
+
* 4. ssh-vs-https — both git fixtures normalize to one owner/repo + parse via buildRawUrl.
|
|
9
|
+
* 7. Offline degradation — empty DB: git+plugin resolve, registry/collision unknown, no throw.
|
|
10
|
+
*
|
|
11
|
+
* $HOME is set BEFORE the dynamic import of the action module so its
|
|
12
|
+
* module-level MANIFEST_PATH (utils/manifest.ts) freezes onto the temp home.
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach, vi } from 'vitest';
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
import { writeSourceFixture, seedSkillsDb, buildRawUrl, FIXTURE_DIRS, GIT_OWNER, GIT_REPO, } from './utils/source-recovery-fixture.js';
|
|
19
|
+
let runAuditSources;
|
|
20
|
+
let tempHome = '';
|
|
21
|
+
let skillsRoot = '';
|
|
22
|
+
let manifestPath = '';
|
|
23
|
+
let originalHome;
|
|
24
|
+
let dbCounter = 0;
|
|
25
|
+
function makeOpts(o) {
|
|
26
|
+
return {
|
|
27
|
+
skillsRoot,
|
|
28
|
+
apply: o.apply ?? false,
|
|
29
|
+
yes: o.yes ?? false,
|
|
30
|
+
set: o.set,
|
|
31
|
+
minConfidence: o.minConfidence ?? 'high',
|
|
32
|
+
json: o.json ?? false,
|
|
33
|
+
embedding: false,
|
|
34
|
+
catalogHint: false,
|
|
35
|
+
writeFrontmatter: o.writeFrontmatter ?? false,
|
|
36
|
+
forceWriteFrontmatter: o.forceWriteFrontmatter ?? false,
|
|
37
|
+
db: o.db,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Run `audit sources --json` and return the parsed `{ skills, summary }`. */
|
|
41
|
+
async function runJson(dbPath) {
|
|
42
|
+
const chunks = [];
|
|
43
|
+
const spy = vi
|
|
44
|
+
.spyOn(process.stdout, 'write')
|
|
45
|
+
.mockImplementation((chunk) => {
|
|
46
|
+
chunks.push(typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString('utf-8'));
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
await runAuditSources(makeOpts({ db: dbPath, json: true }));
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
spy.mockRestore();
|
|
54
|
+
}
|
|
55
|
+
return JSON.parse(chunks.join('').trim());
|
|
56
|
+
}
|
|
57
|
+
function bySkill(skills, name) {
|
|
58
|
+
const found = skills.find((s) => s.skillName === name);
|
|
59
|
+
if (!found)
|
|
60
|
+
throw new Error(`fixture skill not found in report: ${name}`);
|
|
61
|
+
return found;
|
|
62
|
+
}
|
|
63
|
+
/** A fresh seeded candidate DB: registry-skill (1 row) + collision-skill (2 rows). */
|
|
64
|
+
async function seededDb() {
|
|
65
|
+
const dbPath = path.join(tempHome, `cands-${dbCounter++}.db`);
|
|
66
|
+
await seedSkillsDb(dbPath, [
|
|
67
|
+
{
|
|
68
|
+
id: 'reg-uuid-0001',
|
|
69
|
+
name: FIXTURE_DIRS.registry,
|
|
70
|
+
repoUrl: 'https://github.com/regowner/regrepo',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'coll-uuid-0001',
|
|
74
|
+
name: FIXTURE_DIRS.collision,
|
|
75
|
+
repoUrl: 'https://github.com/coll1/repoA',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'coll-uuid-0002',
|
|
79
|
+
name: FIXTURE_DIRS.collision,
|
|
80
|
+
repoUrl: 'https://github.com/coll2/repoB',
|
|
81
|
+
},
|
|
82
|
+
]);
|
|
83
|
+
return dbPath;
|
|
84
|
+
}
|
|
85
|
+
/** A fresh EMPTY candidate DB (no skills rows) — models the offline path. */
|
|
86
|
+
async function emptyDb() {
|
|
87
|
+
const dbPath = path.join(tempHome, `empty-${dbCounter++}.db`);
|
|
88
|
+
await seedSkillsDb(dbPath, []);
|
|
89
|
+
return dbPath;
|
|
90
|
+
}
|
|
91
|
+
beforeAll(async () => {
|
|
92
|
+
originalHome = process.env['HOME'];
|
|
93
|
+
tempHome = fs.mkdtempSync(path.join(os.tmpdir(), 'smi5407-recov-home-'));
|
|
94
|
+
process.env['HOME'] = tempHome;
|
|
95
|
+
skillsRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'smi5407-recov-skills-'));
|
|
96
|
+
manifestPath = path.join(tempHome, '.skillsmith', 'manifest.json');
|
|
97
|
+
writeSourceFixture(skillsRoot);
|
|
98
|
+
({ runAuditSources } = await import('../../src/commands/audit-sources.action.js'));
|
|
99
|
+
});
|
|
100
|
+
afterAll(() => {
|
|
101
|
+
if (originalHome === undefined)
|
|
102
|
+
delete process.env['HOME'];
|
|
103
|
+
else
|
|
104
|
+
process.env['HOME'] = originalHome;
|
|
105
|
+
for (const dir of [tempHome, skillsRoot]) {
|
|
106
|
+
if (dir)
|
|
107
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
beforeEach(() => {
|
|
111
|
+
fs.rmSync(manifestPath, { force: true });
|
|
112
|
+
});
|
|
113
|
+
describe('SMI-5407 e2e — audit sources --json (scenario 1)', () => {
|
|
114
|
+
it('reports the correct method/confidence/status per directory', async () => {
|
|
115
|
+
const { skills, summary } = await runJson(await seededDb());
|
|
116
|
+
const git = bySkill(skills, FIXTURE_DIRS.git);
|
|
117
|
+
expect(git.method).toBe('git-remote');
|
|
118
|
+
expect(git.confidence).toBe('exact');
|
|
119
|
+
expect(git.status).toBe('recovered');
|
|
120
|
+
const plugin = bySkill(skills, FIXTURE_DIRS.plugin);
|
|
121
|
+
expect(plugin.method).toBe('plugin-json');
|
|
122
|
+
expect(plugin.confidence).toBe('high');
|
|
123
|
+
expect(plugin.status).toBe('recovered');
|
|
124
|
+
const registry = bySkill(skills, FIXTURE_DIRS.registry);
|
|
125
|
+
expect(registry.method).toBe('registry-name');
|
|
126
|
+
expect(registry.confidence).toBe('medium');
|
|
127
|
+
expect(registry.registryId).toBe('reg-uuid-0001');
|
|
128
|
+
expect(registry.status).toBe('recovered');
|
|
129
|
+
const collision = bySkill(skills, FIXTURE_DIRS.collision);
|
|
130
|
+
expect(collision.candidates).toHaveLength(2);
|
|
131
|
+
expect(collision.confidence).toBe('low');
|
|
132
|
+
expect(collision.status).toBe('unknown');
|
|
133
|
+
const backup = bySkill(skills, FIXTURE_DIRS.backup);
|
|
134
|
+
expect(backup.status).toBe('skipped_backup');
|
|
135
|
+
const unknown = bySkill(skills, FIXTURE_DIRS.unknown);
|
|
136
|
+
expect(unknown.status).toBe('unknown');
|
|
137
|
+
expect(unknown.confidence).toBe('unknown');
|
|
138
|
+
// Summary echoes the per-dir tally (3 recovered: git + https + plugin).
|
|
139
|
+
expect(summary['skipped_backup']).toBe(1);
|
|
140
|
+
expect(summary['total']).toBe(skills.length);
|
|
141
|
+
});
|
|
142
|
+
it('does not write the manifest on a dry-run (--json)', async () => {
|
|
143
|
+
await runJson(await seededDb());
|
|
144
|
+
expect(fs.existsSync(manifestPath)).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe('SMI-5407 e2e — ssh vs https git remotes (scenario 4)', () => {
|
|
148
|
+
it('normalizes both git fixtures to one owner/repo and a buildRawUrl-parseable source', async () => {
|
|
149
|
+
const { skills } = await runJson(await seededDb());
|
|
150
|
+
const git = bySkill(skills, FIXTURE_DIRS.git);
|
|
151
|
+
const https = bySkill(skills, FIXTURE_DIRS.https);
|
|
152
|
+
for (const result of [git, https]) {
|
|
153
|
+
expect(result.recoveredSource).not.toBeNull();
|
|
154
|
+
expect(result.recoveredSource?.owner).toBe(GIT_OWNER);
|
|
155
|
+
expect(result.recoveredSource?.repo).toBe(GIT_REPO);
|
|
156
|
+
expect(result.recoveredSource?.url).toBe(`https://github.com/${GIT_OWNER}/${GIT_REPO}`);
|
|
157
|
+
expect(buildRawUrl(result.recoveredSource.url)).toBe(`https://raw.githubusercontent.com/${GIT_OWNER}/${GIT_REPO}/main/SKILL.md`);
|
|
158
|
+
}
|
|
159
|
+
expect(git.recoveredSource).toEqual(https.recoveredSource);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('SMI-5407 e2e — offline degradation (scenario 7)', () => {
|
|
163
|
+
it('resolves git+plugin and degrades registry/collision to unknown without throwing', async () => {
|
|
164
|
+
let report;
|
|
165
|
+
await expect((async () => {
|
|
166
|
+
report = await runJson(await emptyDb());
|
|
167
|
+
})()).resolves.toBeUndefined();
|
|
168
|
+
const skills = report.skills;
|
|
169
|
+
expect(bySkill(skills, FIXTURE_DIRS.git).status).toBe('recovered');
|
|
170
|
+
expect(bySkill(skills, FIXTURE_DIRS.https).status).toBe('recovered');
|
|
171
|
+
expect(bySkill(skills, FIXTURE_DIRS.plugin).status).toBe('recovered');
|
|
172
|
+
// With no candidate rows, the name tiers degrade — no throw, no network.
|
|
173
|
+
expect(bySkill(skills, FIXTURE_DIRS.registry).status).toBe('unknown');
|
|
174
|
+
expect(bySkill(skills, FIXTURE_DIRS.registry).confidence).toBe('unknown');
|
|
175
|
+
expect(bySkill(skills, FIXTURE_DIRS.collision).status).toBe('unknown');
|
|
176
|
+
expect(bySkill(skills, FIXTURE_DIRS.collision).candidates).toHaveLength(0);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=audit-sources-recovery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sources-recovery.test.js","sourceRoot":"","sources":["../../../tests/e2e/audit-sources-recovery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview SMI-5407 end-to-end — GATE (write half): recover -> backfill.
|
|
3
|
+
*
|
|
4
|
+
* Drives the REAL CLI apply path (`audit sources --apply --yes --min-confidence
|
|
5
|
+
* medium`) into a REAL temp manifest and asserts the load-bearing backfill keys:
|
|
6
|
+
* - a single registry-name match (medium) writes the registry UUID as `id`
|
|
7
|
+
* (the only id form `skill_outdated` can resolve a registry skill by);
|
|
8
|
+
* - a git remote (exact) writes an owner/skill-name `id` (no UUID — the git
|
|
9
|
+
* tier has none);
|
|
10
|
+
* - both write an https `source` that `buildRawUrl` accepts (View-Changes).
|
|
11
|
+
*
|
|
12
|
+
* The READ half — that real `skill_outdated` resolves the UUID id (and NOT the
|
|
13
|
+
* owner/skill-name, owner/repo, or URL decoy forms), while the git owner/skill-
|
|
14
|
+
* name id resolves to `unknown` yet keeps a working View-Changes source — lives
|
|
15
|
+
* in `packages/mcp-server/src/__tests__/skill-outdated-resolution.test.ts`.
|
|
16
|
+
* It cannot live here: importing the mcp-server `executeOutdated`/`ToolContext`
|
|
17
|
+
* source across the package boundary is structurally invalid under the CLI
|
|
18
|
+
* tsconfig rootDir (TS6059/TS6307), and those symbols are not part of the
|
|
19
|
+
* mcp-server package's public exports. The shared REG_UUID + manifest shape are
|
|
20
|
+
* the contract linking the two halves.
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=audit-sources-roundtrip.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sources-roundtrip.test.d.ts","sourceRoot":"","sources":["../../../tests/e2e/audit-sources-roundtrip.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|