@hasna/todos 0.8.0 → 0.9.1
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/README.md +2 -23
- package/dist/cli/components/App.d.ts +2 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/Header.d.ts +8 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/ProjectList.d.ts +8 -0
- package/dist/cli/components/ProjectList.d.ts.map +1 -0
- package/dist/cli/components/SearchView.d.ts +10 -0
- package/dist/cli/components/SearchView.d.ts.map +1 -0
- package/dist/cli/components/TaskDetail.d.ts +7 -0
- package/dist/cli/components/TaskDetail.d.ts.map +1 -0
- package/dist/cli/components/TaskForm.d.ts +15 -0
- package/dist/cli/components/TaskForm.d.ts.map +1 -0
- package/dist/cli/components/TaskList.d.ts +8 -0
- package/dist/cli/components/TaskList.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +562 -7193
- package/dist/db/agents.d.ts +13 -0
- package/dist/db/agents.d.ts.map +1 -0
- package/dist/db/comments.d.ts +7 -0
- package/dist/db/comments.d.ts.map +1 -0
- package/dist/db/database.d.ts +12 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/plans.d.ts +8 -0
- package/dist/db/plans.d.ts.map +1 -0
- package/dist/db/projects.d.ts +11 -0
- package/dist/db/projects.d.ts.map +1 -0
- package/dist/db/sessions.d.ts +8 -0
- package/dist/db/sessions.d.ts.map +1 -0
- package/dist/db/task-lists.d.ts +10 -0
- package/dist/db/task-lists.d.ts.map +1 -0
- package/dist/db/tasks.d.ts +17 -0
- package/dist/db/tasks.d.ts.map +1 -0
- package/dist/index.d.ts +16 -299
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +195 -273
- package/dist/lib/agent-tasks.d.ts +11 -0
- package/dist/lib/agent-tasks.d.ts.map +1 -0
- package/dist/lib/claude-tasks.d.ts +20 -0
- package/dist/lib/claude-tasks.d.ts.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/search.d.ts +4 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/sync-types.d.ts +16 -0
- package/dist/lib/sync-types.d.ts.map +1 -0
- package/dist/lib/sync-utils.d.ts +12 -0
- package/dist/lib/sync-utils.d.ts.map +1 -0
- package/dist/lib/sync.d.ts +9 -0
- package/dist/lib/sync.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +344 -68
- package/dist/types/index.d.ts +275 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +3 -6
package/README.md
CHANGED
|
@@ -6,7 +6,6 @@ Universal task management for AI coding agents. CLI + MCP server + web dashboard
|
|
|
6
6
|
|
|
7
7
|
- **CLI** with interactive TUI (React/Ink) and JSON output
|
|
8
8
|
- **MCP server** for Claude, Codex, Gemini, and any MCP-compatible agent
|
|
9
|
-
- **Web dashboard** with React/shadcn UI, dark mode, and real-time task management
|
|
10
9
|
- **Library** for programmatic access from Node.js/Bun
|
|
11
10
|
- **SQLite** with WAL mode, optimistic locking, and automatic migrations
|
|
12
11
|
- Task dependencies with cycle detection
|
|
@@ -39,25 +38,10 @@ todos done <id>
|
|
|
39
38
|
# Launch interactive TUI
|
|
40
39
|
todos
|
|
41
40
|
|
|
42
|
-
# Start web dashboard
|
|
43
|
-
todos serve
|
|
44
|
-
|
|
45
41
|
# Register MCP server with AI agents
|
|
46
42
|
todos mcp --register all
|
|
47
43
|
```
|
|
48
44
|
|
|
49
|
-
## Web Dashboard
|
|
50
|
-
|
|
51
|
-
Start the dashboard with:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
todos serve # http://localhost:19420
|
|
55
|
-
todos serve -p 3000 # Custom port
|
|
56
|
-
todos serve --no-open # Don't auto-open browser
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Features: stats overview, sortable/filterable task table, create/edit/delete tasks, task detail with comments, dark mode toggle.
|
|
60
|
-
|
|
61
45
|
## MCP Server
|
|
62
46
|
|
|
63
47
|
Register with your AI coding agents:
|
|
@@ -122,7 +106,6 @@ Config file: `~/.todos/config.json`
|
|
|
122
106
|
| `todos deps <id>` | Manage dependencies |
|
|
123
107
|
| `todos projects` | List/manage projects |
|
|
124
108
|
| `todos export` | Export tasks (JSON or Markdown) |
|
|
125
|
-
| `todos serve` | Start web dashboard |
|
|
126
109
|
| `todos mcp` | Start MCP server |
|
|
127
110
|
|
|
128
111
|
Use `--json` for JSON output on any command. Use `--agent <name>` to identify the calling agent.
|
|
@@ -156,7 +139,6 @@ bun install
|
|
|
156
139
|
bun test # Run 112 tests
|
|
157
140
|
bun run typecheck # TypeScript checking
|
|
158
141
|
bun run dev:cli # Run CLI in dev mode
|
|
159
|
-
bun run build:dashboard # Build web dashboard
|
|
160
142
|
```
|
|
161
143
|
|
|
162
144
|
## Architecture
|
|
@@ -165,16 +147,13 @@ bun run build:dashboard # Build web dashboard
|
|
|
165
147
|
src/
|
|
166
148
|
types/ TypeScript types, enums, custom errors
|
|
167
149
|
db/ SQLite data layer (tasks, projects, comments, sessions)
|
|
168
|
-
lib/ Business logic (search)
|
|
150
|
+
lib/ Business logic (search, sync)
|
|
169
151
|
cli/ Commander.js CLI + React/Ink TUI
|
|
170
152
|
mcp/ MCP server (stdio transport)
|
|
171
|
-
server/ Bun.serve() HTTP server + REST API
|
|
172
153
|
index.ts Library re-exports
|
|
173
|
-
|
|
174
|
-
dashboard/ Vite + React 19 + Tailwind 4 + shadcn web UI
|
|
175
154
|
```
|
|
176
155
|
|
|
177
|
-
All surfaces (CLI, MCP,
|
|
156
|
+
All surfaces (CLI, MCP, library) call directly into `src/db/` — no intermediate service layer.
|
|
178
157
|
|
|
179
158
|
## License
|
|
180
159
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/cli/components/App.tsx"],"names":[],"mappings":"AA6QA,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAElD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/cli/components/Header.tsx"],"names":[],"mappings":"AAEA,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,MAAM,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,WAAW,2CAyBnE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Project } from "../../types/index.js";
|
|
2
|
+
interface ProjectListProps {
|
|
3
|
+
projects: Project[];
|
|
4
|
+
selectedIndex: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function ProjectList({ projects, selectedIndex }: ProjectListProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ProjectList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectList.d.ts","sourceRoot":"","sources":["../../../src/cli/components/ProjectList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,gBAAgB,2CA2BxE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Task } from "../../types/index.js";
|
|
2
|
+
interface SearchViewProps {
|
|
3
|
+
results: Task[];
|
|
4
|
+
onSearch: (query: string) => void;
|
|
5
|
+
onSelect: (task: Task) => void;
|
|
6
|
+
onBack: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function SearchView({ results, onSearch, onSelect, onBack }: SearchViewProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=SearchView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchView.d.ts","sourceRoot":"","sources":["../../../src/cli/components/SearchView.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,UAAU,eAAe;IACvB,OAAO,EAAE,IAAI,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAUD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,2CA0ElF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TaskWithRelations } from "../../types/index.js";
|
|
2
|
+
interface TaskDetailProps {
|
|
3
|
+
task: TaskWithRelations;
|
|
4
|
+
}
|
|
5
|
+
export declare function TaskDetail({ task }: TaskDetailProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=TaskDetail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskDetail.d.ts","sourceRoot":"","sources":["../../../src/cli/components/TaskDetail.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,UAAU,eAAe;IACvB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAUD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE,eAAe,2CAqJnD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface TaskFormProps {
|
|
2
|
+
onSubmit: (data: {
|
|
3
|
+
title: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
priority?: string;
|
|
6
|
+
}) => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
initialTitle?: string;
|
|
9
|
+
initialDescription?: string;
|
|
10
|
+
initialPriority?: string;
|
|
11
|
+
mode: "add" | "edit";
|
|
12
|
+
}
|
|
13
|
+
export declare function TaskForm({ onSubmit, onCancel, initialTitle, initialDescription, initialPriority, mode, }: TaskFormProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=TaskForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskForm.d.ts","sourceRoot":"","sources":["../../../src/cli/components/TaskForm.tsx"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACrF,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACtB;AAMD,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAQ,EACR,YAAiB,EACjB,kBAAuB,EACvB,eAA0B,EAC1B,IAAI,GACL,EAAE,aAAa,2CAmFf"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Task } from "../../types/index.js";
|
|
2
|
+
interface TaskListProps {
|
|
3
|
+
tasks: Task[];
|
|
4
|
+
selectedIndex: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function TaskList({ tasks, selectedIndex }: TaskListProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=TaskList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskList.d.ts","sourceRoot":"","sources":["../../../src/cli/components/TaskList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,UAAU,aAAa;IACrB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAgCD,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,aAAa,2CA8C/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.tsx"],"names":[],"mappings":""}
|