gencode-ai 0.1.1 → 0.1.2

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 (263) hide show
  1. package/.gencode/settings.local.json +7 -0
  2. package/README.md +11 -11
  3. package/dist/agent/agent.d.ts +42 -1
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +82 -15
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/cli/components/App.d.ts +8 -1
  8. package/dist/cli/components/App.d.ts.map +1 -1
  9. package/dist/cli/components/App.js +231 -29
  10. package/dist/cli/components/App.js.map +1 -1
  11. package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
  12. package/dist/cli/components/CommandSuggestions.js +2 -0
  13. package/dist/cli/components/CommandSuggestions.js.map +1 -1
  14. package/dist/cli/components/Header.d.ts +1 -1
  15. package/dist/cli/components/Header.d.ts.map +1 -1
  16. package/dist/cli/components/Header.js +4 -6
  17. package/dist/cli/components/Header.js.map +1 -1
  18. package/dist/cli/components/Logo.d.ts +1 -0
  19. package/dist/cli/components/Logo.d.ts.map +1 -1
  20. package/dist/cli/components/Logo.js +16 -3
  21. package/dist/cli/components/Logo.js.map +1 -1
  22. package/dist/cli/components/Messages.d.ts +4 -4
  23. package/dist/cli/components/Messages.d.ts.map +1 -1
  24. package/dist/cli/components/Messages.js +51 -25
  25. package/dist/cli/components/Messages.js.map +1 -1
  26. package/dist/cli/components/PermissionPrompt.d.ts +60 -0
  27. package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
  28. package/dist/cli/components/PermissionPrompt.js +192 -0
  29. package/dist/cli/components/PermissionPrompt.js.map +1 -0
  30. package/dist/cli/components/ProviderManager.js +3 -3
  31. package/dist/cli/components/ProviderManager.js.map +1 -1
  32. package/dist/cli/components/Spinner.d.ts +7 -2
  33. package/dist/cli/components/Spinner.d.ts.map +1 -1
  34. package/dist/cli/components/Spinner.js +116 -25
  35. package/dist/cli/components/Spinner.js.map +1 -1
  36. package/dist/cli/components/TodoList.d.ts +7 -0
  37. package/dist/cli/components/TodoList.d.ts.map +1 -0
  38. package/dist/cli/components/TodoList.js +34 -0
  39. package/dist/cli/components/TodoList.js.map +1 -0
  40. package/dist/cli/components/index.d.ts +1 -0
  41. package/dist/cli/components/index.d.ts.map +1 -1
  42. package/dist/cli/components/index.js +1 -0
  43. package/dist/cli/components/index.js.map +1 -1
  44. package/dist/cli/index.js +47 -7
  45. package/dist/cli/index.js.map +1 -1
  46. package/dist/config/index.d.ts +13 -4
  47. package/dist/config/index.d.ts.map +1 -1
  48. package/dist/config/index.js +18 -3
  49. package/dist/config/index.js.map +1 -1
  50. package/dist/config/levels.d.ts +49 -0
  51. package/dist/config/levels.d.ts.map +1 -0
  52. package/dist/config/levels.js +222 -0
  53. package/dist/config/levels.js.map +1 -0
  54. package/dist/config/loader.d.ts +46 -0
  55. package/dist/config/loader.d.ts.map +1 -0
  56. package/dist/config/loader.js +153 -0
  57. package/dist/config/loader.js.map +1 -0
  58. package/dist/config/manager.d.ts +115 -15
  59. package/dist/config/manager.d.ts.map +1 -1
  60. package/dist/config/manager.js +260 -34
  61. package/dist/config/manager.js.map +1 -1
  62. package/dist/config/manager.test.d.ts +5 -0
  63. package/dist/config/manager.test.d.ts.map +1 -0
  64. package/dist/config/manager.test.js +192 -0
  65. package/dist/config/manager.test.js.map +1 -0
  66. package/dist/config/merger.d.ts +56 -0
  67. package/dist/config/merger.d.ts.map +1 -0
  68. package/dist/config/merger.js +177 -0
  69. package/dist/config/merger.js.map +1 -0
  70. package/dist/config/test-utils.d.ts +24 -0
  71. package/dist/config/test-utils.d.ts.map +1 -0
  72. package/dist/config/test-utils.js +55 -0
  73. package/dist/config/test-utils.js.map +1 -0
  74. package/dist/config/types.d.ts +78 -9
  75. package/dist/config/types.d.ts.map +1 -1
  76. package/dist/config/types.js +52 -2
  77. package/dist/config/types.js.map +1 -1
  78. package/dist/memory/import-resolver.d.ts +46 -0
  79. package/dist/memory/import-resolver.d.ts.map +1 -0
  80. package/dist/memory/import-resolver.js +117 -0
  81. package/dist/memory/import-resolver.js.map +1 -0
  82. package/dist/memory/index.d.ts +7 -6
  83. package/dist/memory/index.d.ts.map +1 -1
  84. package/dist/memory/index.js +7 -5
  85. package/dist/memory/index.js.map +1 -1
  86. package/dist/memory/init-prompt.d.ts +22 -0
  87. package/dist/memory/init-prompt.d.ts.map +1 -0
  88. package/dist/memory/init-prompt.js +103 -0
  89. package/dist/memory/init-prompt.js.map +1 -0
  90. package/dist/memory/memory-manager.d.ts +119 -0
  91. package/dist/memory/memory-manager.d.ts.map +1 -0
  92. package/dist/memory/memory-manager.js +587 -0
  93. package/dist/memory/memory-manager.js.map +1 -0
  94. package/dist/memory/rules-parser.d.ts +38 -0
  95. package/dist/memory/rules-parser.d.ts.map +1 -0
  96. package/dist/memory/rules-parser.js +69 -0
  97. package/dist/memory/rules-parser.js.map +1 -0
  98. package/dist/memory/test-utils.d.ts +20 -0
  99. package/dist/memory/test-utils.d.ts.map +1 -0
  100. package/dist/memory/test-utils.js +44 -0
  101. package/dist/memory/test-utils.js.map +1 -0
  102. package/dist/memory/types.d.ts +70 -63
  103. package/dist/memory/types.d.ts.map +1 -1
  104. package/dist/memory/types.js +42 -2
  105. package/dist/memory/types.js.map +1 -1
  106. package/dist/permissions/audit.d.ts +82 -0
  107. package/dist/permissions/audit.d.ts.map +1 -0
  108. package/dist/permissions/audit.js +229 -0
  109. package/dist/permissions/audit.js.map +1 -0
  110. package/dist/permissions/index.d.ts +11 -1
  111. package/dist/permissions/index.d.ts.map +1 -1
  112. package/dist/permissions/index.js +15 -0
  113. package/dist/permissions/index.js.map +1 -1
  114. package/dist/permissions/manager.d.ts +149 -13
  115. package/dist/permissions/manager.d.ts.map +1 -1
  116. package/dist/permissions/manager.js +480 -35
  117. package/dist/permissions/manager.js.map +1 -1
  118. package/dist/permissions/manager.test.d.ts +5 -0
  119. package/dist/permissions/manager.test.d.ts.map +1 -0
  120. package/dist/permissions/manager.test.js +213 -0
  121. package/dist/permissions/manager.test.js.map +1 -0
  122. package/dist/permissions/persistence.d.ts +74 -0
  123. package/dist/permissions/persistence.d.ts.map +1 -0
  124. package/dist/permissions/persistence.js +248 -0
  125. package/dist/permissions/persistence.js.map +1 -0
  126. package/dist/permissions/persistence.test.d.ts +5 -0
  127. package/dist/permissions/persistence.test.d.ts.map +1 -0
  128. package/dist/permissions/persistence.test.js +171 -0
  129. package/dist/permissions/persistence.test.js.map +1 -0
  130. package/dist/permissions/prompt-matcher.d.ts +64 -0
  131. package/dist/permissions/prompt-matcher.d.ts.map +1 -0
  132. package/dist/permissions/prompt-matcher.js +415 -0
  133. package/dist/permissions/prompt-matcher.js.map +1 -0
  134. package/dist/permissions/prompt-matcher.test.d.ts +5 -0
  135. package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
  136. package/dist/permissions/prompt-matcher.test.js +107 -0
  137. package/dist/permissions/prompt-matcher.test.js.map +1 -0
  138. package/dist/permissions/types.d.ts +157 -0
  139. package/dist/permissions/types.d.ts.map +1 -1
  140. package/dist/permissions/types.js +43 -8
  141. package/dist/permissions/types.js.map +1 -1
  142. package/dist/prompts/index.d.ts +92 -0
  143. package/dist/prompts/index.d.ts.map +1 -0
  144. package/dist/prompts/index.js +241 -0
  145. package/dist/prompts/index.js.map +1 -0
  146. package/dist/tools/builtin/bash.d.ts.map +1 -1
  147. package/dist/tools/builtin/bash.js +2 -1
  148. package/dist/tools/builtin/bash.js.map +1 -1
  149. package/dist/tools/builtin/edit.d.ts.map +1 -1
  150. package/dist/tools/builtin/edit.js +2 -1
  151. package/dist/tools/builtin/edit.js.map +1 -1
  152. package/dist/tools/builtin/glob.d.ts.map +1 -1
  153. package/dist/tools/builtin/glob.js +2 -1
  154. package/dist/tools/builtin/glob.js.map +1 -1
  155. package/dist/tools/builtin/grep.d.ts.map +1 -1
  156. package/dist/tools/builtin/grep.js +2 -1
  157. package/dist/tools/builtin/grep.js.map +1 -1
  158. package/dist/tools/builtin/read.d.ts.map +1 -1
  159. package/dist/tools/builtin/read.js +2 -1
  160. package/dist/tools/builtin/read.js.map +1 -1
  161. package/dist/tools/builtin/todowrite.d.ts +15 -0
  162. package/dist/tools/builtin/todowrite.d.ts.map +1 -0
  163. package/dist/tools/builtin/todowrite.js +88 -0
  164. package/dist/tools/builtin/todowrite.js.map +1 -0
  165. package/dist/tools/builtin/webfetch.d.ts.map +1 -1
  166. package/dist/tools/builtin/webfetch.js +2 -5
  167. package/dist/tools/builtin/webfetch.js.map +1 -1
  168. package/dist/tools/builtin/websearch.d.ts.map +1 -1
  169. package/dist/tools/builtin/websearch.js +2 -16
  170. package/dist/tools/builtin/websearch.js.map +1 -1
  171. package/dist/tools/builtin/write.d.ts.map +1 -1
  172. package/dist/tools/builtin/write.js +2 -1
  173. package/dist/tools/builtin/write.js.map +1 -1
  174. package/dist/tools/index.d.ts +7 -0
  175. package/dist/tools/index.d.ts.map +1 -1
  176. package/dist/tools/index.js +4 -0
  177. package/dist/tools/index.js.map +1 -1
  178. package/dist/tools/types.d.ts +22 -0
  179. package/dist/tools/types.d.ts.map +1 -1
  180. package/dist/tools/types.js +8 -0
  181. package/dist/tools/types.js.map +1 -1
  182. package/docs/config-system-comparison.md +707 -0
  183. package/docs/memory-system.md +238 -0
  184. package/docs/permissions.md +368 -0
  185. package/docs/proposals/0005-todo-system.md +350 -85
  186. package/docs/proposals/0006-memory-system.md +11 -10
  187. package/docs/proposals/0012-ask-user-question.md +941 -206
  188. package/docs/proposals/0023-permission-enhancements.md +61 -2
  189. package/docs/proposals/0041-configuration-system.md +33 -2
  190. package/docs/proposals/0042-prompt-optimization.md +866 -0
  191. package/docs/proposals/README.md +6 -5
  192. package/jest.config.js +26 -0
  193. package/package.json +8 -2
  194. package/src/agent/agent.ts +111 -16
  195. package/src/cli/components/App.tsx +309 -36
  196. package/src/cli/components/CommandSuggestions.tsx +2 -0
  197. package/src/cli/components/Header.tsx +11 -17
  198. package/src/cli/components/Logo.tsx +76 -9
  199. package/src/cli/components/Messages.tsx +73 -53
  200. package/src/cli/components/PermissionPrompt.tsx +388 -0
  201. package/src/cli/components/ProviderManager.tsx +5 -5
  202. package/src/cli/components/Spinner.tsx +138 -25
  203. package/src/cli/components/TodoList.tsx +54 -0
  204. package/src/cli/components/index.ts +6 -0
  205. package/src/cli/index.tsx +54 -6
  206. package/src/config/index.ts +78 -4
  207. package/src/config/levels.test.ts +163 -0
  208. package/src/config/levels.ts +285 -0
  209. package/src/config/loader.test.ts +120 -0
  210. package/src/config/loader.ts +178 -0
  211. package/src/config/manager.test.ts +215 -0
  212. package/src/config/manager.ts +328 -40
  213. package/src/config/merger.test.ts +360 -0
  214. package/src/config/merger.ts +221 -0
  215. package/src/config/test-utils.ts +79 -0
  216. package/src/config/types.ts +152 -9
  217. package/src/memory/import-resolver.test.ts +117 -0
  218. package/src/memory/import-resolver.ts +149 -0
  219. package/src/memory/index.ts +11 -0
  220. package/src/memory/init-prompt.ts +113 -0
  221. package/src/memory/memory-manager.test.ts +198 -0
  222. package/src/memory/memory-manager.ts +716 -0
  223. package/src/memory/rules-parser.test.ts +182 -0
  224. package/src/memory/rules-parser.ts +82 -0
  225. package/src/memory/test-utils.ts +60 -0
  226. package/src/memory/types.ts +119 -0
  227. package/src/permissions/audit.ts +284 -0
  228. package/src/permissions/index.ts +20 -1
  229. package/src/permissions/manager.test.ts +260 -0
  230. package/src/permissions/manager.ts +592 -40
  231. package/src/permissions/persistence.test.ts +220 -0
  232. package/src/permissions/persistence.ts +301 -0
  233. package/src/permissions/prompt-matcher.test.ts +213 -0
  234. package/src/permissions/prompt-matcher.ts +472 -0
  235. package/src/permissions/types.ts +236 -8
  236. package/src/prompts/index.test.ts +279 -0
  237. package/src/prompts/index.ts +306 -0
  238. package/src/prompts/system/anthropic.txt +29 -0
  239. package/src/prompts/system/base.txt +124 -0
  240. package/src/prompts/system/gemini.txt +35 -0
  241. package/src/prompts/system/generic.txt +128 -0
  242. package/src/prompts/system/openai.txt +29 -0
  243. package/src/prompts/tools/bash.txt +60 -0
  244. package/src/prompts/tools/edit.txt +29 -0
  245. package/src/prompts/tools/glob.txt +35 -0
  246. package/src/prompts/tools/grep.txt +43 -0
  247. package/src/prompts/tools/read.txt +22 -0
  248. package/src/prompts/tools/todowrite.txt +71 -0
  249. package/src/prompts/tools/webfetch.txt +34 -0
  250. package/src/prompts/tools/websearch.txt +41 -0
  251. package/src/prompts/tools/write.txt +23 -0
  252. package/src/tools/builtin/bash.ts +2 -1
  253. package/src/tools/builtin/edit.ts +2 -1
  254. package/src/tools/builtin/glob.ts +2 -1
  255. package/src/tools/builtin/grep.ts +2 -1
  256. package/src/tools/builtin/read.ts +2 -1
  257. package/src/tools/builtin/todowrite.ts +102 -0
  258. package/src/tools/builtin/webfetch.ts +2 -5
  259. package/src/tools/builtin/websearch.ts +2 -16
  260. package/src/tools/builtin/write.ts +2 -1
  261. package/src/tools/index.ts +4 -0
  262. package/src/tools/types.ts +12 -0
  263. package/tsconfig.json +1 -1
