siteskills 1.2.0 → 1.3.0
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAmKA,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAiGf"}
|
package/dist/commands/install.js
CHANGED
|
@@ -3,9 +3,8 @@ import path from "node:path";
|
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import ora from "ora";
|
|
6
|
+
import archiver from "archiver";
|
|
6
7
|
import { getApiUrl } from "../lib/config.js";
|
|
7
|
-
/** Current version of the siteskills plugin bundle. */
|
|
8
|
-
const PLUGIN_VERSION = "1.0.0";
|
|
9
8
|
/** Known platform skill directory paths, in detection priority order. */
|
|
10
9
|
const KNOWN_PLATFORMS = [
|
|
11
10
|
{ name: "Claude Code", configDir: ".claude", skillsSubDir: "skills" },
|
|
@@ -13,49 +12,85 @@ const KNOWN_PLATFORMS = [
|
|
|
13
12
|
{ name: "Cursor", configDir: ".cursor", skillsSubDir: "skills" },
|
|
14
13
|
{ name: "Windsurf", configDir: ".windsurf", skillsSubDir: "skills" },
|
|
15
14
|
];
|
|
16
|
-
/** Detect where skills should be installed
|
|
15
|
+
/** Detect where/how skills should be installed. */
|
|
17
16
|
function detectPlatform(overrideDir) {
|
|
18
|
-
// Explicit --dir flag wins
|
|
19
17
|
if (overrideDir) {
|
|
20
|
-
return { platform: "custom", dir: overrideDir, source: "flag" };
|
|
18
|
+
return { platform: "custom", dir: overrideDir, source: "flag", cowork: false };
|
|
21
19
|
}
|
|
22
|
-
// SITESKILLS_DIR env var
|
|
23
20
|
const envDir = process.env.SITESKILLS_DIR;
|
|
24
21
|
if (envDir) {
|
|
25
|
-
return { platform: "custom", dir: envDir, source: "env" };
|
|
22
|
+
return { platform: "custom", dir: envDir, source: "env", cowork: false };
|
|
26
23
|
}
|
|
27
24
|
const home = os.homedir();
|
|
28
|
-
// Cowork:
|
|
29
|
-
//
|
|
30
|
-
//
|
|
25
|
+
// Cowork: skills are installed via .skill zip files through the app UI.
|
|
26
|
+
// We detect Cowork by presence of ~/.claude/cowork_plugins/ or ~/.cowork/.
|
|
27
|
+
// Output the .skill file to ~/Downloads (or cwd as fallback).
|
|
31
28
|
const coworkPluginsDir = path.join(home, ".claude", "cowork_plugins");
|
|
32
29
|
if (fs.existsSync(coworkPluginsDir) || fs.existsSync(path.join(home, ".cowork"))) {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
dir: path.join(home, ".claude", "skills"), // Skill tool reads from here inside VM
|
|
37
|
-
source: "detected",
|
|
38
|
-
coworkCacheRoot: cacheRoot, // Also register in cowork_plugins for system prompt
|
|
39
|
-
coworkInstalledPluginsPath: path.join(coworkPluginsDir, "installed_plugins.json"),
|
|
40
|
-
};
|
|
30
|
+
const downloadsDir = path.join(home, "Downloads");
|
|
31
|
+
const outputDir = fs.existsSync(downloadsDir) ? downloadsDir : process.cwd();
|
|
32
|
+
return { platform: "Cowork", dir: outputDir, source: "detected", cowork: true };
|
|
41
33
|
}
|
|
42
|
-
// Detect by presence of platform config directory
|
|
43
34
|
for (const p of KNOWN_PLATFORMS) {
|
|
44
35
|
if (fs.existsSync(path.join(home, p.configDir))) {
|
|
45
36
|
return {
|
|
46
37
|
platform: p.name,
|
|
47
38
|
dir: path.join(home, p.configDir, p.skillsSubDir),
|
|
48
39
|
source: "detected",
|
|
40
|
+
cowork: false,
|
|
49
41
|
};
|
|
50
42
|
}
|
|
51
43
|
}
|
|
52
|
-
// Default to Claude Code
|
|
53
44
|
return {
|
|
54
45
|
platform: "Claude Code",
|
|
55
46
|
dir: path.join(home, ".claude", "skills"),
|
|
56
47
|
source: "default",
|
|
48
|
+
cowork: false,
|
|
57
49
|
};
|
|
58
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Strips frontmatter fields that Cowork's validator rejects.
|
|
53
|
+
* Cowork only allows: name, description, license, allowed-tools, metadata, compatibility.
|
|
54
|
+
* Everything else (target-domains, tags, version, generated, etc.) causes rejection.
|
|
55
|
+
*/
|
|
56
|
+
function toCoworkFrontmatter(content) {
|
|
57
|
+
const ALLOWED = new Set(["name", "description", "license", "allowed-tools", "metadata", "compatibility"]);
|
|
58
|
+
const SEP = "\n---\n";
|
|
59
|
+
if (!content.startsWith("---\n"))
|
|
60
|
+
return content;
|
|
61
|
+
const fmEnd = content.indexOf(SEP, 4);
|
|
62
|
+
if (fmEnd === -1)
|
|
63
|
+
return content;
|
|
64
|
+
const kept = [];
|
|
65
|
+
let keep = false;
|
|
66
|
+
for (const line of content.slice(4, fmEnd).split("\n")) {
|
|
67
|
+
const m = line.match(/^([a-z][a-z0-9-]*)\s*:/i);
|
|
68
|
+
if (m)
|
|
69
|
+
keep = ALLOWED.has(m[1]);
|
|
70
|
+
if (keep)
|
|
71
|
+
kept.push(line);
|
|
72
|
+
}
|
|
73
|
+
return `---\n${kept.join("\n")}\n---\n${content.slice(fmEnd + SEP.length)}`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Packages a SKILL.md into a .skill zip archive (Cowork's format).
|
|
77
|
+
* Structure inside zip: {slug}/SKILL.md
|
|
78
|
+
* Returns the path to the created .skill file.
|
|
79
|
+
*/
|
|
80
|
+
async function createSkillFile(slug, content, outputDir) {
|
|
81
|
+
const coworkContent = toCoworkFrontmatter(content);
|
|
82
|
+
const outPath = path.join(outputDir, `${slug}.skill`);
|
|
83
|
+
await new Promise((resolve, reject) => {
|
|
84
|
+
const output = fs.createWriteStream(outPath);
|
|
85
|
+
const archive = archiver("zip", { zlib: { level: 9 } });
|
|
86
|
+
output.on("close", resolve);
|
|
87
|
+
archive.on("error", reject);
|
|
88
|
+
archive.pipe(output);
|
|
89
|
+
archive.append(coworkContent, { name: `${slug}/SKILL.md` });
|
|
90
|
+
archive.finalize();
|
|
91
|
+
});
|
|
92
|
+
return outPath;
|
|
93
|
+
}
|
|
59
94
|
const CLAUDE_MD_BLOCK_START = "<!-- siteskills:start -->";
|
|
60
95
|
const CLAUDE_MD_BLOCK_END = "<!-- siteskills:end -->";
|
|
61
96
|
const CLAUDE_MD_RULE = `${CLAUDE_MD_BLOCK_START}
|
|
@@ -72,7 +107,6 @@ ${CLAUDE_MD_BLOCK_END}`;
|
|
|
72
107
|
/**
|
|
73
108
|
* Writes the SiteSkills invocation rule to ~/.claude/CLAUDE.md (Claude Code only).
|
|
74
109
|
* Idempotent — replaces the existing block if present, adds it if not.
|
|
75
|
-
* Does not touch any other content in the file.
|
|
76
110
|
*/
|
|
77
111
|
function ensureClaudeCodeRule(claudeConfigDir) {
|
|
78
112
|
const claudeMdPath = path.join(claudeConfigDir, "CLAUDE.md");
|
|
@@ -80,10 +114,8 @@ function ensureClaudeCodeRule(claudeConfigDir) {
|
|
|
80
114
|
if (fs.existsSync(claudeMdPath)) {
|
|
81
115
|
existing = fs.readFileSync(claudeMdPath, "utf-8");
|
|
82
116
|
}
|
|
83
|
-
// Already up to date
|
|
84
117
|
if (existing.includes(CLAUDE_MD_RULE))
|
|
85
118
|
return;
|
|
86
|
-
// Replace existing block if present, otherwise append
|
|
87
119
|
if (existing.includes(CLAUDE_MD_BLOCK_START)) {
|
|
88
120
|
const startIdx = existing.indexOf(CLAUDE_MD_BLOCK_START);
|
|
89
121
|
const endIdx = existing.indexOf(CLAUDE_MD_BLOCK_END);
|
|
@@ -102,59 +134,6 @@ function ensureClaudeCodeRule(claudeConfigDir) {
|
|
|
102
134
|
fs.mkdirSync(claudeConfigDir, { recursive: true });
|
|
103
135
|
fs.writeFileSync(claudeMdPath, existing, "utf-8");
|
|
104
136
|
}
|
|
105
|
-
const COWORK_PLUGIN_MANIFEST = JSON.stringify({
|
|
106
|
-
name: "siteskills",
|
|
107
|
-
description: "Pre-mapped navigation skills for popular websites — eliminates screenshot-guess loops for caniuse.com, pub.dev, MDN, crates.io, PyPI, and Hacker News",
|
|
108
|
-
author: {
|
|
109
|
-
name: "SiteSkills",
|
|
110
|
-
email: "hello@siteskills.ai",
|
|
111
|
-
},
|
|
112
|
-
}, null, 2) + "\n";
|
|
113
|
-
/**
|
|
114
|
-
* Registers the siteskills plugin in Cowork's installed_plugins.json and
|
|
115
|
-
* ensures the plugin manifest exists. Idempotent. Non-fatal on failure.
|
|
116
|
-
*/
|
|
117
|
-
function ensureCoworkRegistration(cacheRoot, installedPluginsPath) {
|
|
118
|
-
// 1. Plugin manifest
|
|
119
|
-
try {
|
|
120
|
-
const manifestDir = path.join(cacheRoot, ".claude-plugin");
|
|
121
|
-
const manifestPath = path.join(manifestDir, "plugin.json");
|
|
122
|
-
if (!fs.existsSync(manifestPath)) {
|
|
123
|
-
fs.mkdirSync(manifestDir, { recursive: true });
|
|
124
|
-
fs.writeFileSync(manifestPath, COWORK_PLUGIN_MANIFEST, "utf-8");
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
// Non-fatal
|
|
129
|
-
}
|
|
130
|
-
// 2. installed_plugins.json registration
|
|
131
|
-
try {
|
|
132
|
-
let installed = {};
|
|
133
|
-
if (fs.existsSync(installedPluginsPath)) {
|
|
134
|
-
installed = JSON.parse(fs.readFileSync(installedPluginsPath, "utf-8"));
|
|
135
|
-
}
|
|
136
|
-
const key = "siteskills@siteskills";
|
|
137
|
-
const entry = {
|
|
138
|
-
scope: "user",
|
|
139
|
-
installPath: cacheRoot,
|
|
140
|
-
installedAt: new Date().toISOString(),
|
|
141
|
-
};
|
|
142
|
-
if (!installed[key] || !Array.isArray(installed[key])) {
|
|
143
|
-
installed[key] = [entry];
|
|
144
|
-
}
|
|
145
|
-
else if (!installed[key].some((e) => e.installPath === cacheRoot)) {
|
|
146
|
-
installed[key] = [entry, ...installed[key]];
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
return; // Already registered
|
|
150
|
-
}
|
|
151
|
-
fs.mkdirSync(path.dirname(installedPluginsPath), { recursive: true });
|
|
152
|
-
fs.writeFileSync(installedPluginsPath, JSON.stringify(installed, null, 2) + "\n", "utf-8");
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
// Non-fatal — installed_plugins.json format may differ; file write still works
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
137
|
export async function installCommand(slug, options) {
|
|
159
138
|
if (!slug || slug.trim().length === 0) {
|
|
160
139
|
console.error(chalk.red("Please provide a skill name. Usage: siteskills install <name>"));
|
|
@@ -163,7 +142,6 @@ export async function installCommand(slug, options) {
|
|
|
163
142
|
const baseUrl = getApiUrl();
|
|
164
143
|
const spinner = ora(`Downloading ${chalk.bold(slug)}...`).start();
|
|
165
144
|
try {
|
|
166
|
-
// Fetch the raw SKILL.md content
|
|
167
145
|
const res = await fetch(`${baseUrl}/api/skills/${encodeURIComponent(slug)}/content`);
|
|
168
146
|
if (!res.ok) {
|
|
169
147
|
if (res.status === 404) {
|
|
@@ -180,32 +158,38 @@ export async function installCommand(slug, options) {
|
|
|
180
158
|
spinner.fail(chalk.red(`Skill "${slug}" has no content.`));
|
|
181
159
|
process.exit(1);
|
|
182
160
|
}
|
|
183
|
-
// Determine install directory
|
|
184
161
|
const detection = detectPlatform(options.dir);
|
|
162
|
+
if (detection.cowork) {
|
|
163
|
+
// Cowork: package as .skill zip file for installation via the Cowork app UI.
|
|
164
|
+
// Skills live in a read-only VM mount — the only way in is through the app.
|
|
165
|
+
spinner.text = `Packaging ${chalk.bold(slug)} for Cowork...`;
|
|
166
|
+
const skillPath = await createSkillFile(slug, content, detection.dir);
|
|
167
|
+
spinner.succeed(chalk.green(`Packaged ${chalk.bold(slug)}.skill`));
|
|
168
|
+
console.log(chalk.dim(` ${skillPath}`));
|
|
169
|
+
console.log();
|
|
170
|
+
console.log(chalk.bold(" Install in Cowork:"));
|
|
171
|
+
console.log(chalk.dim(" 1. Open the Cowork app"));
|
|
172
|
+
console.log(chalk.dim(" 2. Settings → Skills → Install from file"));
|
|
173
|
+
console.log(chalk.dim(` 3. Select: ${skillPath}`));
|
|
174
|
+
console.log();
|
|
175
|
+
console.log(chalk.dim(" The skill will be available in your next Cowork session."));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// Non-Cowork platforms: write SKILL.md directly to the skills directory.
|
|
185
179
|
const skillDir = path.join(detection.dir, slug);
|
|
186
180
|
const skillFile = path.join(skillDir, "SKILL.md");
|
|
187
|
-
// Check if already installed
|
|
188
181
|
if (fs.existsSync(skillFile)) {
|
|
189
182
|
spinner.info(chalk.yellow(`Skill "${slug}" is already installed. Updating...`));
|
|
190
183
|
}
|
|
191
|
-
// Create directory and write file
|
|
192
184
|
fs.mkdirSync(skillDir, { recursive: true });
|
|
193
185
|
fs.writeFileSync(skillFile, content, "utf-8");
|
|
186
|
+
// For Claude Code: write standing rule to CLAUDE.md so the agent checks
|
|
187
|
+
// for skills before browsing — converts discretionary to mandatory.
|
|
194
188
|
const home = os.homedir();
|
|
195
|
-
// For Claude Code: write invocation rule to ~/.claude/CLAUDE.md so the
|
|
196
|
-
// agent checks for skills before browsing — converts discretionary to mandatory.
|
|
197
189
|
if (detection.platform === "Claude Code" &&
|
|
198
190
|
(detection.source === "detected" || detection.source === "default")) {
|
|
199
191
|
ensureClaudeCodeRule(path.join(home, ".claude"));
|
|
200
192
|
}
|
|
201
|
-
// For Cowork: register the plugin in installed_plugins.json so it persists
|
|
202
|
-
// across fresh sessions (Cowork loads from this registry, not from the cache
|
|
203
|
-
// directory alone).
|
|
204
|
-
if (detection.platform === "Cowork" &&
|
|
205
|
-
detection.coworkCacheRoot &&
|
|
206
|
-
detection.coworkInstalledPluginsPath) {
|
|
207
|
-
ensureCoworkRegistration(detection.coworkCacheRoot, detection.coworkInstalledPluginsPath);
|
|
208
|
-
}
|
|
209
193
|
spinner.succeed(chalk.green(`Installed ${chalk.bold(slug)}`));
|
|
210
194
|
console.log(chalk.dim(` ${skillFile}`));
|
|
211
195
|
console.log(chalk.dim(` ${content.split("\n").length} lines, ${content.length} chars`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|