@vibeflow-tools/cli 0.1.2 → 0.4.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.
- package/README.md +10 -6
- package/dist/chunk-BKTZSHJS.js +2 -0
- package/dist/cli/chunk-BKTZSHJS.js +2 -0
- package/dist/cli/files-3RDDXUOS.js +2 -0
- package/dist/cli/index.js +311 -180
- package/dist/client/kanban-browser.js +12 -12
- package/dist/client/kanban.css +1 -1
- package/dist/client/overlay-browser.js +31 -18
- package/dist/files-3RDDXUOS.js +2 -0
- package/dist/index.js +311 -180
- package/dist/overlay.css +13 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -54,14 +54,17 @@ vibeflow kanban # open the Kanban board
|
|
|
54
54
|
|
|
55
55
|
### 3. Hand to your agent
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
Give your AI agent one prompt. It claims the next task, implements it, and marks it for review — all through the CLI.
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
|
-
vibeflow tasks --
|
|
60
|
+
vibeflow tasks --next
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
> **The magic prompt for your agent:**
|
|
64
|
-
> *"Get new tasks
|
|
64
|
+
> *"Get new tasks and implement them, once done check again for new ones:*
|
|
65
|
+
> *`npx @vibeflow-tools/cli tasks --next`"*
|
|
66
|
+
|
|
67
|
+
`--next` atomically claims the highest-priority todo task (sets it in-progress), preventing two agents from picking the same task. Run it again after completing each task to get the next one.
|
|
65
68
|
|
|
66
69
|
---
|
|
67
70
|
|
|
@@ -79,11 +82,12 @@ vibeflow tasks --status todo
|
|
|
79
82
|
| Command | Description |
|
|
80
83
|
|---------|-------------|
|
|
81
84
|
| `vibeflow tasks` | List all tasks |
|
|
85
|
+
| `vibeflow tasks --next` | Claim the next todo task (sets in-progress, returns full task details) |
|
|
82
86
|
| `vibeflow tasks --status todo` | Filter to open tasks |
|
|
83
87
|
| `vibeflow tasks --type Bug` | Filter by type (Task, Bug, Feature, Enhancement, Research) |
|
|
84
88
|
| `vibeflow tasks --get <id>` | Full task detail with comments, file attachments, and linked commits |
|
|
85
89
|
| `vibeflow tasks --add --title "..." --description "..."` | Create a new task |
|
|
86
|
-
| `vibeflow tasks --edit <id> --set-status review --comment "..."` |
|
|
90
|
+
| `vibeflow tasks --edit <id> --set-status review --commit-message "..." --comment "..."` | Mark task as review, auto-commit staged files, add report |
|
|
87
91
|
| `vibeflow tasks --json` | Machine-readable JSON output |
|
|
88
92
|
|
|
89
93
|
**Task statuses:** backlog → todo → in-progress → review → done
|
|
@@ -111,8 +115,8 @@ vibeflow tasks --status todo
|
|
|
111
115
|
# Open the Kanban board
|
|
112
116
|
npx vibeflow kanban
|
|
113
117
|
|
|
114
|
-
# Tell your agent to implement open tasks
|
|
115
|
-
npx vibeflow tasks --
|
|
118
|
+
# Tell your agent to implement all open tasks (--next workflow)
|
|
119
|
+
npx vibeflow tasks --next
|
|
116
120
|
```
|
|
117
121
|
|
|
118
122
|
---
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{readdirSync as M,writeFileSync as H,readFileSync as K,unlinkSync as x,statSync as R,mkdirSync as G,existsSync as c}from"fs";import{join as f,basename as b}from"path";var d=".vibeflow",C="tasks";var k="tasks/files",P="tasks/screenshots",Z="config.json";import{existsSync as m,readFileSync as N,writeFileSync as z,mkdirSync as p,readdirSync as S,unlinkSync as v,renameSync as I}from"fs";import{join as l,extname as O}from"path";import{randomBytes as V}from"crypto";var B=["backlog","todo","in-progress","review","done"];function W(){return V(15).toString("hex")}function h(t){return l(t,d,C)}function U(t){let n=l(t,d),e=l(n,"files"),i=l(n,k),s=l(n,"screenshots"),r=l(n,P);if(m(e)){p(i,{recursive:!0});for(let o of S(e)){let a=l(e,o),u=l(i,o);if(!m(u))try{I(a,u)}catch{}}}if(m(s)){p(r,{recursive:!0});for(let o of S(s)){let a=l(s,o),u=l(r,o);if(!m(u))try{I(a,u)}catch{}}}}function rt(t){U(t),p(h(t),{recursive:!0}),p(l(t,d,P),{recursive:!0})}function E(t){return t.slice(0,10)}function j(t,n,e){let i=h(t);return e?l(i,E(e),`${n}.json`):l(i,`${n}.json`)}function T(t,n){let e=h(t);if(!m(e))return null;for(let i of S(e,{withFileTypes:!0}))if(i.isDirectory()){let s=l(e,i.name,`${n}.json`);if(m(s))return s}else if(i.name===`${n}.json`)return l(e,i.name);return null}function J(t){let n=(()=>{if(typeof t.type!="string")return;let e=t.type.trim();if(!(!e||e==="[object Object]"))return e})();return{id:String(t.id??""),title:String(t.title??"Untitled"),description:String(t.description??""),status:B.includes(t.status)?t.status:"todo",url:t.url?String(t.url):void 0,selector:(()=>{let e=String(t.selector??"/");return t.file&&!t.cssSelector&&e.startsWith(String(t.file))?t.url?String(t.url):"/":e})(),cssSelector:t.cssSelector&&String(t.cssSelector)!==String(t.selector??"/")?String(t.cssSelector):void 0,file:t.file?String(t.file):void 0,line:t.line!=null?Number(t.line):void 0,col:t.col!=null?Number(t.col):void 0,component:t.component?String(t.component):void 0,type:n,priority:t.priority?String(t.priority):void 0,...t.reportBack===!0&&{reportBack:!0},agent:t.agent?String(t.agent):void 0,model:t.model?String(t.model):void 0,author:t.author?String(t.author):void 0,commit:t.commit?String(t.commit):void 0,commits:Array.isArray(t.commits)?t.commits.map(e=>({sha:String(e.sha??""),message:String(e.message??""),timestamp:String(e.timestamp??new Date().toISOString())})):void 0,created:String(t.created??new Date().toISOString()),updated:t.updated?String(t.updated):void 0,comments:Array.isArray(t.comments)?t.comments.map(e=>({...e,text:e.text??e.content??""})):[],files:Array.isArray(t.files)?t.files.map(e=>typeof e=="string"?{name:e,addedAt:new Date().toISOString()}:{name:String(e.name??""),addedAt:String(e.addedAt??new Date().toISOString()),linkedPath:e.linkedPath?String(e.linkedPath):void 0,mimeType:e.mimeType?String(e.mimeType):void 0}).filter(e=>e.name):[],screenshot:t.screenshot?String(t.screenshot):void 0,annotatedElementText:t.annotatedElementText?String(t.annotatedElementText):void 0,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e=="string"&&e.length>0):void 0}}function _(t,n){let e=l(h(t),E(n.created));p(e,{recursive:!0});let i=l(e,`${n.id}.json`);z(i,JSON.stringify(n,null,2),"utf-8")}function st(t,n){let e=(()=>{let s=(n.priority??"").trim().toLowerCase();return s==="critical"?"Critical":s==="high"?"High":s==="low"?"Low":"Medium"})(),i={...n,priority:e,id:W(),created:new Date().toISOString(),comments:[],files:[]};return _(t,i),i}function y(t){try{let n=N(t,"utf-8");if(t.endsWith(".json")){let e=JSON.parse(n);return!e||typeof e!="object"||!("id"in e)?null:J(e)}return null}catch{return null}}function $(t){let n=h(t);if(!m(n))return[];let e=[];for(let i of S(n,{withFileTypes:!0}))if(i.isDirectory()){let s=l(n,i.name);for(let r of S(s))if(O(r)===".json"){let o=l(s,r),a=y(o);a&&e.push({task:a,filePath:o})}}else if(O(i.name)===".json"){let s=l(n,i.name),r=y(s);r&&e.push({task:r,filePath:s})}return e.sort((i,s)=>{let r=i.task.updated??i.task.created,o=s.task.updated??s.task.created;return new Date(o).getTime()-new Date(r).getTime()})}function ot(t){return $(t).map(({task:n})=>n)}function at(t){return $(t).map(({task:n,filePath:e})=>({...n,filePath:e}))}function L(t,n,e){let i=T(t,n),s=i?y(i):null;if(!s)return null;let r={...s,...e,updated:new Date().toISOString()};if(_(t,r),i&&i!==j(t,n,r.created))try{v(i)}catch{}return r}function lt(t,n){let e=T(t,n);return e?(v(e),!0):!1}function ut(t,n,e){return{id:t.id,status:t.status,title:t.title,description:t.description,...t.url&&{url:t.url},selector:t.selector,...t.file&&{file:t.file},...t.line!=null&&{line:t.line},...t.col!=null&&{col:t.col},...t.component&&{component:t.component},...t.type&&{type:t.type},...t.priority&&{priority:t.priority},...n&&n.length>0&&{structuredComments:n},...e&&e.length>0&&{linkedFiles:e},...t.reportBack&&{reportBack:!0},created:t.created}}var A=".linked.json";function g(t,n){return f(t,d,k,n)}function q(t,n){G(g(t,n),{recursive:!0})}function Q(t,n){let e=f(g(t,n),A);if(!c(e))return[];try{return JSON.parse(K(e,"utf-8"))}catch{return[]}}function X(t,n){let e=T(t,n),i=e?y(e):null;return!i?.files||i.files.length===0?[]:i.files}function D(t,n,e){L(t,n,{files:e})}function F(t,n){let e=X(t,n),i=f(g(t,n),A);if(!c(i))return e;let s=Q(t,n);if(s.length===0){try{x(i)}catch{}return e}let r=e.slice(),o=!1;for(let a of s)r.find(u=>u.linkedPath===a.path||u.name===a.name&&u.linkedPath)||(r.push({name:a.name,linkedPath:a.path,addedAt:new Date().toISOString()}),o=!0);o&&D(t,n,r);try{x(i)}catch{}return r}function Y(t,n){let e=g(t,n),i=F(t,n),s=new Map;for(let r of i){if(r.linkedPath&&c(r.linkedPath)){let a=R(r.linkedPath);s.set(r.name,{name:r.name,size:a.size,url:`/api/tasks/${n}/files/${encodeURIComponent(r.name)}`,linkedPath:r.linkedPath,createdAt:a.mtime.toISOString()});continue}let o=f(e,r.name);if(c(o)){let a=R(o);s.set(r.name,{name:r.name,size:a.size,url:`/api/tasks/${n}/files/${encodeURIComponent(r.name)}`,createdAt:a.mtime.toISOString()})}}if(c(e))for(let r of M(e,{withFileTypes:!0})){if(!r.isFile()||r.name===A||s.has(r.name))continue;let o=f(e,r.name),a=R(o);s.set(r.name,{name:r.name,size:a.size,url:`/api/tasks/${n}/files/${encodeURIComponent(r.name)}`,createdAt:a.mtime.toISOString()})}return Array.from(s.values())}function St(t,n,e,i){let s=b(e);q(t,n),H(f(g(t,n),s),i);let r=F(t,n);return r.find(o=>o.name===s&&!o.linkedPath)||(r.push({name:s,addedAt:new Date().toISOString()}),D(t,n,r)),{name:s,size:i.length,url:`/api/tasks/${n}/files/${encodeURIComponent(s)}`}}function yt(t,n,e){let i=b(e),s=F(t,n),r=s.findIndex(a=>a.name===i);if(r!==-1){let[a]=s.splice(r,1);if(D(t,n,s),a&&!a.linkedPath){let u=f(g(t,n),i);c(u)&&x(u)}return!0}let o=f(g(t,n),i);return c(o)?(x(o),!0):!1}function ht(t,n,e){let i=b(e),s=F(t,n).find(o=>o.name===i&&o.linkedPath);if(s?.linkedPath&&c(s.linkedPath))return s.linkedPath;let r=f(g(t,n),i);return c(r)?r:null}function kt(t,n){return Y(t,n).length}export{d as a,P as b,Z as c,W as d,rt as e,j as f,T as g,st as h,y as i,ot as j,at as k,L as l,lt as m,ut as n,g as o,q as p,Y as q,St as r,yt as s,ht as t,kt as u};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{readdirSync as M,writeFileSync as H,readFileSync as K,unlinkSync as x,statSync as R,mkdirSync as G,existsSync as c}from"fs";import{join as f,basename as b}from"path";var d=".vibeflow",C="tasks";var k="tasks/files",P="tasks/screenshots",Z="config.json";import{existsSync as m,readFileSync as N,writeFileSync as z,mkdirSync as p,readdirSync as S,unlinkSync as v,renameSync as I}from"fs";import{join as l,extname as O}from"path";import{randomBytes as V}from"crypto";var B=["backlog","todo","in-progress","review","done"];function W(){return V(15).toString("hex")}function h(t){return l(t,d,C)}function U(t){let n=l(t,d),e=l(n,"files"),i=l(n,k),s=l(n,"screenshots"),r=l(n,P);if(m(e)){p(i,{recursive:!0});for(let o of S(e)){let a=l(e,o),u=l(i,o);if(!m(u))try{I(a,u)}catch{}}}if(m(s)){p(r,{recursive:!0});for(let o of S(s)){let a=l(s,o),u=l(r,o);if(!m(u))try{I(a,u)}catch{}}}}function rt(t){U(t),p(h(t),{recursive:!0}),p(l(t,d,P),{recursive:!0})}function E(t){return t.slice(0,10)}function j(t,n,e){let i=h(t);return e?l(i,E(e),`${n}.json`):l(i,`${n}.json`)}function T(t,n){let e=h(t);if(!m(e))return null;for(let i of S(e,{withFileTypes:!0}))if(i.isDirectory()){let s=l(e,i.name,`${n}.json`);if(m(s))return s}else if(i.name===`${n}.json`)return l(e,i.name);return null}function J(t){let n=(()=>{if(typeof t.type!="string")return;let e=t.type.trim();if(!(!e||e==="[object Object]"))return e})();return{id:String(t.id??""),title:String(t.title??"Untitled"),description:String(t.description??""),status:B.includes(t.status)?t.status:"todo",url:t.url?String(t.url):void 0,selector:(()=>{let e=String(t.selector??"/");return t.file&&!t.cssSelector&&e.startsWith(String(t.file))?t.url?String(t.url):"/":e})(),cssSelector:t.cssSelector&&String(t.cssSelector)!==String(t.selector??"/")?String(t.cssSelector):void 0,file:t.file?String(t.file):void 0,line:t.line!=null?Number(t.line):void 0,col:t.col!=null?Number(t.col):void 0,component:t.component?String(t.component):void 0,type:n,priority:t.priority?String(t.priority):void 0,...t.reportBack===!0&&{reportBack:!0},agent:t.agent?String(t.agent):void 0,model:t.model?String(t.model):void 0,author:t.author?String(t.author):void 0,commit:t.commit?String(t.commit):void 0,commits:Array.isArray(t.commits)?t.commits.map(e=>({sha:String(e.sha??""),message:String(e.message??""),timestamp:String(e.timestamp??new Date().toISOString())})):void 0,created:String(t.created??new Date().toISOString()),updated:t.updated?String(t.updated):void 0,comments:Array.isArray(t.comments)?t.comments.map(e=>({...e,text:e.text??e.content??""})):[],files:Array.isArray(t.files)?t.files.map(e=>typeof e=="string"?{name:e,addedAt:new Date().toISOString()}:{name:String(e.name??""),addedAt:String(e.addedAt??new Date().toISOString()),linkedPath:e.linkedPath?String(e.linkedPath):void 0,mimeType:e.mimeType?String(e.mimeType):void 0}).filter(e=>e.name):[],screenshot:t.screenshot?String(t.screenshot):void 0,annotatedElementText:t.annotatedElementText?String(t.annotatedElementText):void 0,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e=="string"&&e.length>0):void 0}}function _(t,n){let e=l(h(t),E(n.created));p(e,{recursive:!0});let i=l(e,`${n.id}.json`);z(i,JSON.stringify(n,null,2),"utf-8")}function st(t,n){let e=(()=>{let s=(n.priority??"").trim().toLowerCase();return s==="critical"?"Critical":s==="high"?"High":s==="low"?"Low":"Medium"})(),i={...n,priority:e,id:W(),created:new Date().toISOString(),comments:[],files:[]};return _(t,i),i}function y(t){try{let n=N(t,"utf-8");if(t.endsWith(".json")){let e=JSON.parse(n);return!e||typeof e!="object"||!("id"in e)?null:J(e)}return null}catch{return null}}function $(t){let n=h(t);if(!m(n))return[];let e=[];for(let i of S(n,{withFileTypes:!0}))if(i.isDirectory()){let s=l(n,i.name);for(let r of S(s))if(O(r)===".json"){let o=l(s,r),a=y(o);a&&e.push({task:a,filePath:o})}}else if(O(i.name)===".json"){let s=l(n,i.name),r=y(s);r&&e.push({task:r,filePath:s})}return e.sort((i,s)=>{let r=i.task.updated??i.task.created,o=s.task.updated??s.task.created;return new Date(o).getTime()-new Date(r).getTime()})}function ot(t){return $(t).map(({task:n})=>n)}function at(t){return $(t).map(({task:n,filePath:e})=>({...n,filePath:e}))}function L(t,n,e){let i=T(t,n),s=i?y(i):null;if(!s)return null;let r={...s,...e,updated:new Date().toISOString()};if(_(t,r),i&&i!==j(t,n,r.created))try{v(i)}catch{}return r}function lt(t,n){let e=T(t,n);return e?(v(e),!0):!1}function ut(t,n,e){return{id:t.id,status:t.status,title:t.title,description:t.description,...t.url&&{url:t.url},selector:t.selector,...t.file&&{file:t.file},...t.line!=null&&{line:t.line},...t.col!=null&&{col:t.col},...t.component&&{component:t.component},...t.type&&{type:t.type},...t.priority&&{priority:t.priority},...n&&n.length>0&&{structuredComments:n},...e&&e.length>0&&{linkedFiles:e},...t.reportBack&&{reportBack:!0},created:t.created}}var A=".linked.json";function g(t,n){return f(t,d,k,n)}function q(t,n){G(g(t,n),{recursive:!0})}function Q(t,n){let e=f(g(t,n),A);if(!c(e))return[];try{return JSON.parse(K(e,"utf-8"))}catch{return[]}}function X(t,n){let e=T(t,n),i=e?y(e):null;return!i?.files||i.files.length===0?[]:i.files}function D(t,n,e){L(t,n,{files:e})}function F(t,n){let e=X(t,n),i=f(g(t,n),A);if(!c(i))return e;let s=Q(t,n);if(s.length===0){try{x(i)}catch{}return e}let r=e.slice(),o=!1;for(let a of s)r.find(u=>u.linkedPath===a.path||u.name===a.name&&u.linkedPath)||(r.push({name:a.name,linkedPath:a.path,addedAt:new Date().toISOString()}),o=!0);o&&D(t,n,r);try{x(i)}catch{}return r}function Y(t,n){let e=g(t,n),i=F(t,n),s=new Map;for(let r of i){if(r.linkedPath&&c(r.linkedPath)){let a=R(r.linkedPath);s.set(r.name,{name:r.name,size:a.size,url:`/api/tasks/${n}/files/${encodeURIComponent(r.name)}`,linkedPath:r.linkedPath,createdAt:a.mtime.toISOString()});continue}let o=f(e,r.name);if(c(o)){let a=R(o);s.set(r.name,{name:r.name,size:a.size,url:`/api/tasks/${n}/files/${encodeURIComponent(r.name)}`,createdAt:a.mtime.toISOString()})}}if(c(e))for(let r of M(e,{withFileTypes:!0})){if(!r.isFile()||r.name===A||s.has(r.name))continue;let o=f(e,r.name),a=R(o);s.set(r.name,{name:r.name,size:a.size,url:`/api/tasks/${n}/files/${encodeURIComponent(r.name)}`,createdAt:a.mtime.toISOString()})}return Array.from(s.values())}function St(t,n,e,i){let s=b(e);q(t,n),H(f(g(t,n),s),i);let r=F(t,n);return r.find(o=>o.name===s&&!o.linkedPath)||(r.push({name:s,addedAt:new Date().toISOString()}),D(t,n,r)),{name:s,size:i.length,url:`/api/tasks/${n}/files/${encodeURIComponent(s)}`}}function yt(t,n,e){let i=b(e),s=F(t,n),r=s.findIndex(a=>a.name===i);if(r!==-1){let[a]=s.splice(r,1);if(D(t,n,s),a&&!a.linkedPath){let u=f(g(t,n),i);c(u)&&x(u)}return!0}let o=f(g(t,n),i);return c(o)?(x(o),!0):!1}function ht(t,n,e){let i=b(e),s=F(t,n).find(o=>o.name===i&&o.linkedPath);if(s?.linkedPath&&c(s.linkedPath))return s.linkedPath;let r=f(g(t,n),i);return c(r)?r:null}function kt(t,n){return Y(t,n).length}export{d as a,P as b,Z as c,W as d,rt as e,j as f,T as g,st as h,y as i,ot as j,at as k,L as l,lt as m,ut as n,g as o,q as p,Y as q,St as r,yt as s,ht as t,kt as u};
|