claude-skills-cli 0.0.13 → 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 +2 -2
- package/dist/commands/init.js +1 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/core/templates.js +0 -15
- package/dist/core/templates.js.map +1 -1
- package/dist/skills/skill-creator/references/cli-reference.md +0 -1
- package/package.json +1 -1
- 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
|
|
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,21 +188,6 @@ function main() {
|
|
|
188
188
|
|
|
189
189
|
main();
|
|
190
190
|
`;
|
|
191
|
-
export const README_TEMPLATE = (title, description) => `# ${title}
|
|
192
|
-
|
|
193
|
-
${description}
|
|
194
|
-
|
|
195
|
-
## Structure
|
|
196
|
-
|
|
197
|
-
- \`SKILL.md\` - Main skill instructions
|
|
198
|
-
- \`references/\` - Detailed documentation loaded as needed
|
|
199
|
-
- \`scripts/\` - Executable code for deterministic operations
|
|
200
|
-
- \`assets/\` - Templates, images, or other resources
|
|
201
|
-
|
|
202
|
-
## Usage
|
|
203
|
-
|
|
204
|
-
This skill is automatically discovered by Claude when relevant to the task.
|
|
205
|
-
`;
|
|
206
191
|
// Hook templates for skill activation
|
|
207
192
|
export const SIMPLE_HOOK_TEMPLATE = () => `#!/bin/bash
|
|
208
193
|
echo 'INSTRUCTION: If the prompt matches any available skill keywords, use Skill(skill-name) to activate it.'
|
|
@@ -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,
|
|
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/package.json
CHANGED
|
@@ -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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"}
|