@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 +1 -1
- package/dist/vibeflow.mjs +20 -10
- package/dist/web/404/index.html +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/_next/static/{wiyRNf4HeW4AW-LhhYSsf → 76irYAZpsrcN0YAWmxJ47}/_buildManifest.js +1 -1
- package/dist/web/_next/static/chunks/pages/{home-5e349dff04afe2eb.js → home-307d0d7c49e4ee48.js} +7 -7
- package/dist/web/_next/static/css/{3cafb8bddc730b60.css → f8f64877c884206d.css} +1 -1
- package/dist/web/home/index.html +1 -1
- package/package.json +1 -1
- /package/dist/web/_next/static/{wiyRNf4HeW4AW-LhhYSsf → 76irYAZpsrcN0YAWmxJ47}/_ssgManifest.js +0 -0
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
|
|
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
|
-
|
|
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
|
-
|
|
6047
|
+
const cache = /* @__PURE__ */ new Map();
|
|
6044
6048
|
return {
|
|
6045
6049
|
clear() {
|
|
6046
|
-
cache
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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) => {
|
package/dist/web/404/index.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/
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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/
|
|
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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";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/_next/static/{wiyRNf4HeW4AW-LhhYSsf → 76irYAZpsrcN0YAWmxJ47}/_buildManifest.js
RENAMED
|
@@ -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-
|
|
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();
|