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.
- package/.gencode/settings.local.json +7 -0
- package/README.md +11 -11
- package/dist/agent/agent.d.ts +42 -1
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +82 -15
- package/dist/agent/agent.js.map +1 -1
- package/dist/cli/components/App.d.ts +8 -1
- package/dist/cli/components/App.d.ts.map +1 -1
- package/dist/cli/components/App.js +231 -29
- package/dist/cli/components/App.js.map +1 -1
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -1
- package/dist/cli/components/CommandSuggestions.js +2 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -1
- package/dist/cli/components/Header.d.ts +1 -1
- package/dist/cli/components/Header.d.ts.map +1 -1
- package/dist/cli/components/Header.js +4 -6
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/Logo.d.ts +1 -0
- package/dist/cli/components/Logo.d.ts.map +1 -1
- package/dist/cli/components/Logo.js +16 -3
- package/dist/cli/components/Logo.js.map +1 -1
- package/dist/cli/components/Messages.d.ts +4 -4
- package/dist/cli/components/Messages.d.ts.map +1 -1
- package/dist/cli/components/Messages.js +51 -25
- package/dist/cli/components/Messages.js.map +1 -1
- package/dist/cli/components/PermissionPrompt.d.ts +60 -0
- package/dist/cli/components/PermissionPrompt.d.ts.map +1 -0
- package/dist/cli/components/PermissionPrompt.js +192 -0
- package/dist/cli/components/PermissionPrompt.js.map +1 -0
- package/dist/cli/components/ProviderManager.js +3 -3
- package/dist/cli/components/ProviderManager.js.map +1 -1
- package/dist/cli/components/Spinner.d.ts +7 -2
- package/dist/cli/components/Spinner.d.ts.map +1 -1
- package/dist/cli/components/Spinner.js +116 -25
- package/dist/cli/components/Spinner.js.map +1 -1
- package/dist/cli/components/TodoList.d.ts +7 -0
- package/dist/cli/components/TodoList.d.ts.map +1 -0
- package/dist/cli/components/TodoList.js +34 -0
- package/dist/cli/components/TodoList.js.map +1 -0
- package/dist/cli/components/index.d.ts +1 -0
- package/dist/cli/components/index.d.ts.map +1 -1
- package/dist/cli/components/index.js +1 -0
- package/dist/cli/components/index.js.map +1 -1
- package/dist/cli/index.js +47 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/config/index.d.ts +13 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +18 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/levels.d.ts +49 -0
- package/dist/config/levels.d.ts.map +1 -0
- package/dist/config/levels.js +222 -0
- package/dist/config/levels.js.map +1 -0
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +153 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/manager.d.ts +115 -15
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +260 -34
- package/dist/config/manager.js.map +1 -1
- package/dist/config/manager.test.d.ts +5 -0
- package/dist/config/manager.test.d.ts.map +1 -0
- package/dist/config/manager.test.js +192 -0
- package/dist/config/manager.test.js.map +1 -0
- package/dist/config/merger.d.ts +56 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +177 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/test-utils.d.ts +24 -0
- package/dist/config/test-utils.d.ts.map +1 -0
- package/dist/config/test-utils.js +55 -0
- package/dist/config/test-utils.js.map +1 -0
- package/dist/config/types.d.ts +78 -9
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +52 -2
- package/dist/config/types.js.map +1 -1
- package/dist/memory/import-resolver.d.ts +46 -0
- package/dist/memory/import-resolver.d.ts.map +1 -0
- package/dist/memory/import-resolver.js +117 -0
- package/dist/memory/import-resolver.js.map +1 -0
- package/dist/memory/index.d.ts +7 -6
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +7 -5
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/init-prompt.d.ts +22 -0
- package/dist/memory/init-prompt.d.ts.map +1 -0
- package/dist/memory/init-prompt.js +103 -0
- package/dist/memory/init-prompt.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +119 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +587 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/rules-parser.d.ts +38 -0
- package/dist/memory/rules-parser.d.ts.map +1 -0
- package/dist/memory/rules-parser.js +69 -0
- package/dist/memory/rules-parser.js.map +1 -0
- package/dist/memory/test-utils.d.ts +20 -0
- package/dist/memory/test-utils.d.ts.map +1 -0
- package/dist/memory/test-utils.js +44 -0
- package/dist/memory/test-utils.js.map +1 -0
- package/dist/memory/types.d.ts +70 -63
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +42 -2
- package/dist/memory/types.js.map +1 -1
- package/dist/permissions/audit.d.ts +82 -0
- package/dist/permissions/audit.d.ts.map +1 -0
- package/dist/permissions/audit.js +229 -0
- package/dist/permissions/audit.js.map +1 -0
- package/dist/permissions/index.d.ts +11 -1
- package/dist/permissions/index.d.ts.map +1 -1
- package/dist/permissions/index.js +15 -0
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/manager.d.ts +149 -13
- package/dist/permissions/manager.d.ts.map +1 -1
- package/dist/permissions/manager.js +480 -35
- package/dist/permissions/manager.js.map +1 -1
- package/dist/permissions/manager.test.d.ts +5 -0
- package/dist/permissions/manager.test.d.ts.map +1 -0
- package/dist/permissions/manager.test.js +213 -0
- package/dist/permissions/manager.test.js.map +1 -0
- package/dist/permissions/persistence.d.ts +74 -0
- package/dist/permissions/persistence.d.ts.map +1 -0
- package/dist/permissions/persistence.js +248 -0
- package/dist/permissions/persistence.js.map +1 -0
- package/dist/permissions/persistence.test.d.ts +5 -0
- package/dist/permissions/persistence.test.d.ts.map +1 -0
- package/dist/permissions/persistence.test.js +171 -0
- package/dist/permissions/persistence.test.js.map +1 -0
- package/dist/permissions/prompt-matcher.d.ts +64 -0
- package/dist/permissions/prompt-matcher.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.js +415 -0
- package/dist/permissions/prompt-matcher.js.map +1 -0
- package/dist/permissions/prompt-matcher.test.d.ts +5 -0
- package/dist/permissions/prompt-matcher.test.d.ts.map +1 -0
- package/dist/permissions/prompt-matcher.test.js +107 -0
- package/dist/permissions/prompt-matcher.test.js.map +1 -0
- package/dist/permissions/types.d.ts +157 -0
- package/dist/permissions/types.d.ts.map +1 -1
- package/dist/permissions/types.js +43 -8
- package/dist/permissions/types.js.map +1 -1
- package/dist/prompts/index.d.ts +92 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +241 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -1
- package/dist/tools/builtin/bash.js +2 -1
- package/dist/tools/builtin/bash.js.map +1 -1
- package/dist/tools/builtin/edit.d.ts.map +1 -1
- package/dist/tools/builtin/edit.js +2 -1
- package/dist/tools/builtin/edit.js.map +1 -1
- package/dist/tools/builtin/glob.d.ts.map +1 -1
- package/dist/tools/builtin/glob.js +2 -1
- package/dist/tools/builtin/glob.js.map +1 -1
- package/dist/tools/builtin/grep.d.ts.map +1 -1
- package/dist/tools/builtin/grep.js +2 -1
- package/dist/tools/builtin/grep.js.map +1 -1
- package/dist/tools/builtin/read.d.ts.map +1 -1
- package/dist/tools/builtin/read.js +2 -1
- package/dist/tools/builtin/read.js.map +1 -1
- package/dist/tools/builtin/todowrite.d.ts +15 -0
- package/dist/tools/builtin/todowrite.d.ts.map +1 -0
- package/dist/tools/builtin/todowrite.js +88 -0
- package/dist/tools/builtin/todowrite.js.map +1 -0
- package/dist/tools/builtin/webfetch.d.ts.map +1 -1
- package/dist/tools/builtin/webfetch.js +2 -5
- package/dist/tools/builtin/webfetch.js.map +1 -1
- package/dist/tools/builtin/websearch.d.ts.map +1 -1
- package/dist/tools/builtin/websearch.js +2 -16
- package/dist/tools/builtin/websearch.js.map +1 -1
- package/dist/tools/builtin/write.d.ts.map +1 -1
- package/dist/tools/builtin/write.js +2 -1
- package/dist/tools/builtin/write.js.map +1 -1
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/types.d.ts +22 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +8 -0
- package/dist/tools/types.js.map +1 -1
- package/docs/config-system-comparison.md +707 -0
- package/docs/memory-system.md +238 -0
- package/docs/permissions.md +368 -0
- package/docs/proposals/0005-todo-system.md +350 -85
- package/docs/proposals/0006-memory-system.md +11 -10
- package/docs/proposals/0012-ask-user-question.md +941 -206
- package/docs/proposals/0023-permission-enhancements.md +61 -2
- package/docs/proposals/0041-configuration-system.md +33 -2
- package/docs/proposals/0042-prompt-optimization.md +866 -0
- package/docs/proposals/README.md +6 -5
- package/jest.config.js +26 -0
- package/package.json +8 -2
- package/src/agent/agent.ts +111 -16
- package/src/cli/components/App.tsx +309 -36
- package/src/cli/components/CommandSuggestions.tsx +2 -0
- package/src/cli/components/Header.tsx +11 -17
- package/src/cli/components/Logo.tsx +76 -9
- package/src/cli/components/Messages.tsx +73 -53
- package/src/cli/components/PermissionPrompt.tsx +388 -0
- package/src/cli/components/ProviderManager.tsx +5 -5
- package/src/cli/components/Spinner.tsx +138 -25
- package/src/cli/components/TodoList.tsx +54 -0
- package/src/cli/components/index.ts +6 -0
- package/src/cli/index.tsx +54 -6
- package/src/config/index.ts +78 -4
- package/src/config/levels.test.ts +163 -0
- package/src/config/levels.ts +285 -0
- package/src/config/loader.test.ts +120 -0
- package/src/config/loader.ts +178 -0
- package/src/config/manager.test.ts +215 -0
- package/src/config/manager.ts +328 -40
- package/src/config/merger.test.ts +360 -0
- package/src/config/merger.ts +221 -0
- package/src/config/test-utils.ts +79 -0
- package/src/config/types.ts +152 -9
- package/src/memory/import-resolver.test.ts +117 -0
- package/src/memory/import-resolver.ts +149 -0
- package/src/memory/index.ts +11 -0
- package/src/memory/init-prompt.ts +113 -0
- package/src/memory/memory-manager.test.ts +198 -0
- package/src/memory/memory-manager.ts +716 -0
- package/src/memory/rules-parser.test.ts +182 -0
- package/src/memory/rules-parser.ts +82 -0
- package/src/memory/test-utils.ts +60 -0
- package/src/memory/types.ts +119 -0
- package/src/permissions/audit.ts +284 -0
- package/src/permissions/index.ts +20 -1
- package/src/permissions/manager.test.ts +260 -0
- package/src/permissions/manager.ts +592 -40
- package/src/permissions/persistence.test.ts +220 -0
- package/src/permissions/persistence.ts +301 -0
- package/src/permissions/prompt-matcher.test.ts +213 -0
- package/src/permissions/prompt-matcher.ts +472 -0
- package/src/permissions/types.ts +236 -8
- package/src/prompts/index.test.ts +279 -0
- package/src/prompts/index.ts +306 -0
- package/src/prompts/system/anthropic.txt +29 -0
- package/src/prompts/system/base.txt +124 -0
- package/src/prompts/system/gemini.txt +35 -0
- package/src/prompts/system/generic.txt +128 -0
- package/src/prompts/system/openai.txt +29 -0
- package/src/prompts/tools/bash.txt +60 -0
- package/src/prompts/tools/edit.txt +29 -0
- package/src/prompts/tools/glob.txt +35 -0
- package/src/prompts/tools/grep.txt +43 -0
- package/src/prompts/tools/read.txt +22 -0
- package/src/prompts/tools/todowrite.txt +71 -0
- package/src/prompts/tools/webfetch.txt +34 -0
- package/src/prompts/tools/websearch.txt +41 -0
- package/src/prompts/tools/write.txt +23 -0
- package/src/tools/builtin/bash.ts +2 -1
- package/src/tools/builtin/edit.ts +2 -1
- package/src/tools/builtin/glob.ts +2 -1
- package/src/tools/builtin/grep.ts +2 -1
- package/src/tools/builtin/read.ts +2 -1
- package/src/tools/builtin/todowrite.ts +102 -0
- package/src/tools/builtin/webfetch.ts +2 -5
- package/src/tools/builtin/websearch.ts +2 -16
- package/src/tools/builtin/write.ts +2 -1
- package/src/tools/index.ts +4 -0
- package/src/tools/types.ts +12 -0
- package/tsconfig.json +1 -1
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
- **Proposal ID**: 0005
|
|
4
4
|
- **Author**: mycode team
|
|
5
|
-
- **Status**:
|
|
5
|
+
- **Status**: Implemented
|
|
6
6
|
- **Created**: 2025-01-15
|
|
7
|
-
- **Updated**: 2025-01-
|
|
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,
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
|
234
|
+
// src/tools/builtin/todo.ts - Types
|
|
73
235
|
type TodoStatus = 'pending' | 'in_progress' | 'completed';
|
|
74
236
|
|
|
75
237
|
interface TodoItem {
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
85
|
-
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
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/
|
|
102
|
-
|
|
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
|
|
276
|
+
description: `Create and manage a structured task list for your coding session.
|
|
105
277
|
|
|
106
|
-
Use
|
|
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:
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
class TodoManager {
|
|
135
|
-
private list: TodoList;
|
|
306
|
+
// Store in context (will be managed by TodoManager)
|
|
307
|
+
context.setTodos(input.todos);
|
|
136
308
|
|
|
137
|
-
|
|
309
|
+
// Render for model to see its own plan
|
|
310
|
+
const rendered = renderTodos(input.todos);
|
|
138
311
|
|
|
139
|
-
|
|
140
|
-
|
|
312
|
+
return {
|
|
313
|
+
success: true,
|
|
314
|
+
output: rendered,
|
|
315
|
+
};
|
|
316
|
+
},
|
|
317
|
+
};
|
|
141
318
|
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
149
|
-
|
|
336
|
+
const completed = todos.filter(t => t.status === 'completed').length;
|
|
337
|
+
lines.push(`\n(${completed}/${todos.length} completed)`);
|
|
150
338
|
|
|
151
|
-
|
|
152
|
-
format(): string;
|
|
339
|
+
return lines.join('\n');
|
|
153
340
|
}
|
|
154
341
|
```
|
|
155
342
|
|
|
156
|
-
###
|
|
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
|
-
//
|
|
166
|
-
|
|
167
|
-
|
|
346
|
+
// src/todo/todo-manager.ts
|
|
347
|
+
export class TodoManager {
|
|
348
|
+
private items: TodoItem[] = [];
|
|
168
349
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
192
|
-
| `src/
|
|
193
|
-
| `src/
|
|
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/
|
|
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 (
|
|
1
|
+
# Proposal: Memory System (AGENT.md) with /init Command
|
|
2
2
|
|
|
3
3
|
- **Proposal ID**: 0006
|
|
4
4
|
- **Author**: mycode team
|
|
5
|
-
- **Status**:
|
|
5
|
+
- **Status**: Implemented
|
|
6
6
|
- **Created**: 2025-01-15
|
|
7
|
-
- **Updated**: 2025-01-
|
|
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. **
|
|
13
|
-
2. **Hierarchical memory loading** - User → Project →
|
|
14
|
-
3. **/init command** - Automatic project analysis and
|
|
15
|
-
4. **# prefix** - Quick memory adds during sessions
|
|
16
|
-
5. **/memory command** -
|
|
17
|
-
6. **@import syntax** - Include other files into memory
|
|
18
|
-
7. **.
|
|
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
|
|