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.ja.md ADDED
@@ -0,0 +1,1127 @@
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
+ TypeScriptで実装された軽量なCLIタスク管理ツールです。エージェント(AIアシスタント)との協働作業に最適化されています。
7
+
8
+ ## 特徴
9
+
10
+ - **シンプルなCLI**: 直感的なコマンドラインインターフェース
11
+ - **SQLiteベース**: ローカルでの高速データ管理
12
+ - **カンバン形式**: 6つのステータスでタスクを管理(backlog, ready, in_progress, review, done, closed)
13
+ - **柔軟な入力**: コマンドライン引数またはMarkdownファイルからタスクを作成
14
+ - **フィルタリング**: ステータスや作成者でタスクを絞り込み
15
+ - **色分け表示**: ステータスごとに見やすい色分け表示
16
+ - **親子関係**: タスクの階層構造を管理(ツリー表示対応)
17
+ - **ブロック関係**: タスク間の依存関係を管理(循環参照検出機能付き)
18
+ - **タグ機能**: タスクにタグを付けて分類・検索が可能
19
+
20
+ ## インストール
21
+
22
+ ### 前提条件
23
+
24
+ - Node.js 18以上
25
+ - npm
26
+
27
+ ### npmからインストール(推奨)
28
+
29
+ グローバルコマンドとしてインストール:
30
+ ```bash
31
+ npm install -g agkan
32
+ ```
33
+
34
+ これで `agkan` コマンドがシステム全体で使用可能になります。
35
+
36
+ ### GitHubからインストール
37
+
38
+ リポジトリから直接インストール:
39
+ ```bash
40
+ npm install -g https://github.com/gendosu/agkan.git
41
+ ```
42
+
43
+ ## 設定
44
+
45
+ ### データベースの保存場所
46
+
47
+ agkanは、データベースの保存場所を設定ファイルでカスタマイズできます。
48
+
49
+ #### 設定ファイル: `.agkan.yml`
50
+
51
+ プロジェクトのルートディレクトリに`.agkan.yml`ファイルを作成することで、データベースの保存場所を指定できます。
52
+
53
+ **設定例:**
54
+
55
+ ```yaml
56
+ # データベースファイルのパス
57
+ path: ./.agkan/data.db
58
+ ```
59
+
60
+ #### パスの指定方法
61
+
62
+ - **相対パス**: カレントディレクトリからの相対パスとして解決されます
63
+ ```yaml
64
+ path: ./data/kanban.db
65
+ path: ./.agkan/data.db
66
+ ```
67
+
68
+ - **絶対パス**: そのままのパスが使用されます
69
+ ```yaml
70
+ path: /home/user/.config/agkan/data.db
71
+ ```
72
+
73
+ #### 環境変数による設定
74
+
75
+ agkanは `AGENT_KANBAN_DB_PATH` 環境変数によるデータベースの場所指定をサポートしています。CI/CD環境や複数環境の管理に特に有用です。
76
+
77
+ **環境変数の設定例:**
78
+
79
+ ```bash
80
+ # カスタムデータベースパスを使用
81
+ export AGENT_KANBAN_DB_PATH=/path/to/your/database.db
82
+ agkan task list
83
+
84
+ # 絶対パスを使用
85
+ export AGENT_KANBAN_DB_PATH=/home/user/.config/agkan/data.db
86
+
87
+ # 相対パスを使用
88
+ export AGENT_KANBAN_DB_PATH=./custom/location/data.db
89
+ ```
90
+
91
+ **優先順位:**
92
+
93
+ データベースパスは以下の優先順位で解決されます:
94
+
95
+ **通常モード (`NODE_ENV` が `test` でない場合):**
96
+ 1. **環境変数**(最高優先): `AGENT_KANBAN_DB_PATH`
97
+ 2. **設定ファイル**(フォールバック): `.agkan.yml` の `path` フィールド
98
+ 3. **デフォルトパス**(最低優先): `.agkan/data.db`
99
+
100
+ **テストモード (`NODE_ENV=test` の場合):**
101
+ 1. **環境変数**(最高優先): `AGENT_KANBAN_DB_PATH`
102
+ 2. **設定ファイル**(フォールバック): `.agkan-test.yml` の `path` フィールド
103
+ 3. **デフォルトパス**(最低優先): `.agkan-test/data.db`
104
+
105
+ **テストモードについて:**
106
+
107
+ テストモード(`NODE_ENV=test`)では、テストデータと本番データを自動的に分離します:
108
+
109
+ - 別の設定ファイルを使用: `.agkan.yml` の代わりに `.agkan-test.yml`
110
+ - 別のデフォルトディレクトリを使用: `.agkan/` の代わりに `.agkan-test/`
111
+ - テストモードでも環境変数が最高優先になります
112
+
113
+ **使用例:**
114
+
115
+ ```bash
116
+ # CI/CDパイプライン(一時DBを使用)
117
+ export AGENT_KANBAN_DB_PATH=/tmp/ci-test-db.db
118
+ agkan task list
119
+
120
+ # 複数環境の管理
121
+ export AGENT_KANBAN_DB_PATH=./dev/data.db # 開発環境
122
+ export AGENT_KANBAN_DB_PATH=./staging/data.db # ステージング環境
123
+
124
+ # テストの実行
125
+ NODE_ENV=test npm test
126
+ # デフォルトで .agkan-test/data.db を使用
127
+
128
+ # カスタムテストDBで実行
129
+ NODE_ENV=test AGENT_KANBAN_DB_PATH=/tmp/test.db npm test
130
+ ```
131
+
132
+ #### デフォルトの動作
133
+
134
+ `.agkan.yml`ファイルが存在せず、環境変数も設定されていない場合、データベースは以下の場所に作成されます:
135
+
136
+ ```
137
+ <カレントディレクトリ>/.agkan/data.db
138
+ ```
139
+
140
+ テストモード(`NODE_ENV=test`)の場合のデフォルト:
141
+
142
+ ```
143
+ <カレントディレクトリ>/.agkan-test/data.db
144
+ ```
145
+
146
+ #### プロジェクトごとの管理
147
+
148
+ プロジェクトごとに異なるタスク管理を行いたい場合は、各プロジェクトのルートに`.agkan.yml`を配置してください:
149
+
150
+ ```bash
151
+ # プロジェクトA
152
+ cd /path/to/projectA
153
+ cat > .agkan.yml << EOF
154
+ path: ./.agkan/data.db
155
+ EOF
156
+
157
+ # プロジェクトB
158
+ cd /path/to/projectB
159
+ cat > .agkan.yml << EOF
160
+ path: ./.agkan/data.db
161
+ EOF
162
+ ```
163
+
164
+ これにより、各プロジェクトで独立したタスク管理が可能になります。
165
+
166
+ ## 使用方法
167
+
168
+ ### タスクの作成
169
+
170
+ 基本的なタスク作成:
171
+ ```bash
172
+ agkan task add "タスクのタイトル" "タスクの説明"
173
+ ```
174
+
175
+ オプション付きでタスク作成:
176
+ ```bash
177
+ agkan task add "ログイン機能の実装" "ユーザー認証システムを実装" \
178
+ --status ready \
179
+ --author "developer-name"
180
+ ```
181
+
182
+ 親タスクを指定してタスク作成:
183
+ ```bash
184
+ agkan task add "子タスク" "詳細な作業項目" --parent 1
185
+ ```
186
+
187
+ Markdownファイルからタスク作成:
188
+ ```bash
189
+ agkan task add "設計書レビュー" --file ./design-doc.md --status backlog
190
+ ```
191
+
192
+ ### タスク一覧の表示
193
+
194
+ 全タスクを表示:
195
+ ```bash
196
+ agkan task list
197
+ ```
198
+
199
+ ツリー形式で表示(親子関係を含む):
200
+ ```bash
201
+ agkan task list --tree
202
+ ```
203
+
204
+ ルートタスクのみ表示(親を持たないタスク):
205
+ ```bash
206
+ agkan task list --root-only
207
+ ```
208
+
209
+ ステータスでフィルタリング:
210
+ ```bash
211
+ agkan task list --status in_progress
212
+ ```
213
+
214
+ 作成者でフィルタリング:
215
+ ```bash
216
+ agkan task list --author "developer-name"
217
+ ```
218
+
219
+ 複合フィルター:
220
+ ```bash
221
+ agkan task list --status ready --author "developer-name"
222
+ ```
223
+
224
+ タグでフィルタリング:
225
+ ```bash
226
+ agkan task list --tag "frontend"
227
+ ```
228
+
229
+ ### タスクの検索
230
+
231
+ キーワードでタスクを検索(タイトルと本文を対象):
232
+ ```bash
233
+ agkan task find "検索キーワード"
234
+ ```
235
+
236
+ 完了済みタスクも含めて検索:
237
+ ```bash
238
+ agkan task find "検索キーワード" --all
239
+ ```
240
+
241
+ 注: デフォルトでは、`done`と`closed`のタスクは検索結果から除外されます。
242
+
243
+ ### タスク詳細の取得
244
+
245
+ ```bash
246
+ agkan task get 1
247
+ ```
248
+
249
+ ### タスクの更新
250
+
251
+ ステータスを変更:
252
+ ```bash
253
+ agkan task update 1 status done
254
+ ```
255
+
256
+ タイトルを変更:
257
+ ```bash
258
+ agkan task update 1 title "新しいタイトル"
259
+ ```
260
+
261
+ 本文を変更:
262
+ ```bash
263
+ agkan task update 1 body "新しい説明文"
264
+ ```
265
+
266
+ 作成者を変更:
267
+ ```bash
268
+ agkan task update 1 author "new-author"
269
+ ```
270
+
271
+ ### 親子関係の管理
272
+
273
+ 親タスクの更新:
274
+ ```bash
275
+ # タスク2の親をタスク1に設定
276
+ agkan task update-parent 2 1
277
+
278
+ # タスク2の親を解除(孤立化)
279
+ agkan task update-parent 2 null
280
+ ```
281
+
282
+ 注意事項:
283
+ - 親タスクを削除すると、子タスクの親参照は自動的に解除されます(孤立化)
284
+ - 循環参照は自動的に検出され、エラーとなります
285
+
286
+ ### ブロック関係の管理
287
+
288
+ ブロック関係の追加(タスク1がタスク2をブロック):
289
+ ```bash
290
+ agkan task block add 1 2
291
+ ```
292
+
293
+ ブロック関係の削除:
294
+ ```bash
295
+ agkan task block remove 1 2
296
+ ```
297
+
298
+ ブロック関係の一覧表示:
299
+ ```bash
300
+ # タスク1に関連するブロック関係を表示
301
+ agkan task block list 1
302
+ ```
303
+
304
+ 注意事項:
305
+ - 循環参照は自動的に検出され、エラーとなります
306
+ - ブロック関係はタスク削除時に自動的に削除されます(CASCADE DELETE)
307
+
308
+ ### タスクの削除
309
+
310
+ タスクを削除:
311
+ ```bash
312
+ agkan task delete 1
313
+ ```
314
+
315
+ ### タグ管理
316
+
317
+ タグを作成:
318
+ ```bash
319
+ agkan task tag add "frontend"
320
+ ```
321
+
322
+ タグ一覧を表示:
323
+ ```bash
324
+ agkan task tag list
325
+ ```
326
+
327
+ タグを削除:
328
+ ```bash
329
+ agkan task tag delete "frontend"
330
+ ```
331
+
332
+ ### タスクへのタグ付け
333
+
334
+ タスクにタグを付与:
335
+ ```bash
336
+ agkan task tag attach 1 "frontend"
337
+ ```
338
+
339
+ タスクからタグを削除:
340
+ ```bash
341
+ agkan task tag detach 1 "frontend"
342
+ ```
343
+
344
+ タスクに付けられたタグを表示:
345
+ ```bash
346
+ agkan task tag show 1
347
+ ```
348
+
349
+ ### メタデータの管理
350
+
351
+ メタデータを設定:
352
+ ```bash
353
+ agkan task meta set 1 priority high
354
+ ```
355
+
356
+ メタデータを取得:
357
+ ```bash
358
+ agkan task meta get 1 priority
359
+ ```
360
+
361
+ メタデータ一覧を表示:
362
+ ```bash
363
+ agkan task meta list 1
364
+ ```
365
+
366
+ メタデータを削除:
367
+ ```bash
368
+ agkan task meta delete 1 priority
369
+ ```
370
+
371
+ #### 優先度 (priority)
372
+
373
+ タスクの優先度は `priority` キーで管理します:
374
+
375
+ | 値 | 意味 |
376
+ |-----|------|
377
+ | `critical` | 即時対応が必要。ブロッカーとなっている問題 |
378
+ | `high` | 優先して着手すべきタスク |
379
+ | `medium` | 通常の優先度(デフォルト) |
380
+ | `low` | 余裕があれば対応するタスク |
381
+
382
+ ### タスクのカウント
383
+
384
+ 全ステータスのタスク数を表示:
385
+ ```bash
386
+ agkan task count
387
+ ```
388
+
389
+ 特定のステータスのタスク数を表示:
390
+ ```bash
391
+ agkan task count --status in_progress
392
+ ```
393
+
394
+ スクリプト用の出力(数値のみ):
395
+ ```bash
396
+ agkan task count -s in_progress -q
397
+ ```
398
+
399
+ ### ヘルプの表示
400
+
401
+ コマンド一覧:
402
+ ```bash
403
+ agkan --help
404
+ ```
405
+
406
+ タスクコマンドのヘルプ:
407
+ ```bash
408
+ agkan task --help
409
+ ```
410
+
411
+ 個別コマンドのヘルプ:
412
+ ```bash
413
+ agkan task add --help
414
+ ```
415
+
416
+ ## JSON出力フォーマット
417
+
418
+ agkanは9つのデータ取得・表示コマンドで、機械可読なJSON出力をサポートしています。`--json`フラグを追加することで、人間が読みやすいテキストの代わりに構造化されたデータを出力できます。
419
+
420
+ ### 対応コマンド
421
+
422
+ 以下のコマンドがJSON出力をサポートしています:
423
+
424
+ - `task add` - 新しいタスクを作成
425
+ - `task list` - タスク一覧を表示(フィルタリング付き)
426
+ - `task get` - タスク詳細を取得
427
+ - `task find` - キーワードでタスクを検索
428
+ - `task count` - ステータス別のタスク数をカウント
429
+ - `task update-parent` - 親子関係を更新
430
+ - `task block list` - ブロック関係を一覧表示
431
+ - `task tag list` - 全タグをタスク数と共に一覧表示
432
+ - `task tag show` - 特定のタスクのタグを表示
433
+ - `task meta list` - タスクのメタデータ一覧を表示
434
+
435
+ ### 出力構造
436
+
437
+ すべてのJSONレスポンスは以下のパターンに従います:
438
+
439
+ **成功レスポンス**には以下が含まれます:
440
+ - 操作固有のデータ(task、tasksの配列、counts など)
441
+ - 関連データ(parent、blockedBy、blocking、tags など)
442
+ - 書き込み操作の場合はオプションで`success: true`フィールド
443
+
444
+ **エラーレスポンス**は以下のフォーマットに従います:
445
+ ```json
446
+ {
447
+ "success": false,
448
+ "error": {
449
+ "message": "エラーの説明"
450
+ }
451
+ }
452
+ ```
453
+
454
+ ### 一般的な使用例
455
+
456
+ **1. スクリプティングと自動化**
457
+ ```bash
458
+ # CI/CDパイプライン用のタスク数を取得
459
+ TASK_COUNT=$(agkan task count --status backlog --json | jq '.counts.backlog')
460
+
461
+ # 処理用にタスクIDを抽出
462
+ agkan task list --status ready --json | jq -r '.tasks[].id'
463
+ ```
464
+
465
+ **2. 他ツールとの統合**
466
+ ```bash
467
+ # タスクを外部システムにエクスポート
468
+ agkan task list --json | jq '.tasks' > tasks.json
469
+
470
+ # ブロック関係を処理
471
+ agkan task block list 1 --json | jq '.blockedBy[].title'
472
+ ```
473
+
474
+ **3. 検証とテスト**
475
+ ```bash
476
+ # タスク作成を検証
477
+ RESULT=$(agkan task add "Test" --json)
478
+ echo $RESULT | jq -e '.success == true' && echo "Success"
479
+ ```
480
+
481
+ JSON出力フォーマット:
482
+ ```bash
483
+ agkan task add "Fix bug in login" --json
484
+ ```
485
+
486
+ ```json
487
+ {
488
+ "success": true,
489
+ "task": {
490
+ "id": 1,
491
+ "title": "Fix bug in login",
492
+ "status": "backlog",
493
+ "body": null,
494
+ "author": null,
495
+ "parent_id": null,
496
+ "created_at": "2026-02-15T00:00:00.000Z",
497
+ "updated_at": "2026-02-15T00:00:00.000Z"
498
+ },
499
+ "parent": null,
500
+ "blockedBy": [],
501
+ "blocking": []
502
+ }
503
+ ```
504
+
505
+ JSON出力フォーマット:
506
+ ```bash
507
+ agkan task list --json
508
+ ```
509
+
510
+ ```json
511
+ {
512
+ "tasks": [
513
+ {
514
+ "id": 1,
515
+ "title": "Implement login feature",
516
+ "status": "in_progress",
517
+ "body": "Implement user authentication system",
518
+ "author": "developer-name",
519
+ "parent_id": null,
520
+ "created_at": "2026-02-15T00:00:00.000Z",
521
+ "updated_at": "2026-02-15T00:00:00.000Z"
522
+ },
523
+ {
524
+ "id": 2,
525
+ "title": "Design review",
526
+ "status": "backlog",
527
+ "body": null,
528
+ "author": null,
529
+ "parent_id": null,
530
+ "created_at": "2026-02-15T00:00:00.000Z",
531
+ "updated_at": "2026-02-15T00:00:00.000Z"
532
+ }
533
+ ]
534
+ }
535
+ ```
536
+
537
+ JSON出力フォーマット:
538
+ ```bash
539
+ agkan task find "login" --json
540
+ ```
541
+
542
+ ```json
543
+ {
544
+ "tasks": [
545
+ {
546
+ "id": 1,
547
+ "title": "Implement login feature",
548
+ "status": "in_progress",
549
+ "body": "Implement user authentication system",
550
+ "author": "developer-name",
551
+ "parent_id": null,
552
+ "created_at": "2026-02-15T00:00:00.000Z",
553
+ "updated_at": "2026-02-15T00:00:00.000Z"
554
+ }
555
+ ]
556
+ }
557
+ ```
558
+
559
+ JSON出力フォーマット:
560
+ ```bash
561
+ agkan task get 1 --json
562
+ ```
563
+
564
+ ```json
565
+ {
566
+ "task": {
567
+ "id": 1,
568
+ "title": "Implement login feature",
569
+ "status": "in_progress",
570
+ "body": "Implement user authentication system",
571
+ "author": "developer-name",
572
+ "parent_id": null,
573
+ "created_at": "2026-02-15T00:00:00.000Z",
574
+ "updated_at": "2026-02-15T00:00:00.000Z"
575
+ }
576
+ }
577
+ ```
578
+
579
+ JSON出力フォーマット:
580
+ ```bash
581
+ agkan task update-parent 2 1 --json
582
+ ```
583
+
584
+ ```json
585
+ {
586
+ "success": true,
587
+ "task": {
588
+ "id": 2,
589
+ "title": "Child Task",
590
+ "status": "backlog",
591
+ "body": null,
592
+ "author": null,
593
+ "parent_id": 1,
594
+ "created_at": "2026-02-15T00:00:00.000Z",
595
+ "updated_at": "2026-02-15T00:00:00.000Z"
596
+ },
597
+ "parent": {
598
+ "id": 1,
599
+ "title": "Parent Task",
600
+ "status": "backlog",
601
+ "body": null,
602
+ "author": null,
603
+ "parent_id": null,
604
+ "created_at": "2026-02-15T00:00:00.000Z",
605
+ "updated_at": "2026-02-15T00:00:00.000Z"
606
+ }
607
+ }
608
+ ```
609
+
610
+ JSON出力フォーマット:
611
+ ```bash
612
+ agkan task block list 2 --json
613
+ ```
614
+
615
+ ```json
616
+ {
617
+ "task": {
618
+ "id": 2,
619
+ "title": "API implementation",
620
+ "status": "backlog"
621
+ },
622
+ "blockedBy": [
623
+ {
624
+ "id": 1,
625
+ "title": "Database design",
626
+ "status": "in_progress"
627
+ }
628
+ ],
629
+ "blocking": [
630
+ {
631
+ "id": 3,
632
+ "title": "Frontend implementation",
633
+ "status": "backlog"
634
+ }
635
+ ]
636
+ }
637
+ ```
638
+
639
+ 全ステータスのJSON出力フォーマット:
640
+ ```bash
641
+ agkan task count --json
642
+ ```
643
+
644
+ ```json
645
+ {
646
+ "total": 10,
647
+ "counts": {
648
+ "backlog": 3,
649
+ "ready": 2,
650
+ "in_progress": 4,
651
+ "done": 1,
652
+ "closed": 0
653
+ }
654
+ }
655
+ ```
656
+
657
+ 特定ステータスのJSON出力フォーマット:
658
+ ```bash
659
+ agkan task count --status in_progress --json
660
+ ```
661
+
662
+ ```json
663
+ {
664
+ "status": "in_progress",
665
+ "count": 4
666
+ }
667
+ ```
668
+
669
+ JSON出力フォーマット:
670
+ ```bash
671
+ agkan task tag list --json
672
+ ```
673
+
674
+ ```json
675
+ {
676
+ "totalCount": 2,
677
+ "tags": [
678
+ {
679
+ "id": 1,
680
+ "name": "frontend",
681
+ "taskCount": 3,
682
+ "created_at": "2026-02-15T00:00:00.000Z"
683
+ },
684
+ {
685
+ "id": 2,
686
+ "name": "backend",
687
+ "taskCount": 1,
688
+ "created_at": "2026-02-15T00:00:00.000Z"
689
+ }
690
+ ]
691
+ }
692
+ ```
693
+
694
+ JSON出力フォーマット:
695
+ ```bash
696
+ agkan task tag show 1 --json
697
+ ```
698
+
699
+ ```json
700
+ {
701
+ "task": {
702
+ "id": 1,
703
+ "title": "Implement login screen",
704
+ "status": "in_progress"
705
+ },
706
+ "tags": [
707
+ {
708
+ "id": 1,
709
+ "name": "frontend",
710
+ "created_at": "2026-02-15T00:00:00.000Z"
711
+ },
712
+ {
713
+ "id": 3,
714
+ "name": "urgent",
715
+ "created_at": "2026-02-15T00:00:00.000Z"
716
+ }
717
+ ]
718
+ }
719
+ ```
720
+
721
+ ## 使用例
722
+
723
+ ### 親子関係を使った階層的なタスク管理
724
+
725
+ プロジェクトを親タスク、個別の作業を子タスクとして管理する例:
726
+
727
+ ```bash
728
+ # 親タスクを作成
729
+ agkan task add "Webサイトのリニューアル"
730
+ # 出力: Task created with ID: 1
731
+
732
+ # 子タスクを作成
733
+ agkan task add "デザインカンプ作成" --parent 1
734
+ agkan task add "フロントエンド実装" --parent 1
735
+ agkan task add "バックエンド実装" --parent 1
736
+
737
+ # ツリー形式で表示
738
+ agkan task list --tree
739
+ # 出力:
740
+ # 1 [backlog] Webサイトのリニューアル
741
+ # ├─ 2 [backlog] デザインカンプ作成
742
+ # ├─ 3 [backlog] フロントエンド実装
743
+ # └─ 4 [backlog] バックエンド実装
744
+
745
+ # タスク詳細を表示(親情報を含む)
746
+ agkan task get 2
747
+ # 出力:
748
+ # ID: 2
749
+ # Title: デザインカンプ作成
750
+ # Parent ID: 1
751
+ # ...
752
+
753
+ # 親を変更
754
+ agkan task add "UI/UX改善"
755
+ # 出力: Task created with ID: 5
756
+ agkan task update-parent 2 5
757
+
758
+ # 親を解除(孤立化)
759
+ agkan task update-parent 2 null
760
+ ```
761
+
762
+ ### ブロック関係を使った依存関係の管理
763
+
764
+ タスク間の依存関係を明示的に管理する例:
765
+
766
+ ```bash
767
+ # タスクを作成
768
+ agkan task add "データベース設計"
769
+ # 出力: Task created with ID: 1
770
+
771
+ agkan task add "API実装"
772
+ # 出力: Task created with ID: 2
773
+
774
+ agkan task add "フロントエンド実装"
775
+ # 出力: Task created with ID: 3
776
+
777
+ # ブロック関係を設定(1がデータベース設計、2がAPI実装、3がフロントエンド実装)
778
+ # データベース設計がAPI実装をブロック
779
+ agkan task block add 1 2
780
+
781
+ # API実装がフロントエンド実装をブロック
782
+ agkan task block add 2 3
783
+
784
+ # ブロック関係を確認
785
+ agkan task block list 1
786
+ # 出力:
787
+ # Task 1 blocks:
788
+ # - Task 2 (API実装)
789
+ # Task 1 is blocked by:
790
+ # (none)
791
+
792
+ agkan task block list 2
793
+ # 出力:
794
+ # Task 2 blocks:
795
+ # - Task 3 (フロントエンド実装)
796
+ # Task 2 is blocked by:
797
+ # - Task 1 (データベース設計)
798
+
799
+ # 循環参照を試みる(エラーになる)
800
+ agkan task block add 3 1
801
+ # 出力: Error: Circular reference detected
802
+
803
+ # ブロック関係を削除
804
+ agkan task block remove 1 2
805
+ ```
806
+
807
+ ### タグを使ったタスク管理
808
+
809
+ タスクにタグを付けて分類する例:
810
+
811
+ ```bash
812
+ # タグを作成
813
+ agkan task tag add "frontend"
814
+ agkan task tag add "backend"
815
+ agkan task tag add "urgent"
816
+
817
+ # タスクを作成してタグを付与
818
+ agkan task add "ログイン画面の実装"
819
+ # 出力: Task created with ID: 1
820
+
821
+ agkan task tag attach 1 "frontend"
822
+ agkan task tag attach 1 "urgent"
823
+
824
+ agkan task add "API開発"
825
+ # 出力: Task created with ID: 2
826
+
827
+ agkan task tag attach 2 "backend"
828
+
829
+ # タグでフィルタリング
830
+ agkan task list --tag "frontend"
831
+ # 出力:
832
+ # 1 [backlog] ログイン画面の実装 (tags: frontend, urgent)
833
+
834
+ # タスクのタグを確認
835
+ agkan task tag show 1
836
+ # 出力:
837
+ # Tags for task 1:
838
+ # - frontend
839
+ # - urgent
840
+
841
+ # タグを削除
842
+ agkan task tag detach 1 "urgent"
843
+
844
+ # タグ自体を削除(関連するすべてのタスクから削除される)
845
+ agkan task tag delete "urgent"
846
+ ```
847
+
848
+ ## タスクステータス
849
+
850
+ - **backlog**: 未着手のタスク(グレー表示)
851
+ - **ready**: 着手可能なタスク(青色表示)
852
+ - **in_progress**: 作業中のタスク(黄色表示)
853
+ - **review**: レビュー中のタスク(シアン表示)
854
+ - **done**: 完了したタスク(緑色表示)
855
+ - **closed**: クローズされたタスク(マゼンタ表示)
856
+
857
+ ## 実装予定機能
858
+
859
+ ### タスクの添付ファイル
860
+
861
+ タスクへのファイル添付機能は現在開発中です。この機能により、ユーザーはタスクにファイルを添付し、より良いコンテキストとドキュメントを提供できるようになります。
862
+
863
+ **予定されているCLIコマンド:**
864
+ - `agkan task attach add <task-id> <file-path>` - タスクにファイルを添付
865
+ - `agkan task attach list <task-id>` - タスクのすべての添付ファイルを一覧表示
866
+ - `agkan task attach delete <attachment-id>` - タスクから添付ファイルを削除
867
+
868
+ 実装予定機能の詳細については、[docs/planned-features.md](docs/planned-features.md)を参照してください。
869
+
870
+ ## 技術スタック
871
+
872
+ - **言語**: TypeScript 5.x
873
+ - **CLI フレームワーク**: Commander.js
874
+ - **データベース**: SQLite3 (better-sqlite3)
875
+ - **ターミナル表示**: Chalk
876
+ - **ビルドツール**: TypeScript Compiler
877
+
878
+ ## プロジェクト構成
879
+
880
+ ```
881
+ agkan/
882
+ ├── bin/
883
+ │ └── agkan # CLIエントリーポイント
884
+ ├── src/
885
+ │ ├── cli/
886
+ │ │ ├── commands/
887
+ │ │ │ ├── block/ # ブロック関係コマンド
888
+ │ │ │ │ ├── add.ts
889
+ │ │ │ │ ├── list.ts
890
+ │ │ │ │ └── remove.ts
891
+ │ │ │ ├── meta/ # メタデータコマンド
892
+ │ │ │ │ ├── delete.ts
893
+ │ │ │ │ ├── get.ts
894
+ │ │ │ │ ├── list.ts
895
+ │ │ │ │ └── set.ts
896
+ │ │ │ ├── tag/ # タグコマンド
897
+ │ │ │ │ ├── add.ts
898
+ │ │ │ │ ├── attach.ts
899
+ │ │ │ │ ├── delete.ts
900
+ │ │ │ │ ├── detach.ts
901
+ │ │ │ │ ├── list.ts
902
+ │ │ │ │ └── show.ts
903
+ │ │ │ └── task/ # タスクコマンド
904
+ │ │ │ ├── add.ts
905
+ │ │ │ ├── count.ts
906
+ │ │ │ ├── delete.ts
907
+ │ │ │ ├── find.ts
908
+ │ │ │ ├── get.ts
909
+ │ │ │ ├── list.ts
910
+ │ │ │ ├── update-parent.ts
911
+ │ │ │ └── update.ts
912
+ │ │ ├── utils/ # CLIユーティリティ
913
+ │ │ └── index.ts # CLIエントリー・コマンド登録
914
+ │ ├── db/
915
+ │ │ ├── config.ts # DB設定
916
+ │ │ ├── connection.ts # データベース接続管理
917
+ │ │ ├── schema.ts # スキーマ定義・マイグレーション
918
+ │ │ └── reset.ts # テスト用DBリセット
919
+ │ ├── models/
920
+ │ │ ├── Task.ts # タスクモデル
921
+ │ │ ├── Tag.ts # タグモデル
922
+ │ │ ├── TaskBlock.ts # ブロック関係モデル
923
+ │ │ ├── TaskMetadata.ts # メタデータモデル
924
+ │ │ ├── TaskTag.ts # タスク-タグ関連モデル
925
+ │ │ └── index.ts
926
+ │ ├── services/
927
+ │ │ ├── TaskService.ts # タスク管理ビジネスロジック
928
+ │ │ ├── TagService.ts # タグ管理ビジネスロジック
929
+ │ │ ├── TaskBlockService.ts # ブロック関係管理
930
+ │ │ ├── TaskTagService.ts # タスク-タグ関連管理
931
+ │ │ ├── MetadataService.ts # メタデータ管理
932
+ │ │ ├── FileService.ts # ファイル読み込み
933
+ │ │ └── index.ts
934
+ │ └── utils/
935
+ │ ├── format.ts # フォーマットユーティリティ
936
+ │ ├── cycle-detector.ts # 循環参照検出
937
+ │ ├── input-validators.ts # 入力バリデーション
938
+ │ └── security.ts # セキュリティユーティリティ
939
+ ├── dist/ # ビルド出力ディレクトリ
940
+ ├── package.json
941
+ ├── tsconfig.json
942
+ └── README.md
943
+ ```
944
+
945
+ ## データベーススキーマ
946
+
947
+ ### tasks テーブル
948
+
949
+ | カラム名 | 型 | 説明 |
950
+ |---------|-----|------|
951
+ | id | INTEGER | 主キー(自動採番) |
952
+ | title | TEXT | タスクタイトル(必須) |
953
+ | body | TEXT | タスク本文 |
954
+ | status | TEXT | ステータス(backlog, ready, in_progress, review, done, closed) |
955
+ | author | TEXT | 作成者 |
956
+ | parent_id | INTEGER | 親タスクID(外部キー、NULL可) |
957
+ | created_at | TEXT | 作成日時(ISO 8601形式) |
958
+ | updated_at | TEXT | 更新日時(ISO 8601形式) |
959
+
960
+ 注意事項:
961
+ - `parent_id`は親タスクが削除されると自動的にNULLに設定されます(ON DELETE SET NULL)
962
+
963
+ ### attachments テーブル
964
+
965
+ | カラム名 | 型 | 説明 |
966
+ |---------|-----|------|
967
+ | id | INTEGER | 主キー(自動採番) |
968
+ | task_id | INTEGER | タスクID(外部キー) |
969
+ | file_path | TEXT | ファイルパス(必須) |
970
+ | created_at | TEXT | 作成日時(ISO 8601形式) |
971
+
972
+ ### task_blocks テーブル
973
+
974
+ | カラム名 | 型 | 説明 |
975
+ |---------|-----|------|
976
+ | id | INTEGER | 主キー(自動採番) |
977
+ | blocker_task_id | INTEGER | ブロックするタスクID(外部キー) |
978
+ | blocked_task_id | INTEGER | ブロックされるタスクID(外部キー) |
979
+ | created_at | TEXT | 作成日時(ISO 8601形式) |
980
+
981
+ 注意事項:
982
+ - `blocker_task_id`と`blocked_task_id`の組み合わせはユニーク制約があります
983
+ - いずれかのタスクが削除されるとブロック関係も自動的に削除されます(ON DELETE CASCADE)
984
+
985
+ ### tags テーブル
986
+
987
+ | カラム名 | 型 | 説明 |
988
+ |---------|-----|------|
989
+ | id | INTEGER | 主キー(自動採番) |
990
+ | name | TEXT | タグ名(必須、ユニーク) |
991
+ | created_at | TEXT | 作成日時(ISO 8601形式) |
992
+
993
+ ### task_tags テーブル
994
+
995
+ | カラム名 | 型 | 説明 |
996
+ |---------|-----|------|
997
+ | id | INTEGER | 主キー(自動採番) |
998
+ | task_id | INTEGER | タスクID(外部キー) |
999
+ | tag_id | INTEGER | タグID(外部キー) |
1000
+ | created_at | TEXT | 作成日時(ISO 8601形式) |
1001
+
1002
+ 注意事項:
1003
+ - `task_id`と`tag_id`の組み合わせはユニーク制約があります
1004
+ - タスクまたはタグが削除されると関連付けも自動的に削除されます(ON DELETE CASCADE)
1005
+
1006
+ ### task_metadata テーブル
1007
+
1008
+ | カラム名 | 型 | 説明 |
1009
+ |---------|-----|------|
1010
+ | id | INTEGER | 主キー(自動採番) |
1011
+ | task_id | INTEGER | タスクID(外部キー) |
1012
+ | key | TEXT | メタデータのキー |
1013
+ | value | TEXT | メタデータの値 |
1014
+ | created_at | TEXT | 作成日時(ISO 8601形式) |
1015
+
1016
+ 注意事項:
1017
+ - `task_id`と`key`の組み合わせはユニーク制約があります
1018
+ - タスクが削除されるとメタデータも自動的に削除されます(ON DELETE CASCADE)
1019
+
1020
+ ## 開発
1021
+
1022
+ ### 開発者向けセットアップ
1023
+
1024
+ agkan自体の開発に参加したい開発者向けの手順:
1025
+
1026
+ 1. リポジトリをクローン:
1027
+ ```bash
1028
+ git clone https://github.com/gendosu/agkan.git
1029
+ cd agkan
1030
+ ```
1031
+
1032
+ 2. 依存パッケージをインストール:
1033
+ ```bash
1034
+ npm install
1035
+ ```
1036
+
1037
+ 3. TypeScriptコードをビルド:
1038
+ ```bash
1039
+ npm run build
1040
+ ```
1041
+
1042
+ 4. グローバルコマンドとして登録:
1043
+ ```bash
1044
+ npm link
1045
+ ```
1046
+
1047
+ ### 開発ガイドライン
1048
+
1049
+ 包括的な開発情報については、以下のドキュメントを参照してください:
1050
+
1051
+ - **[TESTING.md](TESTING.md)** - テストガイド、カバレッジ実行、テストパターン
1052
+ - **[CONTRIBUTING.md](CONTRIBUTING.md)** - コントリビューションガイドラインとTDDプラクティス
1053
+ - **[docs/TDD-GUIDE.md](docs/TDD-GUIDE.md)** - 実践例を含むテスト駆動開発ガイド
1054
+ - **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** - プロジェクトアーキテクチャとデザインパターン
1055
+
1056
+ ### コード品質
1057
+
1058
+ このプロジェクトではコード品質のためにESLintとPrettierを使用しています:
1059
+
1060
+ ```bash
1061
+ npm run lint # コードをチェック
1062
+ npm run lint:fix # 問題を自動修正
1063
+ npm run format # コードをフォーマット
1064
+ npm run check # 全チェックを実行
1065
+ ```
1066
+
1067
+ ### テスト
1068
+
1069
+ #### ユニットテスト
1070
+
1071
+ Vitestを使用したユニットテストを実行:
1072
+ ```bash
1073
+ npm test
1074
+ ```
1075
+
1076
+ 全てのサービス層とモデル層がテストされています。
1077
+
1078
+ #### E2Eテスト
1079
+
1080
+ 実際のCLIコマンドを実行する包括的なE2Eテストを実行:
1081
+ ```bash
1082
+ npm run test:e2e
1083
+ ```
1084
+
1085
+ E2Eテストは以下の機能をカバーします:
1086
+ - ビルドとユニットテスト
1087
+ - タグ管理機能(作成、一覧、削除、重複チェック)
1088
+ - タグ付与機能(付与、解除、表示、重複チェック)
1089
+ - タグフィルタリング(単一タグ、複数タグ、ステータス組み合わせ)
1090
+ - CASCADE削除(データベース整合性確認)
1091
+
1092
+ テストはローカルのテスト用データベース(`.agkan-test/test-e2e.db`)を使用し、実行後に自動的にクリーンアップされます。
1093
+
1094
+ ### ビルド
1095
+
1096
+ ```bash
1097
+ npm run build
1098
+ ```
1099
+
1100
+ ### 開発時の自動ビルド
1101
+
1102
+ ```bash
1103
+ npm run dev
1104
+ ```
1105
+
1106
+ ### TypeScript型チェック
1107
+
1108
+ ```bash
1109
+ npx tsc --noEmit
1110
+ ```
1111
+
1112
+ ### データベースの初期化
1113
+
1114
+ データベースは最初のコマンド実行時に自動的に作成されます。手動で再作成する場合:
1115
+
1116
+ ```bash
1117
+ rm -rf data/agkan.db
1118
+ agkan task list # データベースが再作成されます
1119
+ ```
1120
+
1121
+ ## ライセンス
1122
+
1123
+ ISC
1124
+
1125
+ ## 作成者
1126
+
1127
+ Generated with Claude Code