dev-team-mcp-server 0.1.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 (245) hide show
  1. package/README.md +168 -0
  2. package/dist/cli.d.ts +5 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +127 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config/permissions.d.ts +26 -0
  7. package/dist/config/permissions.d.ts.map +1 -0
  8. package/dist/config/permissions.js +82 -0
  9. package/dist/config/permissions.js.map +1 -0
  10. package/dist/config/team-config.d.ts +28 -0
  11. package/dist/config/team-config.d.ts.map +1 -0
  12. package/dist/config/team-config.js +101 -0
  13. package/dist/config/team-config.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +1301 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/tools/add-backlog.d.ts +21 -0
  19. package/dist/tools/add-backlog.d.ts.map +1 -0
  20. package/dist/tools/add-backlog.js +96 -0
  21. package/dist/tools/add-backlog.js.map +1 -0
  22. package/dist/tools/approve-plan.d.ts +12 -0
  23. package/dist/tools/approve-plan.d.ts.map +1 -0
  24. package/dist/tools/approve-plan.js +181 -0
  25. package/dist/tools/approve-plan.js.map +1 -0
  26. package/dist/tools/approve-test.d.ts +15 -0
  27. package/dist/tools/approve-test.d.ts.map +1 -0
  28. package/dist/tools/approve-test.js +113 -0
  29. package/dist/tools/approve-test.js.map +1 -0
  30. package/dist/tools/archive-all-tasks.d.ts +9 -0
  31. package/dist/tools/archive-all-tasks.d.ts.map +1 -0
  32. package/dist/tools/archive-all-tasks.js +39 -0
  33. package/dist/tools/archive-all-tasks.js.map +1 -0
  34. package/dist/tools/assign-task.d.ts +31 -0
  35. package/dist/tools/assign-task.d.ts.map +1 -0
  36. package/dist/tools/assign-task.js +285 -0
  37. package/dist/tools/assign-task.js.map +1 -0
  38. package/dist/tools/check-queue.d.ts +18 -0
  39. package/dist/tools/check-queue.d.ts.map +1 -0
  40. package/dist/tools/check-queue.js +129 -0
  41. package/dist/tools/check-queue.js.map +1 -0
  42. package/dist/tools/clear-agent.d.ts +8 -0
  43. package/dist/tools/clear-agent.d.ts.map +1 -0
  44. package/dist/tools/clear-agent.js +52 -0
  45. package/dist/tools/clear-agent.js.map +1 -0
  46. package/dist/tools/compact-agent.d.ts +8 -0
  47. package/dist/tools/compact-agent.d.ts.map +1 -0
  48. package/dist/tools/compact-agent.js +52 -0
  49. package/dist/tools/compact-agent.js.map +1 -0
  50. package/dist/tools/compact-all.d.ts +11 -0
  51. package/dist/tools/compact-all.d.ts.map +1 -0
  52. package/dist/tools/compact-all.js +61 -0
  53. package/dist/tools/compact-all.js.map +1 -0
  54. package/dist/tools/configure-modes.d.ts +19 -0
  55. package/dist/tools/configure-modes.d.ts.map +1 -0
  56. package/dist/tools/configure-modes.js +114 -0
  57. package/dist/tools/configure-modes.js.map +1 -0
  58. package/dist/tools/distribute-tasks.d.ts +40 -0
  59. package/dist/tools/distribute-tasks.d.ts.map +1 -0
  60. package/dist/tools/distribute-tasks.js +276 -0
  61. package/dist/tools/distribute-tasks.js.map +1 -0
  62. package/dist/tools/get-backlog.d.ts +9 -0
  63. package/dist/tools/get-backlog.d.ts.map +1 -0
  64. package/dist/tools/get-backlog.js +65 -0
  65. package/dist/tools/get-backlog.js.map +1 -0
  66. package/dist/tools/get-dashboard.d.ts +15 -0
  67. package/dist/tools/get-dashboard.d.ts.map +1 -0
  68. package/dist/tools/get-dashboard.js +154 -0
  69. package/dist/tools/get-dashboard.js.map +1 -0
  70. package/dist/tools/get-project-context.d.ts +11 -0
  71. package/dist/tools/get-project-context.d.ts.map +1 -0
  72. package/dist/tools/get-project-context.js +84 -0
  73. package/dist/tools/get-project-context.js.map +1 -0
  74. package/dist/tools/health-check.d.ts +21 -0
  75. package/dist/tools/health-check.d.ts.map +1 -0
  76. package/dist/tools/health-check.js +86 -0
  77. package/dist/tools/health-check.js.map +1 -0
  78. package/dist/tools/kill-member.d.ts +15 -0
  79. package/dist/tools/kill-member.d.ts.map +1 -0
  80. package/dist/tools/kill-member.js +89 -0
  81. package/dist/tools/kill-member.js.map +1 -0
  82. package/dist/tools/kill-member.test.d.ts +2 -0
  83. package/dist/tools/kill-member.test.d.ts.map +1 -0
  84. package/dist/tools/kill-member.test.js +228 -0
  85. package/dist/tools/kill-member.test.js.map +1 -0
  86. package/dist/tools/process-approval.d.ts +14 -0
  87. package/dist/tools/process-approval.d.ts.map +1 -0
  88. package/dist/tools/process-approval.js +225 -0
  89. package/dist/tools/process-approval.js.map +1 -0
  90. package/dist/tools/process-skill-candidate.d.ts +14 -0
  91. package/dist/tools/process-skill-candidate.d.ts.map +1 -0
  92. package/dist/tools/process-skill-candidate.js +56 -0
  93. package/dist/tools/process-skill-candidate.js.map +1 -0
  94. package/dist/tools/recall-memory.d.ts +9 -0
  95. package/dist/tools/recall-memory.d.ts.map +1 -0
  96. package/dist/tools/recall-memory.js +97 -0
  97. package/dist/tools/recall-memory.js.map +1 -0
  98. package/dist/tools/reject-plan.d.ts +13 -0
  99. package/dist/tools/reject-plan.d.ts.map +1 -0
  100. package/dist/tools/reject-plan.js +154 -0
  101. package/dist/tools/reject-plan.js.map +1 -0
  102. package/dist/tools/reject-test.d.ts +13 -0
  103. package/dist/tools/reject-test.d.ts.map +1 -0
  104. package/dist/tools/reject-test.js +122 -0
  105. package/dist/tools/reject-test.js.map +1 -0
  106. package/dist/tools/report-skill-candidate.d.ts +12 -0
  107. package/dist/tools/report-skill-candidate.d.ts.map +1 -0
  108. package/dist/tools/report-skill-candidate.js +51 -0
  109. package/dist/tools/report-skill-candidate.js.map +1 -0
  110. package/dist/tools/request-approval.d.ts +13 -0
  111. package/dist/tools/request-approval.d.ts.map +1 -0
  112. package/dist/tools/request-approval.js +53 -0
  113. package/dist/tools/request-approval.js.map +1 -0
  114. package/dist/tools/request-member-decrease.d.ts +15 -0
  115. package/dist/tools/request-member-decrease.d.ts.map +1 -0
  116. package/dist/tools/request-member-decrease.js +100 -0
  117. package/dist/tools/request-member-decrease.js.map +1 -0
  118. package/dist/tools/request-member-increase.d.ts +15 -0
  119. package/dist/tools/request-member-increase.d.ts.map +1 -0
  120. package/dist/tools/request-member-increase.js +81 -0
  121. package/dist/tools/request-member-increase.js.map +1 -0
  122. package/dist/tools/save-memory.d.ts +9 -0
  123. package/dist/tools/save-memory.d.ts.map +1 -0
  124. package/dist/tools/save-memory.js +82 -0
  125. package/dist/tools/save-memory.js.map +1 -0
  126. package/dist/tools/send-task.d.ts +18 -0
  127. package/dist/tools/send-task.d.ts.map +1 -0
  128. package/dist/tools/send-task.js +216 -0
  129. package/dist/tools/send-task.js.map +1 -0
  130. package/dist/tools/set-review-mode.d.ts +13 -0
  131. package/dist/tools/set-review-mode.d.ts.map +1 -0
  132. package/dist/tools/set-review-mode.js +69 -0
  133. package/dist/tools/set-review-mode.js.map +1 -0
  134. package/dist/tools/submit-plan.d.ts +16 -0
  135. package/dist/tools/submit-plan.d.ts.map +1 -0
  136. package/dist/tools/submit-plan.js +151 -0
  137. package/dist/tools/submit-plan.js.map +1 -0
  138. package/dist/tools/submit-test.d.ts +15 -0
  139. package/dist/tools/submit-test.d.ts.map +1 -0
  140. package/dist/tools/submit-test.js +110 -0
  141. package/dist/tools/submit-test.js.map +1 -0
  142. package/dist/tools/update-backlog.d.ts +22 -0
  143. package/dist/tools/update-backlog.d.ts.map +1 -0
  144. package/dist/tools/update-backlog.js +94 -0
  145. package/dist/tools/update-backlog.js.map +1 -0
  146. package/dist/tools/update-project-context.d.ts +9 -0
  147. package/dist/tools/update-project-context.d.ts.map +1 -0
  148. package/dist/tools/update-project-context.js +81 -0
  149. package/dist/tools/update-project-context.js.map +1 -0
  150. package/dist/tools/update-task-status.d.ts +25 -0
  151. package/dist/tools/update-task-status.d.ts.map +1 -0
  152. package/dist/tools/update-task-status.js +160 -0
  153. package/dist/tools/update-task-status.js.map +1 -0
  154. package/dist/tools/watch-queue.d.ts +17 -0
  155. package/dist/tools/watch-queue.d.ts.map +1 -0
  156. package/dist/tools/watch-queue.js +132 -0
  157. package/dist/tools/watch-queue.js.map +1 -0
  158. package/dist/types/memory.d.ts +44 -0
  159. package/dist/types/memory.d.ts.map +1 -0
  160. package/dist/types/memory.js +2 -0
  161. package/dist/types/memory.js.map +1 -0
  162. package/dist/types/message.d.ts +25 -0
  163. package/dist/types/message.d.ts.map +1 -0
  164. package/dist/types/message.js +2 -0
  165. package/dist/types/message.js.map +1 -0
  166. package/dist/types/task.d.ts +113 -0
  167. package/dist/types/task.d.ts.map +1 -0
  168. package/dist/types/task.js +2 -0
  169. package/dist/types/task.js.map +1 -0
  170. package/dist/utils/ansi-table.d.ts +41 -0
  171. package/dist/utils/ansi-table.d.ts.map +1 -0
  172. package/dist/utils/ansi-table.js +139 -0
  173. package/dist/utils/ansi-table.js.map +1 -0
  174. package/dist/utils/court.d.ts +22 -0
  175. package/dist/utils/court.d.ts.map +1 -0
  176. package/dist/utils/court.js +76 -0
  177. package/dist/utils/court.js.map +1 -0
  178. package/dist/utils/court.test.d.ts +2 -0
  179. package/dist/utils/court.test.d.ts.map +1 -0
  180. package/dist/utils/court.test.js +151 -0
  181. package/dist/utils/court.test.js.map +1 -0
  182. package/dist/utils/file-lock.d.ts +4 -0
  183. package/dist/utils/file-lock.d.ts.map +1 -0
  184. package/dist/utils/file-lock.js +59 -0
  185. package/dist/utils/file-lock.js.map +1 -0
  186. package/dist/utils/format.d.ts +7 -0
  187. package/dist/utils/format.d.ts.map +1 -0
  188. package/dist/utils/format.js +33 -0
  189. package/dist/utils/format.js.map +1 -0
  190. package/dist/utils/init-project.d.ts +5 -0
  191. package/dist/utils/init-project.d.ts.map +1 -0
  192. package/dist/utils/init-project.js +89 -0
  193. package/dist/utils/init-project.js.map +1 -0
  194. package/dist/utils/logger.d.ts +16 -0
  195. package/dist/utils/logger.d.ts.map +1 -0
  196. package/dist/utils/logger.js +53 -0
  197. package/dist/utils/logger.js.map +1 -0
  198. package/dist/utils/memory.d.ts +60 -0
  199. package/dist/utils/memory.d.ts.map +1 -0
  200. package/dist/utils/memory.js +403 -0
  201. package/dist/utils/memory.js.map +1 -0
  202. package/dist/utils/permission.d.ts +34 -0
  203. package/dist/utils/permission.d.ts.map +1 -0
  204. package/dist/utils/permission.js +52 -0
  205. package/dist/utils/permission.js.map +1 -0
  206. package/dist/utils/permission.test.d.ts +2 -0
  207. package/dist/utils/permission.test.d.ts.map +1 -0
  208. package/dist/utils/permission.test.js +26 -0
  209. package/dist/utils/permission.test.js.map +1 -0
  210. package/dist/utils/queue.d.ts +55 -0
  211. package/dist/utils/queue.d.ts.map +1 -0
  212. package/dist/utils/queue.js +705 -0
  213. package/dist/utils/queue.js.map +1 -0
  214. package/dist/utils/status-transition.d.ts +57 -0
  215. package/dist/utils/status-transition.d.ts.map +1 -0
  216. package/dist/utils/status-transition.js +94 -0
  217. package/dist/utils/status-transition.js.map +1 -0
  218. package/dist/utils/task-archive.d.ts +33 -0
  219. package/dist/utils/task-archive.d.ts.map +1 -0
  220. package/dist/utils/task-archive.js +233 -0
  221. package/dist/utils/task-archive.js.map +1 -0
  222. package/dist/utils/task-manager.d.ts +67 -0
  223. package/dist/utils/task-manager.d.ts.map +1 -0
  224. package/dist/utils/task-manager.js +225 -0
  225. package/dist/utils/task-manager.js.map +1 -0
  226. package/dist/utils/team-session.d.ts +99 -0
  227. package/dist/utils/team-session.d.ts.map +1 -0
  228. package/dist/utils/team-session.js +585 -0
  229. package/dist/utils/team-session.js.map +1 -0
  230. package/dist/utils/validation.d.ts +40 -0
  231. package/dist/utils/validation.d.ts.map +1 -0
  232. package/dist/utils/validation.js +57 -0
  233. package/dist/utils/validation.js.map +1 -0
  234. package/dist/utils/wezterm.d.ts +23 -0
  235. package/dist/utils/wezterm.d.ts.map +1 -0
  236. package/dist/utils/wezterm.js +189 -0
  237. package/dist/utils/wezterm.js.map +1 -0
  238. package/package.json +60 -0
  239. package/templates/skills/report-template.md +58 -0
  240. package/templates/skills/review-code.md +83 -0
  241. package/templates/skills/review-plan.md +65 -0
  242. package/templates/skills/strict-review.md +83 -0
  243. package/templates/skills/strict-workflow.md +48 -0
  244. package/templates/skills/tdd.md +50 -0
  245. package/templates/start-team-skill.md +61 -0