@@ -2,9 +2,10 @@
2
2
 
3
3
  - **Proposal ID**: 0005
4
4
  - **Author**: mycode team
5
- - **Status**: Draft
5
+ - **Status**: Implemented
6
6
  - **Created**: 2025-01-15
7
- - **Updated**: 2025-01-15
7
+ - **Updated**: 2025-01-16
8
+ - **Implemented**: 2025-01-16
8
9
 
9
10
  ## Summary
10
11
 
@@ -12,7 +13,7 @@ Implement a TodoWrite tool that enables the agent to create, track, and manage s
12
13
 
13
14
  ## Motivation
14
15
 
15
- Currently, mycode has no built-in task tracking. This leads to:
16
+ Currently, gencode has no built-in task tracking. This leads to:
16
17
 
17
18
  1. **Lost tasks**: Agent may forget steps in complex operations
18
19
  2. **No visibility**: Users can't see what the agent plans to do
@@ -22,29 +23,83 @@ Currently, mycode has no built-in task tracking. This leads to:
22
23
 
23
24
  A todo system provides structured task management visible to both agent and user.
24
25
 
26
+ ## Core Design Insight: Dual Purpose
27
+
28
+ TodoWrite serves **two critical purposes**:
29
+
30
+ ### 1. User Visibility (UI Update)
31
+ - Show task progress in CLI
32
+ - Let users understand what agent is doing
33
+ - Display completion percentage
34
+
35
+ ### 2. Model's External Memory (More Important)
36
+
37
+ LLMs have no persistent memory across turns. In long conversations:
38
+
39
+ ```
40
+ Turn 1: "I'll do A, B, then C" ← In model's context
41
+ Turn 5: [many tool calls...]
42
+ Turn 10: "Wait, what was I doing?" ← Context faded, forgot the plan
43
+ ```
44
+
45
+ TodoWrite solves this by **externalizing the plan**:
46
+
47
+ ```
48
+ Turn 1: TodoWrite([A, B, C])
49
+
50
+ Returns: "[>] A [ ] B [ ] C (0/3)"
51
+
52
+ Turn 10: Model sees previous tool result in context:
53
+ "[x] A [>] B [ ] C (1/3)"
54
+
55
+ "I completed A, now working on B"
56
+ ```
57
+
58
+ The rendered todo list in tool results acts as a **structured self-reminder** that persists across conversation turns.
59
+
60
+ > "Structure constrains AND enables." - The todo constraints (max items, one in_progress) enable reliable plan tracking.
61
+
25
62
  ## Claude Code Reference
