agkan 3.13.0 → 3.15.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 (94) hide show
  1. package/README.ja.md +47 -0
  2. package/README.md +47 -0
  3. package/dist/board/BulkRunService.d.ts.map +1 -1
  4. package/dist/board/BulkRunService.js +21 -5
  5. package/dist/board/BulkRunService.js.map +1 -1
  6. package/dist/board/boardRoutes.d.ts +4 -4
  7. package/dist/board/boardRoutes.d.ts.map +1 -1
  8. package/dist/board/boardRoutes.js +71 -122
  9. package/dist/board/boardRoutes.js.map +1 -1
  10. package/dist/board/boardStyles.d.ts +1 -1
  11. package/dist/board/boardStyles.d.ts.map +1 -1
  12. package/dist/board/boardStyles.js +5 -1
  13. package/dist/board/boardStyles.js.map +1 -1
  14. package/dist/board/client/main.js +228 -154
  15. package/dist/board/server.d.ts.map +1 -1
  16. package/dist/board/server.js +5 -2
  17. package/dist/board/server.js.map +1 -1
  18. package/dist/cli/commands/agent-guide.d.ts.map +1 -1
  19. package/dist/cli/commands/agent-guide.js +8 -1
  20. package/dist/cli/commands/agent-guide.js.map +1 -1
  21. package/dist/cli/commands/block/add.d.ts.map +1 -1
  22. package/dist/cli/commands/block/add.js +2 -0
  23. package/dist/cli/commands/block/add.js.map +1 -1
  24. package/dist/cli/commands/block/remove.d.ts.map +1 -1
  25. package/dist/cli/commands/block/remove.js +2 -0
  26. package/dist/cli/commands/block/remove.js.map +1 -1
  27. package/dist/cli/commands/config/get.d.ts +5 -0
  28. package/dist/cli/commands/config/get.d.ts.map +1 -0
  29. package/dist/cli/commands/config/get.js +97 -0
  30. package/dist/cli/commands/config/get.js.map +1 -0
  31. package/dist/cli/commands/init.d.ts.map +1 -1
  32. package/dist/cli/commands/init.js +9 -0
  33. package/dist/cli/commands/init.js.map +1 -1
  34. package/dist/cli/commands/meta/delete.d.ts.map +1 -1
  35. package/dist/cli/commands/meta/delete.js +6 -0
  36. package/dist/cli/commands/meta/delete.js.map +1 -1
  37. package/dist/cli/commands/meta/set.d.ts.map +1 -1
  38. package/dist/cli/commands/meta/set.js +7 -0
  39. package/dist/cli/commands/meta/set.js.map +1 -1
  40. package/dist/cli/commands/tag/attach.d.ts.map +1 -1
  41. package/dist/cli/commands/tag/attach.js +10 -19
  42. package/dist/cli/commands/tag/attach.js.map +1 -1
  43. package/dist/cli/commands/tag/delete.d.ts.map +1 -1
  44. package/dist/cli/commands/tag/delete.js +8 -20
  45. package/dist/cli/commands/tag/delete.js.map +1 -1
  46. package/dist/cli/commands/tag/detach.d.ts.map +1 -1
  47. package/dist/cli/commands/tag/detach.js +10 -19
  48. package/dist/cli/commands/tag/detach.js.map +1 -1
  49. package/dist/cli/commands/tag/rename.d.ts.map +1 -1
  50. package/dist/cli/commands/tag/rename.js +8 -20
  51. package/dist/cli/commands/tag/rename.js.map +1 -1
  52. package/dist/cli/commands/task/list.d.ts.map +1 -1
  53. package/dist/cli/commands/task/list.js +9 -13
  54. package/dist/cli/commands/task/list.js.map +1 -1
  55. package/dist/cli/commands/task/update.d.ts.map +1 -1
  56. package/dist/cli/commands/task/update.js +2 -0
  57. package/dist/cli/commands/task/update.js.map +1 -1
  58. package/dist/cli/index.js +4 -0
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/utils/boardNotify.d.ts +2 -0
  61. package/dist/cli/utils/boardNotify.d.ts.map +1 -0
  62. package/dist/cli/utils/boardNotify.js +16 -0
  63. package/dist/cli/utils/boardNotify.js.map +1 -0
  64. package/dist/cli/utils/constants.d.ts +2 -0
  65. package/dist/cli/utils/constants.d.ts.map +1 -0
  66. package/dist/cli/utils/constants.js +5 -0
  67. package/dist/cli/utils/constants.js.map +1 -0
  68. package/dist/cli/utils/service-container.d.ts.map +1 -1
  69. package/dist/cli/utils/service-container.js +8 -1
  70. package/dist/cli/utils/service-container.js.map +1 -1
  71. package/dist/cli/utils/tag-resolver.d.ts +21 -0
  72. package/dist/cli/utils/tag-resolver.d.ts.map +1 -0
  73. package/dist/cli/utils/tag-resolver.js +22 -0
  74. package/dist/cli/utils/tag-resolver.js.map +1 -0
  75. package/dist/db/config.d.ts +8 -0
  76. package/dist/db/config.d.ts.map +1 -1
  77. package/dist/db/config.js +14 -0
  78. package/dist/db/config.js.map +1 -1
  79. package/dist/hooks/hook-stop.mjs +77 -32
  80. package/dist/services/BoardEventService.d.ts +9 -0
  81. package/dist/services/BoardEventService.d.ts.map +1 -0
  82. package/dist/services/BoardEventService.js +22 -0
  83. package/dist/services/BoardEventService.js.map +1 -0
  84. package/dist/services/ClaudeProcessService.d.ts.map +1 -1
  85. package/dist/services/ClaudeProcessService.js +3 -1
  86. package/dist/services/ClaudeProcessService.js.map +1 -1
  87. package/dist/services/TaskService.d.ts +3 -1
  88. package/dist/services/TaskService.d.ts.map +1 -1
  89. package/dist/services/TaskService.js +27 -15
  90. package/dist/services/TaskService.js.map +1 -1
  91. package/dist/terminal/PtySessionService.d.ts.map +1 -1
  92. package/dist/terminal/PtySessionService.js +13 -3
  93. package/dist/terminal/PtySessionService.js.map +1 -1
  94. package/package.json +1 -1
