@every-env/compound-plugin 2.36.3 → 2.36.5

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.
@@ -11,7 +11,7 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "compound-engineering",
14
- "description": "AI-powered development tools that get smarter with every use. Make each unit of engineering work easier than the last. Includes 28 specialized agents and 47 skills.",
14
+ "description": "AI-powered development tools that get smarter with every use. Make each unit of engineering work easier than the last. Includes 28 specialized agents and 46 skills.",
15
15
  "version": "2.40.0",
16
16
  "author": {
17
17
  "name": "Kieran Klaassen",
package/AGENTS.md CHANGED
@@ -7,7 +7,7 @@ This repository contains a Bun/TypeScript CLI that converts Claude Code plugins
7
7
  - **Branching:** Create a feature branch for any non-trivial change. If already on the correct branch for the task, keep using it; do not create additional branches or worktrees unless explicitly requested.
8
8
  - **Safety:** Do not delete or overwrite user data. Avoid destructive commands.
9
9
  - **Testing:** Run `bun test` after changes that affect parsing, conversion, or output.
10
- - **Release versioning:** The root CLI package (`package.json`, `CHANGELOG.md`, and repo `v*` tags) uses one shared release line managed by semantic-release on `main`. Do not start or maintain a separate root CLI version stream. Use conventional commits and let release automation write the next root package version. Keep the root changelog header block in sync with `.releaserc.json` `changelogTitle` so generated release entries stay under the header. Embedded marketplace plugin metadata (`plugins/compound-engineering/.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`) is a separate version surface and may differ.
10
+ - **Release versioning:** The root CLI package (`package.json`, root `CHANGELOG.md`, and repo `v*` tags) uses one shared release line managed by semantic-release on `main`. Do not start or maintain a separate root CLI version stream. Use conventional commits and let release automation write the next root package version. Keep the root changelog header block in sync with `.releaserc.json` `changelogTitle` so generated release entries stay under the header. Embedded marketplace plugin metadata (`plugins/compound-engineering/.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`) is a separate version surface and may differ, but contributors should not guess or hand-bump release versions for it in normal PRs. The automated release process decides the next plugin/marketplace releases and changelog entries after deciding which merged changes ship together.
11
11
  - **Output Paths:** Keep OpenCode output at `opencode.json` and `.opencode/{agents,skills,plugins}`. For OpenCode, command go to `~/.config/opencode/commands/<name>.md`; `opencode.json` is deep-merged (never overwritten wholesale).
12
12
  - **ASCII-first:** Use ASCII unless the file already contains Unicode.
13
13
 
@@ -48,6 +48,16 @@ Add a new provider when at least one of these is true:
48
48
 
49
49
  Avoid adding a provider if the target spec is unstable or undocumented.
50
50
 
51
+ ## Agent References in Skills
52
+
53
+ When referencing agents from within skill SKILL.md files (e.g., via the `Agent` or `Task` tool), always use the **fully-qualified namespace**: `compound-engineering:<category>:<agent-name>`. Never use the short agent name alone.
54
+
55
+ Example:
56
+ - `compound-engineering:research:learnings-researcher` (correct)
57
+ - `learnings-researcher` (wrong - will fail to resolve at runtime)
58
+
59
+ This prevents resolution failures when the plugin is installed alongside other plugins that may define agents with the same short name.
60
+
51
61
  ## Repository Docs Convention
52
62
 
53
63
  - **Plans** live in `docs/plans/` and track implementation progress.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  Release numbering now follows the repository `v*` tag line. Starting at `v2.34.0`, the root CLI package and this changelog stay on that shared version stream. Older entries below retain the previous `0.x` CLI numbering.
9
9
 
10
+ ## [2.36.5](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.4...v2.36.5) (2026-03-15)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **create-agent-skills:** remove literal dynamic context directives that break skill loading ([4b4d1ae](https://github.com/EveryInc/compound-engineering-plugin/commit/4b4d1ae2707895d6d4fd2e60a64d83ca50f094a6)), closes [anthropics/claude-code#27149](https://github.com/anthropics/claude-code/issues/27149) [#13655](https://github.com/EveryInc/compound-engineering-plugin/issues/13655)
16
+
17
+ ## [2.36.4](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.3...v2.36.4) (2026-03-14)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **skills:** use fully-qualified agent namespace in Task invocations ([026602e](https://github.com/EveryInc/compound-engineering-plugin/commit/026602e6247d63a83502b80e72cd318232a06af7)), closes [#251](https://github.com/EveryInc/compound-engineering-plugin/issues/251)
23
+
10
24
  ## [2.36.3](https://github.com/EveryInc/compound-engineering-plugin/compare/v2.36.2...v2.36.3) (2026-03-13)
11
25
 
12
26
 
package/CLAUDE.md CHANGED
@@ -50,7 +50,7 @@ Rules:
50
50
  - Do not start a separate root CLI version stream. The root CLI follows the repo tag line.
51
51
  - Do not hand-bump the root CLI `package.json` or root `CHANGELOG.md` for routine feature work. Use conventional commits and let semantic-release write the released root version back to git.
52
52
  - Keep the root `CHANGELOG.md` header block aligned with `.releaserc.json` `changelogTitle`. If they drift, semantic-release will prepend release notes above the header.
53
- - Continue updating embedded plugin metadata when the plugin contents themselves change.
53
+ - Do not guess or hand-bump embedded plugin release versions in routine PRs. The automated release process decides the next plugin/marketplace version and generate release changelog entries after choosing which merged changes ship together.
54
54
 
55
55
  ### Adding a New Plugin
56
56
 
@@ -93,17 +93,17 @@ The description appears in multiple places and must match everywhere:
93
93
 
94
94
  Format: `"Includes X specialized agents, Y commands, and Z skill(s)."`
95
95
 
96
- #### 3. Update version numbers
96
+ #### 3. Do not pre-cut release versions
97
97
 
98
- When adding new functionality, bump the version in:
98
+ Contributors should not guess the next released plugin version in a normal PR:
99
99
 
100
- - [ ] `plugins/compound-engineering/.claude-plugin/plugin.json` → `version`
101
- - [ ] `.claude-plugin/marketplace.json` → plugin `version`
100
+ - [ ] No manual bump in `plugins/compound-engineering/.claude-plugin/plugin.json` → `version`
101
+ - [ ] No manual bump in `.claude-plugin/marketplace.json` → plugin `version`
102
102
 
103
103
  #### 4. Update documentation
104
104
 
105
105
  - [ ] `plugins/compound-engineering/README.md` → list all components
106
- - [ ] `plugins/compound-engineering/CHANGELOG.md` document changes
106
+ - [ ] Do not cut a release section in `plugins/compound-engineering/CHANGELOG.md` for a normal feature PR
107
107
  - [ ] `CLAUDE.md` → update structure diagram if needed
108
108
 
109
109
  #### 5. Rebuild documentation site
package/README.md CHANGED
@@ -60,7 +60,32 @@ bunx @every-env/compound-plugin install compound-engineering --to qwen
60
60
  bunx @every-env/compound-plugin install compound-engineering --to all
61
61
  ```
62
62
 
63
- Local dev:
63
+ ### Local Development
64
+
65
+ When developing and testing local changes to the plugin:
66
+
67
+ **Claude Code** — add a shell alias so your local copy loads alongside your normal plugins:
68
+
69
+ ```bash
70
+ # add to ~/.zshrc or ~/.bashrc
71
+ alias claude-dev-ce='claude --plugin-dir ~/code/compound-engineering-plugin/plugins/compound-engineering'
72
+ ```
73
+
74
+ One-liner to append it:
75
+
76
+ ```bash
77
+ echo "alias claude-dev-ce='claude --plugin-dir ~/code/compound-engineering-plugin/plugins/compound-engineering'" >> ~/.zshrc
78
+ ```
79
+
80
+ Then run `claude-dev-ce` instead of `claude` to test your changes. Your production install stays untouched.
81
+
82
+ **Codex** — point the install command at your local path:
83
+
84
+ ```bash
85
+ bunx @every-env/compound-plugin install ./plugins/compound-engineering --to codex
86
+ ```
87
+
88
+ **Other targets** — same pattern, swap the target:
64
89
 
65
90
  ```bash
66
91
  bun run src/index.ts install ./plugins/compound-engineering --to opencode
@@ -17,20 +17,18 @@ This document applies to the embedded marketplace plugin metadata, not the root
17
17
 
18
18
  ## Solution
19
19
 
20
- **Every change to the plugin MUST include:**
20
+ **Routine PRs should not cut plugin releases.**
21
21
 
22
- 1. **Version bump in `plugin.json`**
23
- - Follow semantic versioning (semver)
24
- - MAJOR: Breaking changes or major reorganization
25
- - MINOR: New agents, commands, or skills added
26
- - PATCH: Bug fixes, documentation updates, minor improvements
22
+ The embedded plugin version is release-owned metadata. The maintainer uses a local slash command to choose the next version and generate release changelog entries after deciding which merged changes ship together. Because multiple PRs may merge before release, contributors should not guess release versions inside individual PRs.
27
23
 
28
- 2. **CHANGELOG.md update**
29
- - Add entry under `## [Unreleased]` or new version section
30
- - Use Keep a Changelog format
31
- - Categories: Added, Changed, Deprecated, Removed, Fixed, Security
24
+ Contributors should:
32
25
 
33
- 3. **README.md verification**
26
+ 1. **Avoid release bookkeeping in normal PRs**
27
+ - Do not manually bump `.claude-plugin/plugin.json`
28
+ - Do not manually bump `.claude-plugin/marketplace.json`
29
+ - Do not cut release sections in `CHANGELOG.md`
30
+
31
+ 2. **Keep substantive docs accurate**
34
32
  - Verify component counts match actual files
35
33
  - Verify agent/command/skill tables are accurate
36
34
  - Update descriptions if functionality changed
@@ -40,8 +38,9 @@ This document applies to the embedded marketplace plugin metadata, not the root
40
38
  ```markdown
41
39
  Before committing changes to compound-engineering plugin:
42
40
 
43
- - [ ] Version bumped in `.claude-plugin/plugin.json`
44
- - [ ] CHANGELOG.md updated with changes
41
+ - [ ] No manual version bump in `.claude-plugin/plugin.json`
42
+ - [ ] No manual version bump in `.claude-plugin/marketplace.json`
43
+ - [ ] No manual release section added to `CHANGELOG.md`
45
44
  - [ ] README.md component counts verified
46
45
  - [ ] README.md tables updated (if adding/removing/renaming)
47
46
  - [ ] plugin.json description updated (if component counts changed)
@@ -49,8 +48,8 @@ Before committing changes to compound-engineering plugin:
49
48
 
50
49
  ## File Locations
51
50
 
52
- - Version: `.claude-plugin/plugin.json` `"version": "X.Y.Z"`
53
- - Changelog: `CHANGELOG.md`
51
+ - Version is release-owned: `.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`
52
+ - Changelog release sections are release-owned: `CHANGELOG.md`
54
53
  - Readme: `README.md`
55
54
 
56
55
  ## Example Workflow
@@ -58,11 +57,10 @@ Before committing changes to compound-engineering plugin:
58
57
  When adding a new agent:
59
58
 
60
59
  1. Create the agent file in `agents/[category]/`
61
- 2. Bump version in `plugin.json` (minor version for new agent)
62
- 3. Add to CHANGELOG under `### Added`
63
- 4. Add row to README agent table
64
- 5. Update README component count
65
- 6. Update plugin.json description with new counts
60
+ 2. Update README agent table
61
+ 3. Update README component count
62
+ 4. Update plugin metadata description with new counts if needed
63
+ 5. Leave version selection and release changelog generation to the maintainer's release command
66
64
 
67
65
  ## Prevention
68
66
 
@@ -70,7 +68,7 @@ This documentation serves as a reminder. When Claude Code works on this plugin,
70
68
 
71
69
  1. Check this doc before committing changes
72
70
  2. Follow the checklist above
73
- 3. Never commit partial updates (all three files must be updated together)
71
+ 3. Do not guess release versions in feature PRs
74
72
 
75
73
  ## Related Files
76
74
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@every-env/compound-plugin",
3
- "version": "2.36.3",
3
+ "version": "2.36.5",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "compound-engineering",
3
3
  "version": "2.40.0",
4
- "description": "AI-powered development tools. 28 agents, 47 skills, 1 MCP server for code review, research, design, and workflow automation.",
4
+ "description": "AI-powered development tools. 28 agents, 46 skills, 1 MCP server for code review, research, design, and workflow automation.",
5
5
  "author": {
6
6
  "name": "Kieran Klaassen",
7
7
  "email": "kieran@every.to",
@@ -2,24 +2,24 @@
2
2
 
3
3
  ## Versioning Requirements
4
4
 
5
- **IMPORTANT**: Every change to this plugin MUST include updates to all three files:
5
+ **IMPORTANT**: Routine PRs should not cut releases for this plugin.
6
6
 
7
- 1. **`.claude-plugin/plugin.json`** - Bump version using semver
8
- 2. **`CHANGELOG.md`** - Document changes using Keep a Changelog format
9
- 3. **`README.md`** - Verify/update component counts and tables
7
+ The repo uses an automatied release process to prepare plugin releases, including version selection and changelog generation. Because multiple PRs may merge before the next release, contributors cannot know the final released version from within an individual PR.
10
8
 
11
- ### Version Bumping Rules
9
+ ### Contributor Rules
12
10
 
13
- - **MAJOR** (1.0.0 2.0.0): Breaking changes, major reorganization
14
- - **MINOR** (1.0.0 1.1.0): New agents, commands, or skills
15
- - **PATCH** (1.0.0 1.0.1): Bug fixes, doc updates, minor improvements
11
+ - Do **not** manually bump `.claude-plugin/plugin.json` version in a normal feature PR.
12
+ - Do **not** manually bump `.claude-plugin/marketplace.json` plugin version in a normal feature PR.
13
+ - Do **not** cut a release section in `CHANGELOG.md` for a normal feature PR.
14
+ - Do update substantive docs that are part of the actual change, such as `README.md`, component tables, usage instructions, or counts when they would otherwise become inaccurate.
16
15
 
17
16
  ### Pre-Commit Checklist
18
17
 
19
18
  Before committing ANY changes:
20
19
 
21
- - [ ] Version bumped in `.claude-plugin/plugin.json`
22
- - [ ] CHANGELOG.md updated with changes
20
+ - [ ] No manual release-version bump in `.claude-plugin/plugin.json`
21
+ - [ ] No manual release-version bump in `.claude-plugin/marketplace.json`
22
+ - [ ] No manual release entry added to `CHANGELOG.md`
23
23
  - [ ] README.md component counts verified
24
24
  - [ ] README.md tables accurate (agents, commands, skills)
25
25
  - [ ] plugin.json description matches current counts
@@ -124,7 +124,7 @@ Core workflow commands use `ce:` prefix to unambiguously identify them as compou
124
124
  | `dhh-rails-style` | Write Ruby/Rails code in DHH's 37signals style |
125
125
  | `dspy-ruby` | Build type-safe LLM applications with DSPy.rb |
126
126
  | `frontend-design` | Create production-grade frontend interfaces |
127
- | `skill-creator` | Guide for creating effective Claude Code skills |
127
+
128
128
 
129
129
  ### Content & Workflow
130
130
 
@@ -41,7 +41,7 @@ Use **AskUserQuestion tool** to suggest: "Your requirements seem detailed enough
41
41
 
42
42
  Run a quick repo scan to understand existing patterns:
43
43
 
44
- - Task repo-research-analyst("Understand existing patterns related to: <feature_description>")
44
+ - Task compound-engineering:research:repo-research-analyst("Understand existing patterns related to: <feature_description>")
45
45
 
46
46
  Focus on: similar features, established patterns, CLAUDE.md guidance.
47
47
 
@@ -82,8 +82,8 @@ First, I need to understand the project's conventions, existing patterns, and an
82
82
 
83
83
  Run these agents **in parallel** to gather local context:
84
84
 
85
- - Task repo-research-analyst(feature_description)
86
- - Task learnings-researcher(feature_description)
85
+ - Task compound-engineering:research:repo-research-analyst(feature_description)
86
+ - Task compound-engineering:research:learnings-researcher(feature_description)
87
87
 
88
88
  **What to look for:**
89
89
  - **Repo research:** existing patterns, CLAUDE.md guidance, technology familiarity, pattern consistency
@@ -113,8 +113,8 @@ Examples:
113
113
 
114
114
  Run these agents in parallel:
115
115
 
116
- - Task best-practices-researcher(feature_description)
117
- - Task framework-docs-researcher(feature_description)
116
+ - Task compound-engineering:research:best-practices-researcher(feature_description)
117
+ - Task compound-engineering:research:framework-docs-researcher(feature_description)
118
118
 
119
119
  ### 1.6. Consolidate Research
120
120
 
@@ -109,8 +109,8 @@ For each agent in review_agents:
109
109
  ```
110
110
 
111
111
  Always run these last regardless of mode:
112
- - Task agent-native-reviewer(PR content) - Verify new features are agent-accessible
113
- - Task learnings-researcher(PR content) - Search docs/solutions/ for past issues related to this PR's modules and patterns
112
+ - Task compound-engineering:review:agent-native-reviewer(PR content) - Verify new features are agent-accessible
113
+ - Task compound-engineering:research:learnings-researcher(PR content) - Search docs/solutions/ for past issues related to this PR's modules and patterns
114
114
 
115
115
  </parallel_tasks>
116
116
 
@@ -122,9 +122,9 @@ These agents are run ONLY when the PR matches specific criteria. Check the PR fi
122
122
 
123
123
  **MIGRATIONS: If PR contains database migrations, schema.rb, or data backfills:**
124
124
 
125
- - Task schema-drift-detector(PR content) - Detects unrelated schema.rb changes by cross-referencing against included migrations (run FIRST)
126
- - Task data-migration-expert(PR content) - Validates ID mappings match production, checks for swapped values, verifies rollback safety
127
- - Task deployment-verification-agent(PR content) - Creates Go/No-Go deployment checklist with SQL verification queries
125
+ - Task compound-engineering:review:schema-drift-detector(PR content) - Detects unrelated schema.rb changes by cross-referencing against included migrations (run FIRST)
126
+ - Task compound-engineering:review:data-migration-expert(PR content) - Validates ID mappings match production, checks for swapped values, verifies rollback safety
127
+ - Task compound-engineering:review:deployment-verification-agent(PR content) - Creates Go/No-Go deployment checklist with SQL verification queries
128
128
 
129
129
  **When to run:**
130
130
  - PR includes files matching `db/migrate/*.rb` or `db/schema.rb`
@@ -236,7 +236,7 @@ Complete system context map with component interactions
236
236
 
237
237
  ### 4. Simplification and Minimalism Review
238
238
 
239
- Run the Task code-simplicity-reviewer() to see if we can simplify the code.
239
+ Run the Task compound-engineering:review:code-simplicity-reviewer() to see if we can simplify the code.
240
240
 
241
241
  ### 5. Findings Synthesis and Todo Creation Using file-todos Skill
242
242
 
@@ -97,22 +97,11 @@ Access individual args: `$ARGUMENTS[0]` or shorthand `$0`, `$1`, `$2`.
97
97
 
98
98
  ### Dynamic Context Injection
99
99
 
100
- The `` !`command` `` syntax runs shell commands before content is sent to Claude:
100
+ Skills support dynamic context injection: prefix a backtick-wrapped shell command with an exclamation mark, and the preprocessor executes it at load time, replacing the directive with stdout. Write an exclamation mark immediately before the opening backtick of the command you want executed (for example, to inject the current git branch, write the exclamation mark followed by `git branch --show-current` wrapped in backticks).
101
101
 
102
- ```yaml
103
- ---
104
- name: pr-summary
105
- description: Summarize changes in a pull request
106
- context: fork
107
- agent: Explore
108
- ---
109
-
110
- ## Context
111
- - PR diff: !`gh pr diff`
112
- - Changed files: !`gh pr diff --name-only`
102
+ **Important:** The preprocessor scans the entire SKILL.md as plain text — it does not parse markdown. Directives inside fenced code blocks or inline code spans are still executed. If a skill documents this syntax with literal examples, the preprocessor will attempt to run them, causing load failures. To safely document this feature, describe it in prose (as done here) or place examples in a reference file, which is loaded on-demand by Claude and not preprocessed.
113
103
 
114
- Summarize this pull request...
115
- ```
104
+ For a concrete example of dynamic context injection in a skill, see [official-spec.md](references/official-spec.md) § "Dynamic Context Injection".
116
105
 
117
106
  ### Running in a Subagent
118
107
 
@@ -1,210 +0,0 @@
1
- ---
2
- name: skill-creator
3
- description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
4
- license: Complete terms in LICENSE.txt
5
- disable-model-invocation: true
6
- ---
7
-
8
- # Skill Creator
9
-
10
- This skill provides guidance for creating effective skills.
11
-
12
- ## About Skills
13
-
14
- Skills are modular, self-contained packages that extend Claude's capabilities by providing
15
- specialized knowledge, workflows, and tools. Think of them as "onboarding guides" for specific
16
- domains or tasks—they transform Claude from a general-purpose agent into a specialized agent
17
- equipped with procedural knowledge that no model can fully possess.
18
-
19
- ### What Skills Provide
20
-
21
- 1. Specialized workflows - Multi-step procedures for specific domains
22
- 2. Tool integrations - Instructions for working with specific file formats or APIs
23
- 3. Domain expertise - Company-specific knowledge, schemas, business logic
24
- 4. Bundled resources - Scripts, references, and assets for complex and repetitive tasks
25
-
26
- ### Anatomy of a Skill
27
-
28
- Every skill consists of a required SKILL.md file and optional bundled resources:
29
-
30
- ```
31
- skill-name/
32
- ├── SKILL.md (required)
33
- │ ├── YAML frontmatter metadata (required)
34
- │ │ ├── name: (required)
35
- │ │ └── description: (required)
36
- │ └── Markdown instructions (required)
37
- └── Bundled Resources (optional)
38
- ├── scripts/ - Executable code (Python/Bash/etc.)
39
- ├── references/ - Documentation intended to be loaded into context as needed
40
- └── assets/ - Files used in output (templates, icons, fonts, etc.)
41
- ```
42
-
43
- #### SKILL.md (required)
44
-
45
- **Metadata Quality:** The `name` and `description` in YAML frontmatter determine when Claude will use the skill. Be specific about what the skill does and when to use it. Use the third-person (e.g. "This skill should be used when..." instead of "Use this skill when...").
46
-
47
- #### Bundled Resources (optional)
48
-
49
- ##### Scripts (`scripts/`)
50
-
51
- Executable code (Python/Bash/etc.) for tasks that require deterministic reliability or are repeatedly rewritten.
52
-
53
- - **When to include**: When the same code is being rewritten repeatedly or deterministic reliability is needed
54
- - **Example**: `scripts/rotate_pdf.py` for PDF rotation tasks
55
- - **Benefits**: Token efficient, deterministic, may be executed without loading into context
56
- - **Note**: Scripts may still need to be read by Claude for patching or environment-specific adjustments
57
-
58
- ##### References (`references/`)
59
-
60
- Documentation and reference material intended to be loaded as needed into context to inform Claude's process and thinking.
61
-
62
- - **When to include**: For documentation that Claude should reference while working
63
- - **Examples**: `references/finance.md` for financial schemas, `references/mnda.md` for company NDA template, `references/policies.md` for company policies, `references/api_docs.md` for API specifications
64
- - **Use cases**: Database schemas, API documentation, domain knowledge, company policies, detailed workflow guides
65
- - **Benefits**: Keeps SKILL.md lean, loaded only when Claude determines it's needed
66
- - **Best practice**: If files are large (>10k words), include grep search patterns in SKILL.md
67
- - **Avoid duplication**: Information should live in either SKILL.md or references files, not both. Prefer references files for detailed information unless it's truly core to the skill—this keeps SKILL.md lean while making information discoverable without hogging the context window. Keep only essential procedural instructions and workflow guidance in SKILL.md; move detailed reference material, schemas, and examples to references files.
68
-
69
- ##### Assets (`assets/`)
70
-
71
- Files not intended to be loaded into context, but rather used within the output Claude produces.
72
-
73
- - **When to include**: When the skill needs files that will be used in the final output
74
- - **Examples**: `assets/logo.png` for brand assets, `assets/slides.pptx` for PowerPoint templates, `assets/frontend-template/` for HTML/React boilerplate, `assets/font.ttf` for typography
75
- - **Use cases**: Templates, images, icons, boilerplate code, fonts, sample documents that get copied or modified
76
- - **Benefits**: Separates output resources from documentation, enables Claude to use files without loading them into context
77
-
78
- ### Progressive Disclosure Design Principle
79
-
80
- Skills use a three-level loading system to manage context efficiently:
81
-
82
- 1. **Metadata (name + description)** - Always in context (~100 words)
83
- 2. **SKILL.md body** - When skill triggers (<5k words)
84
- 3. **Bundled resources** - As needed by Claude (Unlimited*)
85
-
86
- *Unlimited because scripts can be executed without reading into context window.
87
-
88
- ## Skill Creation Process
89
-
90
- To create a skill, follow the "Skill Creation Process" in order, skipping steps only if there is a clear reason why they are not applicable.
91
-
92
- ### Step 1: Understanding the Skill with Concrete Examples
93
-
94
- Skip this step only when the skill's usage patterns are already clearly understood. It remains valuable even when working with an existing skill.
95
-
96
- To create an effective skill, clearly understand concrete examples of how the skill will be used. This understanding can come from either direct user examples or generated examples that are validated with user feedback.
97
-
98
- For example, when building an image-editor skill, relevant questions include:
99
-
100
- - "What functionality should the image-editor skill support? Editing, rotating, anything else?"
101
- - "Can you give some examples of how this skill would be used?"
102
- - "I can imagine users asking for things like 'Remove the red-eye from this image' or 'Rotate this image'. Are there other ways you imagine this skill being used?"
103
- - "What would a user say that should trigger this skill?"
104
-
105
- To avoid overwhelming users, avoid asking too many questions in a single message. Start with the most important questions and follow up as needed for better effectiveness.
106
-
107
- Conclude this step when there is a clear sense of the functionality the skill should support.
108
-
109
- ### Step 2: Planning the Reusable Skill Contents
110
-
111
- To turn concrete examples into an effective skill, analyze each example by:
112
-
113
- 1. Considering how to execute on the example from scratch
114
- 2. Identifying what scripts, references, and assets would be helpful when executing these workflows repeatedly
115
-
116
- Example: When building a `pdf-editor` skill to handle queries like "Help me rotate this PDF," the analysis shows:
117
-
118
- 1. Rotating a PDF requires re-writing the same code each time
119
- 2. A `scripts/rotate_pdf.py` script would be helpful to store in the skill
120
-
121
- Example: When designing a `frontend-webapp-builder` skill for queries like "Build me a todo app" or "Build me a dashboard to track my steps," the analysis shows:
122
-
123
- 1. Writing a frontend webapp requires the same boilerplate HTML/React each time
124
- 2. An `assets/hello-world/` template containing the boilerplate HTML/React project files would be helpful to store in the skill
125
-
126
- Example: When building a `big-query` skill to handle queries like "How many users have logged in today?" the analysis shows:
127
-
128
- 1. Querying BigQuery requires re-discovering the table schemas and relationships each time
129
- 2. A `references/schema.md` file documenting the table schemas would be helpful to store in the skill
130
-
131
- To establish the skill's contents, analyze each concrete example to create a list of the reusable resources to include: scripts, references, and assets.
132
-
133
- ### Step 3: Initializing the Skill
134
-
135
- At this point, it is time to actually create the skill.
136
-
137
- Skip this step only if the skill being developed already exists, and iteration or packaging is needed. In this case, continue to the next step.
138
-
139
- When creating a new skill from scratch, always run the `init_skill.py` script. The script conveniently generates a new template skill directory that automatically includes everything a skill requires, making the skill creation process much more efficient and reliable.
140
-
141
- Usage:
142
-
143
- ```bash
144
- scripts/init_skill.py <skill-name> --path <output-directory>
145
- ```
146
-
147
- The script:
148
-
149
- - Creates the skill directory at the specified path
150
- - Generates a SKILL.md template with proper frontmatter and TODO placeholders
151
- - Creates example resource directories: `scripts/`, `references/`, and `assets/`
152
- - Adds example files in each directory that can be customized or deleted
153
-
154
- After initialization, customize or remove the generated SKILL.md and example files as needed.
155
-
156
- ### Step 4: Edit the Skill
157
-
158
- When editing the (newly-generated or existing) skill, remember that the skill is being created for another instance of Claude to use. Focus on including information that would be beneficial and non-obvious to Claude. Consider what procedural knowledge, domain-specific details, or reusable assets would help another Claude instance execute these tasks more effectively.
159
-
160
- #### Start with Reusable Skill Contents
161
-
162
- To begin implementation, start with the reusable resources identified above: `scripts/`, `references/`, and `assets/` files. Note that this step may require user input. For example, when implementing a `brand-guidelines` skill, the user may need to provide brand assets or templates to store in `assets/`, or documentation to store in `references/`.
163
-
164
- Also, delete any example files and directories not needed for the skill. The initialization script creates example files in `scripts/`, `references/`, and `assets/` to demonstrate structure, but most skills won't need all of them.
165
-
166
- #### Update SKILL.md
167
-
168
- **Writing Style:** Write the entire skill using **imperative/infinitive form** (verb-first instructions), not second person. Use objective, instructional language (e.g., "To accomplish X, do Y" rather than "You should do X" or "If you need to do X"). This maintains consistency and clarity for AI consumption.
169
-
170
- To complete SKILL.md, answer the following questions:
171
-
172
- 1. What is the purpose of the skill, in a few sentences?
173
- 2. When should the skill be used?
174
- 3. In practice, how should Claude use the skill? All reusable skill contents developed above should be referenced so that Claude knows how to use them.
175
-
176
- ### Step 5: Packaging a Skill
177
-
178
- Once the skill is ready, it should be packaged into a distributable zip file that gets shared with the user. The packaging process automatically validates the skill first to ensure it meets all requirements:
179
-
180
- ```bash
181
- scripts/package_skill.py <path/to/skill-folder>
182
- ```
183
-
184
- Optional output directory specification:
185
-
186
- ```bash
187
- scripts/package_skill.py <path/to/skill-folder> ./dist
188
- ```
189
-
190
- The packaging script will:
191
-
192
- 1. **Validate** the skill automatically, checking:
193
- - YAML frontmatter format and required fields
194
- - Skill naming conventions and directory structure
195
- - Description completeness and quality
196
- - File organization and resource references
197
-
198
- 2. **Package** the skill if validation passes, creating a zip file named after the skill (e.g., `my-skill.zip`) that includes all files and maintains the proper directory structure for distribution.
199
-
200
- If validation fails, the script will report the errors and exit without creating a package. Fix any validation errors and run the packaging command again.
201
-
202
- ### Step 6: Iterate
203
-
204
- After testing the skill, users may request improvements. Often this happens right after using the skill, with fresh context of how the skill performed.
205
-
206
- **Iteration workflow:**
207
- 1. Use the skill on real tasks
208
- 2. Notice struggles or inefficiencies
209
- 3. Identify how SKILL.md or bundled resources should be updated
210
- 4. Implement changes and test again
@@ -1,303 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Skill Initializer - Creates a new skill from template
4
-
5
- Usage:
6
- init_skill.py <skill-name> --path <path>
7
-
8
- Examples:
9
- init_skill.py my-new-skill --path skills/public
10
- init_skill.py my-api-helper --path skills/private
11
- init_skill.py custom-skill --path /custom/location
12
- """
13
-
14
- import sys
15
- from pathlib import Path
16
-
17
-
18
- SKILL_TEMPLATE = """---
19
- name: {skill_name}
20
- description: [TODO: Complete and informative explanation of what the skill does and when to use it. Include WHEN to use this skill - specific scenarios, file types, or tasks that trigger it.]
21
- ---
22
-
23
- # {skill_title}
24
-
25
- ## Overview
26
-
27
- [TODO: 1-2 sentences explaining what this skill enables]
28
-
29
- ## Structuring This Skill
30
-
31
- [TODO: Choose the structure that best fits this skill's purpose. Common patterns:
32
-
33
- **1. Workflow-Based** (best for sequential processes)
34
- - Works well when there are clear step-by-step procedures
35
- - Example: DOCX skill with "Workflow Decision Tree" → "Reading" → "Creating" → "Editing"
36
- - Structure: ## Overview → ## Workflow Decision Tree → ## Step 1 → ## Step 2...
37
-
38
- **2. Task-Based** (best for tool collections)
39
- - Works well when the skill offers different operations/capabilities
40
- - Example: PDF skill with "Quick Start" → "Merge PDFs" → "Split PDFs" → "Extract Text"
41
- - Structure: ## Overview → ## Quick Start → ## Task Category 1 → ## Task Category 2...
42
-
43
- **3. Reference/Guidelines** (best for standards or specifications)
44
- - Works well for brand guidelines, coding standards, or requirements
45
- - Example: Brand styling with "Brand Guidelines" → "Colors" → "Typography" → "Features"
46
- - Structure: ## Overview → ## Guidelines → ## Specifications → ## Usage...
47
-
48
- **4. Capabilities-Based** (best for integrated systems)
49
- - Works well when the skill provides multiple interrelated features
50
- - Example: Product Management with "Core Capabilities" → numbered capability list
51
- - Structure: ## Overview → ## Core Capabilities → ### 1. Feature → ### 2. Feature...
52
-
53
- Patterns can be mixed and matched as needed. Most skills combine patterns (e.g., start with task-based, add workflow for complex operations).
54
-
55
- Delete this entire "Structuring This Skill" section when done - it's just guidance.]
56
-
57
- ## [TODO: Replace with the first main section based on chosen structure]
58
-
59
- [TODO: Add content here. See examples in existing skills:
60
- - Code samples for technical skills
61
- - Decision trees for complex workflows
62
- - Concrete examples with realistic user requests
63
- - References to scripts/templates/references as needed]
64
-
65
- ## Resources
66
-
67
- This skill includes example resource directories that demonstrate how to organize different types of bundled resources:
68
-
69
- ### scripts/
70
- Executable code (Python/Bash/etc.) that can be run directly to perform specific operations.
71
-
72
- **Examples from other skills:**
73
- - PDF skill: `fill_fillable_fields.py`, `extract_form_field_info.py` - utilities for PDF manipulation
74
- - DOCX skill: `document.py`, `utilities.py` - Python modules for document processing
75
-
76
- **Appropriate for:** Python scripts, shell scripts, or any executable code that performs automation, data processing, or specific operations.
77
-
78
- **Note:** Scripts may be executed without loading into context, but can still be read by Claude for patching or environment adjustments.
79
-
80
- ### references/
81
- Documentation and reference material intended to be loaded into context to inform Claude's process and thinking.
82
-
83
- **Examples from other skills:**
84
- - Product management: `communication.md`, `context_building.md` - detailed workflow guides
85
- - BigQuery: API reference documentation and query examples
86
- - Finance: Schema documentation, company policies
87
-
88
- **Appropriate for:** In-depth documentation, API references, database schemas, comprehensive guides, or any detailed information that Claude should reference while working.
89
-
90
- ### assets/
91
- Files not intended to be loaded into context, but rather used within the output Claude produces.
92
-
93
- **Examples from other skills:**
94
- - Brand styling: PowerPoint template files (.pptx), logo files
95
- - Frontend builder: HTML/React boilerplate project directories
96
- - Typography: Font files (.ttf, .woff2)
97
-
98
- **Appropriate for:** Templates, boilerplate code, document templates, images, icons, fonts, or any files meant to be copied or used in the final output.
99
-
100
- ---
101
-
102
- **Any unneeded directories can be deleted.** Not every skill requires all three types of resources.
103
- """
104
-
105
- EXAMPLE_SCRIPT = '''#!/usr/bin/env python3
106
- """
107
- Example helper script for {skill_name}
108
-
109
- This is a placeholder script that can be executed directly.
110
- Replace with actual implementation or delete if not needed.
111
-
112
- Example real scripts from other skills:
113
- - pdf/scripts/fill_fillable_fields.py - Fills PDF form fields
114
- - pdf/scripts/convert_pdf_to_images.py - Converts PDF pages to images
115
- """
116
-
117
- def main():
118
- print("This is an example script for {skill_name}")
119
- # TODO: Add actual script logic here
120
- # This could be data processing, file conversion, API calls, etc.
121
-
122
- if __name__ == "__main__":
123
- main()
124
- '''
125
-
126
- EXAMPLE_REFERENCE = """# Reference Documentation for {skill_title}
127
-
128
- This is a placeholder for detailed reference documentation.
129
- Replace with actual reference content or delete if not needed.
130
-
131
- Example real reference docs from other skills:
132
- - product-management/references/communication.md - Comprehensive guide for status updates
133
- - product-management/references/context_building.md - Deep-dive on gathering context
134
- - bigquery/references/ - API references and query examples
135
-
136
- ## When Reference Docs Are Useful
137
-
138
- Reference docs are ideal for:
139
- - Comprehensive API documentation
140
- - Detailed workflow guides
141
- - Complex multi-step processes
142
- - Information too lengthy for main SKILL.md
143
- - Content that's only needed for specific use cases
144
-
145
- ## Structure Suggestions
146
-
147
- ### API Reference Example
148
- - Overview
149
- - Authentication
150
- - Endpoints with examples
151
- - Error codes
152
- - Rate limits
153
-
154
- ### Workflow Guide Example
155
- - Prerequisites
156
- - Step-by-step instructions
157
- - Common patterns
158
- - Troubleshooting
159
- - Best practices
160
- """
161
-
162
- EXAMPLE_ASSET = """# Example Asset File
163
-
164
- This placeholder represents where asset files would be stored.
165
- Replace with actual asset files (templates, images, fonts, etc.) or delete if not needed.
166
-
167
- Asset files are NOT intended to be loaded into context, but rather used within
168
- the output Claude produces.
169
-
170
- Example asset files from other skills:
171
- - Brand guidelines: logo.png, slides_template.pptx
172
- - Frontend builder: hello-world/ directory with HTML/React boilerplate
173
- - Typography: custom-font.ttf, font-family.woff2
174
- - Data: sample_data.csv, test_dataset.json
175
-
176
- ## Common Asset Types
177
-
178
- - Templates: .pptx, .docx, boilerplate directories
179
- - Images: .png, .jpg, .svg, .gif
180
- - Fonts: .ttf, .otf, .woff, .woff2
181
- - Boilerplate code: Project directories, starter files
182
- - Icons: .ico, .svg
183
- - Data files: .csv, .json, .xml, .yaml
184
-
185
- Note: This is a text placeholder. Actual assets can be any file type.
186
- """
187
-
188
-
189
- def title_case_skill_name(skill_name):
190
- """Convert hyphenated skill name to Title Case for display."""
191
- return ' '.join(word.capitalize() for word in skill_name.split('-'))
192
-
193
-
194
- def init_skill(skill_name, path):
195
- """
196
- Initialize a new skill directory with template SKILL.md.
197
-
198
- Args:
199
- skill_name: Name of the skill
200
- path: Path where the skill directory should be created
201
-
202
- Returns:
203
- Path to created skill directory, or None if error
204
- """
205
- # Determine skill directory path
206
- skill_dir = Path(path).resolve() / skill_name
207
-
208
- # Check if directory already exists
209
- if skill_dir.exists():
210
- print(f"❌ Error: Skill directory already exists: {skill_dir}")
211
- return None
212
-
213
- # Create skill directory
214
- try:
215
- skill_dir.mkdir(parents=True, exist_ok=False)
216
- print(f"✅ Created skill directory: {skill_dir}")
217
- except Exception as e:
218
- print(f"❌ Error creating directory: {e}")
219
- return None
220
-
221
- # Create SKILL.md from template
222
- skill_title = title_case_skill_name(skill_name)
223
- skill_content = SKILL_TEMPLATE.format(
224
- skill_name=skill_name,
225
- skill_title=skill_title
226
- )
227
-
228
- skill_md_path = skill_dir / 'SKILL.md'
229
- try:
230
- skill_md_path.write_text(skill_content)
231
- print("✅ Created SKILL.md")
232
- except Exception as e:
233
- print(f"❌ Error creating SKILL.md: {e}")
234
- return None
235
-
236
- # Create resource directories with example files
237
- try:
238
- # Create scripts/ directory with example script
239
- scripts_dir = skill_dir / 'scripts'
240
- scripts_dir.mkdir(exist_ok=True)
241
- example_script = scripts_dir / 'example.py'
242
- example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
243
- example_script.chmod(0o755)
244
- print("✅ Created scripts/example.py")
245
-
246
- # Create references/ directory with example reference doc
247
- references_dir = skill_dir / 'references'
248
- references_dir.mkdir(exist_ok=True)
249
- example_reference = references_dir / 'api_reference.md'
250
- example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
251
- print("✅ Created references/api_reference.md")
252
-
253
- # Create assets/ directory with example asset placeholder
254
- assets_dir = skill_dir / 'assets'
255
- assets_dir.mkdir(exist_ok=True)
256
- example_asset = assets_dir / 'example_asset.txt'
257
- example_asset.write_text(EXAMPLE_ASSET)
258
- print("✅ Created assets/example_asset.txt")
259
- except Exception as e:
260
- print(f"❌ Error creating resource directories: {e}")
261
- return None
262
-
263
- # Print next steps
264
- print(f"\n✅ Skill '{skill_name}' initialized successfully at {skill_dir}")
265
- print("\nNext steps:")
266
- print("1. Edit SKILL.md to complete the TODO items and update the description")
267
- print("2. Customize or delete the example files in scripts/, references/, and assets/")
268
- print("3. Run the validator when ready to check the skill structure")
269
-
270
- return skill_dir
271
-
272
-
273
- def main():
274
- if len(sys.argv) < 4 or sys.argv[2] != '--path':
275
- print("Usage: init_skill.py <skill-name> --path <path>")
276
- print("\nSkill name requirements:")
277
- print(" - Hyphen-case identifier (e.g., 'data-analyzer')")
278
- print(" - Lowercase letters, digits, and hyphens only")
279
- print(" - Max 40 characters")
280
- print(" - Must match directory name exactly")
281
- print("\nExamples:")
282
- print(" init_skill.py my-new-skill --path skills/public")
283
- print(" init_skill.py my-api-helper --path skills/private")
284
- print(" init_skill.py custom-skill --path /custom/location")
285
- sys.exit(1)
286
-
287
- skill_name = sys.argv[1]
288
- path = sys.argv[3]
289
-
290
- print(f"🚀 Initializing skill: {skill_name}")
291
- print(f" Location: {path}")
292
- print()
293
-
294
- result = init_skill(skill_name, path)
295
-
296
- if result:
297
- sys.exit(0)
298
- else:
299
- sys.exit(1)
300
-
301
-
302
- if __name__ == "__main__":
303
- main()
@@ -1,110 +0,0 @@
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 sys
14
- import zipfile
15
- from pathlib import Path
16
- from quick_validate import validate_skill
17
-
18
-
19
- def package_skill(skill_path, output_dir=None):
20
- """
21
- Package a skill folder into a zip file.
22
-
23
- Args:
24
- skill_path: Path to the skill folder
25
- output_dir: Optional output directory for the zip file (defaults to current directory)
26
-
27
- Returns:
28
- Path to the created zip file, or None if error
29
- """
30
- skill_path = Path(skill_path).resolve()
31
-
32
- # Validate skill folder exists
33
- if not skill_path.exists():
34
- print(f"❌ Error: Skill folder not found: {skill_path}")
35
- return None
36
-
37
- if not skill_path.is_dir():
38
- print(f"❌ Error: Path is not a directory: {skill_path}")
39
- return None
40
-
41
- # Validate SKILL.md exists
42
- skill_md = skill_path / "SKILL.md"
43
- if not skill_md.exists():
44
- print(f"❌ Error: SKILL.md not found in {skill_path}")
45
- return None
46
-
47
- # Run validation before packaging
48
- print("🔍 Validating skill...")
49
- valid, message = validate_skill(skill_path)
50
- if not valid:
51
- print(f"❌ Validation failed: {message}")
52
- print(" Please fix the validation errors before packaging.")
53
- return None
54
- print(f"✅ {message}\n")
55
-
56
- # Determine output location
57
- skill_name = skill_path.name
58
- if output_dir:
59
- output_path = Path(output_dir).resolve()
60
- output_path.mkdir(parents=True, exist_ok=True)
61
- else:
62
- output_path = Path.cwd()
63
-
64
- zip_filename = output_path / f"{skill_name}.zip"
65
-
66
- # Create the zip file
67
- try:
68
- with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
69
- # Walk through the skill directory
70
- for file_path in skill_path.rglob('*'):
71
- if file_path.is_file():
72
- # Calculate the relative path within the zip
73
- arcname = file_path.relative_to(skill_path.parent)
74
- zipf.write(file_path, arcname)
75
- print(f" Added: {arcname}")
76
-
77
- print(f"\n✅ Successfully packaged skill to: {zip_filename}")
78
- return zip_filename
79
-
80
- except Exception as e:
81
- print(f"❌ Error creating zip file: {e}")
82
- return None
83
-
84
-
85
- def main():
86
- if len(sys.argv) < 2:
87
- print("Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]")
88
- print("\nExample:")
89
- print(" python utils/package_skill.py skills/public/my-skill")
90
- print(" python utils/package_skill.py skills/public/my-skill ./dist")
91
- sys.exit(1)
92
-
93
- skill_path = sys.argv[1]
94
- output_dir = sys.argv[2] if len(sys.argv) > 2 else None
95
-
96
- print(f"📦 Packaging skill: {skill_path}")
97
- if output_dir:
98
- print(f" Output directory: {output_dir}")
99
- print()
100
-
101
- result = package_skill(skill_path, output_dir)
102
-
103
- if result:
104
- sys.exit(0)
105
- else:
106
- sys.exit(1)
107
-
108
-
109
- if __name__ == "__main__":
110
- main()
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Quick validation script for skills - minimal version
4
- """
5
-
6
- import sys
7
- import os
8
- import re
9
- from pathlib import Path
10
-
11
- def validate_skill(skill_path):
12
- """Basic validation of a skill"""
13
- skill_path = Path(skill_path)
14
-
15
- # Check SKILL.md exists
16
- skill_md = skill_path / 'SKILL.md'
17
- if not skill_md.exists():
18
- return False, "SKILL.md not found"
19
-
20
- # Read and validate frontmatter
21
- content = skill_md.read_text()
22
- if not content.startswith('---'):
23
- return False, "No YAML frontmatter found"
24
-
25
- # Extract frontmatter
26
- match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
27
- if not match:
28
- return False, "Invalid frontmatter format"
29
-
30
- frontmatter = match.group(1)
31
-
32
- # Check required fields
33
- if 'name:' not in frontmatter:
34
- return False, "Missing 'name' in frontmatter"
35
- if 'description:' not in frontmatter:
36
- return False, "Missing 'description' in frontmatter"
37
-
38
- # Extract name for validation
39
- name_match = re.search(r'name:\s*(.+)', frontmatter)
40
- if name_match:
41
- name = name_match.group(1).strip()
42
- # Check naming convention (hyphen-case: lowercase with hyphens)
43
- if not re.match(r'^[a-z0-9-]+$', name):
44
- return False, f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)"
45
- if name.startswith('-') or name.endswith('-') or '--' in name:
46
- return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens"
47
-
48
- # Extract and validate description
49
- desc_match = re.search(r'description:\s*(.+)', frontmatter)
50
- if desc_match:
51
- description = desc_match.group(1).strip()
52
- # Check for angle brackets
53
- if '<' in description or '>' in description:
54
- return False, "Description cannot contain angle brackets (< or >)"
55
-
56
- return True, "Skill is valid!"
57
-
58
- if __name__ == "__main__":
59
- if len(sys.argv) != 2:
60
- print("Usage: python quick_validate.py <skill_directory>")
61
- sys.exit(1)
62
-
63
- valid, message = validate_skill(sys.argv[1])
64
- print(message)
65
- sys.exit(0 if valid else 1)