26
63
 
27
64
  Claude Code's TodoWrite tool provides structured task management:
28
65
 
29
- ### Tool Definition
66
+ ### Tool Definition (from Claude Code Tools.json)
30
67
  ```typescript
31
68
  TodoWrite({
32
69
  todos: [
33
70
  {
34
- content: "Run the build", // Task description
35
- status: "pending" | "in_progress" | "completed",
36
- activeForm: "Running the build" // Present tense for display
71
+ content: "Run the build", // Task description (required)
72
+ status: "pending" | "in_progress" | "completed", // Task status (required)
73
+ id: "unique-id" // Unique identifier (required)
37
74
  }
38
75
  ]
39
76
  })
40
77
  ```
41
78
 
79
+ ### Key Design Principles (from learn-claude-code)
80
+
81
+ | Rule | Why |
82
+ |------|-----|
83
+ | Max 20 items | Prevents infinite task lists |
84
+ | One in_progress | Forces focus on one thing at a time |
85
+ | Required fields | Ensures structured output |
86
+
87
+ > "Structure constrains AND enables." - Todo constraints enable visible plans and tracked progress.
88
+
42
89
  ### Key Behaviors
43
- - Agent creates todos when starting complex tasks
90
+ - Agent creates todos when starting complex tasks (3+ steps)
44
91
  - Exactly one task should be `in_progress` at a time
