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.
- package/README.md +168 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +127 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/permissions.d.ts +26 -0
- package/dist/config/permissions.d.ts.map +1 -0
- package/dist/config/permissions.js +82 -0
- package/dist/config/permissions.js.map +1 -0
- package/dist/config/team-config.d.ts +28 -0
- package/dist/config/team-config.d.ts.map +1 -0
- package/dist/config/team-config.js +101 -0
- package/dist/config/team-config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1301 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/add-backlog.d.ts +21 -0
- package/dist/tools/add-backlog.d.ts.map +1 -0
- package/dist/tools/add-backlog.js +96 -0
- package/dist/tools/add-backlog.js.map +1 -0
- package/dist/tools/approve-plan.d.ts +12 -0
- package/dist/tools/approve-plan.d.ts.map +1 -0
- package/dist/tools/approve-plan.js +181 -0
- package/dist/tools/approve-plan.js.map +1 -0
- package/dist/tools/approve-test.d.ts +15 -0
- package/dist/tools/approve-test.d.ts.map +1 -0
- package/dist/tools/approve-test.js +113 -0
- package/dist/tools/approve-test.js.map +1 -0
- package/dist/tools/archive-all-tasks.d.ts +9 -0
- package/dist/tools/archive-all-tasks.d.ts.map +1 -0
- package/dist/tools/archive-all-tasks.js +39 -0
- package/dist/tools/archive-all-tasks.js.map +1 -0
- package/dist/tools/assign-task.d.ts +31 -0
- package/dist/tools/assign-task.d.ts.map +1 -0
- package/dist/tools/assign-task.js +285 -0
- package/dist/tools/assign-task.js.map +1 -0
- package/dist/tools/check-queue.d.ts +18 -0
- package/dist/tools/check-queue.d.ts.map +1 -0
- package/dist/tools/check-queue.js +129 -0
- package/dist/tools/check-queue.js.map +1 -0
- package/dist/tools/clear-agent.d.ts +8 -0
- package/dist/tools/clear-agent.d.ts.map +1 -0
- package/dist/tools/clear-agent.js +52 -0
- package/dist/tools/clear-agent.js.map +1 -0
- package/dist/tools/compact-agent.d.ts +8 -0
- package/dist/tools/compact-agent.d.ts.map +1 -0
- package/dist/tools/compact-agent.js +52 -0
- package/dist/tools/compact-agent.js.map +1 -0
- package/dist/tools/compact-all.d.ts +11 -0
- package/dist/tools/compact-all.d.ts.map +1 -0
- package/dist/tools/compact-all.js +61 -0
- package/dist/tools/compact-all.js.map +1 -0
- package/dist/tools/configure-modes.d.ts +19 -0
- package/dist/tools/configure-modes.d.ts.map +1 -0
- package/dist/tools/configure-modes.js +114 -0
- package/dist/tools/configure-modes.js.map +1 -0
- package/dist/tools/distribute-tasks.d.ts +40 -0
- package/dist/tools/distribute-tasks.d.ts.map +1 -0
- package/dist/tools/distribute-tasks.js +276 -0
- package/dist/tools/distribute-tasks.js.map +1 -0
- package/dist/tools/get-backlog.d.ts +9 -0
- package/dist/tools/get-backlog.d.ts.map +1 -0
- package/dist/tools/get-backlog.js +65 -0
- package/dist/tools/get-backlog.js.map +1 -0
- package/dist/tools/get-dashboard.d.ts +15 -0
- package/dist/tools/get-dashboard.d.ts.map +1 -0
- package/dist/tools/get-dashboard.js +154 -0
- package/dist/tools/get-dashboard.js.map +1 -0
- package/dist/tools/get-project-context.d.ts +11 -0
- package/dist/tools/get-project-context.d.ts.map +1 -0
- package/dist/tools/get-project-context.js +84 -0
- package/dist/tools/get-project-context.js.map +1 -0
- package/dist/tools/health-check.d.ts +21 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +86 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/kill-member.d.ts +15 -0
- package/dist/tools/kill-member.d.ts.map +1 -0
- package/dist/tools/kill-member.js +89 -0
- package/dist/tools/kill-member.js.map +1 -0
- package/dist/tools/kill-member.test.d.ts +2 -0
- package/dist/tools/kill-member.test.d.ts.map +1 -0
- package/dist/tools/kill-member.test.js +228 -0
- package/dist/tools/kill-member.test.js.map +1 -0
- package/dist/tools/process-approval.d.ts +14 -0
- package/dist/tools/process-approval.d.ts.map +1 -0
- package/dist/tools/process-approval.js +225 -0
- package/dist/tools/process-approval.js.map +1 -0
- package/dist/tools/process-skill-candidate.d.ts +14 -0
- package/dist/tools/process-skill-candidate.d.ts.map +1 -0
- package/dist/tools/process-skill-candidate.js +56 -0
- package/dist/tools/process-skill-candidate.js.map +1 -0
- package/dist/tools/recall-memory.d.ts +9 -0
- package/dist/tools/recall-memory.d.ts.map +1 -0
- package/dist/tools/recall-memory.js +97 -0
- package/dist/tools/recall-memory.js.map +1 -0
- package/dist/tools/reject-plan.d.ts +13 -0
- package/dist/tools/reject-plan.d.ts.map +1 -0
- package/dist/tools/reject-plan.js +154 -0
- package/dist/tools/reject-plan.js.map +1 -0
- package/dist/tools/reject-test.d.ts +13 -0
- package/dist/tools/reject-test.d.ts.map +1 -0
- package/dist/tools/reject-test.js +122 -0
- package/dist/tools/reject-test.js.map +1 -0
- package/dist/tools/report-skill-candidate.d.ts +12 -0
- package/dist/tools/report-skill-candidate.d.ts.map +1 -0
- package/dist/tools/report-skill-candidate.js +51 -0
- package/dist/tools/report-skill-candidate.js.map +1 -0
- package/dist/tools/request-approval.d.ts +13 -0
- package/dist/tools/request-approval.d.ts.map +1 -0
- package/dist/tools/request-approval.js +53 -0
- package/dist/tools/request-approval.js.map +1 -0
- package/dist/tools/request-member-decrease.d.ts +15 -0
- package/dist/tools/request-member-decrease.d.ts.map +1 -0
- package/dist/tools/request-member-decrease.js +100 -0
- package/dist/tools/request-member-decrease.js.map +1 -0
- package/dist/tools/request-member-increase.d.ts +15 -0
- package/dist/tools/request-member-increase.d.ts.map +1 -0
- package/dist/tools/request-member-increase.js +81 -0
- package/dist/tools/request-member-increase.js.map +1 -0
- package/dist/tools/save-memory.d.ts +9 -0
- package/dist/tools/save-memory.d.ts.map +1 -0
- package/dist/tools/save-memory.js +82 -0
- package/dist/tools/save-memory.js.map +1 -0
- package/dist/tools/send-task.d.ts +18 -0
- package/dist/tools/send-task.d.ts.map +1 -0
- package/dist/tools/send-task.js +216 -0
- package/dist/tools/send-task.js.map +1 -0
- package/dist/tools/set-review-mode.d.ts +13 -0
- package/dist/tools/set-review-mode.d.ts.map +1 -0
- package/dist/tools/set-review-mode.js +69 -0
- package/dist/tools/set-review-mode.js.map +1 -0
- package/dist/tools/submit-plan.d.ts +16 -0
- package/dist/tools/submit-plan.d.ts.map +1 -0
- package/dist/tools/submit-plan.js +151 -0
- package/dist/tools/submit-plan.js.map +1 -0
- package/dist/tools/submit-test.d.ts +15 -0
- package/dist/tools/submit-test.d.ts.map +1 -0
- package/dist/tools/submit-test.js +110 -0
- package/dist/tools/submit-test.js.map +1 -0
- package/dist/tools/update-backlog.d.ts +22 -0
- package/dist/tools/update-backlog.d.ts.map +1 -0
- package/dist/tools/update-backlog.js +94 -0
- package/dist/tools/update-backlog.js.map +1 -0
- package/dist/tools/update-project-context.d.ts +9 -0
- package/dist/tools/update-project-context.d.ts.map +1 -0
- package/dist/tools/update-project-context.js +81 -0
- package/dist/tools/update-project-context.js.map +1 -0
- package/dist/tools/update-task-status.d.ts +25 -0
- package/dist/tools/update-task-status.d.ts.map +1 -0
- package/dist/tools/update-task-status.js +160 -0
- package/dist/tools/update-task-status.js.map +1 -0
- package/dist/tools/watch-queue.d.ts +17 -0
- package/dist/tools/watch-queue.d.ts.map +1 -0
- package/dist/tools/watch-queue.js +132 -0
- package/dist/tools/watch-queue.js.map +1 -0
- package/dist/types/memory.d.ts +44 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +2 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/message.d.ts +25 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +2 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/task.d.ts +113 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/ansi-table.d.ts +41 -0
- package/dist/utils/ansi-table.d.ts.map +1 -0
- package/dist/utils/ansi-table.js +139 -0
- package/dist/utils/ansi-table.js.map +1 -0
- package/dist/utils/court.d.ts +22 -0
- package/dist/utils/court.d.ts.map +1 -0
- package/dist/utils/court.js +76 -0
- package/dist/utils/court.js.map +1 -0
- package/dist/utils/court.test.d.ts +2 -0
- package/dist/utils/court.test.d.ts.map +1 -0
- package/dist/utils/court.test.js +151 -0
- package/dist/utils/court.test.js.map +1 -0
- package/dist/utils/file-lock.d.ts +4 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +59 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/format.d.ts +7 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +33 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/init-project.d.ts +5 -0
- package/dist/utils/init-project.d.ts.map +1 -0
- package/dist/utils/init-project.js +89 -0
- package/dist/utils/init-project.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory.d.ts +60 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +403 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/permission.d.ts +34 -0
- package/dist/utils/permission.d.ts.map +1 -0
- package/dist/utils/permission.js +52 -0
- package/dist/utils/permission.js.map +1 -0
- package/dist/utils/permission.test.d.ts +2 -0
- package/dist/utils/permission.test.d.ts.map +1 -0
- package/dist/utils/permission.test.js +26 -0
- package/dist/utils/permission.test.js.map +1 -0
- package/dist/utils/queue.d.ts +55 -0
- package/dist/utils/queue.d.ts.map +1 -0
- package/dist/utils/queue.js +705 -0
- package/dist/utils/queue.js.map +1 -0
- package/dist/utils/status-transition.d.ts +57 -0
- package/dist/utils/status-transition.d.ts.map +1 -0
- package/dist/utils/status-transition.js +94 -0
- package/dist/utils/status-transition.js.map +1 -0
- package/dist/utils/task-archive.d.ts +33 -0
- package/dist/utils/task-archive.d.ts.map +1 -0
- package/dist/utils/task-archive.js +233 -0
- package/dist/utils/task-archive.js.map +1 -0
- package/dist/utils/task-manager.d.ts +67 -0
- package/dist/utils/task-manager.d.ts.map +1 -0
- package/dist/utils/task-manager.js +225 -0
- package/dist/utils/task-manager.js.map +1 -0
- package/dist/utils/team-session.d.ts +99 -0
- package/dist/utils/team-session.d.ts.map +1 -0
- package/dist/utils/team-session.js +585 -0
- package/dist/utils/team-session.js.map +1 -0
- package/dist/utils/validation.d.ts +40 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +57 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/wezterm.d.ts +23 -0
- package/dist/utils/wezterm.d.ts.map +1 -0
- package/dist/utils/wezterm.js +189 -0
- package/dist/utils/wezterm.js.map +1 -0
- package/package.json +60 -0
- package/templates/skills/report-template.md +58 -0
- package/templates/skills/review-code.md +83 -0
- package/templates/skills/review-plan.md +65 -0
- package/templates/skills/strict-review.md +83 -0
- package/templates/skills/strict-workflow.md +48 -0
- package/templates/skills/tdd.md +50 -0
- 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
|