happyskills 0.7.0 → 0.7.2

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,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.2] - 2026-03-06
11
+
12
+ ### Fixed
13
+ - Fix `setup` command pointing to the old `happyskillsai/happyskills-cli` skill name; it now installs `happyskillsai/happyskills`
14
+
15
+ ## [0.7.1] - 2026-03-06
16
+
17
+ ### Fixed
18
+ - Fix `uninstall` incorrectly orphaning all user-installed skills — `find_orphans` now treats `__root__` as a protected requester, so only skills that were installed solely as transitive dependencies are pruned
19
+
10
20
  ## [0.7.0] - 2026-03-06
11
21
 
12
22
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happyskills",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
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)",
@@ -5,13 +5,13 @@ const { print_success, print_info, print_help, print_hint, print_json, code } =
5
5
  const { exit_with_error } = require('../utils/errors')
6
6
  const { EXIT_CODES } = require('../constants')
7
7
 
8
- const SKILL_NAME = 'happyskillsai/happyskills-cli'
8
+ const SKILL_NAME = 'happyskillsai/happyskills'
9
9
 
10
10
  const HELP_TEXT = `Usage: happyskills setup [options]
11
11
 
12
12
  Install (or update) the official HappySkills CLI skill.
13
13
 
14
- Installs happyskillsai/happyskills-cli into .claude/skills/ so AI agents
14
+ Installs happyskillsai/happyskills into .claude/skills/ so AI agents
15
15
  (Claude Code, etc.) can interact with HappySkills using natural language.
16
16
 
17
17
  Options:
@@ -9,11 +9,8 @@ const find_orphans = (skills, removed_skill) => {
9
9
  const orphans = []
10
10
  for (const [name, data] of Object.entries(skills)) {
11
11
  if (name === removed_skill) continue
12
- if (!data.requested_by || data.requested_by.length === 0) {
13
- orphans.push(name)
14
- continue
15
- }
16
- const remaining = data.requested_by.filter(r => r !== removed_skill && skills[r])
12
+ const requested_by = data.requested_by || []
13
+ const remaining = requested_by.filter(r => r === '__root__' || (r !== removed_skill && skills[r]))
17
14
  if (remaining.length === 0) {
18
15
  orphans.push(name)
19
16
  }
@@ -87,12 +87,12 @@ describe('find_orphans', () => {
87
87
  assert.ok(result.includes('acme/auth'))
88
88
  })
89
89
 
90
- it('treats __root__ like any other requester (not in skills map)', () => {
90
+ it('protects skills installed by the user (requested_by includes __root__)', () => {
91
91
  const skills = {
92
92
  'acme/deploy': { requested_by: ['__root__'] }
93
93
  }
94
- // __root__ is not a key in skills, so deploy is considered orphaned
94
+ // __root__ marks a user-installed (root) package should never be orphaned
95
95
  const result = find_orphans(skills, 'acme/other')
96
- assert.ok(result.includes('acme/deploy'))
96
+ assert.ok(!result.includes('acme/deploy'))
97
97
  })
98
98
  })
@@ -418,7 +418,7 @@ describe('CLI — setup command', () => {
418
418
  it('setup --help exits 0 and describes the command', () => {
419
419
  const { stdout, code } = run(['setup', '--help'])
420
420
  assert.strictEqual(code, 0)
421
- assert.match(stdout, /happyskillsai\/happyskills-cli/)
421
+ assert.match(stdout, /happyskillsai\/happyskills/)
422
422
  assert.match(stdout, /Options:/)
423
423
  assert.match(stdout, /Examples:/)
424
424
  })