45
92
  - Tasks marked complete immediately after finishing
46
93
  - Todo list displayed to user in UI
47
- - Agent uses todos for planning before execution
94
+ - Model sends complete new list each time (not a diff)
95
+ - System returns rendered view for model to see its own plan
96
+
97
+ ### System Reminders (Soft Prompts)
98
+ Claude Code uses reminder injection to encourage todo usage:
99
+ ```
100
+ INITIAL_REMINDER = "<reminder>Use TodoWrite for multi-step tasks.</reminder>"
101
+ NAG_REMINDER = "<reminder>10+ turns without todo update. Please update todos.</reminder>"
102
+ ```
48
103
 
49
104
  ### Example Usage
50
105
  ```
@@ -64,46 +119,163 @@ Agent: Let me run the tests first...
64
119
  ]
65
120
  ```
66
121
 
122
+ ## Architecture Flow Diagram
123
+
124
+ ```
125
+ ┌─────────────────────────────────────────────────────────────────────────┐
126
+ │ TodoWrite System Flow │
127
+ └─────────────────────────────────────────────────────────────────────────┘
128
+
129
+ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
130
+ │ User │ │ Agent │ │ TodoManager │
131
+ │ Input │────▶│ Loop │────▶│ (State) │
132
+ └──────────────┘ └──────────────┘ └──────────────┘
133
+ │ │
134
+ ▼ ▼
135
+ ┌──────────────┐ ┌──────────────┐
136
+ │ TodoWrite │────▶│ Validate │
137
+ │ Tool │ │ & Store │
138
+ └──────────────┘ └──────────────┘
139
+ │ │
140
+ ▼ ▼
141
+ ┌──────────────┐ ┌──────────────┐
142
+ │ Return │◀────│ Render │
143
+ │ Result │ │ Todos │
144
+ └──────────────┘ └──────────────┘
145
+
146
+
147
+ ┌──────────────┐
148
+ │ CLI UI │
149
+ │ Display │
150
+ └──────────────┘
151
+
152
+ Detailed Flow:
153
+ ==============
154
+
155
+ 1. USER INPUT
156
+
157
+
158
+ 2. AGENT DECIDES (complex task? 3+ steps?)
159
+
160
+ ├─ No ──▶ Execute directly without todos
161
+
162
+ └─ Yes ──▶ Call TodoWrite to create task list
163
+
164
+
165
+ 3. TODOWRITE TOOL EXECUTION
166
+
167
+ ├─ Validate input schema (Zod)
168
+ ├─ Check constraints:
169
+ │ ├─ Max 20 items
170
+ │ ├─ Only 1 in_progress
171
+ │ └─ Required fields present
172
+
173
+ ├─ Store in TodoManager
174
+
175
+ └─ Return rendered text:
176
+ "[>] Fix tests <- Fixing failing tests
177
+ [ ] Update docs
178
+ (0/2 completed)"
179
+
180
+
181
+ 4. AGENT SEES RESULT (its own plan visible)
182
+
183
+
184
+ 5. AGENT WORKS ON TASK
185
+
186
+ ├─ Execute tools (Bash, Edit, etc.)
187
+
188
+ └─ Update todo status via TodoWrite
189
+
190
+
191
+ 6. CLI DISPLAYS PROGRESS
192
+
193
+ ├─ Show todo box in UI
194
+ └─ Update in real-time
195
+
196
+ 7. REPEAT until all tasks completed
197
+ ```
198
+
199
+ ## State Management Flow
200
+
201
+ ```
202
+ ┌─────────────────────────────────────────────────────────────────────────┐
203
+ │ Todo State Lifecycle │
204
+ └─────────────────────────────────────────────────────────────────────────┘
205
+
206
+ Session Start Session End
207
+ │ │
208
+ ▼ ▼
209
+ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
210
+ │ Empty │───▶│ Active │───▶│ Complete │───▶│ Saved │
211
+ │ State │ │ Todos │ │ All │ │ (Session)│
212
+ └──────────┘ └──────────┘ └──────────┘ └──────────┘
213
+
214
+ │ TodoWrite calls
215
+
216
+ ┌──────────────┐
217
+ │ Replace │
218
+ │ All Todos │ (Not incremental - full replacement)
219
+ └──────────────┘
220
+
221
+ Todo Item States:
222
+ =================
223
+ ┌─────────┐ ┌─────────────┐ ┌───────────┐
224
+ │ pending │────▶│ in_progress │────▶│ completed │
225
+ └─────────┘ └─────────────┘ └───────────┘
226
+ ○ ▶ ✓
227
+ ```
228
+
67
229
  ## Detailed Design
