claude-skills-cli 0.0.5 → 0.0.7
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 +34 -9
- package/dist/commands/init.js +5 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.js +1 -1
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/stats.js +1 -1
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/validate.js +24 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/watch.js +82 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/core/validator.js +169 -321
- package/dist/core/validator.js.map +1 -1
- package/dist/index.js +23 -12
- package/dist/index.js.map +1 -1
- package/dist/skills/skill-creator/SKILL.md +26 -108
- package/dist/skills/skill-creator/references/cli-reference.md +35 -35
- package/dist/skills/skill-creator/references/development-process.md +208 -0
- package/dist/skills/skill-creator/references/skill-examples.md +1 -1
- package/dist/validators/alignment-validator.js +54 -0
- package/dist/validators/alignment-validator.js.map +1 -0
- package/dist/validators/content-validator.js +144 -0
- package/dist/validators/content-validator.js.map +1 -0
- package/dist/validators/description-validator.js +136 -0
- package/dist/validators/description-validator.js.map +1 -0
- package/dist/validators/file-structure-validator.js +125 -0
- package/dist/validators/file-structure-validator.js.map +1 -0
- package/dist/validators/frontmatter-validator.js +114 -0
- package/dist/validators/frontmatter-validator.js.map +1 -0
- package/dist/validators/references-validator.js +125 -0
- package/dist/validators/references-validator.js.map +1 -0
- package/dist/validators/text-analysis.js +71 -0
- package/dist/validators/text-analysis.js.map +1 -0
- package/docs/CLI-IMPROVEMENTS.md +960 -0
- package/docs/SKILL-CREATOR-UPDATES.md +1071 -0
- package/docs/SKILL-DEVELOPMENT.md +10 -10
- package/docs/SKILLS-ARCHITECTURE.md +1 -1
- package/docs/SKILLS-ECOSYSTEM-ANALYSIS.md +509 -0
- package/docs/SKILLS-OPPORTUNITIES.md +652 -0
- package/package.json +4 -4
- package/dist/skills/skill-creator/skill-creator/SKILL.md +0 -143
- package/dist/skills/skill-creator/skill-creator/references/anthropic-resources.md +0 -504
- package/dist/skills/skill-creator/skill-creator/references/cli-reference.md +0 -507
- package/dist/skills/skill-creator/skill-creator/references/skill-examples.md +0 -413
- package/dist/skills/skill-creator/skill-creator/references/writing-guide.md +0 -619
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* References validation (Level 3 progressive disclosure)
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
/**
|
|
7
|
+
* Check nesting depth of reference files
|
|
8
|
+
*/
|
|
9
|
+
function check_reference_nesting(skill_path, file_path, visited = new Set()) {
|
|
10
|
+
if (visited.has(file_path)) {
|
|
11
|
+
return { depth: 0, references: [] };
|
|
12
|
+
}
|
|
13
|
+
visited.add(file_path);
|
|
14
|
+
const full_path = join(skill_path, file_path);
|
|
15
|
+
if (!existsSync(full_path)) {
|
|
16
|
+
return { depth: 0, references: [] };
|
|
17
|
+
}
|
|
18
|
+
const content = readFileSync(full_path, 'utf-8');
|
|
19
|
+
const reference_pattern = /\[([^\]]+)\]\((references\/[^)]+\.md)\)/g;
|
|
20
|
+
const matches = [...content.matchAll(reference_pattern)];
|
|
21
|
+
const references = matches.map((m) => m[2]);
|
|
22
|
+
if (references.length === 0) {
|
|
23
|
+
return { depth: 1, references: [] };
|
|
24
|
+
}
|
|
25
|
+
// Recursively check nested references
|
|
26
|
+
let max_depth = 1;
|
|
27
|
+
for (const ref of references) {
|
|
28
|
+
const nested = check_reference_nesting(skill_path, ref, new Set(visited));
|
|
29
|
+
max_depth = Math.max(max_depth, 1 + nested.depth);
|
|
30
|
+
}
|
|
31
|
+
return { depth: max_depth, references };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate references directory and links
|
|
35
|
+
*/
|
|
36
|
+
export function validate_references(skill_path) {
|
|
37
|
+
const references_dir = join(skill_path, 'references');
|
|
38
|
+
const skill_md_path = join(skill_path, 'SKILL.md');
|
|
39
|
+
const files_found = [];
|
|
40
|
+
const files_referenced = [];
|
|
41
|
+
const missing_files = [];
|
|
42
|
+
const nesting_data = [];
|
|
43
|
+
const warnings = [];
|
|
44
|
+
const errors = [];
|
|
45
|
+
// Check references directory if it exists
|
|
46
|
+
if (existsSync(references_dir)) {
|
|
47
|
+
const files = readdirSync(references_dir);
|
|
48
|
+
const md_files = files.filter((f) => f.endsWith('.md'));
|
|
49
|
+
files_found.push(...md_files);
|
|
50
|
+
if (md_files.length === 0) {
|
|
51
|
+
warnings.push({
|
|
52
|
+
type: 'empty_directory',
|
|
53
|
+
message: 'references/ directory exists but is empty',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// Check for references in SKILL.md
|
|
57
|
+
if (existsSync(skill_md_path)) {
|
|
58
|
+
const skill_content = readFileSync(skill_md_path, 'utf-8');
|
|
59
|
+
for (const md_file of md_files) {
|
|
60
|
+
if (!skill_content.includes(md_file)) {
|
|
61
|
+
warnings.push({
|
|
62
|
+
type: 'orphaned_file',
|
|
63
|
+
message: `Reference file '${md_file}' not mentioned in SKILL.md`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Level 3 validation: Check that all referenced files exist
|
|
70
|
+
if (existsSync(skill_md_path)) {
|
|
71
|
+
const skill_content = readFileSync(skill_md_path, 'utf-8');
|
|
72
|
+
// Extract markdown links to references/ directory
|
|
73
|
+
// Matches: [text](references/file.md) or [text](references/subdir/file.md)
|
|
74
|
+
const reference_link_pattern = /\[([^\]]+)\]\((references\/[^)]+\.md)\)/g;
|
|
75
|
+
const matches = skill_content.matchAll(reference_link_pattern);
|
|
76
|
+
for (const match of matches) {
|
|
77
|
+
const link_text = match[1];
|
|
78
|
+
const file_path = match[2]; // e.g., "references/examples.md"
|
|
79
|
+
const full_path = join(skill_path, file_path);
|
|
80
|
+
files_referenced.push(file_path);
|
|
81
|
+
if (!existsSync(full_path)) {
|
|
82
|
+
missing_files.push(file_path);
|
|
83
|
+
errors.push({
|
|
84
|
+
type: 'missing_file',
|
|
85
|
+
message: `Referenced file not found: ${file_path}\n` +
|
|
86
|
+
` → Linked from: [${link_text}]\n` +
|
|
87
|
+
` → Create the file or remove the broken link`,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Check nesting depth
|
|
92
|
+
const nesting = check_reference_nesting(skill_path, file_path);
|
|
93
|
+
let warning = null;
|
|
94
|
+
if (nesting.depth > 1) {
|
|
95
|
+
warning = `File has depth ${nesting.depth} (recommended: 1). Keep references one level deep from SKILL.md.`;
|
|
96
|
+
warnings.push({
|
|
97
|
+
type: 'nesting_depth',
|
|
98
|
+
message: `${file_path} has nesting depth ${nesting.depth} (recommended: 1)\n` +
|
|
99
|
+
` → Keep references one level deep from SKILL.md for clarity`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
nesting_data.push({
|
|
103
|
+
file: file_path,
|
|
104
|
+
references: nesting.references,
|
|
105
|
+
depth: nesting.depth,
|
|
106
|
+
warning,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Calculate orphaned files
|
|
112
|
+
const orphaned = files_found.filter((f) => !files_referenced.some((ref) => ref.includes(f)));
|
|
113
|
+
const validation = {
|
|
114
|
+
files_found,
|
|
115
|
+
files_referenced,
|
|
116
|
+
missing_files,
|
|
117
|
+
orphaned_files: orphaned,
|
|
118
|
+
nesting: nesting_data,
|
|
119
|
+
max_nesting_depth: nesting_data.length > 0
|
|
120
|
+
? Math.max(...nesting_data.map((n) => n.depth))
|
|
121
|
+
: 0,
|
|
122
|
+
};
|
|
123
|
+
return { validation, warnings, errors };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=references-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references-validator.js","sourceRoot":"","sources":["../../src/validators/references-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text analysis utilities for skill validation
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extract body content from SKILL.md (excluding YAML frontmatter)
|
|
6
|
+
*/
|
|
7
|
+
export function extract_body(content) {
|
|
8
|
+
const parts = content.split('---\n');
|
|
9
|
+
return parts.length >= 3
|
|
10
|
+
? parts.slice(2).join('---\n').trim()
|
|
11
|
+
: content;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Count words in text
|
|
15
|
+
*/
|
|
16
|
+
export function count_words(text) {
|
|
17
|
+
return text
|
|
18
|
+
.trim()
|
|
19
|
+
.split(/\s+/)
|
|
20
|
+
.filter((w) => w.length > 0).length;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Estimate tokens (rough approximation: 1 word ≈ 1.3 tokens for English)
|
|
24
|
+
*/
|
|
25
|
+
export function estimate_tokens(word_count) {
|
|
26
|
+
return Math.round(word_count * 1.3);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Estimate tokens for a string by counting words and applying ratio
|
|
30
|
+
*/
|
|
31
|
+
export function estimate_string_tokens(text) {
|
|
32
|
+
const word_count = count_words(text);
|
|
33
|
+
return estimate_tokens(word_count);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Remove HTML comments from content (for line counting)
|
|
37
|
+
*/
|
|
38
|
+
export function strip_html_comments(text) {
|
|
39
|
+
return text.replace(/<!--[\s\S]*?-->/g, '');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extract keywords from text (simplified extraction)
|
|
43
|
+
*/
|
|
44
|
+
export function extract_keywords(text) {
|
|
45
|
+
const words = text
|
|
46
|
+
.toLowerCase()
|
|
47
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
48
|
+
.split(/\s+/)
|
|
49
|
+
.filter((w) => w.length > 3);
|
|
50
|
+
const unique = [...new Set(words)];
|
|
51
|
+
return unique.filter((w) => ![
|
|
52
|
+
'this',
|
|
53
|
+
'that',
|
|
54
|
+
'with',
|
|
55
|
+
'from',
|
|
56
|
+
'have',
|
|
57
|
+
'will',
|
|
58
|
+
'when',
|
|
59
|
+
'what',
|
|
60
|
+
'where',
|
|
61
|
+
'which',
|
|
62
|
+
'their',
|
|
63
|
+
'them',
|
|
64
|
+
'then',
|
|
65
|
+
'than',
|
|
66
|
+
'these',
|
|
67
|
+
'those',
|
|
68
|
+
'there',
|
|
69
|
+
].includes(w));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=text-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-analysis.js","sourceRoot":"","sources":["../../src/validators/text-analysis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC;QACvB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;QACrC,CAAC,CAAC,OAAO,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,OAAO,IAAI;SACT,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IAClD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CACnB,CAAC,CAAC,EAAE,EAAE,CACL,CAAC;QACA,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;KACP,CAAC,QAAQ,CAAC,CAAC,CAAC,CACd,CAAC;AACH,CAAC"}
|