@ichintansoni/skills-master 0.1.12 → 0.1.14
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/bin.js +24 -4
- package/package.json +1 -1
package/dist/bin.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
|
|
6
6
|
// package.json
|
|
7
|
-
var version = "0.1.
|
|
7
|
+
var version = "0.1.14";
|
|
8
8
|
|
|
9
9
|
// src/schema/projectConfig.ts
|
|
10
10
|
import { z } from "zod";
|
|
@@ -549,7 +549,13 @@ import matter from "gray-matter";
|
|
|
549
549
|
// src/schema/frontmatter.ts
|
|
550
550
|
import { z as z4 } from "zod";
|
|
551
551
|
import semver from "semver";
|
|
552
|
-
var NAME_RE = /^[a-z0-9-]
|
|
552
|
+
var NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
553
|
+
var NAME_MAX_LENGTH = 64;
|
|
554
|
+
var RESERVED_NAME_WORDS = ["anthropic", "claude"];
|
|
555
|
+
var SkillNameSchema = z4.string().max(NAME_MAX_LENGTH, `must be at most ${NAME_MAX_LENGTH} characters`).regex(NAME_RE, "must be kebab-case ([a-z0-9] words joined by single hyphens)").refine(
|
|
556
|
+
(n) => !RESERVED_NAME_WORDS.some((w) => n.includes(w)),
|
|
557
|
+
`must not contain the reserved words ${RESERVED_NAME_WORDS.map((w) => `"${w}"`).join(" or ")}`
|
|
558
|
+
);
|
|
553
559
|
var ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
554
560
|
var StabilitySchema = z4.enum(["stable", "emerging", "contested"]);
|
|
555
561
|
var SkillClassSchema = z4.enum(["code", "design", "lang-tooling", "overview"]);
|
|
@@ -566,7 +572,7 @@ var XSkillsMasterSchema = z4.object({
|
|
|
566
572
|
platforms: z4.array(z4.string().min(1)).min(1),
|
|
567
573
|
/** domain-defined version requirements, e.g. { ios: "17", swift: "6.0" }. */
|
|
568
574
|
requires: z4.record(z4.string(), z4.string()).optional(),
|
|
569
|
-
pairs_with: z4.array(
|
|
575
|
+
pairs_with: z4.array(SkillNameSchema).default([]),
|
|
570
576
|
/** citation URLs to canonical docs — never verbatim content. */
|
|
571
577
|
sources: z4.array(z4.url()).default([]),
|
|
572
578
|
snapshot_date: z4.string().regex(ISO_DATE_RE, "must be an ISO date (YYYY-MM-DD)"),
|
|
@@ -575,7 +581,7 @@ var XSkillsMasterSchema = z4.object({
|
|
|
575
581
|
}).strict();
|
|
576
582
|
var GlobsSchema = z4.union([z4.string(), z4.array(z4.string())]).transform((g) => Array.isArray(g) ? g : [g]).optional();
|
|
577
583
|
var FrontmatterSchema = z4.looseObject({
|
|
578
|
-
name:
|
|
584
|
+
name: SkillNameSchema,
|
|
579
585
|
description: z4.string().min(1, "description is required").max(1024, "description must be <= 1024 characters"),
|
|
580
586
|
globs: GlobsSchema,
|
|
581
587
|
tags: z4.array(z4.string()).default([]),
|
|
@@ -1708,6 +1714,7 @@ var CANONICAL_HEADINGS = [
|
|
|
1708
1714
|
];
|
|
1709
1715
|
var MAX_BODY_LINES = 500;
|
|
1710
1716
|
var WARN_BODY_LINES = 450;
|
|
1717
|
+
var XML_TAG_RE = /<[A-Za-z/]/;
|
|
1711
1718
|
function today() {
|
|
1712
1719
|
return (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
1713
1720
|
}
|
|
@@ -1788,6 +1795,15 @@ function lintSkills(skillsRoot) {
|
|
|
1788
1795
|
if (!/use when/i.test(fm.description)) {
|
|
1789
1796
|
push("warn", `description should include a "Use when ..." trigger clause`);
|
|
1790
1797
|
}
|
|
1798
|
+
const tagAt = fm.description.search(XML_TAG_RE);
|
|
1799
|
+
if (tagAt !== -1) {
|
|
1800
|
+
const end = fm.description.indexOf(">", tagAt);
|
|
1801
|
+
const snippet = fm.description.slice(tagAt, end === -1 ? tagAt + 20 : end + 1);
|
|
1802
|
+
push(
|
|
1803
|
+
"warn",
|
|
1804
|
+
`description contains XML-tag-shaped text "${snippet}" \u2014 Claude's skill validation rejects tags; reword it (e.g. "a VerificationResult of Transaction")`
|
|
1805
|
+
);
|
|
1806
|
+
}
|
|
1791
1807
|
if (xm.snapshot_date > todayStr) {
|
|
1792
1808
|
push("error", `snapshot_date ${xm.snapshot_date} is in the future`);
|
|
1793
1809
|
}
|
|
@@ -2128,6 +2144,10 @@ async function newSkillCommand(opts) {
|
|
|
2128
2144
|
const cls = SkillClassSchema.parse(parts[1]);
|
|
2129
2145
|
const category = parts[2];
|
|
2130
2146
|
const name = parts[parts.length - 1];
|
|
2147
|
+
const nameCheck = SkillNameSchema.safeParse(name);
|
|
2148
|
+
if (!nameCheck.success) {
|
|
2149
|
+
throw new Error(`Invalid skill name "${name}": ${nameCheck.error.issues[0].message}.`);
|
|
2150
|
+
}
|
|
2131
2151
|
const content = await resolveContent({ content: opts.content, cwd: opts.cwd });
|
|
2132
2152
|
const dir = join12(content.root, domain, CLASS_DIR[cls], ...parts.slice(2));
|
|
2133
2153
|
const skillMd = join12(dir, "SKILL.md");
|
package/package.json
CHANGED