@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.
Files changed (83) hide show
  1. package/README.md +4 -5
  2. package/dist/cli.js +4 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +4 -2
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/sync.d.ts.map +1 -1
  8. package/dist/commands/sync.js +16 -9
  9. package/dist/commands/sync.js.map +1 -1
  10. package/dist/commands/task-loop/index.d.ts +18 -0
  11. package/dist/commands/task-loop/index.d.ts.map +1 -0
  12. package/dist/commands/task-loop/index.js +343 -0
  13. package/dist/commands/task-loop/index.js.map +1 -0
  14. package/dist/commands/task-loop/lib/branch-manager.d.ts +66 -0
  15. package/dist/commands/task-loop/lib/branch-manager.d.ts.map +1 -0
  16. package/dist/commands/task-loop/lib/branch-manager.js +697 -0
  17. package/dist/commands/task-loop/lib/branch-manager.js.map +1 -0
  18. package/dist/commands/task-loop/lib/conflict-handler.d.ts +8 -0
  19. package/dist/commands/task-loop/lib/conflict-handler.d.ts.map +1 -0
  20. package/dist/commands/task-loop/lib/conflict-handler.js +68 -0
  21. package/dist/commands/task-loop/lib/conflict-handler.js.map +1 -0
  22. package/dist/commands/task-loop/lib/dependency-resolver.d.ts +45 -0
  23. package/dist/commands/task-loop/lib/dependency-resolver.d.ts.map +1 -0
  24. package/dist/commands/task-loop/lib/dependency-resolver.js +184 -0
  25. package/dist/commands/task-loop/lib/dependency-resolver.js.map +1 -0
  26. package/dist/commands/task-loop/lib/gh-setup.d.ts +15 -0
  27. package/dist/commands/task-loop/lib/gh-setup.d.ts.map +1 -0
  28. package/dist/commands/task-loop/lib/gh-setup.js +196 -0
  29. package/dist/commands/task-loop/lib/gh-setup.js.map +1 -0
  30. package/dist/commands/task-loop/lib/github-client.d.ts +27 -0
  31. package/dist/commands/task-loop/lib/github-client.d.ts.map +1 -0
  32. package/dist/commands/task-loop/lib/github-client.js +110 -0
  33. package/dist/commands/task-loop/lib/github-client.js.map +1 -0
  34. package/dist/commands/task-loop/lib/issue-parser.d.ts +27 -0
  35. package/dist/commands/task-loop/lib/issue-parser.d.ts.map +1 -0
  36. package/dist/commands/task-loop/lib/issue-parser.js +254 -0
  37. package/dist/commands/task-loop/lib/issue-parser.js.map +1 -0
  38. package/dist/commands/task-loop/lib/project-selector.d.ts +15 -0
  39. package/dist/commands/task-loop/lib/project-selector.d.ts.map +1 -0
  40. package/dist/commands/task-loop/lib/project-selector.js +187 -0
  41. package/dist/commands/task-loop/lib/project-selector.js.map +1 -0
  42. package/dist/commands/task-loop/lib/task-number-utils.d.ts +56 -0
  43. package/dist/commands/task-loop/lib/task-number-utils.d.ts.map +1 -0
  44. package/dist/commands/task-loop/lib/task-number-utils.js +114 -0
  45. package/dist/commands/task-loop/lib/task-number-utils.js.map +1 -0
  46. package/dist/commands/task-loop/lib/task-state-manager.d.ts +59 -0
  47. package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -0
  48. package/dist/commands/task-loop/lib/task-state-manager.js +184 -0
  49. package/dist/commands/task-loop/lib/task-state-manager.js.map +1 -0
  50. package/dist/commands/task-loop/lib/types.d.ts +93 -0
  51. package/dist/commands/task-loop/lib/types.d.ts.map +1 -0
  52. package/dist/commands/task-loop/lib/types.js +5 -0
  53. package/dist/commands/task-loop/lib/types.js.map +1 -0
  54. package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts +82 -0
  55. package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts.map +1 -0
  56. package/dist/commands/task-loop/lib/vibe-kanban-client.js +280 -0
  57. package/dist/commands/task-loop/lib/vibe-kanban-client.js.map +1 -0
  58. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.d.ts +42 -0
  59. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.d.ts.map +1 -0
  60. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +122 -0
  61. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -0
  62. package/dist/lib/sync/batch-processor.test.js +1 -1
  63. package/dist/lib/sync/batch-processor.test.js.map +1 -1
  64. package/dist/lib/sync/diff-engine.js +1 -1
  65. package/dist/lib/sync/diff-engine.js.map +1 -1
  66. package/dist/lib/sync/hash-cache.d.ts +10 -4
  67. package/dist/lib/sync/hash-cache.d.ts.map +1 -1
  68. package/dist/lib/sync/hash-cache.js +28 -9
  69. package/dist/lib/sync/hash-cache.js.map +1 -1
  70. package/dist/lib/sync/hash-cache.test.js +69 -38
  71. package/dist/lib/sync/hash-cache.test.js.map +1 -1
  72. package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
  73. package/dist/lib/sync/metadata-manager.js +3 -4
  74. package/dist/lib/sync/metadata-manager.js.map +1 -1
  75. package/dist/lib/sync/performance.test.js +4 -5
  76. package/dist/lib/sync/performance.test.js.map +1 -1
  77. package/package.json +2 -1
  78. package/presets/minimal/preset.yaml +0 -1
  79. package/scaffolds/CLAUDE.md.template +81 -13
  80. package/dist/commands/task-loop.d.ts +0 -11
  81. package/dist/commands/task-loop.d.ts.map +0 -1
  82. package/dist/commands/task-loop.js +0 -81
  83. 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"}