@take-out/cli 0.1.46 → 0.1.47
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/README.md +4 -4
- package/dist/cjs/commands/skills.cjs +20 -66
- package/dist/cjs/commands/skills.js +16 -54
- package/dist/cjs/commands/skills.js.map +1 -1
- package/dist/esm/commands/skills.js +17 -56
- package/dist/esm/commands/skills.js.map +1 -1
- package/dist/esm/commands/skills.mjs +21 -67
- package/dist/esm/commands/skills.mjs.map +1 -1
- package/package.json +4 -4
- package/src/commands/skills.ts +29 -79
- package/types/commands/skills.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -88,8 +88,8 @@ takeout skills generate --clean # clean and regenerate
|
|
|
88
88
|
The `skills generate` command generates Claude Code skills from your documentation:
|
|
89
89
|
|
|
90
90
|
1. scans docs from both `./docs/` (local) and package docs
|
|
91
|
-
2.
|
|
92
|
-
3.
|
|
91
|
+
2. only docs with YAML frontmatter containing `name` and `description` become skills
|
|
92
|
+
3. those docs are symlinked into `.claude/skills/`
|
|
93
93
|
|
|
94
94
|
**adding frontmatter to docs (recommended):**
|
|
95
95
|
|
|
@@ -104,8 +104,8 @@ description: What this skill does. Keywords for when Claude should use it.
|
|
|
104
104
|
content here...
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
docs with frontmatter get symlinked directly
|
|
108
|
-
|
|
107
|
+
docs with frontmatter get symlinked directly, so edits to the source doc update
|
|
108
|
+
the skill automatically. docs without that frontmatter are skipped.
|
|
109
109
|
|
|
110
110
|
**regenerating skills:**
|
|
111
111
|
|
|
@@ -62,37 +62,6 @@ function isDevOnly(content) {
|
|
|
62
62
|
const frontmatter = content.slice(3, endIndex);
|
|
63
63
|
return /\bdev:\s*true\b/.test(frontmatter);
|
|
64
64
|
}
|
|
65
|
-
function extractDocMeta(content) {
|
|
66
|
-
const lines = content.split(`
|
|
67
|
-
`);
|
|
68
|
-
let title = "",
|
|
69
|
-
description = "",
|
|
70
|
-
startLine = 0;
|
|
71
|
-
if (lines[0]?.trim() === "---") {
|
|
72
|
-
for (let i = 1; i < lines.length; i++) if (lines[i]?.trim() === "---") {
|
|
73
|
-
startLine = i + 1;
|
|
74
|
-
break;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
for (let i = startLine; i < lines.length; i++) {
|
|
78
|
-
const trimmed = lines[i]?.trim() || "";
|
|
79
|
-
if (!title && trimmed.startsWith("# ")) {
|
|
80
|
-
title = trimmed.slice(2).trim();
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
if (title && trimmed && !trimmed.startsWith("#")) {
|
|
84
|
-
description = trimmed;
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return {
|
|
89
|
-
title,
|
|
90
|
-
description
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
function toSkillName(name) {
|
|
94
|
-
return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
|
|
95
|
-
}
|
|
96
65
|
function collectAllDocs(cwd) {
|
|
97
66
|
const docs = [],
|
|
98
67
|
seen = /* @__PURE__ */new Set(),
|
|
@@ -138,12 +107,14 @@ async function generateDocSkills(cwd, clean) {
|
|
|
138
107
|
let symlinked = 0,
|
|
139
108
|
generated = 0,
|
|
140
109
|
unchanged = 0,
|
|
141
|
-
removed = 0
|
|
110
|
+
removed = 0,
|
|
111
|
+
skipped = 0;
|
|
142
112
|
const isDev = !!process.env.IS_TAMAGUI_DEV;
|
|
143
113
|
for (const doc of docs) {
|
|
144
114
|
const content = (0, import_node_fs.readFileSync)(doc.path, "utf-8");
|
|
145
115
|
if (isDevOnly(content) && !isDev) continue;
|
|
146
|
-
|
|
116
|
+
const hasFrontmatter = hasSkillFrontmatter(content);
|
|
117
|
+
if (hasFrontmatter) {
|
|
147
118
|
const nameMatch = content.match(/^---\s*\nname:\s*([^\n]+)/m);
|
|
148
119
|
if (!nameMatch) continue;
|
|
149
120
|
const skillName = nameMatch[1].trim();
|
|
@@ -162,41 +133,22 @@ async function generateDocSkills(cwd, clean) {
|
|
|
162
133
|
(0, import_node_fs.symlinkSync)(relativePath, skillFile), symlinked++;
|
|
163
134
|
const sourceLabel = doc.source === "local" ? import_picocolors.default.blue("local") : import_picocolors.default.dim("package");
|
|
164
135
|
console.info(` ${import_picocolors.default.green("\u27F7")} ${skillName} ${sourceLabel} ${import_picocolors.default.dim("(symlink)")}`);
|
|
165
|
-
} else {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
expectedSkillNames.add(skillName);
|
|
169
|
-
const skillDir = (0, import_node_path.join)(skillsDir, skillName),
|
|
170
|
-
skillFile = (0, import_node_path.join)(skillDir, "SKILL.md");
|
|
171
|
-
(0, import_node_fs.existsSync)(skillDir) || (0, import_node_fs.mkdirSync)(skillDir, {
|
|
172
|
-
recursive: !0
|
|
173
|
-
});
|
|
174
|
-
const {
|
|
175
|
-
title,
|
|
176
|
-
description
|
|
177
|
-
} = extractDocMeta(content),
|
|
178
|
-
skillDescription = description ? `${title}. ${description}`.slice(0, 1024) : title.slice(0, 1024),
|
|
179
|
-
skillContent = `---
|
|
180
|
-
name: ${skillName}
|
|
181
|
-
description: ${skillDescription}
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
${content}
|
|
185
|
-
`;
|
|
186
|
-
let shouldWrite = !0;
|
|
187
|
-
try {
|
|
188
|
-
(0, import_node_fs.lstatSync)(skillFile).isSymbolicLink() ? (0, import_node_fs.unlinkSync)(skillFile) : (0, import_node_fs.readFileSync)(skillFile, "utf-8") === skillContent && (unchanged++, shouldWrite = !1);
|
|
189
|
-
} catch {}
|
|
190
|
-
if (!shouldWrite) continue;
|
|
191
|
-
(0, import_node_fs.writeFileSync)(skillFile, skillContent), generated++;
|
|
192
|
-
const sourceLabel = doc.source === "local" ? import_picocolors.default.blue("local") : import_picocolors.default.dim("package");
|
|
193
|
-
console.info(` ${import_picocolors.default.green("\u2713")} ${skillName} ${sourceLabel} ${import_picocolors.default.dim("(generated)")}`);
|
|
136
|
+
} else if (!hasFrontmatter) {
|
|
137
|
+
skipped++, console.info(` ${import_picocolors.default.yellow("!")} skipped ${import_picocolors.default.dim(doc.name)} ${import_picocolors.default.dim("(missing skill frontmatter)")}`);
|
|
138
|
+
continue;
|
|
194
139
|
}
|
|
195
140
|
}
|
|
196
141
|
for (const dir of (0, import_node_fs.readdirSync)(skillsDir)) {
|
|
197
142
|
if (expectedSkillNames.has(dir)) continue;
|
|
198
143
|
const skillDir = (0, import_node_path.join)(skillsDir, dir),
|
|
199
144
|
skillFile = (0, import_node_path.join)(skillDir, "SKILL.md");
|
|
145
|
+
if (dir.startsWith(SKILL_PREFIX)) {
|
|
146
|
+
(0, import_node_fs.rmSync)(skillDir, {
|
|
147
|
+
recursive: !0,
|
|
148
|
+
force: !0
|
|
149
|
+
}), removed++, console.info(` ${import_picocolors.default.red("\u2715")} ${dir} ${import_picocolors.default.dim("(removed stale generated skill)")}`);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
200
152
|
let shouldUnlink = !1;
|
|
201
153
|
try {
|
|
202
154
|
if ((0, import_node_fs.lstatSync)(skillFile).isSymbolicLink()) {
|
|
@@ -211,7 +163,8 @@ ${content}
|
|
|
211
163
|
symlinked,
|
|
212
164
|
generated,
|
|
213
165
|
unchanged,
|
|
214
|
-
removed
|
|
166
|
+
removed,
|
|
167
|
+
skipped
|
|
215
168
|
};
|
|
216
169
|
}
|
|
217
170
|
const generateCommand = (0, import_citty.defineCommand)({
|
|
@@ -240,12 +193,13 @@ const generateCommand = (0, import_citty.defineCommand)({
|
|
|
240
193
|
let symlinked = 0,
|
|
241
194
|
generated = 0,
|
|
242
195
|
unchanged = 0,
|
|
243
|
-
removed = 0
|
|
196
|
+
removed = 0,
|
|
197
|
+
skipped = 0;
|
|
244
198
|
if (!args["skip-internal-docs"]) {
|
|
245
199
|
const docStats = await generateDocSkills(cwd, args.clean);
|
|
246
|
-
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, console.info();
|
|
200
|
+
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, skipped = docStats.skipped, console.info();
|
|
247
201
|
}
|
|
248
|
-
console.info(), console.info(import_picocolors.default.bold("summary:")), symlinked > 0 && console.info(` ${import_picocolors.default.green(`${symlinked} symlinked`)}`), generated > 0 && console.info(` ${import_picocolors.default.yellow(`${generated} generated`)} ${import_picocolors.default.dim("(add frontmatter to enable symlink)")}`), unchanged > 0 && console.info(` ${import_picocolors.default.dim(`${unchanged} unchanged`)}`), removed > 0 && console.info(` ${import_picocolors.default.red(`${removed} removed`)}`), console.info(import_picocolors.default.dim(` skills in ${skillsDir}`)), console.info();
|
|
202
|
+
console.info(), console.info(import_picocolors.default.bold("summary:")), symlinked > 0 && console.info(` ${import_picocolors.default.green(`${symlinked} symlinked`)}`), generated > 0 && console.info(` ${import_picocolors.default.yellow(`${generated} generated`)} ${import_picocolors.default.dim("(add frontmatter to enable symlink)")}`), skipped > 0 && console.info(` ${import_picocolors.default.yellow(`${skipped} skipped`)} ${import_picocolors.default.dim("(missing skill frontmatter)")}`), unchanged > 0 && console.info(` ${import_picocolors.default.dim(`${unchanged} unchanged`)}`), removed > 0 && console.info(` ${import_picocolors.default.red(`${removed} removed`)}`), console.info(import_picocolors.default.dim(` skills in ${skillsDir}`)), console.info();
|
|
249
203
|
}
|
|
250
204
|
}),
|
|
251
205
|
skillsCommand = (0, import_citty.defineCommand)({
|
|
@@ -48,33 +48,6 @@ function isDevOnly(content) {
|
|
|
48
48
|
const frontmatter = content.slice(3, endIndex);
|
|
49
49
|
return /\bdev:\s*true\b/.test(frontmatter);
|
|
50
50
|
}
|
|
51
|
-
function extractDocMeta(content) {
|
|
52
|
-
const lines = content.split(`
|
|
53
|
-
`);
|
|
54
|
-
let title = "", description = "", startLine = 0;
|
|
55
|
-
if (lines[0]?.trim() === "---") {
|
|
56
|
-
for (let i = 1; i < lines.length; i++)
|
|
57
|
-
if (lines[i]?.trim() === "---") {
|
|
58
|
-
startLine = i + 1;
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
for (let i = startLine; i < lines.length; i++) {
|
|
63
|
-
const trimmed = lines[i]?.trim() || "";
|
|
64
|
-
if (!title && trimmed.startsWith("# ")) {
|
|
65
|
-
title = trimmed.slice(2).trim();
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
if (title && trimmed && !trimmed.startsWith("#")) {
|
|
69
|
-
description = trimmed;
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return { title, description };
|
|
74
|
-
}
|
|
75
|
-
function toSkillName(name) {
|
|
76
|
-
return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
|
|
77
|
-
}
|
|
78
51
|
function collectAllDocs(cwd) {
|
|
79
52
|
const docs = [], seen = /* @__PURE__ */ new Set(), localDocsDir = (0, import_node_path.join)(cwd, "docs");
|
|
80
53
|
if ((0, import_node_fs.existsSync)(localDocsDir)) {
|
|
@@ -101,12 +74,13 @@ async function generateDocSkills(cwd, clean) {
|
|
|
101
74
|
dir.startsWith(SKILL_PREFIX) && (0, import_node_fs.rmSync)((0, import_node_path.join)(skillsDir, dir), { recursive: !0 });
|
|
102
75
|
}
|
|
103
76
|
(0, import_node_fs.existsSync)(skillsDir) || (0, import_node_fs.mkdirSync)(skillsDir, { recursive: !0 });
|
|
104
|
-
let symlinked = 0, generated = 0, unchanged = 0, removed = 0;
|
|
77
|
+
let symlinked = 0, generated = 0, unchanged = 0, removed = 0, skipped = 0;
|
|
105
78
|
const isDev = !!process.env.IS_TAMAGUI_DEV;
|
|
106
79
|
for (const doc of docs) {
|
|
107
80
|
const content = (0, import_node_fs.readFileSync)(doc.path, "utf-8");
|
|
108
81
|
if (isDevOnly(content) && !isDev) continue;
|
|
109
|
-
|
|
82
|
+
const hasFrontmatter = hasSkillFrontmatter(content);
|
|
83
|
+
if (hasFrontmatter) {
|
|
110
84
|
const nameMatch = content.match(/^---\s*\nname:\s*([^\n]+)/m);
|
|
111
85
|
if (!nameMatch) continue;
|
|
112
86
|
const skillName = nameMatch[1].trim();
|
|
@@ -125,34 +99,20 @@ async function generateDocSkills(cwd, clean) {
|
|
|
125
99
|
console.info(
|
|
126
100
|
` ${import_picocolors.default.green("\u27F7")} ${skillName} ${sourceLabel} ${import_picocolors.default.dim("(symlink)")}`
|
|
127
101
|
);
|
|
128
|
-
} else {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const skillDir = (0, import_node_path.join)(skillsDir, skillName), skillFile = (0, import_node_path.join)(skillDir, "SKILL.md");
|
|
132
|
-
(0, import_node_fs.existsSync)(skillDir) || (0, import_node_fs.mkdirSync)(skillDir, { recursive: !0 });
|
|
133
|
-
const { title, description } = extractDocMeta(content), skillDescription = description ? `${title}. ${description}`.slice(0, 1024) : title.slice(0, 1024), skillContent = `---
|
|
134
|
-
name: ${skillName}
|
|
135
|
-
description: ${skillDescription}
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
${content}
|
|
139
|
-
`;
|
|
140
|
-
let shouldWrite = !0;
|
|
141
|
-
try {
|
|
142
|
-
(0, import_node_fs.lstatSync)(skillFile).isSymbolicLink() ? (0, import_node_fs.unlinkSync)(skillFile) : (0, import_node_fs.readFileSync)(skillFile, "utf-8") === skillContent && (unchanged++, shouldWrite = !1);
|
|
143
|
-
} catch {
|
|
144
|
-
}
|
|
145
|
-
if (!shouldWrite) continue;
|
|
146
|
-
(0, import_node_fs.writeFileSync)(skillFile, skillContent), generated++;
|
|
147
|
-
const sourceLabel = doc.source === "local" ? import_picocolors.default.blue("local") : import_picocolors.default.dim("package");
|
|
148
|
-
console.info(
|
|
149
|
-
` ${import_picocolors.default.green("\u2713")} ${skillName} ${sourceLabel} ${import_picocolors.default.dim("(generated)")}`
|
|
102
|
+
} else if (!hasFrontmatter) {
|
|
103
|
+
skipped++, console.info(
|
|
104
|
+
` ${import_picocolors.default.yellow("!")} skipped ${import_picocolors.default.dim(doc.name)} ${import_picocolors.default.dim("(missing skill frontmatter)")}`
|
|
150
105
|
);
|
|
106
|
+
continue;
|
|
151
107
|
}
|
|
152
108
|
}
|
|
153
109
|
for (const dir of (0, import_node_fs.readdirSync)(skillsDir)) {
|
|
154
110
|
if (expectedSkillNames.has(dir)) continue;
|
|
155
111
|
const skillDir = (0, import_node_path.join)(skillsDir, dir), skillFile = (0, import_node_path.join)(skillDir, "SKILL.md");
|
|
112
|
+
if (dir.startsWith(SKILL_PREFIX)) {
|
|
113
|
+
(0, import_node_fs.rmSync)(skillDir, { recursive: !0, force: !0 }), removed++, console.info(` ${import_picocolors.default.red("\u2715")} ${dir} ${import_picocolors.default.dim("(removed stale generated skill)")}`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
156
116
|
let shouldUnlink = !1;
|
|
157
117
|
try {
|
|
158
118
|
if ((0, import_node_fs.lstatSync)(skillFile).isSymbolicLink()) {
|
|
@@ -163,7 +123,7 @@ ${content}
|
|
|
163
123
|
}
|
|
164
124
|
shouldUnlink && ((0, import_node_fs.unlinkSync)(skillFile), (0, import_node_fs.readdirSync)(skillDir).length === 0 && (0, import_node_fs.rmdirSync)(skillDir), removed++, console.info(` ${import_picocolors.default.red("\u2715")} ${dir} ${import_picocolors.default.dim("(removed stale symlink)")}`));
|
|
165
125
|
}
|
|
166
|
-
return { symlinked, generated, unchanged, removed };
|
|
126
|
+
return { symlinked, generated, unchanged, removed, skipped };
|
|
167
127
|
}
|
|
168
128
|
const generateCommand = (0, import_citty.defineCommand)({
|
|
169
129
|
meta: {
|
|
@@ -185,13 +145,15 @@ const generateCommand = (0, import_citty.defineCommand)({
|
|
|
185
145
|
async run({ args }) {
|
|
186
146
|
const cwd = process.cwd(), skillsDir = (0, import_node_path.join)(cwd, ".claude", "skills");
|
|
187
147
|
console.info(), console.info(import_picocolors.default.bold(import_picocolors.default.cyan("Generate all skills"))), console.info();
|
|
188
|
-
let symlinked = 0, generated = 0, unchanged = 0, removed = 0;
|
|
148
|
+
let symlinked = 0, generated = 0, unchanged = 0, removed = 0, skipped = 0;
|
|
189
149
|
if (!args["skip-internal-docs"]) {
|
|
190
150
|
const docStats = await generateDocSkills(cwd, args.clean);
|
|
191
|
-
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, console.info();
|
|
151
|
+
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, skipped = docStats.skipped, console.info();
|
|
192
152
|
}
|
|
193
153
|
console.info(), console.info(import_picocolors.default.bold("summary:")), symlinked > 0 && console.info(` ${import_picocolors.default.green(`${symlinked} symlinked`)}`), generated > 0 && console.info(
|
|
194
154
|
` ${import_picocolors.default.yellow(`${generated} generated`)} ${import_picocolors.default.dim("(add frontmatter to enable symlink)")}`
|
|
155
|
+
), skipped > 0 && console.info(
|
|
156
|
+
` ${import_picocolors.default.yellow(`${skipped} skipped`)} ${import_picocolors.default.dim("(missing skill frontmatter)")}`
|
|
195
157
|
), unchanged > 0 && console.info(` ${import_picocolors.default.dim(`${unchanged} unchanged`)}`), removed > 0 && console.info(` ${import_picocolors.default.red(`${removed} removed`)}`), console.info(import_picocolors.default.dim(` skills in ${skillsDir}`)), console.info();
|
|
196
158
|
}
|
|
197
159
|
}), skillsCommand = (0, import_citty.defineCommand)({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/skills.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,qBAYO,oBACP,qBAA8B,wBAC9B,mBAAiD,sBAEjD,eAA8B,kBAC9B,oBAAe;AArBf,wBAyBMA,eAAU,kCAAc,YAAY,GAAG;AAC7C,IAAI;AACJ,IAAI;AACF,iBAAW,0BAAQA,SAAQ,QAAQ,6BAA6B,CAAC;AACnE,QAAQ;AACN,aAAW;AACb;AAEA,MAAM,eAAe;AAErB,SAAS,oBAAoB,SAA0B;AACrD,MAAI,CAAC,QAAQ,WAAW,KAAK,EAAG,QAAO;AACvC,QAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC;AACzC,MAAI,aAAa,GAAI,QAAO;AAC5B,QAAM,cAAc,QAAQ,MAAM,GAAG,QAAQ;AAC7C,SAAO,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,cAAc;AAC7E;AAEA,SAAS,UAAU,SAA0B;AAC3C,MAAI,CAAC,QAAQ,WAAW,KAAK,EAAG,QAAO;AACvC,QAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC;AACzC,MAAI,aAAa,GAAI,QAAO;AAC5B,QAAM,cAAc,QAAQ,MAAM,GAAG,QAAQ;AAC7C,SAAO,kBAAkB,KAAK,WAAW;AAC3C;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["require", "pc"]
|
|
6
6
|
}
|
|
@@ -8,8 +8,7 @@ import {
|
|
|
8
8
|
rmSync,
|
|
9
9
|
rmdirSync,
|
|
10
10
|
symlinkSync,
|
|
11
|
-
unlinkSync
|
|
12
|
-
writeFileSync
|
|
11
|
+
unlinkSync
|
|
13
12
|
} from "node:fs";
|
|
14
13
|
import { createRequire } from "node:module";
|
|
15
14
|
import { dirname, join, relative, resolve } from "node:path";
|
|
@@ -37,33 +36,6 @@ function isDevOnly(content) {
|
|
|
37
36
|
const frontmatter = content.slice(3, endIndex);
|
|
38
37
|
return /\bdev:\s*true\b/.test(frontmatter);
|
|
39
38
|
}
|
|
40
|
-
function extractDocMeta(content) {
|
|
41
|
-
const lines = content.split(`
|
|
42
|
-
`);
|
|
43
|
-
let title = "", description = "", startLine = 0;
|
|
44
|
-
if (lines[0]?.trim() === "---") {
|
|
45
|
-
for (let i = 1; i < lines.length; i++)
|
|
46
|
-
if (lines[i]?.trim() === "---") {
|
|
47
|
-
startLine = i + 1;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
for (let i = startLine; i < lines.length; i++) {
|
|
52
|
-
const trimmed = lines[i]?.trim() || "";
|
|
53
|
-
if (!title && trimmed.startsWith("# ")) {
|
|
54
|
-
title = trimmed.slice(2).trim();
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
if (title && trimmed && !trimmed.startsWith("#")) {
|
|
58
|
-
description = trimmed;
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return { title, description };
|
|
63
|
-
}
|
|
64
|
-
function toSkillName(name) {
|
|
65
|
-
return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
|
|
66
|
-
}
|
|
67
39
|
function collectAllDocs(cwd) {
|
|
68
40
|
const docs = [], seen = /* @__PURE__ */ new Set(), localDocsDir = join(cwd, "docs");
|
|
69
41
|
if (existsSync(localDocsDir)) {
|
|
@@ -90,12 +62,13 @@ async function generateDocSkills(cwd, clean) {
|
|
|
90
62
|
dir.startsWith(SKILL_PREFIX) && rmSync(join(skillsDir, dir), { recursive: !0 });
|
|
91
63
|
}
|
|
92
64
|
existsSync(skillsDir) || mkdirSync(skillsDir, { recursive: !0 });
|
|
93
|
-
let symlinked = 0, generated = 0, unchanged = 0, removed = 0;
|
|
65
|
+
let symlinked = 0, generated = 0, unchanged = 0, removed = 0, skipped = 0;
|
|
94
66
|
const isDev = !!process.env.IS_TAMAGUI_DEV;
|
|
95
67
|
for (const doc of docs) {
|
|
96
68
|
const content = readFileSync(doc.path, "utf-8");
|
|
97
69
|
if (isDevOnly(content) && !isDev) continue;
|
|
98
|
-
|
|
70
|
+
const hasFrontmatter = hasSkillFrontmatter(content);
|
|
71
|
+
if (hasFrontmatter) {
|
|
99
72
|
const nameMatch = content.match(/^---\s*\nname:\s*([^\n]+)/m);
|
|
100
73
|
if (!nameMatch) continue;
|
|
101
74
|
const skillName = nameMatch[1].trim();
|
|
@@ -114,34 +87,20 @@ async function generateDocSkills(cwd, clean) {
|
|
|
114
87
|
console.info(
|
|
115
88
|
` ${pc.green("\u27F7")} ${skillName} ${sourceLabel} ${pc.dim("(symlink)")}`
|
|
116
89
|
);
|
|
117
|
-
} else {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const skillDir = join(skillsDir, skillName), skillFile = join(skillDir, "SKILL.md");
|
|
121
|
-
existsSync(skillDir) || mkdirSync(skillDir, { recursive: !0 });
|
|
122
|
-
const { title, description } = extractDocMeta(content), skillDescription = description ? `${title}. ${description}`.slice(0, 1024) : title.slice(0, 1024), skillContent = `---
|
|
123
|
-
name: ${skillName}
|
|
124
|
-
description: ${skillDescription}
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
${content}
|
|
128
|
-
`;
|
|
129
|
-
let shouldWrite = !0;
|
|
130
|
-
try {
|
|
131
|
-
lstatSync(skillFile).isSymbolicLink() ? unlinkSync(skillFile) : readFileSync(skillFile, "utf-8") === skillContent && (unchanged++, shouldWrite = !1);
|
|
132
|
-
} catch {
|
|
133
|
-
}
|
|
134
|
-
if (!shouldWrite) continue;
|
|
135
|
-
writeFileSync(skillFile, skillContent), generated++;
|
|
136
|
-
const sourceLabel = doc.source === "local" ? pc.blue("local") : pc.dim("package");
|
|
137
|
-
console.info(
|
|
138
|
-
` ${pc.green("\u2713")} ${skillName} ${sourceLabel} ${pc.dim("(generated)")}`
|
|
90
|
+
} else if (!hasFrontmatter) {
|
|
91
|
+
skipped++, console.info(
|
|
92
|
+
` ${pc.yellow("!")} skipped ${pc.dim(doc.name)} ${pc.dim("(missing skill frontmatter)")}`
|
|
139
93
|
);
|
|
94
|
+
continue;
|
|
140
95
|
}
|
|
141
96
|
}
|
|
142
97
|
for (const dir of readdirSync(skillsDir)) {
|
|
143
98
|
if (expectedSkillNames.has(dir)) continue;
|
|
144
99
|
const skillDir = join(skillsDir, dir), skillFile = join(skillDir, "SKILL.md");
|
|
100
|
+
if (dir.startsWith(SKILL_PREFIX)) {
|
|
101
|
+
rmSync(skillDir, { recursive: !0, force: !0 }), removed++, console.info(` ${pc.red("\u2715")} ${dir} ${pc.dim("(removed stale generated skill)")}`);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
145
104
|
let shouldUnlink = !1;
|
|
146
105
|
try {
|
|
147
106
|
if (lstatSync(skillFile).isSymbolicLink()) {
|
|
@@ -152,7 +111,7 @@ ${content}
|
|
|
152
111
|
}
|
|
153
112
|
shouldUnlink && (unlinkSync(skillFile), readdirSync(skillDir).length === 0 && rmdirSync(skillDir), removed++, console.info(` ${pc.red("\u2715")} ${dir} ${pc.dim("(removed stale symlink)")}`));
|
|
154
113
|
}
|
|
155
|
-
return { symlinked, generated, unchanged, removed };
|
|
114
|
+
return { symlinked, generated, unchanged, removed, skipped };
|
|
156
115
|
}
|
|
157
116
|
const generateCommand = defineCommand({
|
|
158
117
|
meta: {
|
|
@@ -174,13 +133,15 @@ const generateCommand = defineCommand({
|
|
|
174
133
|
async run({ args }) {
|
|
175
134
|
const cwd = process.cwd(), skillsDir = join(cwd, ".claude", "skills");
|
|
176
135
|
console.info(), console.info(pc.bold(pc.cyan("Generate all skills"))), console.info();
|
|
177
|
-
let symlinked = 0, generated = 0, unchanged = 0, removed = 0;
|
|
136
|
+
let symlinked = 0, generated = 0, unchanged = 0, removed = 0, skipped = 0;
|
|
178
137
|
if (!args["skip-internal-docs"]) {
|
|
179
138
|
const docStats = await generateDocSkills(cwd, args.clean);
|
|
180
|
-
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, console.info();
|
|
139
|
+
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, skipped = docStats.skipped, console.info();
|
|
181
140
|
}
|
|
182
141
|
console.info(), console.info(pc.bold("summary:")), symlinked > 0 && console.info(` ${pc.green(`${symlinked} symlinked`)}`), generated > 0 && console.info(
|
|
183
142
|
` ${pc.yellow(`${generated} generated`)} ${pc.dim("(add frontmatter to enable symlink)")}`
|
|
143
|
+
), skipped > 0 && console.info(
|
|
144
|
+
` ${pc.yellow(`${skipped} skipped`)} ${pc.dim("(missing skill frontmatter)")}`
|
|
184
145
|
), unchanged > 0 && console.info(` ${pc.dim(`${unchanged} unchanged`)}`), removed > 0 && console.info(` ${pc.red(`${removed} removed`)}`), console.info(pc.dim(` skills in ${skillsDir}`)), console.info();
|
|
185
146
|
}
|
|
186
147
|
}), skillsCommand = defineCommand({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/skills.ts"],
|
|
4
|
-
"mappings": "AAIA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,
|
|
4
|
+
"mappings": "AAIA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,qBAAqB;AAC9B,SAAS,SAAS,MAAM,UAAU,eAAe;AAEjD,SAAS,qBAAqB;AAC9B,OAAO,QAAQ;AAIf,MAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAI;AACJ,IAAI;AACF,aAAW,QAAQA,SAAQ,QAAQ,6BAA6B,CAAC;AACnE,QAAQ;AACN,aAAW;AACb;AAEA,MAAM,eAAe;AAErB,SAAS,oBAAoB,SAA0B;AACrD,MAAI,CAAC,QAAQ,WAAW,KAAK,EAAG,QAAO;AACvC,QAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC;AACzC,MAAI,aAAa,GAAI,QAAO;AAC5B,QAAM,cAAc,QAAQ,MAAM,GAAG,QAAQ;AAC7C,SAAO,YAAY,SAAS,OAAO,KAAK,YAAY,SAAS,cAAc;AAC7E;AAEA,SAAS,UAAU,SAA0B;AAC3C,MAAI,CAAC,QAAQ,WAAW,KAAK,EAAG,QAAO;AACvC,QAAM,WAAW,QAAQ,QAAQ,OAAO,CAAC;AACzC,MAAI,aAAa,GAAI,QAAO;AAC5B,QAAM,cAAc,QAAQ,MAAM,GAAG,QAAQ;AAC7C,SAAO,kBAAkB,KAAK,WAAW;AAC3C;AAWA,SAAS,eACP,KACoE;AACpE,QAAM,OAA2E,CAAC,GAC5E,OAAO,oBAAI,IAAY,GAEvB,eAAe,KAAK,KAAK,MAAM;AACrC,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAM,QAAQ,YAAY,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AACvE,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,QAAQ,SAAS,EAAE;AACrC,WAAK,KAAK,EAAE,MAAM,MAAM,KAAK,cAAc,IAAI,GAAG,QAAQ,QAAQ,CAAC,GACnE,KAAK,IAAI,IAAI;AAAA,IACf;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,QAAQ,GAAG;AACpC,UAAM,QAAQ,YAAY,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AACnE,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,QAAQ,SAAS,EAAE;AACrC,MAAK,KAAK,IAAI,IAAI,KAChB,KAAK,KAAK,EAAE,MAAM,MAAM,KAAK,UAAU,IAAI,GAAG,QAAQ,UAAU,CAAC;AAAA,IAErE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,kBACb,KACA,OAOC;AACD,QAAM,YAAY,KAAK,KAAK,WAAW,QAAQ,GACzC,OAAO,eAAe,GAAG,GACzB,eAAe,KAAK,KAAK,MAAM,GAC/B,qBAAqB,oBAAI,IAAY;AAQ3C,MANI,KAAK,WAAW,IAClB,QAAQ,KAAK,GAAG,OAAO,8BAA8B,CAAC,IAEtD,QAAQ,KAAK,GAAG,IAAI,SAAS,KAAK,MAAM,sBAAsB,CAAC,GAG7D,SAAS,WAAW,SAAS,GAAG;AAClC,UAAM,WAAW,YAAY,SAAS;AACtC,eAAW,OAAO;AAChB,MAAI,IAAI,WAAW,YAAY,KAC7B,OAAO,KAAK,WAAW,GAAG,GAAG,EAAE,WAAW,GAAK,CAAC;AAAA,EAGtD;AAEA,EAAK,WAAW,SAAS,KACvB,UAAU,WAAW,EAAE,WAAW,GAAK,CAAC;AAG1C,MAAI,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,UAAU;AACd,QAAM,QAAQ,CAAC,CAAC,QAAQ,IAAI;AAE5B,aAAW,OAAO,MAAM;AACtB,UAAM,UAAU,aAAa,IAAI,MAAM,OAAO;AAC9C,QAAI,UAAU,OAAO,KAAK,CAAC,MAAO;AAElC,UAAM,iBAAiB,oBAAoB,OAAO;AAElD,QAAI,gBAAgB;AAClB,YAAM,YAAY,QAAQ,MAAM,4BAA4B;AAC5D,UAAI,CAAC,UAAW;AAEhB,YAAM,YAAY,UAAU,CAAC,EAAG,KAAK;AACrC,yBAAmB,IAAI,SAAS;AAChC,YAAM,WAAW,KAAK,WAAW,SAAS,GACpC,YAAY,KAAK,UAAU,UAAU;AAE3C,MAAK,WAAW,QAAQ,KACtB,UAAU,UAAU,EAAE,WAAW,GAAK,CAAC;AAGzC,YAAM,eAAe,SAAS,UAAU,IAAI,IAAI;AAEhD,UAAI,eAAe;AACnB,UAAI;AAEF,QADa,UAAU,SAAS,EACvB,eAAe,KAAK,WAAW,SAAS,KACvB,aAAa,WAAW,OAAO,MAC/B,YACtB,aACA,eAAe,KAGf,gBACF,WAAW,SAAS;AAAA,MAExB,QAAQ;AAAA,MAER;AAEA,UAAI,CAAC,aAAc;AAEnB,kBAAY,cAAc,SAAS,GACnC;AAEA,YAAM,cAAc,IAAI,WAAW,UAAU,GAAG,KAAK,OAAO,IAAI,GAAG,IAAI,SAAS;AAChF,cAAQ;AAAA,QACN,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,SAAS,IAAI,WAAW,IAAI,GAAG,IAAI,WAAW,CAAC;AAAA,MACvE;AAAA,IACF,WACM,CAAC,gBAAgB;AACnB,iBACA,QAAQ;AAAA,QACN,KAAK,GAAG,OAAO,GAAG,CAAC,YAAY,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,6BAA6B,CAAC;AAAA,MAC1F;AACA;AAAA,IACF;AAAA,EAEJ;AAEA,aAAW,OAAO,YAAY,SAAS,GAAG;AACxC,QAAI,mBAAmB,IAAI,GAAG,EAAG;AAEjC,UAAM,WAAW,KAAK,WAAW,GAAG,GAC9B,YAAY,KAAK,UAAU,UAAU;AAE3C,QAAI,IAAI,WAAW,YAAY,GAAG;AAChC,aAAO,UAAU,EAAE,WAAW,IAAM,OAAO,GAAK,CAAC,GACjD,WACA,QAAQ,KAAK,KAAK,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,iCAAiC,CAAC,EAAE;AACnF;AAAA,IACF;AAEA,QAAI,eAAe;AAEnB,QAAI;AAEF,UADa,UAAU,SAAS,EACvB,eAAe,GAAG;AACzB,cAAM,aAAa,aAAa,SAAS,GACnC,iBAAiB,QAAQ,UAAU,UAAU;AACnD,uBACE,eAAe,WAAW,GAAG,YAAY,GAAG,KAC3C,CAAC,CAAC,YAAY,eAAe,WAAW,GAAG,QAAQ,GAAG;AAAA,MAC3D;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,IAAK,iBAEL,WAAW,SAAS,GAChB,YAAY,QAAQ,EAAE,WAAW,KACnC,UAAU,QAAQ,GAEpB,WACA,QAAQ,KAAK,KAAK,GAAG,IAAI,QAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,yBAAyB,CAAC,EAAE;AAAA,EAC7E;AAEA,SAAO,EAAE,WAAW,WAAW,WAAW,SAAS,QAAQ;AAC7D;AAIA,MAAM,kBAAkB,cAAc;AAAA,EACpC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,sBAAsB;AAAA,MACpB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,QAAQ,IAAI,GAClB,YAAY,KAAK,KAAK,WAAW,QAAQ;AAE/C,YAAQ,KAAK,GACb,QAAQ,KAAK,GAAG,KAAK,GAAG,KAAK,qBAAqB,CAAC,CAAC,GACpD,QAAQ,KAAK;AAEb,QAAI,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,UAAU;AAGd,QAAI,CAAC,KAAK,oBAAoB,GAAG;AAC/B,YAAM,WAAW,MAAM,kBAAkB,KAAK,KAAK,KAAK;AACxD,kBAAY,SAAS,WACrB,YAAY,SAAS,WACrB,YAAY,SAAS,WACrB,UAAU,SAAS,SACnB,UAAU,SAAS,SACnB,QAAQ,KAAK;AAAA,IACf;AAGA,YAAQ,KAAK,GACb,QAAQ,KAAK,GAAG,KAAK,UAAU,CAAC,GAC5B,YAAY,KAAG,QAAQ,KAAK,KAAK,GAAG,MAAM,GAAG,SAAS,YAAY,CAAC,EAAE,GACrE,YAAY,KACd,QAAQ;AAAA,MACN,KAAK,GAAG,OAAO,GAAG,SAAS,YAAY,CAAC,IAAI,GAAG,IAAI,qCAAqC,CAAC;AAAA,IAC3F,GACE,UAAU,KACZ,QAAQ;AAAA,MACN,KAAK,GAAG,OAAO,GAAG,OAAO,UAAU,CAAC,IAAI,GAAG,IAAI,6BAA6B,CAAC;AAAA,IAC/E,GACE,YAAY,KAAG,QAAQ,KAAK,KAAK,GAAG,IAAI,GAAG,SAAS,YAAY,CAAC,EAAE,GACnE,UAAU,KAAG,QAAQ,KAAK,KAAK,GAAG,IAAI,GAAG,OAAO,UAAU,CAAC,EAAE,GACjE,QAAQ,KAAK,GAAG,IAAI,eAAe,SAAS,EAAE,CAAC,GAC/C,QAAQ,KAAK;AAAA,EACf;AACF,CAAC,GAEY,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,aAAa;AAAA,IACX,UAAU;AAAA,EACZ;AACF,CAAC;",
|
|
5
5
|
"names": ["require"]
|
|
6
6
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, rmSync, rmdirSync, symlinkSync, unlinkSync
|
|
1
|
+
import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, rmSync, rmdirSync, symlinkSync, unlinkSync } from "node:fs";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { dirname, join, relative, resolve } from "node:path";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
@@ -25,37 +25,6 @@ function isDevOnly(content) {
|
|
|
25
25
|
const frontmatter = content.slice(3, endIndex);
|
|
26
26
|
return /\bdev:\s*true\b/.test(frontmatter);
|
|
27
27
|
}
|
|
28
|
-
function extractDocMeta(content) {
|
|
29
|
-
const lines = content.split(`
|
|
30
|
-
`);
|
|
31
|
-
let title = "",
|
|
32
|
-
description = "",
|
|
33
|
-
startLine = 0;
|
|
34
|
-
if (lines[0]?.trim() === "---") {
|
|
35
|
-
for (let i = 1; i < lines.length; i++) if (lines[i]?.trim() === "---") {
|
|
36
|
-
startLine = i + 1;
|
|
37
|
-
break;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
for (let i = startLine; i < lines.length; i++) {
|
|
41
|
-
const trimmed = lines[i]?.trim() || "";
|
|
42
|
-
if (!title && trimmed.startsWith("# ")) {
|
|
43
|
-
title = trimmed.slice(2).trim();
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
if (title && trimmed && !trimmed.startsWith("#")) {
|
|
47
|
-
description = trimmed;
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return {
|
|
52
|
-
title,
|
|
53
|
-
description
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
function toSkillName(name) {
|
|
57
|
-
return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "").slice(0, 64);
|
|
58
|
-
}
|
|
59
28
|
function collectAllDocs(cwd) {
|
|
60
29
|
const docs = [],
|
|
61
30
|
seen = /* @__PURE__ */new Set(),
|
|
@@ -101,12 +70,14 @@ async function generateDocSkills(cwd, clean) {
|
|
|
101
70
|
let symlinked = 0,
|
|
102
71
|
generated = 0,
|
|
103
72
|
unchanged = 0,
|
|
104
|
-
removed = 0
|
|
73
|
+
removed = 0,
|
|
74
|
+
skipped = 0;
|
|
105
75
|
const isDev = !!process.env.IS_TAMAGUI_DEV;
|
|
106
76
|
for (const doc of docs) {
|
|
107
77
|
const content = readFileSync(doc.path, "utf-8");
|
|
108
78
|
if (isDevOnly(content) && !isDev) continue;
|
|
109
|
-
|
|
79
|
+
const hasFrontmatter = hasSkillFrontmatter(content);
|
|
80
|
+
if (hasFrontmatter) {
|
|
110
81
|
const nameMatch = content.match(/^---\s*\nname:\s*([^\n]+)/m);
|
|
111
82
|
if (!nameMatch) continue;
|
|
112
83
|
const skillName = nameMatch[1].trim();
|
|
@@ -125,41 +96,22 @@ async function generateDocSkills(cwd, clean) {
|
|
|
125
96
|
symlinkSync(relativePath, skillFile), symlinked++;
|
|
126
97
|
const sourceLabel = doc.source === "local" ? pc.blue("local") : pc.dim("package");
|
|
127
98
|
console.info(` ${pc.green("\u27F7")} ${skillName} ${sourceLabel} ${pc.dim("(symlink)")}`);
|
|
128
|
-
} else {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
expectedSkillNames.add(skillName);
|
|
132
|
-
const skillDir = join(skillsDir, skillName),
|
|
133
|
-
skillFile = join(skillDir, "SKILL.md");
|
|
134
|
-
existsSync(skillDir) || mkdirSync(skillDir, {
|
|
135
|
-
recursive: !0
|
|
136
|
-
});
|
|
137
|
-
const {
|
|
138
|
-
title,
|
|
139
|
-
description
|
|
140
|
-
} = extractDocMeta(content),
|
|
141
|
-
skillDescription = description ? `${title}. ${description}`.slice(0, 1024) : title.slice(0, 1024),
|
|
142
|
-
skillContent = `---
|
|
143
|
-
name: ${skillName}
|
|
144
|
-
description: ${skillDescription}
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
${content}
|
|
148
|
-
`;
|
|
149
|
-
let shouldWrite = !0;
|
|
150
|
-
try {
|
|
151
|
-
lstatSync(skillFile).isSymbolicLink() ? unlinkSync(skillFile) : readFileSync(skillFile, "utf-8") === skillContent && (unchanged++, shouldWrite = !1);
|
|
152
|
-
} catch {}
|
|
153
|
-
if (!shouldWrite) continue;
|
|
154
|
-
writeFileSync(skillFile, skillContent), generated++;
|
|
155
|
-
const sourceLabel = doc.source === "local" ? pc.blue("local") : pc.dim("package");
|
|
156
|
-
console.info(` ${pc.green("\u2713")} ${skillName} ${sourceLabel} ${pc.dim("(generated)")}`);
|
|
99
|
+
} else if (!hasFrontmatter) {
|
|
100
|
+
skipped++, console.info(` ${pc.yellow("!")} skipped ${pc.dim(doc.name)} ${pc.dim("(missing skill frontmatter)")}`);
|
|
101
|
+
continue;
|
|
157
102
|
}
|
|
158
103
|
}
|
|
159
104
|
for (const dir of readdirSync(skillsDir)) {
|
|
160
105
|
if (expectedSkillNames.has(dir)) continue;
|
|
161
106
|
const skillDir = join(skillsDir, dir),
|
|
162
107
|
skillFile = join(skillDir, "SKILL.md");
|
|
108
|
+
if (dir.startsWith(SKILL_PREFIX)) {
|
|
109
|
+
rmSync(skillDir, {
|
|
110
|
+
recursive: !0,
|
|
111
|
+
force: !0
|
|
112
|
+
}), removed++, console.info(` ${pc.red("\u2715")} ${dir} ${pc.dim("(removed stale generated skill)")}`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
163
115
|
let shouldUnlink = !1;
|
|
164
116
|
try {
|
|
165
117
|
if (lstatSync(skillFile).isSymbolicLink()) {
|
|
@@ -174,7 +126,8 @@ ${content}
|
|
|
174
126
|
symlinked,
|
|
175
127
|
generated,
|
|
176
128
|
unchanged,
|
|
177
|
-
removed
|
|
129
|
+
removed,
|
|
130
|
+
skipped
|
|
178
131
|
};
|
|
179
132
|
}
|
|
180
133
|
const generateCommand = defineCommand({
|
|
@@ -203,12 +156,13 @@ const generateCommand = defineCommand({
|
|
|
203
156
|
let symlinked = 0,
|
|
204
157
|
generated = 0,
|
|
205
158
|
unchanged = 0,
|
|
206
|
-
removed = 0
|
|
159
|
+
removed = 0,
|
|
160
|
+
skipped = 0;
|
|
207
161
|
if (!args["skip-internal-docs"]) {
|
|
208
162
|
const docStats = await generateDocSkills(cwd, args.clean);
|
|
209
|
-
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, console.info();
|
|
163
|
+
symlinked = docStats.symlinked, generated = docStats.generated, unchanged = docStats.unchanged, removed = docStats.removed, skipped = docStats.skipped, console.info();
|
|
210
164
|
}
|
|
211
|
-
console.info(), console.info(pc.bold("summary:")), symlinked > 0 && console.info(` ${pc.green(`${symlinked} symlinked`)}`), generated > 0 && console.info(` ${pc.yellow(`${generated} generated`)} ${pc.dim("(add frontmatter to enable symlink)")}`), unchanged > 0 && console.info(` ${pc.dim(`${unchanged} unchanged`)}`), removed > 0 && console.info(` ${pc.red(`${removed} removed`)}`), console.info(pc.dim(` skills in ${skillsDir}`)), console.info();
|
|
165
|
+
console.info(), console.info(pc.bold("summary:")), symlinked > 0 && console.info(` ${pc.green(`${symlinked} symlinked`)}`), generated > 0 && console.info(` ${pc.yellow(`${generated} generated`)} ${pc.dim("(add frontmatter to enable symlink)")}`), skipped > 0 && console.info(` ${pc.yellow(`${skipped} skipped`)} ${pc.dim("(missing skill frontmatter)")}`), unchanged > 0 && console.info(` ${pc.dim(`${unchanged} unchanged`)}`), removed > 0 && console.info(` ${pc.red(`${removed} removed`)}`), console.info(pc.dim(` skills in ${skillsDir}`)), console.info();
|
|
212
166
|
}
|
|
213
167
|
}),
|
|
214
168
|
skillsCommand = defineCommand({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["existsSync","lstatSync","mkdirSync","readdirSync","readFileSync","readlinkSync","rmSync","rmdirSync","symlinkSync","unlinkSync","
|
|
1
|
+
{"version":3,"names":["existsSync","lstatSync","mkdirSync","readdirSync","readFileSync","readlinkSync","rmSync","rmdirSync","symlinkSync","unlinkSync","createRequire","dirname","join","relative","resolve","defineCommand","pc","require2","import","meta","url","DOCS_DIR","SKILL_PREFIX","hasSkillFrontmatter","content","startsWith","endIndex","indexOf","frontmatter","slice","includes","isDevOnly","test","collectAllDocs","cwd","docs","seen","Set","localDocsDir","files","filter","f","endsWith","file","name","replace","push","path","source","add","has","generateDocSkills","clean","skillsDir","expectedSkillNames","length","console","info","yellow","dim","existing","dir","recursive","symlinked","generated","unchanged","removed","skipped","isDev","process","env","IS_TAMAGUI_DEV","doc","hasFrontmatter","nameMatch","match","skillName","trim","skillDir","skillFile","relativePath","shouldCreate","isSymbolicLink","sourceLabel","blue","green","force","red","shouldUnlink","linkTarget","resolvedTarget","generateCommand","description","args","type","default","run","bold","cyan","docStats","skillsCommand","subCommands","generate"],"sources":["../../../src/commands/skills.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@take-out/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.47",
|
|
4
4
|
"description": "CLI tools for Takeout starter kit - interactive onboarding and project setup",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@clack/prompts": "^0.8.2",
|
|
54
|
-
"@take-out/docs": "0.1.
|
|
55
|
-
"@take-out/run": "0.1.
|
|
56
|
-
"@take-out/scripts": "0.1.
|
|
54
|
+
"@take-out/docs": "0.1.47",
|
|
55
|
+
"@take-out/run": "0.1.47",
|
|
56
|
+
"@take-out/scripts": "0.1.47",
|
|
57
57
|
"citty": "^0.1.6",
|
|
58
58
|
"picocolors": "^1.1.1"
|
|
59
59
|
},
|
package/src/commands/skills.ts
CHANGED
|
@@ -49,36 +49,6 @@ function isDevOnly(content: string): boolean {
|
|
|
49
49
|
return /\bdev:\s*true\b/.test(frontmatter)
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
function extractDocMeta(content: string): { title: string; description: string } {
|
|
53
|
-
const lines = content.split('\n')
|
|
54
|
-
let title = ''
|
|
55
|
-
let description = ''
|
|
56
|
-
|
|
57
|
-
let startLine = 0
|
|
58
|
-
if (lines[0]?.trim() === '---') {
|
|
59
|
-
for (let i = 1; i < lines.length; i++) {
|
|
60
|
-
if (lines[i]?.trim() === '---') {
|
|
61
|
-
startLine = i + 1
|
|
62
|
-
break
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
for (let i = startLine; i < lines.length; i++) {
|
|
68
|
-
const trimmed = lines[i]?.trim() || ''
|
|
69
|
-
if (!title && trimmed.startsWith('# ')) {
|
|
70
|
-
title = trimmed.slice(2).trim()
|
|
71
|
-
continue
|
|
72
|
-
}
|
|
73
|
-
if (title && trimmed && !trimmed.startsWith('#')) {
|
|
74
|
-
description = trimmed
|
|
75
|
-
break
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return { title, description }
|
|
80
|
-
}
|
|
81
|
-
|
|
82
52
|
function toSkillName(name: string): string {
|
|
83
53
|
return name
|
|
84
54
|
.toLowerCase()
|
|
@@ -120,7 +90,13 @@ function collectAllDocs(
|
|
|
120
90
|
async function generateDocSkills(
|
|
121
91
|
cwd: string,
|
|
122
92
|
clean: boolean
|
|
123
|
-
): Promise<{
|
|
93
|
+
): Promise<{
|
|
94
|
+
symlinked: number
|
|
95
|
+
generated: number
|
|
96
|
+
unchanged: number
|
|
97
|
+
removed: number
|
|
98
|
+
skipped: number
|
|
99
|
+
}> {
|
|
124
100
|
const skillsDir = join(cwd, '.claude', 'skills')
|
|
125
101
|
const docs = collectAllDocs(cwd)
|
|
126
102
|
const localDocsDir = join(cwd, 'docs')
|
|
@@ -149,6 +125,7 @@ async function generateDocSkills(
|
|
|
149
125
|
let generated = 0
|
|
150
126
|
let unchanged = 0
|
|
151
127
|
let removed = 0
|
|
128
|
+
let skipped = 0
|
|
152
129
|
const isDev = !!process.env.IS_TAMAGUI_DEV
|
|
153
130
|
|
|
154
131
|
for (const doc of docs) {
|
|
@@ -199,54 +176,13 @@ async function generateDocSkills(
|
|
|
199
176
|
` ${pc.green('⟷')} ${skillName} ${sourceLabel} ${pc.dim('(symlink)')}`
|
|
200
177
|
)
|
|
201
178
|
} else {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
if (!existsSync(skillDir)) {
|
|
209
|
-
mkdirSync(skillDir, { recursive: true })
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
const { title, description } = extractDocMeta(content)
|
|
213
|
-
const skillDescription = description
|
|
214
|
-
? `${title}. ${description}`.slice(0, 1024)
|
|
215
|
-
: title.slice(0, 1024)
|
|
216
|
-
|
|
217
|
-
const skillContent = `---
|
|
218
|
-
name: ${skillName}
|
|
219
|
-
description: ${skillDescription}
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
${content}
|
|
223
|
-
`
|
|
224
|
-
|
|
225
|
-
let shouldWrite = true
|
|
226
|
-
try {
|
|
227
|
-
const stat = lstatSync(skillFile)
|
|
228
|
-
if (stat.isSymbolicLink()) {
|
|
229
|
-
unlinkSync(skillFile)
|
|
230
|
-
} else {
|
|
231
|
-
const existing = readFileSync(skillFile, 'utf-8')
|
|
232
|
-
if (existing === skillContent) {
|
|
233
|
-
unchanged++
|
|
234
|
-
shouldWrite = false
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
} catch {
|
|
238
|
-
// nothing exists
|
|
179
|
+
if (!hasFrontmatter) {
|
|
180
|
+
skipped++
|
|
181
|
+
console.info(
|
|
182
|
+
` ${pc.yellow('!')} skipped ${pc.dim(doc.name)} ${pc.dim('(missing skill frontmatter)')}`
|
|
183
|
+
)
|
|
184
|
+
continue
|
|
239
185
|
}
|
|
240
|
-
|
|
241
|
-
if (!shouldWrite) continue
|
|
242
|
-
|
|
243
|
-
writeFileSync(skillFile, skillContent)
|
|
244
|
-
generated++
|
|
245
|
-
|
|
246
|
-
const sourceLabel = doc.source === 'local' ? pc.blue('local') : pc.dim('package')
|
|
247
|
-
console.info(
|
|
248
|
-
` ${pc.green('✓')} ${skillName} ${sourceLabel} ${pc.dim('(generated)')}`
|
|
249
|
-
)
|
|
250
186
|
}
|
|
251
187
|
}
|
|
252
188
|
|
|
@@ -255,6 +191,14 @@ ${content}
|
|
|
255
191
|
|
|
256
192
|
const skillDir = join(skillsDir, dir)
|
|
257
193
|
const skillFile = join(skillDir, 'SKILL.md')
|
|
194
|
+
|
|
195
|
+
if (dir.startsWith(SKILL_PREFIX)) {
|
|
196
|
+
rmSync(skillDir, { recursive: true, force: true })
|
|
197
|
+
removed++
|
|
198
|
+
console.info(` ${pc.red('✕')} ${dir} ${pc.dim('(removed stale generated skill)')}`)
|
|
199
|
+
continue
|
|
200
|
+
}
|
|
201
|
+
|
|
258
202
|
let shouldUnlink = false
|
|
259
203
|
|
|
260
204
|
try {
|
|
@@ -280,7 +224,7 @@ ${content}
|
|
|
280
224
|
console.info(` ${pc.red('✕')} ${dir} ${pc.dim('(removed stale symlink)')}`)
|
|
281
225
|
}
|
|
282
226
|
|
|
283
|
-
return { symlinked, generated, unchanged, removed }
|
|
227
|
+
return { symlinked, generated, unchanged, removed, skipped }
|
|
284
228
|
}
|
|
285
229
|
|
|
286
230
|
// --- commands ---
|
|
@@ -314,6 +258,7 @@ const generateCommand = defineCommand({
|
|
|
314
258
|
let generated = 0
|
|
315
259
|
let unchanged = 0
|
|
316
260
|
let removed = 0
|
|
261
|
+
let skipped = 0
|
|
317
262
|
|
|
318
263
|
// 1. doc skills (unless skipped)
|
|
319
264
|
if (!args['skip-internal-docs']) {
|
|
@@ -322,6 +267,7 @@ const generateCommand = defineCommand({
|
|
|
322
267
|
generated = docStats.generated
|
|
323
268
|
unchanged = docStats.unchanged
|
|
324
269
|
removed = docStats.removed
|
|
270
|
+
skipped = docStats.skipped
|
|
325
271
|
console.info()
|
|
326
272
|
}
|
|
327
273
|
|
|
@@ -333,6 +279,10 @@ const generateCommand = defineCommand({
|
|
|
333
279
|
console.info(
|
|
334
280
|
` ${pc.yellow(`${generated} generated`)} ${pc.dim('(add frontmatter to enable symlink)')}`
|
|
335
281
|
)
|
|
282
|
+
if (skipped > 0)
|
|
283
|
+
console.info(
|
|
284
|
+
` ${pc.yellow(`${skipped} skipped`)} ${pc.dim('(missing skill frontmatter)')}`
|
|
285
|
+
)
|
|
336
286
|
if (unchanged > 0) console.info(` ${pc.dim(`${unchanged} unchanged`)}`)
|
|
337
287
|
if (removed > 0) console.info(` ${pc.red(`${removed} removed`)}`)
|
|
338
288
|
console.info(pc.dim(` skills in ${skillsDir}`))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkSH,eAAO,MAAM,aAAa,qDAQxB,CAAA"}
|