package/README.ja.md CHANGED
@@ -351,6 +351,24 @@ agkan ps --json
351
351
  }
352
352
  ```
353
353
 
354
+ ### 設定確認
355
+
356
+ `.agkan.yml` の設定値(デフォルト適用後の解決済み値)を取得します:
357
+
358
+ ```bash
359
+ agkan config get # 全設定を表示
360
+ agkan config get board.port # 特定キーを取得(ドット記法)
361
+ agkan config get --json # JSON出力
362
+ ```
363
+
364
+ 出力例:
365
+ ```
366
+ ✓ Resolved config
367
+
368
+ path: /workspace/.agkan/data.db
369
+ board.port: 8080
370
+ ```
371
+
354
372
  ### ヘルプの表示
355
373
 
356
374
  コマンド一覧:
@@ -1035,6 +1053,35 @@ models:
1035
1053
  effort: low
1036
1054
  ```
1037
1055
 
1056
+ ### パーミッションモード設定
1057
+
1058
+ `.agkan.yml` の `permissionMode` フィールドで、ボードからタスクを実行する際のClaude CLIのパーミッションチェック方法を制御できます。
1059
+
1060
+ #### 利用可能な値
1061
+
1062
+ | 値 | Claude CLI フラグ | 説明 |
1063
+ |-------|----------------|-------------|
1064
+ | (未設定) | `--permission-mode auto` | デフォルト。Claudeがautoパーミッションモードを使用 |
1065
+ | `auto` | `--permission-mode auto` | Claudeがautoパーミッションモードを使用 |
1066
+ | `bypassPermissions` | `--permission-mode bypassPermissions` | すべてのパーミッションチェックをバイパス |
1067
+ | `acceptEdits` | `--permission-mode acceptEdits` | ファイル編集を自動的に承認 |
1068
+ | `dontAsk` | `--permission-mode dontAsk` | パーミッションを確認しない |
1069
+ | `plan` | `--permission-mode plan` | プランのみモード |
1070
+ | `default` | `--permission-mode default` | Claudeのデフォルトパーミッションモード |
1071
+ | `skipPermissions` | `--dangerously-skip-permissions` | レガシーフラグ(すべてのチェックをバイパスする旧来の動作) |
1072
+
1073
+ #### 設定例
1074
+
1075
+ ```yaml
1076
+ # autoパーミッションモードを使用(デフォルト)
1077
+ permissionMode: auto
1078
+
1079
+ # レガシーの --dangerously-skip-permissions フラグを使用
1080
+ permissionMode: skipPermissions
1081
+ ```
1082
+
1083
+ > **破壊的変更**: この機能導入以前は常に `--dangerously-skip-permissions` が渡されていました。新しいデフォルトは `--permission-mode auto` です。従来の動作を維持するには `.agkan.yml` に `permissionMode: skipPermissions` を設定してください。
1084
+
1038
1085
  ## 実装予定機能
