claude-skills-cli 0.0.10 → 0.0.12
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 +65 -0
- package/dist/commands/add-hook.js +115 -0
- package/dist/commands/add-hook.js.map +1 -0
- package/dist/commands/hook-config.js +45 -0
- package/dist/commands/hook-config.js.map +1 -0
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/settings.js +110 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -123,6 +123,71 @@ pnpx claude-skills-cli package .claude/skills/my-skill
|
|
|
123
123
|
Creates uploadable zip for Claude.ai. Validates first unless
|
|
124
124
|
`--skip-validation` specified.
|
|
125
125
|
|
|
126
|
+
### add-hook
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
pnpx claude-skills-cli add-hook # Global (all projects)
|
|
130
|
+
pnpx claude-skills-cli add-hook --project # Project (committed)
|
|
131
|
+
pnpx claude-skills-cli add-hook --local # Project-local (gitignored)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Adds skill activation hook to improve reliability. By default, adds to
|
|
135
|
+
global settings (`~/.claude/settings.json`) to apply across all
|
|
136
|
+
projects. Use `--project` for team-shared settings or `--local` for
|
|
137
|
+
personal overrides.
|
|
138
|
+
|
|
139
|
+
## Skill Activation in Claude Code
|
|
140
|
+
|
|
141
|
+
Skills are designed to auto-activate in Claude Code, but in practice,
|
|
142
|
+
**[activation is unreliable without explicit hooks](https://scottspence.com/posts/claude-code-skills-dont-auto-activate)**.
|
|
143
|
+
Despite documentation claiming skills are "model-invoked," Claude
|
|
144
|
+
often bypasses skills unless directly instructed.
|
|
145
|
+
|
|
146
|
+
### The Solution: Explicit Activation Hooks
|
|
147
|
+
|
|
148
|
+
Use the `add-hook` command to add an explicit activation instruction:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
pnpx claude-skills-cli add-hook # Recommended: global (all projects)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
This adds a `UserPromptSubmit` hook that:
|
|
155
|
+
|
|
156
|
+
- Uses explicit "INSTRUCTION:" prefix (critical for reliability)
|
|
157
|
+
- Tells Claude to check skills AND activate them using `Skill()`
|
|
158
|
+
syntax
|
|
159
|
+
- Scales automatically with new skills (no keyword management needed)
|
|
160
|
+
- Fires on every prompt (~20 tokens/prompt overhead)
|
|
161
|
+
|
|
162
|
+
**Why explicit instructions matter:**
|
|
163
|
+
|
|
164
|
+
Testing shows vague hooks like "Check for skills" make Claude _read_
|
|
165
|
+
skill files instead of _activating_ them. The instruction must be
|
|
166
|
+
direct and unambiguous:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
INSTRUCTION: Check available skills, match keywords to skill names/descriptions,
|
|
170
|
+
and activate matching skills using Skill(skill-name).
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Scopes:**
|
|
174
|
+
|
|
175
|
+
- **Global** (default): `~/.claude/settings.json` - applies to all
|
|
176
|
+
projects
|
|
177
|
+
- **Project** (`--project`): `./.claude/settings.json` - committed to
|
|
178
|
+
git, team-shared
|
|
179
|
+
- **Local** (`--local`): `./.claude/settings.local.json` - gitignored,
|
|
180
|
+
personal
|
|
181
|
+
|
|
182
|
+
**Alternative: Keyword-based scripts**
|
|
183
|
+
|
|
184
|
+
For 1-2 skills, bash scripts with keyword detection work but become
|
|
185
|
+
brittle at scale (keyword collisions, manual maintenance per skill).
|
|
186
|
+
The simple echo-based instruction hook is more maintainable.
|
|
187
|
+
|
|
188
|
+
Read more:
|
|
189
|
+
[Why Claude Code Skills Don't Auto-Activate](https://scottspence.com/posts/claude-code-skills-dont-auto-activate)
|
|
190
|
+
|
|
126
191
|
## Resources
|
|
127
192
|
|
|
128
193
|
**Included docs:**
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { ensure_dir } from '../utils/fs.js';
|
|
5
|
+
import { error, info, success, warning } from '../utils/output.js';
|
|
6
|
+
const HOOK_COMMAND = "echo 'INSTRUCTION: If the prompt matches any available skill keywords, use Skill(skill-name) to activate it.'";
|
|
7
|
+
export function add_hook_command(options = {}) {
|
|
8
|
+
// Determine which settings file to use
|
|
9
|
+
let settings_path;
|
|
10
|
+
let scope;
|
|
11
|
+
if (options.local) {
|
|
12
|
+
// Project-specific local (gitignored)
|
|
13
|
+
settings_path = join('.claude', 'settings.local.json');
|
|
14
|
+
scope = 'project-local';
|
|
15
|
+
}
|
|
16
|
+
else if (options.project) {
|
|
17
|
+
// Project-specific shared (committed)
|
|
18
|
+
settings_path = join('.claude', 'settings.json');
|
|
19
|
+
scope = 'project';
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Global (default)
|
|
23
|
+
settings_path = join(homedir(), '.claude', 'settings.json');
|
|
24
|
+
scope = 'global';
|
|
25
|
+
}
|
|
26
|
+
let settings = {};
|
|
27
|
+
// Check if settings.json exists
|
|
28
|
+
if (existsSync(settings_path)) {
|
|
29
|
+
try {
|
|
30
|
+
const content = readFileSync(settings_path, 'utf-8');
|
|
31
|
+
settings = JSON.parse(content);
|
|
32
|
+
// Check if UserPromptSubmit hook already exists
|
|
33
|
+
if (settings.hooks?.UserPromptSubmit &&
|
|
34
|
+
Array.isArray(settings.hooks.UserPromptSubmit) &&
|
|
35
|
+
settings.hooks.UserPromptSubmit.length > 0) {
|
|
36
|
+
// Get the first (and should be only) UserPromptSubmit object
|
|
37
|
+
const userPromptSubmit = settings.hooks.UserPromptSubmit[0];
|
|
38
|
+
// Check if our specific hook already exists
|
|
39
|
+
const has_skill_hook = userPromptSubmit.hooks?.some((h) => h.type === 'command' &&
|
|
40
|
+
h.command.includes('Check .claude/skills/'));
|
|
41
|
+
if (has_skill_hook) {
|
|
42
|
+
warning(`Skill activation hook already exists in ${scope} settings`);
|
|
43
|
+
info('No changes made.');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
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
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
error(`Failed to parse ${settings_path}: ${err}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Create new settings.json
|
|
79
|
+
info(`Creating ${scope} settings with skill activation hook...`);
|
|
80
|
+
settings = {
|
|
81
|
+
hooks: {
|
|
82
|
+
UserPromptSubmit: [
|
|
83
|
+
{
|
|
84
|
+
hooks: [
|
|
85
|
+
{
|
|
86
|
+
type: 'command',
|
|
87
|
+
command: HOOK_COMMAND,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Write settings.json
|
|
96
|
+
try {
|
|
97
|
+
ensure_dir(scope === 'global' ? join(homedir(), '.claude') : '.claude');
|
|
98
|
+
writeFileSync(settings_path, JSON.stringify(settings, null, 2), 'utf-8');
|
|
99
|
+
success(`Skill activation hook added successfully! (${scope})`);
|
|
100
|
+
console.log('');
|
|
101
|
+
info(`Location: ${settings_path}`);
|
|
102
|
+
console.log('');
|
|
103
|
+
info('This hook improves skill activation reliability by explicitly');
|
|
104
|
+
info('instructing Claude to check AND activate matching skills.');
|
|
105
|
+
console.log('');
|
|
106
|
+
info('Next steps:');
|
|
107
|
+
console.log(' 1. Create skills with: claude-skills-cli init --name <name>');
|
|
108
|
+
console.log(' 2. Validate with: claude-skills-cli validate <path>');
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
error(`Failed to write ${settings_path}: ${err}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=add-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-hook.js","sourceRoot":"","sources":["../../src/commands/add-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { add_hook_command } from './commands/add-hook.js';
|
|
2
3
|
import { doctor_command } from './commands/doctor.js';
|
|
3
4
|
import { init_command } from './commands/init.js';
|
|
4
5
|
import { install_command } from './commands/install.js';
|
|
@@ -17,7 +18,8 @@ function show_help() {
|
|
|
17
18
|
console.log(' validate Validate a skill');
|
|
18
19
|
console.log(' doctor Fix common skill issues automatically');
|
|
19
20
|
console.log(' package Package a skill to zip');
|
|
20
|
-
console.log(' stats Show overview of all skills in a directory
|
|
21
|
+
console.log(' stats Show overview of all skills in a directory');
|
|
22
|
+
console.log(' add-hook Add skill activation hook to .claude/settings.json\n');
|
|
21
23
|
console.log('Options:');
|
|
22
24
|
console.log(' --help, -h Show help');
|
|
23
25
|
console.log(' --version, -v Show version');
|
|
@@ -34,6 +36,9 @@ function show_help() {
|
|
|
34
36
|
console.log(' claude-skills-cli doctor .claude/skills/my-skill');
|
|
35
37
|
console.log(' claude-skills-cli package .claude/skills/my-skill');
|
|
36
38
|
console.log(' claude-skills-cli stats .claude/skills');
|
|
39
|
+
console.log(' claude-skills-cli add-hook # Global');
|
|
40
|
+
console.log(' claude-skills-cli add-hook --project # Project');
|
|
41
|
+
console.log(' claude-skills-cli add-hook --local # Project-local');
|
|
37
42
|
console.log('\n⚠️ IMPORTANT FOR LLMs:');
|
|
38
43
|
console.log(' ALWAYS run validate after creating or editing a skill:');
|
|
39
44
|
console.log(' claude-skills-cli validate <skill-path>');
|
|
@@ -151,6 +156,12 @@ async function main() {
|
|
|
151
156
|
});
|
|
152
157
|
break;
|
|
153
158
|
}
|
|
159
|
+
case 'add-hook':
|
|
160
|
+
add_hook_command({
|
|
161
|
+
local: parsed.local === true,
|
|
162
|
+
project: parsed.project === true,
|
|
163
|
+
});
|
|
164
|
+
break;
|
|
154
165
|
default:
|
|
155
166
|
console.error(`Unknown command: ${command}`);
|
|
156
167
|
console.log('');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/utils/settings.ts"],"names":[],"mappings":"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"}
|