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.
- package/.env.example +11 -0
- package/CLAUDE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agent/agent.d.ts +84 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +233 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +47 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +14 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/App.js +395 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/CommandSuggestions.d.ts +13 -0
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/cli/components/CommandSuggestions.js +32 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -0
- package/dist/cli/components/Header.d.ts +9 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +13 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Input.d.ts +13 -0
- package/dist/cli/components/Input.d.ts.map +1 -0
- package/dist/cli/components/Input.js +27 -0
- package/dist/cli/components/Input.js.map +1 -0
- package/dist/cli/components/Logo.d.ts +2 -0
- package/dist/cli/components/Logo.d.ts.map +1 -0
- package/dist/cli/components/Logo.js +8 -0
- package/dist/cli/components/Logo.js.map +1 -0
- package/dist/cli/components/Messages.d.ts +37 -0
- package/dist/cli/components/Messages.d.ts.map +1 -0
- package/dist/cli/components/Messages.js +106 -0
- package/dist/cli/components/Messages.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +13 -0
- package/dist/cli/components/ModelSelector.d.ts.map +1 -0
- package/dist/cli/components/ModelSelector.js +72 -0
- package/dist/cli/components/ModelSelector.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +12 -0
- package/dist/cli/components/Spinner.d.ts.map +1 -0
- package/dist/cli/components/Spinner.js +45 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/index.d.ts +12 -0
- package/dist/cli/components/index.d.ts.map +1 -0
- package/dist/cli/components/index.js +12 -0
- package/dist/cli/components/index.js.map +1 -0
- package/dist/cli/components/theme.d.ts +31 -0
- package/dist/cli/components/theme.d.ts.map +1 -0
- package/dist/cli/components/theme.js +36 -0
- package/dist/cli/components/theme.js.map +1 -0
- package/dist/cli/index-legacy.d.ts +7 -0
- package/dist/cli/index-legacy.d.ts.map +1 -0
- package/dist/cli/index-legacy.js +431 -0
- package/dist/cli/index-legacy.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ink-cli.d.ts +7 -0
- package/dist/cli/ink-cli.d.ts.map +1 -0
- package/dist/cli/ink-cli.js +105 -0
- package/dist/cli/ink-cli.js.map +1 -0
- package/dist/cli/session-picker.d.ts +16 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +280 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/ui.d.ts +61 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +364 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +65 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/init.d.ts +20 -0
- package/dist/memory/init.d.ts.map +1 -0
- package/dist/memory/init.js +332 -0
- package/dist/memory/init.js.map +1 -0
- package/dist/memory/manager.d.ts +85 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +234 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/types.d.ts +74 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/index.d.ts +7 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +6 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +32 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +79 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +14 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +185 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +21 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +241 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +34 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +125 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +6 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +101 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +295 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +39 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +7 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +80 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +7 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +32 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +7 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +36 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +7 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +59 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +7 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +29 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +7 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +24 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +62 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +126 -0
- package/dist/tools/types.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/proposals/0001-web-fetch-tool.md +293 -0
- package/docs/proposals/0002-web-search-tool.md +306 -0
- package/docs/proposals/0003-task-subagents.md +333 -0
- package/docs/proposals/0004-plan-mode.md +338 -0
- package/docs/proposals/0005-todo-system.md +299 -0
- package/docs/proposals/0006-memory-system.md +539 -0
- package/docs/proposals/0007-context-management.md +429 -0
- package/docs/proposals/0008-checkpointing.md +327 -0
- package/docs/proposals/0009-hooks-system.md +343 -0
- package/docs/proposals/0010-mcp-integration.md +382 -0
- package/docs/proposals/0011-custom-commands.md +374 -0
- package/docs/proposals/0012-ask-user-question.md +317 -0
- package/docs/proposals/0013-multi-edit-tool.md +345 -0
- package/docs/proposals/0014-lsp-tool.md +478 -0
- package/docs/proposals/0015-ls-tool.md +407 -0
- package/docs/proposals/0016-kill-shell-tool.md +455 -0
- package/docs/proposals/0017-background-tasks.md +489 -0
- package/docs/proposals/0018-parallel-tool-execution.md +415 -0
- package/docs/proposals/0019-session-enhancements.md +462 -0
- package/docs/proposals/0020-session-summarization.md +447 -0
- package/docs/proposals/0021-skills-system.md +409 -0
- package/docs/proposals/0022-plugin-system.md +467 -0
- package/docs/proposals/0023-permission-enhancements.md +470 -0
- package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
- package/docs/proposals/0025-cost-tracking.md +447 -0
- package/docs/proposals/0026-git-integration.md +475 -0
- package/docs/proposals/0027-enhanced-read-tool.md +514 -0
- package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
- package/docs/proposals/0029-notebook-edit-tool.md +413 -0
- package/docs/proposals/0030-plugin-marketplace.md +360 -0
- package/docs/proposals/0031-command-suggestions.md +295 -0
- package/docs/proposals/0032-ide-integrations.md +328 -0
- package/docs/proposals/0033-enterprise-deployment.md +221 -0
- package/docs/proposals/0034-sandboxing.md +273 -0
- package/docs/proposals/0035-auto-updater.md +311 -0
- package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
- package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
- package/docs/proposals/0038-interactive-cli-ui.md +373 -0
- package/docs/proposals/0039-streaming-enhancements.md +359 -0
- package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
- package/docs/proposals/README.md +84 -0
- package/docs/proposals/TEMPLATE.md +57 -0
- package/docs/proposals/research/claude-code-research.md +307 -0
- package/examples/agent-demo.ts +115 -0
- package/examples/basic.ts +166 -0
- package/package.json +50 -0
- package/src/agent/agent.ts +276 -0
- package/src/agent/index.ts +6 -0
- package/src/agent/types.ts +62 -0
- package/src/cli/components/App.tsx +565 -0
- package/src/cli/components/CommandSuggestions.tsx +58 -0
- package/src/cli/components/Header.tsx +36 -0
- package/src/cli/components/Input.tsx +60 -0
- package/src/cli/components/Logo.tsx +16 -0
- package/src/cli/components/Messages.tsx +210 -0
- package/src/cli/components/ModelSelector.tsx +135 -0
- package/src/cli/components/Spinner.tsx +72 -0
- package/src/cli/components/index.ts +21 -0
- package/src/cli/components/theme.ts +36 -0
- package/src/cli/index.tsx +136 -0
- package/src/config/index.ts +7 -0
- package/src/config/manager.ts +77 -0
- package/src/config/types.ts +25 -0
- package/src/index.ts +86 -0
- package/src/permissions/index.ts +7 -0
- package/src/permissions/manager.ts +97 -0
- package/src/permissions/types.ts +29 -0
- package/src/providers/anthropic.ts +224 -0
- package/src/providers/gemini.ts +295 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/openai.ts +261 -0
- package/src/providers/types.ts +181 -0
- package/src/session/index.ts +6 -0
- package/src/session/manager.ts +354 -0
- package/src/session/types.ts +49 -0
- package/src/tools/builtin/bash.ts +92 -0
- package/src/tools/builtin/edit.ts +37 -0
- package/src/tools/builtin/glob.ts +42 -0
- package/src/tools/builtin/grep.ts +67 -0
- package/src/tools/builtin/read.ts +34 -0
- package/src/tools/builtin/write.ts +27 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/registry.ts +83 -0
- package/src/tools/types.ts +172 -0
- 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)
|