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.
Files changed (45) hide show
  1. package/README.md +34 -9
  2. package/dist/commands/init.js +5 -3
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/commands/install.js +1 -1
  5. package/dist/commands/install.js.map +1 -1
  6. package/dist/commands/stats.js +1 -1
  7. package/dist/commands/stats.js.map +1 -1
  8. package/dist/commands/validate.js +24 -3
  9. package/dist/commands/validate.js.map +1 -1
  10. package/dist/commands/watch.js +82 -0
  11. package/dist/commands/watch.js.map +1 -0
  12. package/dist/core/validator.js +169 -321
  13. package/dist/core/validator.js.map +1 -1
  14. package/dist/index.js +23 -12
  15. package/dist/index.js.map +1 -1
  16. package/dist/skills/skill-creator/SKILL.md +26 -108
  17. package/dist/skills/skill-creator/references/cli-reference.md +35 -35
  18. package/dist/skills/skill-creator/references/development-process.md +208 -0
  19. package/dist/skills/skill-creator/references/skill-examples.md +1 -1
  20. package/dist/validators/alignment-validator.js +54 -0
  21. package/dist/validators/alignment-validator.js.map +1 -0
  22. package/dist/validators/content-validator.js +144 -0
  23. package/dist/validators/content-validator.js.map +1 -0
  24. package/dist/validators/description-validator.js +136 -0
  25. package/dist/validators/description-validator.js.map +1 -0
  26. package/dist/validators/file-structure-validator.js +125 -0
  27. package/dist/validators/file-structure-validator.js.map +1 -0
  28. package/dist/validators/frontmatter-validator.js +114 -0
  29. package/dist/validators/frontmatter-validator.js.map +1 -0
  30. package/dist/validators/references-validator.js +125 -0
  31. package/dist/validators/references-validator.js.map +1 -0
  32. package/dist/validators/text-analysis.js +71 -0
  33. package/dist/validators/text-analysis.js.map +1 -0
  34. package/docs/CLI-IMPROVEMENTS.md +960 -0
  35. package/docs/SKILL-CREATOR-UPDATES.md +1071 -0
  36. package/docs/SKILL-DEVELOPMENT.md +10 -10
  37. package/docs/SKILLS-ARCHITECTURE.md +1 -1
  38. package/docs/SKILLS-ECOSYSTEM-ANALYSIS.md +509 -0
  39. package/docs/SKILLS-OPPORTUNITIES.md +652 -0
  40. package/package.json +4 -4
  41. package/dist/skills/skill-creator/skill-creator/SKILL.md +0 -143
  42. package/dist/skills/skill-creator/skill-creator/references/anthropic-resources.md +0 -504
  43. package/dist/skills/skill-creator/skill-creator/references/cli-reference.md +0 -507
  44. package/dist/skills/skill-creator/skill-creator/references/skill-examples.md +0 -413
  45. 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"}