agkan 3.15.2 → 3.17.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 +14 -0
- package/README.md +14 -0
- package/dist/cli/commands/board.d.ts.map +1 -1
- package/dist/cli/commands/board.js +25 -10
- package/dist/cli/commands/board.js.map +1 -1
- package/dist/cli/commands/context.js +1 -1
- package/dist/cli/commands/task/add-helpers.d.ts +5 -4
- package/dist/cli/commands/task/add-helpers.d.ts.map +1 -1
- package/dist/cli/commands/task/add-helpers.js +29 -2
- package/dist/cli/commands/task/add-helpers.js.map +1 -1
- package/dist/cli/commands/task/add.d.ts.map +1 -1
- package/dist/cli/commands/task/add.js +52 -17
- package/dist/cli/commands/task/add.js.map +1 -1
- package/dist/cli/commands/task/archive.d.ts.map +1 -1
- package/dist/cli/commands/task/archive.js +9 -110
- package/dist/cli/commands/task/archive.js.map +1 -1
- package/dist/cli/commands/task/find.d.ts.map +1 -1
- package/dist/cli/commands/task/find.js +3 -2
- package/dist/cli/commands/task/find.js.map +1 -1
- package/dist/cli/commands/task/get.d.ts.map +1 -1
- package/dist/cli/commands/task/get.js +19 -2
- package/dist/cli/commands/task/get.js.map +1 -1
- package/dist/cli/commands/task/list.d.ts.map +1 -1
- package/dist/cli/commands/task/list.js +69 -7
- package/dist/cli/commands/task/list.js.map +1 -1
- package/dist/cli/commands/task/purge-archive-helpers.d.ts +26 -0
- package/dist/cli/commands/task/purge-archive-helpers.d.ts.map +1 -0
- package/dist/cli/commands/task/purge-archive-helpers.js +133 -0
- package/dist/cli/commands/task/purge-archive-helpers.js.map +1 -0
- package/dist/cli/commands/task/purge.d.ts.map +1 -1
- package/dist/cli/commands/task/purge.js +9 -121
- package/dist/cli/commands/task/purge.js.map +1 -1
- package/dist/cli/commands/task/update.js +1 -1
- package/dist/cli/commands/task/update.js.map +1 -1
- package/dist/cli/utils/board-daemon.d.ts +8 -1
- package/dist/cli/utils/board-daemon.d.ts.map +1 -1
- package/dist/cli/utils/board-daemon.js +39 -4
- package/dist/cli/utils/board-daemon.js.map +1 -1
- package/dist/hooks/hook-attention.mjs +2 -1
- package/dist/hooks/hook-session-start.mjs +3 -1
- package/dist/hooks/hook-stop.mjs +10 -4
- package/dist/hooks/session-marker.mjs +6 -0
- package/dist/services/TaskService.d.ts +3 -1
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +5 -3
- package/dist/services/TaskService.js.map +1 -1
- package/dist/terminal/PtySessionService.d.ts +1 -0
- package/dist/terminal/PtySessionService.d.ts.map +1 -1
- package/dist/terminal/PtySessionService.js +49 -2
- package/dist/terminal/PtySessionService.js.map +1 -1
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -90,6 +90,11 @@ Markdownファイルからタスク作成:
|
|
|
90
90
|
agkan task add "設計書レビュー" --file ./design-doc.md --status backlog
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
タグ付きでタスク作成(カンマ区切りのタグ名またはID、同じコマンドで付与):
|
|
94
|
+
```bash
|
|
95
|
+
agkan task add "ログイン機能の実装" --tag "frontend,urgent"
|
|
96
|
+
```
|
|
97
|
+
|
|
93
98
|
### タスク一覧の表示
|
|
94
99
|
|
|
95
100
|
全タスクを表示:
|
|
@@ -237,6 +242,11 @@ agkan tag delete "frontend"
|
|
|
237
242
|
agkan tag attach 1 "frontend"
|
|
238
243
|
```
|
|
239
244
|
|
|
245
|
+
または `task add --tag` でタスク作成と同時にタグを付与(`tag attach` を別途実行する必要がない):
|
|
246
|
+
```bash
|
|
247
|
+
agkan task add "ログイン画面の実装" --tag "frontend,urgent"
|
|
248
|
+
```
|
|
249
|
+
|
|
240
250
|
タスクからタグを削除:
|
|
241
251
|
```bash
|
|
242
252
|
agkan tag detach 1 "frontend"
|
|
@@ -800,6 +810,10 @@ agkan task add "API開発"
|
|
|
800
810
|
|
|
801
811
|
agkan tag attach 2 "backend"
|
|
802
812
|
|
|
813
|
+
# --tag を使えば同じコマンドでタグを付与できる
|
|
814
|
+
agkan task add "決済フローのバグ修正" --tag "backend,urgent"
|
|
815
|
+
# 出力: Task created with ID: 3
|
|
816
|
+
|
|
803
817
|
# タグでフィルタリング
|
|
804
818
|
agkan task list --tag "frontend"
|
|
805
819
|
# 出力:
|
package/README.md
CHANGED
|
@@ -91,6 +91,11 @@ Create from Markdown file:
|
|
|
91
91
|
agkan task add "Design review" --file ./design-doc.md --status backlog
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
Create with tags (comma-separated names or IDs, attached in the same command):
|
|
95
|
+
```bash
|
|
96
|
+
agkan task add "Implement login feature" --tag "frontend,urgent"
|
|
97
|
+
```
|
|
98
|
+
|
|
94
99
|
JSON output format:
|
|
95
100
|
```bash
|
|
96
101
|
agkan task add "Fix bug in login" --json
|
|
@@ -421,6 +426,11 @@ Attach a tag to a task:
|
|
|
421
426
|
agkan tag attach 1 "frontend"
|
|
422
427
|
```
|
|
423
428
|
|
|
429
|
+
Or attach tags at creation time with `task add --tag`, instead of a separate `tag attach` call:
|
|
430
|
+
```bash
|
|
431
|
+
agkan task add "Implement login screen" --tag "frontend,urgent"
|
|
432
|
+
```
|
|
433
|
+
|
|
424
434
|
Remove a tag from a task:
|
|
425
435
|
```bash
|
|
426
436
|
agkan tag detach 1 "frontend"
|
|
@@ -801,6 +811,10 @@ agkan task add "API development"
|
|
|
801
811
|
|
|
802
812
|
agkan tag attach 2 "backend"
|
|
803
813
|
|
|
814
|
+
# Or attach tags in the same command with --tag
|
|
815
|
+
agkan task add "Bug fix in payment flow" --tag "backend,urgent"
|
|
816
|
+
# Output: Task created with ID: 3
|
|
817
|
+
|
|
804
818
|
# Filter by tag
|
|
805
819
|
agkan task list --tag "frontend"
|
|
806
820
|
# Output:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmOpC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsBxD"}
|
|
@@ -23,7 +23,7 @@ function buildDaemonArgs(port, title) {
|
|
|
23
23
|
args.push('--title', title);
|
|
24
24
|
return args;
|
|
25
25
|
}
|
|
26
|
-
function handleStart(options) {
|
|
26
|
+
async function handleStart(options) {
|
|
27
27
|
if ((0, board_daemon_1.isBoardRunning)()) {
|
|
28
28
|
console.log('Board server is already running');
|
|
29
29
|
return;
|
|
@@ -35,7 +35,14 @@ function handleStart(options) {
|
|
|
35
35
|
process.exit(1);
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
|
-
const pid = (0, board_daemon_1.spawnBoardDaemon)(buildDaemonArgs(port, options.title ?? config.board?.title));
|
|
38
|
+
const pid = (0, board_daemon_1.spawnBoardDaemon)(buildDaemonArgs(port, options.title ?? config.board?.title), port);
|
|
39
|
+
const ready = await (0, board_daemon_1.waitForBoardReady)(port);
|
|
40
|
+
if (!ready) {
|
|
41
|
+
console.error(`Board server failed to start on port ${port}`);
|
|
42
|
+
(0, board_daemon_1.killBoardProcess)();
|
|
43
|
+
process.exit(1);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
39
46
|
console.log(`Board server started (PID: ${pid}) on http://localhost:${port}`);
|
|
40
47
|
}
|
|
41
48
|
function handleStop() {
|
|
@@ -51,7 +58,7 @@ function handleStop() {
|
|
|
51
58
|
process.exit(1);
|
|
52
59
|
}
|
|
53
60
|
}
|
|
54
|
-
function handleRestart(options) {
|
|
61
|
+
async function handleRestart(options) {
|
|
55
62
|
(0, board_daemon_1.killBoardProcess)();
|
|
56
63
|
const config = (0, config_1.loadConfig)();
|
|
57
64
|
const port = resolvePort(options.port, config.board?.port);
|
|
@@ -60,7 +67,14 @@ function handleRestart(options) {
|
|
|
60
67
|
process.exit(1);
|
|
61
68
|
return;
|
|
62
69
|
}
|
|
63
|
-
const pid = (0, board_daemon_1.spawnBoardDaemon)(buildDaemonArgs(port, options.title ?? config.board?.title));
|
|
70
|
+
const pid = (0, board_daemon_1.spawnBoardDaemon)(buildDaemonArgs(port, options.title ?? config.board?.title), port);
|
|
71
|
+
const ready = await (0, board_daemon_1.waitForBoardReady)(port);
|
|
72
|
+
if (!ready) {
|
|
73
|
+
console.error(`Board server failed to start on port ${port}`);
|
|
74
|
+
(0, board_daemon_1.killBoardProcess)();
|
|
75
|
+
process.exit(1);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
64
78
|
console.log(`Board server restarted (PID: ${pid}) on http://localhost:${port}`);
|
|
65
79
|
}
|
|
66
80
|
function printTaskSummary() {
|
|
@@ -86,8 +100,8 @@ function printTaskSummary() {
|
|
|
86
100
|
}
|
|
87
101
|
async function handleStatus(options) {
|
|
88
102
|
const config = (0, config_1.loadConfig)();
|
|
89
|
-
const
|
|
90
|
-
if (
|
|
103
|
+
const resolvedPort = resolvePort(options.port, config.board?.port);
|
|
104
|
+
if (resolvedPort === null) {
|
|
91
105
|
console.error('Invalid port number');
|
|
92
106
|
process.exit(1);
|
|
93
107
|
return;
|
|
@@ -97,6 +111,7 @@ async function handleStatus(options) {
|
|
|
97
111
|
// Check server status
|
|
98
112
|
const isRunning = (0, board_daemon_1.isBoardRunning)();
|
|
99
113
|
const pid = (0, board_daemon_1.readBoardPid)();
|
|
114
|
+
const port = (0, board_daemon_1.readBoardPort)() ?? resolvedPort;
|
|
100
115
|
if (isRunning && pid) {
|
|
101
116
|
console.log(chalk_1.default.green(`✓ Server: RUNNING (PID: ${pid})`));
|
|
102
117
|
console.log(` Port: ${port}`);
|
|
@@ -142,10 +157,10 @@ function registerStartSubcommand(boardCommand) {
|
|
|
142
157
|
.description('Start board server as a daemon')
|
|
143
158
|
.option('-p, --port <number>', 'Port to listen on')
|
|
144
159
|
.option('-t, --title <text>', 'Board title to display in the header')
|
|
145
|
-
.action((options, command) => {
|
|
160
|
+
.action(async (options, command) => {
|
|
146
161
|
try {
|
|
147
162
|
const mergedOptions = mergeOptions(options, command);
|
|
148
|
-
handleStart(mergedOptions);
|
|
163
|
+
await handleStart(mergedOptions);
|
|
149
164
|
}
|
|
150
165
|
catch (error) {
|
|
151
166
|
(0, error_handler_1.handleError)(error, {});
|
|
@@ -171,10 +186,10 @@ function registerRestartSubcommand(boardCommand) {
|
|
|
171
186
|
.description('Restart the board server daemon')
|
|
172
187
|
.option('-p, --port <number>', 'Port to listen on')
|
|
173
188
|
.option('-t, --title <text>', 'Board title to display in the header')
|
|
174
|
-
.action((options, command) => {
|
|
189
|
+
.action(async (options, command) => {
|
|
175
190
|
try {
|
|
176
191
|
const mergedOptions = mergeOptions(options, command);
|
|
177
|
-
handleRestart(mergedOptions);
|
|
192
|
+
await handleRestart(mergedOptions);
|
|
178
193
|
}
|
|
179
194
|
catch (error) {
|
|
180
195
|
(0, error_handler_1.handleError)(error, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ This project uses agkan (Agent Kanban) for task management.
|
|
|
15
15
|
Common commands:
|
|
16
16
|
- agkan task list [--status <s>] [--tag <id>] [--tree]
|
|
17
17
|
- agkan task get <id>
|
|
18
|
-
- agkan task add "<title>" [--status <s>] [--parent <id>] [--file <path>]
|
|
18
|
+
- agkan task add "<title>" [--status <s>] [--parent <id>] [--file <path>] [--tag <names-or-ids>]
|
|
19
19
|
- agkan task update <id> --status <s>
|
|
20
20
|
- agkan task find "<keyword>"
|
|
21
21
|
- agkan task block add <blocker-id> <blocked-id>
|
|
@@ -2,16 +2,17 @@
|
|
|
2
2
|
* Helper functions for task add command
|
|
3
3
|
* Separated concerns: file reading, block ID parsing, relationship setup, output formatting
|
|
4
4
|
*/
|
|
5
|
-
import { TaskBlockService, TaskService } from '../../../services';
|
|
6
|
-
import { Task } from '../../../models';
|
|
5
|
+
import { TaskBlockService, TaskService, TagService } from '../../../services';
|
|
6
|
+
import { Task, Tag } from '../../../models';
|
|
7
7
|
export declare function readBodyFromFile(filePath: string): string;
|
|
8
8
|
export declare function parseBlockIds(value: string | undefined, label: string): number[];
|
|
9
|
+
export declare function resolveTagIds(tagService: TagService, value: string | undefined): number[];
|
|
9
10
|
export declare function addBlockRelationships(taskBlockService: TaskBlockService, taskId: number, blockedByIds: number[], blocksIds: number[]): void;
|
|
10
11
|
export declare function fetchRelatedTasks(taskService: TaskService, task: Task, blockedByIds: number[], blocksIds: number[]): {
|
|
11
12
|
parentTask: Task | null;
|
|
12
13
|
blockerTasks: Task[];
|
|
13
14
|
blockedTasks: Task[];
|
|
14
15
|
};
|
|
15
|
-
export declare function buildTaskJsonData(task: Task, parentTask: Task | null, blockerTasks: Task[], blockedTasks: Task[]): object;
|
|
16
|
-
export declare function printTaskCreated(task: Task, parentTask: Task | null, blockerTasks: Task[], blockedTasks: Task[]): void;
|
|
16
|
+
export declare function buildTaskJsonData(task: Task, parentTask: Task | null, blockerTasks: Task[], blockedTasks: Task[], tags?: Tag[]): object;
|
|
17
|
+
export declare function printTaskCreated(task: Task, parentTask: Task | null, blockerTasks: Task[], blockedTasks: Task[], tags?: Tag[]): void;
|
|
17
18
|
//# sourceMappingURL=add-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAe,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"add-helpers.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAe,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAM5C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAOhF;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAkBzF;AAED,wBAAgB,qBAAqB,CACnC,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAuBN;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,GAClB;IAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAAC,YAAY,EAAE,IAAI,EAAE,CAAA;CAAE,CAKzE;AAkBD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,GAAG,IAAI,EACvB,YAAY,EAAE,IAAI,EAAE,EACpB,YAAY,EAAE,IAAI,EAAE,EACpB,IAAI,GAAE,GAAG,EAAO,GACf,MAAM,CASR;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,GAAG,IAAI,EACvB,YAAY,EAAE,IAAI,EAAE,EACpB,YAAY,EAAE,IAAI,EAAE,EACpB,IAAI,GAAE,GAAG,EAAO,GACf,IAAI,CA+CN"}
|
|
@@ -9,6 +9,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.readBodyFromFile = readBodyFromFile;
|
|
11
11
|
exports.parseBlockIds = parseBlockIds;
|
|
12
|
+
exports.resolveTagIds = resolveTagIds;
|
|
12
13
|
exports.addBlockRelationships = addBlockRelationships;
|
|
13
14
|
exports.fetchRelatedTasks = fetchRelatedTasks;
|
|
14
15
|
exports.buildTaskJsonData = buildTaskJsonData;
|
|
@@ -18,6 +19,7 @@ const services_1 = require("../../../services");
|
|
|
18
19
|
const error_handler_1 = require("../../utils/error-handler");
|
|
19
20
|
const format_1 = require("../../../utils/format");
|
|
20
21
|
const array_utils_1 = require("../../utils/array-utils");
|
|
22
|
+
const tag_resolver_1 = require("../../utils/tag-resolver");
|
|
21
23
|
function readBodyFromFile(filePath) {
|
|
22
24
|
const fileService = new services_1.FileService();
|
|
23
25
|
try {
|
|
@@ -37,6 +39,24 @@ function parseBlockIds(value, label) {
|
|
|
37
39
|
}
|
|
38
40
|
return ids;
|
|
39
41
|
}
|
|
42
|
+
function resolveTagIds(tagService, value) {
|
|
43
|
+
if (!value)
|
|
44
|
+
return [];
|
|
45
|
+
const parts = value
|
|
46
|
+
.split(',')
|
|
47
|
+
.map((s) => s.trim())
|
|
48
|
+
.filter((s) => s !== '');
|
|
49
|
+
const tagIds = new Set();
|
|
50
|
+
for (const part of parts) {
|
|
51
|
+
const { tag, byId } = (0, tag_resolver_1.resolveTag)(tagService, part);
|
|
52
|
+
if (!tag) {
|
|
53
|
+
const message = byId ? `Tag with ID "${part}" not found` : `Tag with name "${part}" not found`;
|
|
54
|
+
throw new Error(message);
|
|
55
|
+
}
|
|
56
|
+
tagIds.add(tag.id);
|
|
57
|
+
}
|
|
58
|
+
return Array.from(tagIds);
|
|
59
|
+
}
|
|
40
60
|
function addBlockRelationships(taskBlockService, taskId, blockedByIds, blocksIds) {
|
|
41
61
|
for (const blockerId of blockedByIds) {
|
|
42
62
|
try {
|
|
@@ -82,16 +102,17 @@ function taskToJson(task) {
|
|
|
82
102
|
updated_at: task.updated_at,
|
|
83
103
|
};
|
|
84
104
|
}
|
|
85
|
-
function buildTaskJsonData(task, parentTask, blockerTasks, blockedTasks) {
|
|
105
|
+
function buildTaskJsonData(task, parentTask, blockerTasks, blockedTasks, tags = []) {
|
|
86
106
|
return {
|
|
87
107
|
success: true,
|
|
88
108
|
task: taskToJson(task),
|
|
89
109
|
parent: parentTask ? taskToJson(parentTask) : null,
|
|
90
110
|
blockedBy: blockerTasks.map(taskToJson),
|
|
91
111
|
blocking: blockedTasks.map(taskToJson),
|
|
112
|
+
tags: tags.map((tag) => ({ id: tag.id, name: tag.name })),
|
|
92
113
|
};
|
|
93
114
|
}
|
|
94
|
-
function printTaskCreated(task, parentTask, blockerTasks, blockedTasks) {
|
|
115
|
+
function printTaskCreated(task, parentTask, blockerTasks, blockedTasks, tags = []) {
|
|
95
116
|
console.log(chalk_1.default.green('\n✓ Task created successfully\n'));
|
|
96
117
|
console.log(`${chalk_1.default.bold('ID:')} ${task.id}`);
|
|
97
118
|
console.log(`${chalk_1.default.bold('Title:')} ${task.title}`);
|
|
@@ -123,6 +144,12 @@ function printTaskCreated(task, parentTask, blockerTasks, blockedTasks) {
|
|
|
123
144
|
`${chalk_1.default[blockedStatusColor](`(${blocked.status})`)}`);
|
|
124
145
|
});
|
|
125
146
|
}
|
|
147
|
+
if (tags.length > 0) {
|
|
148
|
+
console.log(`${chalk_1.default.bold('Tags:')}`);
|
|
149
|
+
tags.forEach((tag) => {
|
|
150
|
+
console.log(` ${chalk_1.default.cyan('•')} ${chalk_1.default.cyan(`[${tag.id}]`)} ${tag.name}`);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
126
153
|
console.log();
|
|
127
154
|
}
|
|
128
155
|
//# sourceMappingURL=add-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-helpers.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;
|
|
1
|
+
{"version":3,"file":"add-helpers.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/add-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/add.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4L1D"}
|
|
@@ -14,7 +14,11 @@ const validators_1 = require("../../utils/validators");
|
|
|
14
14
|
const input_validators_1 = require("../../../utils/input-validators");
|
|
15
15
|
const output_formatter_1 = require("../../utils/output-formatter");
|
|
16
16
|
const service_container_1 = require("../../utils/service-container");
|
|
17
|
+
const connection_1 = require("../../../db/connection");
|
|
17
18
|
const add_helpers_1 = require("./add-helpers");
|
|
19
|
+
/** Marker error used to distinguish block-relationship failures from other errors thrown within the transaction */
|
|
20
|
+
class BlockRelationshipError extends Error {
|
|
21
|
+
}
|
|
18
22
|
function setupTaskAddCommand(program) {
|
|
19
23
|
const taskCommand = program.commands.find((cmd) => cmd.name() === 'task');
|
|
20
24
|
if (!taskCommand) {
|
|
@@ -27,12 +31,13 @@ function setupTaskAddCommand(program) {
|
|
|
27
31
|
.option('-a, --author <author>', 'Task author')
|
|
28
32
|
.option('--assignees <assignees>', 'Task assignees (comma-separated)')
|
|
29
33
|
.option('-s, --status <status>', 'Task status (icebox, backlog, ready, in_progress, review, done, closed)', 'backlog')
|
|
30
|
-
.option('--priority <priority>', 'Task priority (critical, high, medium, low)', 'medium')
|
|
31
|
-
.option('
|
|
34
|
+
.option('-p, --priority <priority>', 'Task priority (critical, high, medium, low)', 'medium')
|
|
35
|
+
.option('--parent <id>', 'Parent task ID')
|
|
32
36
|
.option('--file <path>', 'Read body from markdown file')
|
|
33
37
|
.option('--branch <branch>', 'Git branch name for the task')
|
|
34
38
|
.option('--blocked-by <ids>', 'Comma-separated task IDs that block this task')
|
|
35
39
|
.option('--blocks <ids>', 'Comma-separated task IDs that this task blocks')
|
|
40
|
+
.option('--tag <names-or-ids>', 'Comma-separated tag names or IDs to attach')
|
|
36
41
|
.option('--json', 'Output in JSON format')
|
|
37
42
|
.description('Add a new task')
|
|
38
43
|
.action(async (title, body, options) => {
|
|
@@ -115,30 +120,60 @@ function setupTaskAddCommand(program) {
|
|
|
115
120
|
process.exit(1);
|
|
116
121
|
return;
|
|
117
122
|
}
|
|
118
|
-
const { taskService, taskBlockService } = (0, service_container_1.getServiceContainer)();
|
|
119
|
-
|
|
120
|
-
title,
|
|
121
|
-
body: taskBody,
|
|
122
|
-
author: options.author,
|
|
123
|
-
assignees: options.assignees,
|
|
124
|
-
status: options.status,
|
|
125
|
-
priority: options.priority ? options.priority : undefined,
|
|
126
|
-
parent_id: parentId,
|
|
127
|
-
branch: options.branch ?? null,
|
|
128
|
-
});
|
|
123
|
+
const { taskService, taskBlockService, taskTagService, tagService } = (0, service_container_1.getServiceContainer)();
|
|
124
|
+
let tagIds = [];
|
|
129
125
|
try {
|
|
130
|
-
(0, add_helpers_1.
|
|
126
|
+
tagIds = (0, add_helpers_1.resolveTagIds)(tagService, options.tag);
|
|
131
127
|
}
|
|
132
128
|
catch (error) {
|
|
133
|
-
const msg = error instanceof Error ? error.message : '
|
|
129
|
+
const msg = error instanceof Error ? error.message : 'Invalid tag';
|
|
134
130
|
formatter.error(msg, () => {
|
|
135
|
-
console.error(chalk_1.default.red(`\
|
|
131
|
+
console.error(chalk_1.default.red(`\nError: ${msg}\n`));
|
|
136
132
|
});
|
|
137
133
|
process.exit(1);
|
|
138
134
|
return;
|
|
139
135
|
}
|
|
136
|
+
const backend = (0, connection_1.getStorageBackend)();
|
|
137
|
+
// Wrap task creation and block relationship setup in a single transaction
|
|
138
|
+
// so a failure in addBlockRelationships rolls back the created task instead
|
|
139
|
+
// of leaving an orphaned task behind.
|
|
140
|
+
let task;
|
|
141
|
+
try {
|
|
142
|
+
task = backend.transaction(() => {
|
|
143
|
+
const created = taskService.createTask({
|
|
144
|
+
title,
|
|
145
|
+
body: taskBody,
|
|
146
|
+
author: options.author,
|
|
147
|
+
assignees: options.assignees,
|
|
148
|
+
status: options.status,
|
|
149
|
+
priority: options.priority ? options.priority : undefined,
|
|
150
|
+
parent_id: parentId,
|
|
151
|
+
branch: options.branch ?? null,
|
|
152
|
+
tagIds,
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
(0, add_helpers_1.addBlockRelationships)(taskBlockService, created.id, blockedByIds, blocksIds);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
throw new BlockRelationshipError(error instanceof Error ? error.message : 'Error adding block relationships');
|
|
159
|
+
}
|
|
160
|
+
return created;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (error instanceof BlockRelationshipError) {
|
|
165
|
+
const msg = error.message;
|
|
166
|
+
formatter.error(msg, () => {
|
|
167
|
+
console.error(chalk_1.default.red(`\n✗ ${msg}\n`));
|
|
168
|
+
});
|
|
169
|
+
process.exit(1);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
140
174
|
const { parentTask, blockerTasks, blockedTasks } = (0, add_helpers_1.fetchRelatedTasks)(taskService, task, blockedByIds, blocksIds);
|
|
141
|
-
|
|
175
|
+
const tags = taskTagService.getTagsForTask(task.id);
|
|
176
|
+
formatter.output(() => (0, add_helpers_1.buildTaskJsonData)(task, parentTask, blockerTasks, blockedTasks, tags), () => (0, add_helpers_1.printTaskCreated)(task, parentTask, blockerTasks, blockedTasks, tags));
|
|
142
177
|
}
|
|
143
178
|
catch (error) {
|
|
144
179
|
if (error instanceof Error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/add.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../../src/cli/commands/task/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/archive.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/archive.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAW9D"}
|
|
@@ -2,119 +2,18 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Task archive command handler
|
|
4
4
|
*/
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
6
|
exports.setupTaskArchiveCommand = setupTaskArchiveCommand;
|
|
10
|
-
const
|
|
11
|
-
const service_container_1 = require("../../utils/service-container");
|
|
12
|
-
const error_handler_1 = require("../../utils/error-handler");
|
|
13
|
-
const validators_1 = require("../../utils/validators");
|
|
14
|
-
const output_formatter_1 = require("../../utils/output-formatter");
|
|
15
|
-
const format_1 = require("../../../utils/format");
|
|
16
|
-
const date_1 = require("../../../utils/date");
|
|
17
|
-
/** Default number of days before which tasks are eligible for archive */
|
|
18
|
-
const DEFAULT_DAYS_BEFORE = 3;
|
|
19
|
-
function resolveBeforeDate(before) {
|
|
20
|
-
if (!before) {
|
|
21
|
-
return { date: (0, date_1.daysAgoIso)(DEFAULT_DAYS_BEFORE) };
|
|
22
|
-
}
|
|
23
|
-
const parsed = new Date(before);
|
|
24
|
-
if (isNaN(parsed.getTime())) {
|
|
25
|
-
return { error: `Invalid date: ${before}. Use ISO 8601 format, e.g. 2026-01-01` };
|
|
26
|
-
}
|
|
27
|
-
return { date: parsed.toISOString() };
|
|
28
|
-
}
|
|
29
|
-
function resolveStatuses(statusOption) {
|
|
30
|
-
const parts = statusOption
|
|
31
|
-
.split(',')
|
|
32
|
-
.map((s) => s.trim())
|
|
33
|
-
.filter((s) => s !== '');
|
|
34
|
-
if (parts.length === 0) {
|
|
35
|
-
return { error: 'No statuses specified. Provide at least one status.' };
|
|
36
|
-
}
|
|
37
|
-
for (const s of parts) {
|
|
38
|
-
if (!(0, validators_1.validateTaskStatus)(s)) {
|
|
39
|
-
return {
|
|
40
|
-
error: `Invalid status: ${s}. Valid statuses: icebox, backlog, ready, in_progress, review, done, closed`,
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return { statuses: parts };
|
|
45
|
-
}
|
|
46
|
-
function printArchiveResult(tasks, beforeDate, dryRun) {
|
|
47
|
-
if (tasks.length === 0) {
|
|
48
|
-
console.log(chalk_1.default.yellow('\nNo tasks matched the archive criteria.\n'));
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
if (dryRun) {
|
|
52
|
-
console.log(chalk_1.default.bold(`\n[Dry Run] ${tasks.length} task(s) would be archived (updated before ${beforeDate}):\n`));
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
console.log(chalk_1.default.green(`\n✓ Archived ${tasks.length} task(s) (updated before ${beforeDate}):\n`));
|
|
56
|
-
}
|
|
57
|
-
for (const t of tasks) {
|
|
58
|
-
console.log(` ${chalk_1.default.bold.cyan(`[${t.id}]`)} ${chalk_1.default.bold(t.title)} ` +
|
|
59
|
-
`${chalk_1.default.gray(`(${t.status})`)} ${chalk_1.default.gray('updated:')} ${(0, format_1.formatDate)(t.updated_at)}`);
|
|
60
|
-
}
|
|
61
|
-
console.log('');
|
|
62
|
-
}
|
|
7
|
+
const purge_archive_helpers_1 = require("./purge-archive-helpers");
|
|
63
8
|
function setupTaskArchiveCommand(program) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
.option('--dry-run', 'Preview tasks that would be archived without modifying them')
|
|
73
|
-
.option('--json', 'Output in JSON format')
|
|
74
|
-
.description('Archive done/closed tasks older than a given date (sets is_archived flag)')
|
|
75
|
-
.action(async (options) => {
|
|
76
|
-
const formatter = (0, output_formatter_1.createFormatter)(options);
|
|
77
|
-
try {
|
|
78
|
-
const { taskService } = (0, service_container_1.getServiceContainer)();
|
|
79
|
-
const beforeResult = resolveBeforeDate(options.before);
|
|
80
|
-
if ('error' in beforeResult) {
|
|
81
|
-
formatter.error(beforeResult.error, () => {
|
|
82
|
-
console.error(chalk_1.default.red(`\nError: ${beforeResult.error}\n`));
|
|
83
|
-
});
|
|
84
|
-
process.exit(1);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const beforeDate = beforeResult.date;
|
|
88
|
-
const statusResult = resolveStatuses(options.status);
|
|
89
|
-
if ('error' in statusResult) {
|
|
90
|
-
formatter.error(statusResult.error, () => {
|
|
91
|
-
console.error(chalk_1.default.red(`\nError: ${statusResult.error}\n`));
|
|
92
|
-
});
|
|
93
|
-
process.exit(1);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
const statuses = statusResult.statuses;
|
|
97
|
-
const dryRun = !!options.dryRun;
|
|
98
|
-
const tasks = taskService.archiveTasksBefore(beforeDate, statuses, dryRun);
|
|
99
|
-
formatter.output(() => ({
|
|
100
|
-
dryRun,
|
|
101
|
-
beforeDate,
|
|
102
|
-
statuses,
|
|
103
|
-
count: tasks.length,
|
|
104
|
-
tasks: tasks.map((t) => ({ id: t.id, title: t.title, status: t.status, updated_at: t.updated_at })),
|
|
105
|
-
}), () => printArchiveResult(tasks, beforeDate, dryRun));
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
if (error instanceof Error) {
|
|
109
|
-
(0, error_handler_1.handleError)(error, options);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
formatter.error('An unknown error occurred', () => {
|
|
113
|
-
console.error(chalk_1.default.red('\n✗ An unknown error occurred\n'));
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
process.exit(1);
|
|
117
|
-
}
|
|
9
|
+
(0, purge_archive_helpers_1.setupPurgeArchiveCommand)(program, {
|
|
10
|
+
commandName: 'archive',
|
|
11
|
+
verb: 'archive',
|
|
12
|
+
pastVerb: 'Archived',
|
|
13
|
+
description: 'Archive done/closed tasks older than a given date (sets is_archived flag)',
|
|
14
|
+
beforeHelp: 'Archive tasks last updated before this date (ISO 8601, e.g. 2026-01-01). Defaults to 3 days ago.',
|
|
15
|
+
dryRunHelp: 'Preview tasks that would be archived without modifying them',
|
|
16
|
+
serviceMethod: (taskService, beforeDate, statuses, dryRun) => taskService.archiveTasksBefore(beforeDate, statuses, dryRun),
|
|
118
17
|
});
|
|
119
18
|
}
|
|
120
19
|
//# sourceMappingURL=archive.js.map
|