claude-skills-cli 0.0.10 → 0.0.11
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 +43 -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,49 @@ 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 reality,
|
|
142
|
+
activation can be inconsistent. To improve reliability and make Claude
|
|
143
|
+
check for relevant skills more consistently, use the `add-hook`
|
|
144
|
+
command:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
pnpx claude-skills-cli add-hook # Recommended: global (all projects)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
This adds a hook that:
|
|
151
|
+
|
|
152
|
+
- Fires before Claude processes each prompt (~15 tokens/prompt)
|
|
153
|
+
- Makes Claude consistently check for relevant skills
|
|
154
|
+
- Requires no maintenance (unlike pattern-based approaches)
|
|
155
|
+
- Claude decides which skills apply to the current task
|
|
156
|
+
|
|
157
|
+
**Scopes:**
|
|
158
|
+
|
|
159
|
+
- **Global** (default): `~/.claude/settings.json` - applies to all
|
|
160
|
+
projects
|
|
161
|
+
- **Project** (`--project`): `./.claude/settings.json` - committed to
|
|
162
|
+
git, team-shared
|
|
163
|
+
- **Local** (`--local`): `./.claude/settings.local.json` - gitignored,
|
|
164
|
+
personal
|
|
165
|
+
|
|
166
|
+
**Note:** This hook pattern is widely adopted by the community to
|
|
167
|
+
improve skill activation reliability.
|
|
168
|
+
|
|
126
169
|
## Resources
|
|
127
170
|
|
|
128
171
|
**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 '💡 Check .claude/skills/ for relevant skills before responding!'";
|
|
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 reminding');
|
|
104
|
+
info('Claude to check for relevant skills before responding.');
|
|
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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"}
|