siteskills 1.1.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,26 +3,136 @@ 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
|
-
/**
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/** Known platform skill directory paths, in detection priority order. */
|
|
9
|
+
const KNOWN_PLATFORMS = [
|
|
10
|
+
{ name: "Claude Code", configDir: ".claude", skillsSubDir: "skills" },
|
|
11
|
+
{ name: "OpenClaw", configDir: ".openclaw", skillsSubDir: "skills" },
|
|
12
|
+
{ name: "Cursor", configDir: ".cursor", skillsSubDir: "skills" },
|
|
13
|
+
{ name: "Windsurf", configDir: ".windsurf", skillsSubDir: "skills" },
|
|
14
|
+
];
|
|
15
|
+
/** Detect where/how skills should be installed. */
|
|
16
|
+
function detectPlatform(overrideDir) {
|
|
17
|
+
if (overrideDir) {
|
|
18
|
+
return { platform: "custom", dir: overrideDir, source: "flag", cowork: false };
|
|
19
|
+
}
|
|
10
20
|
const envDir = process.env.SITESKILLS_DIR;
|
|
11
|
-
if (envDir)
|
|
12
|
-
return envDir;
|
|
21
|
+
if (envDir) {
|
|
22
|
+
return { platform: "custom", dir: envDir, source: "env", cowork: false };
|
|
23
|
+
}
|
|
13
24
|
const home = os.homedir();
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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).
|
|
28
|
+
const coworkPluginsDir = path.join(home, ".claude", "cowork_plugins");
|
|
29
|
+
if (fs.existsSync(coworkPluginsDir) || fs.existsSync(path.join(home, ".cowork"))) {
|
|
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 };
|
|
33
|
+
}
|
|
34
|
+
for (const p of KNOWN_PLATFORMS) {
|
|
35
|
+
if (fs.existsSync(path.join(home, p.configDir))) {
|
|
36
|
+
return {
|
|
37
|
+
platform: p.name,
|
|
38
|
+
dir: path.join(home, p.configDir, p.skillsSubDir),
|
|
39
|
+
source: "detected",
|
|
40
|
+
cowork: false,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
platform: "Claude Code",
|
|
46
|
+
dir: path.join(home, ".claude", "skills"),
|
|
47
|
+
source: "default",
|
|
48
|
+
cowork: false,
|
|
49
|
+
};
|
|
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
|
+
}
|
|
94
|
+
const CLAUDE_MD_BLOCK_START = "<!-- siteskills:start -->";
|
|
95
|
+
const CLAUDE_MD_BLOCK_END = "<!-- siteskills:end -->";
|
|
96
|
+
const CLAUDE_MD_RULE = `${CLAUDE_MD_BLOCK_START}
|
|
97
|
+
## SiteSkills — Installed Navigation Skills
|
|
98
|
+
|
|
99
|
+
Skills are pre-installed in your skills directory. When a task involves browsing or automating a specific website:
|
|
100
|
+
|
|
101
|
+
1. **Check for a matching skill first.** A skill for that domain may already be installed. Invoke it via the Skill tool before doing anything else.
|
|
102
|
+
2. **Follow the skill's Agent Paths section** — it tells you whether to use a direct API/data source or a browser, and which selectors are verified.
|
|
103
|
+
3. **Installed skills take precedence over ad-hoc browser navigation.** They contain verified selectors, known gotchas, and faster programmatic paths.
|
|
104
|
+
|
|
105
|
+
If no skill matches the domain, proceed normally.
|
|
106
|
+
${CLAUDE_MD_BLOCK_END}`;
|
|
107
|
+
/**
|
|
108
|
+
* Writes the SiteSkills invocation rule to ~/.claude/CLAUDE.md (Claude Code only).
|
|
109
|
+
* Idempotent — replaces the existing block if present, adds it if not.
|
|
110
|
+
*/
|
|
111
|
+
function ensureClaudeCodeRule(claudeConfigDir) {
|
|
112
|
+
const claudeMdPath = path.join(claudeConfigDir, "CLAUDE.md");
|
|
113
|
+
let existing = "";
|
|
114
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
115
|
+
existing = fs.readFileSync(claudeMdPath, "utf-8");
|
|
116
|
+
}
|
|
117
|
+
if (existing.includes(CLAUDE_MD_RULE))
|
|
118
|
+
return;
|
|
119
|
+
if (existing.includes(CLAUDE_MD_BLOCK_START)) {
|
|
120
|
+
const startIdx = existing.indexOf(CLAUDE_MD_BLOCK_START);
|
|
121
|
+
const endIdx = existing.indexOf(CLAUDE_MD_BLOCK_END);
|
|
122
|
+
if (endIdx !== -1) {
|
|
123
|
+
existing =
|
|
124
|
+
existing.slice(0, startIdx) +
|
|
125
|
+
CLAUDE_MD_RULE +
|
|
126
|
+
existing.slice(endIdx + CLAUDE_MD_BLOCK_END.length);
|
|
127
|
+
}
|
|
18
128
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
129
|
+
else {
|
|
130
|
+
existing = existing
|
|
131
|
+
? existing.trimEnd() + "\n\n" + CLAUDE_MD_RULE + "\n"
|
|
132
|
+
: CLAUDE_MD_RULE + "\n";
|
|
23
133
|
}
|
|
24
|
-
|
|
25
|
-
|
|
134
|
+
fs.mkdirSync(claudeConfigDir, { recursive: true });
|
|
135
|
+
fs.writeFileSync(claudeMdPath, existing, "utf-8");
|
|
26
136
|
}
|
|
27
137
|
export async function installCommand(slug, options) {
|
|
28
138
|
if (!slug || slug.trim().length === 0) {
|
|
@@ -32,7 +142,6 @@ export async function installCommand(slug, options) {
|
|
|
32
142
|
const baseUrl = getApiUrl();
|
|
33
143
|
const spinner = ora(`Downloading ${chalk.bold(slug)}...`).start();
|
|
34
144
|
try {
|
|
35
|
-
// Fetch the raw SKILL.md content
|
|
36
145
|
const res = await fetch(`${baseUrl}/api/skills/${encodeURIComponent(slug)}/content`);
|
|
37
146
|
if (!res.ok) {
|
|
38
147
|
if (res.status === 404) {
|
|
@@ -49,22 +158,53 @@ export async function installCommand(slug, options) {
|
|
|
49
158
|
spinner.fail(chalk.red(`Skill "${slug}" has no content.`));
|
|
50
159
|
process.exit(1);
|
|
51
160
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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.
|
|
179
|
+
const skillDir = path.join(detection.dir, slug);
|
|
55
180
|
const skillFile = path.join(skillDir, "SKILL.md");
|
|
56
|
-
// Check if already installed
|
|
57
181
|
if (fs.existsSync(skillFile)) {
|
|
58
182
|
spinner.info(chalk.yellow(`Skill "${slug}" is already installed. Updating...`));
|
|
59
183
|
}
|
|
60
|
-
// Create directory and write file
|
|
61
184
|
fs.mkdirSync(skillDir, { recursive: true });
|
|
62
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.
|
|
188
|
+
const home = os.homedir();
|
|
189
|
+
if (detection.platform === "Claude Code" &&
|
|
190
|
+
(detection.source === "detected" || detection.source === "default")) {
|
|
191
|
+
ensureClaudeCodeRule(path.join(home, ".claude"));
|
|
192
|
+
}
|
|
63
193
|
spinner.succeed(chalk.green(`Installed ${chalk.bold(slug)}`));
|
|
64
194
|
console.log(chalk.dim(` ${skillFile}`));
|
|
65
195
|
console.log(chalk.dim(` ${content.split("\n").length} lines, ${content.length} chars`));
|
|
196
|
+
const platformNote = detection.source === "detected"
|
|
197
|
+
? `Detected platform: ${detection.platform}`
|
|
198
|
+
: detection.source === "flag" || detection.source === "env"
|
|
199
|
+
? `Using custom directory`
|
|
200
|
+
: `Using default path (${detection.platform} not detected — use --dir to override)`;
|
|
201
|
+
console.log(chalk.dim(` ${platformNote}`));
|
|
66
202
|
console.log();
|
|
67
203
|
console.log(chalk.dim(" Your AI agent will auto-discover this skill on next use."));
|
|
204
|
+
if (detection.source === "default") {
|
|
205
|
+
console.log(chalk.dim(" If you use a different AI platform, re-run with:"));
|
|
206
|
+
console.log(chalk.dim(" siteskills install " + slug + " --dir /path/to/your/skills/dir"));
|
|
207
|
+
}
|
|
68
208
|
}
|
|
69
209
|
catch (err) {
|
|
70
210
|
spinner.fail(chalk.red(`Failed to install "${slug}".`));
|
|
@@ -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,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|