@nacre.work/core 0.28.1 → 0.29.1

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/skill.js ADDED
@@ -0,0 +1,352 @@
1
+ /**
2
+ * A skill, in Claude's folder format: what it is, what is refused, and how it
3
+ * travels as a zip.
4
+ *
5
+ * docs/skills.md is the specification. This module is the one place the format
6
+ * is decided — the API, the MCP tools, the console and the panel all hand a
7
+ * folder to `checkSkill` and get back either a skill or one sentence saying why
8
+ * not, so a skill accepted by one surface is accepted by every other.
9
+ *
10
+ * **Compatible means Claude accepts it.** The frontmatter rules are Claude's:
11
+ * `name` lower case letters, digits and hyphens, at most 64 characters, and not
12
+ * naming Anthropic or Claude; `description` 1 to 1024 characters and no XML
13
+ * tags. A folder this accepts is one Claude Code and claude.ai accept, and an
14
+ * export from here is one they accept — which is the property a skill moved
15
+ * between them depends on.
16
+ *
17
+ * Every bound is a refusal, never a truncation. A truncated skill is
18
+ * instructions that stop mid-sentence, which an agent then follows.
19
+ */
20
+ import { crc32, inflateRawSync } from 'node:zlib';
21
+ export const SKILL_FILE = 'SKILL.md';
22
+ export const SKILL_LIMITS = {
23
+ files: 64,
24
+ fileBytes: 256 * 1024,
25
+ totalBytes: 1024 * 1024,
26
+ pathLength: 256,
27
+ nameLength: 64,
28
+ descriptionLength: 1024,
29
+ };
30
+ const NAME = /^[a-z0-9]+(-[a-z0-9]+)*$/;
31
+ const RESERVED = /anthropic|claude/;
32
+ const XML_TAG = /<\/?[A-Za-z][^>]*>/;
33
+ const refused = (reason) => ({ kind: 'refused', reason });
34
+ /**
35
+ * A path inside a skill, or the reason it is not one.
36
+ *
37
+ * Relative, forward slashes, no `.` or `..` segment, no empty segment. The
38
+ * paths become keys of a JSON object and entries of a zip somebody else
39
+ * unpacks, so a `..` here is a file written outside the folder on the machine
40
+ * that extracts it.
41
+ */
42
+ export function skillPathError(path) {
43
+ if (path.length === 0)
44
+ return 'a file has an empty path';
45
+ if (path.length > SKILL_LIMITS.pathLength)
46
+ return `${path.slice(0, 40)}…: a path is at most ${String(SKILL_LIMITS.pathLength)} characters`;
47
+ if (path.startsWith('/'))
48
+ return `${path}: paths are relative to the skill's folder`;
49
+ if (path.includes('\\'))
50
+ return `${path}: paths use forward slashes`;
51
+ // eslint-disable-next-line no-control-regex -- refusing control characters is the point
52
+ if (/[\u0000-\u001f\u007f]/.test(path))
53
+ return `${path}: a path carries a control character`;
54
+ for (const segment of path.split('/')) {
55
+ if (segment === '')
56
+ return `${path}: a path has an empty segment`;
57
+ if (segment === '.' || segment === '..')
58
+ return `${path}: a path may not contain "${segment}"`;
59
+ }
60
+ return undefined;
61
+ }
62
+ /**
63
+ * The frontmatter at the top of `SKILL.md`, and the body after it.
64
+ *
65
+ * A small subset of YAML, because that is all a skill's frontmatter is:
66
+ * `key: value` lines, quoted or plain, and `|` / `>` blocks for a description
67
+ * that runs over several lines. Keys this does not use are kept in the file as
68
+ * written — nothing here rewrites a skill — and only `name` and `description`
69
+ * are read.
70
+ */
71
+ export function readFrontmatter(text) {
72
+ const normalized = text.replace(/^\uFEFF/, '').replace(/\r\n/g, '\n');
73
+ if (!normalized.startsWith('---\n')) {
74
+ return { error: 'SKILL.md must open with frontmatter: a line of "---", name and description, and "---"' };
75
+ }
76
+ const end = normalized.indexOf('\n---', 4);
77
+ if (end === -1)
78
+ return { error: 'SKILL.md opens frontmatter and never closes it with "---"' };
79
+ const afterClose = normalized.indexOf('\n', end + 4);
80
+ const body = afterClose === -1 ? '' : normalized.slice(afterClose + 1);
81
+ const lines = normalized.slice(4, end).split('\n');
82
+ const fields = {};
83
+ for (let i = 0; i < lines.length; i += 1) {
84
+ const line = lines[i] ?? '';
85
+ if (line.trim() === '' || line.trimStart().startsWith('#'))
86
+ continue;
87
+ if (/^\s/.test(line))
88
+ continue; // a nested value under a key this does not read
89
+ const colon = line.indexOf(':');
90
+ if (colon <= 0)
91
+ return { error: `SKILL.md frontmatter line ${String(i + 2)} is not "key: value"` };
92
+ const key = line.slice(0, colon).trim();
93
+ let value = line.slice(colon + 1).trim();
94
+ if (value === '|' || value === '>' || value === '|-' || value === '>-') {
95
+ const block = [];
96
+ while (i + 1 < lines.length && (/^\s/.test(lines[i + 1] ?? '') || (lines[i + 1] ?? '') === '')) {
97
+ i += 1;
98
+ block.push((lines[i] ?? '').trim());
99
+ }
100
+ value = value.startsWith('|') ? block.join('\n').trim() : block.filter((b) => b !== '').join(' ').trim();
101
+ }
102
+ else if ((value.startsWith('"') && value.endsWith('"') && value.length >= 2) ||
103
+ (value.startsWith("'") && value.endsWith("'") && value.length >= 2)) {
104
+ value = value.startsWith('"')
105
+ ? value.slice(1, -1).replace(/\\"/g, '"').replace(/\\n/g, '\n').replace(/\\\\/g, '\\')
106
+ : value.slice(1, -1).replace(/''/g, "'");
107
+ }
108
+ fields[key] = value;
109
+ }
110
+ return { fields, body };
111
+ }
112
+ /**
113
+ * A folder, checked: a skill, a clearing, or one sentence saying why not.
114
+ *
115
+ * Takes `unknown` because every caller is handing it something a client sent —
116
+ * a JSON body, a tool argument, the entries of a zip — and the shape is part of
117
+ * what is checked.
118
+ */
119
+ export function checkSkill(input) {
120
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) {
121
+ return refused('files must be an object of path to text');
122
+ }
123
+ const entries = Object.entries(input);
124
+ if (entries.length === 0)
125
+ return { kind: 'cleared' };
126
+ if (entries.length > SKILL_LIMITS.files) {
127
+ return refused(`a skill has at most ${String(SKILL_LIMITS.files)} files, and this has ${String(entries.length)}`);
128
+ }
129
+ const files = {};
130
+ let total = 0;
131
+ for (const [path, content] of entries) {
132
+ const pathError = skillPathError(path);
133
+ if (pathError !== undefined)
134
+ return refused(pathError);
135
+ if (typeof content !== 'string')
136
+ return refused(`${path}: a file's content must be text`);
137
+ // NUL is the one character no text file carries and every binary one does.
138
+ if (content.includes('\u0000'))
139
+ return refused(`${path}: binary files are not accepted, only text`);
140
+ const bytes = Buffer.byteLength(content, 'utf8');
141
+ if (bytes > SKILL_LIMITS.fileBytes) {
142
+ return refused(`${path}: a file is at most ${String(SKILL_LIMITS.fileBytes / 1024)} KiB, and this is ${String(Math.ceil(bytes / 1024))} KiB`);
143
+ }
144
+ total += bytes;
145
+ files[path] = content;
146
+ }
147
+ if (total > SKILL_LIMITS.totalBytes) {
148
+ return refused(`a skill is at most ${String(SKILL_LIMITS.totalBytes / 1024)} KiB in all, and this is ${String(Math.ceil(total / 1024))} KiB`);
149
+ }
150
+ const main = files[SKILL_FILE];
151
+ if (main === undefined)
152
+ return refused(`a skill needs ${SKILL_FILE} at the top of its folder`);
153
+ const read = readFrontmatter(main);
154
+ if ('error' in read)
155
+ return refused(read.error);
156
+ if (read.body.trim() === '' && entries.length === 1)
157
+ return { kind: 'cleared' };
158
+ if (read.body.trim() === '')
159
+ return refused(`${SKILL_FILE} has no body, but the folder has other files; an empty skill is cleared by sending no files`);
160
+ const name = read.fields['name'] ?? '';
161
+ if (name === '')
162
+ return refused(`${SKILL_FILE} frontmatter has no name`);
163
+ if (name.length > SKILL_LIMITS.nameLength)
164
+ return refused(`name is at most ${String(SKILL_LIMITS.nameLength)} characters`);
165
+ if (!NAME.test(name))
166
+ return refused('name is lower case letters, digits and single hyphens, like "handbook-layer"');
167
+ if (RESERVED.test(name))
168
+ return refused('name may not contain "anthropic" or "claude" — Claude refuses such a skill');
169
+ const description = read.fields['description'] ?? '';
170
+ if (description === '')
171
+ return refused(`${SKILL_FILE} frontmatter has no description, and it is what an agent reads to decide to use the skill`);
172
+ if (description.length > SKILL_LIMITS.descriptionLength) {
173
+ return refused(`description is at most ${String(SKILL_LIMITS.descriptionLength)} characters`);
174
+ }
175
+ if (XML_TAG.test(description))
176
+ return refused('description may not contain XML tags — Claude refuses such a skill');
177
+ const hasScripts = Object.keys(files).some((p) => p.startsWith('scripts/'));
178
+ return { kind: 'skill', skill: { name, description, hasScripts, files } };
179
+ }
180
+ /** The body of `SKILL.md`, without its frontmatter. */
181
+ export function skillBody(skill) {
182
+ const read = readFrontmatter(skill.files[SKILL_FILE] ?? '');
183
+ return 'error' in read ? '' : read.body.trim();
184
+ }
185
+ // ─── zip ─────────────────────────────────────────────────────────────────────
186
+ //
187
+ // By hand rather than a dependency, on the parser's argument: this reads bytes
188
+ // a client uploaded, and a library's parser bugs become ours on that path. The
189
+ // subset is small — stored and deflated entries, no encryption, no ZIP64 — and
190
+ // every bound is checked while reading rather than after, so a zip bomb is
191
+ // refused at the byte that crosses the line.
192
+ const LOCAL = 0x04034b50;
193
+ const CENTRAL = 0x02014b50;
194
+ const END = 0x06054b50;
195
+ /** A folder as a zip, entries under `folder/` and stored uncompressed. */
196
+ export function writeSkillZip(folder, files) {
197
+ const locals = [];
198
+ const centrals = [];
199
+ let offset = 0;
200
+ const time = 0;
201
+ const date = (1 << 5) | 1; // 1980-01-01: reproducible bytes for the same skill
202
+ for (const [path, content] of Object.entries(files).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {
203
+ const name = Buffer.from(`${folder}/${path}`, 'utf8');
204
+ const data = Buffer.from(content, 'utf8');
205
+ const crc = crc32(data);
206
+ const local = Buffer.alloc(30);
207
+ local.writeUInt32LE(LOCAL, 0);
208
+ local.writeUInt16LE(20, 4); // version needed
209
+ local.writeUInt16LE(0x0800, 6); // UTF-8 names
210
+ local.writeUInt16LE(0, 8); // stored
211
+ local.writeUInt16LE(time, 10);
212
+ local.writeUInt16LE(date, 12);
213
+ local.writeUInt32LE(crc, 14);
214
+ local.writeUInt32LE(data.length, 18);
215
+ local.writeUInt32LE(data.length, 22);
216
+ local.writeUInt16LE(name.length, 26);
217
+ local.writeUInt16LE(0, 28);
218
+ locals.push(local, name, data);
219
+ const central = Buffer.alloc(46);
220
+ central.writeUInt32LE(CENTRAL, 0);
221
+ central.writeUInt16LE(20, 4); // version made by
222
+ central.writeUInt16LE(20, 6);
223
+ central.writeUInt16LE(0x0800, 8);
224
+ central.writeUInt16LE(0, 10);
225
+ central.writeUInt16LE(time, 12);
226
+ central.writeUInt16LE(date, 14);
227
+ central.writeUInt32LE(crc, 16);
228
+ central.writeUInt32LE(data.length, 20);
229
+ central.writeUInt32LE(data.length, 24);
230
+ central.writeUInt16LE(name.length, 28);
231
+ central.writeUInt32LE(offset, 42);
232
+ centrals.push(central, name);
233
+ offset += local.length + name.length + data.length;
234
+ }
235
+ const directory = Buffer.concat(centrals);
236
+ const end = Buffer.alloc(22);
237
+ end.writeUInt32LE(END, 0);
238
+ const count = Object.keys(files).length;
239
+ end.writeUInt16LE(count, 8);
240
+ end.writeUInt16LE(count, 10);
241
+ end.writeUInt32LE(directory.length, 12);
242
+ end.writeUInt32LE(offset, 16);
243
+ return Buffer.concat([...locals, directory, end]);
244
+ }
245
+ /**
246
+ * The files of a skill zip, or the reason it is not one.
247
+ *
248
+ * A zip made by Finder or by Claude's own export has the skill inside one top
249
+ * folder; that folder is removed, so `my-skill/SKILL.md` and `SKILL.md` read the
250
+ * same. `__MACOSX/` and `.DS_Store` are skipped, because every zip made on a Mac
251
+ * carries them and none of them is part of a skill.
252
+ */
253
+ export function readSkillZip(zip) {
254
+ const buf = Buffer.from(zip.buffer, zip.byteOffset, zip.byteLength);
255
+ const fail = (error) => ({ error });
256
+ // The end record is in the last 64 KiB + 22 bytes; a comment can push it back.
257
+ let endAt = -1;
258
+ for (let i = buf.length - 22; i >= Math.max(0, buf.length - 22 - 0xffff); i -= 1) {
259
+ if (buf.readUInt32LE(i) === END) {
260
+ endAt = i;
261
+ break;
262
+ }
263
+ }
264
+ if (endAt === -1)
265
+ return fail('not a zip archive');
266
+ const count = buf.readUInt16LE(endAt + 10);
267
+ const dirSize = buf.readUInt32LE(endAt + 12);
268
+ const dirOffset = buf.readUInt32LE(endAt + 16);
269
+ if (count === 0xffff || dirOffset === 0xffffffff)
270
+ return fail('ZIP64 archives are not accepted');
271
+ if (dirOffset + dirSize > endAt)
272
+ return fail('the archive directory points outside the file');
273
+ if (count > SKILL_LIMITS.files * 4)
274
+ return fail(`the archive has ${String(count)} entries; a skill has at most ${String(SKILL_LIMITS.files)} files`);
275
+ const raw = {};
276
+ let total = 0;
277
+ let at = dirOffset;
278
+ const decoder = new TextDecoder('utf-8', { fatal: true });
279
+ for (let n = 0; n < count; n += 1) {
280
+ if (at + 46 > buf.length || buf.readUInt32LE(at) !== CENTRAL)
281
+ return fail('the archive directory is damaged');
282
+ const flags = buf.readUInt16LE(at + 8);
283
+ const method = buf.readUInt16LE(at + 10);
284
+ // The central directory's checksum, not the local header's: an entry written
285
+ // with a data descriptor (flag bit 3) carries zero in the local header.
286
+ const expectedCrc = buf.readUInt32LE(at + 16);
287
+ const compressed = buf.readUInt32LE(at + 20);
288
+ const size = buf.readUInt32LE(at + 24);
289
+ const nameLength = buf.readUInt16LE(at + 28);
290
+ const extraLength = buf.readUInt16LE(at + 30);
291
+ const commentLength = buf.readUInt16LE(at + 32);
292
+ const localOffset = buf.readUInt32LE(at + 42);
293
+ const name = buf.subarray(at + 46, at + 46 + nameLength).toString('utf8');
294
+ at += 46 + nameLength + extraLength + commentLength;
295
+ if (name.endsWith('/'))
296
+ continue;
297
+ if (name.startsWith('__MACOSX/') || name.split('/').pop() === '.DS_Store')
298
+ continue;
299
+ if ((flags & 1) !== 0)
300
+ return fail(`${name}: encrypted entries are not accepted`);
301
+ if (method !== 0 && method !== 8)
302
+ return fail(`${name}: compression method ${String(method)} is not supported; use stored or deflate`);
303
+ if (size > SKILL_LIMITS.fileBytes)
304
+ return fail(`${name}: a file is at most ${String(SKILL_LIMITS.fileBytes / 1024)} KiB`);
305
+ total += size;
306
+ if (total > SKILL_LIMITS.totalBytes)
307
+ return fail(`a skill is at most ${String(SKILL_LIMITS.totalBytes / 1024)} KiB in all`);
308
+ if (localOffset + 30 > buf.length || buf.readUInt32LE(localOffset) !== LOCAL)
309
+ return fail(`${name}: entry header is damaged`);
310
+ const dataStart = localOffset + 30 + buf.readUInt16LE(localOffset + 26) + buf.readUInt16LE(localOffset + 28);
311
+ if (dataStart + compressed > buf.length)
312
+ return fail(`${name}: entry runs past the end of the archive`);
313
+ const stored = buf.subarray(dataStart, dataStart + compressed);
314
+ let data;
315
+ if (method === 0) {
316
+ data = stored;
317
+ }
318
+ else {
319
+ try {
320
+ // One byte over the declared size, so an entry lying about its size is
321
+ // caught by the length check rather than inflated without bound.
322
+ data = inflateRawSync(stored, { maxOutputLength: size + 1 });
323
+ }
324
+ catch {
325
+ return fail(`${name}: entry does not decompress, or is larger than it declares`);
326
+ }
327
+ }
328
+ if (data.length !== size)
329
+ return fail(`${name}: entry is not the size it declares`);
330
+ if (crc32(data) !== expectedCrc) {
331
+ return fail(`${name}: entry is damaged (checksum mismatch)`);
332
+ }
333
+ try {
334
+ raw[name] = decoder.decode(data);
335
+ }
336
+ catch {
337
+ return fail(`${name}: binary files are not accepted, only UTF-8 text`);
338
+ }
339
+ }
340
+ // One top folder holding SKILL.md, and nothing at the root: unwrap it.
341
+ const names = Object.keys(raw);
342
+ const tops = new Set(names.map((p) => p.split('/')[0]));
343
+ if (names.length > 0 && !names.includes(SKILL_FILE) && tops.size === 1 && names.every((p) => p.includes('/'))) {
344
+ const top = `${[...tops][0] ?? ''}/`;
345
+ const unwrapped = {};
346
+ for (const [path, content] of Object.entries(raw))
347
+ unwrapped[path.slice(top.length)] = content;
348
+ return { files: unwrapped };
349
+ }
350
+ return { files: raw };
351
+ }
352
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../skill.ts"],"names":[],"mappings":"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"}