0xkobold 0.0.1
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/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
- package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
- package/HEARTBEAT.md +45 -0
- package/README.md +197 -0
- package/USAGE.md +191 -0
- package/dist/package.json +77 -0
- package/dist/src/agent/pi-adapter.js +307 -0
- package/dist/src/agent/pi-adapter.js.map +1 -0
- package/dist/src/agent/tool-adapter.js +86 -0
- package/dist/src/agent/tool-adapter.js.map +1 -0
- package/dist/src/approval/queue.js +114 -0
- package/dist/src/approval/queue.js.map +1 -0
- package/dist/src/ascii-kobold.js +76 -0
- package/dist/src/ascii-kobold.js.map +1 -0
- package/dist/src/cli/client.js +217 -0
- package/dist/src/cli/client.js.map +1 -0
- package/dist/src/cli/commands/agent.js +272 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/chat.js +234 -0
- package/dist/src/cli/commands/chat.js.map +1 -0
- package/dist/src/cli/commands/config.js +202 -0
- package/dist/src/cli/commands/config.js.map +1 -0
- package/dist/src/cli/commands/daemon.js +203 -0
- package/dist/src/cli/commands/daemon.js.map +1 -0
- package/dist/src/cli/commands/gateway.js +184 -0
- package/dist/src/cli/commands/gateway.js.map +1 -0
- package/dist/src/cli/commands/init.js +175 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/kobold.js +21 -0
- package/dist/src/cli/commands/kobold.js.map +1 -0
- package/dist/src/cli/commands/logs.js +27 -0
- package/dist/src/cli/commands/logs.js.map +1 -0
- package/dist/src/cli/commands/mode.js +121 -0
- package/dist/src/cli/commands/mode.js.map +1 -0
- package/dist/src/cli/commands/persona.js +261 -0
- package/dist/src/cli/commands/persona.js.map +1 -0
- package/dist/src/cli/commands/start.js +66 -0
- package/dist/src/cli/commands/start.js.map +1 -0
- package/dist/src/cli/commands/status.js +117 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/commands/stop.js +27 -0
- package/dist/src/cli/commands/stop.js.map +1 -0
- package/dist/src/cli/commands/system.js +128 -0
- package/dist/src/cli/commands/system.js.map +1 -0
- package/dist/src/cli/commands/tui.js +103 -0
- package/dist/src/cli/commands/tui.js.map +1 -0
- package/dist/src/cli/commands/update.js +133 -0
- package/dist/src/cli/commands/update.js.map +1 -0
- package/dist/src/cli/extensions/discord.js +113 -0
- package/dist/src/cli/extensions/discord.js.map +1 -0
- package/dist/src/cli/extensions/env.js +91 -0
- package/dist/src/cli/extensions/env.js.map +1 -0
- package/dist/src/cli/extensions/heartbeat.js +78 -0
- package/dist/src/cli/extensions/heartbeat.js.map +1 -0
- package/dist/src/cli/index.js +24 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/program.js +70 -0
- package/dist/src/cli/program.js.map +1 -0
- package/dist/src/cli/repl.js +184 -0
- package/dist/src/cli/repl.js.map +1 -0
- package/dist/src/cli/shared/discord-service.js +102 -0
- package/dist/src/cli/shared/discord-service.js.map +1 -0
- package/dist/src/config/index.js +10 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/loader.js +401 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/paths.js +84 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/config/types.js +8 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/context-detector.js +60 -0
- package/dist/src/context-detector.js.map +1 -0
- package/dist/src/discord/index.js +376 -0
- package/dist/src/discord/index.js.map +1 -0
- package/dist/src/event-bus/index.js +97 -0
- package/dist/src/event-bus/index.js.map +1 -0
- package/dist/src/extensions/command-args.js +68 -0
- package/dist/src/extensions/command-args.js.map +1 -0
- package/dist/src/extensions/core/agent-registry-extension.js +541 -0
- package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
- package/dist/src/extensions/core/agent-worker.js +148 -0
- package/dist/src/extensions/core/agent-worker.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard.js +154 -0
- package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
- package/dist/src/extensions/core/confirm-destructive.js +43 -0
- package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
- package/dist/src/extensions/core/context-aware-extension.js +124 -0
- package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/extension.js +124 -0
- package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
- package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
- package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
- package/dist/src/extensions/core/context-pruning/settings.js +105 -0
- package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
- package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
- package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
- package/dist/src/extensions/core/discord-channel-extension.js +205 -0
- package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
- package/dist/src/extensions/core/discord-extension.js +142 -0
- package/dist/src/extensions/core/discord-extension.js.map +1 -0
- package/dist/src/extensions/core/env-loader-extension.js +157 -0
- package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
- package/dist/src/extensions/core/fileops-extension.js +699 -0
- package/dist/src/extensions/core/fileops-extension.js.map +1 -0
- package/dist/src/extensions/core/gateway-extension.js +730 -0
- package/dist/src/extensions/core/gateway-extension.js.map +1 -0
- package/dist/src/extensions/core/git-checkpoint.js +46 -0
- package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
- package/dist/src/extensions/core/handoff-extension.js +206 -0
- package/dist/src/extensions/core/handoff-extension.js.map +1 -0
- package/dist/src/extensions/core/heartbeat-extension.js +373 -0
- package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
- package/dist/src/extensions/core/mcp-extension.js +413 -0
- package/dist/src/extensions/core/mcp-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +562 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/multi-channel-extension.js +435 -0
- package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
- package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
- package/dist/src/extensions/core/onboarding-extension.js +122 -0
- package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
- package/dist/src/extensions/core/persona-loader-extension.js +139 -0
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
- package/dist/src/extensions/core/pi-notify-extension.js +70 -0
- package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
- package/dist/src/extensions/core/protected-paths.js +24 -0
- package/dist/src/extensions/core/protected-paths.js.map +1 -0
- package/dist/src/extensions/core/questionnaire-extension.js +242 -0
- package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
- package/dist/src/extensions/core/self-update-extension.js +181 -0
- package/dist/src/extensions/core/self-update-extension.js.map +1 -0
- package/dist/src/extensions/core/session-bridge-extension.js +78 -0
- package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
- package/dist/src/extensions/core/session-manager-extension.js +319 -0
- package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/session-name-extension.js +88 -0
- package/dist/src/extensions/core/session-name-extension.js.map +1 -0
- package/dist/src/extensions/core/session-pruning-extension.js +480 -0
- package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
- package/dist/src/extensions/core/task-manager-extension.js +661 -0
- package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
- package/dist/src/extensions/core/update-extension.js +438 -0
- package/dist/src/extensions/core/update-extension.js.map +1 -0
- package/dist/src/extensions/core/websearch-extension.js +463 -0
- package/dist/src/extensions/core/websearch-extension.js.map +1 -0
- package/dist/src/extensions/index.js +5 -0
- package/dist/src/extensions/index.js.map +1 -0
- package/dist/src/extensions/loader.js +80 -0
- package/dist/src/extensions/loader.js.map +1 -0
- package/dist/src/gateway/index.js +353 -0
- package/dist/src/gateway/index.js.map +1 -0
- package/dist/src/index.js +150 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm/anthropic.js +86 -0
- package/dist/src/llm/anthropic.js.map +1 -0
- package/dist/src/llm/index.js +9 -0
- package/dist/src/llm/index.js.map +1 -0
- package/dist/src/llm/ollama.js +113 -0
- package/dist/src/llm/ollama.js.map +1 -0
- package/dist/src/llm/router.js +145 -0
- package/dist/src/llm/router.js.map +1 -0
- package/dist/src/llm/types.js +7 -0
- package/dist/src/llm/types.js.map +1 -0
- package/dist/src/memory/index.js +5 -0
- package/dist/src/memory/index.js.map +1 -0
- package/dist/src/memory/store.js +91 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/pi-config.js +80 -0
- package/dist/src/pi-config.js.map +1 -0
- package/dist/src/skills/builtin/file.js +184 -0
- package/dist/src/skills/builtin/file.js.map +1 -0
- package/dist/src/skills/builtin/shell.js +100 -0
- package/dist/src/skills/builtin/shell.js.map +1 -0
- package/dist/src/skills/builtin/subagent.js +62 -0
- package/dist/src/skills/builtin/subagent.js.map +1 -0
- package/dist/src/skills/hello.js +42 -0
- package/dist/src/skills/hello.js.map +1 -0
- package/dist/src/skills/index.js +11 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/loader.js +382 -0
- package/dist/src/skills/loader.js.map +1 -0
- package/dist/src/skills/types.js +8 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/utils/working-dir.js +71 -0
- package/dist/src/utils/working-dir.js.map +1 -0
- package/package.json +77 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +198 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +197 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gh-issues/SKILL.md +865 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +163 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +153 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +112 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell Skill
|
|
3
|
+
*
|
|
4
|
+
* Execute shell commands with safety controls.
|
|
5
|
+
*/
|
|
6
|
+
import { exec } from 'child_process';
|
|
7
|
+
import { promisify } from 'util';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
// Blocked dangerous commands
|
|
10
|
+
const BLOCKED_PATTERNS = [
|
|
11
|
+
/rm\s+-rf\s+\//,
|
|
12
|
+
/dd\s+if=/,
|
|
13
|
+
/>\s*\/dev\/(null|zero|random)/,
|
|
14
|
+
/mkfs/,
|
|
15
|
+
/:\(\)\{\s*:\|\:&&\}\s*;/, // fork bomb
|
|
16
|
+
];
|
|
17
|
+
// Allowed safe commands (whitelist approach)
|
|
18
|
+
const SAFE_COMMANDS = [
|
|
19
|
+
'ls', 'cat', 'grep', 'find', 'pwd', 'echo', 'head', 'tail',
|
|
20
|
+
'wc', 'sort', 'uniq', 'curl', 'wget', 'git', 'npm', 'bun',
|
|
21
|
+
'mkdir', 'touch', 'cp', 'mv', 'rm', 'cd', 'pwd',
|
|
22
|
+
];
|
|
23
|
+
export const shellSkill = {
|
|
24
|
+
name: 'shell',
|
|
25
|
+
description: `Execute shell commands safely.
|
|
26
|
+
|
|
27
|
+
Available commands: ls, cat, grep, find, git, npm, bun, curl, mkdir, cp, mv, rm, etc.
|
|
28
|
+
|
|
29
|
+
For destructive operations (rm, mv), you'll be asked for approval.`,
|
|
30
|
+
risk: 'high',
|
|
31
|
+
toolDefinition: {
|
|
32
|
+
type: 'function',
|
|
33
|
+
function: {
|
|
34
|
+
name: 'shell',
|
|
35
|
+
description: 'Execute a shell command',
|
|
36
|
+
parameters: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
command: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'The shell command to execute',
|
|
42
|
+
},
|
|
43
|
+
timeout: {
|
|
44
|
+
type: 'number',
|
|
45
|
+
description: 'Timeout in seconds (default: 30)',
|
|
46
|
+
},
|
|
47
|
+
cwd: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Working directory (default: current)',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
required: ['command'],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
async execute(args) {
|
|
57
|
+
const command = args.command;
|
|
58
|
+
const timeout = args.timeout ?? 30;
|
|
59
|
+
const cwd = args.cwd;
|
|
60
|
+
// Check for blocked patterns
|
|
61
|
+
for (const pattern of BLOCKED_PATTERNS) {
|
|
62
|
+
if (pattern.test(command)) {
|
|
63
|
+
return {
|
|
64
|
+
error: 'Command blocked for safety',
|
|
65
|
+
command,
|
|
66
|
+
reason: 'Dangerous pattern detected',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Check if command is in safe list (basic check)
|
|
71
|
+
const baseCmd = command.trim().split(' ')[0];
|
|
72
|
+
if (!SAFE_COMMANDS.includes(baseCmd)) {
|
|
73
|
+
console.log(`[Shell] Warning: Command "${baseCmd}" not in safe list, will require approval`);
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
77
|
+
timeout: timeout * 1000,
|
|
78
|
+
cwd,
|
|
79
|
+
env: { ...process.env, PATH: process.env.PATH },
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
command,
|
|
83
|
+
stdout: stdout.trim(),
|
|
84
|
+
stderr: stderr.trim(),
|
|
85
|
+
exitCode: 0,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return {
|
|
90
|
+
command,
|
|
91
|
+
stdout: err.stdout?.trim() ?? '',
|
|
92
|
+
stderr: err.stderr?.trim() ?? '',
|
|
93
|
+
exitCode: err.code ?? 1,
|
|
94
|
+
error: err.message,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
export default shellSkill;
|
|
100
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../src/skills/builtin/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent Skill
|
|
3
|
+
*
|
|
4
|
+
* Built-in skill for spawning subagents.
|
|
5
|
+
* This allows agents to delegate work to child agents.
|
|
6
|
+
*/
|
|
7
|
+
export const subagentSkill = {
|
|
8
|
+
name: 'spawn_subagent',
|
|
9
|
+
description: `Spawn a subagent to handle a specific task in parallel.
|
|
10
|
+
|
|
11
|
+
Use this when you need to:
|
|
12
|
+
- Delegate work to a specialized agent
|
|
13
|
+
- Run multiple tasks in parallel
|
|
14
|
+
- Isolate a complex subtask
|
|
15
|
+
- Scale work across multiple agents
|
|
16
|
+
|
|
17
|
+
The subagent will have the same capabilities and tools as you,
|
|
18
|
+
but will be isolated in its own session. When the subagent completes,
|
|
19
|
+
you'll receive its result.`,
|
|
20
|
+
risk: 'medium',
|
|
21
|
+
toolDefinition: {
|
|
22
|
+
type: 'function',
|
|
23
|
+
function: {
|
|
24
|
+
name: 'spawn_subagent',
|
|
25
|
+
description: 'Spawn a subagent to handle a specific task',
|
|
26
|
+
parameters: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
task: {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'The task to assign to the subagent. Be specific and clear.',
|
|
32
|
+
},
|
|
33
|
+
model: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'Optional: Model to use (e.g., "fast" for quick tasks, "smart" for complex reasoning). Defaults to same model.',
|
|
36
|
+
},
|
|
37
|
+
maxIterations: {
|
|
38
|
+
type: 'number',
|
|
39
|
+
description: 'Optional: Maximum iterations for the subagent. Default: 10',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ['task'],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
async execute(args) {
|
|
47
|
+
const task = args.task;
|
|
48
|
+
const model = args.model;
|
|
49
|
+
const maxIterations = args.maxIterations;
|
|
50
|
+
// This will be handled by the agent system
|
|
51
|
+
// The actual implementation is in pi-adapter.ts
|
|
52
|
+
return {
|
|
53
|
+
spawnRequested: true,
|
|
54
|
+
task,
|
|
55
|
+
model,
|
|
56
|
+
maxIterations,
|
|
57
|
+
message: 'Subagent spawn requested. This should be handled by the agent runner.',
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export default subagentSkill;
|
|
62
|
+
//# sourceMappingURL=subagent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../../../src/skills/builtin/subagent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAU;IAClC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE;;;;;;;;;;2BAUY;IAEzB,IAAI,EAAE,QAAQ;IAEd,cAAc,EAAE;QACd,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,4CAA4C;YACzD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4DAA4D;qBAC1E;oBACD,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,+GAA+G;qBAC7H;oBACD,aAAa,EAAE;wBACb,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4DAA4D;qBAC1E;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAA6B;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2B,CAAC;QAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAmC,CAAC;QAE/D,2CAA2C;QAC3C,gDAAgD;QAChD,OAAO;YACL,cAAc,EAAE,IAAI;YACpB,IAAI;YACJ,KAAK;YACL,aAAa;YACb,OAAO,EAAE,uEAAuE;SACjF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Skill: Hello
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates the hot-reload skill system.
|
|
5
|
+
*/
|
|
6
|
+
export const helloSkill = {
|
|
7
|
+
name: 'hello',
|
|
8
|
+
description: 'Say hello to someone. Use this to greet users.',
|
|
9
|
+
risk: 'safe',
|
|
10
|
+
toolDefinition: {
|
|
11
|
+
type: 'function',
|
|
12
|
+
function: {
|
|
13
|
+
name: 'hello',
|
|
14
|
+
description: 'Say hello to someone by name',
|
|
15
|
+
parameters: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
name: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'The name of the person to greet',
|
|
21
|
+
},
|
|
22
|
+
enthusiasm: {
|
|
23
|
+
type: 'number',
|
|
24
|
+
description: 'Enthusiasm level 1-10 (default: 5)',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
required: ['name'],
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
async execute(args) {
|
|
32
|
+
const name = args.name;
|
|
33
|
+
const enthusiasm = args.enthusiasm ?? 5;
|
|
34
|
+
const exclamation = '!'.repeat(Math.min(enthusiasm, 10));
|
|
35
|
+
return {
|
|
36
|
+
greeting: `Hello, ${name}${exclamation}`,
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
export default helloSkill;
|
|
42
|
+
//# sourceMappingURL=hello.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hello.js","sourceRoot":"","sources":["../../../src/skills/hello.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAU;IAC/B,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,gDAAgD;IAC7D,IAAI,EAAE,MAAM;IAEZ,cAAc,EAAE;QACd,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,8BAA8B;YAC3C,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iCAAiC;qBAC/C;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,oCAAoC;qBAClD;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,IAA6B;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;QACjC,MAAM,UAAU,GAAI,IAAI,CAAC,UAAiC,IAAI,CAAC,CAAC;QAEhE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEzD,OAAO;YACL,QAAQ,EAAE,UAAU,IAAI,GAAG,WAAW,EAAE;YACxC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Module
|
|
3
|
+
*
|
|
4
|
+
* Hot-reload skill system with built-in skills.
|
|
5
|
+
*/
|
|
6
|
+
export { skillRegistry, getSkillRegistry, initSkills, reloadSkills } from './loader';
|
|
7
|
+
// Built-in skills
|
|
8
|
+
export { subagentSkill } from './builtin/subagent';
|
|
9
|
+
export { shellSkill } from './builtin/shell';
|
|
10
|
+
export { readFileSkill, writeFileSkill, listFilesSkill } from './builtin/file';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErF,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loader
|
|
3
|
+
*
|
|
4
|
+
* Hot-reload skill system using Bun's file watcher.
|
|
5
|
+
* Skills are plain .ts/.md files in the skills directories.
|
|
6
|
+
*/
|
|
7
|
+
import { watch } from 'fs';
|
|
8
|
+
import { readdir, readFile } from 'fs/promises';
|
|
9
|
+
import { join, basename, extname, dirname } from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { homedir } from 'os';
|
|
13
|
+
import { createEventEmitter } from '../event-bus';
|
|
14
|
+
const emit = createEventEmitter('skills');
|
|
15
|
+
// Get __dirname equivalent in ESM
|
|
16
|
+
const getDirname = () => {
|
|
17
|
+
return dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
};
|
|
19
|
+
// Built-in skills path - relative to project root (for dev)
|
|
20
|
+
const PROJECT_ROOT = join(getDirname(), '..', '..');
|
|
21
|
+
const DEV_BUILTIN_SKILLS_DIR = join(PROJECT_ROOT, 'src', 'skills', 'builtin');
|
|
22
|
+
// Production built-in skills path (in dist/)
|
|
23
|
+
const PROD_BUILTIN_SKILLS_DIR = join(PROJECT_ROOT, '..', 'skills', 'builtin');
|
|
24
|
+
// User skills directories
|
|
25
|
+
function getGlobalSkillsDir() {
|
|
26
|
+
// Use ~/.0xkobold/skills instead of .agents/skills for better organization
|
|
27
|
+
return join(homedir(), '.0xkobold', 'skills');
|
|
28
|
+
}
|
|
29
|
+
function getLocalSkillsDir() {
|
|
30
|
+
return join(process.cwd(), 'skills');
|
|
31
|
+
}
|
|
32
|
+
function getAgentSkillsDir() {
|
|
33
|
+
// Support skills installed via 'skills' CLI to .agents/skills
|
|
34
|
+
const agentSkills = join(homedir(), '.agents', 'skills');
|
|
35
|
+
if (existsSync(agentSkills)) {
|
|
36
|
+
return agentSkills;
|
|
37
|
+
}
|
|
38
|
+
return getGlobalSkillsDir();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get bundled skills directory (shipped with npm package)
|
|
42
|
+
*/
|
|
43
|
+
function getBundledSkillsDir() {
|
|
44
|
+
// In dev: use .agents/skills from project root
|
|
45
|
+
// In prod: use .agents/skills from package root (next to dist/)
|
|
46
|
+
const devPath = join(PROJECT_ROOT, '.agents', 'skills');
|
|
47
|
+
const prodPath = join(PROJECT_ROOT, '..', '.agents', 'skills');
|
|
48
|
+
if (existsSync(devPath)) {
|
|
49
|
+
return devPath;
|
|
50
|
+
}
|
|
51
|
+
return prodPath;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get built-in skills directory (handles both dev and prod)
|
|
55
|
+
*/
|
|
56
|
+
function getBuiltInSkillsDir() {
|
|
57
|
+
// Prefer dev path if it exists
|
|
58
|
+
if (existsSync(DEV_BUILTIN_SKILLS_DIR)) {
|
|
59
|
+
return DEV_BUILTIN_SKILLS_DIR;
|
|
60
|
+
}
|
|
61
|
+
// Fall back to production path
|
|
62
|
+
return PROD_BUILTIN_SKILLS_DIR;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Skill Registry
|
|
66
|
+
*/
|
|
67
|
+
class SkillRegistry {
|
|
68
|
+
skills = new Map();
|
|
69
|
+
watchers = new Map();
|
|
70
|
+
/**
|
|
71
|
+
* Register a skill
|
|
72
|
+
*/
|
|
73
|
+
register(entry) {
|
|
74
|
+
this.skills.set(entry.name, entry);
|
|
75
|
+
// @ts-ignore EventEmitter type
|
|
76
|
+
emit('skill.registered', {
|
|
77
|
+
name: entry.name,
|
|
78
|
+
source: entry.source,
|
|
79
|
+
risk: entry.skill.risk,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Unregister a skill
|
|
84
|
+
*/
|
|
85
|
+
unregister(name) {
|
|
86
|
+
const entry = this.skills.get(name);
|
|
87
|
+
if (entry) {
|
|
88
|
+
this.skills.delete(name);
|
|
89
|
+
// @ts-ignore EventEmitter type
|
|
90
|
+
emit('skill.unregistered', { name });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get a skill by name
|
|
95
|
+
*/
|
|
96
|
+
get(name) {
|
|
97
|
+
return this.skills.get(name)?.skill;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get all skills
|
|
101
|
+
*/
|
|
102
|
+
getAll() {
|
|
103
|
+
return Array.from(this.skills.values()).map(e => e.skill);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* List all registered skills
|
|
107
|
+
*/
|
|
108
|
+
list() {
|
|
109
|
+
return Array.from(this.skills.values());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check if skill exists
|
|
113
|
+
*/
|
|
114
|
+
has(name) {
|
|
115
|
+
return this.skills.has(name);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Clear all skills
|
|
119
|
+
*/
|
|
120
|
+
clear() {
|
|
121
|
+
this.skills.clear();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Watch a file for hot-reload
|
|
125
|
+
*/
|
|
126
|
+
watchFile(path, loadFn) {
|
|
127
|
+
// Stop existing watcher
|
|
128
|
+
this.stopWatching(path);
|
|
129
|
+
const watcher = watch(path, async (eventType) => {
|
|
130
|
+
if (eventType === 'change') {
|
|
131
|
+
console.log(`[Skills] Hot-reloading: ${basename(path)}`);
|
|
132
|
+
try {
|
|
133
|
+
await loadFn();
|
|
134
|
+
console.log(`[Skills] Reloaded: ${basename(path)}`);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
console.error(`[Skills] Failed to reload ${basename(path)}:`, err);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
this.watchers.set(path, watcher);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Stop watching a file
|
|
145
|
+
*/
|
|
146
|
+
stopWatching(path) {
|
|
147
|
+
const watcher = this.watchers.get(path);
|
|
148
|
+
if (watcher) {
|
|
149
|
+
watcher.close();
|
|
150
|
+
this.watchers.delete(path);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Stop all watchers
|
|
155
|
+
*/
|
|
156
|
+
stopAllWatchers() {
|
|
157
|
+
for (const [path, watcher] of this.watchers) {
|
|
158
|
+
watcher.close();
|
|
159
|
+
}
|
|
160
|
+
this.watchers.clear();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Global registry instance
|
|
164
|
+
export const skillRegistry = new SkillRegistry();
|
|
165
|
+
/**
|
|
166
|
+
* Load a skill from a file
|
|
167
|
+
*/
|
|
168
|
+
async function loadSkillFile(path) {
|
|
169
|
+
try {
|
|
170
|
+
// Handle .md skills (from skills CLI)
|
|
171
|
+
if (path.endsWith('.md')) {
|
|
172
|
+
const content = await readFile(path, 'utf-8');
|
|
173
|
+
// Parse SKILL.md format - extract frontmatter and create skill
|
|
174
|
+
const skill = parseSkillMarkdown(content, path);
|
|
175
|
+
return skill ? [skill] : [];
|
|
176
|
+
}
|
|
177
|
+
// Handle .ts/.js skills (dynamic import)
|
|
178
|
+
const module = (await import(path));
|
|
179
|
+
// Try to get skill(s) from default export or named export
|
|
180
|
+
let skills = module.default || module.skill;
|
|
181
|
+
if (!skills) {
|
|
182
|
+
// Try to find first Skill-like export
|
|
183
|
+
for (const key of Object.keys(module)) {
|
|
184
|
+
const exported = module[key];
|
|
185
|
+
if (isSkill(exported)) {
|
|
186
|
+
skills = exported;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (!skills) {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
// Handle both single skill and array of skills
|
|
195
|
+
return Array.isArray(skills) ? skills : [skills];
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.error(`[Skills] Failed to load ${path}:`, err);
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Parse SKILL.md format into Skill object
|
|
204
|
+
*/
|
|
205
|
+
function parseSkillMarkdown(content, sourcePath) {
|
|
206
|
+
try {
|
|
207
|
+
// Extract frontmatter
|
|
208
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
209
|
+
if (!frontmatterMatch) {
|
|
210
|
+
console.warn(`[Skills] No frontmatter found in ${sourcePath}`);
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
const [_, frontmatter, body] = frontmatterMatch;
|
|
214
|
+
// Parse YAML-like frontmatter
|
|
215
|
+
const meta = {};
|
|
216
|
+
for (const line of frontmatter.split('\n')) {
|
|
217
|
+
const match = line.match(/^([^:]+):\s*(.*)$/);
|
|
218
|
+
if (match) {
|
|
219
|
+
const [, key, value] = match;
|
|
220
|
+
meta[key.trim()] = value.trim().replace(/^["']|["']$/g, '');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const name = meta.name || basename(dirname(sourcePath));
|
|
224
|
+
const description = meta.description || `Skill: ${name}`;
|
|
225
|
+
const risk = meta.risk || 'medium';
|
|
226
|
+
// Create a skill that returns the markdown content as context
|
|
227
|
+
return {
|
|
228
|
+
name,
|
|
229
|
+
description,
|
|
230
|
+
risk,
|
|
231
|
+
toolDefinition: {
|
|
232
|
+
type: 'function',
|
|
233
|
+
function: {
|
|
234
|
+
name,
|
|
235
|
+
description,
|
|
236
|
+
parameters: {
|
|
237
|
+
type: 'object',
|
|
238
|
+
properties: {},
|
|
239
|
+
required: [],
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
execute: async () => {
|
|
244
|
+
return {
|
|
245
|
+
content: body,
|
|
246
|
+
source: sourcePath,
|
|
247
|
+
meta,
|
|
248
|
+
};
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.error(`[Skills] Failed to parse ${sourcePath}:`, err);
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Check if object is a valid Skill
|
|
259
|
+
*/
|
|
260
|
+
function isSkill(obj) {
|
|
261
|
+
if (!obj || typeof obj !== 'object')
|
|
262
|
+
return false;
|
|
263
|
+
const skill = obj;
|
|
264
|
+
return (typeof skill.name === 'string' &&
|
|
265
|
+
typeof skill.description === 'string' &&
|
|
266
|
+
typeof skill.toolDefinition === 'object' &&
|
|
267
|
+
skill.toolDefinition !== null &&
|
|
268
|
+
typeof skill.toolDefinition.type === 'string' &&
|
|
269
|
+
['safe', 'medium', 'high'].includes(skill.risk) &&
|
|
270
|
+
typeof skill.execute === 'function');
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Load and register a skill from file
|
|
274
|
+
*/
|
|
275
|
+
async function registerSkillFile(path, hotReload = true) {
|
|
276
|
+
const fileName = basename(path, extname(path));
|
|
277
|
+
// Unregister existing
|
|
278
|
+
if (skillRegistry.has(fileName)) {
|
|
279
|
+
skillRegistry.unregister(fileName);
|
|
280
|
+
}
|
|
281
|
+
// Load new (can be single skill or array)
|
|
282
|
+
const skills = await loadSkillFile(path);
|
|
283
|
+
if (skills.length === 0) {
|
|
284
|
+
console.warn(`[Skills] No valid skill found in ${path}`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// Register each skill
|
|
288
|
+
for (const skill of skills) {
|
|
289
|
+
// Validate name - warn if doesn't match filename
|
|
290
|
+
if (skill.name !== fileName) {
|
|
291
|
+
console.warn(`[Skills] Skill name "${skill.name}" doesn't match filename "${fileName}"`);
|
|
292
|
+
}
|
|
293
|
+
skillRegistry.register({
|
|
294
|
+
name: skill.name,
|
|
295
|
+
skill,
|
|
296
|
+
source: path,
|
|
297
|
+
loadedAt: new Date(),
|
|
298
|
+
hotReload,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
// Set up hot-reload watcher
|
|
302
|
+
if (hotReload) {
|
|
303
|
+
skillRegistry.watchFile(path, () => registerSkillFile(path, hotReload));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Load all skills from a directory
|
|
308
|
+
*/
|
|
309
|
+
async function loadSkillsFromDir(dir, hotReload = true) {
|
|
310
|
+
// Check if directory exists first
|
|
311
|
+
if (!existsSync(dir)) {
|
|
312
|
+
console.log(`[Skills] Directory not found: ${dir}`);
|
|
313
|
+
return 0;
|
|
314
|
+
}
|
|
315
|
+
let count = 0;
|
|
316
|
+
try {
|
|
317
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
318
|
+
for (const entry of entries) {
|
|
319
|
+
const path = join(dir, entry.name);
|
|
320
|
+
if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js') || entry.name.endsWith('.md'))) {
|
|
321
|
+
await registerSkillFile(path, hotReload);
|
|
322
|
+
count++;
|
|
323
|
+
}
|
|
324
|
+
else if (entry.isDirectory()) {
|
|
325
|
+
// Check for SKILL.md in subdirectory
|
|
326
|
+
const skillMdPath = join(path, 'SKILL.md');
|
|
327
|
+
if (existsSync(skillMdPath)) {
|
|
328
|
+
await registerSkillFile(skillMdPath, hotReload);
|
|
329
|
+
count++;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
console.log(`[Skills] Loaded ${count} skills from ${dir}`);
|
|
334
|
+
return count;
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
console.error(`[Skills] Error loading skills from ${dir}:`, err);
|
|
338
|
+
return 0;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Initialize the skill system
|
|
343
|
+
*/
|
|
344
|
+
export async function initSkills() {
|
|
345
|
+
console.log('[Skills] Initializing...');
|
|
346
|
+
// Load built-in skills (from src/skills/builtin)
|
|
347
|
+
await loadSkillsFromDir(getBuiltInSkillsDir(), false);
|
|
348
|
+
// Load bundled skills (shipped with npm package at .agents/skills)
|
|
349
|
+
const bundledSkillsDir = getBundledSkillsDir();
|
|
350
|
+
if (existsSync(bundledSkillsDir)) {
|
|
351
|
+
await loadSkillsFromDir(bundledSkillsDir, false); // no hot-reload for bundled
|
|
352
|
+
console.log(`[Skills] Loaded bundled skills from ${bundledSkillsDir}`);
|
|
353
|
+
}
|
|
354
|
+
// Load agent-installed skills (from 'skills' CLI at ~/.agents/skills)
|
|
355
|
+
const agentSkillsDir = getAgentSkillsDir();
|
|
356
|
+
await loadSkillsFromDir(agentSkillsDir, true);
|
|
357
|
+
// Load global user skills (at ~/.0xkobold/skills)
|
|
358
|
+
await loadSkillsFromDir(getGlobalSkillsDir(), true);
|
|
359
|
+
// Load local project skills (if they exist at ./skills)
|
|
360
|
+
const localSkillsDir = getLocalSkillsDir();
|
|
361
|
+
if (existsSync(localSkillsDir)) {
|
|
362
|
+
await loadSkillsFromDir(localSkillsDir, true);
|
|
363
|
+
}
|
|
364
|
+
console.log(`[Skills] Total skills loaded: ${skillRegistry.list().length}`);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Reload all skills
|
|
368
|
+
*/
|
|
369
|
+
export async function reloadSkills() {
|
|
370
|
+
skillRegistry.clear();
|
|
371
|
+
skillRegistry.stopAllWatchers();
|
|
372
|
+
await initSkills();
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get skill registry
|
|
376
|
+
*/
|
|
377
|
+
export function getSkillRegistry() {
|
|
378
|
+
return skillRegistry;
|
|
379
|
+
}
|
|
380
|
+
// Re-export
|
|
381
|
+
export { SkillRegistry };
|
|
382
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|