@@ -0,0 +1,61 @@
1
+ import { sendTextToPane } from '../utils/wezterm.js';
2
+ import { getCurrentRole } from '../utils/permission.js';
3
+ import { info, error } from '../utils/logger.js';
4
+ import { getAllRoles } from '../config/team-config.js';
5
+ export async function compactAll() {
6
+ const currentRole = getCurrentRole();
7
+ // Permission check: PM and leader only
8
+ if (currentRole !== 'pm' && currentRole !== 'leader') {
9
+ return {
10
+ success: false,
11
+ results: [],
12
+ error: 'このツールはPMとleaderのみが使用できます',
13
+ };
14
+ }
15
+ try {
16
+ const roles = getAllRoles();
17
+ const results = [];
18
+ // Send compact to all roles in parallel
19
+ const promises = roles.map(async (role) => {
20
+ try {
21
+ const sent = await sendTextToPane(role, '/compact');
22
+ return { role, sent };
23
+ }
24
+ catch (err) {
25
+ error(`Failed to send compact to ${role}`, err);
26
+ return { role, sent: false };
27
+ }
28
+ });
29
+ const settled = await Promise.all(promises);
30
+ results.push(...settled);
31
+ const allSuccess = results.every(r => r.sent);
32
+ info(`Compact all completed`, { results });
33
+ return {
34
+ success: allSuccess,
35
+ results,
36
+ };
37
+ }
38
+ catch (err) {
39
+ error('Failed to compact all', err);
40
+ return {
41
+ success: false,
42
+ results: [],
43
+ error: err instanceof Error ? err.message : 'Unknown error',
44
+ };
45
+ }
46
+ }
47
+ export function formatCompactAllResult(result) {
48
+ if (result.error) {
49
+ return `❌ compact_allに失敗しました: ${result.error}`;
50
+ }
51
+ let output = `## compact_all 結果\n\n`;
52
+ output += `| ロール | 結果 |\n`;
53
+ output += `|--------|------|\n`;
54
+ for (const r of result.results) {
55
+ output += `| ${r.role} | ${r.sent ? '✅' : '❌'} |\n`;
56
+ }
57
+ const successCount = result.results.filter(r => r.sent).length;
58
+ output += `\n**送信成功:** ${successCount}/${result.results.length}`;
59
+ return output;
60
+ }
61
+ //# sourceMappingURL=compact-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact-all.js","sourceRoot":"","sources":["../../src/tools/compact-all.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAQvD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,uCAAuC;IACvC,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,0BAA0B;SACpC,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,OAAO,GAA2C,EAAE,CAAC;QAE3D,wCAAwC;QACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAY,EAAE,UAAU,CAAC,CAAC;gBAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,KAAK,CAAC,6BAA6B,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;gBAChD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACjC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAEzB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3C,OAAO;YACH,OAAO,EAAE,UAAU;YACnB,OAAO;SACV,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAC9D,CAAC;IACN,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAwB;IAC3D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,yBAAyB,MAAM,CAAC,KAAK,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,MAAM,GAAG,uBAAuB,CAAC;IACrC,MAAM,IAAI,gBAAgB,CAAC;IAC3B,MAAM,IAAI,qBAAqB,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACxD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,IAAI,eAAe,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAEjE,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type ReviewMode = 'normal' | 'strict';
2
+ export type TaskSplitApproval = 'auto' | 'required';
3
+ export interface ModeSettings {
4
+ reviewMode: ReviewMode;
5
+ taskSplitApproval: TaskSplitApproval;
6
+ }
7
+ export interface ConfigureModesParams {
8
+ reviewMode?: ReviewMode;
9
+ taskSplitApproval?: TaskSplitApproval;
10
+ }
11
+ export interface ConfigureModesResult {
12
+ success: boolean;
13
+ currentSettings?: ModeSettings;
14
+ settings?: ModeSettings;
15
+ error?: string;
16
+ }
17
+ export declare function configureModes(params: ConfigureModesParams): Promise<ConfigureModesResult>;
18
+ export declare function formatConfigureModesResult(result: ConfigureModesResult): string;
19
+ //# sourceMappingURL=configure-modes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-modes.d.ts","sourceRoot":"","sources":["../../src/tools/configure-modes.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC7C,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,CAAC;AAEpD,MAAM,WAAW,YAAY;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,iBAAiB,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACzC;AAED,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwFhG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAqC/E"}
@@ -0,0 +1,114 @@
1
+ import { getCurrentRole } from '../utils/permission.js';
2
+ import { getProjectContext, updateProjectContext, getReviewMode, getTaskSplitApproval } from '../utils/memory.js';
3
+ import { info, error } from '../utils/logger.js';
4
+ export async function configureModes(params) {
5
+ const role = getCurrentRole();
6
+ // PMのみ使用可能
7
+ if (role !== 'pm') {
8
+ return {
9
+ success: false,
10
+ error: `configure_modesはPMのみ使用可能です。現在の役割: ${role}`,
11
+ };
12
+ }
13
+ try {
14
+ // 現在の設定を取得
15
+ const currentReviewMode = await getReviewMode();
16
+ const currentTaskSplitApproval = await getTaskSplitApproval();
17
+ const currentSettings = {
18
+ reviewMode: currentReviewMode,
19
+ taskSplitApproval: currentTaskSplitApproval,
20
+ };
21
+ // パラメータがない場合は現在の設定のみ返す
22
+ if (params.reviewMode === undefined && params.taskSplitApproval === undefined) {
23
+ info('Returning current mode settings', { currentSettings });
24
+ return {
25
+ success: true,
26
+ currentSettings,
27
+ settings: currentSettings,
28
+ };
29
+ }
30
+ // 新しい設定値を決定
31
+ const newReviewMode = params.reviewMode ?? currentReviewMode;
32
+ const newTaskSplitApproval = params.taskSplitApproval ?? currentTaskSplitApproval;
33
+ // reviewModeのバリデーション
34
+ if (params.reviewMode !== undefined && params.reviewMode !== 'normal' && params.reviewMode !== 'strict') {
35
+ return {
36
+ success: false,
37
+ error: `無効なreviewModeです: ${params.reviewMode}。'normal' または 'strict' を指定してください。`,
38
+ };
39
+ }
40
+ // preferencesを更新
41
+ const context = await getProjectContext();
42
+ let newPreferences;
43
+ // 新しいpreferences内容を構築
44
+ const preferencesLines = [];
45
+ preferencesLines.push(`reviewMode: ${newReviewMode}`);
46
+ preferencesLines.push(`taskSplitApproval: ${newTaskSplitApproval}`);
47
+ // 既存のpreferencesから上記以外の設定を保持
48
+ if (context.preferences && context.preferences !== '(未設定)') {
49
+ const existingLines = context.preferences.split('\n');
50
+ for (const line of existingLines) {
51
+ const trimmedLine = line.trim();
52
+ if (trimmedLine &&
53
+ !trimmedLine.startsWith('reviewMode:') &&
54
+ !trimmedLine.startsWith('taskSplitApproval:')) {
55
+ preferencesLines.push(trimmedLine);
56
+ }
57
+ }
58
+ }
59
+ newPreferences = preferencesLines.join('\n');
60
+ await updateProjectContext('preferences', newPreferences, false);
61
+ const newSettings = {
62
+ reviewMode: newReviewMode,
63
+ taskSplitApproval: newTaskSplitApproval,
64
+ };
65
+ info('Mode settings updated', { currentSettings, newSettings });
66
+ return {
67
+ success: true,
68
+ currentSettings,
69
+ settings: newSettings,
70
+ };
71
+ }
72
+ catch (err) {
73
+ error('Failed to configure modes', err);
74
+ return {
75
+ success: false,
76
+ error: err instanceof Error ? err.message : 'Unknown error',
77
+ };
78
+ }
79
+ }
80
+ export function formatConfigureModesResult(result) {
81
+ if (!result.success) {
82
+ return `❌ モード設定に失敗しました: ${result.error}`;
83
+ }
84
+ let output = `✅ モード設定\n\n`;
85
+ // 変更前の設定を表示
86
+ if (result.currentSettings) {
87
+ output += `## 現在の設定\n`;
88
+ output += `- **reviewMode**: ${result.currentSettings.reviewMode}\n`;
89
+ output += ` - normal: leaderのレビューで完了\n`;
90
+ output += ` - strict: テストファーストレビュー(実装前にテストをレビュー)\n`;
91
+ output += `- **taskSplitApproval**: ${result.currentSettings.taskSplitApproval}\n`;
92
+ output += ` - auto: タスク分割は承認不要(leader一任)\n`;
93
+ output += ` - required: タスク分割にPM承認が必要\n\n`;
94
+ }
95
+ // 変更後の設定を表示(変更があった場合)
96
+ if (result.settings &&
97
+ result.currentSettings &&
98
+ (result.settings.reviewMode !== result.currentSettings.reviewMode ||
99
+ result.settings.taskSplitApproval !== result.currentSettings.taskSplitApproval)) {
100
+ output += `## 更新後の設定\n`;
101
+ output += `- **reviewMode**: ${result.settings.reviewMode}`;
102
+ if (result.settings.reviewMode !== result.currentSettings.reviewMode) {
103
+ output += ` ← 変更`;
104
+ }
105
+ output += `\n`;
106
+ output += `- **taskSplitApproval**: ${result.settings.taskSplitApproval}`;
107
+ if (result.settings.taskSplitApproval !== result.currentSettings.taskSplitApproval) {
108
+ output += ` ← 変更`;
109
+ }
110
+ output += `\n`;
111
+ }
112
+ return output;
113
+ }
114
+ //# sourceMappingURL=configure-modes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure-modes.js","sourceRoot":"","sources":["../../src/tools/configure-modes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { TaskPriority, TaskType } from '../types/task.js';
2
+ export interface SubtaskInput {
3
+ title: string;
4
+ description: string;
5
+ acceptance_criteria: string[];
6
+ allowed_files: string[];
7
+ to?: string;
8
+ priority?: TaskPriority;
9
+ task_type?: TaskType;
10
+ }
11
+ export interface DistributeTasksParams {
12
+ parent_task_id: string;
13
+ subtasks: SubtaskInput[];
14
+ }
15
+ export interface SubtaskResult {
16
+ title: string;
17
+ taskId?: string;
18
+ to?: string;
19
+ success: boolean;
20
+ error?: string;
21
+ }
22
+ export interface DistributeTasksResult {
23
+ success: boolean;
24
+ results: SubtaskResult[];
25
+ successCount: number;
26
+ failureCount: number;
27
+ error?: string;
28
+ needsMemberIncrease?: boolean;
29
+ memberIncreaseRequested?: number;
30
+ pendingSubtasks?: SubtaskInput[];
31
+ awaitingApproval?: boolean;
32
+ approvalId?: string;
33
+ }
34
+ export declare function distributeTasks(params: DistributeTasksParams): Promise<DistributeTasksResult>;
35
+ export declare function formatDistributeTasksResult(result: DistributeTasksResult): string;
36
+ /**
37
+ * タスク分割承認リクエストの説明文を整形
38
+ */
39
+ export declare function formatSplitApprovalDescription(subtasks: SubtaskInput[]): string;
40
+ //# sourceMappingURL=distribute-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribute-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/distribute-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAS1D,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC;IAEjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAgBD,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgNnG;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAmDjF;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAsB/E"}
@@ -0,0 +1,276 @@
1
+ import { getCurrentRole, validateLeaderOnly } from '../utils/permission.js';
2
+ import { validateRequiredString, validateRequiredArray } from '../utils/validation.js';
3
+ import { getDashboard, addApprovalRequest } from '../utils/queue.js';
4
+ import { getTaskSplitApproval } from '../utils/memory.js';
5
+ import { assignTask } from './assign-task.js';
6
+ import { requestMemberIncrease } from './request-member-increase.js';
7
+ import { info, error } from '../utils/logger.js';
8
+ /**
9
+ * 空きメンバー(status: idle)を取得
10
+ */
11
+ async function getIdleMembers() {
12
+ const dashboard = await getDashboard();
13
+ const idleMembers = [];
14
+ for (const [member, status] of Object.entries(dashboard.memberStatus)) {
15
+ if (member.startsWith('member-') && status.status === 'idle') {
16
+ idleMembers.push(member);
17
+ }
18
+ }
19
+ return idleMembers;
20
+ }
21
+ export async function distributeTasks(params) {
22
+ const from = getCurrentRole();
23
+ // Validate that caller is leader
24
+ const leaderCheck = validateLeaderOnly(from, 'distribute_tasks');
25
+ if (!leaderCheck.allowed) {
26
+ return { success: false, results: [], successCount: 0, failureCount: 0, error: leaderCheck.reason };
27
+ }
28
+ // Validate parent_task_id
29
+ const parentIdCheck = validateRequiredString(params.parent_task_id, 'parent_task_id');
30
+ if (!parentIdCheck.valid) {
31
+ return { success: false, results: [], successCount: 0, failureCount: 0, error: parentIdCheck.error };
32
+ }
33
+ // Validate subtasks
34
+ const subtasksCheck = validateRequiredArray(params.subtasks, 'subtasks');
35
+ if (!subtasksCheck.valid) {
36
+ return { success: false, results: [], successCount: 0, failureCount: 0, error: subtasksCheck.error };
37
+ }
38
+ info(`Distributing ${params.subtasks.length} subtasks for parent ${params.parent_task_id}`);
39
+ // タスク分割承認チェック
40
+ const taskSplitApproval = await getTaskSplitApproval();
41
+ if (taskSplitApproval === 'required') {
42
+ info('Task split approval is enabled, creating approval request');
43
+ // 親タスクのタイトルを取得(parent_task_idから)
44
+ const parentTaskTitle = params.parent_task_id;
45
+ // 承認リクエストを生成
46
+ const approvalRequest = await addApprovalRequest({
47
+ title: `タスク分割承認: ${parentTaskTitle}`,
48
+ description: formatSplitApprovalDescription(params.subtasks),
49
+ requestedBy: 'leader',
50
+ type: 'task_split',
51
+ metadata: {
52
+ parentTaskId: params.parent_task_id,
53
+ subtasks: params.subtasks,
54
+ },
55
+ });
56
+ info(`Approval request created: ${approvalRequest.id}`);
57
+ // 承認待ちとして返却(タスク配信はしない)
58
+ return {
59
+ success: true,
60
+ results: [],
61
+ successCount: 0,
62
+ failureCount: 0,
63
+ awaitingApproval: true,
64
+ approvalId: approvalRequest.id,
65
+ };
66
+ }
67
+ // toが未指定のサブタスクをカウント
68
+ const subtasksNeedingAssignment = params.subtasks.filter(s => !s.to);
69
+ const subtasksWithAssignment = params.subtasks.filter(s => s.to);
70
+ // 空きメンバーを取得
71
+ let idleMembers = [];
72
+ try {
73
+ idleMembers = await getIdleMembers();
74
+ info(`Found ${idleMembers.length} idle members: ${idleMembers.join(', ')}`);
75
+ }
76
+ catch (err) {
77
+ error('Failed to get idle members', err);
78
+ }
79
+ // メンバー不足チェック
80
+ if (subtasksNeedingAssignment.length > idleMembers.length) {
81
+ const shortage = subtasksNeedingAssignment.length - idleMembers.length;
82
+ info(`Member shortage detected: need ${subtasksNeedingAssignment.length}, have ${idleMembers.length}, shortage ${shortage}`);
83
+ // 増員リクエストを自動で送信
84
+ try {
85
+ const increaseResult = await requestMemberIncrease({
86
+ count: Math.min(shortage, 4), // 最大4名まで
87
+ reason: `タスク分配のため${shortage}名の増員が必要です(割り当て待ちタスク: ${subtasksNeedingAssignment.length}件)`,
88
+ });
89
+ if (increaseResult.success) {
90
+ info(`Member increase requested: ${shortage} members`);
91
+ return {
92
+ success: false,
93
+ results: [],
94
+ successCount: 0,
95
+ failureCount: 0,
96
+ needsMemberIncrease: true,
97
+ memberIncreaseRequested: Math.min(shortage, 4),
98
+ pendingSubtasks: subtasksNeedingAssignment,
99
+ };
100
+ }
101
+ else {
102
+ error('Failed to request member increase', increaseResult.error);
103
+ }
104
+ }
105
+ catch (err) {
106
+ error('Exception requesting member increase', err);
107
+ }
108
+ // 増員リクエストに失敗した場合でも、割り当て可能なタスクは処理する
109
+ }
110
+ // 自動割り当て: ラウンドロビンでtoを設定
111
+ let memberIndex = 0;
112
+ const subtasksToProcess = params.subtasks.map(subtask => {
113
+ if (!subtask.to && idleMembers.length > 0) {
114
+ const assignedTo = idleMembers[memberIndex % idleMembers.length];
115
+ memberIndex++;
116
+ return { ...subtask, to: assignedTo };
117
+ }
118
+ return subtask;
119
+ });
120
+ const results = [];
121
+ let successCount = 0;
122
+ let failureCount = 0;
123
+ for (const subtask of subtasksToProcess) {
124
+ // Check if 'to' is specified (after auto-assignment)
125
+ if (!subtask.to) {
126
+ results.push({
127
+ title: subtask.title,
128
+ success: false,
129
+ error: '割り当て先(to)が指定されておらず、空きメンバーもいません。',
130
+ });
131
+ failureCount++;
132
+ continue;
133
+ }
134
+ // Validate required fields
135
+ if (!subtask.title || !subtask.description) {
136
+ results.push({
137
+ title: subtask.title || '(無題)',
138
+ success: false,
139
+ error: 'title と description は必須です',
140
+ });
141
+ failureCount++;
142
+ continue;
143
+ }
144
+ const criteriaCheck = validateRequiredArray(subtask.acceptance_criteria, 'acceptance_criteria');
145
+ if (!criteriaCheck.valid) {
146
+ results.push({ title: subtask.title, success: false, error: criteriaCheck.error });
147
+ failureCount++;
148
+ continue;
149
+ }
150
+ const filesCheck = validateRequiredArray(subtask.allowed_files, 'allowed_files');
151
+ if (!filesCheck.valid) {
152
+ results.push({ title: subtask.title, success: false, error: filesCheck.error });
153
+ failureCount++;
154
+ continue;
155
+ }
156
+ try {
157
+ // Call assignTask for each subtask
158
+ const assignResult = await assignTask({
159
+ to: subtask.to,
160
+ title: subtask.title,
161
+ description: subtask.description,
162
+ acceptance_criteria: subtask.acceptance_criteria,
163
+ allowed_files: subtask.allowed_files,
164
+ priority: subtask.priority,
165
+ parent_task_id: params.parent_task_id,
166
+ task_type: subtask.task_type,
167
+ });
168
+ if (assignResult.success) {
169
+ results.push({
170
+ title: subtask.title,
171
+ taskId: assignResult.taskId,
172
+ to: subtask.to,
173
+ success: true,
174
+ });
175
+ successCount++;
176
+ info(`Subtask assigned: ${subtask.title} -> ${subtask.to} (${assignResult.taskId})`);
177
+ }
178
+ else {
179
+ results.push({
180
+ title: subtask.title,
181
+ to: subtask.to,
182
+ success: false,
183
+ error: assignResult.error,
184
+ });
185
+ failureCount++;
186
+ error(`Failed to assign subtask: ${subtask.title}`, assignResult.error);
187
+ }
188
+ }
189
+ catch (err) {
190
+ results.push({
191
+ title: subtask.title,
192
+ to: subtask.to,
193
+ success: false,
194
+ error: err instanceof Error ? err.message : 'Unknown error',
195
+ });
196
+ failureCount++;
197
+ error(`Exception assigning subtask: ${subtask.title}`, err);
198
+ }
199
+ }
200
+ const overallSuccess = failureCount === 0;
201
+ info(`Distribution complete: ${successCount} success, ${failureCount} failure`);
202
+ return {
203
+ success: overallSuccess,
204
+ results,
205
+ successCount,
206
+ failureCount,
207
+ };
208
+ }
209
+ export function formatDistributeTasksResult(result) {
210
+ if (result.error) {
211
+ return `❌ タスク分配に失敗しました: ${result.error}`;
212
+ }
213
+ // 承認待ちの場合
214
+ if (result.awaitingApproval) {
215
+ let output = `⏳ タスク分割の承認待ちです。\n\n`;
216
+ output += `**承認リクエストID**: ${result.approvalId}\n\n`;
217
+ output += `ユーザーの承認後、タスクが配信されます。`;
218
+ return output;
219
+ }
220
+ // メンバー不足で増員リクエストした場合
221
+ if (result.needsMemberIncrease) {
222
+ let output = `⏳ メンバー不足のため増員をリクエストしました。\n\n`;
223
+ output += `**リクエスト増員数**: ${result.memberIncreaseRequested}名\n`;
224
+ output += `**割り当て待ちタスク**: ${result.pendingSubtasks?.length ?? 0}件\n\n`;
225
+ if (result.pendingSubtasks && result.pendingSubtasks.length > 0) {
226
+ output += `### 割り当て待ちタスク一覧\n`;
227
+ for (const subtask of result.pendingSubtasks) {
228
+ output += `- ${subtask.title}\n`;
229
+ }
230
+ output += `\n`;
231
+ }
232
+ output += `増員が承認されたら、再度distribute_tasksを実行してください。`;
233
+ return output;
234
+ }
235
+ let output = '';
236
+ if (result.success) {
237
+ output += `✅ 全${result.successCount}件のタスクを分配しました。\n\n`;
238
+ }
239
+ else {
240
+ output += `⚠️ タスク分配が部分的に失敗しました。\n`;
241
+ output += `成功: ${result.successCount}件 / 失敗: ${result.failureCount}件\n\n`;
242
+ }
243
+ output += `### 結果一覧\n`;
244
+ for (const r of result.results) {
245
+ if (r.success) {
246
+ output += `- ✅ **${r.title}** → ${r.to} (ID: ${r.taskId})\n`;
247
+ }
248
+ else {
249
+ output += `- ❌ **${r.title}**: ${r.error}\n`;
250
+ }
251
+ }
252
+ return output;
253
+ }
254
+ /**
255
+ * タスク分割承認リクエストの説明文を整形
256
+ */
257
+ export function formatSplitApprovalDescription(subtasks) {
258
+ let output = `## タスク分割案\n\n`;
259
+ output += `**サブタスク数**: ${subtasks.length}件\n\n`;
260
+ if (subtasks.length === 0) {
261
+ output += `(サブタスクなし)\n`;
262
+ return output;
263
+ }
264
+ output += `### サブタスク一覧\n\n`;
265
+ for (let i = 0; i < subtasks.length; i++) {
266
+ const subtask = subtasks[i];
267
+ output += `#### ${i + 1}. ${subtask.title}\n`;
268
+ output += `- **説明**: ${subtask.description}\n`;
269
+ output += `- **担当**: ${subtask.to ?? '(自動割り当て)'}\n`;
270
+ output += `- **完了条件**: ${subtask.acceptance_criteria.join(', ')}\n`;
271
+ output += `- **変更ファイル**: ${subtask.allowed_files.join(', ')}\n`;
272
+ output += `\n`;
273
+ }
274
+ return output;
275
+ }
276
+ //# sourceMappingURL=distribute-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribute-tasks.js","sourceRoot":"","sources":["../../src/tools/distribute-tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { BacklogTask } from './add-backlog.js';
2
+ export interface GetBacklogResult {
3
+ success: boolean;
4
+ tasks: BacklogTask[];
5
+ error?: string;
6
+ }
7
+ export declare function getBacklog(): Promise<GetBacklogResult>;
8
+ export declare function formatGetBacklogResult(result: GetBacklogResult): string;
9
+ //# sourceMappingURL=get-backlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-backlog.d.ts","sourceRoot":"","sources":["../../src/tools/get-backlog.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD,wBAAsB,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAqC5D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkBvE"}
@@ -0,0 +1,65 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { getDevTeamPath } from '../utils/queue.js';
4
+ import { info, error } from '../utils/logger.js';
5
+ function getBacklogPath() {
6
+ return path.join(getDevTeamPath(), 'backlog.json');
7
+ }
8
+ const priorityOrder = {
9
+ high: 0,
10
+ medium: 1,
11
+ low: 2,
12
+ };
13
+ export async function getBacklog() {
14
+ try {
15
+ const backlogPath = getBacklogPath();
16
+ let backlog;
17
+ try {
18
+ const content = await fs.readFile(backlogPath, 'utf-8');
19
+ const parsed = JSON.parse(content);
20
+ if (Array.isArray(parsed.tasks)) {
21
+ backlog = parsed;
22
+ }
23
+ else {
24
+ backlog = { tasks: [], lastUpdated: new Date().toISOString() };
25
+ }
26
+ }
27
+ catch {
28
+ // File doesn't exist or is invalid
29
+ backlog = { tasks: [], lastUpdated: new Date().toISOString() };
30
+ }
31
+ // Sort by priority: high → medium → low
32
+ const sortedTasks = [...backlog.tasks].sort((a, b) => {
33
+ return (priorityOrder[a.priority] ?? 1) - (priorityOrder[b.priority] ?? 1);
34
+ });
35
+ info(`Backlog retrieved: ${sortedTasks.length} tasks`);
36
+ return {
37
+ success: true,
38
+ tasks: sortedTasks,
39
+ };
40
+ }
41
+ catch (err) {
42
+ error('Failed to get backlog', err);
43
+ return {
44
+ success: false,
45
+ tasks: [],
46
+ error: err instanceof Error ? err.message : 'Unknown error',
47
+ };
48
+ }
49
+ }
50
+ export function formatGetBacklogResult(result) {
51
+ if (!result.success) {
52
+ return `❌ バックログの取得に失敗しました: ${result.error}`;
53
+ }
54
+ if (result.tasks.length === 0) {
55
+ return '📋 バックログは空です。';
56
+ }
57
+ let output = `📋 バックログ: ${result.tasks.length}件\n\n`;
58
+ for (const task of result.tasks) {
59
+ output += `[${task.priority}] ${task.title}\n`;
60
+ output += ` ${task.description}\n`;
61
+ output += ` ID: ${task.id}\n\n`;
62
+ }
63
+ return output.trim();
64
+ }
65
+ //# sourceMappingURL=get-backlog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-backlog.js","sourceRoot":"","sources":["../../src/tools/get-backlog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Dashboard } from '../types/task.js';
2
+ export { formatTimestampJST } from '../utils/format.js';
3
+ export type DashboardMode = 'full' | 'summary' | 'tasks_only';
4
+ export interface GetDashboardParams {
5
+ mode?: DashboardMode;
6
+ }
7
+ export interface GetDashboardResult {
8
+ success: boolean;
9
+ dashboard?: Dashboard;
10
+ mode?: DashboardMode;
11
+ error?: string;
12
+ }
13
+ export declare function getDashboardInfo(params?: GetDashboardParams): Promise<GetDashboardResult>;
14
+ export declare function formatDashboard(result: GetDashboardResult): string;
15
+ //# sourceMappingURL=get-dashboard.d.ts.map