happyskills 0.52.0 → 0.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.52.1] - 2026-05-25
11
+
12
+ ### Fixed
13
+
14
+ - **`release` now validates kits against the kit contract (README.md) instead of the skill contract** (`cli/src/commands/release.js`). `run_validation()` was calling `validate_skill_md(dir, basename, null)` — hard-coding the third argument to `null` instead of reading the `type` from `skill.json`. For kit repos this meant the skill branch fired even though the kit had no `SKILL.md`, so `release` failed with `"SKILL.md not found"` immediately after CLI v0.52.0 moved kits to `README.md`. Discovered while migrating `nicolasdao/_kit-doc-essentials` from the old to the new format. Now reads `manifest.type` from `skill.json` first and passes it through to both `validate_skill_md` and `validate_cross`. The standalone `validate` command was unaffected — it was already wiring `skill_type` through correctly.
15
+
10
16
  ## [0.52.0] - 2026-05-25
11
17
 
12
18
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happyskills",
3
- "version": "0.52.0",
3
+ "version": "0.52.1",
4
4
  "description": "Package manager for AI agent skills",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Nicolas Dao <nic@cloudlesslabs.com> (https://cloudlesslabs.com)",
@@ -122,11 +122,14 @@ const compute_bump = (base_version, bump) => {
122
122
  }
123
123
 
124
124
  const run_validation = (dir, skill_name) => catch_errors('Validation failed', async () => {
125
- const [md_err, md_data] = await validate_skill_md(dir, path.basename(dir), null)
126
- if (md_err) throw md_err
125
+ // Read skill.json first so we know whether to validate against the skill
126
+ // (SKILL.md + frontmatter) or kit (README.md, no frontmatter) contract.
127
127
  const [json_err, json_data] = await validate_skill_json(dir)
128
128
  if (json_err) throw json_err
129
- const [cross_err, cross_results] = await validate_cross(dir, md_data.frontmatter, json_data.manifest, md_data.content, json_data.manifest?.type)
129
+ const skill_type = json_data.manifest?.type
130
+ const [md_err, md_data] = await validate_skill_md(dir, path.basename(dir), skill_type)
131
+ if (md_err) throw md_err
132
+ const [cross_err, cross_results] = await validate_cross(dir, md_data.frontmatter, json_data.manifest, md_data.content, skill_type)
130
133
  if (cross_err) throw cross_err
131
134
  const [marker_err, marker_results] = await validate_no_conflict_markers(dir)
132
135
  if (marker_err) throw marker_err