@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.
Files changed (57) hide show
  1. package/README.md +2 -23
  2. package/dist/cli/components/App.d.ts +2 -0
  3. package/dist/cli/components/App.d.ts.map +1 -0
  4. package/dist/cli/components/Header.d.ts +8 -0
  5. package/dist/cli/components/Header.d.ts.map +1 -0
  6. package/dist/cli/components/ProjectList.d.ts +8 -0
  7. package/dist/cli/components/ProjectList.d.ts.map +1 -0
  8. package/dist/cli/components/SearchView.d.ts +10 -0
  9. package/dist/cli/components/SearchView.d.ts.map +1 -0
  10. package/dist/cli/components/TaskDetail.d.ts +7 -0
  11. package/dist/cli/components/TaskDetail.d.ts.map +1 -0
  12. package/dist/cli/components/TaskForm.d.ts +15 -0
  13. package/dist/cli/components/TaskForm.d.ts.map +1 -0
  14. package/dist/cli/components/TaskList.d.ts +8 -0
  15. package/dist/cli/components/TaskList.d.ts.map +1 -0
  16. package/dist/cli/index.d.ts +3 -0
  17. package/dist/cli/index.d.ts.map +1 -0
  18. package/dist/cli/index.js +562 -7193
  19. package/dist/db/agents.d.ts +13 -0
  20. package/dist/db/agents.d.ts.map +1 -0
  21. package/dist/db/comments.d.ts +7 -0
  22. package/dist/db/comments.d.ts.map +1 -0
  23. package/dist/db/database.d.ts +12 -0
  24. package/dist/db/database.d.ts.map +1 -0
  25. package/dist/db/plans.d.ts +8 -0
  26. package/dist/db/plans.d.ts.map +1 -0
  27. package/dist/db/projects.d.ts +11 -0
  28. package/dist/db/projects.d.ts.map +1 -0
  29. package/dist/db/sessions.d.ts +8 -0
  30. package/dist/db/sessions.d.ts.map +1 -0
  31. package/dist/db/task-lists.d.ts +10 -0
  32. package/dist/db/task-lists.d.ts.map +1 -0
  33. package/dist/db/tasks.d.ts +17 -0
  34. package/dist/db/tasks.d.ts.map +1 -0
  35. package/dist/index.d.ts +16 -299
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +195 -273
  38. package/dist/lib/agent-tasks.d.ts +11 -0
  39. package/dist/lib/agent-tasks.d.ts.map +1 -0
  40. package/dist/lib/claude-tasks.d.ts +20 -0
  41. package/dist/lib/claude-tasks.d.ts.map +1 -0
  42. package/dist/lib/config.d.ts +21 -0
  43. package/dist/lib/config.d.ts.map +1 -0
  44. package/dist/lib/search.d.ts +4 -0
  45. package/dist/lib/search.d.ts.map +1 -0
  46. package/dist/lib/sync-types.d.ts +16 -0
  47. package/dist/lib/sync-types.d.ts.map +1 -0
  48. package/dist/lib/sync-utils.d.ts +12 -0
  49. package/dist/lib/sync-utils.d.ts.map +1 -0
  50. package/dist/lib/sync.d.ts +9 -0
  51. package/dist/lib/sync.d.ts.map +1 -0
  52. package/dist/mcp/index.d.ts +3 -0
  53. package/dist/mcp/index.d.ts.map +1 -0
  54. package/dist/mcp/index.js +344 -68
  55. package/dist/types/index.d.ts +275 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. 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, dashboard, library) call directly into `src/db/` — no intermediate service layer.
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,2 @@
1
+ export declare function renderApp(projectId?: string): void;
2
+ //# sourceMappingURL=App.d.ts.map
@@ -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,8 @@
1
+ interface HeaderProps {
2
+ projectName?: string;
3
+ taskCount: number;
4
+ view: string;
5
+ }
6
+ export declare function Header({ projectName, taskCount, view }: HeaderProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=Header.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.tsx"],"names":[],"mappings":""}