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
package/src/commands/setup.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
13
|
-
|
|
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('
|
|
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__
|
|
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
|
|
421
|
+
assert.match(stdout, /happyskillsai\/happyskills/)
|
|
422
422
|
assert.match(stdout, /Options:/)
|
|
423
423
|
assert.match(stdout, /Examples:/)
|
|
424
424
|
})
|