68
230
 
69
231
  ### API Design
70
232
 
71
233
  ```typescript
72
- // src/tools/todo/types.ts
234
+ // src/tools/builtin/todo.ts - Types
73
235
  type TodoStatus = 'pending' | 'in_progress' | 'completed';
74
236
 
75
237
  interface TodoItem {
76
- id: string;
77
- content: string;
78
- activeForm: string;
79
- status: TodoStatus;
80
- createdAt: Date;
81
- updatedAt: Date;
238
+ content: string; // Task description (imperative form)
239
+ status: TodoStatus; // Current state
240
+ activeForm: string; // Present tense for display (e.g., "Running tests")
82
241
  }
83
242
 
84
- interface TodoList {
85
- items: TodoItem[];
86
- sessionId: string;
87
- createdAt: Date;
88
- updatedAt: Date;
243
+ interface TodoWriteInput {
244
+ todos: TodoItem[]; // Complete list (replaces existing)
89
245
  }
90
246
 
91
- interface TodoWriteInput {
92
- todos: Array<{
93
- content: string;
94
- status: TodoStatus;
95
- activeForm: string;
96
- }>;
247
+ interface TodoState {
248
+ items: TodoItem[];
249
+ updatedAt: Date;
97
250
  }
98
251
  ```
99
252
 
