@einja/dev-cli 0.1.7 → 0.1.9
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 +4 -5
- 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 +343 -0
- package/dist/commands/task-loop/index.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 -1
- package/presets/minimal/preset.yaml +0 -1
- 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,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* タスク自動実行ループ
|
|
3
|
+
*
|
|
4
|
+
* GitHub Issue からタスクを取得し、Vibe-Kanban に登録して実行を継続するループ
|
|
5
|
+
*
|
|
6
|
+
* 使用方法:
|
|
7
|
+
* einja task:loop <issue-number> [--max <number>] [--base <branch>]
|
|
8
|
+
*/
|
|
9
|
+
import { ensureIssueBranchWithoutCheckout, getPhaseBranchNameNew, mergePhaseBranchIntoIssue, syncPhaseBranch, } from "./lib/branch-manager.js";
|
|
10
|
+
import { ensureGhSetup } from "./lib/gh-setup.js";
|
|
11
|
+
import { detectCircularDependencies, getCompletedPhaseNumbers, isAllTasksCompleted, selectExecutableTaskGroups, } from "./lib/dependency-resolver.js";
|
|
12
|
+
import { getIssue, getRepoInfo } from "./lib/github-client.js";
|
|
13
|
+
import { parseIssueBody } from "./lib/issue-parser.js";
|
|
14
|
+
import { selectProject } from "./lib/project-selector.js";
|
|
15
|
+
import { TaskStateManager, extractIssueNumberFromTitle, extractTaskGroupIdFromTitle, generateVibeKanbanDescription, generateVibeKanbanTitle, } from "./lib/task-state-manager.js";
|
|
16
|
+
import { VibeKanbanClient } from "./lib/vibe-kanban-client.js";
|
|
17
|
+
/** ポーリング間隔(ミリ秒) */
|
|
18
|
+
const POLLING_INTERVAL_MS = 15000;
|
|
19
|
+
/**
|
|
20
|
+
* 現在日時を YYYY/MM/DD HH:mm:ss 形式で取得
|
|
21
|
+
*/
|
|
22
|
+
function getTimestamp() {
|
|
23
|
+
const now = new Date();
|
|
24
|
+
const date = now.toLocaleDateString("ja-JP", {
|
|
25
|
+
year: "numeric",
|
|
26
|
+
month: "2-digit",
|
|
27
|
+
day: "2-digit",
|
|
28
|
+
});
|
|
29
|
+
const time = now.toLocaleTimeString("ja-JP", { hour12: false });
|
|
30
|
+
return `${date} ${time}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 待機関数
|
|
34
|
+
*/
|
|
35
|
+
function sleep(ms) {
|
|
36
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* task:loop コマンド
|
|
40
|
+
* GitHub Issue からタスクを取得し、Vibe-Kanban に登録して実行を継続するループ
|
|
41
|
+
*/
|
|
42
|
+
export async function taskLoopCommand(issue, options) {
|
|
43
|
+
var _a, _b, _c;
|
|
44
|
+
// Issue番号の確認
|
|
45
|
+
if (!issue) {
|
|
46
|
+
console.error("❌ Issue番号が指定されていません");
|
|
47
|
+
console.log("\n使用例:");
|
|
48
|
+
console.log(" einja task:loop 123");
|
|
49
|
+
console.log(" einja task:loop 123 --max-group 1.3");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
// Issue番号を数値に変換
|
|
53
|
+
const issueNumber = Number.parseInt(issue.replace(/^#/, ""), 10);
|
|
54
|
+
if (Number.isNaN(issueNumber)) {
|
|
55
|
+
console.error(`❌ 無効なIssue番号: ${issue}`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
const maxTaskNumber = options.maxGroup;
|
|
59
|
+
const baseBranch = (_a = options.branch) !== null && _a !== void 0 ? _a : "main";
|
|
60
|
+
// GitHub CLI セットアップ確認
|
|
61
|
+
ensureGhSetup();
|
|
62
|
+
console.log(`\n🚀 タスク自動実行ループ開始 [${getTimestamp()}]\n`);
|
|
63
|
+
// 設定表示
|
|
64
|
+
const repoInfo = getRepoInfo();
|
|
65
|
+
console.log("📋 設定:");
|
|
66
|
+
console.log(` - Issue番号: #${issueNumber}`);
|
|
67
|
+
console.log(` - 最大タスク番号: ${maxTaskNumber !== null && maxTaskNumber !== void 0 ? maxTaskNumber : "all"}`);
|
|
68
|
+
console.log(` - ベースブランチ: ${baseBranch}`);
|
|
69
|
+
console.log(` - リポジトリ: ${repoInfo.owner}/${repoInfo.name}`);
|
|
70
|
+
console.log("");
|
|
71
|
+
// GitHub Issue 取得・解析
|
|
72
|
+
console.log("📥 GitHub Issue を取得中...");
|
|
73
|
+
const issueData = getIssue(issueNumber);
|
|
74
|
+
let parsedIssue = parseIssueBody(issueData);
|
|
75
|
+
// 循環依存チェック
|
|
76
|
+
const cycle = detectCircularDependencies(parsedIssue);
|
|
77
|
+
if (cycle) {
|
|
78
|
+
console.error("\n❌ エラー: タスクグループの循環依存を検出しました");
|
|
79
|
+
console.error(`循環依存パス: ${cycle.join(" → ")}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
console.log(`✅ Issue 取得完了: ${parsedIssue.title}`);
|
|
83
|
+
console.log(` Phase 数: ${parsedIssue.phases.length}, タスクグループ数: ${parsedIssue.phases.reduce((sum, p) => sum + p.taskGroups.length, 0)}`);
|
|
84
|
+
console.log("");
|
|
85
|
+
// Issue ブランチを作成(チェックアウトなし)
|
|
86
|
+
console.log("🌿 ブランチを準備中...");
|
|
87
|
+
const issueBranch = ensureIssueBranchWithoutCheckout(issueNumber, baseBranch);
|
|
88
|
+
// Phase ブランチはタスク着手時に作成・同期される
|
|
89
|
+
console.log("📌 Phase ブランチはタスク着手時に作成・同期されます");
|
|
90
|
+
console.log("");
|
|
91
|
+
// Vibe-Kanban 接続
|
|
92
|
+
const vibeKanban = new VibeKanbanClient();
|
|
93
|
+
await vibeKanban.connect();
|
|
94
|
+
// プロジェクト ID 取得(設定ファイルまたはインタラクティブ選択)
|
|
95
|
+
const projectId = await selectProject(vibeKanban, issueNumber);
|
|
96
|
+
// タスク状態マネージャー初期化
|
|
97
|
+
const stateManager = new TaskStateManager();
|
|
98
|
+
// 既存の Vibe-Kanban タスクを取得
|
|
99
|
+
const existingTasks = await vibeKanban.listTasks(projectId);
|
|
100
|
+
// descriptionキャッシュを作成(パフォーマンス改善: getTaskを複数回呼ばない)
|
|
101
|
+
console.log("📦 タスクのdescriptionをキャッシュ中...");
|
|
102
|
+
const descriptionCache = new Map();
|
|
103
|
+
for (const task of existingTasks) {
|
|
104
|
+
let description = (_b = task.description) !== null && _b !== void 0 ? _b : null;
|
|
105
|
+
if (!description) {
|
|
106
|
+
const fullTask = await vibeKanban.getTask(task.id);
|
|
107
|
+
description = (_c = fullTask === null || fullTask === void 0 ? void 0 : fullTask.description) !== null && _c !== void 0 ? _c : null;
|
|
108
|
+
}
|
|
109
|
+
descriptionCache.set(task.id, description);
|
|
110
|
+
}
|
|
111
|
+
console.log(` ✅ ${descriptionCache.size} 件のタスクをキャッシュ`);
|
|
112
|
+
// Done タスク ID を初期化(ログは対象Issue関連のみ表示)
|
|
113
|
+
stateManager.initializeDoneTaskIds(existingTasks, issueNumber, descriptionCache);
|
|
114
|
+
// デバッグ: 起動時のタスク状態を表示(対象Issue関連のみ)
|
|
115
|
+
const issuePatternInDesc = `GitHub Issue #${issueNumber}`;
|
|
116
|
+
const isTaskForThisIssue = (task) => {
|
|
117
|
+
var _a;
|
|
118
|
+
// 新形式: タイトルからIssue番号を抽出
|
|
119
|
+
const titleIssueNum = extractIssueNumberFromTitle(task.title);
|
|
120
|
+
if (titleIssueNum === issueNumber)
|
|
121
|
+
return true;
|
|
122
|
+
// 旧形式: descriptionで判定
|
|
123
|
+
const desc = descriptionCache.get(task.id);
|
|
124
|
+
return (_a = desc === null || desc === void 0 ? void 0 : desc.includes(issuePatternInDesc)) !== null && _a !== void 0 ? _a : false;
|
|
125
|
+
};
|
|
126
|
+
const initialDoneTasks = existingTasks.filter((t) => t.status === "done" && isTaskForThisIssue(t));
|
|
127
|
+
const initialInProgressTasks = existingTasks.filter((t) => t.status === "inprogress" && isTaskForThisIssue(t));
|
|
128
|
+
console.log(`📊 起動時のタスク状態 (Issue #${issueNumber} 関連):`);
|
|
129
|
+
console.log(` - Done: ${initialDoneTasks.length > 0 ? initialDoneTasks.map((t) => extractTaskGroupIdFromTitle(t.title) || t.title).join(", ") : "なし"}`);
|
|
130
|
+
console.log(` - InProgress: ${initialInProgressTasks.length > 0 ? initialInProgressTasks.map((t) => extractTaskGroupIdFromTitle(t.title) || t.title).join(", ") : "なし"}`);
|
|
131
|
+
// 既存タスクのマッピングを登録(対象Issueのタスクのみ)
|
|
132
|
+
console.log(`📋 既存タスクのマッピング登録中 (Issue #${issueNumber} のみ)...`);
|
|
133
|
+
for (const task of existingTasks) {
|
|
134
|
+
const taskGroupId = extractTaskGroupIdFromTitle(task.title);
|
|
135
|
+
if (!taskGroupId) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// 対象のGitHub Issueに属するタスクのみ登録
|
|
139
|
+
if (isTaskForThisIssue(task)) {
|
|
140
|
+
stateManager.registerTaskMapping(task.id, taskGroupId);
|
|
141
|
+
}
|
|
142
|
+
// Issue番号が一致しないタスクは何もしない(ログ出力も不要)
|
|
143
|
+
}
|
|
144
|
+
// 起動時に既存のDoneタスクのGitHub Issueを同期
|
|
145
|
+
console.log("\n🔄 既存Doneタスクの同期チェック...");
|
|
146
|
+
parsedIssue = await syncExistingDoneTasks(parsedIssue, existingTasks, issueNumber, stateManager, descriptionCache);
|
|
147
|
+
try {
|
|
148
|
+
// 初期化: 着手可能なタスクを全部 Doing に移す
|
|
149
|
+
console.log("\n🔍 着手可能なタスクを選定中...");
|
|
150
|
+
await startExecutableTasks(parsedIssue, maxTaskNumber, issueNumber, issueBranch, baseBranch, projectId, vibeKanban, stateManager);
|
|
151
|
+
// メインループ
|
|
152
|
+
let loopCount = 0;
|
|
153
|
+
while (true) {
|
|
154
|
+
loopCount++;
|
|
155
|
+
console.log(`\n🔄 ポーリング #${loopCount} [${getTimestamp()}]`);
|
|
156
|
+
// Vibe-Kanban のタスク状態を取得
|
|
157
|
+
const currentTasks = await vibeKanban.listTasks(projectId);
|
|
158
|
+
// 対象Issueに関連するDoneタスクの件数のみ表示
|
|
159
|
+
const doneTasks = currentTasks.filter((t) => t.status === "done" && isTaskForThisIssue(t));
|
|
160
|
+
const totalDoneTasks = currentTasks.filter((t) => t.status === "done").length;
|
|
161
|
+
console.log(` 📊 Done: ${doneTasks.length}件 (対象Issue) / ${totalDoneTasks}件 (全体)`);
|
|
162
|
+
// Done 増加を検知
|
|
163
|
+
const newlyCompletedVibeTaskIds = stateManager.detectNewlyCompletedTasks(currentTasks);
|
|
164
|
+
if (newlyCompletedVibeTaskIds.length > 0) {
|
|
165
|
+
console.log(`✅ 新たに完了したタスク: ${newlyCompletedVibeTaskIds.length} 件`);
|
|
166
|
+
// タスクグループ ID を取得
|
|
167
|
+
const completedTaskGroupIds = stateManager.getCompletedTaskGroupIds(newlyCompletedVibeTaskIds);
|
|
168
|
+
// GitHub Issue のチェックボックスを更新
|
|
169
|
+
parsedIssue = await stateManager.markTaskGroupsAsCompleted(issueNumber, completedTaskGroupIds);
|
|
170
|
+
// 新たに着手可能になったタスクを開始
|
|
171
|
+
await startExecutableTasks(parsedIssue, maxTaskNumber, issueNumber, issueBranch, baseBranch, projectId, vibeKanban, stateManager);
|
|
172
|
+
}
|
|
173
|
+
// 全タスク完了チェック
|
|
174
|
+
if (isAllTasksCompleted(parsedIssue, maxTaskNumber)) {
|
|
175
|
+
console.log("\n🎉 すべてのタスクが完了しました!");
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
// 待機
|
|
179
|
+
console.log(` ⏳ ${POLLING_INTERVAL_MS / 1000}秒待機...`);
|
|
180
|
+
await sleep(POLLING_INTERVAL_MS);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
// Vibe-Kanban 切断
|
|
185
|
+
await vibeKanban.disconnect();
|
|
186
|
+
}
|
|
187
|
+
console.log("\n✅ タスク自動実行ループ終了\n");
|
|
188
|
+
}
|
|
189
|
+
/** マージ済み Phase 番号を追跡(重複マージ防止) */
|
|
190
|
+
const mergedPhaseNumbers = new Set();
|
|
191
|
+
/**
|
|
192
|
+
* 完了した Phase を Issue ブランチにマージ
|
|
193
|
+
*/
|
|
194
|
+
async function mergeCompletedPhases(parsedIssue, issueNumber, issueBranch) {
|
|
195
|
+
const completedPhases = getCompletedPhaseNumbers(parsedIssue);
|
|
196
|
+
for (const phaseNumber of completedPhases) {
|
|
197
|
+
if (mergedPhaseNumbers.has(phaseNumber)) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
console.log(`\n🔀 Phase ${phaseNumber} が完了 - Issue ブランチにマージします`);
|
|
201
|
+
try {
|
|
202
|
+
await mergePhaseBranchIntoIssue(issueNumber, phaseNumber, issueBranch);
|
|
203
|
+
mergedPhaseNumbers.add(phaseNumber);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
console.error(` ❌ Phase ${phaseNumber} のマージに失敗:`, error);
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 着手可能なタスクを Vibe-Kanban に登録して実行開始
|
|
213
|
+
*/
|
|
214
|
+
async function startExecutableTasks(parsedIssue, maxTaskNumber, issueNumber, issueBranch, baseBranch, projectId, vibeKanban, stateManager) {
|
|
215
|
+
var _a;
|
|
216
|
+
// 完了した Phase を Issue ブランチにマージ(新しい Phase のタスク開始前に実行)
|
|
217
|
+
await mergeCompletedPhases(parsedIssue, issueNumber, issueBranch);
|
|
218
|
+
// 着手可能なタスクグループを選定
|
|
219
|
+
const executableGroups = await selectExecutableTaskGroups(parsedIssue, maxTaskNumber);
|
|
220
|
+
if (executableGroups.length === 0) {
|
|
221
|
+
console.log(" ⏸️ 着手可能なタスクがありません");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
console.log(` 📝 着手可能なタスク: ${executableGroups.length} 件`);
|
|
225
|
+
// 既存の Vibe-Kanban タスクを取得(cancelled 以外)
|
|
226
|
+
const existingTasks = await vibeKanban.listTasks(projectId);
|
|
227
|
+
// 対象Issueに属する既存タスクのタスクグループIDを収集
|
|
228
|
+
const existingTaskGroupIdsForThisIssue = new Set();
|
|
229
|
+
const issuePatternInDesc = `GitHub Issue #${issueNumber}`;
|
|
230
|
+
for (const task of existingTasks) {
|
|
231
|
+
if (task.status === "cancelled") {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const taskGroupId = extractTaskGroupIdFromTitle(task.title);
|
|
235
|
+
if (!taskGroupId)
|
|
236
|
+
continue;
|
|
237
|
+
// タイトルからIssue番号を抽出(新形式)
|
|
238
|
+
const titleIssueNum = extractIssueNumberFromTitle(task.title);
|
|
239
|
+
if (titleIssueNum === issueNumber) {
|
|
240
|
+
existingTaskGroupIdsForThisIssue.add(taskGroupId);
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
// 旧形式の場合はdescriptionで判定
|
|
244
|
+
let description = task.description;
|
|
245
|
+
if (!description) {
|
|
246
|
+
const fullTask = await vibeKanban.getTask(task.id);
|
|
247
|
+
description = fullTask === null || fullTask === void 0 ? void 0 : fullTask.description;
|
|
248
|
+
}
|
|
249
|
+
if (description === null || description === void 0 ? void 0 : description.includes(issuePatternInDesc)) {
|
|
250
|
+
existingTaskGroupIdsForThisIssue.add(taskGroupId);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// リポジトリ情報を取得(startTaskAttempt に必要)
|
|
254
|
+
const repos = await vibeKanban.listRepos(projectId);
|
|
255
|
+
// 各タスクグループを Vibe-Kanban に登録
|
|
256
|
+
for (const taskGroup of executableGroups) {
|
|
257
|
+
// 対象Issueで既に存在する場合はスキップ(タスクグループIDで判定)
|
|
258
|
+
if (existingTaskGroupIdsForThisIssue.has(taskGroup.id)) {
|
|
259
|
+
console.log(` ⏭️ 既存タスクをスキップ: ${taskGroup.id}`);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const title = generateVibeKanbanTitle(taskGroup, issueNumber);
|
|
263
|
+
const description = generateVibeKanbanDescription(taskGroup, issueNumber);
|
|
264
|
+
// タスク開始前に Phase ブランチを同期(リモートの最新を取得)
|
|
265
|
+
await syncPhaseBranch(issueNumber, taskGroup.phaseNumber, issueBranch, baseBranch);
|
|
266
|
+
// タスク作成
|
|
267
|
+
console.log(` 📌 タスク作成: ${taskGroup.id} - ${taskGroup.name}`);
|
|
268
|
+
const taskId = await vibeKanban.createTask(projectId, title, description);
|
|
269
|
+
// マッピング登録
|
|
270
|
+
stateManager.registerTaskMapping(taskId, taskGroup.id);
|
|
271
|
+
// ステータスを inprogress に更新
|
|
272
|
+
await vibeKanban.updateTask(taskId, "inprogress");
|
|
273
|
+
// タスク実行開始(Phase ブランチをベースに使用)
|
|
274
|
+
const phaseBranch = getPhaseBranchNameNew(issueNumber, taskGroup.phaseNumber);
|
|
275
|
+
try {
|
|
276
|
+
const reposWithBranch = repos.map((repo) => ({
|
|
277
|
+
repo_id: repo.id,
|
|
278
|
+
base_branch: phaseBranch,
|
|
279
|
+
}));
|
|
280
|
+
const attempt = await vibeKanban.startTaskAttempt(taskId, "CLAUDE_CODE", reposWithBranch);
|
|
281
|
+
console.log(` ▶️ タスク開始: ${taskGroup.id} (base: ${phaseBranch}, attempt: ${(_a = attempt === null || attempt === void 0 ? void 0 : attempt.id) !== null && _a !== void 0 ? _a : "unknown"})`);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
console.error(` ❌ Attempt開始失敗: ${taskGroup.id}`, error);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* 起動時に既存のDoneタスクについてGitHub Issueを同期
|
|
290
|
+
*
|
|
291
|
+
* Vibe-KanbanでDone状態なのにGitHub Issueで未完了のタスクを検出し、
|
|
292
|
+
* GitHub Issueを更新する
|
|
293
|
+
*
|
|
294
|
+
* 注意: 同じプロジェクト内に複数のGitHub Issueのタスクが混在している可能性があるため、
|
|
295
|
+
* タスクのdescriptionに含まれるIssue番号をチェックして、対象Issueのタスクのみを同期する
|
|
296
|
+
*/
|
|
297
|
+
async function syncExistingDoneTasks(parsedIssue, existingTasks, issueNumber, stateManager, descriptionCache) {
|
|
298
|
+
// Vibe-KanbanでDone状態のタスクを取得
|
|
299
|
+
const doneTasks = existingTasks.filter((t) => t.status === "done");
|
|
300
|
+
// GitHub Issueで未完了のタスクグループIDを取得
|
|
301
|
+
const { getCompletedTaskGroupIds } = await import("./lib/issue-parser.js");
|
|
302
|
+
const completedInIssue = getCompletedTaskGroupIds(parsedIssue);
|
|
303
|
+
// Vibe-KanbanでDoneだがGitHub Issueで未完了のタスクを検出
|
|
304
|
+
// 対象のGitHub Issueに属するタスクのみを処理(Issue番号が一致しないものは無視)
|
|
305
|
+
const needsSync = [];
|
|
306
|
+
const issuePattern = `GitHub Issue #${issueNumber}`;
|
|
307
|
+
for (const task of doneTasks) {
|
|
308
|
+
const taskGroupId = extractTaskGroupIdFromTitle(task.title);
|
|
309
|
+
if (!taskGroupId) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
// タイトルからIssue番号を抽出(新形式: [Issue22 5.1])
|
|
313
|
+
const titleIssueNum = extractIssueNumberFromTitle(task.title);
|
|
314
|
+
let isTargetIssue = false;
|
|
315
|
+
if (titleIssueNum === issueNumber) {
|
|
316
|
+
// タイトルで一致した場合は対象
|
|
317
|
+
isTargetIssue = true;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// 旧形式: descriptionで判定
|
|
321
|
+
const taskDescription = descriptionCache.get(task.id);
|
|
322
|
+
if (taskDescription === null || taskDescription === void 0 ? void 0 : taskDescription.includes(issuePattern)) {
|
|
323
|
+
isTargetIssue = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (!isTargetIssue) {
|
|
327
|
+
// Issue番号が一致しないタスクは何もしない(ログ出力も不要)
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
if (!completedInIssue.has(taskGroupId)) {
|
|
331
|
+
needsSync.push(taskGroupId);
|
|
332
|
+
console.log(` 📝 同期が必要: ${taskGroupId} (Vibe-Kanban: Done, GitHub: 未完了)`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (needsSync.length === 0) {
|
|
336
|
+
console.log(" ✅ 同期が必要なタスクはありません");
|
|
337
|
+
return parsedIssue;
|
|
338
|
+
}
|
|
339
|
+
// GitHub Issueを更新
|
|
340
|
+
console.log(` 🔄 ${needsSync.length} 件のタスクをGitHub Issueに同期...`);
|
|
341
|
+
return stateManager.markTaskGroupsAsCompleted(issueNumber, needsSync);
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/task-loop/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git ブランチ操作
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* リモートの最新情報を取得
|
|
6
|
+
*/
|
|
7
|
+
export declare function fetchRemote(): void;
|
|
8
|
+
/**
|
|
9
|
+
* リモートのデフォルトブランチを取得
|
|
10
|
+
*/
|
|
11
|
+
export declare function getDefaultBranch(): string;
|
|
12
|
+
/**
|
|
13
|
+
* ブランチが存在するか確認(ローカルまたはリモート)
|
|
14
|
+
*/
|
|
15
|
+
export declare function branchExists(branchName: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* 現在のブランチ名を取得
|
|
18
|
+
*/
|
|
19
|
+
export declare function getCurrentBranch(): string;
|
|
20
|
+
/**
|
|
21
|
+
* ブランチをチェックアウト(存在しない場合は作成)
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkoutBranch(branchName: string, baseBranch?: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Issue ブランチを作成または取得
|
|
26
|
+
* @returns ブランチ名
|
|
27
|
+
*/
|
|
28
|
+
export declare function ensureIssueBranch(issueNumber: number, baseBranch: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Issue ブランチを作成または確認(チェックアウトなし)
|
|
31
|
+
* 複数 Issue の同時実行をサポートするため、現在のブランチを変更しない
|
|
32
|
+
* @returns ブランチ名
|
|
33
|
+
*/
|
|
34
|
+
export declare function ensureIssueBranchWithoutCheckout(issueNumber: number, baseBranch: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Phase ブランチを作成または確認(チェックアウトなし)
|
|
37
|
+
* 複数 Issue の同時実行をサポートするため、現在のブランチを変更しない
|
|
38
|
+
* @returns ブランチ名
|
|
39
|
+
*/
|
|
40
|
+
export declare function ensurePhaseBranchWithoutCheckout(issueNumber: number, phaseNumber: number, issueBranch: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Phase ブランチ名を取得
|
|
43
|
+
*/
|
|
44
|
+
export declare function getPhaseBranchNameNew(issueNumber: number, phaseNumber: number): string;
|
|
45
|
+
/**
|
|
46
|
+
* Phase ブランチを作成または取得
|
|
47
|
+
* @returns ブランチ名
|
|
48
|
+
*/
|
|
49
|
+
export declare function ensurePhaseBranch(issueNumber: number, phaseNumber: number, issueBranch: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* タスクグループの Phase ブランチ名を取得
|
|
52
|
+
*/
|
|
53
|
+
export declare function getPhaseBranchName(issueNumber: number, phaseNumber: number): string;
|
|
54
|
+
/**
|
|
55
|
+
* Phase ブランチを同期(存在しなければ作成、存在すれば最新化)
|
|
56
|
+
* タスク着手時に呼び出され、リモートの最新状態を反映する
|
|
57
|
+
* また、作成元の Issue ブランチの変更も取り込む
|
|
58
|
+
*/
|
|
59
|
+
export declare function syncPhaseBranch(issueNumber: number, phaseNumber: number, issueBranch: string, issueBranchBase: string): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Phase ブランチを Issue ブランチにマージ(フェーズ完了時)
|
|
62
|
+
* checkout を使用せず、GitHub API または worktree でリモートマージを実行
|
|
63
|
+
* コンフリクトが発生した場合は Claude Code でインタラクティブに解決
|
|
64
|
+
*/
|
|
65
|
+
export declare function mergePhaseBranchIntoIssue(issueNumber: number, phaseNumber: number, issueBranch: string): Promise<void>;
|
|
66
|
+
//# sourceMappingURL=branch-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-manager.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/branch-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoJH;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAgBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAU5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAgBjF;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAkBhG;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CAkBR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CA+DjB;AAqOD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA2Ff"}
|