@kw-yeh/vibeflow 4.5.0 → 4.5.1

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/dist/vibeflow.mjs CHANGED
@@ -4546,29 +4546,51 @@ async function readWorktreeSpecs(worktreePath, baseBranch) {
4546
4546
  }
4547
4547
  return specs.sort((a, b) => a.path.localeCompare(b.path));
4548
4548
  }
4549
- async function readBranchSpecs(projectPath, branch, baseBranch, changedPaths) {
4550
- const ref = `refs/heads/${branch}`;
4549
+ async function readBranchSpecs(projectPath, branch, baseBranch, changedPaths, launchedAt) {
4550
+ for (const ref of [`refs/heads/${branch}`, `refs/remotes/origin/${branch}`]) {
4551
+ if (!await refExists(projectPath, ref)) continue;
4552
+ const paths = changedPaths ?? await diffNames(projectPath, `${await resolveBaseRef(projectPath, baseBranch)}...${ref}`);
4553
+ const specs = await readSpecsAt(projectPath, ref, paths);
4554
+ if (specs.length > 0) return specs;
4555
+ }
4556
+ const merge = await findPullRequestMerge(projectPath, branch, baseBranch, launchedAt);
4557
+ if (!merge) return [];
4558
+ return readSpecsAt(projectPath, `${merge}^2`, await diffNames(projectPath, `${merge}^1`, merge));
4559
+ }
4560
+ async function refExists(cwd, ref) {
4551
4561
  try {
4552
- await git(projectPath, ["rev-parse", "--verify", ref]);
4562
+ await git(cwd, ["rev-parse", "--verify", "--quiet", ref]);
4563
+ return true;
4553
4564
  } catch {
4554
- return [];
4565
+ return false;
4555
4566
  }
4556
- let paths = changedPaths;
4557
- if (!paths) {
4558
- const baseRef = await resolveBaseRef(projectPath, baseBranch);
4559
- const names = await git(projectPath, [
4560
- "diff",
4561
- "--name-only",
4562
- "--diff-filter=d",
4563
- `${baseRef}...${ref}`
4564
- ]).catch(() => "");
4565
- paths = names.split("\n").map((l) => l.trim());
4567
+ }
4568
+ async function diffNames(cwd, ...range) {
4569
+ const names = await git(cwd, ["diff", "--name-only", "--diff-filter=d", ...range]).catch(() => "");
4570
+ return names.split("\n").map((l) => l.trim());
4571
+ }
4572
+ async function findPullRequestMerge(cwd, branch, baseBranch, launchedAt) {
4573
+ const baseRef = await resolveBaseRef(cwd, baseBranch);
4574
+ const log = await git(cwd, [
4575
+ "log",
4576
+ "--merges",
4577
+ "--first-parent",
4578
+ "--format=%H %s",
4579
+ ...launchedAt ? [`--since=${new Date(launchedAt).toISOString()}`] : [],
4580
+ baseRef
4581
+ ]).catch(() => "");
4582
+ for (const line of log.split("\n")) {
4583
+ const match = /^(\S+) Merge pull request #\d+ from [^/\s]+\/(\S+)$/.exec(line.trim());
4584
+ if (match && match[2] === branch) return match[1];
4566
4585
  }
4586
+ return null;
4587
+ }
4588
+ async function readSpecsAt(cwd, ref, paths) {
4567
4589
  const specs = [];
4568
4590
  for (const p of paths.filter(isSpecPath)) {
4569
4591
  try {
4570
- const content = await git(projectPath, ["show", `${ref}:${p}`]);
4571
- const ct = await git(projectPath, ["log", "-1", "--format=%ct", ref, "--", p]);
4592
+ const content = await git(cwd, ["show", `${ref}:${p}`]);
4593
+ const ct = await git(cwd, ["log", "-1", "--format=%ct", ref, "--", p]);
4572
4594
  specs.push({
4573
4595
  path: p,
4574
4596
  ...clip2(Buffer.from(content, "utf8")),
@@ -5448,7 +5470,7 @@ function createCore({ sessions, bus, version }) {
5448
5470
  if (task.worktreePath) return readWorktreeSpecs(task.worktreePath, base);
5449
5471
  if (!task.projectPath || !task.launchedAt) return [];
5450
5472
  const changed = task.outcome?.files.filter((f) => f.status !== "D").map((f) => f.path);
5451
- return readBranchSpecs(task.projectPath, task.branch, base, changed);
5473
+ return readBranchSpecs(task.projectPath, task.branch, base, changed, task.launchedAt);
5452
5474
  },
5453
5475
  "board:getCliLaunchInfo": () => boardCliLaunchInfo(),
5454
5476
  "library:list": async () => listLibrary(await libraryRoot(), builtinSkillsDir()),
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/24b804d01aa3af3c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/24b804d01aa3af3c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c8aa5df0425f6b7b.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-2a4ae532bdcab6f2.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/GVhAr0pZILduxKDBurk9J/_buildManifest.js" defer=""></script><script src="/_next/static/GVhAr0pZILduxKDBurk9J/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"GVhAr0pZILduxKDBurk9J","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/24b804d01aa3af3c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/24b804d01aa3af3c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c8aa5df0425f6b7b.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-2a4ae532bdcab6f2.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/2iwmsskDbEWs3K3yxNplb/_buildManifest.js" defer=""></script><script src="/_next/static/2iwmsskDbEWs3K3yxNplb/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"2iwmsskDbEWs3K3yxNplb","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
package/dist/web/404.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/24b804d01aa3af3c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/24b804d01aa3af3c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c8aa5df0425f6b7b.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-2a4ae532bdcab6f2.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/GVhAr0pZILduxKDBurk9J/_buildManifest.js" defer=""></script><script src="/_next/static/GVhAr0pZILduxKDBurk9J/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"GVhAr0pZILduxKDBurk9J","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><title data-next-head="">404: This page could not be found</title><link rel="preload" href="/_next/static/css/24b804d01aa3af3c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/24b804d01aa3af3c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c8aa5df0425f6b7b.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-2a4ae532bdcab6f2.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/2iwmsskDbEWs3K3yxNplb/_buildManifest.js" defer=""></script><script src="/_next/static/2iwmsskDbEWs3K3yxNplb/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"2iwmsskDbEWs3K3yxNplb","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><title data-next-head="">VibeFlow</title><link rel="preload" href="/_next/static/css/24b804d01aa3af3c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/24b804d01aa3af3c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c8aa5df0425f6b7b.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-2a4ae532bdcab6f2.js" defer=""></script><script src="/_next/static/chunks/2524-abaf3a55023f6066.js" defer=""></script><script src="/_next/static/chunks/pages/home-a511856e480ddb33.js" defer=""></script><script src="/_next/static/GVhAr0pZILduxKDBurk9J/_buildManifest.js" defer=""></script><script src="/_next/static/GVhAr0pZILduxKDBurk9J/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="bg-background text-foreground"><div class="flex min-h-screen items-center justify-center bg-background text-base text-muted-foreground">載入中…</div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/home","query":{},"buildId":"GVhAr0pZILduxKDBurk9J","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><link rel="icon" href="/favicon.ico" sizes="any" data-next-head=""/><link rel="icon" href="/logo.svg" type="image/svg+xml" data-next-head=""/><link rel="apple-touch-icon" href="/apple-touch-icon.png" data-next-head=""/><title data-next-head="">VibeFlow</title><link rel="preload" href="/_next/static/css/24b804d01aa3af3c.css" as="style"/><link rel="stylesheet" href="/_next/static/css/24b804d01aa3af3c.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-c8aa5df0425f6b7b.js" defer=""></script><script src="/_next/static/chunks/framework-b92a367cf1ad4bf7.js" defer=""></script><script src="/_next/static/chunks/main-ec7fd4c371d06729.js" defer=""></script><script src="/_next/static/chunks/pages/_app-2a4ae532bdcab6f2.js" defer=""></script><script src="/_next/static/chunks/2524-abaf3a55023f6066.js" defer=""></script><script src="/_next/static/chunks/pages/home-a511856e480ddb33.js" defer=""></script><script src="/_next/static/2iwmsskDbEWs3K3yxNplb/_buildManifest.js" defer=""></script><script src="/_next/static/2iwmsskDbEWs3K3yxNplb/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div class="bg-background text-foreground"><div class="flex min-h-screen items-center justify-center bg-background text-base text-muted-foreground">載入中…</div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/home","query":{},"buildId":"2iwmsskDbEWs3K3yxNplb","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kw-yeh/vibeflow",
3
- "version": "4.5.0",
3
+ "version": "4.5.1",
4
4
  "description": "Intent-driven local kanban for coding agents: git worktree per card, Web UI and TUI.",
5
5
  "license": "MIT",
6
6
  "author": "KW-Yeh",