@akiojin/gwt 4.6.1 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/claude.d.ts.map +1 -1
  2. package/dist/claude.js +6 -2
  3. package/dist/claude.js.map +1 -1
  4. package/dist/cli/ui/components/App.d.ts.map +1 -1
  5. package/dist/cli/ui/components/App.js +103 -2
  6. package/dist/cli/ui/components/App.js.map +1 -1
  7. package/dist/cli/ui/components/screens/BranchListScreen.d.ts +1 -0
  8. package/dist/cli/ui/components/screens/BranchListScreen.d.ts.map +1 -1
  9. package/dist/cli/ui/components/screens/BranchListScreen.js +11 -8
  10. package/dist/cli/ui/components/screens/BranchListScreen.js.map +1 -1
  11. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts +10 -0
  12. package/dist/cli/ui/components/screens/LogDatePickerScreen.d.ts.map +1 -0
  13. package/dist/cli/ui/components/screens/LogDatePickerScreen.js +44 -0
  14. package/dist/cli/ui/components/screens/LogDatePickerScreen.js.map +1 -0
  15. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts +14 -0
  16. package/dist/cli/ui/components/screens/LogDetailScreen.d.ts.map +1 -0
  17. package/dist/cli/ui/components/screens/LogDetailScreen.js +34 -0
  18. package/dist/cli/ui/components/screens/LogDetailScreen.js.map +1 -0
  19. package/dist/cli/ui/components/screens/LogListScreen.d.ts +19 -0
  20. package/dist/cli/ui/components/screens/LogListScreen.d.ts.map +1 -0
  21. package/dist/cli/ui/components/screens/LogListScreen.js +107 -0
  22. package/dist/cli/ui/components/screens/LogListScreen.js.map +1 -0
  23. package/dist/cli/ui/hooks/useGitData.d.ts.map +1 -1
  24. package/dist/cli/ui/hooks/useGitData.js +10 -3
  25. package/dist/cli/ui/hooks/useGitData.js.map +1 -1
  26. package/dist/cli/ui/types.d.ts +1 -1
  27. package/dist/cli/ui/types.d.ts.map +1 -1
  28. package/dist/cli/ui/utils/branchFormatter.d.ts +5 -0
  29. package/dist/cli/ui/utils/branchFormatter.d.ts.map +1 -1
  30. package/dist/cli/ui/utils/branchFormatter.js +18 -5
  31. package/dist/cli/ui/utils/branchFormatter.js.map +1 -1
  32. package/dist/cli/ui/utils/clipboard.d.ts +7 -0
  33. package/dist/cli/ui/utils/clipboard.d.ts.map +1 -0
  34. package/dist/cli/ui/utils/clipboard.js +21 -0
  35. package/dist/cli/ui/utils/clipboard.js.map +1 -0
  36. package/dist/codex.d.ts.map +1 -1
  37. package/dist/codex.js +0 -1
  38. package/dist/codex.js.map +1 -1
  39. package/dist/gemini.d.ts.map +1 -1
  40. package/dist/gemini.js +6 -3
  41. package/dist/gemini.js.map +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +104 -81
  44. package/dist/index.js.map +1 -1
  45. package/dist/logging/formatter.d.ts +15 -0
  46. package/dist/logging/formatter.d.ts.map +1 -0
  47. package/dist/logging/formatter.js +81 -0
  48. package/dist/logging/formatter.js.map +1 -0
  49. package/dist/logging/reader.d.ts +12 -0
  50. package/dist/logging/reader.d.ts.map +1 -0
  51. package/dist/logging/reader.js +63 -0
  52. package/dist/logging/reader.js.map +1 -0
  53. package/dist/worktree.d.ts.map +1 -1
  54. package/dist/worktree.js +57 -0
  55. package/dist/worktree.js.map +1 -1
  56. package/package.json +2 -2
  57. package/src/claude.ts +7 -2
  58. package/src/cli/ui/__tests__/components/App.shortcuts.test.tsx +8 -4
  59. package/src/cli/ui/__tests__/components/App.test.tsx +65 -3
  60. package/src/cli/ui/__tests__/components/common/Select.test.tsx +17 -11
  61. package/src/cli/ui/__tests__/components/screens/BranchListScreen.test.tsx +28 -2
  62. package/src/cli/ui/__tests__/components/screens/LogDetailScreen.test.tsx +57 -0
  63. package/src/cli/ui/__tests__/components/screens/LogListScreen.test.tsx +102 -0
  64. package/src/cli/ui/__tests__/hooks/useGitData.test.ts +197 -0
  65. package/src/cli/ui/__tests__/integration/edgeCases.test.tsx +84 -13
  66. package/src/cli/ui/__tests__/integration/navigation.test.tsx +57 -37
  67. package/src/cli/ui/__tests__/utils/branchFormatter.test.ts +105 -0
  68. package/src/cli/ui/__tests__/utils/clipboard.test.ts +65 -0
  69. package/src/cli/ui/components/App.tsx +178 -1
  70. package/src/cli/ui/components/screens/BranchListScreen.tsx +11 -6
  71. package/src/cli/ui/components/screens/LogDatePickerScreen.tsx +83 -0
  72. package/src/cli/ui/components/screens/LogDetailScreen.tsx +67 -0
  73. package/src/cli/ui/components/screens/LogListScreen.tsx +192 -0
  74. package/src/cli/ui/hooks/useGitData.ts +12 -3
  75. package/src/cli/ui/types.ts +3 -0
  76. package/src/cli/ui/utils/branchFormatter.ts +19 -5
  77. package/src/cli/ui/utils/clipboard.ts +31 -0
  78. package/src/codex.ts +0 -1
  79. package/src/gemini.ts +7 -3
  80. package/src/index.ts +147 -123
  81. package/src/logging/formatter.ts +106 -0
  82. package/src/logging/reader.ts +76 -0
  83. package/src/worktree.ts +77 -0
