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.
Files changed (274) hide show
  1. package/.env.example +11 -0
  2. package/CLAUDE.md +70 -0
  3. package/LICENSE +21 -0
  4. package/README.md +117 -0
  5. package/dist/agent/agent.d.ts +84 -0
  6. package/dist/agent/agent.d.ts.map +1 -0
  7. package/dist/agent/agent.js +233 -0
  8. package/dist/agent/agent.js.map +1 -0
  9. package/dist/agent/index.d.ts +6 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +6 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/types.d.ts +47 -0
  14. package/dist/agent/types.d.ts.map +1 -0
  15. package/dist/agent/types.js +5 -0
  16. package/dist/agent/types.js.map +1 -0
  17. package/dist/cli/components/App.d.ts +14 -0
  18. package/dist/cli/components/App.d.ts.map +1 -0
  19. package/dist/cli/components/App.js +395 -0
  20. package/dist/cli/components/App.js.map +1 -0
  21. package/dist/cli/components/CommandSuggestions.d.ts +13 -0
  22. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
  23. package/dist/cli/components/CommandSuggestions.js +32 -0
  24. package/dist/cli/components/CommandSuggestions.js.map +1 -0
  25. package/dist/cli/components/Header.d.ts +9 -0
  26. package/dist/cli/components/Header.d.ts.map +1 -0
  27. package/dist/cli/components/Header.js +13 -0
  28. package/dist/cli/components/Header.js.map +1 -0
  29. package/dist/cli/components/Input.d.ts +13 -0
  30. package/dist/cli/components/Input.d.ts.map +1 -0
  31. package/dist/cli/components/Input.js +27 -0
  32. package/dist/cli/components/Input.js.map +1 -0
  33. package/dist/cli/components/Logo.d.ts +2 -0
  34. package/dist/cli/components/Logo.d.ts.map +1 -0
  35. package/dist/cli/components/Logo.js +8 -0
  36. package/dist/cli/components/Logo.js.map +1 -0
  37. package/dist/cli/components/Messages.d.ts +37 -0
  38. package/dist/cli/components/Messages.d.ts.map +1 -0
  39. package/dist/cli/components/Messages.js +106 -0
  40. package/dist/cli/components/Messages.js.map +1 -0
  41. package/dist/cli/components/ModelSelector.d.ts +13 -0
  42. package/dist/cli/components/ModelSelector.d.ts.map +1 -0
  43. package/dist/cli/components/ModelSelector.js +72 -0
  44. package/dist/cli/components/ModelSelector.js.map +1 -0
  45. package/dist/cli/components/Spinner.d.ts +12 -0
  46. package/dist/cli/components/Spinner.d.ts.map +1 -0
  47. package/dist/cli/components/Spinner.js +45 -0
  48. package/dist/cli/components/Spinner.js.map +1 -0
  49. package/dist/cli/components/index.d.ts +12 -0
  50. package/dist/cli/components/index.d.ts.map +1 -0
  51. package/dist/cli/components/index.js +12 -0
  52. package/dist/cli/components/index.js.map +1 -0
  53. package/dist/cli/components/theme.d.ts +31 -0
  54. package/dist/cli/components/theme.d.ts.map +1 -0
  55. package/dist/cli/components/theme.js +36 -0
  56. package/dist/cli/components/theme.js.map +1 -0
  57. package/dist/cli/index-legacy.d.ts +7 -0
  58. package/dist/cli/index-legacy.d.ts.map +1 -0
  59. package/dist/cli/index-legacy.js +431 -0
  60. package/dist/cli/index-legacy.js.map +1 -0
  61. package/dist/cli/index.d.ts +7 -0
  62. package/dist/cli/index.d.ts.map +1 -0
  63. package/dist/cli/index.js +116 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/ink-cli.d.ts +7 -0
  66. package/dist/cli/ink-cli.d.ts.map +1 -0
  67. package/dist/cli/ink-cli.js +105 -0
  68. package/dist/cli/ink-cli.js.map +1 -0
  69. package/dist/cli/session-picker.d.ts +16 -0
  70. package/dist/cli/session-picker.d.ts.map +1 -0
  71. package/dist/cli/session-picker.js +280 -0
  72. package/dist/cli/session-picker.js.map +1 -0
  73. package/dist/cli/ui.d.ts +61 -0
  74. package/dist/cli/ui.d.ts.map +1 -0
  75. package/dist/cli/ui.js +364 -0
  76. package/dist/cli/ui.js.map +1 -0
  77. package/dist/config/index.d.ts +7 -0
  78. package/dist/config/index.d.ts.map +1 -0
  79. package/dist/config/index.js +6 -0
  80. package/dist/config/index.js.map +1 -0
  81. package/dist/config/manager.d.ts +31 -0
  82. package/dist/config/manager.d.ts.map +1 -0
  83. package/dist/config/manager.js +65 -0
  84. package/dist/config/manager.js.map +1 -0
  85. package/dist/config/types.d.ts +22 -0
  86. package/dist/config/types.d.ts.map +1 -0
  87. package/dist/config/types.js +6 -0
  88. package/dist/config/types.js.map +1 -0
  89. package/dist/index.d.ts +12 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +21 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/memory/index.d.ts +10 -0
  94. package/dist/memory/index.d.ts.map +1 -0
  95. package/dist/memory/index.js +9 -0
  96. package/dist/memory/index.js.map +1 -0
  97. package/dist/memory/init.d.ts +20 -0
  98. package/dist/memory/init.d.ts.map +1 -0
  99. package/dist/memory/init.js +332 -0
  100. package/dist/memory/init.js.map +1 -0
  101. package/dist/memory/manager.d.ts +85 -0
  102. package/dist/memory/manager.d.ts.map +1 -0
  103. package/dist/memory/manager.js +234 -0
  104. package/dist/memory/manager.js.map +1 -0
  105. package/dist/memory/types.d.ts +74 -0
  106. package/dist/memory/types.d.ts.map +1 -0
  107. package/dist/memory/types.js +6 -0
  108. package/dist/memory/types.js.map +1 -0
  109. package/dist/permissions/index.d.ts +7 -0
  110. package/dist/permissions/index.d.ts.map +1 -0
  111. package/dist/permissions/index.js +6 -0
  112. package/dist/permissions/index.js.map +1 -0
  113. package/dist/permissions/manager.d.ts +32 -0
  114. package/dist/permissions/manager.d.ts.map +1 -0
  115. package/dist/permissions/manager.js +79 -0
  116. package/dist/permissions/manager.js.map +1 -0
  117. package/dist/permissions/types.d.ts +14 -0
  118. package/dist/permissions/types.d.ts.map +1 -0
  119. package/dist/permissions/types.js +17 -0
  120. package/dist/permissions/types.js.map +1 -0
  121. package/dist/providers/anthropic.d.ts +20 -0
  122. package/dist/providers/anthropic.d.ts.map +1 -0
  123. package/dist/providers/anthropic.js +185 -0
  124. package/dist/providers/anthropic.js.map +1 -0
  125. package/dist/providers/gemini.d.ts +21 -0
  126. package/dist/providers/gemini.d.ts.map +1 -0
  127. package/dist/providers/gemini.js +241 -0
  128. package/dist/providers/gemini.js.map +1 -0
  129. package/dist/providers/index.d.ts +34 -0
  130. package/dist/providers/index.d.ts.map +1 -0
  131. package/dist/providers/index.js +72 -0
  132. package/dist/providers/index.js.map +1 -0
  133. package/dist/providers/openai.d.ts +19 -0
  134. package/dist/providers/openai.d.ts.map +1 -0
  135. package/dist/providers/openai.js +221 -0
  136. package/dist/providers/openai.js.map +1 -0
  137. package/dist/providers/types.d.ts +125 -0
  138. package/dist/providers/types.d.ts.map +1 -0
  139. package/dist/providers/types.js +6 -0
  140. package/dist/providers/types.js.map +1 -0
  141. package/dist/session/index.d.ts +6 -0
  142. package/dist/session/index.d.ts.map +1 -0
  143. package/dist/session/index.js +6 -0
  144. package/dist/session/index.js.map +1 -0
  145. package/dist/session/manager.d.ts +101 -0
  146. package/dist/session/manager.d.ts.map +1 -0
  147. package/dist/session/manager.js +295 -0
  148. package/dist/session/manager.js.map +1 -0
  149. package/dist/session/types.d.ts +39 -0
  150. package/dist/session/types.d.ts.map +1 -0
  151. package/dist/session/types.js +10 -0
  152. package/dist/session/types.js.map +1 -0
  153. package/dist/tools/builtin/bash.d.ts +7 -0
  154. package/dist/tools/builtin/bash.d.ts.map +1 -0
  155. package/dist/tools/builtin/bash.js +80 -0
  156. package/dist/tools/builtin/bash.js.map +1 -0
  157. package/dist/tools/builtin/edit.d.ts +7 -0
  158. package/dist/tools/builtin/edit.d.ts.map +1 -0
  159. package/dist/tools/builtin/edit.js +32 -0
  160. package/dist/tools/builtin/edit.js.map +1 -0
  161. package/dist/tools/builtin/glob.d.ts +7 -0
  162. package/dist/tools/builtin/glob.d.ts.map +1 -0
  163. package/dist/tools/builtin/glob.js +36 -0
  164. package/dist/tools/builtin/glob.js.map +1 -0
  165. package/dist/tools/builtin/grep.d.ts +7 -0
  166. package/dist/tools/builtin/grep.d.ts.map +1 -0
  167. package/dist/tools/builtin/grep.js +59 -0
  168. package/dist/tools/builtin/grep.js.map +1 -0
  169. package/dist/tools/builtin/read.d.ts +7 -0
  170. package/dist/tools/builtin/read.d.ts.map +1 -0
  171. package/dist/tools/builtin/read.js +29 -0
  172. package/dist/tools/builtin/read.js.map +1 -0
  173. package/dist/tools/builtin/write.d.ts +7 -0
  174. package/dist/tools/builtin/write.d.ts.map +1 -0
  175. package/dist/tools/builtin/write.js +24 -0
  176. package/dist/tools/builtin/write.js.map +1 -0
  177. package/dist/tools/index.d.ts +38 -0
  178. package/dist/tools/index.d.ts.map +1 -0
  179. package/dist/tools/index.js +32 -0
  180. package/dist/tools/index.js.map +1 -0
  181. package/dist/tools/registry.d.ts +22 -0
  182. package/dist/tools/registry.d.ts.map +1 -0
  183. package/dist/tools/registry.js +71 -0
  184. package/dist/tools/registry.js.map +1 -0
  185. package/dist/tools/types.d.ts +62 -0
  186. package/dist/tools/types.d.ts.map +1 -0
  187. package/dist/tools/types.js +126 -0
  188. package/dist/tools/types.js.map +1 -0
  189. package/docs/README.md +16 -0
  190. package/docs/proposals/0001-web-fetch-tool.md +293 -0
  191. package/docs/proposals/0002-web-search-tool.md +306 -0
  192. package/docs/proposals/0003-task-subagents.md +333 -0
  193. package/docs/proposals/0004-plan-mode.md +338 -0
  194. package/docs/proposals/0005-todo-system.md +299 -0
  195. package/docs/proposals/0006-memory-system.md +539 -0
  196. package/docs/proposals/0007-context-management.md +429 -0
  197. package/docs/proposals/0008-checkpointing.md +327 -0
  198. package/docs/proposals/0009-hooks-system.md +343 -0
  199. package/docs/proposals/0010-mcp-integration.md +382 -0
  200. package/docs/proposals/0011-custom-commands.md +374 -0
  201. package/docs/proposals/0012-ask-user-question.md +317 -0
  202. package/docs/proposals/0013-multi-edit-tool.md +345 -0
  203. package/docs/proposals/0014-lsp-tool.md +478 -0
  204. package/docs/proposals/0015-ls-tool.md +407 -0
  205. package/docs/proposals/0016-kill-shell-tool.md +455 -0
  206. package/docs/proposals/0017-background-tasks.md +489 -0
  207. package/docs/proposals/0018-parallel-tool-execution.md +415 -0
  208. package/docs/proposals/0019-session-enhancements.md +462 -0
  209. package/docs/proposals/0020-session-summarization.md +447 -0
  210. package/docs/proposals/0021-skills-system.md +409 -0
  211. package/docs/proposals/0022-plugin-system.md +467 -0
  212. package/docs/proposals/0023-permission-enhancements.md +470 -0
  213. package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
  214. package/docs/proposals/0025-cost-tracking.md +447 -0
  215. package/docs/proposals/0026-git-integration.md +475 -0
  216. package/docs/proposals/0027-enhanced-read-tool.md +514 -0
  217. package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
  218. package/docs/proposals/0029-notebook-edit-tool.md +413 -0
  219. package/docs/proposals/0030-plugin-marketplace.md +360 -0
  220. package/docs/proposals/0031-command-suggestions.md +295 -0
  221. package/docs/proposals/0032-ide-integrations.md +328 -0
  222. package/docs/proposals/0033-enterprise-deployment.md +221 -0
  223. package/docs/proposals/0034-sandboxing.md +273 -0
  224. package/docs/proposals/0035-auto-updater.md +311 -0
  225. package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
  226. package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
  227. package/docs/proposals/0038-interactive-cli-ui.md +373 -0
  228. package/docs/proposals/0039-streaming-enhancements.md +359 -0
  229. package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
  230. package/docs/proposals/README.md +84 -0
  231. package/docs/proposals/TEMPLATE.md +57 -0
  232. package/docs/proposals/research/claude-code-research.md +307 -0
  233. package/examples/agent-demo.ts +115 -0
  234. package/examples/basic.ts +166 -0
  235. package/package.json +50 -0
  236. package/src/agent/agent.ts +276 -0
  237. package/src/agent/index.ts +6 -0
  238. package/src/agent/types.ts +62 -0
  239. package/src/cli/components/App.tsx +565 -0
  240. package/src/cli/components/CommandSuggestions.tsx +58 -0
  241. package/src/cli/components/Header.tsx +36 -0
  242. package/src/cli/components/Input.tsx +60 -0
  243. package/src/cli/components/Logo.tsx +16 -0
  244. package/src/cli/components/Messages.tsx +210 -0
  245. package/src/cli/components/ModelSelector.tsx +135 -0
  246. package/src/cli/components/Spinner.tsx +72 -0
  247. package/src/cli/components/index.ts +21 -0
  248. package/src/cli/components/theme.ts +36 -0
  249. package/src/cli/index.tsx +136 -0
  250. package/src/config/index.ts +7 -0
  251. package/src/config/manager.ts +77 -0
  252. package/src/config/types.ts +25 -0
  253. package/src/index.ts +86 -0
  254. package/src/permissions/index.ts +7 -0
  255. package/src/permissions/manager.ts +97 -0
  256. package/src/permissions/types.ts +29 -0
  257. package/src/providers/anthropic.ts +224 -0
  258. package/src/providers/gemini.ts +295 -0
  259. package/src/providers/index.ts +97 -0
  260. package/src/providers/openai.ts +261 -0
  261. package/src/providers/types.ts +181 -0
  262. package/src/session/index.ts +6 -0
  263. package/src/session/manager.ts +354 -0
  264. package/src/session/types.ts +49 -0
  265. package/src/tools/builtin/bash.ts +92 -0
  266. package/src/tools/builtin/edit.ts +37 -0
  267. package/src/tools/builtin/glob.ts +42 -0
  268. package/src/tools/builtin/grep.ts +67 -0
  269. package/src/tools/builtin/read.ts +34 -0
  270. package/src/tools/builtin/write.ts +27 -0
  271. package/src/tools/index.ts +36 -0
  272. package/src/tools/registry.ts +83 -0
  273. package/src/tools/types.ts +172 -0
  274. 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)