253
+ ### Tool Implementation
254
+
100
255
  ```typescript
101
- // src/tools/todo/todo-tool.ts
102
- const todoWriteTool: Tool<TodoWriteInput> = {
256
+ // src/tools/builtin/todo.ts
257
+ import { z } from 'zod';
258
+ import type { Tool, ToolContext, ToolResult } from '../types.js';
259
+
260
+ // Validation constraints (matching Claude Code)
261
+ const MAX_TODOS = 20;
262
+ const MAX_CONTENT_LENGTH = 500;
263
+
264
+ const TodoItemSchema = z.object({
265
+ content: z.string().min(1).max(MAX_CONTENT_LENGTH),
266
+ status: z.enum(['pending', 'in_progress', 'completed']),
267
+ activeForm: z.string().min(1).max(MAX_CONTENT_LENGTH),
268
+ });
269
+
270
+ const TodoWriteInputSchema = z.object({
271
+ todos: z.array(TodoItemSchema).max(MAX_TODOS),
272
+ });
273
+
274
+ export const todoWriteTool: Tool = {
103
275
  name: 'TodoWrite',
104
- description: `Create and manage a structured task list for your current coding session.
276
+ description: `Create and manage a structured task list for your coding session.
105
277
 
106
- Use this tool when:
278
+ Use when:
107
279
  - Complex multi-step tasks (3+ steps)
108
280
  - User provides multiple tasks
109
281
  - Non-trivial work requiring planning
@@ -116,71 +288,87 @@ Do NOT use for:
116
288
  Guidelines:
117
289
  - Only ONE task should be in_progress at a time
118
290
  - 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
- ```
291
+ - Include both content (imperative) and activeForm (present continuous)`,
292
+
293
+ parameters: TodoWriteInputSchema,
294
+
295
+ execute: async (input: TodoWriteInput, context: ToolContext): Promise<ToolResult> => {
296
+ // Validate: only one in_progress
297
+ const inProgress = input.todos.filter(t => t.status === 'in_progress');
298
+ if (inProgress.length > 1) {
299
+ return {
300
+ success: false,
301
+ output: '',
302
+ error: 'Only one task can be in_progress at a time',
303
+ };
304
+ }
131
305
 
132
- ```typescript
133
- // src/tools/todo/todo-manager.ts
134
- class TodoManager {
135
- private list: TodoList;
306
+ // Store in context (will be managed by TodoManager)
307
+ context.setTodos(input.todos);
136
308
 
137
- constructor(sessionId: string);
309
+ // Render for model to see its own plan
310
+ const rendered = renderTodos(input.todos);
138
311
 
139
- // Replace entire todo list
140
- setTodos(todos: TodoWriteInput['todos']): void;
312
+ return {
313
+ success: true,
314
+ output: rendered,
315
+ };
316
+ },
317
+ };
141
318
 
