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,299 @@
1
+ # Proposal: Todo System (TodoWrite Tool)
2
+
3
+ - **Proposal ID**: 0005
4
+ - **Author**: mycode team
5
+ - **Status**: Draft
6
+ - **Created**: 2025-01-15
7
+ - **Updated**: 2025-01-15
8
+
9
+ ## Summary
10
+
11
+ Implement a TodoWrite tool that enables the agent to create, track, and manage structured task lists during coding sessions. This helps users understand progress, ensures the agent doesn't forget tasks, and provides visibility into multi-step operations.
12
+
13
+ ## Motivation
14
+
15
+ Currently, mycode has no built-in task tracking. This leads to:
16
+
17
+ 1. **Lost tasks**: Agent may forget steps in complex operations
18
+ 2. **No visibility**: Users can't see what the agent plans to do
19
+ 3. **Poor planning**: No structured approach to multi-step tasks
20
+ 4. **Progress uncertainty**: Users don't know how far along the agent is
21
+ 5. **Context loss**: Important subtasks get lost in long conversations
22
+
23
+ A todo system provides structured task management visible to both agent and user.
24
+
25
+ ## Claude Code Reference
26
+
27
+ Claude Code's TodoWrite tool provides structured task management:
28
+
29
+ ### Tool Definition
30
+ ```typescript
31
+ TodoWrite({
32
+ todos: [
33
+ {
34
+ content: "Run the build", // Task description
35
+ status: "pending" | "in_progress" | "completed",
36
+ activeForm: "Running the build" // Present tense for display
37
+ }
38
+ ]
39
+ })
40
+ ```
41
+
42
+ ### Key Behaviors
43
+ - Agent creates todos when starting complex tasks
44
+ - Exactly one task should be `in_progress` at a time
45
+ - Tasks marked complete immediately after finishing
46
+ - Todo list displayed to user in UI
47
+ - Agent uses todos for planning before execution
48
+
49
+ ### Example Usage
50
+ ```
51
+ User: Fix the failing tests and update the docs
52
+
53
+ Agent: I'll create a todo list to track this work.
54
+ [TodoWrite:
55
+ - Fix failing tests (in_progress)
56
+ - Update documentation (pending)
57
+ ]
58
+
59
+ Agent: Let me run the tests first...
60
+ [After fixing tests, updates todo]
61
+ [TodoWrite:
62
+ - Fix failing tests (completed)
63
+ - Update documentation (in_progress)
64
+ ]
65
+ ```
66
+
67
+ ## Detailed Design
68
+
69
+ ### API Design
70
+
71
+ ```typescript
72
+ // src/tools/todo/types.ts
73
+ type TodoStatus = 'pending' | 'in_progress' | 'completed';
74
+
75
+ interface TodoItem {
76
+ id: string;
77
+ content: string;
78
+ activeForm: string;
79
+ status: TodoStatus;
80
+ createdAt: Date;
81
+ updatedAt: Date;
82
+ }
83
+
84
+ interface TodoList {
85
+ items: TodoItem[];
86
+ sessionId: string;
87
+ createdAt: Date;
88
+ updatedAt: Date;
89
+ }
90
+
91
+ interface TodoWriteInput {
92
+ todos: Array<{
93
+ content: string;
94
+ status: TodoStatus;
95
+ activeForm: string;
96
+ }>;
97
+ }
98
+ ```
99
+
100
+ ```typescript
101
+ // src/tools/todo/todo-tool.ts
102
+ const todoWriteTool: Tool<TodoWriteInput> = {
103
+ name: 'TodoWrite',
104
+ description: `Create and manage a structured task list for your current coding session.
105
+
106
+ Use this tool when:
107
+ - Complex multi-step tasks (3+ steps)
108
+ - User provides multiple tasks
109
+ - Non-trivial work requiring planning
110
+
111
+ Do NOT use for:
112
+ - Single straightforward tasks
113
+ - Trivial operations
114
+ - Pure informational requests
115
+
116
+ Guidelines:
117
+ - Only ONE task should be in_progress at a time
118
+ - Mark tasks completed IMMEDIATELY after finishing
119
+ - Include both content (imperative) and activeForm (present continuous)
120
+ `,
121
+ parameters: z.object({
122
+ todos: z.array(z.object({
123
+ content: z.string().min(1),
124
+ status: z.enum(['pending', 'in_progress', 'completed']),
125
+ activeForm: z.string().min(1),
126
+ }))
127
+ }),
128
+ execute: async (input, context) => { ... }
129
+ };
130
+ ```
131
+
132
+ ```typescript
133
+ // src/tools/todo/todo-manager.ts
134
+ class TodoManager {
135
+ private list: TodoList;
136
+
137
+ constructor(sessionId: string);
138
+
139
+ // Replace entire todo list
140
+ setTodos(todos: TodoWriteInput['todos']): void;
141
+
142
+ // Get current todo list
143
+ getTodos(): TodoItem[];
144
+
145
+ // Get in-progress task (should be exactly one)
146
+ getInProgress(): TodoItem | null;
147
+
148
+ // Get completion percentage
149
+ getProgress(): { completed: number; total: number; percent: number };
150
+
151
+ // Serialize for display
152
+ format(): string;
153
+ }
154
+ ```
155
+
156
+ ### Implementation Approach
157
+
158
+ 1. **Tool Registration**: Add TodoWrite to the tool registry
159
+ 2. **State Management**: Store todo list in session state
160
+ 3. **UI Integration**: Display todo list in CLI interface
161
+ 4. **Validation**: Ensure exactly one in_progress task
162
+ 5. **Persistence**: Save todo state with session
163
+
164
+ ```typescript
165
+ // Example tool execution
166
+ async function execute(input: TodoWriteInput, context: ToolContext): Promise<ToolResult> {
167
+ const manager = context.getTodoManager();
168
+
169
+ // Validate: exactly one in_progress
170
+ const inProgress = input.todos.filter(t => t.status === 'in_progress');
171
+ if (inProgress.length > 1) {
172
+ return {
173
+ success: false,
174
+ error: 'Only one task can be in_progress at a time'
175
+ };
176
+ }
177
+
178
+ manager.setTodos(input.todos);
179
+
180
+ return {
181
+ success: true,
182
+ output: `Updated todo list (${manager.getProgress().percent}% complete)`
183
+ };
184
+ }
185
+ ```
186
+
187
+ ### File Changes
188
+
189
+ | File | Action | Description |
190
+ |------|--------|-------------|
191
+ | `src/tools/todo/types.ts` | Create | Todo type definitions |
192
+ | `src/tools/todo/todo-tool.ts` | Create | TodoWrite tool implementation |
193
+ | `src/tools/todo/todo-manager.ts` | Create | Todo state management |
194
+ | `src/tools/todo/index.ts` | Create | Module exports |
195
+ | `src/tools/index.ts` | Modify | Register TodoWrite tool |
196
+ | `src/session/types.ts` | Modify | Add todo list to session state |
197
+ | `src/cli/components/TodoList.tsx` | Create | Todo list UI component |
198
+
199
+ ## User Experience
200
+
201
+ ### Todo Display
202
+ Show current todos in the CLI:
203
+
204
+ ```
205
+ ┌─ Tasks ────────────────────────────────────┐
206
+ │ ✓ Fix failing tests │
207
+ │ ▶ Updating documentation │
208
+ │ ○ Run final build verification │
209
+ │ │
210
+ │ Progress: 1/3 (33%) │
211
+ └────────────────────────────────────────────┘
212
+ ```
213
+
214
+ ### Status Indicators
215
+ - `○` - Pending (not started)
216
+ - `▶` - In Progress (currently working)
217
+ - `✓` - Completed (finished)
218
+
219
+ ### Agent Messages
220
+ When agent updates todos:
221
+
222
+ ```
223
+ 📋 Todo list updated:
224
+ ✓ Fix failing tests
225
+ ▶ Updating documentation
226
+ ○ Run final build verification
227
+ ```
228
+
229
+ ### Progress Visibility
230
+ Users see real-time progress as agent works:
231
+
232
+ ```
233
+ Agent: Starting documentation update...
234
+ [Todo: "Updating documentation" → in_progress]
235
+
236
+ Agent: Documentation updated successfully.
237
+ [Todo: "Update documentation" → completed]
238
+ [Todo: "Run final build verification" → in_progress]
239
+ ```
240
+
241
+ ## Alternatives Considered
242
+
243
+ ### Alternative 1: Simple Checklist
244
+ Plain text checklist without structured data.
245
+
246
+ **Pros**: Simpler implementation
247
+ **Cons**: No programmatic tracking, harder to display
248
+ **Decision**: Rejected - Structured data enables better UI and tracking
249
+
250
+ ### Alternative 2: Hierarchical Todos
251
+ Support nested subtasks.
252
+
253
+ **Pros**: Better organization for complex tasks
254
+ **Cons**: Added complexity, harder to track progress
255
+ **Decision**: Deferred - Start simple, add later if needed
256
+
257
+ ### Alternative 3: Persistent Todos Across Sessions
258
+ Keep todos across multiple sessions.
259
+
260
+ **Pros**: Long-term project tracking
261
+ **Cons**: Scope creep, different use case
262
+ **Decision**: Rejected - Session-scoped is cleaner for this use case
263
+
264
+ ## Security Considerations
265
+
266
+ 1. **Input Validation**: Sanitize todo content to prevent injection
267
+ 2. **Size Limits**: Limit number of todos and content length
268
+ 3. **Persistence**: Todo state stored with session, same security model
269
+
270
+ ## Testing Strategy
271
+
272
+ 1. **Unit Tests**:
273
+ - Todo validation (content, status)
274
+ - Progress calculation
275
+ - Single in_progress enforcement
276
+
277
+ 2. **Integration Tests**:
278
+ - Tool registration and execution
279
+ - Session persistence
280
+ - UI rendering
281
+
282
+ 3. **Manual Testing**:
283
+ - Multi-step task workflows
284
+ - Agent todo behavior
285
+ - UI display across terminal sizes
286
+
287
+ ## Migration Path
288
+
289
+ 1. **Phase 1**: Core TodoWrite tool implementation
290
+ 2. **Phase 2**: CLI display integration
291
+ 3. **Phase 3**: Session persistence
292
+ 4. **Phase 4**: Agent prompting to encourage todo usage
293
+
294
+ No breaking changes; existing sessions work without todos.
295
+
296
+ ## References
297
+
298
+ - [Claude Code TodoWrite Documentation](https://code.claude.com/docs/en/tools)
299
+ - [Claude Code System Prompt (TodoWrite section)](https://gist.github.com/wong2/e0f34aac66caf890a332f7b6f9e2ba8f)