claude-skills-cli 0.0.12 → 0.0.14
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/README.md +57 -39
- package/dist/commands/add-hook.js +147 -38
- package/dist/commands/add-hook.js.map +1 -1
- package/dist/commands/init.js +1 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/core/templates.js +192 -9
- package/dist/core/templates.js.map +1 -1
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/skills/skill-creator/references/cli-reference.md +0 -1
- package/package.json +2 -2
- package/dist/commands/hook-config.js +0 -45
- package/dist/commands/hook-config.js.map +0 -1
- package/dist/commands/watch.js +0 -82
- package/dist/commands/watch.js.map +0 -1
- package/dist/utils/settings.js +0 -110
- package/dist/utils/settings.js.map +0 -1
package/README.md
CHANGED
|
@@ -46,8 +46,8 @@ pnpx claude-skills-cli init --name my-skill --description "Brief description wit
|
|
|
46
46
|
pnpx claude-skills-cli init --name my-skill --description "..." --with-examples
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Creates minimal skill scaffolding by default (SKILL.md,
|
|
50
|
-
|
|
49
|
+
Creates minimal skill scaffolding by default (SKILL.md, references/).
|
|
50
|
+
Use `--with-examples` for example files.
|
|
51
51
|
|
|
52
52
|
### validate
|
|
53
53
|
|
|
@@ -126,15 +126,34 @@ Creates uploadable zip for Claude.ai. Validates first unless
|
|
|
126
126
|
### add-hook
|
|
127
127
|
|
|
128
128
|
```bash
|
|
129
|
-
|
|
130
|
-
pnpx claude-skills-cli add-hook
|
|
131
|
-
|
|
129
|
+
# Default: forced-eval hook (84% success), global scope
|
|
130
|
+
pnpx claude-skills-cli add-hook
|
|
131
|
+
|
|
132
|
+
# Specify hook type and scope
|
|
133
|
+
pnpx claude-skills-cli add-hook --type llm-eval # LLM eval, global
|
|
134
|
+
pnpx claude-skills-cli add-hook --type forced-eval --project # Forced eval, project
|
|
135
|
+
pnpx claude-skills-cli add-hook --type simple-script --local # Simple script, local
|
|
132
136
|
```
|
|
133
137
|
|
|
134
|
-
Adds skill activation hook to improve reliability.
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
+
Adds skill activation hook to improve reliability. Generates hook
|
|
139
|
+
scripts in `.claude/hooks/` and updates settings.json.
|
|
140
|
+
|
|
141
|
+
**Hook Types (--type):**
|
|
142
|
+
|
|
143
|
+
| Type | Success Rate | Description | Notes |
|
|
144
|
+
| --------------- | ------------ | --------------------------- | ---------------------------- |
|
|
145
|
+
| `forced-eval` | **84%** | Mandatory 3-step evaluation | Default, most consistent |
|
|
146
|
+
| `llm-eval` | **80%** | Claude API pre-evaluation | Requires `ANTHROPIC_API_KEY` |
|
|
147
|
+
| `simple-script` | 20% | Basic script file | For reference/debugging |
|
|
148
|
+
| `simple-inline` | 20% | Echo in settings.json | Legacy, backwards compatible |
|
|
149
|
+
|
|
150
|
+
**Scopes:**
|
|
151
|
+
|
|
152
|
+
- **Global** (default): `~/.claude/settings.json` - All projects
|
|
153
|
+
- **Project** (`--project`): `./.claude/settings.json` - Committed,
|
|
154
|
+
team-shared
|
|
155
|
+
- **Local** (`--local`): `./.claude/settings.local.json` - Gitignored,
|
|
156
|
+
personal
|
|
138
157
|
|
|
139
158
|
## Skill Activation in Claude Code
|
|
140
159
|
|
|
@@ -143,50 +162,49 @@ Skills are designed to auto-activate in Claude Code, but in practice,
|
|
|
143
162
|
Despite documentation claiming skills are "model-invoked," Claude
|
|
144
163
|
often bypasses skills unless directly instructed.
|
|
145
164
|
|
|
146
|
-
### The Solution:
|
|
165
|
+
### The Solution: Activation Hooks
|
|
147
166
|
|
|
148
|
-
Use the `add-hook` command to add
|
|
167
|
+
Use the `add-hook` command to add skill activation instructions:
|
|
149
168
|
|
|
150
169
|
```bash
|
|
151
|
-
|
|
170
|
+
# Recommended: forced-eval hook (84% success)
|
|
171
|
+
pnpx claude-skills-cli add-hook
|
|
152
172
|
```
|
|
153
173
|
|
|
154
|
-
|
|
174
|
+
After extensive testing (200+ prompts), two approaches emerged as
|
|
175
|
+
significantly better than basic instructions:
|
|
155
176
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
syntax
|
|
159
|
-
- Scales automatically with new skills (no keyword management needed)
|
|
160
|
-
- Fires on every prompt (~20 tokens/prompt overhead)
|
|
177
|
+
**Forced Eval Hook (84% success)** - Creates a mandatory 3-step
|
|
178
|
+
process:
|
|
161
179
|
|
|
162
|
-
|
|
180
|
+
1. Explicitly evaluate each skill (YES/NO with reasoning)
|
|
181
|
+
2. Activate matching skills using `Skill()` tool
|
|
182
|
+
3. Only then proceed with implementation
|
|
163
183
|
|
|
164
|
-
|
|
165
|
-
skill files instead of _activating_ them. The instruction must be
|
|
166
|
-
direct and unambiguous:
|
|
184
|
+
**LLM Eval Hook (80% success)** - Pre-evaluates skills via Claude API:
|
|
167
185
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
186
|
+
- Costs ~$0.0004 per prompt (0.04 cents)
|
|
187
|
+
- 10% cheaper and 17% faster than forced eval
|
|
188
|
+
- Can miss certain prompt types but "smarter" when it works
|
|
189
|
+
- Requires `ANTHROPIC_API_KEY` environment variable
|
|
172
190
|
|
|
173
|
-
**
|
|
191
|
+
Both approaches are **massively better** than simple instructions (20%
|
|
192
|
+
success rate).
|
|
174
193
|
|
|
175
|
-
|
|
176
|
-
projects
|
|
177
|
-
- **Project** (`--project`): `./.claude/settings.json` - committed to
|
|
178
|
-
git, team-shared
|
|
179
|
-
- **Local** (`--local`): `./.claude/settings.local.json` - gitignored,
|
|
180
|
-
personal
|
|
194
|
+
**Why explicit commitment matters:**
|
|
181
195
|
|
|
182
|
-
|
|
196
|
+
Simple hooks like "If the prompt matches any skill keywords, use
|
|
197
|
+
Skill(skill-name)" are passive suggestions that Claude often ignores.
|
|
198
|
+
The forced-eval hook creates a commitment mechanism - Claude must
|
|
199
|
+
write out its evaluation before proceeding, making it harder to skip
|
|
200
|
+
activation.
|
|
183
201
|
|
|
184
|
-
|
|
185
|
-
brittle at scale (keyword collisions, manual maintenance per skill).
|
|
186
|
-
The simple echo-based instruction hook is more maintainable.
|
|
202
|
+
**Read more:**
|
|
187
203
|
|
|
188
|
-
|
|
189
|
-
|
|
204
|
+
- [How to Make Claude Code Skills Activate Reliably](https://scottspence.com/posts/how-to-make-claude-code-skills-activate-reliably) -
|
|
205
|
+
Full testing methodology and results
|
|
206
|
+
- [Why Claude Code Skills Don't Auto-Activate](https://scottspence.com/posts/claude-code-skills-dont-auto-activate) -
|
|
207
|
+
Original problem analysis
|
|
190
208
|
|
|
191
209
|
## Resources
|
|
192
210
|
|
|
@@ -1,26 +1,72 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
import {
|
|
4
|
+
import { FORCED_EVAL_HOOK_TEMPLATE, LLM_EVAL_HOOK_TEMPLATE, SIMPLE_HOOK_TEMPLATE, } from '../core/templates.js';
|
|
5
|
+
import { ensure_dir, make_executable } from '../utils/fs.js';
|
|
5
6
|
import { error, info, success, warning } from '../utils/output.js';
|
|
6
|
-
const
|
|
7
|
+
const HOOK_TYPES = {
|
|
8
|
+
'simple-inline': {
|
|
9
|
+
name: 'Simple Inline',
|
|
10
|
+
success_rate: '20%',
|
|
11
|
+
description: 'Echo command in settings.json',
|
|
12
|
+
command: "echo 'INSTRUCTION: If the prompt matches any available skill keywords, use Skill(skill-name) to activate it.'",
|
|
13
|
+
script: null,
|
|
14
|
+
},
|
|
15
|
+
'simple-script': {
|
|
16
|
+
name: 'Simple Script',
|
|
17
|
+
success_rate: '20%',
|
|
18
|
+
description: 'Script file with basic instruction',
|
|
19
|
+
command: null,
|
|
20
|
+
script: 'skill-activation-simple.sh',
|
|
21
|
+
template: SIMPLE_HOOK_TEMPLATE,
|
|
22
|
+
},
|
|
23
|
+
'forced-eval': {
|
|
24
|
+
name: 'Forced Evaluation',
|
|
25
|
+
success_rate: '84%',
|
|
26
|
+
description: 'Mandatory 3-step evaluation process',
|
|
27
|
+
command: null,
|
|
28
|
+
script: 'skill-activation-forced-eval.sh',
|
|
29
|
+
template: FORCED_EVAL_HOOK_TEMPLATE,
|
|
30
|
+
},
|
|
31
|
+
'llm-eval': {
|
|
32
|
+
name: 'LLM Evaluation',
|
|
33
|
+
success_rate: '80%',
|
|
34
|
+
description: 'Claude API pre-evaluation (requires ANTHROPIC_API_KEY)',
|
|
35
|
+
command: null,
|
|
36
|
+
script: 'skill-activation-llm-eval.sh',
|
|
37
|
+
template: LLM_EVAL_HOOK_TEMPLATE,
|
|
38
|
+
},
|
|
39
|
+
};
|
|
7
40
|
export function add_hook_command(options = {}) {
|
|
41
|
+
// Default to forced-eval for best performance
|
|
42
|
+
const hook_type = (options.type ||
|
|
43
|
+
'forced-eval');
|
|
44
|
+
if (!HOOK_TYPES[hook_type]) {
|
|
45
|
+
error(`Invalid hook type: ${hook_type}`);
|
|
46
|
+
info('Valid types: simple-inline, simple-script, forced-eval, llm-eval');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const hook_config = HOOK_TYPES[hook_type];
|
|
8
50
|
// Determine which settings file to use
|
|
9
51
|
let settings_path;
|
|
52
|
+
let hooks_dir;
|
|
10
53
|
let scope;
|
|
11
54
|
if (options.local) {
|
|
12
55
|
// Project-specific local (gitignored)
|
|
13
56
|
settings_path = join('.claude', 'settings.local.json');
|
|
57
|
+
hooks_dir = join('.claude', 'hooks');
|
|
14
58
|
scope = 'project-local';
|
|
15
59
|
}
|
|
16
60
|
else if (options.project) {
|
|
17
61
|
// Project-specific shared (committed)
|
|
18
62
|
settings_path = join('.claude', 'settings.json');
|
|
63
|
+
hooks_dir = join('.claude', 'hooks');
|
|
19
64
|
scope = 'project';
|
|
20
65
|
}
|
|
21
66
|
else {
|
|
22
67
|
// Global (default)
|
|
23
68
|
settings_path = join(homedir(), '.claude', 'settings.json');
|
|
69
|
+
hooks_dir = join(homedir(), '.claude', 'hooks');
|
|
24
70
|
scope = 'global';
|
|
25
71
|
}
|
|
26
72
|
let settings = {};
|
|
@@ -35,38 +81,28 @@ export function add_hook_command(options = {}) {
|
|
|
35
81
|
settings.hooks.UserPromptSubmit.length > 0) {
|
|
36
82
|
// Get the first (and should be only) UserPromptSubmit object
|
|
37
83
|
const userPromptSubmit = settings.hooks.UserPromptSubmit[0];
|
|
38
|
-
//
|
|
39
|
-
const
|
|
40
|
-
h.command.includes('
|
|
41
|
-
|
|
84
|
+
// Find existing skill activation hook (check for various patterns)
|
|
85
|
+
const existing_hook = userPromptSubmit.hooks?.find((h) => h.type === 'command' &&
|
|
86
|
+
(h.command.includes('skill-activation') ||
|
|
87
|
+
h.command.includes('skill-forced-eval-hook') ||
|
|
88
|
+
h.command.includes('skill-llm-eval-hook') ||
|
|
89
|
+
h.command.includes('skill-simple-instruction-hook') ||
|
|
90
|
+
h.command.includes('If the prompt matches any available skill keywords')));
|
|
91
|
+
if (existing_hook) {
|
|
42
92
|
warning(`Skill activation hook already exists in ${scope} settings`);
|
|
43
|
-
info(
|
|
44
|
-
|
|
93
|
+
info(`Current hook: ${existing_hook.command}`);
|
|
94
|
+
console.log('');
|
|
95
|
+
if (options.force) {
|
|
96
|
+
info('--force flag provided, replacing existing hook...');
|
|
97
|
+
// Remove the existing hook
|
|
98
|
+
userPromptSubmit.hooks = userPromptSubmit.hooks?.filter((h) => h !== existing_hook);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
info('No changes made.');
|
|
102
|
+
info('To replace, run with --force flag or manually remove the existing hook.');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
45
105
|
}
|
|
46
|
-
// Add to existing hooks array within the first UserPromptSubmit object
|
|
47
|
-
if (!userPromptSubmit.hooks) {
|
|
48
|
-
userPromptSubmit.hooks = [];
|
|
49
|
-
}
|
|
50
|
-
userPromptSubmit.hooks.push({
|
|
51
|
-
type: 'command',
|
|
52
|
-
command: HOOK_COMMAND,
|
|
53
|
-
});
|
|
54
|
-
info(`Adding skill activation hook to existing ${scope} settings...`);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
// Create UserPromptSubmit section
|
|
58
|
-
settings.hooks = settings.hooks || {};
|
|
59
|
-
settings.hooks.UserPromptSubmit = [
|
|
60
|
-
{
|
|
61
|
-
hooks: [
|
|
62
|
-
{
|
|
63
|
-
type: 'command',
|
|
64
|
-
command: HOOK_COMMAND,
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
},
|
|
68
|
-
];
|
|
69
|
-
info(`Adding skill activation hook to ${scope} settings...`);
|
|
70
106
|
}
|
|
71
107
|
}
|
|
72
108
|
catch (err) {
|
|
@@ -74,9 +110,72 @@ export function add_hook_command(options = {}) {
|
|
|
74
110
|
process.exit(1);
|
|
75
111
|
}
|
|
76
112
|
}
|
|
113
|
+
// Determine the command to use
|
|
114
|
+
let hook_command;
|
|
115
|
+
if (hook_config.script) {
|
|
116
|
+
// Script-based hook: create the script file
|
|
117
|
+
const script_path = join(hooks_dir, hook_config.script);
|
|
118
|
+
info(`Creating ${hook_config.name} hook script...`);
|
|
119
|
+
try {
|
|
120
|
+
ensure_dir(hooks_dir);
|
|
121
|
+
// Write the script file
|
|
122
|
+
if (hook_config.template) {
|
|
123
|
+
writeFileSync(script_path, hook_config.template(), 'utf-8');
|
|
124
|
+
}
|
|
125
|
+
// Make it executable
|
|
126
|
+
make_executable(script_path);
|
|
127
|
+
success(`Script created: ${script_path}`);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
error(`Failed to create hook script: ${err}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
// Use relative path for project hooks, absolute for global
|
|
134
|
+
if (scope === 'global') {
|
|
135
|
+
hook_command = script_path;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
hook_command = `.claude/hooks/${hook_config.script}`;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Inline command
|
|
143
|
+
hook_command = hook_config.command;
|
|
144
|
+
}
|
|
145
|
+
// Update or create settings.json
|
|
146
|
+
if (existsSync(settings_path)) {
|
|
147
|
+
// Add to existing settings
|
|
148
|
+
const userPromptSubmit = settings.hooks?.UserPromptSubmit?.[0];
|
|
149
|
+
if (userPromptSubmit) {
|
|
150
|
+
// Add to existing hooks array
|
|
151
|
+
if (!userPromptSubmit.hooks) {
|
|
152
|
+
userPromptSubmit.hooks = [];
|
|
153
|
+
}
|
|
154
|
+
userPromptSubmit.hooks.push({
|
|
155
|
+
type: 'command',
|
|
156
|
+
command: hook_command,
|
|
157
|
+
});
|
|
158
|
+
info(`Adding ${hook_config.name} hook to existing ${scope} settings...`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Create UserPromptSubmit section
|
|
162
|
+
settings.hooks = settings.hooks || {};
|
|
163
|
+
settings.hooks.UserPromptSubmit = [
|
|
164
|
+
{
|
|
165
|
+
hooks: [
|
|
166
|
+
{
|
|
167
|
+
type: 'command',
|
|
168
|
+
command: hook_command,
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
info(`Adding ${hook_config.name} hook to ${scope} settings...`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
77
176
|
else {
|
|
78
177
|
// Create new settings.json
|
|
79
|
-
info(`Creating ${scope} settings with
|
|
178
|
+
info(`Creating ${scope} settings with ${hook_config.name} hook...`);
|
|
80
179
|
settings = {
|
|
81
180
|
hooks: {
|
|
82
181
|
UserPromptSubmit: [
|
|
@@ -84,7 +183,7 @@ export function add_hook_command(options = {}) {
|
|
|
84
183
|
hooks: [
|
|
85
184
|
{
|
|
86
185
|
type: 'command',
|
|
87
|
-
command:
|
|
186
|
+
command: hook_command,
|
|
88
187
|
},
|
|
89
188
|
],
|
|
90
189
|
},
|
|
@@ -96,13 +195,23 @@ export function add_hook_command(options = {}) {
|
|
|
96
195
|
try {
|
|
97
196
|
ensure_dir(scope === 'global' ? join(homedir(), '.claude') : '.claude');
|
|
98
197
|
writeFileSync(settings_path, JSON.stringify(settings, null, 2), 'utf-8');
|
|
99
|
-
success(
|
|
198
|
+
success(`${hook_config.name} hook added successfully! (${scope})`);
|
|
100
199
|
console.log('');
|
|
101
|
-
info(`
|
|
200
|
+
info(`Settings: ${settings_path}`);
|
|
201
|
+
if (hook_config.script) {
|
|
202
|
+
info(`Script: ${join(hooks_dir, hook_config.script)}`);
|
|
203
|
+
}
|
|
102
204
|
console.log('');
|
|
103
|
-
info(
|
|
104
|
-
info(
|
|
205
|
+
info(`Hook Type: ${hook_config.name}`);
|
|
206
|
+
info(`Success Rate: ${hook_config.success_rate}`);
|
|
207
|
+
info(`Description: ${hook_config.description}`);
|
|
105
208
|
console.log('');
|
|
209
|
+
if (hook_type === 'llm-eval') {
|
|
210
|
+
warning('LLM eval hook requires ANTHROPIC_API_KEY environment variable');
|
|
211
|
+
info('Set with: export ANTHROPIC_API_KEY=your-key-here');
|
|
212
|
+
info('Falls back to simple instruction if API key not found');
|
|
213
|
+
console.log('');
|
|
214
|
+
}
|
|
106
215
|
info('Next steps:');
|
|
107
216
|
console.log(' 1. Create skills with: claude-skills-cli init --name <name>');
|
|
108
217
|
console.log(' 2. Validate with: claude-skills-cli validate <path>');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-hook.js","sourceRoot":"","sources":["../../src/commands/add-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"add-hook.js","sourceRoot":"","sources":["../../src/commands/add-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAenE,MAAM,UAAU,GAAG;IAClB,eAAe,EAAE;QAChB,IAAI,EAAE,eAAe;QACrB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EACN,+GAA+G;QAChH,MAAM,EAAE,IAAI;KACZ;IACD,eAAe,EAAE;QAChB,IAAI,EAAE,eAAe;QACrB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,4BAA4B;QACpC,QAAQ,EAAE,oBAAoB;KAC9B;IACD,aAAa,EAAE;QACd,IAAI,EAAE,mBAAmB;QACzB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,iCAAiC;QACzC,QAAQ,EAAE,yBAAyB;KACnC;IACD,UAAU,EAAE;QACX,IAAI,EAAE,gBAAgB;QACtB,YAAY,EAAE,KAAK;QACnB,WAAW,EACV,wDAAwD;QACzD,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,8BAA8B;QACtC,QAAQ,EAAE,sBAAsB;KAChC;CACQ,CAAC;AAIX,MAAM,UAAU,gBAAgB,CAAC,UAA0B,EAAE;IAC5D,8CAA8C;IAC9C,MAAM,SAAS,GAAa,CAAC,OAAO,CAAC,IAAI;QACxC,aAAa,CAAa,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACzC,IAAI,CACH,kEAAkE,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAE1C,uCAAuC;IACvC,IAAI,aAAqB,CAAC;IAC1B,IAAI,SAAiB,CAAC;IACtB,IAAI,KAAa,CAAC;IAElB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,sCAAsC;QACtC,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;QACvD,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,GAAG,eAAe,CAAC;IACzB,CAAC;SAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,sCAAsC;QACtC,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACjD,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrC,KAAK,GAAG,SAAS,CAAC;IACnB,CAAC;SAAM,CAAC;QACP,mBAAmB;QACnB,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC5D,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,KAAK,GAAG,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,GAAiB,EAAE,CAAC;IAEhC,gCAAgC;IAChC,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACrD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE/B,gDAAgD;YAChD,IACC,QAAQ,CAAC,KAAK,EAAE,gBAAgB;gBAChC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC;gBAC9C,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EACzC,CAAC;gBACF,6DAA6D;gBAC7D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAE5D,mEAAmE;gBACnE,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,IAAI,KAAK,SAAS;oBACpB,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;wBACtC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;wBAC5C,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;wBACzC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC;wBACnD,CAAC,CAAC,OAAO,CAAC,QAAQ,CACjB,oDAAoD,CACpD,CAAC,CACJ,CAAC;gBAEF,IAAI,aAAa,EAAE,CAAC;oBACnB,OAAO,CACN,2CAA2C,KAAK,WAAW,CAC3D,CAAC;oBACF,IAAI,CAAC,iBAAiB,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAEhB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBACnB,IAAI,CAAC,mDAAmD,CAAC,CAAC;wBAC1D,2BAA2B;wBAC3B,gBAAgB,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CACtD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAC1B,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,kBAAkB,CAAC,CAAC;wBACzB,IAAI,CACH,yEAAyE,CACzE,CAAC;wBACF,OAAO;oBACR,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,KAAK,CAAC,mBAAmB,aAAa,KAAK,GAAG,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IAED,+BAA+B;IAC/B,IAAI,YAAoB,CAAC;IAEzB,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,4CAA4C;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC,YAAY,WAAW,CAAC,IAAI,iBAAiB,CAAC,CAAC;QAEpD,IAAI,CAAC;YACJ,UAAU,CAAC,SAAS,CAAC,CAAC;YAEtB,wBAAwB;YACxB,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC1B,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;YAED,qBAAqB;YACrB,eAAe,CAAC,WAAW,CAAC,CAAC;YAE7B,OAAO,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,2DAA2D;QAC3D,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxB,YAAY,GAAG,WAAW,CAAC;QAC5B,CAAC;aAAM,CAAC;YACP,YAAY,GAAG,iBAAiB,WAAW,CAAC,MAAM,EAAE,CAAC;QACtD,CAAC;IACF,CAAC;SAAM,CAAC;QACP,iBAAiB;QACjB,YAAY,GAAG,WAAW,CAAC,OAAQ,CAAC;IACrC,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,gBAAgB,EAAE,CAAC;YACtB,8BAA8B;YAC9B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC7B,gBAAgB,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7B,CAAC;YACD,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC3B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,IAAI,CACH,UAAU,WAAW,CAAC,IAAI,qBAAqB,KAAK,cAAc,CAClE,CAAC;QACH,CAAC;aAAM,CAAC;YACP,kCAAkC;YAClC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YACtC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,GAAG;gBACjC;oBACC,KAAK,EAAE;wBACN;4BACC,IAAI,EAAE,SAAS;4BACf,OAAO,EAAE,YAAY;yBACrB;qBACD;iBACD;aACD,CAAC;YAEF,IAAI,CAAC,UAAU,WAAW,CAAC,IAAI,YAAY,KAAK,cAAc,CAAC,CAAC;QACjE,CAAC;IACF,CAAC;SAAM,CAAC;QACP,2BAA2B;QAC3B,IAAI,CACH,YAAY,KAAK,kBAAkB,WAAW,CAAC,IAAI,UAAU,CAC7D,CAAC;QACF,QAAQ,GAAG;YACV,KAAK,EAAE;gBACN,gBAAgB,EAAE;oBACjB;wBACC,KAAK,EAAE;4BACN;gCACC,IAAI,EAAE,SAAS;gCACf,OAAO,EAAE,YAAY;6BACrB;yBACD;qBACD;iBACD;aACD;SACD,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC;QACJ,UAAU,CACT,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAC3D,CAAC;QACF,aAAa,CACZ,aAAa,EACb,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EACjC,OAAO,CACP,CAAC;QACF,OAAO,CACN,GAAG,WAAW,CAAC,IAAI,8BAA8B,KAAK,GAAG,CACzD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,aAAa,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,cAAc,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,iBAAiB,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC9B,OAAO,CACN,+DAA+D,CAC/D,CAAC;YACF,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACzD,IAAI,CAAC,uDAAuD,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CACV,+DAA+D,CAC/D,CAAC;QACF,OAAO,CAAC,GAAG,CACV,uDAAuD,CACvD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,KAAK,CAAC,mBAAmB,aAAa,KAAK,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { REFERENCE_TEMPLATE, SCRIPT_TEMPLATE, SKILL_MD_TEMPLATE, } from '../core/templates.js';
|
|
3
3
|
import { ensure_dir, is_lowercase, make_executable, to_title_case, write_file, } from '../utils/fs.js';
|
|
4
4
|
import { error, success } from '../utils/output.js';
|
|
5
5
|
export function init_command(options) {
|
|
@@ -46,9 +46,6 @@ function create_skill(path, name, description, with_examples = false) {
|
|
|
46
46
|
const title = to_title_case(name);
|
|
47
47
|
const skill_md = SKILL_MD_TEMPLATE(name, description, title, with_examples);
|
|
48
48
|
write_file(join(path, 'SKILL.md'), skill_md);
|
|
49
|
-
// Create README
|
|
50
|
-
const readme_md = README_TEMPLATE(title, description);
|
|
51
|
-
write_file(join(path, 'README.md'), readme_md);
|
|
52
49
|
// Only create example files if requested
|
|
53
50
|
if (with_examples) {
|
|
54
51
|
// Create example directories
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACN,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/core/templates.js
CHANGED
|
@@ -188,19 +188,202 @@ function main() {
|
|
|
188
188
|
|
|
189
189
|
main();
|
|
190
190
|
`;
|
|
191
|
-
|
|
191
|
+
// Hook templates for skill activation
|
|
192
|
+
export const SIMPLE_HOOK_TEMPLATE = () => `#!/bin/bash
|
|
193
|
+
echo 'INSTRUCTION: If the prompt matches any available skill keywords, use Skill(skill-name) to activate it.'
|
|
194
|
+
`;
|
|
195
|
+
export const FORCED_EVAL_HOOK_TEMPLATE = () => `#!/bin/bash
|
|
196
|
+
# UserPromptSubmit hook that forces explicit skill evaluation
|
|
197
|
+
#
|
|
198
|
+
# This hook requires Claude to explicitly evaluate each available skill
|
|
199
|
+
# before proceeding with implementation.
|
|
200
|
+
#
|
|
201
|
+
# Installation: Copy to .claude/hooks/UserPromptSubmit
|
|
202
|
+
|
|
203
|
+
cat <<'EOF'
|
|
204
|
+
INSTRUCTION: MANDATORY SKILL ACTIVATION SEQUENCE
|
|
205
|
+
|
|
206
|
+
Step 1 - EVALUATE (do this in your response):
|
|
207
|
+
For each skill in <available_skills>, state: [skill-name] - YES/NO - [reason]
|
|
208
|
+
|
|
209
|
+
Step 2 - ACTIVATE (do this immediately after Step 1):
|
|
210
|
+
IF any skills are YES → Use Skill(skill-name) tool for EACH relevant skill NOW
|
|
211
|
+
IF no skills are YES → State "No skills needed" and proceed
|
|
192
212
|
|
|
193
|
-
|
|
213
|
+
Step 3 - IMPLEMENT:
|
|
214
|
+
Only after Step 2 is complete, proceed with implementation.
|
|
194
215
|
|
|
195
|
-
|
|
216
|
+
CRITICAL: You MUST call Skill() tool in Step 2. Do NOT skip to implementation.
|
|
217
|
+
The evaluation (Step 1) is WORTHLESS unless you ACTIVATE (Step 2) the skills.
|
|
196
218
|
|
|
197
|
-
|
|
198
|
-
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
219
|
+
Example of correct sequence:
|
|
220
|
+
- research: NO - not a research task
|
|
221
|
+
- svelte5-runes: YES - need reactive state
|
|
222
|
+
- sveltekit-structure: YES - creating routes
|
|
201
223
|
|
|
202
|
-
|
|
224
|
+
[Then IMMEDIATELY use Skill() tool:]
|
|
225
|
+
> Skill(svelte5-runes)
|
|
226
|
+
> Skill(sveltekit-structure)
|
|
227
|
+
|
|
228
|
+
[THEN and ONLY THEN start implementation]
|
|
229
|
+
EOF
|
|
230
|
+
`;
|
|
231
|
+
export const LLM_EVAL_HOOK_TEMPLATE = () => `#!/bin/bash
|
|
232
|
+
# UserPromptSubmit hook that uses Claude API for intelligent skill evaluation
|
|
233
|
+
#
|
|
234
|
+
# This hook analyses each user prompt and uses the Claude API to determine which
|
|
235
|
+
# skills (if any) are relevant. It then instructs Claude to activate those skills
|
|
236
|
+
# before proceeding with implementation.
|
|
237
|
+
#
|
|
238
|
+
# COST ANALYSIS (per prompt):
|
|
239
|
+
# Current model: Claude Haiku 3.5 ($0.80/$4 per MTok input/output)
|
|
240
|
+
# - Estimated: ~400 input tokens + ~20 output tokens
|
|
241
|
+
# - Cost: ~$0.0004 per evaluation (0.04 cents)
|
|
242
|
+
# - Volume: $0.40 per 1,000 prompts
|
|
243
|
+
#
|
|
244
|
+
# MODEL CONFIGURATION:
|
|
245
|
+
# Uncomment the model you want to use below
|
|
246
|
+
#
|
|
247
|
+
# Alternative: Claude Haiku 4.5 ($1/$5 per MTok) - 25% more expensive
|
|
248
|
+
# - Better accuracy and alignment
|
|
249
|
+
# - Cost: ~$0.0005 per evaluation (0.05 cents)
|
|
250
|
+
# - Trade-off: Extra 0.01¢ per call for improved skill matching
|
|
251
|
+
#
|
|
252
|
+
# REQUIREMENTS:
|
|
253
|
+
# 1. Set ANTHROPIC_API_KEY environment variable
|
|
254
|
+
# export ANTHROPIC_API_KEY=your-key-here
|
|
255
|
+
# 2. Ensure jq is installed for JSON parsing
|
|
256
|
+
|
|
257
|
+
# ============================================================================
|
|
258
|
+
# MODEL CONFIGURATION - Uncomment the model you want to use
|
|
259
|
+
# ============================================================================
|
|
260
|
+
|
|
261
|
+
# Haiku 3.5 - Faster, cheaper, good for simple classification
|
|
262
|
+
MODEL="claude-3-5-haiku-20241022"
|
|
263
|
+
|
|
264
|
+
# Haiku 4.5 - Better accuracy, 25% more expensive (verify model ID from Anthropic docs)
|
|
265
|
+
# MODEL="claude-haiku-4-5-20251015"
|
|
266
|
+
|
|
267
|
+
# ============================================================================
|
|
268
|
+
|
|
269
|
+
# Read JSON input from stdin with timeout
|
|
270
|
+
INPUT_JSON=$(timeout 2 cat || echo '{}')
|
|
271
|
+
|
|
272
|
+
# Extract user prompt and cwd from JSON
|
|
273
|
+
USER_PROMPT=$(echo "$INPUT_JSON" | jq -r '.prompt // ""' 2>/dev/null)
|
|
274
|
+
CWD=$(echo "$INPUT_JSON" | jq -r '.cwd // ""' 2>/dev/null)
|
|
275
|
+
|
|
276
|
+
# Use CLAUDE_PROJECT_DIR if CWD is empty
|
|
277
|
+
if [ -z "$CWD" ] || [ "$CWD" = "null" ]; then
|
|
278
|
+
CWD="\${CLAUDE_PROJECT_DIR:-.}"
|
|
279
|
+
fi
|
|
280
|
+
|
|
281
|
+
# Get available skills with descriptions from both global and project skills
|
|
282
|
+
AVAILABLE_SKILLS=""
|
|
283
|
+
|
|
284
|
+
# Function to scan a skills directory
|
|
285
|
+
scan_skills_dir() {
|
|
286
|
+
local dir="$1"
|
|
287
|
+
|
|
288
|
+
if [ -d "$dir" ]; then
|
|
289
|
+
for skill_dir in "$dir"/*/; do
|
|
290
|
+
if [ -d "$skill_dir" ]; then
|
|
291
|
+
skill_file="$skill_dir/SKILL.md"
|
|
292
|
+
if [ -f "$skill_file" ]; then
|
|
293
|
+
skill_name=$(basename "$skill_dir")
|
|
294
|
+
# Extract description from YAML frontmatter (between --- markers)
|
|
295
|
+
skill_desc=$(sed -n '/^---$/,/^---$/p' "$skill_file" | grep '^description:' | sed 's/^description: *//' | head -n 1)
|
|
296
|
+
|
|
297
|
+
if [ -n "$skill_desc" ]; then
|
|
298
|
+
AVAILABLE_SKILLS="\${AVAILABLE_SKILLS}- \${skill_name}: \${skill_desc}\\n"
|
|
299
|
+
else
|
|
300
|
+
AVAILABLE_SKILLS="\${AVAILABLE_SKILLS}- \${skill_name}\\n"
|
|
301
|
+
fi
|
|
302
|
+
fi
|
|
303
|
+
fi
|
|
304
|
+
done
|
|
305
|
+
fi
|
|
306
|
+
}
|
|
203
307
|
|
|
204
|
-
|
|
308
|
+
# Scan global skills
|
|
309
|
+
scan_skills_dir "$HOME/.claude/skills"
|
|
310
|
+
|
|
311
|
+
# Scan project skills
|
|
312
|
+
scan_skills_dir "$CWD/.claude/skills"
|
|
313
|
+
|
|
314
|
+
if [ -z "$AVAILABLE_SKILLS" ]; then
|
|
315
|
+
AVAILABLE_SKILLS="No skills found"
|
|
316
|
+
fi
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
# Fallback instruction message
|
|
320
|
+
FALLBACK_INSTRUCTION="INSTRUCTION: If the prompt matches any available skill keywords, use Skill(skill-name) to activate it."
|
|
321
|
+
|
|
322
|
+
# If no API key in environment, fall back
|
|
323
|
+
if [ -z "$ANTHROPIC_API_KEY" ]; then
|
|
324
|
+
echo "$FALLBACK_INSTRUCTION"
|
|
325
|
+
exit 0
|
|
326
|
+
fi
|
|
327
|
+
|
|
328
|
+
# Prepare the optimized evaluation prompt
|
|
329
|
+
EVAL_PROMPT=$(cat <<EOF
|
|
330
|
+
Return ONLY a JSON array of skill names that match this request.
|
|
331
|
+
|
|
332
|
+
Request: \${USER_PROMPT}
|
|
333
|
+
|
|
334
|
+
Skills:
|
|
335
|
+
\${AVAILABLE_SKILLS}
|
|
336
|
+
Format: ["skill-name"] or []
|
|
337
|
+
EOF
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
# Call Claude API with optimized parameters
|
|
341
|
+
RESPONSE=$(curl -s https://api.anthropic.com/v1/messages \\
|
|
342
|
+
-H "content-type: application/json" \\
|
|
343
|
+
-H "x-api-key: $ANTHROPIC_API_KEY" \\
|
|
344
|
+
-H "anthropic-version: 2023-06-01" \\
|
|
345
|
+
-d "{
|
|
346
|
+
\\"model\\": \\"$MODEL\\",
|
|
347
|
+
\\"max_tokens\\": 200,
|
|
348
|
+
\\"temperature\\": 0,
|
|
349
|
+
\\"system\\": \\"You are a skill matcher. Return only valid JSON arrays.\\",
|
|
350
|
+
\\"messages\\": [{
|
|
351
|
+
\\"role\\": \\"user\\",
|
|
352
|
+
\\"content\\": $(echo "$EVAL_PROMPT" | jq -Rs .)
|
|
353
|
+
}]
|
|
354
|
+
}")
|
|
355
|
+
|
|
356
|
+
# Extract the skill list from response
|
|
357
|
+
RAW_TEXT=$(echo "$RESPONSE" | jq -r '.content[0].text' 2>/dev/null)
|
|
358
|
+
|
|
359
|
+
# Check if we got a valid response
|
|
360
|
+
if [ $? -ne 0 ] || [ -z "$RAW_TEXT" ]; then
|
|
361
|
+
echo "$FALLBACK_INSTRUCTION"
|
|
362
|
+
exit 0
|
|
363
|
+
fi
|
|
364
|
+
|
|
365
|
+
# Strip markdown code fences if present and extract JSON
|
|
366
|
+
SKILLS=$(echo "$RAW_TEXT" | sed -n '/^\\[/,/^\\]/p' | head -n 1)
|
|
367
|
+
|
|
368
|
+
# If that didn't work, try the whole text
|
|
369
|
+
if [ -z "$SKILLS" ]; then
|
|
370
|
+
SKILLS="$RAW_TEXT"
|
|
371
|
+
fi
|
|
372
|
+
|
|
373
|
+
# Parse the skills array
|
|
374
|
+
SKILL_COUNT=$(echo "$SKILLS" | jq 'length' 2>/dev/null)
|
|
375
|
+
|
|
376
|
+
if [ "$SKILL_COUNT" = "0" ]; then
|
|
377
|
+
echo "INSTRUCTION: LLM evaluation determined no skills are needed for this task."
|
|
378
|
+
elif [ -n "$SKILL_COUNT" ] && [ "$SKILL_COUNT" != "null" ]; then
|
|
379
|
+
SKILL_NAMES=$(echo "$SKILLS" | jq -r '.[]' | paste -sd ',' -)
|
|
380
|
+
echo "INSTRUCTION: LLM evaluation determined these skills are relevant: $SKILL_NAMES"
|
|
381
|
+
echo ""
|
|
382
|
+
echo "You MUST activate these skills using the Skill() tool BEFORE implementation:"
|
|
383
|
+
echo "$SKILLS" | jq -r '.[] | "- Skill(\\(.))"'
|
|
384
|
+
else
|
|
385
|
+
# Fallback if parsing failed
|
|
386
|
+
echo "$FALLBACK_INSTRUCTION"
|
|
387
|
+
fi
|
|
205
388
|
`;
|
|
206
389
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAChC,IAAY,EACZ,WAAmB,EACnB,KAAa,EACb,mBAA4B,KAAK,EAChC,EAAE;IACH,MAAM,gBAAgB,GAAG;QAClB,IAAI;;;eAGG,WAAW;;;IAGtB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDR,CAAC;IAED,MAAM,aAAa,GAAG;QACf,IAAI;;;eAGG,WAAW;;;IAGtB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDR,CAAC;IAED,OAAO,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,KAAa,EACZ,EAAE,CAAC,KAAK,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDd,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,QAAgB,EACf,EAAE,CAAC;;;;;;YAMO,QAAQ;;;;;;;;CAQnB,CAAC;AAEF,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAChC,IAAY,EACZ,WAAmB,EACnB,KAAa,EACb,mBAA4B,KAAK,EAChC,EAAE;IACH,MAAM,gBAAgB,GAAG;QAClB,IAAI;;;eAGG,WAAW;;;IAGtB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDR,CAAC;IAED,MAAM,aAAa,GAAG;QACf,IAAI;;;eAGG,WAAW;;;IAGtB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDR,CAAC;IAED,OAAO,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,KAAa,EACZ,EAAE,CAAC,KAAK,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDd,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,QAAgB,EACf,EAAE,CAAC;;;;;;YAMO,QAAQ;;;;;;;;CAQnB,CAAC;AAEF,sCAAsC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC;;CAEzC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmC9C,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6J3C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,8 @@ function show_help() {
|
|
|
25
25
|
console.log(' --version, -v Show version');
|
|
26
26
|
console.log(' --with-examples Include example files when creating skill');
|
|
27
27
|
console.log(' --format <type> Output format: text (default) or json');
|
|
28
|
-
console.log(' --strict Fail validation if warnings present
|
|
28
|
+
console.log(' --strict Fail validation if warnings present');
|
|
29
|
+
console.log(' --force Replace existing hook without prompting\n');
|
|
29
30
|
console.log('Examples:');
|
|
30
31
|
console.log(' claude-skills-cli init --name my-skill --description "Description"');
|
|
31
32
|
console.log(' claude-skills-cli init --name my-skill --description "..." --with-examples');
|
|
@@ -36,9 +37,16 @@ function show_help() {
|
|
|
36
37
|
console.log(' claude-skills-cli doctor .claude/skills/my-skill');
|
|
37
38
|
console.log(' claude-skills-cli package .claude/skills/my-skill');
|
|
38
39
|
console.log(' claude-skills-cli stats .claude/skills');
|
|
39
|
-
console.log(' claude-skills-cli add-hook
|
|
40
|
-
console.log(' claude-skills-cli add-hook --
|
|
41
|
-
console.log(' claude-skills-cli add-hook --
|
|
40
|
+
console.log(' claude-skills-cli add-hook # Global, forced-eval (84%)');
|
|
41
|
+
console.log(' claude-skills-cli add-hook --type llm-eval # Global, LLM eval (80%)');
|
|
42
|
+
console.log(' claude-skills-cli add-hook --type forced-eval --project # Project, forced-eval');
|
|
43
|
+
console.log(' claude-skills-cli add-hook --type simple-script --local # Local, simple script');
|
|
44
|
+
console.log(' claude-skills-cli add-hook --type forced-eval --force # Replace existing hook');
|
|
45
|
+
console.log('\nHook Types (--type):');
|
|
46
|
+
console.log(' forced-eval 84% success - Mandatory 3-step evaluation (default)');
|
|
47
|
+
console.log(' llm-eval 80% success - Claude API pre-evaluation (requires API key)');
|
|
48
|
+
console.log(' simple-script 20% success - Basic script file');
|
|
49
|
+
console.log(' simple-inline 20% success - Echo command in settings.json');
|
|
42
50
|
console.log('\n⚠️ IMPORTANT FOR LLMs:');
|
|
43
51
|
console.log(' ALWAYS run validate after creating or editing a skill:');
|
|
44
52
|
console.log(' claude-skills-cli validate <skill-path>');
|
|
@@ -160,6 +168,8 @@ async function main() {
|
|
|
160
168
|
add_hook_command({
|
|
161
169
|
local: parsed.local === true,
|
|
162
170
|
project: parsed.project === true,
|
|
171
|
+
type: parsed.type,
|
|
172
|
+
force: parsed.force === true,
|
|
163
173
|
});
|
|
164
174
|
break;
|
|
165
175
|
default:
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,SAAS,SAAS;IACjB,OAAO,CAAC,GAAG,CACV,oEAAoE,CACpE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CACV,6DAA6D,CAC7D,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CACV,0DAA0D,CAC1D,CAAC;IACF,OAAO,CAAC,GAAG,CACV,oEAAoE,CACpE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CACV,iEAAiE,CACjE,CAAC;IACF,OAAO,CAAC,GAAG,CACV,6DAA6D,CAC7D,CAAC;IACF,OAAO,CAAC,GAAG,CACV,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-skills-cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"description": "CLI toolkit for creating and managing Claude Agent Skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@changesets/cli": "^2.29.7",
|
|
42
42
|
"@types/node": "^24.9.0",
|
|
43
|
-
"@types/archiver": "^
|
|
43
|
+
"@types/archiver": "^7.0.0",
|
|
44
44
|
"prettier": "^3.6.2",
|
|
45
45
|
"typescript": "^5.9.3"
|
|
46
46
|
},
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { generate_hook_config, get_settings_location_message, has_skill_reminder_hook, } from '../utils/settings.js';
|
|
3
|
-
export function hook_config_command(options) {
|
|
4
|
-
const hook_type = options.sessionStart
|
|
5
|
-
? 'session-start'
|
|
6
|
-
: 'user-prompt';
|
|
7
|
-
console.log(chalk.cyan.bold('\n📋 Skill Activation Hook Configuration\n'));
|
|
8
|
-
// Check if hook already exists
|
|
9
|
-
if (has_skill_reminder_hook()) {
|
|
10
|
-
console.log(chalk.green('✅ Skill reminder hook already detected in your settings!\n'));
|
|
11
|
-
console.log(chalk.dim('You already have a hook that references .claude/skills/.'));
|
|
12
|
-
console.log(chalk.dim('If you want to modify it, edit your settings file directly.'));
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
// Display the configuration
|
|
16
|
-
console.log(chalk.white(`Copy this to ${chalk.bold(get_settings_location_message())}:\n`));
|
|
17
|
-
const config = generate_hook_config(hook_type);
|
|
18
|
-
console.log(chalk.cyan(config));
|
|
19
|
-
// Explain what it does
|
|
20
|
-
console.log(chalk.bold('\n💡 What this does:\n'));
|
|
21
|
-
if (hook_type === 'session-start') {
|
|
22
|
-
console.log(chalk.white(' • Fires once when Claude Code session starts'));
|
|
23
|
-
console.log(chalk.white(' • Costs ~15 tokens once per session'));
|
|
24
|
-
console.log(chalk.white(' • Claude sees reminder at start of conversation'));
|
|
25
|
-
console.log(chalk.yellow(' • May forget as conversation gets longer'));
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
console.log(chalk.white(' • Fires before Claude processes each prompt'));
|
|
29
|
-
console.log(chalk.white(' • Costs ~15 tokens per prompt'));
|
|
30
|
-
console.log(chalk.white(' • Makes Claude check your skills consistently'));
|
|
31
|
-
console.log(chalk.green(' • Recommended: Claude needs constant reminding!'));
|
|
32
|
-
}
|
|
33
|
-
console.log(chalk.white(' • No maintenance required (unlike skill-rules.json)'));
|
|
34
|
-
console.log(chalk.white(' • Claude decides which skills are relevant\n'));
|
|
35
|
-
// Show alternative
|
|
36
|
-
if (hook_type === 'session-start') {
|
|
37
|
-
console.log(chalk.dim('Alternative: UserPromptSubmit (constant reminders)'));
|
|
38
|
-
console.log(chalk.dim(' Run: claude-skills-cli hook-config\n'));
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
console.log(chalk.dim('Alternative: SessionStart (once per session)'));
|
|
42
|
-
console.log(chalk.dim(' Run: claude-skills-cli hook-config --session-start\n'));
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=hook-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-config.js","sourceRoot":"","sources":["../../src/commands/hook-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACN,oBAAoB,EACpB,6BAA6B,EAC7B,uBAAuB,GACvB,MAAM,sBAAsB,CAAC;AAM9B,MAAM,UAAU,mBAAmB,CAClC,OAA0B;IAE1B,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY;QACrC,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,aAAa,CAAC;IAEjB,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAC7D,CAAC;IAEF,+BAA+B;IAC/B,IAAI,uBAAuB,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,4DAA4D,CAC5D,CACD,CAAC;QACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CACR,0DAA0D,CAC1D,CACD,CAAC;QACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CACR,6DAA6D,CAC7D,CACD,CAAC;QACF,OAAO;IACR,CAAC;IAED,4BAA4B;IAC5B,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,gBAAgB,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,KAAK,CAChE,CACD,CAAC;IAEF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhC,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAC7D,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,mDAAmD,CACnD,CACD,CAAC;QACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAC5D,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAC9D,CAAC;QACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,mDAAmD,CACnD,CACD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CACV,uDAAuD,CACvD,CACD,CAAC;IACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAC7D,CAAC;IAEF,mBAAmB;IACnB,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAC/D,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CACR,wDAAwD,CACxD,CACD,CAAC;IACH,CAAC;AACF,CAAC"}
|
package/dist/commands/watch.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { watch } from 'node:fs';
|
|
2
|
-
import { basename, dirname, join } from 'node:path';
|
|
3
|
-
import { existsSync } from 'node:fs';
|
|
4
|
-
import { SkillValidator } from '../core/validator.js';
|
|
5
|
-
import { display_validation_stats, error, info, success, warning, } from '../utils/output.js';
|
|
6
|
-
export function watch_command(options) {
|
|
7
|
-
const { directory } = options;
|
|
8
|
-
const watch_path = directory || '.claude/skills';
|
|
9
|
-
if (!existsSync(watch_path)) {
|
|
10
|
-
error(`Directory does not exist: ${watch_path}`);
|
|
11
|
-
process.exit(1);
|
|
12
|
-
}
|
|
13
|
-
info(`Watching for changes in: ${watch_path}`);
|
|
14
|
-
console.log('='.repeat(60));
|
|
15
|
-
console.log('Auto-validating SKILL.md files on save...\n');
|
|
16
|
-
console.log('Press Ctrl+C to stop\n');
|
|
17
|
-
// Track last validation time to debounce rapid changes
|
|
18
|
-
const last_validation = new Map();
|
|
19
|
-
const DEBOUNCE_MS = 500;
|
|
20
|
-
// Watch recursively
|
|
21
|
-
const watcher = watch(watch_path, { recursive: true }, (eventType, filename) => {
|
|
22
|
-
if (!filename)
|
|
23
|
-
return;
|
|
24
|
-
// Only validate SKILL.md files
|
|
25
|
-
if (!filename.endsWith('SKILL.md'))
|
|
26
|
-
return;
|
|
27
|
-
const full_path = join(watch_path, filename);
|
|
28
|
-
const skill_path = dirname(full_path);
|
|
29
|
-
const skill_name = basename(skill_path);
|
|
30
|
-
// Debounce rapid changes
|
|
31
|
-
const now = Date.now();
|
|
32
|
-
const last = last_validation.get(full_path) || 0;
|
|
33
|
-
if (now - last < DEBOUNCE_MS)
|
|
34
|
-
return;
|
|
35
|
-
last_validation.set(full_path, now);
|
|
36
|
-
console.log('\n' + '='.repeat(60));
|
|
37
|
-
info(`Change detected: ${skill_name}/SKILL.md`);
|
|
38
|
-
console.log('='.repeat(60));
|
|
39
|
-
// Validate
|
|
40
|
-
const validator = new SkillValidator(skill_path);
|
|
41
|
-
const result = validator.validate_all();
|
|
42
|
-
// Display progressive disclosure stats
|
|
43
|
-
if (result.stats) {
|
|
44
|
-
display_validation_stats(result.stats);
|
|
45
|
-
}
|
|
46
|
-
// Print errors
|
|
47
|
-
if (result.errors.length > 0) {
|
|
48
|
-
console.log('\n❌ Errors:');
|
|
49
|
-
for (const err of result.errors) {
|
|
50
|
-
console.log(` ${err}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// Print warnings
|
|
54
|
-
if (result.warnings.length > 0) {
|
|
55
|
-
console.log('\n⚠️ Warnings:');
|
|
56
|
-
for (const warn of result.warnings) {
|
|
57
|
-
console.log(` ${warn}`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Print final status
|
|
61
|
-
if (!result.errors.length && !result.warnings.length) {
|
|
62
|
-
console.log('');
|
|
63
|
-
success(`✅ ${skill_name} is valid!`);
|
|
64
|
-
}
|
|
65
|
-
else if (!result.errors.length) {
|
|
66
|
-
console.log('');
|
|
67
|
-
warning(`⚠️ ${skill_name} is valid (with warnings)`);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
console.log('');
|
|
71
|
-
error(`❌ ${skill_name} validation failed with ${result.errors.length} error(s)`);
|
|
72
|
-
}
|
|
73
|
-
console.log('\nWatching for changes...');
|
|
74
|
-
});
|
|
75
|
-
// Handle cleanup
|
|
76
|
-
process.on('SIGINT', () => {
|
|
77
|
-
console.log('\n\nStopping watcher...');
|
|
78
|
-
watcher.close();
|
|
79
|
-
process.exit(0);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=watch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/settings.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
/**
|
|
5
|
-
* Get path to settings file (project-level or global)
|
|
6
|
-
* Returns null if neither exists
|
|
7
|
-
*/
|
|
8
|
-
export function get_settings_path() {
|
|
9
|
-
// Check project-level first
|
|
10
|
-
const project_settings = join(process.cwd(), '.claude', 'settings.json');
|
|
11
|
-
if (existsSync(project_settings)) {
|
|
12
|
-
return project_settings;
|
|
13
|
-
}
|
|
14
|
-
// Check global settings
|
|
15
|
-
const global_settings = join(homedir(), '.claude.json');
|
|
16
|
-
if (existsSync(global_settings)) {
|
|
17
|
-
return global_settings;
|
|
18
|
-
}
|
|
19
|
-
// Return project path even if doesn't exist (most likely location)
|
|
20
|
-
return project_settings;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Read and parse Claude settings file
|
|
24
|
-
*/
|
|
25
|
-
function read_settings(path) {
|
|
26
|
-
try {
|
|
27
|
-
const content = readFileSync(path, 'utf-8');
|
|
28
|
-
return JSON.parse(content);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Check if skill reminder hook exists in settings
|
|
36
|
-
*/
|
|
37
|
-
export function has_skill_reminder_hook() {
|
|
38
|
-
const settings_path = get_settings_path();
|
|
39
|
-
if (!settings_path || !existsSync(settings_path)) {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
const settings = read_settings(settings_path);
|
|
43
|
-
if (!settings?.hooks) {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
// Check UserPromptSubmit hooks
|
|
47
|
-
const user_prompt_hooks = settings.hooks.UserPromptSubmit;
|
|
48
|
-
if (user_prompt_hooks) {
|
|
49
|
-
for (const hook_group of user_prompt_hooks) {
|
|
50
|
-
for (const hook of hook_group.hooks) {
|
|
51
|
-
if (hook.command.includes('.claude/skills') ||
|
|
52
|
-
hook.command.includes('skills/')) {
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// Check SessionStart hooks
|
|
59
|
-
const session_start_hooks = settings.hooks.SessionStart;
|
|
60
|
-
if (session_start_hooks) {
|
|
61
|
-
for (const hook_group of session_start_hooks) {
|
|
62
|
-
for (const hook of hook_group.hooks) {
|
|
63
|
-
if (hook.command.includes('.claude/skills') ||
|
|
64
|
-
hook.command.includes('skills/')) {
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Generate hook configuration JSON string
|
|
74
|
-
*/
|
|
75
|
-
export function generate_hook_config(hook_type = 'user-prompt') {
|
|
76
|
-
if (hook_type === 'session-start') {
|
|
77
|
-
return `{
|
|
78
|
-
"hooks": {
|
|
79
|
-
"SessionStart": [{
|
|
80
|
-
"hooks": [{
|
|
81
|
-
"type": "command",
|
|
82
|
-
"command": "echo '💡 Skills available in .claude/skills/ - check for relevant ones!'"
|
|
83
|
-
}]
|
|
84
|
-
}]
|
|
85
|
-
}
|
|
86
|
-
}`;
|
|
87
|
-
}
|
|
88
|
-
// Default: UserPromptSubmit
|
|
89
|
-
return `{
|
|
90
|
-
"hooks": {
|
|
91
|
-
"UserPromptSubmit": [{
|
|
92
|
-
"hooks": [{
|
|
93
|
-
"type": "command",
|
|
94
|
-
"command": "echo '💡 Check .claude/skills/ for relevant skills before responding!'"
|
|
95
|
-
}]
|
|
96
|
-
}]
|
|
97
|
-
}
|
|
98
|
-
}`;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Get the recommended settings file location message
|
|
102
|
-
*/
|
|
103
|
-
export function get_settings_location_message() {
|
|
104
|
-
const settings_path = get_settings_path();
|
|
105
|
-
if (settings_path && existsSync(settings_path)) {
|
|
106
|
-
return settings_path;
|
|
107
|
-
}
|
|
108
|
-
return '.claude/settings.json (create this file in your project root)';
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":"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"}
|