@martin0309205/prism 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/doctor.js +10 -3
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/skills.d.ts +2 -0
- package/dist/cli/commands/skills.js +125 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/update.js +24 -3
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/skills.d.ts +22 -0
- package/dist/skills.js +146 -0
- package/dist/skills.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ import { existsSync, readdirSync } from 'node:fs';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { loadConfig, instanceRoot } from '../../config.js';
|
|
6
|
+
import { readSkillsConfig } from '../../skills.js';
|
|
6
7
|
const EXPECTED_SKILLS = ['ask-mnemos-astry', 'astry-design-system', 'astry-pdf'];
|
|
7
8
|
export function doctorCmd(program) {
|
|
8
9
|
program
|
|
@@ -37,10 +38,16 @@ export function doctorCmd(program) {
|
|
|
37
38
|
printWarn(`could not run 'claude --version': ${err.message}`);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
41
|
+
const skillsCfg = readSkillsConfig();
|
|
42
|
+
if (skillsCfg) {
|
|
43
|
+
printOk(`skills repo configured: ${skillsCfg.repo_url}${skillsCfg.branch ? ` @ ${skillsCfg.branch}` : ''}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
printWarn(`skills repo not configured — run 'prism skills setup' then 'prism skills sync'`);
|
|
47
|
+
}
|
|
40
48
|
const skillsDir = join(homedir(), '.claude', 'skills');
|
|
41
49
|
if (!existsSync(skillsDir)) {
|
|
42
|
-
|
|
43
|
-
ok = false;
|
|
50
|
+
printWarn(`~/.claude/skills missing — run 'prism skills sync' to populate it`);
|
|
44
51
|
}
|
|
45
52
|
else {
|
|
46
53
|
const installed = new Set(readdirSync(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name));
|
|
@@ -49,7 +56,7 @@ export function doctorCmd(program) {
|
|
|
49
56
|
printOk(`skill: ${name}`);
|
|
50
57
|
}
|
|
51
58
|
else {
|
|
52
|
-
printWarn(`skill missing: ${name} —
|
|
59
|
+
printWarn(`skill missing: ${name} — run 'prism skills sync' (after setup)`);
|
|
53
60
|
}
|
|
54
61
|
}
|
|
55
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import prompts from 'prompts';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { listInstalledSkills, readSkillsConfig, syncSkills, userSkillsDir, writeSkillsConfig, SKILLS_ENV_PATH, } from '../../skills.js';
|
|
4
|
+
import { listInstances } from '../../instances.js';
|
|
5
|
+
export function skillsCmd(program) {
|
|
6
|
+
const skills = program
|
|
7
|
+
.command('skills')
|
|
8
|
+
.description('Sync the Claude Code skills used by Prism from a private Git repo.');
|
|
9
|
+
skills
|
|
10
|
+
.command('setup')
|
|
11
|
+
.description('Configure the skills repo URL and a GitHub PAT for read access.')
|
|
12
|
+
.option('--repo <url>', 'repository URL (https://github.com/owner/repo.git or git@github.com:owner/repo.git)')
|
|
13
|
+
.option('--token <pat>', 'GitHub Personal Access Token with repo read access')
|
|
14
|
+
.option('--branch <name>', 'branch to track (default: repo default branch)')
|
|
15
|
+
.option('--non-interactive', 'fail instead of prompting if values are missing')
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
const existing = readSkillsConfig();
|
|
18
|
+
let repo_url = opts.repo;
|
|
19
|
+
let token = opts.token;
|
|
20
|
+
let branch = opts.branch;
|
|
21
|
+
if (!opts.nonInteractive) {
|
|
22
|
+
const answers = await prompts([
|
|
23
|
+
{
|
|
24
|
+
type: repo_url ? null : 'text',
|
|
25
|
+
name: 'repo_url',
|
|
26
|
+
message: 'Skills repo URL',
|
|
27
|
+
initial: existing?.repo_url ?? 'https://github.com/martinbon39/astry-skills.git',
|
|
28
|
+
validate: (v) => /^(https?:\/\/|git@)/.test(v) ? true : 'must start with https:// or git@',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: token ? null : 'password',
|
|
32
|
+
name: 'token',
|
|
33
|
+
message: 'GitHub PAT (read access to that repo)',
|
|
34
|
+
validate: (v) => v.length >= 20 ? true : 'token looks too short',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: branch ? null : 'text',
|
|
38
|
+
name: 'branch',
|
|
39
|
+
message: 'Branch to track (leave blank for default)',
|
|
40
|
+
initial: existing?.branch ?? '',
|
|
41
|
+
},
|
|
42
|
+
], { onCancel: () => { process.exit(130); } });
|
|
43
|
+
repo_url ??= answers.repo_url;
|
|
44
|
+
token ??= answers.token;
|
|
45
|
+
branch ??= answers.branch || undefined;
|
|
46
|
+
}
|
|
47
|
+
if (!repo_url || !token) {
|
|
48
|
+
console.error('error: --repo and --token are required (or run interactively)');
|
|
49
|
+
process.exit(2);
|
|
50
|
+
}
|
|
51
|
+
writeSkillsConfig({ repo_url, token, branch });
|
|
52
|
+
process.stderr.write(`✓ wrote ${SKILLS_ENV_PATH} (chmod 0600)\n`);
|
|
53
|
+
process.stderr.write(`\nNext: prism skills sync\n`);
|
|
54
|
+
});
|
|
55
|
+
skills
|
|
56
|
+
.command('sync')
|
|
57
|
+
.description('Pull the latest skills from the configured repo, overwrite ~/.claude/skills, and restart prism services.')
|
|
58
|
+
.option('--no-restart', 'do not restart prism systemd services after sync')
|
|
59
|
+
.action((opts) => {
|
|
60
|
+
const cfg = readSkillsConfig();
|
|
61
|
+
if (!cfg) {
|
|
62
|
+
console.error(`error: skills not configured. Run 'prism skills setup' first.`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
let report;
|
|
66
|
+
try {
|
|
67
|
+
report = syncSkills(cfg);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.error(`error: ${err.message}`);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
process.stderr.write(`[skills] ${report.cloned_or_pulled} → ${report.cache_dir}\n`);
|
|
74
|
+
for (const s of report.skills) {
|
|
75
|
+
process.stderr.write(` ${s.action === 'created' ? '✓ created' : '✓ replaced'} ${s.name}\n`);
|
|
76
|
+
}
|
|
77
|
+
process.stderr.write(`\ntarget: ${report.target_dir}\n`);
|
|
78
|
+
if (opts.restart === false)
|
|
79
|
+
return;
|
|
80
|
+
if (process.platform !== 'linux') {
|
|
81
|
+
process.stderr.write(`[skills] (skipping service restart — not Linux)\n`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const instances = listInstances();
|
|
85
|
+
if (instances.length === 0)
|
|
86
|
+
return;
|
|
87
|
+
process.stderr.write(`\n[skills] restarting prism services...\n`);
|
|
88
|
+
for (const inst of instances) {
|
|
89
|
+
const unit = `prism@${inst}.service`;
|
|
90
|
+
const r = spawnSync('systemctl', ['--user', 'restart', unit], { stdio: 'inherit' });
|
|
91
|
+
if (r.status !== 0) {
|
|
92
|
+
process.stderr.write(`[skills] failed to restart ${unit} (continuing)\n`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
skills
|
|
97
|
+
.command('list')
|
|
98
|
+
.description('List skills currently installed under ~/.claude/skills/.')
|
|
99
|
+
.action(() => {
|
|
100
|
+
const target = userSkillsDir();
|
|
101
|
+
const list = listInstalledSkills();
|
|
102
|
+
if (list.length === 0) {
|
|
103
|
+
process.stderr.write(`no skills found in ${target}\n`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
process.stderr.write(`installed skills (${target}):\n`);
|
|
107
|
+
for (const name of list)
|
|
108
|
+
process.stderr.write(` - ${name}\n`);
|
|
109
|
+
});
|
|
110
|
+
skills
|
|
111
|
+
.command('status')
|
|
112
|
+
.description('Print the current skills config (repo URL + branch, NOT the token).')
|
|
113
|
+
.action(() => {
|
|
114
|
+
const cfg = readSkillsConfig();
|
|
115
|
+
if (!cfg) {
|
|
116
|
+
process.stderr.write(`not configured (no ${SKILLS_ENV_PATH})\n`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
process.stderr.write(`config: ${SKILLS_ENV_PATH}\n`);
|
|
120
|
+
process.stderr.write(` repo: ${cfg.repo_url}\n`);
|
|
121
|
+
process.stderr.write(` branch: ${cfg.branch ?? '(default)'}\n`);
|
|
122
|
+
process.stderr.write(` token: ${cfg.token.slice(0, 4)}…${cfg.token.slice(-4)} (${cfg.token.length} chars)\n`);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,41 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { listInstances } from '../../instances.js';
|
|
3
|
+
import { readSkillsConfig } from '../../skills.js';
|
|
4
|
+
const NPM_PACKAGE = '@martin0309205/prism';
|
|
3
5
|
export function updateCmd(program) {
|
|
4
6
|
program
|
|
5
7
|
.command('update')
|
|
6
|
-
.description('Pull the latest
|
|
8
|
+
.description('Pull the latest Prism from npm, sync skills from the configured repo, and restart services.')
|
|
9
|
+
.option('--no-skills', 'skip the skills sync step')
|
|
7
10
|
.option('--no-restart', 'skip restarting systemd services')
|
|
8
11
|
.option('--version <ver>', 'specific version to install', 'latest')
|
|
9
12
|
.action((opts) => {
|
|
10
|
-
const target =
|
|
13
|
+
const target = `${NPM_PACKAGE}@${opts.version}`;
|
|
11
14
|
process.stderr.write(`[prism] installing ${target}...\n`);
|
|
12
15
|
const install = spawnSync('npm', ['install', '-g', target], { stdio: 'inherit' });
|
|
13
16
|
if (install.status !== 0) {
|
|
14
17
|
process.stderr.write(`[prism] npm install failed\n`);
|
|
15
18
|
process.exit(install.status ?? 1);
|
|
16
19
|
}
|
|
17
|
-
|
|
20
|
+
// After npm replaced our binary, re-exec the freshly installed `prism`
|
|
21
|
+
// so the latest skills.ts logic runs.
|
|
22
|
+
if (opts.skills !== false) {
|
|
23
|
+
if (readSkillsConfig()) {
|
|
24
|
+
process.stderr.write(`[prism] syncing skills...\n`);
|
|
25
|
+
const args = ['skills', 'sync'];
|
|
26
|
+
if (opts.restart === false)
|
|
27
|
+
args.push('--no-restart');
|
|
28
|
+
const r = spawnSync('prism', args, { stdio: 'inherit' });
|
|
29
|
+
if (r.status !== 0) {
|
|
30
|
+
process.stderr.write(`[prism] skills sync failed (continuing); run 'prism skills sync' manually\n`);
|
|
31
|
+
}
|
|
32
|
+
return; // skills sync already restarted services
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
process.stderr.write(`[prism] skills not configured (run 'prism skills setup'), skipping skills sync\n`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (opts.restart === false)
|
|
18
39
|
return;
|
|
19
40
|
if (process.platform !== 'linux') {
|
|
20
41
|
process.stderr.write(`[prism] skipping service restart (not Linux)\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { doctorCmd } from './commands/doctor.js';
|
|
|
9
9
|
import { serveCmd } from './commands/serve.js';
|
|
10
10
|
import { updateCmd } from './commands/update.js';
|
|
11
11
|
import { daemonCmd } from './commands/daemon.js';
|
|
12
|
+
import { skillsCmd } from './commands/skills.js';
|
|
12
13
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
13
14
|
const pkg = JSON.parse(readFileSync(resolve(here, '..', '..', 'package.json'), 'utf8'));
|
|
14
15
|
const program = new Command();
|
|
@@ -20,6 +21,7 @@ generateCmd(program);
|
|
|
20
21
|
serveCmd(program);
|
|
21
22
|
onboardCmd(program);
|
|
22
23
|
doctorCmd(program);
|
|
24
|
+
skillsCmd(program);
|
|
23
25
|
daemonCmd(program);
|
|
24
26
|
updateCmd(program);
|
|
25
27
|
program.parseAsync(process.argv).catch((err) => {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;AAE/G,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gGAAgG,CAAC;KAC7G,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,SAAS,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;AAE/G,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gGAAgG,CAAC;KAC7G,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,QAAQ,CAAC,OAAO,CAAC,CAAC;AAClB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,SAAS,CAAC,OAAO,CAAC,CAAC;AAEnB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const SKILLS_ENV_PATH: string;
|
|
2
|
+
export declare const SKILLS_CACHE_DIR: string;
|
|
3
|
+
export interface SkillsConfig {
|
|
4
|
+
repo_url: string;
|
|
5
|
+
token: string;
|
|
6
|
+
branch?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function userSkillsDir(): string;
|
|
9
|
+
export declare function readSkillsConfig(): SkillsConfig | null;
|
|
10
|
+
export declare function writeSkillsConfig(cfg: SkillsConfig): void;
|
|
11
|
+
export declare function authenticatedRepoUrl(cfg: SkillsConfig): string;
|
|
12
|
+
export interface SyncReport {
|
|
13
|
+
cloned_or_pulled: 'cloned' | 'pulled';
|
|
14
|
+
skills: {
|
|
15
|
+
name: string;
|
|
16
|
+
action: 'created' | 'replaced';
|
|
17
|
+
}[];
|
|
18
|
+
cache_dir: string;
|
|
19
|
+
target_dir: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function syncSkills(cfg: SkillsConfig): SyncReport;
|
|
22
|
+
export declare function listInstalledSkills(): string[];
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
export const SKILLS_ENV_PATH = join(homedir(), '.prism', 'skills.env');
|
|
6
|
+
export const SKILLS_CACHE_DIR = join(homedir(), '.prism', 'skills-cache');
|
|
7
|
+
export function userSkillsDir() {
|
|
8
|
+
return join(homedir(), '.claude', 'skills');
|
|
9
|
+
}
|
|
10
|
+
export function readSkillsConfig() {
|
|
11
|
+
if (!existsSync(SKILLS_ENV_PATH))
|
|
12
|
+
return null;
|
|
13
|
+
const raw = readFileSync(SKILLS_ENV_PATH, 'utf8');
|
|
14
|
+
const out = {};
|
|
15
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
16
|
+
const trimmed = line.trim();
|
|
17
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
18
|
+
continue;
|
|
19
|
+
const eq = trimmed.indexOf('=');
|
|
20
|
+
if (eq < 0)
|
|
21
|
+
continue;
|
|
22
|
+
let val = trimmed.slice(eq + 1).trim();
|
|
23
|
+
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
|
|
24
|
+
val = val.slice(1, -1);
|
|
25
|
+
}
|
|
26
|
+
out[trimmed.slice(0, eq).trim()] = val;
|
|
27
|
+
}
|
|
28
|
+
if (!out.PRISM_SKILLS_REPO || !out.PRISM_SKILLS_TOKEN)
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
repo_url: out.PRISM_SKILLS_REPO,
|
|
32
|
+
token: out.PRISM_SKILLS_TOKEN,
|
|
33
|
+
branch: out.PRISM_SKILLS_BRANCH,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function writeSkillsConfig(cfg) {
|
|
37
|
+
mkdirSync(join(homedir(), '.prism'), { recursive: true });
|
|
38
|
+
const lines = [
|
|
39
|
+
'# Prism skills sync — read by `prism skills sync`',
|
|
40
|
+
'# Do not commit or share this file — the token has read access to your skills repo.',
|
|
41
|
+
`PRISM_SKILLS_REPO=${cfg.repo_url}`,
|
|
42
|
+
`PRISM_SKILLS_TOKEN=${cfg.token}`,
|
|
43
|
+
];
|
|
44
|
+
if (cfg.branch)
|
|
45
|
+
lines.push(`PRISM_SKILLS_BRANCH=${cfg.branch}`);
|
|
46
|
+
writeFileSync(SKILLS_ENV_PATH, lines.join('\n') + '\n');
|
|
47
|
+
try {
|
|
48
|
+
chmodSync(SKILLS_ENV_PATH, 0o600);
|
|
49
|
+
}
|
|
50
|
+
catch { /* windows */ }
|
|
51
|
+
}
|
|
52
|
+
export function authenticatedRepoUrl(cfg) {
|
|
53
|
+
// Insert the token into an https URL: https://<token>@github.com/...
|
|
54
|
+
const u = cfg.repo_url;
|
|
55
|
+
if (u.startsWith('git@'))
|
|
56
|
+
return u; // SSH unchanged (assume key already on disk)
|
|
57
|
+
const m = /^(https?:\/\/)([^/]+)(\/.*)$/.exec(u);
|
|
58
|
+
if (!m)
|
|
59
|
+
return u;
|
|
60
|
+
// x-access-token works for both classic and fine-grained PATs
|
|
61
|
+
return `${m[1]}x-access-token:${cfg.token}@${m[2]}${m[3]}`;
|
|
62
|
+
}
|
|
63
|
+
export function syncSkills(cfg) {
|
|
64
|
+
mkdirSync(SKILLS_CACHE_DIR, { recursive: true });
|
|
65
|
+
const url = authenticatedRepoUrl(cfg);
|
|
66
|
+
const isFresh = !existsSync(join(SKILLS_CACHE_DIR, '.git'));
|
|
67
|
+
const action = isFresh ? 'cloned' : 'pulled';
|
|
68
|
+
if (isFresh) {
|
|
69
|
+
// remove any leftover non-git contents before clone
|
|
70
|
+
if (existsSync(SKILLS_CACHE_DIR)) {
|
|
71
|
+
rmSync(SKILLS_CACHE_DIR, { recursive: true, force: true });
|
|
72
|
+
}
|
|
73
|
+
const args = ['clone', '--depth=1'];
|
|
74
|
+
if (cfg.branch)
|
|
75
|
+
args.push('--branch', cfg.branch);
|
|
76
|
+
args.push(url, SKILLS_CACHE_DIR);
|
|
77
|
+
runGit(args, { cwd: homedir() });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// make sure the remote URL is current (token may have rotated)
|
|
81
|
+
runGit(['remote', 'set-url', 'origin', url], { cwd: SKILLS_CACHE_DIR });
|
|
82
|
+
runGit(['fetch', '--depth=1', 'origin'], { cwd: SKILLS_CACHE_DIR });
|
|
83
|
+
const branch = cfg.branch ?? defaultBranch(SKILLS_CACHE_DIR);
|
|
84
|
+
runGit(['reset', '--hard', `origin/${branch}`], { cwd: SKILLS_CACHE_DIR });
|
|
85
|
+
runGit(['clean', '-fd'], { cwd: SKILLS_CACHE_DIR });
|
|
86
|
+
}
|
|
87
|
+
// For each top-level dir in cache (excluding .git), wipe and replace target
|
|
88
|
+
const target = userSkillsDir();
|
|
89
|
+
mkdirSync(target, { recursive: true });
|
|
90
|
+
const cacheEntries = readdirSync(SKILLS_CACHE_DIR, { withFileTypes: true })
|
|
91
|
+
.filter((d) => d.isDirectory() && d.name !== '.git' && !d.name.startsWith('.'));
|
|
92
|
+
const skills = [];
|
|
93
|
+
for (const entry of cacheEntries) {
|
|
94
|
+
const src = join(SKILLS_CACHE_DIR, entry.name);
|
|
95
|
+
if (!existsSync(join(src, 'SKILL.md')))
|
|
96
|
+
continue; // not a skill
|
|
97
|
+
const dst = join(target, entry.name);
|
|
98
|
+
const existed = existsSync(dst);
|
|
99
|
+
if (existed)
|
|
100
|
+
rmSync(dst, { recursive: true, force: true });
|
|
101
|
+
copyDirSync(src, dst);
|
|
102
|
+
skills.push({ name: entry.name, action: existed ? 'replaced' : 'created' });
|
|
103
|
+
}
|
|
104
|
+
return { cloned_or_pulled: action, skills, cache_dir: SKILLS_CACHE_DIR, target_dir: target };
|
|
105
|
+
}
|
|
106
|
+
function runGit(args, opts) {
|
|
107
|
+
// Suppress credential prompts: GIT_TERMINAL_PROMPT=0
|
|
108
|
+
const env = { ...process.env, GIT_TERMINAL_PROMPT: '0' };
|
|
109
|
+
const r = spawnSync('git', args, { cwd: opts.cwd, env, encoding: 'utf8' });
|
|
110
|
+
if (r.status !== 0) {
|
|
111
|
+
const stderr = (r.stderr || '').replace(/x-access-token:[^@]+@/g, 'x-access-token:***@');
|
|
112
|
+
const stdout = (r.stdout || '').replace(/x-access-token:[^@]+@/g, 'x-access-token:***@');
|
|
113
|
+
throw new Error(`git ${args[0]} failed (${r.status}):\n${stderr}\n${stdout}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function defaultBranch(cwd) {
|
|
117
|
+
const r = spawnSync('git', ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], { cwd, encoding: 'utf8' });
|
|
118
|
+
if (r.status === 0 && r.stdout) {
|
|
119
|
+
return r.stdout.trim().replace(/^origin\//, '');
|
|
120
|
+
}
|
|
121
|
+
return 'main';
|
|
122
|
+
}
|
|
123
|
+
function copyDirSync(src, dst) {
|
|
124
|
+
mkdirSync(dst, { recursive: true });
|
|
125
|
+
for (const entry of readdirSync(src, { withFileTypes: true })) {
|
|
126
|
+
const s = join(src, entry.name);
|
|
127
|
+
const d = join(dst, entry.name);
|
|
128
|
+
if (entry.isDirectory()) {
|
|
129
|
+
copyDirSync(s, d);
|
|
130
|
+
}
|
|
131
|
+
else if (entry.isFile()) {
|
|
132
|
+
const data = readFileSync(s);
|
|
133
|
+
writeFileSync(d, data);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function listInstalledSkills() {
|
|
138
|
+
const dir = userSkillsDir();
|
|
139
|
+
if (!existsSync(dir))
|
|
140
|
+
return [];
|
|
141
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
142
|
+
.filter((d) => d.isDirectory() && !d.name.startsWith('.'))
|
|
143
|
+
.map((d) => d.name)
|
|
144
|
+
.sort();
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED