@kw-yeh/vibeflow 4.11.18 → 4.11.19

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 CHANGED
@@ -26,7 +26,7 @@ vibeflow
26
26
  - **看得到 agent 做了什麼**:每張卡有 diff 檢視、artifacts,以及「決策」分頁:顯示這張卡的分支新增或修改的 `spec.md`(agent 做了哪些決定、為什麼)。卡片完成後打開時預設顯示決策;本地分支刪掉後,會改從 `origin/<branch>` 或 GitHub PR 的 merge commit 讀回合併當時的內容(squash/rebase merge 的卡片讀不回來)。
27
27
  - **選你要的 agent**:Claude Code 或 Codex,每張卡可以各自指定 model、推理強度(effort)與 Auto Mode(是否免確認執行)。Effort 預設為 `auto`,由 Jev 依任務與目前模型選擇支援的級距;在「設定 → Jev 自動選擇 effort」輸入 TypeSafe Jev API key,或在啟動 VibeFlow 的環境設定 `TYPESAFE_API_KEY`。若沒有金鑰或 Jev 暫時無法使用,會顯示原因並使用模型預設的 effort。未指定 model 時,使用該 CLI 的預設模型。
28
28
  - **Web UI 與終端機 UI 共用同一個看板**:習慣瀏覽器用 Web UI,習慣終端機用 `vibeflow tui`。
29
- - **Jira 工作收件匣**:安裝 [Atlassian CLI(Windows)](https://developer.atlassian.com/cloud/acli/guides/install-windows/) 或 [Atlassian CLI(macOS)](https://developer.atlassian.com/cloud/acli/guides/install-macos/),再到設定登入,就能在「工作項目」的 Jira 分頁依狀態查看指派給自己的 ticket、開啟附件,並選擇本機專案建立 Backlog 卡片。
29
+ - **Jira 工作收件匣**:安裝 [Atlassian CLI(Windows)](https://developer.atlassian.com/cloud/acli/guides/install-windows/) 或 [Atlassian CLI(macOS)](https://developer.atlassian.com/cloud/acli/guides/install-macos/),再到設定登入,就能在「工作項目」的 Jira 分頁以固定四欄查看指派給自己的 ticket、選擇抓取範圍、開啟附件,並選擇本機專案建立 Backlog 卡片。
30
30
  - **GitHub Issues 與 PRs**:使用已登入的 `gh` 跨所有相關 repo 顯示 open 項目,即使該 repo 尚未出現在看板;建卡時可選擇本機專案資料夾。
31
31
  - **內建 skill,可自行調整**:每個人的 Library(設定 → Library)都附帶 `visual-parity`、`pr` 兩個 skill,可以直接編輯或刪除,隨時能還原成 VibeFlow 出貨的版本;沒改過的會跟著 VibeFlow 升級更新。Library 只負責保存,啟動任務時不會載入任何 Library 項目——agent 只收到你在設定填的 system prompt 與卡片內容。`visual-parity` 需要 Python 與 `pip install playwright && playwright install chromium`。
32
32
  - **也能用指令操作**:`vibeflow task create` 不開 UI 直接建卡;agent 自己也能在看板上建立後續的卡片。
package/dist/vibeflow.mjs CHANGED
@@ -5929,21 +5929,25 @@ async function logoutJira(run3 = defaultAcliRunner) {
5929
5929
  var asRaw = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
5930
5930
  var nameOf = (v) => typeof v === "string" ? v : String(asRaw(v).name ?? "");
5931
5931
  var JIRA_INBOX_JQL = "assignee = currentUser() AND (statusCategory != Done OR sprint in openSprints()) ORDER BY updated DESC";
5932
+ var JIRA_SCOPE_JQL = {
5933
+ current: JIRA_INBOX_JQL,
5934
+ sprint: "assignee = currentUser() AND sprint in openSprints() ORDER BY updated DESC",
5935
+ all: "assignee = currentUser() ORDER BY updated DESC"
5936
+ };
5932
5937
  var DEFAULT_POINT_FIELDS = ["customfield_10033", "customfield_10016"];
5933
5938
  var JIRA_CACHE_TTL_MS = 5 * 60 * 1e3;
5934
- function buildSearchArgs() {
5939
+ function buildSearchArgs(scope = "current") {
5935
5940
  return [
5936
5941
  "jira",
5937
5942
  "workitem",
5938
5943
  "search",
5939
5944
  "--jql",
5940
- JIRA_INBOX_JQL,
5945
+ JIRA_SCOPE_JQL[scope],
5941
5946
  "--fields",
5942
5947
  "key,summary,status,issuetype,priority,description",
5943
5948
  "--json",
5944
5949
  "--paginate",
5945
- "--limit",
5946
- "200"
5950
+ ...scope === "all" ? [] : ["--limit", "200"]
5947
5951
  ];
5948
5952
  }
5949
5953
  function buildViewArgs(key, pointFields = DEFAULT_POINT_FIELDS) {
@@ -6040,19 +6044,22 @@ function createJiraService(options) {
6040
6044
  const run3 = options.run ?? defaultAcliRunner;
6041
6045
  const authStatus = options.authStatus ?? (() => getJiraAuthStatus(run3));
6042
6046
  const now = options.now ?? Date.now;
6043
- let cache = null;
6047
+ const cache = /* @__PURE__ */ new Map();
6044
6048
  return {
6045
6049
  clear() {
6046
- cache = null;
6050
+ cache.clear();
6047
6051
  },
6048
6052
  async inbox(opts = {}) {
6049
6053
  const auth = await authStatus();
6050
6054
  if (!auth.installed) return { status: "acli-missing", fetchedAt: 0, tickets: [] };
6051
6055
  if (!auth.authenticated || !auth.site) return { status: "unauthenticated", fetchedAt: 0, tickets: [] };
6052
- if (cache && cache.site === auth.site && !opts.force && now() - cache.at < JIRA_CACHE_TTL_MS) return cache.value;
6056
+ const scope = opts.scope ?? "current";
6057
+ const cacheKey = `${auth.site}:${scope}`;
6058
+ const cached2 = cache.get(cacheKey);
6059
+ if (cached2 && !opts.force && now() - cached2.at < JIRA_CACHE_TTL_MS) return cached2.value;
6053
6060
  const at = now();
6054
6061
  const pointFields = options.pointFields?.() ?? DEFAULT_POINT_FIELDS;
6055
- const value = run3(buildSearchArgs()).then(async (output) => {
6062
+ const value = run3(buildSearchArgs(scope)).then(async (output) => {
6056
6063
  const detail = await enrichRows(searchRows(output), run3, pointFields);
6057
6064
  return {
6058
6065
  status: "ok",
@@ -6070,7 +6077,7 @@ function createJiraService(options) {
6070
6077
  tickets: [],
6071
6078
  error: String(err.stderr || err.message || err)
6072
6079
  }));
6073
- cache = { at, site: auth.site, value };
6080
+ cache.set(cacheKey, { at, value });
6074
6081
  return value;
6075
6082
  }
6076
6083
  };
@@ -7090,7 +7097,10 @@ function createCore({ sessions, bus, version, homeDir, ghRunner, githubAuthStatu
7090
7097
  },
7091
7098
  "jira:inbox": (payload) => {
7092
7099
  const p = payload === void 0 ? {} : obj(payload, "payload");
7093
- return jira.inbox({ force: p.force === true });
7100
+ if (p.scope !== void 0 && p.scope !== "current" && p.scope !== "sprint" && p.scope !== "all") {
7101
+ throw Object.assign(new Error("Invalid Jira scope"), { code: "INVALID_REQUEST" });
7102
+ }
7103
+ return jira.inbox({ force: p.force === true, scope: p.scope });
7094
7104
  },
7095
7105
  "env:detectAgents": () => detectAgents(),
7096
7106
  "agents:listModels": (payload) => {
@@ -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/3cafb8bddc730b60.css" as="style"/><link rel="stylesheet" href="/_next/static/css/3cafb8bddc730b60.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-33344f7100190436.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-2571a2564f593899.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/wiyRNf4HeW4AW-LhhYSsf/_buildManifest.js" defer=""></script><script src="/_next/static/wiyRNf4HeW4AW-LhhYSsf/_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":"wiyRNf4HeW4AW-LhhYSsf","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/f8f64877c884206d.css" as="style"/><link rel="stylesheet" href="/_next/static/css/f8f64877c884206d.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-33344f7100190436.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-2571a2564f593899.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/76irYAZpsrcN0YAWmxJ47/_buildManifest.js" defer=""></script><script src="/_next/static/76irYAZpsrcN0YAWmxJ47/_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":"76irYAZpsrcN0YAWmxJ47","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/3cafb8bddc730b60.css" as="style"/><link rel="stylesheet" href="/_next/static/css/3cafb8bddc730b60.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-33344f7100190436.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-2571a2564f593899.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/wiyRNf4HeW4AW-LhhYSsf/_buildManifest.js" defer=""></script><script src="/_next/static/wiyRNf4HeW4AW-LhhYSsf/_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":"wiyRNf4HeW4AW-LhhYSsf","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/f8f64877c884206d.css" as="style"/><link rel="stylesheet" href="/_next/static/css/f8f64877c884206d.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-33344f7100190436.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-2571a2564f593899.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/76irYAZpsrcN0YAWmxJ47/_buildManifest.js" defer=""></script><script src="/_next/static/76irYAZpsrcN0YAWmxJ47/_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":"76irYAZpsrcN0YAWmxJ47","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},__routerFilterDynamic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-8f65b0f8749f42d2.js"],"/home":["static/chunks/9296-f476f95a89709fef.js","static/chunks/pages/home-5e349dff04afe2eb.js"],sortedPages:["/_app","/_error","/home"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
1
+ self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},__routerFilterDynamic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-8f65b0f8749f42d2.js"],"/home":["static/chunks/9296-f476f95a89709fef.js","static/chunks/pages/home-307d0d7c49e4ee48.js"],sortedPages:["/_app","/_error","/home"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();