package/src/worktree.ts CHANGED
@@ -289,6 +289,73 @@ export async function generateAlternativeWorktreePath(
289
289
  return alternativePath;
290
290
  }
291
291
 
292
+ type StaleWorktreeAssessment = {
293
+ status: "absent" | "registered" | "stale" | "unknown";
294
+ reason?: string;
295
+ };
296
+
297
+ async function assessStaleWorktreeDirectory(
298
+ targetPath: string,
299
+ ): Promise<StaleWorktreeAssessment> {
300
+ const fsSync = await import("node:fs");
301
+
302
+ if (!fsSync.existsSync(targetPath)) {
303
+ return { status: "absent" };
304
+ }
305
+
306
+ const registered = await checkWorktreePathConflict(targetPath);
307
+ if (registered) {
308
+ return { status: "registered" };
309
+ }
310
+
311
+ const gitMetaPath = path.join(targetPath, ".git");
312
+ if (!fsSync.existsSync(gitMetaPath)) {
313
+ return { status: "stale", reason: "missing .git" };
314
+ }
315
+
316
+ let gitMetaStat: Awaited<ReturnType<typeof fs.lstat>>;
317
+ try {
318
+ gitMetaStat = await fs.lstat(gitMetaPath);
319
+ } catch {
320
+ return { status: "unknown", reason: "unable to stat .git" };
321
+ }
322
+
323
+ if (gitMetaStat.isDirectory()) {
324
+ return { status: "unknown", reason: ".git is a directory" };
325
+ }
326
+
327
+ if (!gitMetaStat.isFile()) {
328
+ return { status: "unknown", reason: ".git is not a file" };
329
+ }
330
+
331
+ let gitMetaContents = "";
332
+ try {
333
+ gitMetaContents = await fs.readFile(gitMetaPath, "utf8");
334
+ } catch {
335
+ return { status: "unknown", reason: "unable to read .git" };
336
+ }
337
+
338
+ const gitdirMatch = gitMetaContents.match(/^\s*gitdir:\s*(.+)\s*$/m);
339
+ if (!gitdirMatch) {
340
+ return { status: "unknown", reason: "missing gitdir entry" };
341
+ }
342
+
343
+ const rawGitdir = gitdirMatch[1]?.trim();
344
+ if (!rawGitdir) {
345
+ return { status: "unknown", reason: "empty gitdir entry" };
346
+ }
347
+
348
+ const gitdirPath = path.isAbsolute(rawGitdir)
349
+ ? rawGitdir
350
+ : path.resolve(targetPath, rawGitdir);
351
+
352
+ if (!fsSync.existsSync(gitdirPath)) {
353
+ return { status: "stale", reason: "missing gitdir path" };
354
+ }
355
+
356
+ return { status: "unknown", reason: "gitdir exists" };
357
+ }
358
+
292
359
  /**
293
360
  * 新しいworktreeを作成
294
361
  * @param {WorktreeConfig} config - worktreeの設定
@@ -302,6 +369,16 @@ export async function createWorktree(config: WorktreeConfig): Promise<void> {
302
369
  }
303
370
 
304
371
  try {
372
+ const staleness = await assessStaleWorktreeDirectory(config.worktreePath);
373
+ if (staleness.status === "stale") {
374
+ await fs.rm(config.worktreePath, { recursive: true, force: true });
375
+ } else if (staleness.status === "unknown") {
376
+ const reason = staleness.reason ? ` (${staleness.reason})` : "";
377
+ throw new WorktreeError(
378
+ `Worktree path already exists but is not registered as a git worktree, and stale status could not be confirmed${reason}. Remove the directory manually and retry: ${config.worktreePath}`,
379
+ );
380
+ }
381
+
305
382
  const worktreeParentDir = path.dirname(config.worktreePath);
306
383
 
307
384
  try {