1039
1086
 
1040
1087
  ### タスクの添付ファイル
package/README.md CHANGED
@@ -592,6 +592,24 @@ agkan ps --json
592
592
  }
593
593
  ```
594
594
 
595
+ ### Config
596
+
597
+ Get resolved configuration values from `.agkan.yml` (defaults applied):
598
+
599
+ ```bash
600
+ agkan config get # Show full resolved config
601
+ agkan config get board.port # Show specific key (dot notation)
602
+ agkan config get --json # JSON output
603
+ ```
604
+
605
+ Example output:
606
+ ```
607
+ ✓ Resolved config
608
+
609
+ path: /workspace/.agkan/data.db
610
+ board.port: 8080
611
+ ```
612
+
595
613
  ### Display Help
596
614
 
597
615
  Show command list:
@@ -1049,6 +1067,35 @@ Supported aliases: `opus`, `sonnet`, `haiku` (resolved by the Claude CLI)
1049
1067
  effort: low
1050
1068
  ```
1051
1069
 
1070
+ ### Permission Mode Settings
1071
+
1072
+ The `permissionMode` field in `.agkan.yml` controls how Claude CLI permission checks are handled when executing tasks from the board.
1073
+
1074
+ #### Available Values
1075
+
1076
+ | Value | Claude CLI flag | Description |
1077
+ |-------|----------------|-------------|
1078
+ | (not set) | `--permission-mode auto` | Default. Claude uses auto permission mode |
1079
+ | `auto` | `--permission-mode auto` | Claude uses auto permission mode |
1080
+ | `bypassPermissions` | `--permission-mode bypassPermissions` | Bypass all permission checks |
1081
+ | `acceptEdits` | `--permission-mode acceptEdits` | Automatically accept file edits |
1082
+ | `dontAsk` | `--permission-mode dontAsk` | Do not ask for permissions |
1083
+ | `plan` | `--permission-mode plan` | Plan-only mode |
1084
+ | `default` | `--permission-mode default` | Claude default permission mode |
1085
+ | `skipPermissions` | `--dangerously-skip-permissions` | Legacy flag (same as bypassing all checks) |
1086
+
1087
+ #### Configuration Example
1088
+
1089
+ ```yaml
1090
+ # Use auto permission mode (default)
1091
+ permissionMode: auto
1092
+
1093
+ # Use legacy --dangerously-skip-permissions flag
1094
+ permissionMode: skipPermissions
1095
+ ```
1096
+
1097
+ > **Breaking Change**: Prior to this feature, `--dangerously-skip-permissions` was always passed. The new default is `--permission-mode auto`. To restore the previous behavior, set `permissionMode: skipPermissions` in your `.agkan.yml`.
1098
+
1052
1099
  ## Planned Features
1053
1100
 
1054
1101
  ### Task Attachments
