agkan 1.0.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/README.ja.md +1127 -0
- package/README.md +1140 -0
- package/bin/agkan +2 -0
- package/dist/cli/commands/block/add.d.ts +6 -0
- package/dist/cli/commands/block/add.d.ts.map +1 -0
- package/dist/cli/commands/block/add.js +135 -0
- package/dist/cli/commands/block/add.js.map +1 -0
- package/dist/cli/commands/block/list.d.ts +6 -0
- package/dist/cli/commands/block/list.d.ts.map +1 -0
- package/dist/cli/commands/block/list.js +120 -0
- package/dist/cli/commands/block/list.js.map +1 -0
- package/dist/cli/commands/block/remove.d.ts +6 -0
- package/dist/cli/commands/block/remove.d.ts.map +1 -0
- package/dist/cli/commands/block/remove.js +117 -0
- package/dist/cli/commands/block/remove.js.map +1 -0
- package/dist/cli/commands/meta/delete.d.ts +6 -0
- package/dist/cli/commands/meta/delete.d.ts.map +1 -0
- package/dist/cli/commands/meta/delete.js +67 -0
- package/dist/cli/commands/meta/delete.js.map +1 -0
- package/dist/cli/commands/meta/get.d.ts +6 -0
- package/dist/cli/commands/meta/get.d.ts.map +1 -0
- package/dist/cli/commands/meta/get.js +71 -0
- package/dist/cli/commands/meta/get.js.map +1 -0
- package/dist/cli/commands/meta/list.d.ts +6 -0
- package/dist/cli/commands/meta/list.d.ts.map +1 -0
- package/dist/cli/commands/meta/list.js +69 -0
- package/dist/cli/commands/meta/list.js.map +1 -0
- package/dist/cli/commands/meta/set.d.ts +6 -0
- package/dist/cli/commands/meta/set.d.ts.map +1 -0
- package/dist/cli/commands/meta/set.js +85 -0
- package/dist/cli/commands/meta/set.js.map +1 -0
- package/dist/cli/commands/tag/add.d.ts +6 -0
- package/dist/cli/commands/tag/add.d.ts.map +1 -0
- package/dist/cli/commands/tag/add.js +99 -0
- package/dist/cli/commands/tag/add.js.map +1 -0
- package/dist/cli/commands/tag/attach.d.ts +6 -0
- package/dist/cli/commands/tag/attach.d.ts.map +1 -0
- package/dist/cli/commands/tag/attach.js +119 -0
- package/dist/cli/commands/tag/attach.js.map +1 -0
- package/dist/cli/commands/tag/delete.d.ts +6 -0
- package/dist/cli/commands/tag/delete.d.ts.map +1 -0
- package/dist/cli/commands/tag/delete.js +93 -0
- package/dist/cli/commands/tag/delete.js.map +1 -0
- package/dist/cli/commands/tag/detach.d.ts +6 -0
- package/dist/cli/commands/tag/detach.d.ts.map +1 -0
- package/dist/cli/commands/tag/detach.js +118 -0
- package/dist/cli/commands/tag/detach.js.map +1 -0
- package/dist/cli/commands/tag/list.d.ts +6 -0
- package/dist/cli/commands/tag/list.d.ts.map +1 -0
- package/dist/cli/commands/tag/list.js +80 -0
- package/dist/cli/commands/tag/list.js.map +1 -0
- package/dist/cli/commands/tag/show.d.ts +6 -0
- package/dist/cli/commands/tag/show.d.ts.map +1 -0
- package/dist/cli/commands/tag/show.js +88 -0
- package/dist/cli/commands/tag/show.js.map +1 -0
- package/dist/cli/commands/task/add-helpers.d.ts +17 -0
- package/dist/cli/commands/task/add-helpers.d.ts.map +1 -0
- package/dist/cli/commands/task/add-helpers.js +122 -0
- package/dist/cli/commands/task/add-helpers.js.map +1 -0
- package/dist/cli/commands/task/add.d.ts +6 -0
- package/dist/cli/commands/task/add.d.ts.map +1 -0
- package/dist/cli/commands/task/add.js +140 -0
- package/dist/cli/commands/task/add.js.map +1 -0
- package/dist/cli/commands/task/count.d.ts +6 -0
- package/dist/cli/commands/task/count.d.ts.map +1 -0
- package/dist/cli/commands/task/count.js +97 -0
- package/dist/cli/commands/task/count.js.map +1 -0
- package/dist/cli/commands/task/delete.d.ts +6 -0
- package/dist/cli/commands/task/delete.d.ts.map +1 -0
- package/dist/cli/commands/task/delete.js +59 -0
- package/dist/cli/commands/task/delete.js.map +1 -0
- package/dist/cli/commands/task/find.d.ts +7 -0
- package/dist/cli/commands/task/find.d.ts.map +1 -0
- package/dist/cli/commands/task/find.js +118 -0
- package/dist/cli/commands/task/find.js.map +1 -0
- package/dist/cli/commands/task/get.d.ts +6 -0
- package/dist/cli/commands/task/get.d.ts.map +1 -0
- package/dist/cli/commands/task/get.js +196 -0
- package/dist/cli/commands/task/get.js.map +1 -0
- package/dist/cli/commands/task/list.d.ts +6 -0
- package/dist/cli/commands/task/list.d.ts.map +1 -0
- package/dist/cli/commands/task/list.js +301 -0
- package/dist/cli/commands/task/list.js.map +1 -0
- package/dist/cli/commands/task/update-parent.d.ts +6 -0
- package/dist/cli/commands/task/update-parent.d.ts.map +1 -0
- package/dist/cli/commands/task/update-parent.js +123 -0
- package/dist/cli/commands/task/update-parent.js.map +1 -0
- package/dist/cli/commands/task/update.d.ts +6 -0
- package/dist/cli/commands/task/update.d.ts.map +1 -0
- package/dist/cli/commands/task/update.js +96 -0
- package/dist/cli/commands/task/update.js.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 +68 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/array-utils.d.ts +15 -0
- package/dist/cli/utils/array-utils.d.ts.map +1 -0
- package/dist/cli/utils/array-utils.js +20 -0
- package/dist/cli/utils/array-utils.js.map +1 -0
- package/dist/cli/utils/error-handler.d.ts +35 -0
- package/dist/cli/utils/error-handler.d.ts.map +1 -0
- package/dist/cli/utils/error-handler.js +84 -0
- package/dist/cli/utils/error-handler.js.map +1 -0
- package/dist/cli/utils/output-formatter.d.ts +34 -0
- package/dist/cli/utils/output-formatter.d.ts.map +1 -0
- package/dist/cli/utils/output-formatter.js +44 -0
- package/dist/cli/utils/output-formatter.js.map +1 -0
- package/dist/cli/utils/response-formatter.d.ts +19 -0
- package/dist/cli/utils/response-formatter.d.ts.map +1 -0
- package/dist/cli/utils/response-formatter.js +43 -0
- package/dist/cli/utils/response-formatter.js.map +1 -0
- package/dist/cli/utils/validators.d.ts +23 -0
- package/dist/cli/utils/validators.d.ts.map +1 -0
- package/dist/cli/utils/validators.js +47 -0
- package/dist/cli/utils/validators.js.map +1 -0
- package/dist/db/config.d.ts +27 -0
- package/dist/db/config.d.ts.map +1 -0
- package/dist/db/config.js +116 -0
- package/dist/db/config.js.map +1 -0
- package/dist/db/connection.d.ts +24 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +62 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/reset.d.ts +8 -0
- package/dist/db/reset.d.ts.map +1 -0
- package/dist/db/reset.js +33 -0
- package/dist/db/reset.js.map +1 -0
- package/dist/db/schema.d.ts +6 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +134 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/models/Attachment.d.ts +25 -0
- package/dist/models/Attachment.d.ts.map +1 -0
- package/dist/models/Attachment.js +7 -0
- package/dist/models/Attachment.js.map +1 -0
- package/dist/models/Tag.d.ts +24 -0
- package/dist/models/Tag.d.ts.map +1 -0
- package/dist/models/Tag.js +3 -0
- package/dist/models/Tag.js.map +1 -0
- package/dist/models/Task.d.ts +55 -0
- package/dist/models/Task.d.ts.map +1 -0
- package/dist/models/Task.js +7 -0
- package/dist/models/Task.js.map +1 -0
- package/dist/models/TaskBlock.d.ts +11 -0
- package/dist/models/TaskBlock.d.ts.map +1 -0
- package/dist/models/TaskBlock.js +3 -0
- package/dist/models/TaskBlock.js.map +1 -0
- package/dist/models/TaskMetadata.d.ts +30 -0
- package/dist/models/TaskMetadata.d.ts.map +1 -0
- package/dist/models/TaskMetadata.js +3 -0
- package/dist/models/TaskMetadata.js.map +1 -0
- package/dist/models/TaskTag.d.ts +11 -0
- package/dist/models/TaskTag.d.ts.map +1 -0
- package/dist/models/TaskTag.js +3 -0
- package/dist/models/TaskTag.js.map +1 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +7 -0
- package/dist/models/index.js.map +1 -0
- package/dist/services/AttachmentService.d.ts +62 -0
- package/dist/services/AttachmentService.d.ts.map +1 -0
- package/dist/services/AttachmentService.js +95 -0
- package/dist/services/AttachmentService.js.map +1 -0
- package/dist/services/FileService.d.ts +31 -0
- package/dist/services/FileService.d.ts.map +1 -0
- package/dist/services/FileService.js +77 -0
- package/dist/services/FileService.js.map +1 -0
- package/dist/services/MetadataService.d.ts +49 -0
- package/dist/services/MetadataService.d.ts.map +1 -0
- package/dist/services/MetadataService.js +126 -0
- package/dist/services/MetadataService.js.map +1 -0
- package/dist/services/TagService.d.ts +49 -0
- package/dist/services/TagService.d.ts.map +1 -0
- package/dist/services/TagService.js +127 -0
- package/dist/services/TagService.js.map +1 -0
- package/dist/services/TaskBlockService.d.ts +49 -0
- package/dist/services/TaskBlockService.d.ts.map +1 -0
- package/dist/services/TaskBlockService.js +118 -0
- package/dist/services/TaskBlockService.js.map +1 -0
- package/dist/services/TaskService.d.ts +89 -0
- package/dist/services/TaskService.d.ts.map +1 -0
- package/dist/services/TaskService.js +285 -0
- package/dist/services/TaskService.js.map +1 -0
- package/dist/services/TaskTagService.d.ts +66 -0
- package/dist/services/TaskTagService.d.ts.map +1 -0
- package/dist/services/TaskTagService.js +171 -0
- package/dist/services/TaskTagService.js.map +1 -0
- package/dist/services/index.d.ts +11 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +20 -0
- package/dist/services/index.js.map +1 -0
- package/dist/utils/cycle-detector.d.ts +14 -0
- package/dist/utils/cycle-detector.d.ts.map +1 -0
- package/dist/utils/cycle-detector.js +32 -0
- package/dist/utils/cycle-detector.js.map +1 -0
- package/dist/utils/format.d.ts +13 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +29 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/input-validators.d.ts +32 -0
- package/dist/utils/input-validators.d.ts.map +1 -0
- package/dist/utils/input-validators.js +108 -0
- package/dist/utils/input-validators.js.map +1 -0
- package/dist/utils/security.d.ts +11 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +29 -0
- package/dist/utils/security.js.map +1 -0
- package/package.json +70 -0
package/README.md
ADDED
|
@@ -0,0 +1,1140 @@
|
|
|
1
|
+
# agkan
|
|
2
|
+
|
|
3
|
+
[](https://github.com/gendosu/agkan/actions/workflows/test.yml)
|
|
4
|
+
[](https://github.com/gendosu/agkan/actions/workflows/quality.yml)
|
|
5
|
+
|
|
6
|
+
A lightweight CLI task management tool implemented in TypeScript. Optimized for collaborative work with AI agents.
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- **Simple CLI**: Intuitive command-line interface
|
|
11
|
+
- **SQLite-based**: Fast local data management
|
|
12
|
+
- **Kanban Format**: Manage tasks with 6 statuses (backlog, ready, in_progress, review, done, closed)
|
|
13
|
+
- **Flexible Input**: Create tasks from command-line arguments or Markdown files
|
|
14
|
+
- **Filtering**: Narrow down tasks by status or author
|
|
15
|
+
- **Color-coded Display**: Easy-to-read color-coded display by status
|
|
16
|
+
- **Parent-Child Relationships**: Manage task hierarchy (tree view supported)
|
|
17
|
+
- **Blocking Relationships**: Manage task dependencies (includes circular reference detection)
|
|
18
|
+
- **Tag System**: Classify and search tasks with tags
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
### Prerequisites
|
|
23
|
+
|
|
24
|
+
- Node.js 18 or higher
|
|
25
|
+
- npm
|
|
26
|
+
|
|
27
|
+
### Install from npm (Recommended)
|
|
28
|
+
|
|
29
|
+
Install as a global command:
|
|
30
|
+
```bash
|
|
31
|
+
npm install -g agkan
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Now the `agkan` command is available system-wide.
|
|
35
|
+
|
|
36
|
+
### Install from GitHub
|
|
37
|
+
|
|
38
|
+
Install directly from the repository:
|
|
39
|
+
```bash
|
|
40
|
+
npm install -g https://github.com/gendosu/agkan.git
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
### Database Storage Location
|
|
46
|
+
|
|
47
|
+
agkan allows customization of the database storage location via a configuration file.
|
|
48
|
+
|
|
49
|
+
#### Configuration File: `.agkan.yml`
|
|
50
|
+
|
|
51
|
+
Create a `.agkan.yml` file in your project root directory to specify the database storage location.
|
|
52
|
+
|
|
53
|
+
**Configuration Example:**
|
|
54
|
+
|
|
55
|
+
```yaml
|
|
56
|
+
# Path to database file
|
|
57
|
+
path: ./.agkan/data.db
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### Path Specification
|
|
61
|
+
|
|
62
|
+
- **Relative Path**: Resolved relative to the current directory
|
|
63
|
+
```yaml
|
|
64
|
+
path: ./data/kanban.db
|
|
65
|
+
path: ./.agkan/data.db
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- **Absolute Path**: Used as-is
|
|
69
|
+
```yaml
|
|
70
|
+
path: /home/user/.config/akan/data.db
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### Environment Variable Configuration
|
|
74
|
+
|
|
75
|
+
agkan supports the `AGENT_KANBAN_DB_PATH` environment variable for specifying the database location. This is particularly useful in CI/CD environments and for managing multiple environments.
|
|
76
|
+
|
|
77
|
+
**Setting the Environment Variable:**
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Use a custom database path
|
|
81
|
+
export AGENT_KANBAN_DB_PATH=/path/to/your/database.db
|
|
82
|
+
agkan task list
|
|
83
|
+
|
|
84
|
+
# Use absolute path
|
|
85
|
+
export AGENT_KANBAN_DB_PATH=/home/user/.config/akan/data.db
|
|
86
|
+
|
|
87
|
+
# Use relative path
|
|
88
|
+
export AGENT_KANBAN_DB_PATH=./custom/location/data.db
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Priority Order:**
|
|
92
|
+
|
|
93
|
+
The database path is resolved in the following priority order:
|
|
94
|
+
|
|
95
|
+
**Normal Mode (when `NODE_ENV` is not `test`):**
|
|
96
|
+
1. **Environment Variable** (highest priority): `AGENT_KANBAN_DB_PATH`
|
|
97
|
+
2. **Configuration File** (fallback): `path` field in `.agkan.yml`
|
|
98
|
+
3. **Default Path** (lowest priority): `.agkan/data.db`
|
|
99
|
+
|
|
100
|
+
**Test Mode (when `NODE_ENV=test`):**
|
|
101
|
+
1. **Environment Variable** (highest priority): `AGENT_KANBAN_DB_PATH`
|
|
102
|
+
2. **Configuration File** (fallback): `path` field in `.agkan-test.yml`
|
|
103
|
+
3. **Default Path** (lowest priority): `.agkan-test/data.db`
|
|
104
|
+
|
|
105
|
+
**Test Mode Explanation:**
|
|
106
|
+
|
|
107
|
+
Test mode (`NODE_ENV=test`) automatically isolates test data from production data:
|
|
108
|
+
|
|
109
|
+
- Uses separate configuration file: `.agkan-test.yml` instead of `.agkan.yml`
|
|
110
|
+
- Uses separate default directory: `.agkan-test/` instead of `.agkan/`
|
|
111
|
+
- Environment variable still takes highest priority in test mode
|
|
112
|
+
- Prevents accidental mixing of test and production data
|
|
113
|
+
|
|
114
|
+
**Use Cases:**
|
|
115
|
+
|
|
116
|
+
1. **CI/CD Pipeline:**
|
|
117
|
+
```bash
|
|
118
|
+
# Use temporary database for CI tests
|
|
119
|
+
export AGENT_KANBAN_DB_PATH=/tmp/ci-test-db.db
|
|
120
|
+
agkan task list
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
2. **Multiple Environments:**
|
|
124
|
+
```bash
|
|
125
|
+
# Development environment
|
|
126
|
+
export AGENT_KANBAN_DB_PATH=./dev/data.db
|
|
127
|
+
|
|
128
|
+
# Staging environment
|
|
129
|
+
export AGENT_KANBAN_DB_PATH=./staging/data.db
|
|
130
|
+
|
|
131
|
+
# Production environment
|
|
132
|
+
export AGENT_KANBAN_DB_PATH=./prod/data.db
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
3. **Testing:**
|
|
136
|
+
```bash
|
|
137
|
+
# Automated tests with isolated database
|
|
138
|
+
NODE_ENV=test npm test
|
|
139
|
+
# Uses .agkan-test/data.db by default
|
|
140
|
+
|
|
141
|
+
# Override with custom test database
|
|
142
|
+
NODE_ENV=test AGENT_KANBAN_DB_PATH=/tmp/test.db npm test
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### Default Behavior
|
|
146
|
+
|
|
147
|
+
If no `.agkan.yml` file exists and no environment variable is set, the database is created in:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
<current-directory>/.agkan/data.db
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
In test mode (`NODE_ENV=test`), the default location is:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
<current-directory>/.agkan-test/data.db
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
#### Per-Project Management
|
|
160
|
+
|
|
161
|
+
To manage separate tasks for different projects, place `.agkan.yml` in each project root:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# Project A
|
|
165
|
+
cd /path/to/projectA
|
|
166
|
+
cat > .agkan.yml << EOF
|
|
167
|
+
path: ./.agkan/data.db
|
|
168
|
+
EOF
|
|
169
|
+
|
|
170
|
+
# Project B
|
|
171
|
+
cd /path/to/projectB
|
|
172
|
+
cat > .agkan.yml << EOF
|
|
173
|
+
path: ./.agkan/data.db
|
|
174
|
+
EOF
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
This enables independent task management for each project.
|
|
178
|
+
|
|
179
|
+
## Usage
|
|
180
|
+
|
|
181
|
+
### Create Tasks
|
|
182
|
+
|
|
183
|
+
Basic task creation:
|
|
184
|
+
```bash
|
|
185
|
+
agkan task add "Task title" "Task description"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Create with options:
|
|
189
|
+
```bash
|
|
190
|
+
agkan task add "Implement login feature" "Implement user authentication system" \
|
|
191
|
+
--status ready \
|
|
192
|
+
--author "developer-name"
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Create with parent task:
|
|
196
|
+
```bash
|
|
197
|
+
agkan task add "Subtask" "Detailed work item" --parent 1
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Create from Markdown file:
|
|
201
|
+
```bash
|
|
202
|
+
agkan task add "Design review" --file ./design-doc.md --status backlog
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
JSON output format:
|
|
206
|
+
```bash
|
|
207
|
+
agkan task add "Fix bug in login" --json
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"success": true,
|
|
213
|
+
"task": {
|
|
214
|
+
"id": 1,
|
|
215
|
+
"title": "Fix bug in login",
|
|
216
|
+
"status": "backlog",
|
|
217
|
+
"body": null,
|
|
218
|
+
"author": null,
|
|
219
|
+
"parent_id": null,
|
|
220
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
221
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
222
|
+
},
|
|
223
|
+
"parent": null,
|
|
224
|
+
"blockedBy": [],
|
|
225
|
+
"blocking": []
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### List Tasks
|
|
230
|
+
|
|
231
|
+
Display all tasks:
|
|
232
|
+
```bash
|
|
233
|
+
agkan task list
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Display in tree format (including parent-child relationships):
|
|
237
|
+
```bash
|
|
238
|
+
agkan task list --tree
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Display root tasks only (tasks without parents):
|
|
242
|
+
```bash
|
|
243
|
+
agkan task list --root-only
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Filter by status:
|
|
247
|
+
```bash
|
|
248
|
+
agkan task list --status in_progress
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Filter by author:
|
|
252
|
+
```bash
|
|
253
|
+
agkan task list --author "developer-name"
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Combined filters:
|
|
257
|
+
```bash
|
|
258
|
+
agkan task list --status ready --author "developer-name"
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Filter by tag:
|
|
262
|
+
```bash
|
|
263
|
+
agkan task list --tag "frontend"
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
JSON output format:
|
|
267
|
+
```bash
|
|
268
|
+
agkan task list --json
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
```json
|
|
272
|
+
{
|
|
273
|
+
"tasks": [
|
|
274
|
+
{
|
|
275
|
+
"id": 1,
|
|
276
|
+
"title": "Implement login feature",
|
|
277
|
+
"status": "in_progress",
|
|
278
|
+
"body": "Implement user authentication system",
|
|
279
|
+
"author": "developer-name",
|
|
280
|
+
"parent_id": null,
|
|
281
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
282
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"id": 2,
|
|
286
|
+
"title": "Design review",
|
|
287
|
+
"status": "backlog",
|
|
288
|
+
"body": null,
|
|
289
|
+
"author": null,
|
|
290
|
+
"parent_id": null,
|
|
291
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
292
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
293
|
+
}
|
|
294
|
+
]
|
|
295
|
+
}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Search Tasks
|
|
299
|
+
|
|
300
|
+
Search by keyword (in title and body):
|
|
301
|
+
```bash
|
|
302
|
+
agkan task find "search keyword"
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Include completed tasks in search:
|
|
306
|
+
```bash
|
|
307
|
+
agkan task find "search keyword" --all
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Note: By default, `done` and `closed` tasks are excluded from search results.
|
|
311
|
+
|
|
312
|
+
JSON output format:
|
|
313
|
+
```bash
|
|
314
|
+
agkan task find "login" --json
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
```json
|
|
318
|
+
{
|
|
319
|
+
"tasks": [
|
|
320
|
+
{
|
|
321
|
+
"id": 1,
|
|
322
|
+
"title": "Implement login feature",
|
|
323
|
+
"status": "in_progress",
|
|
324
|
+
"body": "Implement user authentication system",
|
|
325
|
+
"author": "developer-name",
|
|
326
|
+
"parent_id": null,
|
|
327
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
328
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Get Task Details
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
agkan task get 1
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
JSON output format:
|
|
341
|
+
```bash
|
|
342
|
+
agkan task get 1 --json
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"task": {
|
|
348
|
+
"id": 1,
|
|
349
|
+
"title": "Implement login feature",
|
|
350
|
+
"status": "in_progress",
|
|
351
|
+
"body": "Implement user authentication system",
|
|
352
|
+
"author": "developer-name",
|
|
353
|
+
"parent_id": null,
|
|
354
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
355
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Update Tasks
|
|
361
|
+
|
|
362
|
+
Change status:
|
|
363
|
+
```bash
|
|
364
|
+
agkan task update 1 status done
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Change title:
|
|
368
|
+
```bash
|
|
369
|
+
agkan task update 1 title "New title"
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Change body:
|
|
373
|
+
```bash
|
|
374
|
+
agkan task update 1 body "New description"
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
Change author:
|
|
378
|
+
```bash
|
|
379
|
+
agkan task update 1 author "new-author"
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Manage Parent-Child Relationships
|
|
383
|
+
|
|
384
|
+
Update parent task:
|
|
385
|
+
```bash
|
|
386
|
+
# Set parent of task 2 to task 1
|
|
387
|
+
agkan task update-parent 2 1
|
|
388
|
+
|
|
389
|
+
# Remove parent (orphan task 2)
|
|
390
|
+
agkan task update-parent 2 null
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
Notes:
|
|
394
|
+
- Deleting a parent task automatically removes the parent reference from child tasks (orphaning them)
|
|
395
|
+
- Circular references are automatically detected and prevented
|
|
396
|
+
|
|
397
|
+
JSON output format:
|
|
398
|
+
```bash
|
|
399
|
+
agkan task update-parent 2 1 --json
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
```json
|
|
403
|
+
{
|
|
404
|
+
"success": true,
|
|
405
|
+
"task": {
|
|
406
|
+
"id": 2,
|
|
407
|
+
"title": "Child Task",
|
|
408
|
+
"status": "backlog",
|
|
409
|
+
"body": null,
|
|
410
|
+
"author": null,
|
|
411
|
+
"parent_id": 1,
|
|
412
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
413
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
414
|
+
},
|
|
415
|
+
"parent": {
|
|
416
|
+
"id": 1,
|
|
417
|
+
"title": "Parent Task",
|
|
418
|
+
"status": "backlog",
|
|
419
|
+
"body": null,
|
|
420
|
+
"author": null,
|
|
421
|
+
"parent_id": null,
|
|
422
|
+
"created_at": "2026-02-15T00:00:00.000Z",
|
|
423
|
+
"updated_at": "2026-02-15T00:00:00.000Z"
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Manage Blocking Relationships
|
|
429
|
+
|
|
430
|
+
Add blocking relationship (task 1 blocks task 2):
|
|
431
|
+
```bash
|
|
432
|
+
agkan task block add 1 2
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Remove blocking relationship:
|
|
436
|
+
```bash
|
|
437
|
+
agkan task block remove 1 2
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
List blocking relationships:
|
|
441
|
+
```bash
|
|
442
|
+
# Show blocking relationships for task 1
|
|
443
|
+
agkan task block list 1
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Notes:
|
|
447
|
+
- Circular references are automatically detected and prevented
|
|
448
|
+
- Blocking relationships are automatically deleted when a task is deleted (CASCADE DELETE)
|
|
449
|
+
|
|
450
|
+
JSON output format:
|
|
451
|
+
```bash
|
|
452
|
+
agkan task block list 2 --json
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
```json
|
|
456
|
+
{
|
|
457
|
+
"task": {
|
|
458
|
+
"id": 2,
|
|
459
|
+
"title": "API implementation",
|
|
460
|
+
"status": "backlog"
|
|
461
|
+
},
|
|
462
|
+
"blockedBy": [
|
|
463
|
+
{
|
|
464
|
+
"id": 1,
|
|
465
|
+
"title": "Database design",
|
|
466
|
+
"status": "in_progress"
|
|
467
|
+
}
|
|
468
|
+
],
|
|
469
|
+
"blocking": [
|
|
470
|
+
{
|
|
471
|
+
"id": 3,
|
|
472
|
+
"title": "Frontend implementation",
|
|
473
|
+
"status": "backlog"
|
|
474
|
+
}
|
|
475
|
+
]
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Delete Tasks
|
|
480
|
+
|
|
481
|
+
Delete a task:
|
|
482
|
+
```bash
|
|
483
|
+
agkan task delete 1
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Manage Tags
|
|
487
|
+
|
|
488
|
+
Create a tag:
|
|
489
|
+
```bash
|
|
490
|
+
agkan task tag add "frontend"
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
List all tags:
|
|
494
|
+
```bash
|
|
495
|
+
agkan task tag list
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
Delete a tag:
|
|
499
|
+
```bash
|
|
500
|
+
agkan task tag delete "frontend"
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
JSON output format for tag list:
|
|
504
|
+
```bash
|
|
505
|
+
agkan task tag list --json
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
```json
|
|
509
|
+
{
|
|
510
|
+
"totalCount": 2,
|
|
511
|
+
"tags": [
|
|
512
|
+
{
|
|
513
|
+
"id": 1,
|
|
514
|
+
"name": "frontend",
|
|
515
|
+
"taskCount": 3,
|
|
516
|
+
"created_at": "2026-02-15T00:00:00.000Z"
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
"id": 2,
|
|
520
|
+
"name": "backend",
|
|
521
|
+
"taskCount": 1,
|
|
522
|
+
"created_at": "2026-02-15T00:00:00.000Z"
|
|
523
|
+
}
|
|
524
|
+
]
|
|
525
|
+
}
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
### Attach Tags to Tasks
|
|
529
|
+
|
|
530
|
+
Attach a tag to a task:
|
|
531
|
+
```bash
|
|
532
|
+
agkan task tag attach 1 "frontend"
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
Remove a tag from a task:
|
|
536
|
+
```bash
|
|
537
|
+
agkan task tag detach 1 "frontend"
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
Display tags on a task:
|
|
541
|
+
```bash
|
|
542
|
+
agkan task tag show 1
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
JSON output format for tag show:
|
|
546
|
+
```bash
|
|
547
|
+
agkan task tag show 1 --json
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
```json
|
|
551
|
+
{
|
|
552
|
+
"task": {
|
|
553
|
+
"id": 1,
|
|
554
|
+
"title": "Implement login screen",
|
|
555
|
+
"status": "in_progress"
|
|
556
|
+
},
|
|
557
|
+
"tags": [
|
|
558
|
+
{
|
|
559
|
+
"id": 1,
|
|
560
|
+
"name": "frontend",
|
|
561
|
+
"created_at": "2026-02-15T00:00:00.000Z"
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"id": 3,
|
|
565
|
+
"name": "urgent",
|
|
566
|
+
"created_at": "2026-02-15T00:00:00.000Z"
|
|
567
|
+
}
|
|
568
|
+
]
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
### Manage Metadata
|
|
573
|
+
|
|
574
|
+
Set metadata:
|
|
575
|
+
```bash
|
|
576
|
+
agkan task meta set 1 priority high
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
Get metadata:
|
|
580
|
+
```bash
|
|
581
|
+
agkan task meta get 1 priority
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
List all metadata:
|
|
585
|
+
```bash
|
|
586
|
+
agkan task meta list 1
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
Delete metadata:
|
|
590
|
+
```bash
|
|
591
|
+
agkan task meta delete 1 priority
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
#### Priority (priority)
|
|
595
|
+
|
|
596
|
+
Task priority is managed with the `priority` key:
|
|
597
|
+
|
|
598
|
+
| Value | Meaning |
|
|
599
|
+
|-------|---------|
|
|
600
|
+
| `critical` | Requires immediate action. A blocking issue. |
|
|
601
|
+
| `high` | Should be addressed with priority |
|
|
602
|
+
| `medium` | Normal priority (default) |
|
|
603
|
+
| `low` | Address when time permits |
|
|
604
|
+
|
|
605
|
+
### Count Tasks
|
|
606
|
+
|
|
607
|
+
Display task count for all statuses:
|
|
608
|
+
```bash
|
|
609
|
+
agkan task count
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
Display task count for a specific status:
|
|
613
|
+
```bash
|
|
614
|
+
agkan task count --status in_progress
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
Script-friendly output (numbers only):
|
|
618
|
+
```bash
|
|
619
|
+
agkan task count -s in_progress -q
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
JSON output format for all statuses:
|
|
623
|
+
```bash
|
|
624
|
+
agkan task count --json
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
```json
|
|
628
|
+
{
|
|
629
|
+
"total": 10,
|
|
630
|
+
"counts": {
|
|
631
|
+
"backlog": 3,
|
|
632
|
+
"ready": 2,
|
|
633
|
+
"in_progress": 4,
|
|
634
|
+
"done": 1,
|
|
635
|
+
"closed": 0
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
JSON output format for specific status:
|
|
641
|
+
```bash
|
|
642
|
+
agkan task count --status in_progress --json
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
```json
|
|
646
|
+
{
|
|
647
|
+
"status": "in_progress",
|
|
648
|
+
"count": 4
|
|
649
|
+
}
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
### Display Help
|
|
653
|
+
|
|
654
|
+
Show command list:
|
|
655
|
+
```bash
|
|
656
|
+
agkan --help
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
Show task command help:
|
|
660
|
+
```bash
|
|
661
|
+
agkan task --help
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
Show help for specific command:
|
|
665
|
+
```bash
|
|
666
|
+
agkan task add --help
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
## JSON Output Format
|
|
670
|
+
|
|
671
|
+
agkan supports machine-readable JSON output for 9 data retrieval and display commands. Add the `--json` flag to output structured data instead of human-readable text.
|
|
672
|
+
|
|
673
|
+
### Supported Commands
|
|
674
|
+
|
|
675
|
+
The following commands support JSON output:
|
|
676
|
+
|
|
677
|
+
- `task add` - Create a new task
|
|
678
|
+
- `task list` - List tasks (with filtering)
|
|
679
|
+
- `task get` - Get task details
|
|
680
|
+
- `task find` - Search tasks by keyword
|
|
681
|
+
- `task count` - Count tasks by status
|
|
682
|
+
- `task update-parent` - Update parent-child relationship
|
|
683
|
+
- `task block list` - List blocking relationships
|
|
684
|
+
- `task tag list` - List all tags with task counts
|
|
685
|
+
- `task tag show` - Show tags for a specific task
|
|
686
|
+
- `task meta list` - List all metadata for a task
|
|
687
|
+
|
|
688
|
+
### Output Structure
|
|
689
|
+
|
|
690
|
+
All JSON responses follow these patterns:
|
|
691
|
+
|
|
692
|
+
**Success responses** include:
|
|
693
|
+
- Operation-specific data (task, tasks array, counts, etc.)
|
|
694
|
+
- Related data (parent, blockedBy, blocking, tags, etc.)
|
|
695
|
+
- Optional `success: true` field for write operations
|
|
696
|
+
|
|
697
|
+
**Error responses** follow the format:
|
|
698
|
+
```json
|
|
699
|
+
{
|
|
700
|
+
"success": false,
|
|
701
|
+
"error": {
|
|
702
|
+
"message": "Error description"
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
### Common Use Cases
|
|
708
|
+
|
|
709
|
+
**1. Scripting and Automation**
|
|
710
|
+
```bash
|
|
711
|
+
# Get task count for CI/CD pipeline
|
|
712
|
+
TASK_COUNT=$(agkan task count --status backlog --json | jq '.counts.backlog')
|
|
713
|
+
|
|
714
|
+
# Extract task IDs for processing
|
|
715
|
+
agkan task list --status ready --json | jq -r '.tasks[].id'
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
**2. Integration with Other Tools**
|
|
719
|
+
```bash
|
|
720
|
+
# Export tasks to external system
|
|
721
|
+
agkan task list --json | jq '.tasks' > tasks.json
|
|
722
|
+
|
|
723
|
+
# Process blocking relationships
|
|
724
|
+
agkan task block list 1 --json | jq '.blockedBy[].title'
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
**3. Validation and Testing**
|
|
728
|
+
```bash
|
|
729
|
+
# Verify task creation
|
|
730
|
+
RESULT=$(agkan task add "Test" --json)
|
|
731
|
+
echo $RESULT | jq -e '.success == true' && echo "Success"
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
## Usage Examples
|
|
735
|
+
|
|
736
|
+
### Hierarchical Task Management with Parent-Child Relationships
|
|
737
|
+
|
|
738
|
+
Example of managing a project as a parent task with individual work items as children:
|
|
739
|
+
|
|
740
|
+
```bash
|
|
741
|
+
# Create parent task
|
|
742
|
+
agkan task add "Website redesign"
|
|
743
|
+
# Output: Task created with ID: 1
|
|
744
|
+
|
|
745
|
+
# Create child tasks
|
|
746
|
+
agkan task add "Create design mockup" --parent 1
|
|
747
|
+
agkan task add "Implement frontend" --parent 1
|
|
748
|
+
agkan task add "Implement backend" --parent 1
|
|
749
|
+
|
|
750
|
+
# Display in tree format
|
|
751
|
+
agkan task list --tree
|
|
752
|
+
# Output:
|
|
753
|
+
# 1 [backlog] Website redesign
|
|
754
|
+
# ├─ 2 [backlog] Create design mockup
|
|
755
|
+
# ├─ 3 [backlog] Implement frontend
|
|
756
|
+
# └─ 4 [backlog] Implement backend
|
|
757
|
+
|
|
758
|
+
# Display task details (including parent information)
|
|
759
|
+
agkan task get 2
|
|
760
|
+
# Output:
|
|
761
|
+
# ID: 2
|
|
762
|
+
# Title: Create design mockup
|
|
763
|
+
# Parent ID: 1
|
|
764
|
+
# ...
|
|
765
|
+
|
|
766
|
+
# Change parent
|
|
767
|
+
agkan task add "UI/UX improvements"
|
|
768
|
+
# Output: Task created with ID: 5
|
|
769
|
+
agkan task update-parent 2 5
|
|
770
|
+
|
|
771
|
+
# Remove parent (orphan task)
|
|
772
|
+
agkan task update-parent 2 null
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
### Managing Dependencies with Blocking Relationships
|
|
776
|
+
|
|
777
|
+
Example of explicitly managing task dependencies:
|
|
778
|
+
|
|
779
|
+
```bash
|
|
780
|
+
# Create tasks
|
|
781
|
+
agkan task add "Database design"
|
|
782
|
+
# Output: Task created with ID: 1
|
|
783
|
+
|
|
784
|
+
agkan task add "API implementation"
|
|
785
|
+
# Output: Task created with ID: 2
|
|
786
|
+
|
|
787
|
+
agkan task add "Frontend implementation"
|
|
788
|
+
# Output: Task created with ID: 3
|
|
789
|
+
|
|
790
|
+
# Set blocking relationships (1 blocks 2, 2 blocks 3)
|
|
791
|
+
# Database design blocks API implementation
|
|
792
|
+
agkan task block add 1 2
|
|
793
|
+
|
|
794
|
+
# API implementation blocks Frontend implementation
|
|
795
|
+
agkan task block add 2 3
|
|
796
|
+
|
|
797
|
+
# Verify blocking relationships
|
|
798
|
+
agkan task block list 1
|
|
799
|
+
# Output:
|
|
800
|
+
# Task 1 blocks:
|
|
801
|
+
# - Task 2 (API implementation)
|
|
802
|
+
# Task 1 is blocked by:
|
|
803
|
+
# (none)
|
|
804
|
+
|
|
805
|
+
agkan task block list 2
|
|
806
|
+
# Output:
|
|
807
|
+
# Task 2 blocks:
|
|
808
|
+
# - Task 3 (Frontend implementation)
|
|
809
|
+
# Task 2 is blocked by:
|
|
810
|
+
# - Task 1 (Database design)
|
|
811
|
+
|
|
812
|
+
# Attempt circular reference (error)
|
|
813
|
+
agkan task block add 3 1
|
|
814
|
+
# Output: Error: Circular reference detected
|
|
815
|
+
|
|
816
|
+
# Remove blocking relationship
|
|
817
|
+
agkan task block remove 1 2
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
### Task Management with Tags
|
|
821
|
+
|
|
822
|
+
Example of classifying tasks with tags:
|
|
823
|
+
|
|
824
|
+
```bash
|
|
825
|
+
# Create tags
|
|
826
|
+
agkan task tag add "frontend"
|
|
827
|
+
agkan task tag add "backend"
|
|
828
|
+
agkan task tag add "urgent"
|
|
829
|
+
|
|
830
|
+
# Create tasks and attach tags
|
|
831
|
+
agkan task add "Implement login screen"
|
|
832
|
+
# Output: Task created with ID: 1
|
|
833
|
+
|
|
834
|
+
agkan task tag attach 1 "frontend"
|
|
835
|
+
agkan task tag attach 1 "urgent"
|
|
836
|
+
|
|
837
|
+
agkan task add "API development"
|
|
838
|
+
# Output: Task created with ID: 2
|
|
839
|
+
|
|
840
|
+
agkan task tag attach 2 "backend"
|
|
841
|
+
|
|
842
|
+
# Filter by tag
|
|
843
|
+
agkan task list --tag "frontend"
|
|
844
|
+
# Output:
|
|
845
|
+
# 1 [backlog] Implement login screen (tags: frontend, urgent)
|
|
846
|
+
|
|
847
|
+
# Display task tags
|
|
848
|
+
agkan task tag show 1
|
|
849
|
+
# Output:
|
|
850
|
+
# Tags for task 1:
|
|
851
|
+
# - frontend
|
|
852
|
+
# - urgent
|
|
853
|
+
|
|
854
|
+
# Remove a tag
|
|
855
|
+
agkan task tag detach 1 "urgent"
|
|
856
|
+
|
|
857
|
+
# Delete a tag (removes from all associated tasks)
|
|
858
|
+
agkan task tag delete "urgent"
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
## Task Statuses
|
|
862
|
+
|
|
863
|
+
- **backlog**: Not yet started tasks (gray display)
|
|
864
|
+
- **ready**: Tasks ready to be started (blue display)
|
|
865
|
+
- **in_progress**: Tasks currently being worked on (yellow display)
|
|
866
|
+
- **review**: Tasks under review (cyan display)
|
|
867
|
+
- **done**: Completed tasks (green display)
|
|
868
|
+
- **closed**: Closed tasks (magenta display)
|
|
869
|
+
|
|
870
|
+
## Planned Features
|
|
871
|
+
|
|
872
|
+
### Task Attachments
|
|
873
|
+
|
|
874
|
+
Task attachment management is currently under development. This feature will allow users to attach files to tasks for better context and documentation.
|
|
875
|
+
|
|
876
|
+
**Planned CLI Commands:**
|
|
877
|
+
- `agkan task attach add <task-id> <file-path>` - Attach a file to a task
|
|
878
|
+
- `agkan task attach list <task-id>` - List all attachments for a task
|
|
879
|
+
- `agkan task attach delete <attachment-id>` - Remove an attachment from a task
|
|
880
|
+
|
|
881
|
+
For detailed information about planned features, see [docs/planned-features.md](docs/planned-features.md).
|
|
882
|
+
|
|
883
|
+
## Technology Stack
|
|
884
|
+
|
|
885
|
+
- **Language**: TypeScript 5.x
|
|
886
|
+
- **CLI Framework**: Commander.js
|
|
887
|
+
- **Database**: SQLite3 (better-sqlite3)
|
|
888
|
+
- **Terminal Display**: Chalk
|
|
889
|
+
- **Build Tool**: TypeScript Compiler
|
|
890
|
+
|
|
891
|
+
## Project Structure
|
|
892
|
+
|
|
893
|
+
```
|
|
894
|
+
agkan/
|
|
895
|
+
├── bin/
|
|
896
|
+
│ └── agkan # CLI entry point
|
|
897
|
+
├── src/
|
|
898
|
+
│ ├── cli/
|
|
899
|
+
│ │ ├── commands/
|
|
900
|
+
│ │ │ ├── block/ # Blocking relationship commands
|
|
901
|
+
│ │ │ │ ├── add.ts
|
|
902
|
+
│ │ │ │ ├── list.ts
|
|
903
|
+
│ │ │ │ └── remove.ts
|
|
904
|
+
│ │ │ ├── meta/ # Metadata commands
|
|
905
|
+
│ │ │ │ ├── delete.ts
|
|
906
|
+
│ │ │ │ ├── get.ts
|
|
907
|
+
│ │ │ │ ├── list.ts
|
|
908
|
+
│ │ │ │ └── set.ts
|
|
909
|
+
│ │ │ ├── tag/ # Tag commands
|
|
910
|
+
│ │ │ │ ├── add.ts
|
|
911
|
+
│ │ │ │ ├── attach.ts
|
|
912
|
+
│ │ │ │ ├── delete.ts
|
|
913
|
+
│ │ │ │ ├── detach.ts
|
|
914
|
+
│ │ │ │ ├── list.ts
|
|
915
|
+
│ │ │ │ └── show.ts
|
|
916
|
+
│ │ │ └── task/ # Task commands
|
|
917
|
+
│ │ │ ├── add.ts
|
|
918
|
+
│ │ │ ├── count.ts
|
|
919
|
+
│ │ │ ├── delete.ts
|
|
920
|
+
│ │ │ ├── find.ts
|
|
921
|
+
│ │ │ ├── get.ts
|
|
922
|
+
│ │ │ ├── list.ts
|
|
923
|
+
│ │ │ ├── update-parent.ts
|
|
924
|
+
│ │ │ └── update.ts
|
|
925
|
+
│ │ ├── utils/ # CLI utilities
|
|
926
|
+
│ │ └── index.ts # CLI entry point and command registration
|
|
927
|
+
│ ├── db/
|
|
928
|
+
│ │ ├── config.ts # DB configuration
|
|
929
|
+
│ │ ├── connection.ts # Database connection management
|
|
930
|
+
│ │ ├── schema.ts # Schema definition and migration
|
|
931
|
+
│ │ └── reset.ts # DB reset for testing
|
|
932
|
+
│ ├── models/
|
|
933
|
+
│ │ ├── Task.ts # Task model
|
|
934
|
+
│ │ ├── Tag.ts # Tag model
|
|
935
|
+
│ │ ├── TaskBlock.ts # Blocking relationship model
|
|
936
|
+
│ │ ├── TaskMetadata.ts # Metadata model
|
|
937
|
+
│ │ ├── TaskTag.ts # Task-tag association model
|
|
938
|
+
│ │ └── index.ts
|
|
939
|
+
│ ├── services/
|
|
940
|
+
│ │ ├── TaskService.ts # Task management business logic
|
|
941
|
+
│ │ ├── TagService.ts # Tag management business logic
|
|
942
|
+
│ │ ├── TaskBlockService.ts # Blocking relationship management
|
|
943
|
+
│ │ ├── TaskTagService.ts # Task-tag association management
|
|
944
|
+
│ │ ├── MetadataService.ts # Metadata management
|
|
945
|
+
│ │ ├── FileService.ts # File reading
|
|
946
|
+
│ │ └── index.ts
|
|
947
|
+
│ └── utils/
|
|
948
|
+
│ ├── format.ts # Format utilities
|
|
949
|
+
│ ├── cycle-detector.ts # Circular reference detection
|
|
950
|
+
│ ├── input-validators.ts # Input validation
|
|
951
|
+
│ └── security.ts # Security utilities
|
|
952
|
+
├── dist/ # Build output directory
|
|
953
|
+
├── package.json
|
|
954
|
+
├── tsconfig.json
|
|
955
|
+
└── README.md
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
## Database Schema
|
|
959
|
+
|
|
960
|
+
### tasks Table
|
|
961
|
+
|
|
962
|
+
| Column Name | Type | Description |
|
|
963
|
+
|-------------|------|-------------|
|
|
964
|
+
| id | INTEGER | Primary key (auto-increment) |
|
|
965
|
+
| title | TEXT | Task title (required) |
|
|
966
|
+
| body | TEXT | Task body |
|
|
967
|
+
| status | TEXT | Status (backlog, ready, in_progress, review, done, closed) |
|
|
968
|
+
| author | TEXT | Creator/author |
|
|
969
|
+
| parent_id | INTEGER | Parent task ID (foreign key, nullable) |
|
|
970
|
+
| created_at | TEXT | Creation timestamp (ISO 8601 format) |
|
|
971
|
+
| updated_at | TEXT | Update timestamp (ISO 8601 format) |
|
|
972
|
+
|
|
973
|
+
Notes:
|
|
974
|
+
- `parent_id` is automatically set to NULL when parent task is deleted (ON DELETE SET NULL)
|
|
975
|
+
|
|
976
|
+
### attachments Table
|
|
977
|
+
|
|
978
|
+
| Column Name | Type | Description |
|
|
979
|
+
|-------------|------|-------------|
|
|
980
|
+
| id | INTEGER | Primary key (auto-increment) |
|
|
981
|
+
| task_id | INTEGER | Task ID (foreign key) |
|
|
982
|
+
| file_path | TEXT | File path (required) |
|
|
983
|
+
| created_at | TEXT | Creation timestamp (ISO 8601 format) |
|
|
984
|
+
|
|
985
|
+
### task_blocks Table
|
|
986
|
+
|
|
987
|
+
| Column Name | Type | Description |
|
|
988
|
+
|-------------|------|-------------|
|
|
989
|
+
| id | INTEGER | Primary key (auto-increment) |
|
|
990
|
+
| blocker_task_id | INTEGER | Task ID that blocks (foreign key) |
|
|
991
|
+
| blocked_task_id | INTEGER | Task ID that is blocked (foreign key) |
|
|
992
|
+
| created_at | TEXT | Creation timestamp (ISO 8601 format) |
|
|
993
|
+
|
|
994
|
+
Notes:
|
|
995
|
+
- `blocker_task_id` and `blocked_task_id` combination has a unique constraint
|
|
996
|
+
- Blocking relationships are automatically deleted when either task is deleted (ON DELETE CASCADE)
|
|
997
|
+
|
|
998
|
+
### tags Table
|
|
999
|
+
|
|
1000
|
+
| Column Name | Type | Description |
|
|
1001
|
+
|-------------|------|-------------|
|
|
1002
|
+
| id | INTEGER | Primary key (auto-increment) |
|
|
1003
|
+
| name | TEXT | Tag name (required, unique) |
|
|
1004
|
+
| created_at | TEXT | Creation timestamp (ISO 8601 format) |
|
|
1005
|
+
|
|
1006
|
+
### task_tags Table
|
|
1007
|
+
|
|
1008
|
+
| Column Name | Type | Description |
|
|
1009
|
+
|-------------|------|-------------|
|
|
1010
|
+
| id | INTEGER | Primary key (auto-increment) |
|
|
1011
|
+
| task_id | INTEGER | Task ID (foreign key) |
|
|
1012
|
+
| tag_id | INTEGER | Tag ID (foreign key) |
|
|
1013
|
+
| created_at | TEXT | Creation timestamp (ISO 8601 format) |
|
|
1014
|
+
|
|
1015
|
+
Notes:
|
|
1016
|
+
- `task_id` and `tag_id` combination has a unique constraint
|
|
1017
|
+
- Associations are automatically deleted when task or tag is deleted (ON DELETE CASCADE)
|
|
1018
|
+
|
|
1019
|
+
### task_metadata Table
|
|
1020
|
+
|
|
1021
|
+
| Column Name | Type | Description |
|
|
1022
|
+
|-------------|------|-------------|
|
|
1023
|
+
| id | INTEGER | Primary key (auto-increment) |
|
|
1024
|
+
| task_id | INTEGER | Task ID (foreign key) |
|
|
1025
|
+
| key | TEXT | Metadata key |
|
|
1026
|
+
| value | TEXT | Metadata value |
|
|
1027
|
+
| created_at | TEXT | Creation timestamp (ISO 8601 format) |
|
|
1028
|
+
|
|
1029
|
+
Notes:
|
|
1030
|
+
- `task_id` and `key` combination has a unique constraint
|
|
1031
|
+
- Metadata is automatically deleted when the task is deleted (ON DELETE CASCADE)
|
|
1032
|
+
|
|
1033
|
+
## Development
|
|
1034
|
+
|
|
1035
|
+
### Developer Setup
|
|
1036
|
+
|
|
1037
|
+
For contributors and developers who want to work on agkan itself:
|
|
1038
|
+
|
|
1039
|
+
1. Clone the repository:
|
|
1040
|
+
```bash
|
|
1041
|
+
git clone https://github.com/gendosu/agkan.git
|
|
1042
|
+
cd agkan
|
|
1043
|
+
```
|
|
1044
|
+
|
|
1045
|
+
2. Install dependencies:
|
|
1046
|
+
```bash
|
|
1047
|
+
npm install
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
3. Build the TypeScript code:
|
|
1051
|
+
```bash
|
|
1052
|
+
npm run build
|
|
1053
|
+
```
|
|
1054
|
+
|
|
1055
|
+
4. Register as a global command:
|
|
1056
|
+
```bash
|
|
1057
|
+
npm link
|
|
1058
|
+
```
|
|
1059
|
+
|
|
1060
|
+
### Development Guidelines
|
|
1061
|
+
|
|
1062
|
+
For comprehensive development information, see the following documentation:
|
|
1063
|
+
|
|
1064
|
+
- **[TESTING.md](TESTING.md)** - Testing guide, coverage execution, and test patterns
|
|
1065
|
+
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - Contribution guidelines and TDD practices
|
|
1066
|
+
- **[docs/TDD-GUIDE.md](docs/TDD-GUIDE.md)** - Test-Driven Development guide with practical examples
|
|
1067
|
+
- **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** - Project architecture and design patterns
|
|
1068
|
+
|
|
1069
|
+
### Code Quality
|
|
1070
|
+
|
|
1071
|
+
This project uses ESLint and Prettier for code quality:
|
|
1072
|
+
|
|
1073
|
+
```bash
|
|
1074
|
+
npm run lint # Check code
|
|
1075
|
+
npm run lint:fix # Auto-fix issues
|
|
1076
|
+
npm run format # Format code
|
|
1077
|
+
npm run check # Run all checks
|
|
1078
|
+
```
|
|
1079
|
+
|
|
1080
|
+
### Testing
|
|
1081
|
+
|
|
1082
|
+
#### Unit Tests
|
|
1083
|
+
|
|
1084
|
+
Run unit tests with Vitest:
|
|
1085
|
+
```bash
|
|
1086
|
+
npm test
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
All service and model layers are tested.
|
|
1090
|
+
|
|
1091
|
+
#### End-to-End Tests
|
|
1092
|
+
|
|
1093
|
+
Run comprehensive e2e tests that execute actual CLI commands:
|
|
1094
|
+
```bash
|
|
1095
|
+
npm run test:e2e
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
E2E tests cover the following features:
|
|
1099
|
+
- Build and unit tests
|
|
1100
|
+
- Tag management (create, list, delete, duplicate check)
|
|
1101
|
+
- Tag assignment (attach, detach, display, duplicate check)
|
|
1102
|
+
- Tag filtering (single tag, multiple tags, status combinations)
|
|
1103
|
+
- CASCADE delete (database integrity verification)
|
|
1104
|
+
|
|
1105
|
+
Tests use a local test database (`.agkan-test/test-e2e.db`) and are automatically cleaned up after execution.
|
|
1106
|
+
|
|
1107
|
+
### Build
|
|
1108
|
+
|
|
1109
|
+
```bash
|
|
1110
|
+
npm run build
|
|
1111
|
+
```
|
|
1112
|
+
|
|
1113
|
+
### Auto-build During Development
|
|
1114
|
+
|
|
1115
|
+
```bash
|
|
1116
|
+
npm run dev
|
|
1117
|
+
```
|
|
1118
|
+
|
|
1119
|
+
### TypeScript Type Checking
|
|
1120
|
+
|
|
1121
|
+
```bash
|
|
1122
|
+
npx tsc --noEmit
|
|
1123
|
+
```
|
|
1124
|
+
|
|
1125
|
+
### Initialize Database
|
|
1126
|
+
|
|
1127
|
+
The database is automatically created on first command execution. To manually recreate:
|
|
1128
|
+
|
|
1129
|
+
```bash
|
|
1130
|
+
rm -rf data/agkan.db
|
|
1131
|
+
agkan task list # Database will be recreated
|
|
1132
|
+
```
|
|
1133
|
+
|
|
1134
|
+
## License
|
|
1135
|
+
|
|
1136
|
+
ISC
|
|
1137
|
+
|
|
1138
|
+
## Author
|
|
1139
|
+
|
|
1140
|
+
Generated with Claude Code
|