|
6 | 6 |
|
7 | 7 | A terminal-based AI-powered project manager built in Rust. |
8 | 8 |
|
| 9 | +## Why aipm? |
| 10 | + |
| 11 | +**Natural language task management** — Just type what you need. "Break down the auth feature into sub-tasks" or "mark all design tasks as done." The AI understands intent and executes through tool calls. |
| 12 | + |
| 13 | +**Email inbox → task list** — Integrates with Apple Mail via MCP to automatically surface actionable emails as task suggestions. Marketing and noise filtered out by AI. |
| 14 | + |
| 15 | +**File-per-task architecture** — Each task is a markdown file with YAML front matter. Grep your way through tasks. Perfect for AI coding agents. |
| 16 | + |
| 17 | +**Full keyboard control** — Vim-style bindings. Arrow keys. No mouse needed. Navigate between buckets, timeline, kanban, and settings instantly. |
| 18 | + |
| 19 | +**Context-aware AI** — Paste GitHub PR/issue URLs and the AI automatically fetches context. No manual copying. |
| 20 | + |
9 | 21 | ## Features |
10 | 22 |
|
11 | | -- **Buckets view** — organize tasks across Team, John-only, and Admin columns |
12 | | -- **Timeline view** — chronological task overview |
13 | | -- **Kanban view** — drag tasks through Backlog → Todo → In Progress → Done |
14 | | -- **Settings** — configure AI model, API key, and other options from within the app |
15 | | -- **AI triage & tools** — natural language input is routed through AI tool calls to create, update, delete, decompose, or bulk-update tasks |
16 | | -- **URL context** — paste a link (GitHub PR/issue or any URL) and the AI automatically fetches and incorporates its content |
17 | | -- **Delete confirmation** — modal prompt before deleting any task |
18 | | -- **Keyboard-driven** — full navigation via keyboard with tab bar focus, arrow keys, and vim-style bindings |
19 | | - |
20 | | -## Keybindings |
21 | | - |
22 | | -| Context | Key | Action | |
23 | | -|---------|-----|--------| |
24 | | -| Global | `Ctrl-C` | Quit | |
25 | | -| Global | `1/2/3/4` | Switch tabs | |
26 | | -| Input | `/exit` | Quit | |
27 | | -| Tab bar | `←/→` | Navigate tabs | |
28 | | -| Tab bar | `Enter` | Enter selected tab | |
29 | | -| Input | `Enter` | Create task | |
30 | | -| Input | `Esc` | Switch to board | |
31 | | -| Board | `↑/↓/←/→` | Navigate tasks and columns | |
32 | | -| Board | `Enter/e` | Edit selected task | |
33 | | -| Board | `d/x/Backspace/Delete` | Delete task (with confirmation) | |
34 | | -| Board | `p/Space` | Advance progress | |
35 | | -| Board | `P` | Retreat progress | |
36 | | -| Board | `Esc` | Focus tab bar | |
37 | | -| Edit | `↑/↓` | Navigate fields | |
38 | | -| Edit | `Enter/e` | Edit field value | |
39 | | -| Edit | `←/→` | Cycle enum fields | |
40 | | -| Edit | `Esc` | Close overlay | |
41 | | - |
42 | | -## Setup |
43 | | - |
44 | | -### Requirements |
45 | | - |
46 | | -- Rust 1.70+ |
47 | | -- An OpenAI API key (for AI features) |
48 | | - |
49 | | -### Build & run |
| 23 | +- **Multiple views**: Buckets (columns), Timeline (chronological), Kanban (progress stages) |
| 24 | +- **AI triage**: Natural language → create/update/delete/decompose/bulk-update tasks via tool calls |
| 25 | +- **Email suggestions**: MCP integration with Apple Mail surfaces actionable inbox items |
| 26 | +- **URL context**: Auto-fetch GitHub PRs/issues or any URL content |
| 27 | +- **CLI mode**: Headless commands for scripting (`task list`, `suggestions sync`, etc.) |
| 28 | +- **Undo/history**: Snapshot before every operation, rollback anytime |
| 29 | +- **Sub-tasks & dependencies**: Hierarchical tasks with automatic parent progress sync |
| 30 | +- **Keyboard-driven**: Full vim-style navigation, no mouse required |
| 31 | + |
| 32 | +## Quick Start |
50 | 33 |
|
51 | 34 | ```sh |
52 | 35 | cargo build --release |
53 | 36 | ./target/release/aipm |
54 | 37 | ``` |
55 | 38 |
|
56 | | -### AI configuration |
57 | | - |
58 | | -Set your API key for your preferred provider: |
| 39 | +Set up AI (required for triage and email filtering): |
59 | 40 |
|
60 | 41 | ```sh |
61 | 42 | export ANTHROPIC_API_KEY="sk-ant-..." # for Claude models |
62 | 43 | export OPENAI_API_KEY="sk-..." # for OpenAI models |
63 | 44 | ``` |
64 | 45 |
|
65 | | -Or configure it in the Settings tab (`4`) within the app. The default model is `claude-sonnet-4-5`. |
66 | | - |
67 | | -## CLI commands |
68 | | - |
69 | | -All subcommands output JSON to stdout. Errors go to stderr with a non-zero exit code. |
70 | | -Task IDs accept short prefixes (4+ hex chars), e.g. `36149d52` or `3614`. |
71 | | - |
72 | | -### Task commands |
73 | | - |
74 | | -- `aipm task list` — JSON array of all tasks. |
75 | | -- `aipm task show <id>` — single task as JSON. |
76 | | -- `aipm task add --title "X" --bucket "Y"` — create a task. Optional flags: `--priority low|medium|high|critical`, `--progress backlog|todo|in-progress|done`, `--due YYYY-MM-DD`, `--description "..."`, `--parent <id>` (for sub-tasks). Prints the created task as JSON. |
77 | | -- `aipm task edit <id>` — update a task. Pass any combination of: `--title`, `--bucket`, `--description`, `--priority`, `--progress`, `--due` (use `none` to clear). Prints the updated task as JSON. |
78 | | -- `aipm task delete <id>` — delete a task and all its sub-tasks. Prints confirmation JSON. |
79 | | - |
80 | | -### Bucket commands |
| 46 | +Or configure in Settings tab (`4`). Default model: `claude-sonnet-4-5`. |
81 | 47 |
|
82 | | -- `aipm bucket list` — JSON array of all buckets. |
83 | | -- `aipm bucket add <name>` — add a bucket. Optional: `--description "..."`. |
84 | | -- `aipm bucket rename <old> <new>` — rename a bucket and update all tasks in it. |
85 | | -- `aipm bucket delete <name>` — delete a bucket; tasks move to the first remaining bucket. |
| 48 | +## Usage |
86 | 49 |
|
87 | | -### AI commands (headless) |
| 50 | +**TUI**: Just run `aipm` and start typing natural language instructions. |
88 | 51 |
|
89 | | -- `aipm "<instruction>"` — send a natural-language instruction to AI for triage (create/update/delete tasks). Requires an API key. |
90 | | - |
91 | | -## AI tools |
92 | | - |
93 | | -The AI agent uses tool calling to decide how to handle each input. Available tools: |
94 | | - |
95 | | -| Tool | Description | |
96 | | -|------|-------------| |
97 | | -| `create_task` | Create a new task with title, bucket, description, priority, progress, due date, and optional subtasks | |
98 | | -| `update_task` | Update fields on an existing task by ID prefix | |
99 | | -| `delete_task` | Delete a task by ID prefix | |
100 | | -| `decompose_task` | Break a task into smaller subtasks with dependency ordering | |
101 | | -| `bulk_update_tasks` | Apply an instruction across multiple tasks at once | |
102 | | - |
103 | | -The AI also automatically fetches context from URLs included in the input: |
104 | | -- **GitHub PRs/Issues** — fetches title, author, state, and body via the GitHub API |
105 | | -- **Generic URLs** — fetches the page, extracts the title and a text snippet |
106 | | - |
107 | | -## Data storage |
108 | | - |
109 | | -Each task is stored as an individual markdown file with YAML front matter in a `tasks/` directory: |
110 | | - |
111 | | -``` |
112 | | -<data_dir>/ |
113 | | - tasks/ |
114 | | - 550e8400-implement-user-auth.md |
115 | | - 660e8400-setup-oauth-flow.md |
116 | | - ... |
117 | | - settings.yaml |
118 | | -``` |
119 | | - |
120 | | -Task file format: |
121 | | - |
122 | | -```yaml |
123 | | ---- |
124 | | -id: "550e8400-e29b-41d4-a716-446655440000" |
125 | | -title: "Implement user authentication" |
126 | | -bucket: Team |
127 | | -progress: InProgress |
128 | | -priority: High |
129 | | -due_date: "2026-03-01" |
130 | | -parent_id: "660e8400-e29b-41d4-a716-446655440001" |
131 | | -dependencies: |
132 | | - - "770e8400-e29b-41d4-a716-446655440002" |
133 | | -created_at: "2026-02-10T12:00:00Z" |
134 | | -updated_at: "2026-02-15T14:30:00Z" |
135 | | ---- |
136 | | -Description goes here as the markdown body. |
| 52 | +**CLI**: Script-friendly JSON output: |
| 53 | +```sh |
| 54 | +aipm task list |
| 55 | +aipm "create three tasks for the auth feature" |
| 56 | +aipm suggestions sync --limit 5 |
137 | 57 | ``` |
138 | 58 |
|
139 | | -This file-per-task architecture makes tasks naturally navigable by AI coding agents: |
| 59 | +**Keybindings**: Press `1/2/3/4/0` to switch tabs. Full vim-style navigation (`hjkl`, arrows, etc.). |
140 | 60 |
|
141 | | -```sh |
142 | | -grep -r "priority: Critical" tasks/ # find all critical tasks |
143 | | -grep -r "bucket: Team" tasks/ # find all team tasks |
144 | | -ls tasks/ # browse tasks by name |
145 | | -cat tasks/550e8400-*.md # read a specific task |
146 | | -``` |
| 61 | +## Documentation |
147 | 62 |
|
148 | | -Default data directory: |
| 63 | +### CLI |
| 64 | +- [Task Commands](docs/cli/tasks.md) - CRUD operations for tasks |
| 65 | +- [Bucket Commands](docs/cli/buckets.md) - Manage task columns/categories |
| 66 | +- [Undo/History](docs/cli/undo.md) - Rollback operations |
149 | 67 |
|
150 | | -- **macOS**: `~/Library/Application Support/aipm/` |
151 | | -- **Linux**: `$XDG_DATA_HOME/aipm/` or `~/.local/share/aipm/` |
| 68 | +### Features |
| 69 | +- [AI Triage](docs/features/ai.md) - Natural language task management |
| 70 | +- [Email Suggestions](docs/features/suggestions.md) - Apple Mail MCP integration |
152 | 71 |
|
153 | | -Override with `AIPM_DATA_DIR` environment variable. |
| 72 | +### UI |
| 73 | +- [Keybindings](docs/ui/keybindings.md) - Complete keyboard reference |
154 | 74 |
|
155 | | -Existing `tasks.json` data is automatically migrated to the new format on first run. |
| 75 | +### Data |
| 76 | +- [Storage Format](docs/data/storage.md) - File-per-task architecture details |
156 | 77 |
|
157 | 78 | ## License |
158 | 79 |
|
|
0 commit comments