142
- // Get current todo list
143
- getTodos(): TodoItem[];
319
+ // Render todos as text (returned to model)
320
+ function renderTodos(todos: TodoItem[]): string {
321
+ if (todos.length === 0) {
322
+ return 'No todos.';
323
+ }
144
324
 
145
- // Get in-progress task (should be exactly one)
146
- getInProgress(): TodoItem | null;
325
+ const lines = todos.map(item => {
326
+ switch (item.status) {
327
+ case 'completed':
328
+ return `[x] ${item.content}`;
329
+ case 'in_progress':
330
+ return `[>] ${item.content} <- ${item.activeForm}`;
331
+ default:
332
+ return `[ ] ${item.content}`;
333
+ }
334
+ });
147
335
 
148
- // Get completion percentage
149
- getProgress(): { completed: number; total: number; percent: number };
336
+ const completed = todos.filter(t => t.status === 'completed').length;
337
+ lines.push(`\n(${completed}/${todos.length} completed)`);
150
338
 
151
- // Serialize for display
152
- format(): string;
339
+ return lines.join('\n');
153
340
  }
154
341
  ```
155
342
 
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
343
+ ### TodoManager (State Management)
163
344
 
164
345
  ```typescript
165
- // Example tool execution
166
- async function execute(input: TodoWriteInput, context: ToolContext): Promise<ToolResult> {
167
- const manager = context.getTodoManager();
346
+ // src/todo/todo-manager.ts
347
+ export class TodoManager {
348
+ private items: TodoItem[] = [];
168
349
 
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
- };
350
+ setTodos(todos: TodoItem[]): void {
351
+ this.items = [...todos];
352
+ }
353
+
354
+ getTodos(): TodoItem[] {
355
+ return [...this.items];
356
+ }
357
+
358
+ getInProgress(): TodoItem | null {
359
+ return this.items.find(t => t.status === 'in_progress') ?? null;
176
360
  }
177
361
 
178
- manager.setTodos(input.todos);
362
+ getProgress(): { completed: number; total: number; percent: number } {
363
+ const completed = this.items.filter(t => t.status === 'completed').length;
364
+ const total = this.items.length;
365
+ const percent = total > 0 ? Math.round((completed / total) * 100) : 0;
366
+ return { completed, total, percent };
367
+ }
179
368
 
180
- return {
181
- success: true,
182
- output: `Updated todo list (${manager.getProgress().percent}% complete)`
183
- };
369
+ clear(): void {
370
+ this.items = [];
371
+ }
184
372
  }
