@kw-yeh/vibeflow 4.0.2 → 4.0.3
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 +14 -0
- package/dist/postinstall.mjs +57 -0
- package/dist/vibeflow.mjs +11 -6
- package/dist/web/404/index.html +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/home/index.html +1 -1
- package/package.json +4 -1
- /package/dist/web/_next/static/{2aQtkEcIfRS2Nbk-qwUwY → 0iT_99y5BhZs3U_2l_mSN}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{2aQtkEcIfRS2Nbk-qwUwY → 0iT_99y5BhZs3U_2l_mSN}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -82,6 +82,20 @@ vibeflow doctor
|
|
|
82
82
|
npm i -g @kw-yeh/vibeflow@latest
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
+
### 安裝時出現 `EACCES: permission denied`
|
|
86
|
+
|
|
87
|
+
代表 npm 的全域目錄屬於系統管理員(從 nodejs.org 下載安裝檔裝 Node 時常見)。建議不要用 `sudo`,改成讓全域套件裝在你自己的家目錄:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
mkdir -p ~/.npm-global
|
|
91
|
+
npm config set prefix ~/.npm-global
|
|
92
|
+
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.zshrc
|
|
93
|
+
source ~/.zshrc
|
|
94
|
+
npm i -g @kw-yeh/vibeflow@latest
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
用 Homebrew(`brew install node`)或 [nvm](https://github.com/nvm-sh/nvm) 裝的 Node 本來就不需要 `sudo`。已經用 `sudo` 裝好也能正常使用;若 `vibeflow doctor` 回報終端機模組沒有執行權限,照它列出的 `sudo chmod +x …` 指令執行一次即可。
|
|
98
|
+
|
|
85
99
|
---
|
|
86
100
|
|
|
87
101
|
## 常用指令
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createRequire as __vfCreateRequire } from 'node:module';
|
|
2
|
+
const require = __vfCreateRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
// packages/core/src/pty-helper.ts
|
|
5
|
+
import fs from "fs";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import { createRequire } from "module";
|
|
8
|
+
function nodePtyRoot() {
|
|
9
|
+
try {
|
|
10
|
+
return path.dirname(createRequire(import.meta.url).resolve("node-pty/package.json"));
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function ensurePtySpawnHelper(root = nodePtyRoot()) {
|
|
16
|
+
if (process.platform === "win32" || !root) return [];
|
|
17
|
+
const candidates = [
|
|
18
|
+
path.join(root, "build", "Release", "spawn-helper"),
|
|
19
|
+
path.join(root, "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper")
|
|
20
|
+
];
|
|
21
|
+
const failures = [];
|
|
22
|
+
for (const file of candidates) {
|
|
23
|
+
let stat;
|
|
24
|
+
try {
|
|
25
|
+
stat = fs.statSync(file);
|
|
26
|
+
} catch {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
fs.accessSync(file, fs.constants.X_OK);
|
|
31
|
+
continue;
|
|
32
|
+
} catch {
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
fs.chmodSync(file, stat.mode & 4095 | 73);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
const uid = process.getuid?.();
|
|
38
|
+
failures.push({ path: file, error: err.message, ownedByOther: uid !== void 0 && stat.uid !== uid });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return failures;
|
|
42
|
+
}
|
|
43
|
+
function spawnHelperFixCommand(failures) {
|
|
44
|
+
const sudo = failures.some((f) => f.ownedByOther) ? "sudo " : "";
|
|
45
|
+
return `${sudo}chmod +x ${failures.map((f) => `"${f.path}"`).join(" ")}`;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// packages/cli/src/postinstall.ts
|
|
49
|
+
try {
|
|
50
|
+
const failures = ensurePtySpawnHelper();
|
|
51
|
+
if (failures.length > 0) {
|
|
52
|
+
console.warn(`[vibeflow] node-pty spawn-helper \u7121\u6CD5\u8A2D\u70BA\u53EF\u57F7\u884C\uFF0C\u7D42\u7AEF\u6A5F\u6703\u7121\u6CD5\u555F\u52D5\u3002\u8ACB\u57F7\u884C\uFF1A
|
|
53
|
+
${spawnHelperFixCommand(failures)}`);
|
|
54
|
+
}
|
|
55
|
+
} catch (err) {
|
|
56
|
+
console.warn(`[vibeflow] postinstall \u7565\u904E\uFF1A${err.message}`);
|
|
57
|
+
}
|
package/dist/vibeflow.mjs
CHANGED
|
@@ -1899,9 +1899,9 @@ function ensurePtySpawnHelper(root = nodePtyRoot()) {
|
|
|
1899
1899
|
];
|
|
1900
1900
|
const failures = [];
|
|
1901
1901
|
for (const file of candidates) {
|
|
1902
|
-
let
|
|
1902
|
+
let stat;
|
|
1903
1903
|
try {
|
|
1904
|
-
|
|
1904
|
+
stat = fs4.statSync(file);
|
|
1905
1905
|
} catch {
|
|
1906
1906
|
continue;
|
|
1907
1907
|
}
|
|
@@ -1911,13 +1911,18 @@ function ensurePtySpawnHelper(root = nodePtyRoot()) {
|
|
|
1911
1911
|
} catch {
|
|
1912
1912
|
}
|
|
1913
1913
|
try {
|
|
1914
|
-
fs4.chmodSync(file, mode & 4095 | 73);
|
|
1914
|
+
fs4.chmodSync(file, stat.mode & 4095 | 73);
|
|
1915
1915
|
} catch (err) {
|
|
1916
|
-
|
|
1916
|
+
const uid = process.getuid?.();
|
|
1917
|
+
failures.push({ path: file, error: err.message, ownedByOther: uid !== void 0 && stat.uid !== uid });
|
|
1917
1918
|
}
|
|
1918
1919
|
}
|
|
1919
1920
|
return failures;
|
|
1920
1921
|
}
|
|
1922
|
+
function spawnHelperFixCommand(failures) {
|
|
1923
|
+
const sudo = failures.some((f) => f.ownedByOther) ? "sudo " : "";
|
|
1924
|
+
return `${sudo}chmod +x ${failures.map((f) => `"${f.path}"`).join(" ")}`;
|
|
1925
|
+
}
|
|
1921
1926
|
|
|
1922
1927
|
// packages/cli/src/task-command.ts
|
|
1923
1928
|
import { parseArgs } from "node:util";
|
|
@@ -5641,8 +5646,8 @@ async function checkNodePty() {
|
|
|
5641
5646
|
id: "node-pty",
|
|
5642
5647
|
name: "node-pty",
|
|
5643
5648
|
level: "fail",
|
|
5644
|
-
detail: `spawn-helper \u6C92\u6709\u57F7\u884C\u6B0A\u9650\uFF1A${unrepaired[0].error}`,
|
|
5645
|
-
fix: unrepaired
|
|
5649
|
+
detail: unrepaired.some((f) => f.ownedByOther) ? "spawn-helper \u6C92\u6709\u57F7\u884C\u6B0A\u9650\uFF0C\u800C\u4E14\u6A94\u6848\u5C6C\u65BC\u5176\u4ED6\u4F7F\u7528\u8005\uFF08\u901A\u5E38\u662F\u7528 sudo \u5168\u57DF\u5B89\u88DD\uFF09\uFF0CVibeFlow \u7121\u6CD5\u81EA\u884C\u4FEE\u6B63" : `spawn-helper \u6C92\u6709\u57F7\u884C\u6B0A\u9650\uFF1A${unrepaired[0].error}`,
|
|
5650
|
+
fix: spawnHelperFixCommand(unrepaired)
|
|
5646
5651
|
};
|
|
5647
5652
|
}
|
|
5648
5653
|
try {
|
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/edcc6abb24dfd492.css" as="style"/><link rel="stylesheet" href="/_next/static/css/edcc6abb24dfd492.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-320afeed07d86516.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/
|
|
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/edcc6abb24dfd492.css" as="style"/><link rel="stylesheet" href="/_next/static/css/edcc6abb24dfd492.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-320afeed07d86516.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/0iT_99y5BhZs3U_2l_mSN/_buildManifest.js" defer=""></script><script src="/_next/static/0iT_99y5BhZs3U_2l_mSN/_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":"0iT_99y5BhZs3U_2l_mSN","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/edcc6abb24dfd492.css" as="style"/><link rel="stylesheet" href="/_next/static/css/edcc6abb24dfd492.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-320afeed07d86516.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/
|
|
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/edcc6abb24dfd492.css" as="style"/><link rel="stylesheet" href="/_next/static/css/edcc6abb24dfd492.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-320afeed07d86516.js" defer=""></script><script src="/_next/static/chunks/pages/_error-8f65b0f8749f42d2.js" defer=""></script><script src="/_next/static/0iT_99y5BhZs3U_2l_mSN/_buildManifest.js" defer=""></script><script src="/_next/static/0iT_99y5BhZs3U_2l_mSN/_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":"0iT_99y5BhZs3U_2l_mSN","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
package/dist/web/home/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="">VibeFlow</title><link rel="preload" href="/_next/static/css/edcc6abb24dfd492.css" as="style"/><link rel="stylesheet" href="/_next/static/css/edcc6abb24dfd492.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-320afeed07d86516.js" defer=""></script><script src="/_next/static/chunks/4270-6c9c75303137e3a5.js" defer=""></script><script src="/_next/static/chunks/pages/home-efefddd4b88b018d.js" defer=""></script><script src="/_next/static/
|
|
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/edcc6abb24dfd492.css" as="style"/><link rel="stylesheet" href="/_next/static/css/edcc6abb24dfd492.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-320afeed07d86516.js" defer=""></script><script src="/_next/static/chunks/4270-6c9c75303137e3a5.js" defer=""></script><script src="/_next/static/chunks/pages/home-efefddd4b88b018d.js" defer=""></script><script src="/_next/static/0iT_99y5BhZs3U_2l_mSN/_buildManifest.js" defer=""></script><script src="/_next/static/0iT_99y5BhZs3U_2l_mSN/_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":"0iT_99y5BhZs3U_2l_mSN","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.0.
|
|
3
|
+
"version": "4.0.3",
|
|
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",
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
"bin": {
|
|
9
9
|
"vibeflow": "dist/vibeflow.mjs"
|
|
10
10
|
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"postinstall": "node dist/postinstall.mjs"
|
|
13
|
+
},
|
|
11
14
|
"files": [
|
|
12
15
|
"dist",
|
|
13
16
|
"README.md",
|
/package/dist/web/_next/static/{2aQtkEcIfRS2Nbk-qwUwY → 0iT_99y5BhZs3U_2l_mSN}/_buildManifest.js
RENAMED
|
File without changes
|
/package/dist/web/_next/static/{2aQtkEcIfRS2Nbk-qwUwY → 0iT_99y5BhZs3U_2l_mSN}/_ssgManifest.js
RENAMED
|
File without changes
|