@@ -1 +1 @@
1
- {"version":3,"file":"BulkRunService.d.ts","sourceRoot":"","sources":["../../src/board/BulkRunService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIlE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAC7C,KAAK,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AAED,KAAK,mBAAmB,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;AAI3D,qBAAa,cAAc;IASvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,aAAa;IAVvB,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAAuC;IACrE,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,SAAS,CAA8C;gBAGrD,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,gBAAgB,EACrB,aAAa,EAAE,iBAAiB;IAG1C,SAAS,IAAI,aAAa;IAI1B,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAK/D,OAAO,CAAC,iBAAiB;IAKnB,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAYjE,IAAI,IAAI,IAAI;IAeZ,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,iBAAiB;YAsBX,UAAU;YAgBV,OAAO;CAgBtB"}
1
+ {"version":3,"file":"BulkRunService.d.ts","sourceRoot":"","sources":["../../src/board/BulkRunService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIlE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAC7C,KAAK,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;CAChC;AAED,KAAK,mBAAmB,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;AAI3D,qBAAa,cAAc;IASvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,aAAa;IAVvB,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,sBAAsB,CAAuC;IACrE,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,SAAS,CAA8C;gBAGrD,EAAE,EAAE,WAAW,EACf,GAAG,EAAE,gBAAgB,EACrB,aAAa,EAAE,iBAAiB;IAG1C,SAAS,IAAI,aAAa;IAI1B,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAK/D,OAAO,CAAC,iBAAiB;IAKnB,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAYjE,IAAI,IAAI,IAAI;IAeZ,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,iBAAiB;YAuBX,UAAU;YAmCV,OAAO;CAgBtB"}
@@ -114,7 +114,7 @@ class BulkRunService {
114
114
  buildLaunchParams(taskId) {
115
115
  const command = this.command;
116
116
  const ptyCommand = command === 'pr' ? 'pr' : 'run';
117
- const exitInstruction = '\n\nWhen you have completed this task, execute /exit to end this session.';
117
+ const exitInstruction = "\n\nWhen you have completed this task, send 'exit' as a prompt (not as a bash command) to end this session.";
118
118
  const prompt = command === 'pr'
119
119
  ? `Task ID: ${taskId}\n/agkan-subtask${exitInstruction}`
120
120
  : `Task ID: ${taskId}\n/agkan-subtask-direct${exitInstruction}`;
@@ -128,17 +128,33 @@ class BulkRunService {
128
128
  }
129
129
  async launchTask(taskId) {
130
130
  const { prompt, ptyCommand, model, effort } = this.buildLaunchParams(taskId);
131
+ // Track whether runNext has already been called to prevent duplicate invocations.
132
+ let advanced = false;
133
+ const advance = () => {
134
+ if (!advanced) {
135
+ advanced = true;
136
+ void this.runNext();
137
+ }
138
+ };
131
139
  try {
132
140
  await this.claudeProcess.startProcess(taskId, prompt, ptyCommand, model, effort);
133
141
  }
134
142
  catch {
135
- void this.runNext();
143
+ advance();
136
144
  return;
137
145
  }
138
- const unsubscribe = this.claudeProcess.subscribeOutput(taskId, (evt) => {
146
+ // subscribeOutput always fires the callback (done or error) even when the session
147
+ // has already exited (fixed in PtySessionService), so the loop is guaranteed to proceed.
148
+ // Use let so the callback can safely reference unsubscribe even when the callback fires
149
+ // synchronously before the assignment completes (fast-exit / no-session path).
150
+ let unsubscribe;
151
+ unsubscribe = this.claudeProcess.subscribeOutput(taskId, (evt) => {
139
152
  if (evt.kind === 'done' || evt.kind === 'error') {
140
- unsubscribe();
141
- void this.runNext();
153
+ if (evt.kind === 'done' && evt.exitCode === 0) {
154
+ this.ts.updateTask(taskId, { status: 'done' });
155
+ }
156
+ unsubscribe?.();
157
+ advance();
142
158
  }
143
159
  });
144
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BulkRunService.js","sourceRoot":"","sources":["../../src/board/BulkRunService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BulkRunService.js","sourceRoot":"","sources":["../../src/board/BulkRunService.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import { TaskBlockService } from '../services/TaskBlockService';
8
8
  import { PtySessionService } from '../terminal/PtySessionService';
9
9
  import { StorageBackend } from '../db/types/repository';
10
10
  import { AttentionStateService } from '../services/AttentionStateService';
11
+ import { BoardEventService } from '../services/BoardEventService';
11
12
  export type BoardServices = {
12
13
  ts: TaskService;
13
14
  tts: TaskTagService;
@@ -19,6 +20,8 @@ export type BoardServices = {
19
20
  boardTitle?: string;
20
21
  configDir: string;
21
22
  ptySessionService?: PtySessionService;
23
+ boardEventService?: BoardEventService;
24
+ attentionStateService?: AttentionStateService;
22
25
  };
23
26
  export declare function registerTaskApiRoutes(app: Hono, services: BoardServices): void;
24
27
  export declare function registerConfigApiRoutes(app: Hono, configDir: string): void;
@@ -28,11 +31,8 @@ export interface HookRouteDeps {
28
31
  stopProcess: (taskId: number) => boolean;
29
32
  };
30
33
  }
31
- export interface AttentionStreamDeps {
32
- attentionStateService: AttentionStateService;
33
- }
34
34
  export declare function registerHookRoutes(app: Hono, deps: HookRouteDeps): void;
35
+ export declare function registerBoardNotifyRoute(app: Hono, boardEventService?: BoardEventService): void;
35
36
  export declare function registerTestHookTokenRoute(app: Hono): void;
36
- export declare function registerAttentionStreamRoute(app: Hono, deps: AttentionStreamDeps): void;
37
37
  export declare function registerBoardRoutes(app: Hono, services: BoardServices): void;
38
38
  //# sourceMappingURL=boardRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boardRoutes.d.ts","sourceRoot":"","sources":["../../src/board/boardRoutes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIlE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAcxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,WAAW,CAAC;IAChB,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,eAAe,CAAC;IACpB,EAAE,EAAE,cAAc,CAAC;IACnB,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,CAAC;AAgYF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAO9E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+B1E;AA2RD,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,iBAAiB,EAAE;QAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,EAAE,qBAAqB,CAAC;CAC9C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CA8BvE;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAK1D;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAiDvF;AAqED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAqH5E"}
1
+ {"version":3,"file":"boardRoutes.d.ts","sourceRoot":"","sources":["../../src/board/boardRoutes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIlE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAcxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,WAAW,CAAC;IAChB,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,eAAe,CAAC;IACpB,EAAE,EAAE,cAAc,CAAC;IACnB,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC/C,CAAC;AAwYF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAO9E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+B1E;AAmOD,MAAM,WAAW,aAAa;IAC5B,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,iBAAiB,EAAE;QAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE,CAAC;CACjE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CA8BvE;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAK/F;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAK1D;AAqED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CA+J5E"}
@@ -36,8 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerTaskApiRoutes = registerTaskApiRoutes;
37
37
  exports.registerConfigApiRoutes = registerConfigApiRoutes;
38
38
  exports.registerHookRoutes = registerHookRoutes;
39
+ exports.registerBoardNotifyRoute = registerBoardNotifyRoute;
39
40
  exports.registerTestHookTokenRoute = registerTestHookTokenRoute;
40
- exports.registerAttentionStreamRoute = registerAttentionStreamRoute;
41
41
  exports.registerBoardRoutes = registerBoardRoutes;
42
42
  const fs = __importStar(require("fs"));
43
43
  const path = __importStar(require("path"));
@@ -258,7 +258,7 @@ function registerCommentRoutes(app, cs, ts) {
258
258
  registerTaskCommentRoutes(app, cs, ts);
259
259
  registerCommentIdRoutes(app, cs);
260
260
  }
261
- function registerTagRoutes(app, tts, tags, ts) {
261
+ function registerTagRoutes(app, tts, tags, ts, boardEventService) {
262
262
  app.post('/api/tasks/:id/tags', async (c) => {
263
263
  const id = Number(c.req.param('id'));
264
264
  if (isNaN(id))
@@ -272,6 +272,7 @@ function registerTagRoutes(app, tts, tags, ts) {
272
272
  if (!tags.getTag(tagId))
273
273
  return c.json({ error: 'Tag not found' }, 404);
274
274
  tts.addTagToTask({ task_id: id, tag_id: tagId });
275
+ boardEventService?.notify();
275
276
  return c.json({ success: true }, 201);
276
277
  });
277
278
  app.delete('/api/tasks/:id/tags/:tagId', (c) => {
@@ -284,6 +285,7 @@ function registerTagRoutes(app, tts, tags, ts) {
284
285
  const removed = tts.removeTagFromTask(id, tagId);
285
286
  if (!removed)
286
287
  return c.json({ error: 'Tag not attached to task' }, 404);
288
+ boardEventService?.notify();
287
289
  return c.json({ success: true });
288
290
  });
289
291
  app.get('/api/tags', (c) => {
@@ -415,10 +417,10 @@ function registerExportImportRoutes(app, services) {
415
417
  });
416
418
  }
417
419
  function registerTaskApiRoutes(app, services) {
418
- const { ts, tts, tags, ms, cs, tbs } = services;
420
+ const { ts, tts, tags, ms, cs, tbs, boardEventService } = services;
419
421
  registerTaskCrudRoutes(app, ts, tts, tbs, ms, tags);
420
422
  registerCommentRoutes(app, cs, ts);
421
- registerTagRoutes(app, tts, tags, ts);
423
+ registerTagRoutes(app, tts, tags, ts, boardEventService);
422
424
  registerUtilityRoutes(app, ts);
423
425
  registerExportImportRoutes(app, services);
424
426
  }
@@ -508,7 +510,7 @@ function registerClaudeRoutes(app, claudeProcess, ts) {
508
510
  : !task.branch || task.branch === Task_1.BRANCH_AUTO_GENERATE
509
511
  ? `\n\nNo branch specified: Read this task's title and body, and generate an appropriate git branch name for the work. Format: task/${taskId}-<kebab-case> (alphanumeric characters and hyphens only, maximum 60 characters). Run git checkout -b with the generated branch name before starting work, then save the branch field via PATCH /api/tasks/${taskId} (body: { "branch": "<generated-branch-name>" }) after starting work.`
510
512
  : '';
511
- const exitInstruction = '\n\nWhen you have completed this task, execute /exit to end this session.';
513
+ const exitInstruction = "\n\nWhen you have completed this task, send 'exit' as a prompt (not as a bash command) to end this session.";
512
514
  const prompt = command === 'planning'
513
515
  ? `Task ID: ${taskId}\n/agkan-planning-subtask${branchInstruction}${exitInstruction}`
514
516
  : command === 'pr'
@@ -571,59 +573,6 @@ function registerClaudeRoutes(app, claudeProcess, ts) {
571
573
  const tasks = claudeProcess.listRunningTasks();
572
574
  return c.json({ tasks });
573
575
  });
574
- app.get('/api/running-tasks/stream', (c) => {
575
- const stream = new ReadableStream({
576
- start(controller) {
577
- let finalized = false;
578
- let unsubscribeConfirm;
579
- const encode = (event, data) => {
580
- const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
581
- return new TextEncoder().encode(payload);
582
- };
583
- const safeClose = () => {
584
- if (finalized)
585
- return;
586
- finalized = true;
587
- unsubscribe();
588
- unsubscribeConfirm?.();
589
- controller.close();
590
- };
591
- const sendUpdate = () => {
592
- if (finalized)
593
- return;
594
- try {
595
- controller.enqueue(encode('update', { tasks: claudeProcess.listRunningTasks() }));
596
- }
597
- catch {
598
- safeClose();
599
- }
600
- };
601
- const sendConfirmComplete = (taskId, targetStatus) => {
602
- if (finalized)
603
- return;
604
- try {
605
- controller.enqueue(encode('confirm-complete', { taskId, targetStatus }));
606
- }
607
- catch {
608
- safeClose();
609
- }
610
- };
611
- const unsubscribe = claudeProcess.subscribeRunningTasksChange(sendUpdate);
612
- unsubscribeConfirm = claudeProcess.subscribeCompletionConfirm(sendConfirmComplete);
613
- sendUpdate();
614
- c.req.raw.signal?.addEventListener('abort', () => {
615
- safeClose();
616
- });
617
- },
618
- });
619
- return new Response(stream, {
620
- headers: {
621
- 'Content-Type': 'text/event-stream',
622
- 'Cache-Control': 'no-cache',
623
- Connection: 'keep-alive',
624
- },
625
- });
626
- });
627
576
  app.get('/api/claude/tasks/:taskId/run-logs/stream', (c) => {
628
577
  const taskId = Number(c.req.param('taskId'));
629
578
  if (isNaN(taskId))
@@ -731,6 +680,12 @@ function registerHookRoutes(app, deps) {
731
680
  return c.json({ ok: true });
732
681
  });
733
682
  }
683
+ function registerBoardNotifyRoute(app, boardEventService) {
684
+ app.post('/api/board/notify', (c) => {
685
+ boardEventService?.notify();
686
+ return c.json({ ok: true });
687
+ });
688
+ }
734
689
  function registerTestHookTokenRoute(app) {
735
690
  if (!(0, config_2.isTestMode)())
736
691
  return;
@@ -738,54 +693,6 @@ function registerTestHookTokenRoute(app) {
738
693
  return c.json({ token: (0, hookToken_1.getHookToken)() });
739
694
  });
740
695
  }
741
- function registerAttentionStreamRoute(app, deps) {
742
- app.get('/api/attention/stream', (c) => {
743
- const stream = new ReadableStream({
744
- start(controller) {
745
- let finalized = false;
746
- const encode = (data) => {
747
- const payload = `data: ${JSON.stringify(data)}\n\n`;
748
- return new TextEncoder().encode(payload);
749
- };
750
- const safeClose = () => {
751
- if (finalized)
752
- return;
753
- finalized = true;
754
- unsub();
755
- controller.close();
756
- };
757
- const initial = deps.attentionStateService.listAttentionTasks();
758
- try {
759
- controller.enqueue(encode({ type: 'snapshot', taskIds: initial }));
760
- }
761
- catch {
762
- safeClose();
763
- return;
764
- }
765
- const unsub = deps.attentionStateService.subscribe((update) => {
766
- if (finalized)
767
- return;
768
- try {
769
- controller.enqueue(encode({ type: 'update', ...update }));
770
- }
771
- catch {
772
- safeClose();
773
- }
774
- });
775
- c.req.raw.signal?.addEventListener('abort', () => {
776
- safeClose();
777
- });
778
- },
779
- });
780
- return new Response(stream, {
781
- headers: {
782
- 'Content-Type': 'text/event-stream',
783
- 'Cache-Control': 'no-cache',
784
- Connection: 'keep-alive',
785
- },
786
- });
787
- });
788
- }
789
696
  function registerBulkRunRoutes(app, bulkRunService) {
790
697
  app.post('/api/claude/bulk-run', async (c) => {
791
698
  const body = (await c.req.json().catch(() => ({})));
@@ -848,7 +755,7 @@ function registerBulkRunRoutes(app, bulkRunService) {
848
755
  });
849
756
  }
850
757
  function registerBoardRoutes(app, services) {
851
- const { ts, tts, tbs, database, boardTitle, configDir } = services;
758
+ const { ts, tts, tbs, database, boardTitle, configDir, boardEventService, attentionStateService } = services;
852
759
  app.use('*', async (c, next) => {
853
760
  (0, logger_1.verboseLog)(`[boardRoutes] ${c.req.method} ${c.req.path}`);
854
761
  await next();
@@ -895,11 +802,11 @@ function registerBoardRoutes(app, services) {
895
802
  return c.html((0, boardRenderer_1.renderBoard)(tasksByStatus, tts.getAllTaskTags(), boardTitle, boardConfig.theme, blockMap));
896
803
  });
897
804
  app.get('/api/board/stream', (c) => {
805
+ const ptyService = services.ptySessionService;
898
806
  const stream = new ReadableStream({
899
807
  start(controller) {
900
808
  let finalized = false;
901
- let lastKnownTs = undefined;
902
- let intervalId;
809
+ const unsubscribers = [];
903
810
  const encode = (event, data) => {
904
811
  const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
905
812
  return new TextEncoder().encode(payload);
@@ -908,25 +815,66 @@ function registerBoardRoutes(app, services) {
908
815
  if (finalized)
909
816
  return;
910
817
  finalized = true;
911
- clearInterval(intervalId);
818
+ unsubscribers.forEach((fn) => fn());
912
819
  controller.close();
913
820
  };
914
- const sendUpdate = () => {
821
+ const send = (event, data) => {
915
822
  if (finalized)
916
823
  return;
917
- const ts = (0, boardRenderer_1.getBoardUpdatedAt)(database);
918
- if (ts !== lastKnownTs) {
919
- lastKnownTs = ts;
920
- try {
921
- controller.enqueue(encode('update', { updatedAt: ts }));
922
- }
923
- catch {
924
- safeClose();
925
- }
824
+ try {
825
+ controller.enqueue(encode(event, data));
826
+ }
827
+ catch {
828
+ safeClose();
926
829
  }
927
830
  };
928
- sendUpdate();
929
- intervalId = setInterval(sendUpdate, 2000);
831
+ // board-update: triggered by BoardEventService or fallback polling
832
+ if (boardEventService) {
833
+ // Send initial snapshot so client can sync on connect
834
+ send('board-update', { updatedAt: (0, boardRenderer_1.getBoardUpdatedAt)(database) });
835
+ const unsub = boardEventService.subscribe(() => {
836
+ send('board-update', { updatedAt: (0, boardRenderer_1.getBoardUpdatedAt)(database) });
837
+ });
838
+ unsubscribers.push(unsub);
839
+ }
840
+ else {
841
+ let lastKnownTs = undefined;
842
+ const intervalId = setInterval(() => {
843
+ if (finalized)
844
+ return;
845
+ const ts = (0, boardRenderer_1.getBoardUpdatedAt)(database);
846
+ if (ts !== lastKnownTs) {
847
+ lastKnownTs = ts;
848
+ send('board-update', { updatedAt: ts });
849
+ }
850
+ }, 2000);
851
+ unsubscribers.push(() => clearInterval(intervalId));
852
+ // initial send
853
+ const ts = (0, boardRenderer_1.getBoardUpdatedAt)(database);
854
+ lastKnownTs = ts;
855
+ send('board-update', { updatedAt: ts });
856
+ }
857
+ // attention: snapshot + updates
858
+ if (attentionStateService) {
859
+ const initial = attentionStateService.listAttentionTasks();
860
+ send('attention', { type: 'snapshot', taskIds: initial });
861
+ const unsub = attentionStateService.subscribe((update) => {
862
+ send('attention', { type: 'update', ...update });
863
+ });
864
+ unsubscribers.push(unsub);
865
+ }
866
+ // running-tasks + confirm-complete
867
+ if (ptyService) {
868
+ send('running-tasks', { tasks: ptyService.listRunningTasks() });
869
+ const unsubRunning = ptyService.subscribeRunningTasksChange(() => {
870
+ send('running-tasks', { tasks: ptyService.listRunningTasks() });
871
+ });
872
+ unsubscribers.push(unsubRunning);
873
+ const unsubConfirm = ptyService.subscribeCompletionConfirm((taskId, targetStatus) => {
874
+ send('confirm-complete', { taskId, targetStatus });
875
+ });
876
+ unsubscribers.push(unsubConfirm);
877
+ }
930
878
  c.req.raw.signal?.addEventListener('abort', () => {
931
879
  safeClose();
932
880
  });
@@ -954,6 +902,7 @@ function registerBoardRoutes(app, services) {
954
902
  });
955
903
  registerTaskApiRoutes(app, services);
956
904
  registerConfigApiRoutes(app, configDir);
905
+ registerBoardNotifyRoute(app, boardEventService);
957
906
  if (services.ptySessionService) {
958
907
  registerClaudeRoutes(app, services.ptySessionService, ts);
959
908
  const bulkRunService = new BulkRunService_1.BulkRunService(ts, tbs, services.ptySessionService);