@einja/dev-cli 0.1.6 → 0.1.8
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 +2 -3
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +16 -9
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/task-loop/index.d.ts +18 -0
- package/dist/commands/task-loop/index.d.ts.map +1 -0
- package/dist/commands/task-loop/index.js +333 -0
- package/dist/commands/task-loop/index.js.map +1 -0
- package/dist/commands/task-loop/lib/args-parser.d.ts +15 -0
- package/dist/commands/task-loop/lib/args-parser.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/args-parser.js +79 -0
- package/dist/commands/task-loop/lib/args-parser.js.map +1 -0
- package/dist/commands/task-loop/lib/branch-manager.d.ts +66 -0
- package/dist/commands/task-loop/lib/branch-manager.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/branch-manager.js +697 -0
- package/dist/commands/task-loop/lib/branch-manager.js.map +1 -0
- package/dist/commands/task-loop/lib/conflict-handler.d.ts +8 -0
- package/dist/commands/task-loop/lib/conflict-handler.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/conflict-handler.js +68 -0
- package/dist/commands/task-loop/lib/conflict-handler.js.map +1 -0
- package/dist/commands/task-loop/lib/dependency-resolver.d.ts +45 -0
- package/dist/commands/task-loop/lib/dependency-resolver.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/dependency-resolver.js +184 -0
- package/dist/commands/task-loop/lib/dependency-resolver.js.map +1 -0
- package/dist/commands/task-loop/lib/gh-setup.d.ts +15 -0
- package/dist/commands/task-loop/lib/gh-setup.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/gh-setup.js +196 -0
- package/dist/commands/task-loop/lib/gh-setup.js.map +1 -0
- package/dist/commands/task-loop/lib/github-client.d.ts +27 -0
- package/dist/commands/task-loop/lib/github-client.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/github-client.js +110 -0
- package/dist/commands/task-loop/lib/github-client.js.map +1 -0
- package/dist/commands/task-loop/lib/issue-parser.d.ts +27 -0
- package/dist/commands/task-loop/lib/issue-parser.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/issue-parser.js +254 -0
- package/dist/commands/task-loop/lib/issue-parser.js.map +1 -0
- package/dist/commands/task-loop/lib/project-selector.d.ts +15 -0
- package/dist/commands/task-loop/lib/project-selector.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/project-selector.js +187 -0
- package/dist/commands/task-loop/lib/project-selector.js.map +1 -0
- package/dist/commands/task-loop/lib/task-number-utils.d.ts +56 -0
- package/dist/commands/task-loop/lib/task-number-utils.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/task-number-utils.js +114 -0
- package/dist/commands/task-loop/lib/task-number-utils.js.map +1 -0
- package/dist/commands/task-loop/lib/task-state-manager.d.ts +59 -0
- package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/task-state-manager.js +184 -0
- package/dist/commands/task-loop/lib/task-state-manager.js.map +1 -0
- package/dist/commands/task-loop/lib/types.d.ts +93 -0
- package/dist/commands/task-loop/lib/types.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/types.js +5 -0
- package/dist/commands/task-loop/lib/types.js.map +1 -0
- package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts +82 -0
- package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/vibe-kanban-client.js +280 -0
- package/dist/commands/task-loop/lib/vibe-kanban-client.js.map +1 -0
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.d.ts +42 -0
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +122 -0
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -0
- package/dist/lib/sync/batch-processor.test.js +1 -1
- package/dist/lib/sync/batch-processor.test.js.map +1 -1
- package/dist/lib/sync/diff-engine.js +1 -1
- package/dist/lib/sync/diff-engine.js.map +1 -1
- package/dist/lib/sync/hash-cache.d.ts +10 -4
- package/dist/lib/sync/hash-cache.d.ts.map +1 -1
- package/dist/lib/sync/hash-cache.js +28 -9
- package/dist/lib/sync/hash-cache.js.map +1 -1
- package/dist/lib/sync/hash-cache.test.js +69 -38
- package/dist/lib/sync/hash-cache.test.js.map +1 -1
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
- package/dist/lib/sync/metadata-manager.js +3 -4
- package/dist/lib/sync/metadata-manager.js.map +1 -1
- package/dist/lib/sync/performance.test.js +4 -5
- package/dist/lib/sync/performance.test.js.map +1 -1
- package/package.json +2 -2
- package/scaffolds/CLAUDE.md.template +81 -13
- package/dist/commands/task-loop.d.ts +0 -11
- package/dist/commands/task-loop.d.ts.map +0 -1
- package/dist/commands/task-loop.js +0 -81
- package/dist/commands/task-loop.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* タスク番号比較ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* タスク番号形式: "1", "1.2", "1.2.3"
|
|
5
|
+
* - Phase番号: 1
|
|
6
|
+
* - タスクグループ番号: 1.2
|
|
7
|
+
* - タスク番号: 1.2.3
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* タスク番号を数値配列にパース
|
|
11
|
+
* @example "1.2.3" -> [1, 2, 3]
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseTaskNumber(taskNumber: string): number[];
|
|
14
|
+
/**
|
|
15
|
+
* 比較: a <= b
|
|
16
|
+
* @example isLessOrEqual("1.2.3", "1.2.5") -> true
|
|
17
|
+
* @example isLessOrEqual("1.2.5", "1.2.5") -> true
|
|
18
|
+
* @example isLessOrEqual("1.2.6", "1.2.5") -> false
|
|
19
|
+
*/
|
|
20
|
+
export declare function isLessOrEqual(a: string, b: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 比較: a < b
|
|
23
|
+
*/
|
|
24
|
+
export declare function isLess(a: string, b: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 比較: a == b
|
|
27
|
+
*/
|
|
28
|
+
export declare function isEqual(a: string, b: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Phase番号を抽出
|
|
31
|
+
* @example getPhaseNumber("1.2.3") -> 1
|
|
32
|
+
*/
|
|
33
|
+
export declare function getPhaseNumber(taskNumber: string): number;
|
|
34
|
+
/**
|
|
35
|
+
* タスクグループ番号を抽出(X.Y形式)
|
|
36
|
+
* @example getTaskGroupId("1.2.3") -> "1.2"
|
|
37
|
+
* @example getTaskGroupId("1.2") -> "1.2"
|
|
38
|
+
* @example getTaskGroupId("1") -> "1"
|
|
39
|
+
*/
|
|
40
|
+
export declare function getTaskGroupId(taskNumber: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* タスク番号が最大タスク番号の範囲内かチェック
|
|
43
|
+
* @param taskNumber チェック対象のタスク番号
|
|
44
|
+
* @param maxTaskNumber 最大タスク番号("all" の場合は常に true)
|
|
45
|
+
*/
|
|
46
|
+
export declare function isWithinRange(taskNumber: string, maxTaskNumber: string | undefined): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* タスク番号をソート用の数値に変換
|
|
49
|
+
* @example toSortKey("1.2.3") -> 1002003
|
|
50
|
+
*/
|
|
51
|
+
export declare function toSortKey(taskNumber: string): number;
|
|
52
|
+
/**
|
|
53
|
+
* タスク番号の配列をソート
|
|
54
|
+
*/
|
|
55
|
+
export declare function sortTaskNumbers(taskNumbers: string[]): string[];
|
|
56
|
+
//# sourceMappingURL=task-number-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-number-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-number-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAgB3D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAWrD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAM5F;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CASpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE/D"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* タスク番号比較ユーティリティ
|
|
3
|
+
*
|
|
4
|
+
* タスク番号形式: "1", "1.2", "1.2.3"
|
|
5
|
+
* - Phase番号: 1
|
|
6
|
+
* - タスクグループ番号: 1.2
|
|
7
|
+
* - タスク番号: 1.2.3
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* タスク番号を数値配列にパース
|
|
11
|
+
* @example "1.2.3" -> [1, 2, 3]
|
|
12
|
+
*/
|
|
13
|
+
export function parseTaskNumber(taskNumber) {
|
|
14
|
+
return taskNumber.split(".").map((part) => Number.parseInt(part, 10));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 比較: a <= b
|
|
18
|
+
* @example isLessOrEqual("1.2.3", "1.2.5") -> true
|
|
19
|
+
* @example isLessOrEqual("1.2.5", "1.2.5") -> true
|
|
20
|
+
* @example isLessOrEqual("1.2.6", "1.2.5") -> false
|
|
21
|
+
*/
|
|
22
|
+
export function isLessOrEqual(a, b) {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
const partsA = parseTaskNumber(a);
|
|
25
|
+
const partsB = parseTaskNumber(b);
|
|
26
|
+
// 各セグメントを左から順に比較
|
|
27
|
+
const maxLen = Math.max(partsA.length, partsB.length);
|
|
28
|
+
for (let i = 0; i < maxLen; i++) {
|
|
29
|
+
const numA = (_a = partsA[i]) !== null && _a !== void 0 ? _a : 0;
|
|
30
|
+
const numB = (_b = partsB[i]) !== null && _b !== void 0 ? _b : 0;
|
|
31
|
+
if (numA < numB)
|
|
32
|
+
return true;
|
|
33
|
+
if (numA > numB)
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// 完全一致
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 比較: a < b
|
|
41
|
+
*/
|
|
42
|
+
export function isLess(a, b) {
|
|
43
|
+
return isLessOrEqual(a, b) && a !== b;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 比較: a == b
|
|
47
|
+
*/
|
|
48
|
+
export function isEqual(a, b) {
|
|
49
|
+
const partsA = parseTaskNumber(a);
|
|
50
|
+
const partsB = parseTaskNumber(b);
|
|
51
|
+
if (partsA.length !== partsB.length)
|
|
52
|
+
return false;
|
|
53
|
+
for (let i = 0; i < partsA.length; i++) {
|
|
54
|
+
if (partsA[i] !== partsB[i])
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Phase番号を抽出
|
|
61
|
+
* @example getPhaseNumber("1.2.3") -> 1
|
|
62
|
+
*/
|
|
63
|
+
export function getPhaseNumber(taskNumber) {
|
|
64
|
+
var _a;
|
|
65
|
+
const parts = parseTaskNumber(taskNumber);
|
|
66
|
+
return (_a = parts[0]) !== null && _a !== void 0 ? _a : 0;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* タスクグループ番号を抽出(X.Y形式)
|
|
70
|
+
* @example getTaskGroupId("1.2.3") -> "1.2"
|
|
71
|
+
* @example getTaskGroupId("1.2") -> "1.2"
|
|
72
|
+
* @example getTaskGroupId("1") -> "1"
|
|
73
|
+
*/
|
|
74
|
+
export function getTaskGroupId(taskNumber) {
|
|
75
|
+
var _a, _b;
|
|
76
|
+
const parts = parseTaskNumber(taskNumber);
|
|
77
|
+
if (parts.length >= 2) {
|
|
78
|
+
return `${parts[0]}.${parts[1]}`;
|
|
79
|
+
}
|
|
80
|
+
return (_b = (_a = parts[0]) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : "";
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* タスク番号が最大タスク番号の範囲内かチェック
|
|
84
|
+
* @param taskNumber チェック対象のタスク番号
|
|
85
|
+
* @param maxTaskNumber 最大タスク番号("all" の場合は常に true)
|
|
86
|
+
*/
|
|
87
|
+
export function isWithinRange(taskNumber, maxTaskNumber) {
|
|
88
|
+
if (maxTaskNumber === undefined || maxTaskNumber === "all") {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return isLessOrEqual(taskNumber, maxTaskNumber);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* タスク番号をソート用の数値に変換
|
|
95
|
+
* @example toSortKey("1.2.3") -> 1002003
|
|
96
|
+
*/
|
|
97
|
+
export function toSortKey(taskNumber) {
|
|
98
|
+
var _a;
|
|
99
|
+
const parts = parseTaskNumber(taskNumber);
|
|
100
|
+
// 各セグメントを1000倍しながら合算
|
|
101
|
+
// 例: 1.2.3 -> 1*1000000 + 2*1000 + 3 = 1002003
|
|
102
|
+
let key = 0;
|
|
103
|
+
for (let i = 0; i < parts.length; i++) {
|
|
104
|
+
key += ((_a = parts[i]) !== null && _a !== void 0 ? _a : 0) * 10 ** ((3 - i) * 3);
|
|
105
|
+
}
|
|
106
|
+
return key;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* タスク番号の配列をソート
|
|
110
|
+
*/
|
|
111
|
+
export function sortTaskNumbers(taskNumbers) {
|
|
112
|
+
return [...taskNumbers].sort((a, b) => toSortKey(a) - toSortKey(b));
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=task-number-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-number-utils.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-number-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* タスク状態管理
|
|
3
|
+
*
|
|
4
|
+
* - Done 状態の変化を検出
|
|
5
|
+
* - GitHub Issue のチェックボックスを更新
|
|
6
|
+
* - 着手可能なタスクを取得
|
|
7
|
+
*/
|
|
8
|
+
import type { ParsedIssue, TaskGroup, VibeKanbanTask } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* タスク状態マネージャー
|
|
11
|
+
*/
|
|
12
|
+
export declare class TaskStateManager {
|
|
13
|
+
private previousDoneTaskIds;
|
|
14
|
+
/** Vibe-Kanban タスク ID -> タスクグループ ID のマッピング */
|
|
15
|
+
private vibeTaskToGroupMap;
|
|
16
|
+
/**
|
|
17
|
+
* Vibe-Kanban タスク ID とタスクグループ ID のマッピングを登録
|
|
18
|
+
*/
|
|
19
|
+
registerTaskMapping(vibeTaskId: string, taskGroupId: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* 現在の Done タスク ID 一覧を設定(初期化用)
|
|
22
|
+
* @param tasks 全タスク一覧
|
|
23
|
+
* @param issueNumber 対象Issue番号(ログ出力のフィルタリング用、省略時は全件表示)
|
|
24
|
+
* @param descriptionCache タスクID -> description のキャッシュ(旧形式タスクのIssue判定用)
|
|
25
|
+
*/
|
|
26
|
+
initializeDoneTaskIds(tasks: VibeKanbanTask[], issueNumber?: number, descriptionCache?: Map<string, string | null>): void;
|
|
27
|
+
/**
|
|
28
|
+
* Done 状態の変化を検出
|
|
29
|
+
* @returns 新たに Done になったタスクの ID 一覧
|
|
30
|
+
*/
|
|
31
|
+
detectNewlyCompletedTasks(currentTasks: VibeKanbanTask[]): string[];
|
|
32
|
+
/**
|
|
33
|
+
* 新たに完了したタスクに対応するタスクグループ ID を取得
|
|
34
|
+
*/
|
|
35
|
+
getCompletedTaskGroupIds(newlyCompletedVibeTaskIds: string[]): string[];
|
|
36
|
+
/**
|
|
37
|
+
* GitHub Issue のタスクグループを完了マークに更新
|
|
38
|
+
*/
|
|
39
|
+
markTaskGroupsAsCompleted(issueNumber: number, taskGroupIds: string[]): Promise<ParsedIssue>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Vibe-Kanban タスクのタイトルからタスクグループ ID を抽出
|
|
43
|
+
* タイトル形式: "[IssueXX Y.Z] タスク名" または "[Y.Z] タスク名"(後方互換)
|
|
44
|
+
*/
|
|
45
|
+
export declare function extractTaskGroupIdFromTitle(title: string): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Vibe-Kanban タスクのタイトルから Issue 番号を抽出
|
|
48
|
+
* タイトル形式: "[IssueXX Y.Z] タスク名"
|
|
49
|
+
*/
|
|
50
|
+
export declare function extractIssueNumberFromTitle(title: string): number | null;
|
|
51
|
+
/**
|
|
52
|
+
* タスクグループ用の Vibe-Kanban タスクタイトルを生成
|
|
53
|
+
*/
|
|
54
|
+
export declare function generateVibeKanbanTitle(taskGroup: TaskGroup, issueNumber: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* タスクグループ用の Vibe-Kanban タスク説明を生成
|
|
57
|
+
*/
|
|
58
|
+
export declare function generateVibeKanbanDescription(taskGroup: TaskGroup, issueNumber: number): string;
|
|
59
|
+
//# sourceMappingURL=task-state-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-state-manager.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-state-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,mBAAmB,CAA0B;IACrD,8CAA8C;IAC9C,OAAO,CAAC,kBAAkB,CAAkC;IAE5D;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAKlE;;;;;OAKG;IACH,qBAAqB,CACnB,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAC5C,IAAI;IAkCP;;;OAGG;IACH,yBAAyB,CAAC,YAAY,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE;IA0BnE;;OAEG;IACH,wBAAwB,CAAC,yBAAyB,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAcvE;;OAEG;IACG,yBAAyB,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,WAAW,CAAC;CAwBxB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA4B/F"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* タスク状態管理
|
|
3
|
+
*
|
|
4
|
+
* - Done 状態の変化を検出
|
|
5
|
+
* - GitHub Issue のチェックボックスを更新
|
|
6
|
+
* - 着手可能なタスクを取得
|
|
7
|
+
*/
|
|
8
|
+
import { getIssue, markTaskGroupAsCompleted, updateIssueBody } from "./github-client.js";
|
|
9
|
+
import { parseIssueBody } from "./issue-parser.js";
|
|
10
|
+
/**
|
|
11
|
+
* タスク状態マネージャー
|
|
12
|
+
*/
|
|
13
|
+
export class TaskStateManager {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.previousDoneTaskIds = new Set();
|
|
16
|
+
/** Vibe-Kanban タスク ID -> タスクグループ ID のマッピング */
|
|
17
|
+
this.vibeTaskToGroupMap = new Map();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Vibe-Kanban タスク ID とタスクグループ ID のマッピングを登録
|
|
21
|
+
*/
|
|
22
|
+
registerTaskMapping(vibeTaskId, taskGroupId) {
|
|
23
|
+
this.vibeTaskToGroupMap.set(vibeTaskId, taskGroupId);
|
|
24
|
+
console.log(` 🔗 マッピング登録: ${vibeTaskId} → ${taskGroupId}`);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 現在の Done タスク ID 一覧を設定(初期化用)
|
|
28
|
+
* @param tasks 全タスク一覧
|
|
29
|
+
* @param issueNumber 対象Issue番号(ログ出力のフィルタリング用、省略時は全件表示)
|
|
30
|
+
* @param descriptionCache タスクID -> description のキャッシュ(旧形式タスクのIssue判定用)
|
|
31
|
+
*/
|
|
32
|
+
initializeDoneTaskIds(tasks, issueNumber, descriptionCache) {
|
|
33
|
+
const doneTasks = tasks.filter((t) => t.status === "done");
|
|
34
|
+
this.previousDoneTaskIds = new Set(doneTasks.map((t) => t.id));
|
|
35
|
+
// ログ出力:対象Issueに関連するタスクのみ表示
|
|
36
|
+
if (!issueNumber) {
|
|
37
|
+
console.log(`🔧 初期化: previousDoneTaskIds に ${doneTasks.length} 件を登録`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const issuePatternInDesc = `GitHub Issue #${issueNumber}`;
|
|
41
|
+
const relevantDoneTasks = doneTasks.filter((t) => {
|
|
42
|
+
// 新形式: タイトルからIssue番号を抽出
|
|
43
|
+
const titleIssueNum = extractIssueNumberFromTitle(t.title);
|
|
44
|
+
if (titleIssueNum === issueNumber)
|
|
45
|
+
return true;
|
|
46
|
+
// 旧形式: descriptionで判定
|
|
47
|
+
if (descriptionCache) {
|
|
48
|
+
const desc = descriptionCache.get(t.id);
|
|
49
|
+
if (desc === null || desc === void 0 ? void 0 : desc.includes(issuePatternInDesc))
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
});
|
|
54
|
+
console.log(`🔧 初期化: previousDoneTaskIds に ${doneTasks.length} 件を登録`);
|
|
55
|
+
if (relevantDoneTasks.length > 0) {
|
|
56
|
+
console.log(` (Issue #${issueNumber} 関連: ${relevantDoneTasks.length} 件)`);
|
|
57
|
+
for (const task of relevantDoneTasks) {
|
|
58
|
+
const taskGroupId = extractTaskGroupIdFromTitle(task.title);
|
|
59
|
+
console.log(` - ${taskGroupId || task.title}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Done 状態の変化を検出
|
|
65
|
+
* @returns 新たに Done になったタスクの ID 一覧
|
|
66
|
+
*/
|
|
67
|
+
detectNewlyCompletedTasks(currentTasks) {
|
|
68
|
+
const currentDoneIds = new Set(currentTasks.filter((t) => t.status === "done").map((t) => t.id));
|
|
69
|
+
// デバッグ: 比較情報を出力
|
|
70
|
+
console.log(` 🔍 Done検出: 現在Done=${currentDoneIds.size}件, 前回Done=${this.previousDoneTaskIds.size}件`);
|
|
71
|
+
const newlyCompletedIds = [];
|
|
72
|
+
for (const id of Array.from(currentDoneIds)) {
|
|
73
|
+
if (!this.previousDoneTaskIds.has(id)) {
|
|
74
|
+
newlyCompletedIds.push(id);
|
|
75
|
+
console.log(` 🆕 新規完了検出: ${id}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (newlyCompletedIds.length === 0 && currentDoneIds.size > 0) {
|
|
79
|
+
console.log(` ℹ️ 全てのDoneタスクは既に検出済み`);
|
|
80
|
+
}
|
|
81
|
+
// 状態を更新
|
|
82
|
+
this.previousDoneTaskIds = currentDoneIds;
|
|
83
|
+
return newlyCompletedIds;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 新たに完了したタスクに対応するタスクグループ ID を取得
|
|
87
|
+
*/
|
|
88
|
+
getCompletedTaskGroupIds(newlyCompletedVibeTaskIds) {
|
|
89
|
+
const taskGroupIds = [];
|
|
90
|
+
for (const vibeTaskId of newlyCompletedVibeTaskIds) {
|
|
91
|
+
const taskGroupId = this.vibeTaskToGroupMap.get(vibeTaskId);
|
|
92
|
+
if (taskGroupId) {
|
|
93
|
+
taskGroupIds.push(taskGroupId);
|
|
94
|
+
console.log(` 📎 マッピング成功: ${vibeTaskId} → ${taskGroupId}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(` ⚠️ マッピング失敗: ${vibeTaskId} (登録されていません)`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return taskGroupIds;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* GitHub Issue のタスクグループを完了マークに更新
|
|
104
|
+
*/
|
|
105
|
+
async markTaskGroupsAsCompleted(issueNumber, taskGroupIds) {
|
|
106
|
+
if (taskGroupIds.length === 0) {
|
|
107
|
+
// 変更なし、現在の Issue を取得して返す
|
|
108
|
+
const issue = getIssue(issueNumber);
|
|
109
|
+
return parseIssueBody(issue);
|
|
110
|
+
}
|
|
111
|
+
// Issue 本文を取得
|
|
112
|
+
const issue = getIssue(issueNumber);
|
|
113
|
+
let updatedBody = issue.body;
|
|
114
|
+
// 各タスクグループを完了マークに更新
|
|
115
|
+
for (const taskGroupId of taskGroupIds) {
|
|
116
|
+
updatedBody = markTaskGroupAsCompleted(updatedBody, taskGroupId);
|
|
117
|
+
console.log(`✅ タスクグループ ${taskGroupId} を完了マークに更新`);
|
|
118
|
+
}
|
|
119
|
+
// Issue 本文を更新
|
|
120
|
+
updateIssueBody(issueNumber, updatedBody);
|
|
121
|
+
// 更新後の Issue を再取得して返す
|
|
122
|
+
const updatedIssue = getIssue(issueNumber);
|
|
123
|
+
return parseIssueBody(updatedIssue);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Vibe-Kanban タスクのタイトルからタスクグループ ID を抽出
|
|
128
|
+
* タイトル形式: "[IssueXX Y.Z] タスク名" または "[Y.Z] タスク名"(後方互換)
|
|
129
|
+
*/
|
|
130
|
+
export function extractTaskGroupIdFromTitle(title) {
|
|
131
|
+
// 新形式: [Issue22 1.2] タスク名
|
|
132
|
+
const newMatch = title.match(/\[Issue\d+\s+(\d+\.\d+)\]/);
|
|
133
|
+
if (newMatch)
|
|
134
|
+
return newMatch[1];
|
|
135
|
+
// 旧形式: [1.2] タスク名(後方互換)
|
|
136
|
+
const oldMatch = title.match(/\[(\d+\.\d+)\]/);
|
|
137
|
+
return oldMatch ? oldMatch[1] : null;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Vibe-Kanban タスクのタイトルから Issue 番号を抽出
|
|
141
|
+
* タイトル形式: "[IssueXX Y.Z] タスク名"
|
|
142
|
+
*/
|
|
143
|
+
export function extractIssueNumberFromTitle(title) {
|
|
144
|
+
const match = title.match(/\[Issue(\d+)\s+\d+\.\d+\]/);
|
|
145
|
+
return match ? Number.parseInt(match[1], 10) : null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* タスクグループ用の Vibe-Kanban タスクタイトルを生成
|
|
149
|
+
*/
|
|
150
|
+
export function generateVibeKanbanTitle(taskGroup, issueNumber) {
|
|
151
|
+
return `[Issue${issueNumber} ${taskGroup.id}] ${taskGroup.name}`;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* タスクグループ用の Vibe-Kanban タスク説明を生成
|
|
155
|
+
*/
|
|
156
|
+
export function generateVibeKanbanDescription(taskGroup, issueNumber) {
|
|
157
|
+
const taskList = taskGroup.tasks
|
|
158
|
+
.map((t) => `### タスク ${t.id}: ${t.name}\n${t.subtasks.map((s) => `- ${s}`).join("\n")}`)
|
|
159
|
+
.join("\n\n");
|
|
160
|
+
return `## 🚀 最初に実行するコマンド
|
|
161
|
+
|
|
162
|
+
以下のコマンドを実行してタスクを開始してください:
|
|
163
|
+
|
|
164
|
+
\`\`\`
|
|
165
|
+
/task-exec #${issueNumber} ${taskGroup.id}
|
|
166
|
+
\`\`\`
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## タスクファイル
|
|
171
|
+
\`GitHub Issue #${issueNumber}\`
|
|
172
|
+
|
|
173
|
+
## タスクグループ番号
|
|
174
|
+
${taskGroup.id}
|
|
175
|
+
|
|
176
|
+
## タスク一覧
|
|
177
|
+
|
|
178
|
+
${taskList || "(個別タスクなし)"}
|
|
179
|
+
|
|
180
|
+
## 完了条件
|
|
181
|
+
${taskGroup.completionCriteria || "(未定義)"}
|
|
182
|
+
`;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=task-state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-state-manager.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* タスク自動実行ループ - 型定義
|
|
3
|
+
*/
|
|
4
|
+
/** コマンドライン引数 */
|
|
5
|
+
export interface LoopArgs {
|
|
6
|
+
issueNumber: number;
|
|
7
|
+
maxTaskNumber?: string;
|
|
8
|
+
baseBranch?: string;
|
|
9
|
+
}
|
|
10
|
+
/** タスクのステータス */
|
|
11
|
+
export type TaskStatus = "pending" | "completed" | "in-progress";
|
|
12
|
+
/** 個別タスク */
|
|
13
|
+
export interface Task {
|
|
14
|
+
id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
subtasks: string[];
|
|
17
|
+
}
|
|
18
|
+
/** タスクグループ情報 */
|
|
19
|
+
export interface TaskGroup {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
phaseNumber: number;
|
|
23
|
+
status: TaskStatus;
|
|
24
|
+
dependencies: string[];
|
|
25
|
+
completionCriteria: string;
|
|
26
|
+
tasks: Task[];
|
|
27
|
+
}
|
|
28
|
+
/** Phase情報 */
|
|
29
|
+
export interface Phase {
|
|
30
|
+
number: number;
|
|
31
|
+
name: string;
|
|
32
|
+
taskGroups: TaskGroup[];
|
|
33
|
+
}
|
|
34
|
+
/** Issue解析結果 */
|
|
35
|
+
export interface ParsedIssue {
|
|
36
|
+
issueNumber: number;
|
|
37
|
+
title: string;
|
|
38
|
+
body: string;
|
|
39
|
+
phases: Phase[];
|
|
40
|
+
}
|
|
41
|
+
/** GitHub Issue の生データ */
|
|
42
|
+
export interface GitHubIssue {
|
|
43
|
+
number: number;
|
|
44
|
+
title: string;
|
|
45
|
+
body: string;
|
|
46
|
+
state: "open" | "closed";
|
|
47
|
+
}
|
|
48
|
+
/** リポジトリ情報 */
|
|
49
|
+
export interface RepoInfo {
|
|
50
|
+
owner: string;
|
|
51
|
+
name: string;
|
|
52
|
+
defaultBranch: string;
|
|
53
|
+
}
|
|
54
|
+
/** Vibe-Kanban プロジェクト */
|
|
55
|
+
export interface VibeKanbanProject {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
git_repo_path: string;
|
|
59
|
+
}
|
|
60
|
+
/** Vibe-Kanban タスク */
|
|
61
|
+
export interface VibeKanbanTask {
|
|
62
|
+
id: string;
|
|
63
|
+
title: string;
|
|
64
|
+
description?: string;
|
|
65
|
+
status: "todo" | "inprogress" | "in-progress" | "done" | "cancelled";
|
|
66
|
+
}
|
|
67
|
+
/** Vibe-Kanban タスク実行試行 */
|
|
68
|
+
export interface VibeKanbanAttempt {
|
|
69
|
+
id: string;
|
|
70
|
+
task_id: string;
|
|
71
|
+
executor: string;
|
|
72
|
+
base_branch: string;
|
|
73
|
+
}
|
|
74
|
+
/** Vibe-Kanban リポジトリ */
|
|
75
|
+
export interface VibeKanbanRepo {
|
|
76
|
+
id: string;
|
|
77
|
+
name: string;
|
|
78
|
+
}
|
|
79
|
+
/** ループ状態 */
|
|
80
|
+
export interface LoopState {
|
|
81
|
+
issueNumber: number;
|
|
82
|
+
maxTaskNumber?: string;
|
|
83
|
+
baseBranch: string;
|
|
84
|
+
vibeKanbanProjectId: string;
|
|
85
|
+
issueBranch: string;
|
|
86
|
+
/** タスクグループID -> Vibe-KanbanタスクID */
|
|
87
|
+
createdTaskIds: Map<string, string>;
|
|
88
|
+
/** 前回のポーリング時点での Done タスクID一覧 */
|
|
89
|
+
previousDoneTaskIds: Set<string>;
|
|
90
|
+
}
|
|
91
|
+
/** ログレベル */
|
|
92
|
+
export type LogLevel = "info" | "warn" | "error" | "debug";
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gBAAgB;AAChB,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gBAAgB;AAChB,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;AAEjE,YAAY;AACZ,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,gBAAgB;AAChB,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,cAAc;AACd,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,yBAAyB;AACzB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC1B;AAED,cAAc;AACd,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,yBAAyB;AACzB,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,sBAAsB;AACtB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;CACtE;AAED,0BAA0B;AAC1B,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,YAAY;AACZ,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gCAAgC;IAChC,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,YAAY;AACZ,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vibe-Kanban MCP クライアント
|
|
3
|
+
*
|
|
4
|
+
* @modelcontextprotocol/sdk を使用して Vibe-Kanban MCP サーバーと通信
|
|
5
|
+
*/
|
|
6
|
+
import type { VibeKanbanAttempt, VibeKanbanProject, VibeKanbanRepo, VibeKanbanTask } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Vibe-Kanban MCP クライアント
|
|
9
|
+
*/
|
|
10
|
+
export declare class VibeKanbanClient {
|
|
11
|
+
private client;
|
|
12
|
+
private transport;
|
|
13
|
+
private connected;
|
|
14
|
+
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* MCP サーバーに接続
|
|
17
|
+
*/
|
|
18
|
+
connect(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* ポートファイルを実際のプロセスと同期
|
|
21
|
+
*
|
|
22
|
+
* ポートファイルが古い場合、lsof でプロセスからポートを検出して更新
|
|
23
|
+
*/
|
|
24
|
+
private syncPortFile;
|
|
25
|
+
/**
|
|
26
|
+
* ポートファイルからポートを取得
|
|
27
|
+
*/
|
|
28
|
+
private getPortFromFile;
|
|
29
|
+
/**
|
|
30
|
+
* lsof でプロセスからポートを検出
|
|
31
|
+
*/
|
|
32
|
+
private getPortFromProcess;
|
|
33
|
+
/**
|
|
34
|
+
* MCP サーバーから切断
|
|
35
|
+
*/
|
|
36
|
+
disconnect(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* プロジェクト一覧を取得
|
|
39
|
+
*/
|
|
40
|
+
listProjects(): Promise<VibeKanbanProject[]>;
|
|
41
|
+
/**
|
|
42
|
+
* タスク一覧を取得
|
|
43
|
+
*/
|
|
44
|
+
listTasks(projectId: string): Promise<VibeKanbanTask[]>;
|
|
45
|
+
/**
|
|
46
|
+
* リポジトリ一覧を取得
|
|
47
|
+
*/
|
|
48
|
+
listRepos(projectId: string): Promise<VibeKanbanRepo[]>;
|
|
49
|
+
/**
|
|
50
|
+
* タスクを取得
|
|
51
|
+
*/
|
|
52
|
+
getTask(taskId: string): Promise<VibeKanbanTask | null>;
|
|
53
|
+
/**
|
|
54
|
+
* タスクを作成
|
|
55
|
+
* @returns タスクID
|
|
56
|
+
*/
|
|
57
|
+
createTask(projectId: string, title: string, description: string): Promise<string>;
|
|
58
|
+
/**
|
|
59
|
+
* タスクを更新
|
|
60
|
+
*/
|
|
61
|
+
updateTask(taskId: string, status: "todo" | "inprogress" | "done"): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* タスク実行を開始
|
|
64
|
+
*/
|
|
65
|
+
startTaskAttempt(taskId: string, executor: "CLAUDE_CODE", repos: Array<{
|
|
66
|
+
repo_id: string;
|
|
67
|
+
base_branch: string;
|
|
68
|
+
}>): Promise<VibeKanbanAttempt>;
|
|
69
|
+
/**
|
|
70
|
+
* 接続状態を確認
|
|
71
|
+
*/
|
|
72
|
+
private ensureConnected;
|
|
73
|
+
/**
|
|
74
|
+
* ツール結果をパース
|
|
75
|
+
*/
|
|
76
|
+
private parseToolResult;
|
|
77
|
+
/**
|
|
78
|
+
* エラーメッセージを抽出
|
|
79
|
+
*/
|
|
80
|
+
private extractErrorMessage;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=vibe-kanban-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vibe-kanban-client.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/vibe-kanban-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,SAAS,CAAS;;IAS1B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B9B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAclD;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY7D;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAY7D;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAW7D;;;OAGG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBxF;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvF;;OAEG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,GACrD,OAAO,CAAC,iBAAiB,CAAC;IAmB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiDvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAgB5B"}
|