@phuc1403/musketeer 0.8.0 → 0.10.0

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 (236) hide show
  1. package/INSTALLATION.md +52 -52
  2. package/README.md +49 -49
  3. package/bin/musketeer.js +168 -168
  4. package/manifest.json +333 -301
  5. package/package.json +48 -48
  6. package/src/dotnet-scaffold-copier.js +79 -79
  7. package/src/provisioner/detect.js +93 -93
  8. package/src/self-update.js +77 -77
  9. package/template/.claude/agents/code-reviewer.md +182 -166
  10. package/template/.claude/agents/git-manager.md +18 -18
  11. package/template/.claude/agents/hallmark-auditor.md +78 -78
  12. package/template/.claude/agents/researcher.md +33 -33
  13. package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
  14. package/template/.claude/hooks/git-skill-reminder.cjs +53 -0
  15. package/template/.claude/hooks/init-adr-dir.cjs +173 -173
  16. package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
  17. package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
  18. package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
  19. package/template/.claude/hooks/lib/colors.cjs +180 -122
  20. package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
  21. package/template/.claude/hooks/lib/transcript-parser.cjs +300 -277
  22. package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
  23. package/template/.claude/hooks/{usage-context-awareness.cjs → usage-quota-cache-refresh.cjs} +166 -166
  24. package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
  25. package/template/.claude/hooks/validate-cml-hook.js +145 -145
  26. package/template/.claude/skills/adr-writer/SKILL.md +48 -48
  27. package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
  28. package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
  29. package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
  30. package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
  31. package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
  32. package/template/.claude/skills/code-review/SKILL.md +201 -54
  33. package/template/.claude/skills/code-review/references/checklist-workflow.md +96 -0
  34. package/template/.claude/skills/code-review/references/checklists/api.md +52 -52
  35. package/template/.claude/skills/code-review/references/checklists/base.md +100 -100
  36. package/template/.claude/skills/code-review/references/checklists/web-app.md +54 -54
  37. package/template/.claude/skills/code-review/references/code-review-reception.md +113 -0
  38. package/template/.claude/skills/code-review/references/codebase-scan-workflow.md +30 -0
  39. package/template/.claude/skills/code-review/references/edge-case-scouting.md +119 -0
  40. package/template/.claude/skills/code-review/references/input-mode-resolution.md +135 -0
  41. package/template/.claude/skills/code-review/references/parallel-review-workflow.md +76 -0
  42. package/template/.claude/skills/code-review/references/requesting-code-review.md +116 -0
  43. package/template/.claude/skills/code-review/references/spec-compliance-review.md +43 -0
  44. package/template/.claude/skills/code-review/references/task-management-reviews.md +140 -0
  45. package/template/.claude/skills/code-review/references/verification-before-completion.md +139 -0
  46. package/template/.claude/skills/context-map/SKILL.md +80 -80
  47. package/template/.claude/skills/context-map/example.cml +106 -106
  48. package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
  49. package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
  50. package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
  51. package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
  52. package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
  53. package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
  54. package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
  55. package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
  56. package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
  57. package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
  58. package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
  59. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
  60. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
  61. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
  62. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
  63. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
  64. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
  65. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
  66. package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
  67. package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
  68. package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
  69. package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
  70. package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
  71. package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
  72. package/template/.claude/skills/git/SKILL.md +131 -115
  73. package/template/.claude/skills/git/references/branch-management.md +88 -88
  74. package/template/.claude/skills/git/references/commit-standards.md +46 -46
  75. package/template/.claude/skills/git/references/context-efficiency.md +54 -0
  76. package/template/.claude/skills/git/references/gh-cli-guide.md +109 -109
  77. package/template/.claude/skills/git/references/safety-protocols.md +69 -69
  78. package/template/.claude/skills/git/references/workflow-commit.md +58 -58
  79. package/template/.claude/skills/git/references/workflow-merge-pr.md +136 -0
  80. package/template/.claude/skills/git/references/workflow-merge.md +48 -48
  81. package/template/.claude/skills/git/references/workflow-pr.md +58 -58
  82. package/template/.claude/skills/git/references/workflow-push.md +52 -52
  83. package/template/.claude/skills/hallmark/SKILL.md +552 -552
  84. package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
  85. package/template/.claude/skills/hallmark/references/assets.md +406 -406
  86. package/template/.claude/skills/hallmark/references/color.md +95 -95
  87. package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
  88. package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
  89. package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
  90. package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
  91. package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
  92. package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
  93. package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
  94. package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
  95. package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
  96. package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
  97. package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
  98. package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
  99. package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
  100. package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
  101. package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
  102. package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
  103. package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
  104. package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
  105. package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
  106. package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
  107. package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
  108. package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
  109. package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
  110. package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
  111. package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
  112. package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
  113. package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
  114. package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
  115. package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
  116. package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
  117. package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
  118. package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
  119. package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
  120. package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
  121. package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
  122. package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
  123. package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
  124. package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
  125. package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
  126. package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
  127. package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
  128. package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
  129. package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
  130. package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
  131. package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
  132. package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
  133. package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
  134. package/template/.claude/skills/hallmark/references/contract.md +24 -24
  135. package/template/.claude/skills/hallmark/references/copy.md +182 -182
  136. package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
  137. package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
  138. package/template/.claude/skills/hallmark/references/design-md.md +116 -116
  139. package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
  140. package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
  141. package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
  142. package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
  143. package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
  144. package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
  145. package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
  146. package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
  147. package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
  148. package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
  149. package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
  150. package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
  151. package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
  152. package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
  153. package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
  154. package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
  155. package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
  156. package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
  157. package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
  158. package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
  159. package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
  160. package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
  161. package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
  162. package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
  163. package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
  164. package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
  165. package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
  166. package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
  167. package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
  168. package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
  169. package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
  170. package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
  171. package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
  172. package/template/.claude/skills/hallmark/references/motion.md +109 -109
  173. package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
  174. package/template/.claude/skills/hallmark/references/responsive.md +138 -138
  175. package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
  176. package/template/.claude/skills/hallmark/references/structure.md +164 -164
  177. package/template/.claude/skills/hallmark/references/study.md +511 -511
  178. package/template/.claude/skills/hallmark/references/typography.md +243 -243
  179. package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
  180. package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
  181. package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
  182. package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
  183. package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
  184. package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
  185. package/template/.claude/skills/handoff/SKILL.md +15 -15
  186. package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
  187. package/template/.claude/skills/research/SKILL.md +69 -69
  188. package/template/.claude/skills/skill-creator/LICENSE.txt +201 -201
  189. package/template/.claude/skills/skill-creator/SKILL.md +154 -149
  190. package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -274
  191. package/template/.claude/skills/skill-creator/agents/comparator.md +202 -202
  192. package/template/.claude/skills/skill-creator/agents/grader.md +223 -223
  193. package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -146
  194. package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -471
  195. package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -1325
  196. package/template/.claude/skills/skill-creator/references/benchmark-optimization-guide.md +86 -86
  197. package/template/.claude/skills/skill-creator/references/distribution-guide.md +79 -79
  198. package/template/.claude/skills/skill-creator/references/eval-infrastructure-guide.md +129 -129
  199. package/template/.claude/skills/skill-creator/references/eval-schemas.md +121 -121
  200. package/template/.claude/skills/skill-creator/references/mcp-skills-integration.md +71 -71
  201. package/template/.claude/skills/skill-creator/references/metadata-quality-criteria.md +94 -94
  202. package/template/.claude/skills/skill-creator/references/plugin-marketplace-hosting.md +104 -104
  203. package/template/.claude/skills/skill-creator/references/plugin-marketplace-overview.md +89 -89
  204. package/template/.claude/skills/skill-creator/references/plugin-marketplace-schema.md +93 -93
  205. package/template/.claude/skills/skill-creator/references/plugin-marketplace-sources.md +103 -103
  206. package/template/.claude/skills/skill-creator/references/plugin-marketplace-troubleshooting.md +76 -76
  207. package/template/.claude/skills/skill-creator/references/script-quality-criteria.md +106 -106
  208. package/template/.claude/skills/skill-creator/references/skill-anatomy-and-requirements.md +77 -77
  209. package/template/.claude/skills/skill-creator/references/skill-creation-workflow.md +152 -151
  210. package/template/.claude/skills/skill-creator/references/skill-design-patterns.md +75 -75
  211. package/template/.claude/skills/skill-creator/references/skillmark-benchmark-criteria.md +102 -102
  212. package/template/.claude/skills/skill-creator/references/structure-organization-criteria.md +114 -114
  213. package/template/.claude/skills/skill-creator/references/testing-and-iteration.md +78 -78
  214. package/template/.claude/skills/skill-creator/references/token-efficiency-criteria.md +74 -74
  215. package/template/.claude/skills/skill-creator/references/troubleshooting-guide.md +81 -81
  216. package/template/.claude/skills/skill-creator/references/validation-checklist.md +83 -83
  217. package/template/.claude/skills/skill-creator/references/writing-effective-instructions.md +88 -88
  218. package/template/.claude/skills/skill-creator/references/yaml-frontmatter-reference.md +92 -92
  219. package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -401
  220. package/template/.claude/skills/skill-creator/scripts/encoding_utils.py +36 -36
  221. package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -326
  222. package/template/.claude/skills/skill-creator/scripts/improve_description.py +248 -248
  223. package/template/.claude/skills/skill-creator/scripts/init_skill.py +360 -360
  224. package/template/.claude/skills/skill-creator/scripts/package_skill.py +143 -143
  225. package/template/.claude/skills/skill-creator/scripts/quick_validate.py +110 -110
  226. package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -310
  227. package/template/.claude/skills/skill-creator/scripts/run_loop.py +332 -332
  228. package/template/.claude/skills/skill-creator/scripts/utils.py +47 -47
  229. package/template/.claude/skills/tdd/SKILL.md +142 -142
  230. package/template/.claude/skills/tdd/deep-modules.md +15 -15
  231. package/template/.claude/skills/tdd/interface-design.md +31 -31
  232. package/template/.claude/skills/tdd/mocking.md +59 -59
  233. package/template/.claude/skills/tdd/refactoring.md +10 -10
  234. package/template/.claude/skills/tdd/tests.md +61 -61
  235. package/template/.claude/statusline.cjs +0 -0
  236. package/template/.claude/skills/code-review/references/adversarial-review.md +0 -223
