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.
Files changed (208) hide show
  1. package/README.ja.md +1127 -0
  2. package/README.md +1140 -0
  3. package/bin/agkan +2 -0
  4. package/dist/cli/commands/block/add.d.ts +6 -0
  5. package/dist/cli/commands/block/add.d.ts.map +1 -0
  6. package/dist/cli/commands/block/add.js +135 -0
  7. package/dist/cli/commands/block/add.js.map +1 -0
  8. package/dist/cli/commands/block/list.d.ts +6 -0
  9. package/dist/cli/commands/block/list.d.ts.map +1 -0
  10. package/dist/cli/commands/block/list.js +120 -0
  11. package/dist/cli/commands/block/list.js.map +1 -0
  12. package/dist/cli/commands/block/remove.d.ts +6 -0
  13. package/dist/cli/commands/block/remove.d.ts.map +1 -0
  14. package/dist/cli/commands/block/remove.js +117 -0
  15. package/dist/cli/commands/block/remove.js.map +1 -0
  16. package/dist/cli/commands/meta/delete.d.ts +6 -0
  17. package/dist/cli/commands/meta/delete.d.ts.map +1 -0
  18. package/dist/cli/commands/meta/delete.js +67 -0
  19. package/dist/cli/commands/meta/delete.js.map +1 -0
  20. package/dist/cli/commands/meta/get.d.ts +6 -0
  21. package/dist/cli/commands/meta/get.d.ts.map +1 -0
  22. package/dist/cli/commands/meta/get.js +71 -0
  23. package/dist/cli/commands/meta/get.js.map +1 -0
  24. package/dist/cli/commands/meta/list.d.ts +6 -0
  25. package/dist/cli/commands/meta/list.d.ts.map +1 -0
  26. package/dist/cli/commands/meta/list.js +69 -0
  27. package/dist/cli/commands/meta/list.js.map +1 -0
  28. package/dist/cli/commands/meta/set.d.ts +6 -0
  29. package/dist/cli/commands/meta/set.d.ts.map +1 -0
  30. package/dist/cli/commands/meta/set.js +85 -0
  31. package/dist/cli/commands/meta/set.js.map +1 -0
  32. package/dist/cli/commands/tag/add.d.ts +6 -0
  33. package/dist/cli/commands/tag/add.d.ts.map +1 -0
  34. package/dist/cli/commands/tag/add.js +99 -0
  35. package/dist/cli/commands/tag/add.js.map +1 -0
  36. package/dist/cli/commands/tag/attach.d.ts +6 -0
  37. package/dist/cli/commands/tag/attach.d.ts.map +1 -0
  38. package/dist/cli/commands/tag/attach.js +119 -0
  39. package/dist/cli/commands/tag/attach.js.map +1 -0
  40. package/dist/cli/commands/tag/delete.d.ts +6 -0
  41. package/dist/cli/commands/tag/delete.d.ts.map +1 -0
  42. package/dist/cli/commands/tag/delete.js +93 -0
  43. package/dist/cli/commands/tag/delete.js.map +1 -0
  44. package/dist/cli/commands/tag/detach.d.ts +6 -0
  45. package/dist/cli/commands/tag/detach.d.ts.map +1 -0
  46. package/dist/cli/commands/tag/detach.js +118 -0
  47. package/dist/cli/commands/tag/detach.js.map +1 -0
  48. package/dist/cli/commands/tag/list.d.ts +6 -0
  49. package/dist/cli/commands/tag/list.d.ts.map +1 -0
  50. package/dist/cli/commands/tag/list.js +80 -0
  51. package/dist/cli/commands/tag/list.js.map +1 -0
  52. package/dist/cli/commands/tag/show.d.ts +6 -0
  53. package/dist/cli/commands/tag/show.d.ts.map +1 -0
  54. package/dist/cli/commands/tag/show.js +88 -0
  55. package/dist/cli/commands/tag/show.js.map +1 -0
  56. package/dist/cli/commands/task/add-helpers.d.ts +17 -0
  57. package/dist/cli/commands/task/add-helpers.d.ts.map +1 -0
  58. package/dist/cli/commands/task/add-helpers.js +122 -0
  59. package/dist/cli/commands/task/add-helpers.js.map +1 -0
  60. package/dist/cli/commands/task/add.d.ts +6 -0
  61. package/dist/cli/commands/task/add.d.ts.map +1 -0
  62. package/dist/cli/commands/task/add.js +140 -0
  63. package/dist/cli/commands/task/add.js.map +1 -0
  64. package/dist/cli/commands/task/count.d.ts +6 -0
  65. package/dist/cli/commands/task/count.d.ts.map +1 -0
  66. package/dist/cli/commands/task/count.js +97 -0
  67. package/dist/cli/commands/task/count.js.map +1 -0
  68. package/dist/cli/commands/task/delete.d.ts +6 -0
  69. package/dist/cli/commands/task/delete.d.ts.map +1 -0
  70. package/dist/cli/commands/task/delete.js +59 -0
  71. package/dist/cli/commands/task/delete.js.map +1 -0
  72. package/dist/cli/commands/task/find.d.ts +7 -0
  73. package/dist/cli/commands/task/find.d.ts.map +1 -0
  74. package/dist/cli/commands/task/find.js +118 -0
  75. package/dist/cli/commands/task/find.js.map +1 -0
  76. package/dist/cli/commands/task/get.d.ts +6 -0
  77. package/dist/cli/commands/task/get.d.ts.map +1 -0
  78. package/dist/cli/commands/task/get.js +196 -0
  79. package/dist/cli/commands/task/get.js.map +1 -0
  80. package/dist/cli/commands/task/list.d.ts +6 -0
  81. package/dist/cli/commands/task/list.d.ts.map +1 -0
  82. package/dist/cli/commands/task/list.js +301 -0
  83. package/dist/cli/commands/task/list.js.map +1 -0
  84. package/dist/cli/commands/task/update-parent.d.ts +6 -0
  85. package/dist/cli/commands/task/update-parent.d.ts.map +1 -0
  86. package/dist/cli/commands/task/update-parent.js +123 -0
  87. package/dist/cli/commands/task/update-parent.js.map +1 -0
  88. package/dist/cli/commands/task/update.d.ts +6 -0
  89. package/dist/cli/commands/task/update.d.ts.map +1 -0
  90. package/dist/cli/commands/task/update.js +96 -0
  91. package/dist/cli/commands/task/update.js.map +1 -0
  92. package/dist/cli/index.d.ts +3 -0
  93. package/dist/cli/index.d.ts.map +1 -0
  94. package/dist/cli/index.js +68 -0
  95. package/dist/cli/index.js.map +1 -0
  96. package/dist/cli/utils/array-utils.d.ts +15 -0
  97. package/dist/cli/utils/array-utils.d.ts.map +1 -0
  98. package/dist/cli/utils/array-utils.js +20 -0
  99. package/dist/cli/utils/array-utils.js.map +1 -0
  100. package/dist/cli/utils/error-handler.d.ts +35 -0
  101. package/dist/cli/utils/error-handler.d.ts.map +1 -0
  102. package/dist/cli/utils/error-handler.js +84 -0
  103. package/dist/cli/utils/error-handler.js.map +1 -0
  104. package/dist/cli/utils/output-formatter.d.ts +34 -0
  105. package/dist/cli/utils/output-formatter.d.ts.map +1 -0
  106. package/dist/cli/utils/output-formatter.js +44 -0
  107. package/dist/cli/utils/output-formatter.js.map +1 -0
  108. package/dist/cli/utils/response-formatter.d.ts +19 -0
  109. package/dist/cli/utils/response-formatter.d.ts.map +1 -0
  110. package/dist/cli/utils/response-formatter.js +43 -0
  111. package/dist/cli/utils/response-formatter.js.map +1 -0
  112. package/dist/cli/utils/validators.d.ts +23 -0
  113. package/dist/cli/utils/validators.d.ts.map +1 -0
  114. package/dist/cli/utils/validators.js +47 -0
  115. package/dist/cli/utils/validators.js.map +1 -0
  116. package/dist/db/config.d.ts +27 -0
  117. package/dist/db/config.d.ts.map +1 -0
  118. package/dist/db/config.js +116 -0
  119. package/dist/db/config.js.map +1 -0
  120. package/dist/db/connection.d.ts +24 -0
  121. package/dist/db/connection.d.ts.map +1 -0
  122. package/dist/db/connection.js +62 -0
  123. package/dist/db/connection.js.map +1 -0
  124. package/dist/db/reset.d.ts +8 -0
  125. package/dist/db/reset.d.ts.map +1 -0
  126. package/dist/db/reset.js +33 -0
  127. package/dist/db/reset.js.map +1 -0
  128. package/dist/db/schema.d.ts +6 -0
  129. package/dist/db/schema.d.ts.map +1 -0
  130. package/dist/db/schema.js +134 -0
  131. package/dist/db/schema.js.map +1 -0
  132. package/dist/models/Attachment.d.ts +25 -0
  133. package/dist/models/Attachment.d.ts.map +1 -0
  134. package/dist/models/Attachment.js +7 -0
  135. package/dist/models/Attachment.js.map +1 -0
  136. package/dist/models/Tag.d.ts +24 -0
  137. package/dist/models/Tag.d.ts.map +1 -0
  138. package/dist/models/Tag.js +3 -0
  139. package/dist/models/Tag.js.map +1 -0
  140. package/dist/models/Task.d.ts +55 -0
  141. package/dist/models/Task.d.ts.map +1 -0
  142. package/dist/models/Task.js +7 -0
  143. package/dist/models/Task.js.map +1 -0
  144. package/dist/models/TaskBlock.d.ts +11 -0
  145. package/dist/models/TaskBlock.d.ts.map +1 -0
  146. package/dist/models/TaskBlock.js +3 -0
  147. package/dist/models/TaskBlock.js.map +1 -0
  148. package/dist/models/TaskMetadata.d.ts +30 -0
  149. package/dist/models/TaskMetadata.d.ts.map +1 -0
  150. package/dist/models/TaskMetadata.js +3 -0
  151. package/dist/models/TaskMetadata.js.map +1 -0
  152. package/dist/models/TaskTag.d.ts +11 -0
  153. package/dist/models/TaskTag.d.ts.map +1 -0
  154. package/dist/models/TaskTag.js +3 -0
  155. package/dist/models/TaskTag.js.map +1 -0
  156. package/dist/models/index.d.ts +10 -0
  157. package/dist/models/index.d.ts.map +1 -0
  158. package/dist/models/index.js +7 -0
  159. package/dist/models/index.js.map +1 -0
  160. package/dist/services/AttachmentService.d.ts +62 -0
  161. package/dist/services/AttachmentService.d.ts.map +1 -0
  162. package/dist/services/AttachmentService.js +95 -0
  163. package/dist/services/AttachmentService.js.map +1 -0
  164. package/dist/services/FileService.d.ts +31 -0
  165. package/dist/services/FileService.d.ts.map +1 -0
  166. package/dist/services/FileService.js +77 -0
  167. package/dist/services/FileService.js.map +1 -0
  168. package/dist/services/MetadataService.d.ts +49 -0
  169. package/dist/services/MetadataService.d.ts.map +1 -0
  170. package/dist/services/MetadataService.js +126 -0
  171. package/dist/services/MetadataService.js.map +1 -0
  172. package/dist/services/TagService.d.ts +49 -0
  173. package/dist/services/TagService.d.ts.map +1 -0
  174. package/dist/services/TagService.js +127 -0
  175. package/dist/services/TagService.js.map +1 -0
  176. package/dist/services/TaskBlockService.d.ts +49 -0
  177. package/dist/services/TaskBlockService.d.ts.map +1 -0
  178. package/dist/services/TaskBlockService.js +118 -0
  179. package/dist/services/TaskBlockService.js.map +1 -0
  180. package/dist/services/TaskService.d.ts +89 -0
  181. package/dist/services/TaskService.d.ts.map +1 -0
  182. package/dist/services/TaskService.js +285 -0
  183. package/dist/services/TaskService.js.map +1 -0
  184. package/dist/services/TaskTagService.d.ts +66 -0
  185. package/dist/services/TaskTagService.d.ts.map +1 -0
  186. package/dist/services/TaskTagService.js +171 -0
  187. package/dist/services/TaskTagService.js.map +1 -0
  188. package/dist/services/index.d.ts +11 -0
  189. package/dist/services/index.d.ts.map +1 -0
  190. package/dist/services/index.js +20 -0
  191. package/dist/services/index.js.map +1 -0
  192. package/dist/utils/cycle-detector.d.ts +14 -0
  193. package/dist/utils/cycle-detector.d.ts.map +1 -0
  194. package/dist/utils/cycle-detector.js +32 -0
  195. package/dist/utils/cycle-detector.js.map +1 -0
  196. package/dist/utils/format.d.ts +13 -0
  197. package/dist/utils/format.d.ts.map +1 -0
  198. package/dist/utils/format.js +29 -0
  199. package/dist/utils/format.js.map +1 -0
  200. package/dist/utils/input-validators.d.ts +32 -0
  201. package/dist/utils/input-validators.d.ts.map +1 -0
  202. package/dist/utils/input-validators.js +108 -0
  203. package/dist/utils/input-validators.js.map +1 -0
  204. package/dist/utils/security.d.ts +11 -0
  205. package/dist/utils/security.d.ts.map +1 -0
  206. package/dist/utils/security.js +29 -0
  207. package/dist/utils/security.js.map +1 -0
  208. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,1140 @@
1
+ # agkan
2
+
3
+ [![Test](https://github.com/gendosu/agkan/workflows/Test/badge.svg)](https://github.com/gendosu/agkan/actions/workflows/test.yml)
4
+ [![Quality Check](https://github.com/gendosu/agkan/workflows/Quality%20Check/badge.svg)](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