gencode-ai 0.1.0
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/.env.example +11 -0
- package/CLAUDE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agent/agent.d.ts +84 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +233 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +47 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +14 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/App.js +395 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/CommandSuggestions.d.ts +13 -0
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/cli/components/CommandSuggestions.js +32 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -0
- package/dist/cli/components/Header.d.ts +9 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +13 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Input.d.ts +13 -0
- package/dist/cli/components/Input.d.ts.map +1 -0
- package/dist/cli/components/Input.js +27 -0
- package/dist/cli/components/Input.js.map +1 -0
- package/dist/cli/components/Logo.d.ts +2 -0
- package/dist/cli/components/Logo.d.ts.map +1 -0
- package/dist/cli/components/Logo.js +8 -0
- package/dist/cli/components/Logo.js.map +1 -0
- package/dist/cli/components/Messages.d.ts +37 -0
- package/dist/cli/components/Messages.d.ts.map +1 -0
- package/dist/cli/components/Messages.js +106 -0
- package/dist/cli/components/Messages.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +13 -0
- package/dist/cli/components/ModelSelector.d.ts.map +1 -0
- package/dist/cli/components/ModelSelector.js +72 -0
- package/dist/cli/components/ModelSelector.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +12 -0
- package/dist/cli/components/Spinner.d.ts.map +1 -0
- package/dist/cli/components/Spinner.js +45 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/index.d.ts +12 -0
- package/dist/cli/components/index.d.ts.map +1 -0
- package/dist/cli/components/index.js +12 -0
- package/dist/cli/components/index.js.map +1 -0
- package/dist/cli/components/theme.d.ts +31 -0
- package/dist/cli/components/theme.d.ts.map +1 -0
- package/dist/cli/components/theme.js +36 -0
- package/dist/cli/components/theme.js.map +1 -0
- package/dist/cli/index-legacy.d.ts +7 -0
- package/dist/cli/index-legacy.d.ts.map +1 -0
- package/dist/cli/index-legacy.js +431 -0
- package/dist/cli/index-legacy.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ink-cli.d.ts +7 -0
- package/dist/cli/ink-cli.d.ts.map +1 -0
- package/dist/cli/ink-cli.js +105 -0
- package/dist/cli/ink-cli.js.map +1 -0
- package/dist/cli/session-picker.d.ts +16 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +280 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/ui.d.ts +61 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +364 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +65 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/init.d.ts +20 -0
- package/dist/memory/init.d.ts.map +1 -0
- package/dist/memory/init.js +332 -0
- package/dist/memory/init.js.map +1 -0
- package/dist/memory/manager.d.ts +85 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +234 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/types.d.ts +74 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/index.d.ts +7 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +6 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +32 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +79 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +14 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +185 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +21 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +241 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +34 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +125 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +6 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +101 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +295 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +39 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +7 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +80 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +7 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +32 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +7 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +36 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +7 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +59 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +7 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +29 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +7 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +24 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +62 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +126 -0
- package/dist/tools/types.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/proposals/0001-web-fetch-tool.md +293 -0
- package/docs/proposals/0002-web-search-tool.md +306 -0
- package/docs/proposals/0003-task-subagents.md +333 -0
- package/docs/proposals/0004-plan-mode.md +338 -0
- package/docs/proposals/0005-todo-system.md +299 -0
- package/docs/proposals/0006-memory-system.md +539 -0
- package/docs/proposals/0007-context-management.md +429 -0
- package/docs/proposals/0008-checkpointing.md +327 -0
- package/docs/proposals/0009-hooks-system.md +343 -0
- package/docs/proposals/0010-mcp-integration.md +382 -0
- package/docs/proposals/0011-custom-commands.md +374 -0
- package/docs/proposals/0012-ask-user-question.md +317 -0
- package/docs/proposals/0013-multi-edit-tool.md +345 -0
- package/docs/proposals/0014-lsp-tool.md +478 -0
- package/docs/proposals/0015-ls-tool.md +407 -0
- package/docs/proposals/0016-kill-shell-tool.md +455 -0
- package/docs/proposals/0017-background-tasks.md +489 -0
- package/docs/proposals/0018-parallel-tool-execution.md +415 -0
- package/docs/proposals/0019-session-enhancements.md +462 -0
- package/docs/proposals/0020-session-summarization.md +447 -0
- package/docs/proposals/0021-skills-system.md +409 -0
- package/docs/proposals/0022-plugin-system.md +467 -0
- package/docs/proposals/0023-permission-enhancements.md +470 -0
- package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
- package/docs/proposals/0025-cost-tracking.md +447 -0
- package/docs/proposals/0026-git-integration.md +475 -0
- package/docs/proposals/0027-enhanced-read-tool.md +514 -0
- package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
- package/docs/proposals/0029-notebook-edit-tool.md +413 -0
- package/docs/proposals/0030-plugin-marketplace.md +360 -0
- package/docs/proposals/0031-command-suggestions.md +295 -0
- package/docs/proposals/0032-ide-integrations.md +328 -0
- package/docs/proposals/0033-enterprise-deployment.md +221 -0
- package/docs/proposals/0034-sandboxing.md +273 -0
- package/docs/proposals/0035-auto-updater.md +311 -0
- package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
- package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
- package/docs/proposals/0038-interactive-cli-ui.md +373 -0
- package/docs/proposals/0039-streaming-enhancements.md +359 -0
- package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
- package/docs/proposals/README.md +84 -0
- package/docs/proposals/TEMPLATE.md +57 -0
- package/docs/proposals/research/claude-code-research.md +307 -0
- package/examples/agent-demo.ts +115 -0
- package/examples/basic.ts +166 -0
- package/package.json +50 -0
- package/src/agent/agent.ts +276 -0
- package/src/agent/index.ts +6 -0
- package/src/agent/types.ts +62 -0
- package/src/cli/components/App.tsx +565 -0
- package/src/cli/components/CommandSuggestions.tsx +58 -0
- package/src/cli/components/Header.tsx +36 -0
- package/src/cli/components/Input.tsx +60 -0
- package/src/cli/components/Logo.tsx +16 -0
- package/src/cli/components/Messages.tsx +210 -0
- package/src/cli/components/ModelSelector.tsx +135 -0
- package/src/cli/components/Spinner.tsx +72 -0
- package/src/cli/components/index.ts +21 -0
- package/src/cli/components/theme.ts +36 -0
- package/src/cli/index.tsx +136 -0
- package/src/config/index.ts +7 -0
- package/src/config/manager.ts +77 -0
- package/src/config/types.ts +25 -0
- package/src/index.ts +86 -0
- package/src/permissions/index.ts +7 -0
- package/src/permissions/manager.ts +97 -0
- package/src/permissions/types.ts +29 -0
- package/src/providers/anthropic.ts +224 -0
- package/src/providers/gemini.ts +295 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/openai.ts +261 -0
- package/src/providers/types.ts +181 -0
- package/src/session/index.ts +6 -0
- package/src/session/manager.ts +354 -0
- package/src/session/types.ts +49 -0
- package/src/tools/builtin/bash.ts +92 -0
- package/src/tools/builtin/edit.ts +37 -0
- package/src/tools/builtin/glob.ts +42 -0
- package/src/tools/builtin/grep.ts +67 -0
- package/src/tools/builtin/read.ts +34 -0
- package/src/tools/builtin/write.ts +27 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/registry.ts +83 -0
- package/src/tools/types.ts +172 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# Proposal: Skills System
|
|
2
|
+
|
|
3
|
+
- **Proposal ID**: 0021
|
|
4
|
+
- **Author**: mycode team
|
|
5
|
+
- **Status**: Draft
|
|
6
|
+
- **Created**: 2025-01-15
|
|
7
|
+
- **Updated**: 2025-01-15
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
Implement a skills system that allows defining reusable, model-invoked capabilities with specialized prompts and tool configurations. Skills provide domain expertise and workflow automation that the agent can call upon when appropriate.
|
|
12
|
+
|
|
13
|
+
## Motivation
|
|
14
|
+
|
|
15
|
+
Currently, mycode has no mechanism for extending agent capabilities beyond built-in tools:
|
|
16
|
+
|
|
17
|
+
1. **No domain expertise**: Agent lacks specialized knowledge
|
|
18
|
+
2. **Repetitive prompts**: Same workflows require repeated instructions
|
|
19
|
+
3. **No customization**: Users can't add domain-specific capabilities
|
|
20
|
+
4. **Limited automation**: Complex workflows need manual steps
|
|
21
|
+
5. **No reusability**: Good patterns can't be packaged and shared
|
|
22
|
+
|
|
23
|
+
Skills enable encapsulated, reusable agent capabilities.
|
|
24
|
+
|
|
25
|
+
## Claude Code Reference
|
|
26
|
+
|
|
27
|
+
Claude Code's skills system provides model-invoked capabilities:
|
|
28
|
+
|
|
29
|
+
### Skill Structure
|
|
30
|
+
```
|
|
31
|
+
~/.claude/skills/skill-name/
|
|
32
|
+
├── SKILL.md # Skill definition with frontmatter
|
|
33
|
+
├── scripts/ # Optional helper scripts
|
|
34
|
+
└── resources/ # Optional data files
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### SKILL.md Format
|
|
38
|
+
```yaml
|
|
39
|
+
---
|
|
40
|
+
name: test-plan-generator
|
|
41
|
+
description: Generate comprehensive test plans for releases...
|
|
42
|
+
allowed-tools: [Bash, AskUserQuestion, TodoWrite, Read, Write]
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# Test Plan Generator
|
|
46
|
+
|
|
47
|
+
You are a test planning specialist...
|
|
48
|
+
|
|
49
|
+
## Core Responsibilities
|
|
50
|
+
1. Analyze test requirements
|
|
51
|
+
2. Generate structured test plans
|
|
52
|
+
3. Create Jira issues for test cases
|
|
53
|
+
|
|
54
|
+
## Workflow
|
|
55
|
+
...
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Skill vs Command vs Subagent
|
|
59
|
+
| Feature | Skill | Command | Subagent |
|
|
60
|
+
|---------|-------|---------|----------|
|
|
61
|
+
| Invocation | Model-invoked | User-invoked | Model-invoked |
|
|
62
|
+
| Context | Main conversation | Main conversation | Isolated |
|
|
63
|
+
| Use Case | Domain expertise | Quick automation | Complex workflows |
|
|
64
|
+
|
|
65
|
+
### Skill Tool
|
|
66
|
+
```typescript
|
|
67
|
+
Skill({
|
|
68
|
+
skill: "test-plan-generator",
|
|
69
|
+
args: "--release 2.0.0"
|
|
70
|
+
})
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Detailed Design
|
|
74
|
+
|
|
75
|
+
### API Design
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// src/skills/types.ts
|
|
79
|
+
interface SkillDefinition {
|
|
80
|
+
name: string;
|
|
81
|
+
description: string;
|
|
82
|
+
allowedTools?: string[];
|
|
83
|
+
systemPrompt: string;
|
|
84
|
+
metadata?: {
|
|
85
|
+
version?: string;
|
|
86
|
+
author?: string;
|
|
87
|
+
tags?: string[];
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface SkillInput {
|
|
92
|
+
skill: string; // Skill name or full path
|
|
93
|
+
args?: string; // Arguments to pass
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface SkillOutput {
|
|
97
|
+
success: boolean;
|
|
98
|
+
result?: string;
|
|
99
|
+
error?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
interface SkillRegistry {
|
|
103
|
+
skills: Map<string, SkillDefinition>;
|
|
104
|
+
skillPaths: Map<string, string>; // name -> filesystem path
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
interface SkillContext {
|
|
108
|
+
args: string;
|
|
109
|
+
cwd: string;
|
|
110
|
+
session: Session;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Skill Tool Implementation
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// src/tools/skill/skill-tool.ts
|
|
118
|
+
const skillTool: Tool<SkillInput> = {
|
|
119
|
+
name: 'Skill',
|
|
120
|
+
description: `Execute a skill within the main conversation.
|
|
121
|
+
|
|
122
|
+
Skills are specialized capabilities that provide domain expertise.
|
|
123
|
+
When the task matches a skill's purpose, invoke it to leverage
|
|
124
|
+
specialized knowledge and workflows.
|
|
125
|
+
|
|
126
|
+
Parameters:
|
|
127
|
+
- skill: The skill name (e.g., "test-plan-generator")
|
|
128
|
+
- args: Optional arguments (e.g., "--release 2.0.0")
|
|
129
|
+
|
|
130
|
+
Available skills are loaded from:
|
|
131
|
+
- ~/.mycode/skills/
|
|
132
|
+
- Project .mycode/skills/
|
|
133
|
+
- Installed plugins
|
|
134
|
+
|
|
135
|
+
Use this when the current task aligns with an available skill.
|
|
136
|
+
`,
|
|
137
|
+
parameters: z.object({
|
|
138
|
+
skill: z.string(),
|
|
139
|
+
args: z.string().optional()
|
|
140
|
+
}),
|
|
141
|
+
execute: async (input, context) => {
|
|
142
|
+
const skill = await skillRegistry.get(input.skill);
|
|
143
|
+
if (!skill) {
|
|
144
|
+
return {
|
|
145
|
+
success: false,
|
|
146
|
+
error: `Skill not found: ${input.skill}`
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Execute skill in main context
|
|
151
|
+
return await executeSkill(skill, {
|
|
152
|
+
args: input.args || '',
|
|
153
|
+
cwd: context.cwd,
|
|
154
|
+
session: context.session
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Skill Registry
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// src/skills/registry.ts
|
|
164
|
+
class SkillRegistry {
|
|
165
|
+
private skills: Map<string, SkillDefinition> = new Map();
|
|
166
|
+
private skillPaths: Map<string, string> = new Map();
|
|
167
|
+
|
|
168
|
+
constructor() {
|
|
169
|
+
this.loadSkills();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private async loadSkills(): Promise<void> {
|
|
173
|
+
// Load from multiple sources
|
|
174
|
+
await this.loadFromDirectory(expandPath('~/.mycode/skills'));
|
|
175
|
+
await this.loadFromDirectory(path.join(process.cwd(), '.mycode/skills'));
|
|
176
|
+
await this.loadFromPlugins();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private async loadFromDirectory(dir: string): Promise<void> {
|
|
180
|
+
if (!fs.existsSync(dir)) return;
|
|
181
|
+
|
|
182
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
183
|
+
for (const entry of entries) {
|
|
184
|
+
if (entry.isDirectory()) {
|
|
185
|
+
const skillPath = path.join(dir, entry.name, 'SKILL.md');
|
|
186
|
+
if (fs.existsSync(skillPath)) {
|
|
187
|
+
await this.loadSkill(skillPath);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private async loadSkill(skillPath: string): Promise<void> {
|
|
194
|
+
const content = await fs.readFile(skillPath, 'utf-8');
|
|
195
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
196
|
+
|
|
197
|
+
const skill: SkillDefinition = {
|
|
198
|
+
name: frontmatter.name,
|
|
199
|
+
description: frontmatter.description,
|
|
200
|
+
allowedTools: frontmatter['allowed-tools'],
|
|
201
|
+
systemPrompt: body,
|
|
202
|
+
metadata: {
|
|
203
|
+
version: frontmatter.version,
|
|
204
|
+
author: frontmatter.author,
|
|
205
|
+
tags: frontmatter.tags
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
this.skills.set(skill.name, skill);
|
|
210
|
+
this.skillPaths.set(skill.name, path.dirname(skillPath));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
get(name: string): SkillDefinition | undefined {
|
|
214
|
+
return this.skills.get(name);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
list(): SkillDefinition[] {
|
|
218
|
+
return Array.from(this.skills.values());
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
getPath(name: string): string | undefined {
|
|
222
|
+
return this.skillPaths.get(name);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export const skillRegistry = new SkillRegistry();
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Skill Execution
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
// src/skills/executor.ts
|
|
233
|
+
async function executeSkill(
|
|
234
|
+
skill: SkillDefinition,
|
|
235
|
+
context: SkillContext
|
|
236
|
+
): Promise<SkillOutput> {
|
|
237
|
+
// Build skill context message
|
|
238
|
+
const skillContext = `
|
|
239
|
+
## Skill Activated: ${skill.name}
|
|
240
|
+
|
|
241
|
+
${skill.systemPrompt}
|
|
242
|
+
|
|
243
|
+
## Current Context
|
|
244
|
+
- Working Directory: ${context.cwd}
|
|
245
|
+
- Arguments: ${context.args || '(none)'}
|
|
246
|
+
|
|
247
|
+
Please proceed with the skill's responsibilities.
|
|
248
|
+
`;
|
|
249
|
+
|
|
250
|
+
// Inject skill context into current conversation
|
|
251
|
+
context.session.addMessage({
|
|
252
|
+
role: 'system',
|
|
253
|
+
content: skillContext
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
return {
|
|
257
|
+
success: true,
|
|
258
|
+
result: `Skill '${skill.name}' activated. Following skill instructions.`
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### File Changes
|
|
264
|
+
|
|
265
|
+
| File | Action | Description |
|
|
266
|
+
|------|--------|-------------|
|
|
267
|
+
| `src/skills/types.ts` | Create | Type definitions |
|
|
268
|
+
| `src/skills/registry.ts` | Create | Skill loading and registry |
|
|
269
|
+
| `src/skills/executor.ts` | Create | Skill execution logic |
|
|
270
|
+
| `src/skills/parser.ts` | Create | SKILL.md parsing |
|
|
271
|
+
| `src/skills/index.ts` | Create | Module exports |
|
|
272
|
+
| `src/tools/skill/skill-tool.ts` | Create | Skill tool |
|
|
273
|
+
| `src/tools/index.ts` | Modify | Register Skill tool |
|
|
274
|
+
|
|
275
|
+
## User Experience
|
|
276
|
+
|
|
277
|
+
### Listing Available Skills
|
|
278
|
+
```
|
|
279
|
+
User: /skills
|
|
280
|
+
|
|
281
|
+
Available Skills:
|
|
282
|
+
┌────────────────────────────────────────────────────────────┐
|
|
283
|
+
│ Name Description │
|
|
284
|
+
├────────────────────────────────────────────────────────────┤
|
|
285
|
+
│ test-plan-generator Generate test plans for releases │
|
|
286
|
+
│ jira-analyzer Analyze Jira issues complexity │
|
|
287
|
+
│ pr-reviewer Review pull requests │
|
|
288
|
+
│ db-migration Database migration specialist │
|
|
289
|
+
└────────────────────────────────────────────────────────────┘
|
|
290
|
+
|
|
291
|
+
Skills are invoked automatically when relevant, or use:
|
|
292
|
+
Skill tool with skill name
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Automatic Skill Invocation
|
|
296
|
+
```
|
|
297
|
+
User: I need to create a test plan for release 2.5
|
|
298
|
+
|
|
299
|
+
Agent: This task aligns with the test-plan-generator skill.
|
|
300
|
+
Let me invoke it to provide structured test planning.
|
|
301
|
+
|
|
302
|
+
[Skill: skill="test-plan-generator", args="--release 2.5"]
|
|
303
|
+
|
|
304
|
+
[Skill activated - following test plan generation workflow]
|
|
305
|
+
|
|
306
|
+
Based on the test-plan-generator methodology:
|
|
307
|
+
|
|
308
|
+
1. First, let me analyze the release scope...
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Skill Execution with Context
|
|
312
|
+
```
|
|
313
|
+
Agent: [Skill: skill="jira-analyzer"]
|
|
314
|
+
|
|
315
|
+
┌─ Skill: jira-analyzer ────────────────────────────┐
|
|
316
|
+
│ Analyzing Jira issues for complexity assessment │
|
|
317
|
+
│ Using: Bash, Read, TodoWrite │
|
|
318
|
+
└───────────────────────────────────────────────────┘
|
|
319
|
+
|
|
320
|
+
Following the jira-analyzer workflow:
|
|
321
|
+
1. Fetching issues from the current sprint...
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Creating a New Skill
|
|
325
|
+
```
|
|
326
|
+
User: /skill create code-reviewer
|
|
327
|
+
|
|
328
|
+
Created skill template at:
|
|
329
|
+
~/.mycode/skills/code-reviewer/SKILL.md
|
|
330
|
+
|
|
331
|
+
Edit the SKILL.md file to define your skill:
|
|
332
|
+
- name: Skill identifier
|
|
333
|
+
- description: When to use this skill
|
|
334
|
+
- allowed-tools: Tools the skill can use
|
|
335
|
+
- Body: System prompt with instructions
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Alternatives Considered
|
|
339
|
+
|
|
340
|
+
### Alternative 1: Inline Prompts Only
|
|
341
|
+
Keep using system prompts without skills.
|
|
342
|
+
|
|
343
|
+
**Pros**: Simpler, no new concepts
|
|
344
|
+
**Cons**: No reusability, no packaging
|
|
345
|
+
**Decision**: Rejected - Skills enable composition
|
|
346
|
+
|
|
347
|
+
### Alternative 2: Function-based Skills
|
|
348
|
+
Skills as JavaScript functions.
|
|
349
|
+
|
|
350
|
+
**Pros**: More powerful, type-safe
|
|
351
|
+
**Cons**: Harder to create, security concerns
|
|
352
|
+
**Decision**: Rejected - Markdown is more accessible
|
|
353
|
+
|
|
354
|
+
### Alternative 3: Skills as Subagents
|
|
355
|
+
Always run skills in isolated context.
|
|
356
|
+
|
|
357
|
+
**Pros**: Clean isolation
|
|
358
|
+
**Cons**: Loses main context, slower
|
|
359
|
+
**Decision**: Rejected - Main context is valuable
|
|
360
|
+
|
|
361
|
+
## Security Considerations
|
|
362
|
+
|
|
363
|
+
1. **Tool Restrictions**: Honor allowed-tools list
|
|
364
|
+
2. **Path Validation**: Validate skill paths
|
|
365
|
+
3. **Script Execution**: Sandbox skill scripts
|
|
366
|
+
4. **Injection Prevention**: Sanitize skill content
|
|
367
|
+
5. **Resource Limits**: Limit skill execution time
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
const SKILL_LIMITS = {
|
|
371
|
+
maxPromptLength: 50000,
|
|
372
|
+
maxScriptRuntime: 60000,
|
|
373
|
+
maxScriptsPerSkill: 10
|
|
374
|
+
};
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
## Testing Strategy
|
|
378
|
+
|
|
379
|
+
1. **Unit Tests**:
|
|
380
|
+
- SKILL.md parsing
|
|
381
|
+
- Registry loading
|
|
382
|
+
- Tool filtering
|
|
383
|
+
- Context injection
|
|
384
|
+
|
|
385
|
+
2. **Integration Tests**:
|
|
386
|
+
- Full skill execution
|
|
387
|
+
- Multiple skill sources
|
|
388
|
+
- Plugin skill loading
|
|
389
|
+
|
|
390
|
+
3. **Manual Testing**:
|
|
391
|
+
- Various skill types
|
|
392
|
+
- Skill creation workflow
|
|
393
|
+
- Error handling
|
|
394
|
+
|
|
395
|
+
## Migration Path
|
|
396
|
+
|
|
397
|
+
1. **Phase 1**: Core registry and loader
|
|
398
|
+
2. **Phase 2**: Skill tool implementation
|
|
399
|
+
3. **Phase 3**: /skills CLI command
|
|
400
|
+
4. **Phase 4**: Skill creation helpers
|
|
401
|
+
5. **Phase 5**: Plugin skill integration
|
|
402
|
+
|
|
403
|
+
No breaking changes to existing functionality.
|
|
404
|
+
|
|
405
|
+
## References
|
|
406
|
+
|
|
407
|
+
- [Claude Code Skills Documentation](https://code.claude.com/docs/en/skills)
|
|
408
|
+
- [YAML Frontmatter Specification](https://jekyllrb.com/docs/front-matter/)
|
|
409
|
+
- [Plugin System Proposal (0022)](./0022-plugin-system.md)
|