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,333 @@
1
+ # Proposal: Task Tool & Subagent System
2
+
3
+ - **Proposal ID**: 0003
4
+ - **Author**: mycode team
5
+ - **Status**: Draft
6
+ - **Created**: 2025-01-15
7
+ - **Updated**: 2025-01-15
8
+
9
+ ## Summary
10
+
11
+ Implement a Task tool that launches specialized subagents to handle complex, multi-step tasks autonomously. Subagents run with separate context windows, specific tool access, and defined expertise areas, enabling efficient handling of specialized tasks without polluting the main conversation context.
12
+
13
+ ## Motivation
14
+
15
+ Currently, mycode uses a single agent for all tasks. This leads to:
16
+
17
+ 1. **Context pollution**: Complex research fills up main context
18
+ 2. **No specialization**: One agent can't optimize for different task types
19
+ 3. **No parallelism**: Tasks must run sequentially
20
+ 4. **Context overflow**: Long operations exhaust context limits
21
+ 5. **No delegation**: Can't spawn workers for independent subtasks
22
+
23
+ A subagent system enables parallel, specialized, context-isolated task execution.
24
+
25
+ ## Claude Code Reference
26
+
27
+ Claude Code's Task tool launches specialized agents with defined capabilities:
28
+
29
+ ### Tool Definition
30
+ ```typescript
31
+ Task({
32
+ description: "Explore authentication code", // Short description (3-5 words)
33
+ prompt: "Find all authentication-related files...", // Detailed task
34
+ subagent_type: "Explore", // Agent specialization
35
+ model: "haiku", // Optional: model selection
36
+ run_in_background: false // Optional: async execution
37
+ })
38
+ ```
39
+
40
+ ### Available Agent Types
41
+ | Type | Description | Tools Available |
42
+ |------|-------------|-----------------|
43
+ | `Explore` | Fast codebase exploration | Read, Glob, Grep (read-only) |
44
+ | `Plan` | Architecture and design | All read tools, no edit |
45
+ | `Bash` | Command execution | Bash only |
46
+ | `general-purpose` | Full capabilities | All tools |
47
+
48
+ ### Key Features
49
+ - Separate context window per subagent
50
+ - Constrained tool access per type
51
+ - Background execution option
52
+ - Model selection (haiku for simple, sonnet for complex)
53
+ - Resume capability with agent ID
54
+ - Parallel launch (multiple Task calls in one message)
55
+
56
+ ### Example Usage
57
+ ```
58
+ User: Find where authentication errors are handled
59
+
60
+ Agent: I'll launch an Explore agent to search the codebase.
61
+ [Task:
62
+ description: "Find auth error handling"
63
+ prompt: "Search for authentication error handling..."
64
+ subagent_type: "Explore"
65
+ ]
66
+
67
+ Explore Agent Result:
68
+ Found authentication error handling in:
69
+ - src/auth/errors.ts:45 - AuthError class
70
+ - src/middleware/auth.ts:78 - error handler
71
+ ...
72
+
73
+ Agent: Based on the exploration, authentication errors are handled in...
74
+ ```
75
+
76
+ ## Detailed Design
77
+
78
+ ### API Design
79
+
80
+ ```typescript
81
+ // src/subagents/types.ts
82
+ type SubagentType = 'Explore' | 'Plan' | 'Bash' | 'general-purpose';
83
+
84
+ interface TaskInput {
85
+ description: string; // Short description (3-5 words)
86
+ prompt: string; // Detailed task instructions
87
+ subagent_type: SubagentType;
88
+ model?: 'haiku' | 'sonnet' | 'opus';
89
+ run_in_background?: boolean;
90
+ resume?: string; // Agent ID to resume
91
+ max_turns?: number; // Max conversation turns
92
+ }
93
+
94
+ interface TaskOutput {
95
+ success: boolean;
96
+ result?: string;
97
+ agentId: string; // For resume capability
98
+ outputFile?: string; // For background tasks
99
+ error?: string;
100
+ }
101
+
102
+ interface SubagentConfig {
103
+ type: SubagentType;
104
+ allowedTools: string[];
105
+ defaultModel: string;
106
+ systemPrompt: string;
107
+ maxTurns: number;
108
+ }
109
+ ```
110
+
111
+ ```typescript
112
+ // src/subagents/task-tool.ts
113
+ const taskTool: Tool<TaskInput> = {
114
+ name: 'Task',
115
+ description: `Launch a specialized subagent for complex tasks.
116
+
117
+ Available agent types:
118
+ - Explore: Fast codebase exploration (read-only)
119
+ - Plan: Architecture design and planning
120
+ - Bash: Command execution specialist
121
+ - general-purpose: Full capabilities
122
+
123
+ Guidelines:
124
+ - Use Explore for searching/understanding code
125
+ - Use Plan for designing implementation approaches
126
+ - Use Bash for running commands
127
+ - Include 3-5 word description
128
+ - Provide detailed prompt with context
129
+ - Use haiku for simple, sonnet for complex tasks
130
+ - Launch multiple agents in parallel when possible
131
+ `,
132
+ parameters: z.object({
133
+ description: z.string().min(1),
134
+ prompt: z.string().min(1),
135
+ subagent_type: z.enum(['Explore', 'Plan', 'Bash', 'general-purpose']),
136
+ model: z.enum(['haiku', 'sonnet', 'opus']).optional(),
137
+ run_in_background: z.boolean().optional(),
138
+ resume: z.string().optional(),
139
+ max_turns: z.number().positive().optional()
140
+ }),
141
+ execute: async (input, context) => { ... }
142
+ };
143
+ ```
144
+
145
+ ```typescript
146
+ // src/subagents/subagent.ts
147
+ class Subagent {
148
+ private id: string;
149
+ private type: SubagentType;
150
+ private config: SubagentConfig;
151
+ private agent: Agent;
152
+
153
+ constructor(type: SubagentType, config?: Partial<SubagentConfig>);
154
+
155
+ // Execute task and return result
156
+ async run(prompt: string): Promise<TaskOutput>;
157
+
158
+ // Run in background, return immediately
159
+ async runInBackground(prompt: string): Promise<{ agentId: string; outputFile: string }>;
160
+
161
+ // Resume from previous execution
162
+ async resume(agentId: string): Promise<TaskOutput>;
163
+
164
+ // Get current status
165
+ getStatus(): 'running' | 'completed' | 'error';
166
+ }
167
+ ```
168
+
169
+ ### Implementation Approach
170
+
171
+ 1. **Subagent Registry**: Define configs for each agent type
172
+ 2. **Tool Filtering**: Restrict tools based on agent type
173
+ 3. **Context Isolation**: Each subagent gets fresh context
174
+ 4. **Result Aggregation**: Collect and format subagent results
175
+ 5. **Background Execution**: Spawn async workers with output files
176
+ 6. **Resume System**: Store agent state for continuation
177
+
178
+ ```typescript
179
+ // Subagent configurations
180
+ const SUBAGENT_CONFIGS: Record<SubagentType, SubagentConfig> = {
181
+ 'Explore': {
182
+ type: 'Explore',
183
+ allowedTools: ['Read', 'Glob', 'Grep', 'LS'],
184
+ defaultModel: 'haiku',
185
+ systemPrompt: 'You are a codebase exploration specialist...',
186
+ maxTurns: 10
187
+ },
188
+ 'Plan': {
189
+ type: 'Plan',
190
+ allowedTools: ['Read', 'Glob', 'Grep', 'LS', 'WebFetch'],
191
+ defaultModel: 'sonnet',
192
+ systemPrompt: 'You are a software architect designing solutions...',
193
+ maxTurns: 5
194
+ },
195
+ 'Bash': {
196
+ type: 'Bash',
197
+ allowedTools: ['Bash', 'KillShell'],
198
+ defaultModel: 'haiku',
199
+ systemPrompt: 'You are a shell command specialist...',
200
+ maxTurns: 20
201
+ },
202
+ 'general-purpose': {
203
+ type: 'general-purpose',
204
+ allowedTools: ['*'], // All tools
205
+ defaultModel: 'sonnet',
206
+ systemPrompt: 'You are a general-purpose coding assistant...',
207
+ maxTurns: 20
208
+ }
209
+ };
210
+ ```
211
+
212
+ ### File Changes
213
+
214
+ | File | Action | Description |
215
+ |------|--------|-------------|
216
+ | `src/subagents/types.ts` | Create | Subagent type definitions |
217
+ | `src/subagents/task-tool.ts` | Create | Task tool implementation |
218
+ | `src/subagents/subagent.ts` | Create | Subagent class |
219
+ | `src/subagents/configs.ts` | Create | Subagent configurations |
220
+ | `src/subagents/background-runner.ts` | Create | Background execution |
221
+ | `src/subagents/index.ts` | Create | Module exports |
222
+ | `src/tools/index.ts` | Modify | Register Task tool |
223
+ | `src/agent/agent.ts` | Modify | Support tool filtering |
224
+
225
+ ## User Experience
226
+
227
+ ### Subagent Launch Display
228
+ ```
229
+ Agent: I'll explore the codebase to understand the authentication system.
230
+
231
+ ┌─ Launching Subagent ──────────────────────────┐
232
+ │ Type: Explore │
233
+ │ Task: Find auth error handling │
234
+ │ Model: haiku │
235
+ └───────────────────────────────────────────────┘
236
+
237
+ [Explore agent working...]
238
+
239
+ ┌─ Subagent Result ─────────────────────────────┐
240
+ │ Found 3 relevant files: │
241
+ │ • src/auth/errors.ts (AuthError class) │
242
+ │ • src/middleware/auth.ts (error handler) │
243
+ │ • src/utils/auth-helpers.ts (validation) │
244
+ └───────────────────────────────────────────────┘
245
+ ```
246
+
247
+ ### Parallel Execution
248
+ ```
249
+ Agent: I'll search for both authentication and authorization code.
250
+ [Launching 2 Explore agents in parallel...]
251
+
252
+ ┌─ Agent 1: Auth ───────────────────────────────┐
253
+ │ Status: Completed │
254
+ │ Found: 5 files │
255
+ └───────────────────────────────────────────────┘
256
+
257
+ ┌─ Agent 2: Authorization ──────────────────────┐
258
+ │ Status: Completed │
259
+ │ Found: 3 files │
260
+ └───────────────────────────────────────────────┘
261
+ ```
262
+
263
+ ### Background Task
264
+ ```
265
+ Agent: I'll start a long-running analysis in the background.
266
+ [Task running in background: agent-abc123]
267
+
268
+ You can continue working. Use /task-status abc123 to check progress.
269
+ ```
270
+
271
+ ## Alternatives Considered
272
+
273
+ ### Alternative 1: Single Agent with Mode Switching
274
+ Switch modes instead of spawning agents.
275
+
276
+ **Pros**: Simpler, shared context
277
+ **Cons**: Context pollution, no parallelism
278
+ **Decision**: Rejected - Context isolation is key benefit
279
+
280
+ ### Alternative 2: Process-Based Workers
281
+ Spawn actual OS processes.
282
+
283
+ **Pros**: True isolation, crash protection
284
+ **Cons**: Overhead, complexity, IPC
285
+ **Decision**: Rejected for initial implementation
286
+
287
+ ### Alternative 3: Fixed Agent Types Only
288
+ No custom agent configurations.
289
+
290
+ **Pros**: Simpler
291
+ **Cons**: Less flexibility
292
+ **Decision**: Rejected - Custom agents enable future extensibility
293
+
294
+ ## Security Considerations
295
+
296
+ 1. **Tool Restrictions**: Strictly enforce tool allowlists
297
+ 2. **Resource Limits**: Limit max turns and execution time
298
+ 3. **Output Isolation**: Subagent can't access main context
299
+ 4. **Permission Inheritance**: Subagents respect main permission settings
300
+ 5. **Background Cleanup**: Clean up stale background tasks
301
+
302
+ ## Testing Strategy
303
+
304
+ 1. **Unit Tests**:
305
+ - Tool filtering logic
306
+ - Config validation
307
+ - Result formatting
308
+
309
+ 2. **Integration Tests**:
310
+ - Subagent lifecycle
311
+ - Background execution
312
+ - Resume functionality
313
+
314
+ 3. **Manual Testing**:
315
+ - Various agent types
316
+ - Parallel execution
317
+ - Complex multi-step tasks
318
+
319
+ ## Migration Path
320
+
321
+ 1. **Phase 1**: Core Explore and Plan agents
322
+ 2. **Phase 2**: Bash agent and background execution
323
+ 3. **Phase 3**: Resume capability
324
+ 4. **Phase 4**: Custom agent definitions
325
+ 5. **Phase 5**: Parallel execution optimization
326
+
327
+ No breaking changes to existing functionality.
328
+
329
+ ## References
330
+
331
+ - [Claude Code Task Tool Documentation](https://code.claude.com/docs/en/tools)
332
+ - [Claude Code Subagent System](https://github.com/Piebald-AI/claude-code-system-prompts)
333
+ - [Understanding Claude Code Full Stack](https://alexop.dev/posts/understanding-claude-code-full-stack/)
@@ -0,0 +1,338 @@
1
+ # Proposal: Plan Mode
2
+
3
+ - **Proposal ID**: 0004
4
+ - **Author**: mycode team
5
+ - **Status**: Draft
6
+ - **Created**: 2025-01-15
7
+ - **Updated**: 2025-01-15
8
+
9
+ ## Summary
10
+
11
+ Implement a Plan Mode that enables the agent to thoroughly explore and design implementation approaches before writing code. In plan mode, the agent can only read and explore (no edits), creates a structured plan file, and requires user approval before proceeding with implementation.
12
+
13
+ ## Motivation
14
+
15
+ Currently, mycode jumps directly into implementation. This leads to:
16
+
17
+ 1. **Wasted effort**: Implementing wrong approach requires redoing work
18
+ 2. **Misalignment**: Agent's assumptions may not match user intent
19
+ 3. **Poor architecture**: No time for design consideration
20
+ 4. **Unexpected changes**: Users surprised by what gets modified
21
+ 5. **No preview**: Can't review approach before execution
22
+
23
+ Plan mode enables careful design and user approval before changes.
24
+
25
+ ## Claude Code Reference
26
+
27
+ Claude Code's Plan Mode provides structured planning workflow:
28
+
29
+ ### Activation
30
+ ```
31
+ User: /plan (or use EnterPlanMode tool)
32
+ ```
33
+
34
+ ### Key Features
35
+ - Agent restricted to read-only tools (no Edit, Write, Bash writes)
36
+ - Structured plan written to plan file
37
+ - 5-phase workflow: Understanding → Design → Review → Final Plan → Exit
38
+ - User questions via AskUserQuestion tool
39
+ - Plan approval via ExitPlanMode tool
40
+ - Permission pre-requests for implementation
41
+
42
+ ### Plan Mode Phases
43
+ 1. **Initial Understanding**: Explore codebase, understand request
44
+ 2. **Design**: Create implementation approach
45
+ 3. **Review**: Verify alignment with user intent
46
+ 4. **Final Plan**: Write concise plan to file
47
+ 5. **Exit**: Call ExitPlanMode for approval
48
+
49
+ ### Example Usage
50
+ ```
51
+ User: /plan Add user authentication to the app
52
+
53
+ Agent: [Enters plan mode]
54
+ I'll explore the codebase to understand the current structure.
55
+ [Read, Glob, Grep - exploration]
56
+
57
+ Based on my exploration, I have a question:
58
+ [AskUserQuestion: Which auth method? OAuth/JWT/Session]
59
+
60
+ User: JWT
61
+
62
+ Agent: [Writes plan to .claude/plans/xxx.md]
63
+
64
+ ## Authentication Implementation Plan
65
+
66
+ ### Approach
67
+ - Add JWT-based authentication
68
+ - Create auth middleware
69
+ - Add login/logout endpoints
70
+
71
+ ### Files to Modify
72
+ - src/middleware/auth.ts (create)
73
+ - src/routes/auth.ts (create)
74
+ - src/models/user.ts (modify)
75
+
76
+ ### Verification
77
+ - Run test suite
78
+ - Manual login/logout test
79
+
80
+ [ExitPlanMode]
81
+
82
+ User: [Reviews and approves plan]
83
+
84
+ Agent: [Exits plan mode, begins implementation]
85
+ ```
86
+
87
+ ## Detailed Design
88
+
89
+ ### API Design
90
+
91
+ ```typescript
92
+ // src/planning/types.ts
93
+ interface PlanModeState {
94
+ active: boolean;
95
+ planFile: string;
96
+ phase: 'understanding' | 'design' | 'review' | 'final' | 'approval';
97
+ explorationResults: ExplorationResult[];
98
+ userAnswers: Record<string, string>;
99
+ }
100
+
101
+ interface PlanFile {
102
+ id: string;
103
+ title: string;
104
+ createdAt: Date;
105
+ approach: string;
106
+ files: FileChange[];
107
+ verification: string[];
108
+ permissions: PermissionRequest[];
109
+ }
110
+
111
+ interface FileChange {
112
+ path: string;
113
+ action: 'create' | 'modify' | 'delete';
114
+ description: string;
115
+ }
116
+
117
+ interface PermissionRequest {
118
+ tool: 'Bash';
119
+ prompt: string; // e.g., "run tests", "install dependencies"
120
+ }
121
+ ```
122
+
123
+ ```typescript
124
+ // src/planning/enter-plan-mode-tool.ts
125
+ const enterPlanModeTool: Tool<{}> = {
126
+ name: 'EnterPlanMode',
127
+ description: `Enter plan mode for non-trivial implementation tasks.
128
+
129
+ Use plan mode when:
130
+ - New feature implementation
131
+ - Multiple valid approaches exist
132
+ - Code modifications affect existing behavior
133
+ - Architectural decisions required
134
+ - Multi-file changes expected
135
+ - Requirements are unclear
136
+
137
+ Skip plan mode for:
138
+ - Single-line fixes
139
+ - Trivial changes
140
+ - Specific, detailed instructions given
141
+ `,
142
+ parameters: z.object({}),
143
+ execute: async (input, context) => { ... }
144
+ };
145
+ ```
146
+
147
+ ```typescript
148
+ // src/planning/exit-plan-mode-tool.ts
149
+ const exitPlanModeTool: Tool<ExitPlanModeInput> = {
150
+ name: 'ExitPlanMode',
151
+ description: `Exit plan mode and request user approval.
152
+
153
+ Call this when:
154
+ - Plan is complete and written to plan file
155
+ - Ready for user to review and approve
156
+
157
+ Include allowedPrompts to request permissions needed for implementation.
158
+ `,
159
+ parameters: z.object({
160
+ allowedPrompts: z.array(z.object({
161
+ tool: z.literal('Bash'),
162
+ prompt: z.string()
163
+ })).optional()
164
+ }),
165
+ execute: async (input, context) => { ... }
166
+ };
167
+ ```
168
+
169
+ ### Implementation Approach
170
+
171
+ 1. **Mode Management**: Track plan mode state in session
172
+ 2. **Tool Filtering**: In plan mode, only allow read tools + plan file write
173
+ 3. **Plan File**: Create structured plan at `.mycode/plans/<id>.md`
174
+ 4. **Phase Tracking**: Guide agent through planning phases
175
+ 5. **Approval Flow**: Present plan for user approval
176
+ 6. **Permission Pre-auth**: Allow requesting bash permissions upfront
177
+
178
+ ```typescript
179
+ // Plan mode tool filtering
180
+ const PLAN_MODE_ALLOWED_TOOLS = [
181
+ 'Read',
182
+ 'Glob',
183
+ 'Grep',
184
+ 'LS',
185
+ 'WebFetch',
186
+ 'WebSearch',
187
+ 'Task', // For Explore/Plan subagents
188
+ 'AskUserQuestion',
189
+ 'TodoWrite',
190
+ 'EnterPlanMode',
191
+ 'ExitPlanMode',
192
+ 'Write' // Only for plan file
193
+ ];
194
+
195
+ function filterToolsForPlanMode(tools: Tool[], planFile: string): Tool[] {
196
+ return tools.filter(tool => {
197
+ if (PLAN_MODE_ALLOWED_TOOLS.includes(tool.name)) {
198
+ if (tool.name === 'Write') {
199
+ // Only allow writing to plan file
200
+ return (input) => input.file_path === planFile;
201
+ }
202
+ return true;
203
+ }
204
+ return false;
205
+ });
206
+ }
207
+ ```
208
+
209
+ ### File Changes
210
+
211
+ | File | Action | Description |
212
+ |------|--------|-------------|
213
+ | `src/planning/types.ts` | Create | Plan mode type definitions |
214
+ | `src/planning/plan-manager.ts` | Create | Plan mode state management |
215
+ | `src/planning/enter-plan-mode-tool.ts` | Create | EnterPlanMode tool |
216
+ | `src/planning/exit-plan-mode-tool.ts` | Create | ExitPlanMode tool |
217
+ | `src/planning/plan-file.ts` | Create | Plan file read/write |
218
+ | `src/planning/index.ts` | Create | Module exports |
219
+ | `src/agent/agent.ts` | Modify | Plan mode integration |
220
+ | `src/tools/index.ts` | Modify | Register plan tools |
221
+
222
+ ## User Experience
223
+
224
+ ### Entering Plan Mode
225
+ ```
226
+ User: Help me implement user authentication
227
+
228
+ Agent: This is a non-trivial task. I'll enter plan mode to design the approach.
229
+
230
+ ┌─ Plan Mode Active ────────────────────────────┐
231
+ │ Read-only exploration enabled │
232
+ │ Plan file: .mycode/plans/auth-impl.md │
233
+ │ │
234
+ │ Phase 1/5: Understanding │
235
+ └───────────────────────────────────────────────┘
236
+
237
+ Let me explore the current codebase structure...
238
+ ```
239
+
240
+ ### Plan Display
241
+ ```
242
+ ┌─ Implementation Plan ─────────────────────────┐
243
+ │ │
244
+ │ ## JWT Authentication │
245
+ │ │
246
+ │ ### Approach │
247
+ │ - Add JWT token generation and validation │
248
+ │ - Create auth middleware for protected routes│
249
+ │ - Add user registration and login endpoints │
250
+ │ │
251
+ │ ### Files to Change │
252
+ │ + src/middleware/auth.ts (create) │
253
+ │ + src/routes/auth.ts (create) │
254
+ │ ~ src/models/user.ts (modify) │
255
+ │ ~ src/app.ts (modify) │
256
+ │ │
257
+ │ ### Verification │
258
+ │ - npm test │
259
+ │ - Manual login flow test │
260
+ │ │
261
+ └───────────────────────────────────────────────┘
262
+
263
+ Ready to proceed? [Approve] [Modify] [Cancel]
264
+ ```
265
+
266
+ ### Plan Approval
267
+ ```
268
+ User: [Approves plan]
269
+
270
+ Agent: Plan approved. Exiting plan mode and beginning implementation.
271
+
272
+ ┌─ Implementation Started ──────────────────────┐
273
+ │ Following plan: .mycode/plans/auth-impl.md │
274
+ │ Pre-approved: npm test, npm install │
275
+ └───────────────────────────────────────────────┘
276
+ ```
277
+
278
+ ## Alternatives Considered
279
+
280
+ ### Alternative 1: Inline Planning
281
+ Plan in regular output without special mode.
282
+
283
+ **Pros**: Simpler
284
+ **Cons**: No enforcement, easy to skip, no approval gate
285
+ **Decision**: Rejected - Mode provides structure and safety
286
+
287
+ ### Alternative 2: Mandatory Planning
288
+ Always require plan mode for changes.
289
+
290
+ **Pros**: Maximum safety
291
+ **Cons**: Overhead for simple tasks
292
+ **Decision**: Rejected - Optional with agent judgment is better
293
+
294
+ ### Alternative 3: External Plan Files
295
+ Store plans outside project.
296
+
297
+ **Pros**: No project pollution
298
+ **Cons**: Harder to track, no version control
299
+ **Decision**: Rejected - Project plans are versioned with project
300
+
301
+ ## Security Considerations
302
+
303
+ 1. **Tool Restrictions**: Strictly enforce read-only in plan mode
304
+ 2. **Plan File Location**: Only allow writing to designated plan directory
305
+ 3. **Permission Scope**: Pre-approved permissions are scoped and temporary
306
+ 4. **Plan Review**: User must explicitly approve before implementation
307
+
308
+ ## Testing Strategy
309
+
310
+ 1. **Unit Tests**:
311
+ - Mode state management
312
+ - Tool filtering
313
+ - Plan file formatting
314
+
315
+ 2. **Integration Tests**:
316
+ - Enter/exit flow
317
+ - Tool restriction enforcement
318
+ - Approval workflow
319
+
320
+ 3. **Manual Testing**:
321
+ - Various planning scenarios
322
+ - Phase transitions
323
+ - Plan file quality
324
+
325
+ ## Migration Path
326
+
327
+ 1. **Phase 1**: Basic plan mode with tool restrictions
328
+ 2. **Phase 2**: Plan file structure and writing
329
+ 3. **Phase 3**: User approval flow
330
+ 4. **Phase 4**: Permission pre-authorization
331
+ 5. **Phase 5**: Phase guidance and agent prompting
332
+
333
+ No breaking changes to existing functionality.
334
+
335
+ ## References
336
+
337
+ - [Claude Code Plan Mode Documentation](https://code.claude.com/docs/en/planning)
338
+ - [Claude Code Best Practices - Explore, Plan, Code](https://www.anthropic.com/engineering/claude-code-best-practices)