185
373
  ```
186
374
 
@@ -188,13 +376,14 @@ async function execute(input: TodoWriteInput, context: ToolContext): Promise<Too
188
376
 
189
377
  | File | Action | Description |
190
378
  |------|--------|-------------|
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 |
379
+ | `src/tools/builtin/todo.ts` | Create | TodoWrite tool + types |
380
+ | `src/todo/todo-manager.ts` | Create | Todo state management |
381
+ | `src/todo/index.ts` | Create | Module exports |
195
382
  | `src/tools/index.ts` | Modify | Register TodoWrite tool |
196
- | `src/session/types.ts` | Modify | Add todo list to session state |
383
+ | `src/tools/types.ts` | Modify | Add setTodos to ToolContext |
384
+ | `src/agent/agent.ts` | Modify | Integrate TodoManager |
197
385
  | `src/cli/components/TodoList.tsx` | Create | Todo list UI component |
386
+ | `src/cli/components/Messages.tsx` | Modify | Display todos in UI |
198
387
 
199
388
  ## User Experience
200
389
 
@@ -284,6 +473,61 @@ Keep todos across multiple sessions.
284
473
  - Agent todo behavior
285
474
  - UI display across terminal sizes
286
475
 
476
+ ## Implementation Steps
477
+
478
+ ### Step 1: Create TodoManager (State Management)
479
+
480
+ Create `src/todo/` directory with:
481
+ - `types.ts` - Type definitions
482
+ - `todo-manager.ts` - State management class
483
+ - `index.ts` - Module exports
484
+
485
+ ### Step 2: Create TodoWrite Tool
486
+
487
+ Create `src/tools/builtin/todo.ts`:
488
+ - Zod schema for input validation
489
+ - Tool definition with description
490
+ - Execute function with validation
491
+ - Render function for text output
492
+
493
+ ### Step 3: Extend ToolContext
494
+
495
+ Modify `src/tools/types.ts`:
496
+ - Add `setTodos()` method to ToolContext
497
+ - Add `getTodos()` method to ToolContext
498
+
499
+ ### Step 4: Integrate with Agent
500
+
501
+ Modify `src/agent/agent.ts`:
502
+ - Create TodoManager instance
503
+ - Pass to ToolContext
504
+ - Expose getTodos for CLI
505
+
506
+ ### Step 5: Register Tool
507
+
508
+ Modify `src/tools/index.ts`:
509
+ - Import todoWriteTool
510
+ - Add to default registry
511
+
512
+ ### Step 6: Create CLI Component
513
+
514
+ Create `src/cli/components/TodoList.tsx`:
515
+ - Display current todos
516
+ - Show progress bar
517
+ - Status icons (○ ▶ ✓)
518
+
519
+ ### Step 7: Integrate with Messages
520
+
521
+ Modify `src/cli/components/Messages.tsx` or `App.tsx`:
522
+ - Show TodoList component when todos exist
523
+ - Update on todo changes
524
+
525
+ ### Step 8: Add System Prompt Guidance
526
+
527
+ Modify `src/prompts/system/`:
528
+ - Add TodoWrite usage guidance
529
+ - Include when to use / not use
530
+
287
531
  ## Migration Path
288
532
 
289
533
  1. **Phase 1**: Core TodoWrite tool implementation
@@ -293,6 +537,27 @@ Keep todos across multiple sessions.
293
537
 
294
538
  No breaking changes; existing sessions work without todos.
295
539
 
540
+ ## Implementation Notes
541
+
542
+ ### Files Created/Modified
543
+
544
+ | File | Action | Description |
545
+ |------|--------|-------------|
546
+ | `src/tools/builtin/todowrite.ts` | Existed | Core tool + state management |
547
+ | `src/tools/types.ts` | Existed | TodoItem, TodoWriteInput schemas |
548
+ | `src/tools/index.ts` | Existed | Tool registration |
549
+ | `src/prompts/tools/todowrite.txt` | Modified | Added dual purpose explanation |
550
+ | `src/cli/components/TodoList.tsx` | Created | CLI display component |
551
+ | `src/cli/components/App.tsx` | Modified | Integrated TodoList display |
552
+
553
+ ### Key Implementation Details
554
+
555
+ 1. **Global State**: Todos stored in module-level variable, accessed via `getTodos()`
556
+ 2. **Dual Purpose**: Tool description explains both UI visibility and model memory
557
+ 3. **Constraints**: Max 20 items, only 1 in_progress at a time
558
+ 4. **Rendering**: Returns formatted text for model to see its own plan
559
+ 5. **CLI Integration**: TodoList component displays with progress bar
560
+
296
561
  ## References
297
562
 
298
563
  - [Claude Code TodoWrite Documentation](https://code.claude.com/docs/en/tools)
@@ -1,21 +1,22 @@
1
- # Proposal: Memory System (MYCODE.md) with /init Command
1
+ # Proposal: Memory System (AGENT.md) with /init Command
2
2
 
3
3
  - **Proposal ID**: 0006
4
4
  - **Author**: mycode team
5
- - **Status**: Draft
5
+ - **Status**: Implemented
6
6
  - **Created**: 2025-01-15
7
- - **Updated**: 2025-01-15
7
+ - **Updated**: 2025-01-16
8
+ - **Implemented**: 2025-01-16
8
9
 
9
10
  ## Summary
10
11
 
11
12
  Implement a comprehensive memory system inspired by Claude Code, including:
12
- 1. **MYCODE.md files** - Project-specific context that persists across sessions
13
- 2. **Hierarchical memory loading** - User → Project → Directory-specific rules
14
- 3. **/init command** - Automatic project analysis and MYCODE.md generation
15
- 4. **# prefix** - Quick memory adds during sessions
16
- 5. **/memory command** - Edit memory files
17
- 6. **@import syntax** - Include other files into memory
18
- 7. **.mycode/rules/ directory** - Modular, path-scoped rules
13
+ 1. **AGENT.md files** - Project-specific context that persists across sessions (with CLAUDE.md fallback for compatibility)
14
+ 2. **Hierarchical memory loading** - User → Project → Local with rules directories
15
+ 3. **/init command** - Automatic project analysis and AGENT.md generation
16
+ 4. **# prefix** - Quick memory adds during sessions (`# note` for project, `## note` for user)
17
+ 5. **/memory command** - View loaded memory files
18
+ 6. **@import syntax** - Include other files into memory (max 5 levels)
19
+ 7. **.gencode/rules/ directory** - Modular, path-scoped rules with frontmatter
19
20
 
20
21
  ## Motivation
21
22