@skilly-hand/skilly-hand 0.26.7 → 0.28.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.
package/CHANGELOG.md CHANGED
@@ -16,6 +16,36 @@ All notable changes to this project are documented in this file.
16
16
  ### Removed
17
17
  - _None._
18
18
 
19
+ ## [0.28.0] - 2026-05-16
20
+ [View on npm](https://www.npmjs.com/package/@skilly-hand/skilly-hand/v/0.28.0)
21
+
22
+ ### Added
23
+ - Added a top-level `skills/` symlink overlay so skills.sh can discover the portable catalog directly from the GitHub repository.
24
+
25
+ ### Changed
26
+ - _None._
27
+
28
+ ### Fixed
29
+ - _None._
30
+
31
+ ### Removed
32
+ - _None._
33
+
34
+ ## [0.27.0] - 2026-05-16
35
+ [View on npm](https://www.npmjs.com/package/@skilly-hand/skilly-hand/v/0.27.0)
36
+
37
+ ### Added
38
+ - _None._
39
+
40
+ ### Changed
41
+ - Added pnpm workspace support alongside npm lockfile validation and refreshed the interactive CLI launcher on direct `@inquirer/prompts`.
42
+
43
+ ### Fixed
44
+ - Kept the review-rangers release gate aligned with the current interactive command discovery checks.
45
+
46
+ ### Removed
47
+ - _None._
48
+
19
49
  ## [0.26.7] - 2026-05-12
20
50
  [View on npm](https://www.npmjs.com/package/@skilly-hand/skilly-hand/v/0.26.7)
21
51
 
package/README.md CHANGED
@@ -39,6 +39,18 @@ npx skilly-hand
39
39
  `npx skilly-hand` opens an interactive prompt workflow when running in a TTY.
40
40
  The guided home supports type-to-filter command discovery and includes a built-in Command Guide.
41
41
 
42
+ ### Install on skills.sh
43
+
44
+ The full skill catalog is also discoverable through the [skills.sh](https://www.skills.sh/) ecosystem:
45
+
46
+ ```bash
47
+ npx skills add Davecelot/skilly-hand --skill '*'
48
+ ```
49
+
50
+ Use `npx skills add Davecelot/skilly-hand --list` to inspect the available skills before installing. The `skills/` directory is a GitHub-facing overlay made of symlinks to `catalog/skills/`; it helps skills.sh discover the catalog without changing the regular `npx skilly-hand` npm package contents or CLI flow.
51
+
52
+ Windows contributors who clone the repo locally should enable symlink support before checkout, for example with `git config --global core.symlinks true`, and may also need Developer Mode or elevated symlink privileges. If the repo was already checked out without symlinks, re-check out or reclone after enabling support.
53
+
42
54
  ---
43
55
 
44
56
  ## Commands
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skilly-hand/skilly-hand",
3
- "version": "0.26.7",
3
+ "version": "0.28.0",
4
4
  "license": "CC-BY-NC-4.0",
5
5
  "type": "module",
6
6
  "repository": {
@@ -28,6 +28,7 @@
28
28
  "engines": {
29
29
  "node": ">=22.0.0"
30
30
  },
31
+ "packageManager": "pnpm@11.1.2",
31
32
  "scripts": {
32
33
  "build": "node ./scripts/build-catalog-index.mjs",
33
34
  "catalog:check": "node ./scripts/check-catalog.mjs",
@@ -53,11 +54,11 @@
53
54
  "detect": "node ./packages/cli/src/bin.js detect",
54
55
  "list": "node ./packages/cli/src/bin.js list",
55
56
  "doctor": "node ./packages/cli/src/bin.js doctor",
56
- "site:dev": "npm run dev -w @skilly-hand/site",
57
- "site:build": "npm run build -w @skilly-hand/site",
58
- "site:preview": "npm run preview -w @skilly-hand/site"
57
+ "site:dev": "pnpm --filter @skilly-hand/site dev",
58
+ "site:build": "pnpm --filter @skilly-hand/site build",
59
+ "site:preview": "pnpm --filter @skilly-hand/site preview"
59
60
  },
60
61
  "dependencies": {
61
- "inquirer": "13.4.1"
62
+ "@inquirer/prompts": "8.4.3"
62
63
  }
63
64
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skilly-hand/catalog",
3
- "version": "0.26.7",
3
+ "version": "0.28.0",
4
4
  "private": true,
5
5
  "type": "module"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skilly-hand/cli",
3
- "version": "0.26.7",
3
+ "version": "0.28.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,4 +1,9 @@
1
- import inquirer from "inquirer";
1
+ import {
2
+ checkbox as checkboxPrompt,
3
+ confirm as confirmPrompt,
4
+ search as searchPrompt,
5
+ select as selectPrompt
6
+ } from "@inquirer/prompts";
2
7
  import { filterCommands, getInteractiveCommands } from "./command-registry.js";
3
8
 
4
9
  function writeBlock(write, title, body) {
@@ -74,21 +79,25 @@ const COMMAND_HINTS = {
74
79
  uninstall: "Tip: run `npx skilly-hand install` anytime to restore managed files."
75
80
  };
76
81
 
82
+ const DEFAULT_PROMPT_FNS = {
83
+ checkbox: checkboxPrompt,
84
+ confirm: confirmPrompt,
85
+ search: searchPrompt,
86
+ select: selectPrompt
87
+ };
88
+
77
89
  export function createInquirerInteractiveUi({
78
- prompt = (questions) => inquirer.prompt(questions),
90
+ promptFns = {},
79
91
  write = (value) => process.stdout.write(value)
80
92
  } = {}) {
93
+ const prompts = { ...DEFAULT_PROMPT_FNS, ...promptFns };
94
+
81
95
  async function confirm({ message, defaultValue = false }) {
82
96
  try {
83
- const response = await prompt([
84
- {
85
- type: "confirm",
86
- name: "confirmed",
87
- message: String(message),
88
- default: defaultValue
89
- }
90
- ]);
91
- return Boolean(response.confirmed);
97
+ return Boolean(await prompts.confirm({
98
+ message: String(message),
99
+ default: defaultValue
100
+ }));
92
101
  } catch (error) {
93
102
  if (error?.name === "ExitPromptError") return false;
94
103
  throw error;
@@ -100,21 +109,17 @@ export function createInquirerInteractiveUi({
100
109
  writeBlock(write, "Guided Home", buildGuidedHomeIntro());
101
110
 
102
111
  while (true) {
103
- const { command } = await prompt([
104
- {
105
- type: "search",
106
- name: "command",
107
- message: `${header}: choose a command`,
108
- source: async (term) =>
109
- filterCommands(commands, term).map((item) => ({
110
- name: commandChoiceName(item),
111
- value: item.value,
112
- description: `${item.bestFor} | aliases: ${(item.aliases || []).join(", ") || "none"}`
113
- })),
114
- default: "install",
115
- pageSize: 10
116
- }
117
- ]);
112
+ const command = await prompts.search({
113
+ message: `${header}: choose a command`,
114
+ source: async (term) =>
115
+ filterCommands(commands, term).map((item) => ({
116
+ name: commandChoiceName(item),
117
+ value: item.value,
118
+ description: `${item.bestFor} | aliases: ${(item.aliases || []).join(", ") || "none"}`
119
+ })),
120
+ default: "install",
121
+ pageSize: 10
122
+ });
118
123
 
119
124
  if (command === "exit") return;
120
125
  if (command === "command-guide") {
@@ -129,27 +134,19 @@ export function createInquirerInteractiveUi({
129
134
 
130
135
  writeBlock(write, "Install Tips", installTipsBlock());
131
136
 
132
- const { selectedSkillIds } = await prompt([
133
- {
134
- type: "checkbox",
135
- name: "selectedSkillIds",
136
- message: "Select skills to install",
137
- choices: skillChoices,
138
- pageSize: 16
139
- }
140
- ]);
137
+ const selectedSkillIds = await prompts.checkbox({
138
+ message: "Select skills to install",
139
+ choices: skillChoices,
140
+ pageSize: 16
141
+ });
141
142
 
142
143
  writeBlock(write, "Assistant Target Tips", agentTipsBlock());
143
144
 
144
- const { selectedAgents } = await prompt([
145
- {
146
- type: "checkbox",
147
- name: "selectedAgents",
148
- message: "Select assistant targets",
149
- choices: agentChoices,
150
- pageSize: 12
151
- }
152
- ]);
145
+ const selectedAgents = await prompts.checkbox({
146
+ message: "Select assistant targets",
147
+ choices: agentChoices,
148
+ pageSize: 12
149
+ });
153
150
 
154
151
  const previewBundle = await actions.previewInstallBundle({
155
152
  selectedSkillIds,
@@ -157,17 +154,13 @@ export function createInquirerInteractiveUi({
157
154
  });
158
155
  writeBlock(write, "Install Preview", previewBundle?.text || "");
159
156
 
160
- const { installDecision } = await prompt([
161
- {
162
- type: "list",
163
- name: "installDecision",
164
- message: "Next action (type 'apply' to install, or 'menu' to go back)",
165
- choices: [
166
- { name: "Apply installation", value: "apply" },
167
- { name: "Back to command menu", value: "menu" }
168
- ]
169
- }
170
- ]);
157
+ const installDecision = await prompts.select({
158
+ message: "Next action (type 'apply' to install, or 'menu' to go back)",
159
+ choices: [
160
+ { name: "Apply installation", value: "apply" },
161
+ { name: "Back to command menu", value: "menu" }
162
+ ]
163
+ });
171
164
 
172
165
  if (installDecision === "apply") {
173
166
  const applyBundle = await actions.applyInstallBundle({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skilly-hand/core",
3
- "version": "0.26.7",
3
+ "version": "0.28.0",
4
4
  "private": true,
5
5
  "type": "module"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skilly-hand/detectors",
3
- "version": "0.26.7",
3
+ "version": "0.28.0",
4
4
  "private": true,
5
5
  "type": "module"
6
6
  }
@@ -1,21 +0,0 @@
1
- [
2
- "accessibility-audit",
3
- "agents-root-orchestrator",
4
- "angular-guidelines",
5
- "figma-mcp-0to1",
6
- "frontend-design",
7
- "gsap-animation",
8
- "motion-animation",
9
- "output-optimizer",
10
- "project-security",
11
- "project-teacher",
12
- "prompt-engineering",
13
- "react-guidelines",
14
- "review-rangers",
15
- "roaster",
16
- "skill-creator",
17
- "spec-driven-development",
18
- "test-driven-development",
19
- "token-optimizer",
20
- "user-story-crafting"
21
- ]