@@ -1,143 +1,143 @@
1
- #!/usr/bin/env python3
2
- """
3
- Skill Packager - Creates a distributable zip file of a skill folder
4
-
5
- Usage:
6
- python utils/package_skill.py <path/to/skill-folder> [output-directory]
7
-
8
- Example:
9
- python utils/package_skill.py skills/public/my-skill
10
- python utils/package_skill.py skills/public/my-skill ./dist
11
- """
12
-
13
- import fnmatch
14
- import sys
15
- import zipfile
16
- from pathlib import Path
17
-
18
- from encoding_utils import configure_utf8_console
19
- from quick_validate import validate_skill
20
-
21
- # Fix Windows console encoding for Unicode output (emojis, arrows)
22
- configure_utf8_console()
23
-
24
- # Exclusion patterns (from official Anthropic skill-creator)
25
- EXCLUDE_DIRS = {'__pycache__', 'node_modules', '.git', '.DS_Store'}
26
- EXCLUDE_GLOBS = {'*.pyc', '*.pyo', '.DS_Store', '*.egg-info'}
27
- ROOT_EXCLUDE_DIRS = {'evals'} # Only excluded at skill root level
28
-
29
-
30
- def package_skill(skill_path, output_dir=None):
31
- """
32
- Package a skill folder into a zip file.
33
-
34
- Args:
35
- skill_path: Path to the skill folder
36
- output_dir: Optional output directory for the zip file (defaults to current directory)
37
-
38
- Returns:
39
- Path to the created zip file, or None if error
40
- """
41
- skill_path = Path(skill_path).resolve()
42
-
43
- # Validate skill folder exists
44
- if not skill_path.exists():
45
- print(f"❌ Error: Skill folder not found: {skill_path}")
46
- return None
47
-
48
- if not skill_path.is_dir():
49
- print(f"❌ Error: Path is not a directory: {skill_path}")
50
- return None
51
-
52
- # Validate SKILL.md exists
53
- skill_md = skill_path / "SKILL.md"
54
- if not skill_md.exists():
55
- print(f"❌ Error: SKILL.md not found in {skill_path}")
56
- return None
57
-
58
- # Run validation before packaging
59
- print("🔍 Validating skill...")
60
- valid, message = validate_skill(skill_path)
61
- if not valid:
62
- print(f"❌ Validation failed: {message}")
63
- print(" Please fix the validation errors before packaging.")
64
- return None
65
- print(f"✅ {message}\n")
66
-
67
- # Determine output location
68
- skill_name = skill_path.name
69
- if output_dir:
70
- output_path = Path(output_dir).resolve()
71
- output_path.mkdir(parents=True, exist_ok=True)
72
- else:
73
- output_path = Path.cwd()
74
-
75
- zip_filename = output_path / f"{skill_name}.zip"
76
-
77
- # Create the zip file
78
- try:
79
- with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
80
- # Walk through the skill directory, excluding unwanted files
81
- skipped = []
82
- for file_path in skill_path.rglob('*'):
83
- if file_path.is_file():
84
- rel = file_path.relative_to(skill_path)
85
- parts = rel.parts
86
-
87
- # Skip excluded directories
88
- if any(p in EXCLUDE_DIRS for p in parts):
89
- skipped.append(str(rel))
90
- continue
91
-
92
- # Skip root-only excluded dirs (e.g., evals/)
93
- if parts[0] in ROOT_EXCLUDE_DIRS:
94
- skipped.append(str(rel))
95
- continue
96
-
97
- # Skip excluded file patterns
98
- if any(fnmatch.fnmatch(file_path.name, g) for g in EXCLUDE_GLOBS):
99
- skipped.append(str(rel))
100
- continue
101
-
102
- arcname = file_path.relative_to(skill_path.parent)
103
- zipf.write(file_path, arcname)
104
- print(f" Added: {arcname}")
105
-
106
- if skipped:
107
- print(f"\n Skipped {len(skipped)} file(s): {', '.join(skipped[:5])}"
108
- + ("..." if len(skipped) > 5 else ""))
109
-
110
- print(f"\n✅ Successfully packaged skill to: {zip_filename}")
111
- return zip_filename
112
-
113
- except Exception as e:
114
- print(f"❌ Error creating zip file: {e}")
115
- return None
116
-
117
-
118
- def main():
119
- if len(sys.argv) < 2:
120
- print("Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]")
121
- print("\nExample:")
122
- print(" python utils/package_skill.py skills/public/my-skill")
123
- print(" python utils/package_skill.py skills/public/my-skill ./dist")
124
- sys.exit(1)
125
-
126
- skill_path = sys.argv[1]
127
- output_dir = sys.argv[2] if len(sys.argv) > 2 else None
128
-
129
- print(f"📦 Packaging skill: {skill_path}")
130
- if output_dir:
131
- print(f" Output directory: {output_dir}")
132
- print()
133
-
134
- result = package_skill(skill_path, output_dir)
135
-
136
- if result:
137
- sys.exit(0)
138
- else:
139
- sys.exit(1)
140
-
141
-
142
- if __name__ == "__main__":
143
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ Skill Packager - Creates a distributable zip file of a skill folder
4
+
5
+ Usage:
6
+ python utils/package_skill.py <path/to/skill-folder> [output-directory]
7
+
8
+ Example:
9
+ python utils/package_skill.py skills/public/my-skill
10
+ python utils/package_skill.py skills/public/my-skill ./dist
11
+ """
12
+
13
+ import fnmatch
14
+ import sys
15
+ import zipfile
16
+ from pathlib import Path
17
+
18
+ from encoding_utils import configure_utf8_console
19
+ from quick_validate import validate_skill
20
+
21
+ # Fix Windows console encoding for Unicode output (emojis, arrows)
22
+ configure_utf8_console()
23
+
24
+ # Exclusion patterns (from official Anthropic skill-creator)
25
+ EXCLUDE_DIRS = {'__pycache__', 'node_modules', '.git', '.DS_Store'}
26
+ EXCLUDE_GLOBS = {'*.pyc', '*.pyo', '.DS_Store', '*.egg-info'}
27
+ ROOT_EXCLUDE_DIRS = {'evals'} # Only excluded at skill root level
28
+
29
+
30
+ def package_skill(skill_path, output_dir=None):
31
+ """
32
+ Package a skill folder into a zip file.
33
+
34
+ Args:
35
+ skill_path: Path to the skill folder
36
+ output_dir: Optional output directory for the zip file (defaults to current directory)
37
+
38
+ Returns:
39
+ Path to the created zip file, or None if error
40
+ """
41
+ skill_path = Path(skill_path).resolve()
42
+
43
+ # Validate skill folder exists
44
+ if not skill_path.exists():
45
+ print(f"❌ Error: Skill folder not found: {skill_path}")
46
+ return None
47
+
48
+ if not skill_path.is_dir():
49
+ print(f"❌ Error: Path is not a directory: {skill_path}")
50
+ return None
51
+
52
+ # Validate SKILL.md exists
53
+ skill_md = skill_path / "SKILL.md"
54
+ if not skill_md.exists():
55
+ print(f"❌ Error: SKILL.md not found in {skill_path}")
56
+ return None
57
+
58
+ # Run validation before packaging
59
+ print("🔍 Validating skill...")
60
+ valid, message = validate_skill(skill_path)
61
+ if not valid:
62
+ print(f"❌ Validation failed: {message}")
63
+ print(" Please fix the validation errors before packaging.")
64
+ return None
65
+ print(f"✅ {message}\n")
66
+
67
+ # Determine output location
68
+ skill_name = skill_path.name
69
+ if output_dir:
70
+ output_path = Path(output_dir).resolve()
71
+ output_path.mkdir(parents=True, exist_ok=True)
72
+ else:
73
+ output_path = Path.cwd()
74
+
75
+ zip_filename = output_path / f"{skill_name}.zip"
76
+
77
+ # Create the zip file
78
+ try:
79
+ with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
80
+ # Walk through the skill directory, excluding unwanted files
81
+ skipped = []
82
+ for file_path in skill_path.rglob('*'):
83
+ if file_path.is_file():
84
+ rel = file_path.relative_to(skill_path)
85
+ parts = rel.parts
86
+
87
+ # Skip excluded directories
88
+ if any(p in EXCLUDE_DIRS for p in parts):
89
+ skipped.append(str(rel))
90
+ continue
91
+
92
+ # Skip root-only excluded dirs (e.g., evals/)
93
+ if parts[0] in ROOT_EXCLUDE_DIRS:
94
+ skipped.append(str(rel))
95
+ continue
96
+
97
+ # Skip excluded file patterns
98
+ if any(fnmatch.fnmatch(file_path.name, g) for g in EXCLUDE_GLOBS):
99
+ skipped.append(str(rel))
100
+ continue
101
+
102
+ arcname = file_path.relative_to(skill_path.parent)
103
+ zipf.write(file_path, arcname)
104
+ print(f" Added: {arcname}")
105
+
106
+ if skipped:
107
+ print(f"\n Skipped {len(skipped)} file(s): {', '.join(skipped[:5])}"
108
+ + ("..." if len(skipped) > 5 else ""))
109
+
110
+ print(f"\n✅ Successfully packaged skill to: {zip_filename}")
111
+ return zip_filename
112
+
113
+ except Exception as e:
114
+ print(f"❌ Error creating zip file: {e}")
115
+ return None
116
+
117
+
118
+ def main():
119
+ if len(sys.argv) < 2:
120
+ print("Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]")
121
+ print("\nExample:")
122
+ print(" python utils/package_skill.py skills/public/my-skill")
123
+ print(" python utils/package_skill.py skills/public/my-skill ./dist")
124
+ sys.exit(1)
125
+
126
+ skill_path = sys.argv[1]
127
+ output_dir = sys.argv[2] if len(sys.argv) > 2 else None
128
+
129
+ print(f"📦 Packaging skill: {skill_path}")
130
+ if output_dir:
131
+ print(f" Output directory: {output_dir}")
132
+ print()
133
+
134
+ result = package_skill(skill_path, output_dir)
135
+
136
+ if result:
137
+ sys.exit(0)
138
+ else:
139
+ sys.exit(1)
140
+
141
+
142
+ if __name__ == "__main__":
143
+ main()
@@ -1,110 +1,110 @@
1
- #!/usr/bin/env python3
2
- """
3
- Quick validation script for skills - minimal version
4
- """
5
-
6
- import sys
7
- import re
8
- from pathlib import Path
9
-
10
- from encoding_utils import configure_utf8_console, read_text_utf8
11
-
12
- # Fix Windows console encoding for Unicode output
13
- configure_utf8_console()
14
-
15
- def validate_skill(skill_path):
16
- """Basic validation of a skill"""
17
- skill_path = Path(skill_path)
18
-
19
- # Check SKILL.md exists
20
- skill_md = skill_path / 'SKILL.md'
21
- if not skill_md.exists():
22
- return False, "SKILL.md not found"
23
-
24
- # Read and validate frontmatter
25
- content = read_text_utf8(skill_md)
26
- if not content.startswith('---'):
27
- return False, "No YAML frontmatter found"
28
-
29
- # Extract frontmatter
30
- match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
31
- if not match:
32
- return False, "Invalid frontmatter format"
33
-
34
- frontmatter = match.group(1)
35
-
36
- # Check required fields
37
- if 'name:' not in frontmatter:
38
- return False, "Missing 'name' in frontmatter"
39
- if 'description:' not in frontmatter:
40
- return False, "Missing 'description' in frontmatter"
41
-
42
- # Extract name for validation
43
- name_match = re.search(r'name:\s*(.+)', frontmatter)
44
- if name_match:
45
- name = name_match.group(1).strip().strip('"').strip("'")
46
-
47
- # Support namespaced identifiers: ck:skill-name (single namespace segment)
48
- if name.count(':') > 1:
49
- return False, (
50
- f"Name '{name}' is invalid. Use either 'skill-name' or "
51
- "'namespace:skill-name' with a single colon."
52
- )
53
-
54
- namespace = None
55
- skill_id = name
56
- if ':' in name:
57
- namespace, skill_id = name.split(':', 1)
58
-
59
- id_pattern = r'^[a-z0-9-]+$'
60
- if namespace and not re.match(id_pattern, namespace):
61
- return False, (
62
- f"Namespace '{namespace}' must be lowercase letters, digits, and hyphens only"
63
- )
64
-
65
- if not re.match(id_pattern, skill_id):
66
- return False, (
67
- f"Skill id '{skill_id}' must be lowercase letters, digits, and hyphens only"
68
- )
69
-
70
- for segment_name, segment in [("namespace", namespace), ("skill id", skill_id)]:
71
- if segment and (segment.startswith('-') or segment.endswith('-') or '--' in segment):
72
- return False, (
73
- f"{segment_name.capitalize()} '{segment}' cannot start/end with hyphen "
74
- "or contain consecutive hyphens"
75
- )
76
-
77
- # Validate name length (official max: 64 chars)
78
- if name_match:
79
- if len(skill_id) > 64:
80
- return False, f"Skill id '{skill_id}' exceeds 64 characters ({len(skill_id)})"
81
- if namespace and len(namespace) > 64:
82
- return False, f"Namespace '{namespace}' exceeds 64 characters ({len(namespace)})"
83
-
84
- # Extract and validate description
85
- desc_match = re.search(r'description:\s*(.+)', frontmatter)
86
- if desc_match:
87
- description = desc_match.group(1).strip().strip('"').strip("'")
88
-
89
- # YAML block scalar indicators are valid (e.g. description: >-)
90
- if description in {'>', '>-', '|', '|-'}:
91
- description = ''
92
-
93
- # Check for angle brackets
94
- if '<' in description or '>' in description:
95
- return False, "Description cannot contain angle brackets (< or >)"
96
-
97
- # Check description length (official max: 1024 chars)
98
- if len(description) > 1024:
99
- return False, f"Description exceeds 1024 characters ({len(description)})"
100
-
101
- return True, "Skill is valid!"
102
-
103
- if __name__ == "__main__":
104
- if len(sys.argv) != 2:
105
- print("Usage: python quick_validate.py <skill_directory>")
106
- sys.exit(1)
107
-
108
- valid, message = validate_skill(sys.argv[1])
109
- print(message)
110
- sys.exit(0 if valid else 1)
1
+ #!/usr/bin/env python3
2
+ """
3
+ Quick validation script for skills - minimal version
4
+ """
5
+
6
+ import sys
7
+ import re
8
+ from pathlib import Path
9
+
10
+ from encoding_utils import configure_utf8_console, read_text_utf8
11
+
12
+ # Fix Windows console encoding for Unicode output
13
+ configure_utf8_console()
14
+
15
+ def validate_skill(skill_path):
16
+ """Basic validation of a skill"""
17
+ skill_path = Path(skill_path)
18
+
19
+ # Check SKILL.md exists
20
+ skill_md = skill_path / 'SKILL.md'
21
+ if not skill_md.exists():
22
+ return False, "SKILL.md not found"
23
+
24
+ # Read and validate frontmatter
25
+ content = read_text_utf8(skill_md)
26
+ if not content.startswith('---'):
27
+ return False, "No YAML frontmatter found"
28
+
29
+ # Extract frontmatter
30
+ match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
31
+ if not match:
32
+ return False, "Invalid frontmatter format"
33
+
34
+ frontmatter = match.group(1)
35
+
36
+ # Check required fields
37
+ if 'name:' not in frontmatter:
38
+ return False, "Missing 'name' in frontmatter"
39
+ if 'description:' not in frontmatter:
40
+ return False, "Missing 'description' in frontmatter"
41
+
42
+ # Extract name for validation
43
+ name_match = re.search(r'name:\s*(.+)', frontmatter)
44
+ if name_match:
45
+ name = name_match.group(1).strip().strip('"').strip("'")
46
+
47
+ # Support namespaced identifiers: ck:skill-name (single namespace segment)
48
+ if name.count(':') > 1:
49
+ return False, (
50
+ f"Name '{name}' is invalid. Use either 'skill-name' or "
51
+ "'namespace:skill-name' with a single colon."
52
+ )
53
+
54
+ namespace = None
55
+ skill_id = name
56
+ if ':' in name:
57
+ namespace, skill_id = name.split(':', 1)
58
+
59
+ id_pattern = r'^[a-z0-9-]+$'
60
+ if namespace and not re.match(id_pattern, namespace):
61
+ return False, (
62
+ f"Namespace '{namespace}' must be lowercase letters, digits, and hyphens only"
63
+ )
64
+
65
+ if not re.match(id_pattern, skill_id):
66
+ return False, (
67
+ f"Skill id '{skill_id}' must be lowercase letters, digits, and hyphens only"
68
+ )
69
+
70
+ for segment_name, segment in [("namespace", namespace), ("skill id", skill_id)]:
71
+ if segment and (segment.startswith('-') or segment.endswith('-') or '--' in segment):
72
+ return False, (
73
+ f"{segment_name.capitalize()} '{segment}' cannot start/end with hyphen "
74
+ "or contain consecutive hyphens"
75
+ )
76
+
77
+ # Validate name length (official max: 64 chars)
78
+ if name_match:
79
+ if len(skill_id) > 64:
80
+ return False, f"Skill id '{skill_id}' exceeds 64 characters ({len(skill_id)})"
81
+ if namespace and len(namespace) > 64:
82
+ return False, f"Namespace '{namespace}' exceeds 64 characters ({len(namespace)})"
83
+
84
+ # Extract and validate description
85
+ desc_match = re.search(r'description:\s*(.+)', frontmatter)
86
+ if desc_match:
87
+ description = desc_match.group(1).strip().strip('"').strip("'")
88
+
89
+ # YAML block scalar indicators are valid (e.g. description: >-)
90
+ if description in {'>', '>-', '|', '|-'}:
91
+ description = ''
92
+
93
+ # Check for angle brackets
94
+ if '<' in description or '>' in description:
95
+ return False, "Description cannot contain angle brackets (< or >)"
96
+
97
+ # Check description length (official max: 1024 chars)
98
+ if len(description) > 1024:
99
+ return False, f"Description exceeds 1024 characters ({len(description)})"
100
+
101
+ return True, "Skill is valid!"
102
+
103
+ if __name__ == "__main__":
104
+ if len(sys.argv) != 2:
105
+ print("Usage: python quick_validate.py <skill_directory>")
106
+ sys.exit(1)
107
+
108
+ valid, message = validate_skill(sys.argv[1])
109
+ print(message)
110
+ sys.exit(0 if valid else 1)