@devflow-tools/devflow 0.16.34 → 0.17.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.
Files changed (58) hide show
  1. package/dist/cli.js +51 -51
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/accuracy.html +1 -1
  4. package/dist/dashboard/accuracy.txt +1 -1
  5. package/dist/dashboard/benchmark.html +1 -1
  6. package/dist/dashboard/benchmark.txt +1 -1
  7. package/dist/dashboard/context.html +1 -1
  8. package/dist/dashboard/context.txt +1 -1
  9. package/dist/dashboard/doctor.html +1 -1
  10. package/dist/dashboard/doctor.txt +1 -1
  11. package/dist/dashboard/executions.html +1 -1
  12. package/dist/dashboard/executions.txt +1 -1
  13. package/dist/dashboard/graph.html +1 -1
  14. package/dist/dashboard/graph.txt +1 -1
  15. package/dist/dashboard/index.html +1 -1
  16. package/dist/dashboard/index.txt +1 -1
  17. package/dist/dashboard/knowledge.html +1 -1
  18. package/dist/dashboard/knowledge.txt +1 -1
  19. package/dist/dashboard/memory.html +1 -1
  20. package/dist/dashboard/memory.txt +1 -1
  21. package/dist/dashboard/replay.html +1 -1
  22. package/dist/dashboard/replay.txt +1 -1
  23. package/dist/dashboard/runs/_.html +1 -1
  24. package/dist/dashboard/runs/_.txt +1 -1
  25. package/dist/dashboard/runs.html +1 -1
  26. package/dist/dashboard/runs.txt +1 -1
  27. package/dist/dashboard/settings.html +1 -1
  28. package/dist/dashboard/settings.txt +1 -1
  29. package/dist/dashboard/timeline.html +1 -1
  30. package/dist/dashboard/timeline.txt +1 -1
  31. package/dist/dashboard/tool-metrics.html +1 -1
  32. package/dist/dashboard/tool-metrics.txt +1 -1
  33. package/dist/dashboard/workflows.html +1 -1
  34. package/dist/dashboard/workflows.txt +1 -1
  35. package/dist/hooks/hook-daemon.js +28 -26
  36. package/dist/hooks/post-tool-use-failure.js +2 -2
  37. package/dist/hooks/post-tool-use.js +5 -5
  38. package/dist/hooks/pre-tool-use.js +3 -3
  39. package/dist/hooks/server-bootstrap.js +22 -22
  40. package/dist/hooks/session-end.js +6 -4
  41. package/dist/hooks/stop.js +10 -10
  42. package/dist/hooks/user-prompt-submit.js +13 -13
  43. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  44. package/dist/plugin/dist/command-registry.json +128 -24
  45. package/dist/plugin/dist/hooks/hook-daemon.js +28 -26
  46. package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
  47. package/dist/plugin/dist/hooks/post-tool-use.js +5 -5
  48. package/dist/plugin/dist/hooks/pre-tool-use.js +3 -3
  49. package/dist/plugin/dist/hooks/server-bootstrap.js +22 -22
  50. package/dist/plugin/dist/hooks/session-end.js +6 -4
  51. package/dist/plugin/dist/hooks/stop.js +10 -10
  52. package/dist/plugin/dist/hooks/user-prompt-submit.js +13 -13
  53. package/dist/plugin/package.json +10 -10
  54. package/dist/scripts/audit-session-data.js +8 -8
  55. package/package.json +12 -12
  56. package/plugin-registry.json +29 -29
  57. /package/dist/dashboard/_next/static/{MGvblRnurBd_fK7rfcjlq → vLBS6YwOIH800-9cFmHU7}/_buildManifest.js +0 -0
  58. /package/dist/dashboard/_next/static/{MGvblRnurBd_fK7rfcjlq → vLBS6YwOIH800-9cFmHU7}/_ssgManifest.js +0 -0
@@ -1,14 +1,14 @@
1
- import {execFileSync}from'node:child_process';import {createRequire}from'node:module';import {existsSync,readdirSync,readFileSync}from'node:fs';import {homedir}from'node:os';import {join}from'node:path';var I=6e4,E;function N(){if(E)return E;let e=createRequire(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("audit-session-data requires Node.js with node:sqlite (Node.js >=22.13.0)");return E=e.DatabaseSync,E}function V(e){let t,n,o=false;for(let i=0;i<e.length;i+=1){let l=e[i];if(l==="--json")o=true;else if(l==="--project")t=e[++i];else if(l==="--session")n=e[++i];else throw new Error(`Unknown argument: ${l}`)}if(!t)throw new Error("--project is required");if(!n)throw new Error("--session is required");return {project:t,session:n,json:o}}function a(e){return typeof e=="string"&&e.length>0?e:null}function j(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function S(e){return e===true||e===1}function c(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type IN ('table', 'view') AND name = ?").get(t)}function h(e,t,n){return c(e,t)?e.prepare(`PRAGMA table_info(${t})`).all().some(o=>o.name===n):false}function R(e,t,n=[]){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function T(e){if(typeof e!="string"||e.length===0)return e??null;try{return JSON.parse(e)}catch{return e}}function L(e){let t=T(e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]}function w(e){return e===null||typeof e!="object"?JSON.stringify(e)??String(e):Array.isArray(e)?`[${e.map(w).join(",")}]`:`{${Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>`${JSON.stringify(t)}:${w(n)}`).join(",")}}`}function q(e){return w({tool:e.tool,command:e.command,kind:e.kind,input:e.input})}function $(e){let t=new Map;for(let n of e){if(n.toolUseId){let l=`tool_use_id:${n.toolUseId}`,u=t.get(l)??{reason:"canonical_tool_use_id",events:[]};u.events.push(n),t.set(l,u);continue}let o=`payload:${q(n)}`,i=t.get(o)??{reason:"normalized_payload",events:[]};i.events.push(n),t.set(o,i);}return [...t.entries()].map(([n,o])=>{let i=o.events.map(u=>u.timestamp).filter(u=>u!==null),l=i.length>1?Math.max(...i)-Math.min(...i):null;return {key:n,reason:o.reason,count:o.events.length,eventIds:o.events.map(u=>u.id),timeSpanMs:l,tool:o.events[0]?.tool??null}}).filter(n=>n.count>1&&(n.reason==="canonical_tool_use_id"||n.timeSpanMs===null||n.timeSpanMs<=I)).sort((n,o)=>o.count-n.count||n.key.localeCompare(o.key))}function x(e){return existsSync(e)?new(N())(e,{readOnly:true,timeout:1e3}):null}function U(e,t){if(!existsSync(e))return {path:e,exists:false,sessions:[],executions:[],events:[],duplicateCandidates:[],hookFallbacks:[],memoryTurns:[]};let n=null;try{if(n=x(e),!n)return {path:e,exists:!1,sessions:[],executions:[],events:[],duplicateCandidates:[],hookFallbacks:[],memoryTurns:[]};let o=c(n,"sessions")?n.prepare("SELECT * FROM sessions WHERE id = ?").all(t):[],i=h(n,"skill_executions","session_id"),l=c(n,"skill_executions")?n.prepare(i?"SELECT * FROM skill_executions WHERE session_id = ? OR execution_id = ? ORDER BY started_at":"SELECT * FROM skill_executions WHERE execution_id = ? ORDER BY started_at").all(...i?[t,t]:[t]):[],u=l.map(s=>a(s.execution_id)).filter(s=>s!==null),p=h(n,"tool_call_events","tool_use_id"),m=h(n,"tool_call_events","session_id"),y=h(n,"tool_call_events","kind"),g=u.length>0?`execution_id IN (${u.map(()=>"?").join(",")})`:"execution_id = ?",C=u.length>0?u:[t],k=(c(n,"tool_call_events")?n.prepare(`SELECT * FROM tool_call_events WHERE ${m?"session_id = ? OR ":""}${g} ORDER BY timestamp`).all(...m?[t,...C]:C):[]).map(s=>({id:a(s.event_id)??"unknown",sessionId:a(s.session_id),executionId:a(s.execution_id),timestamp:j(s.timestamp),tool:a(s.tool_name),toolType:a(s.tool_type),toolUseId:p?a(s.tool_use_id):null,input:T(s.input),command:null,kind:y?a(s.kind):null,fallback:S(s.mcp_fallback),failed:a(s.error)!==null&&!S(s.blocked),blocked:S(s.blocked),processed:!1})),r=c(n,"devflow_hook_fallbacks")?n.prepare("SELECT * FROM devflow_hook_fallbacks WHERE session_id = ? ORDER BY created_at").all(t):[],f=c(n,"devflow_memory_turns")?n.prepare("SELECT * FROM devflow_memory_turns WHERE session_id = ? ORDER BY created_at").all(t):[];return {path:e,exists:!0,sessions:o,executions:l,events:k,duplicateCandidates:$(k),hookFallbacks:r,memoryTurns:f}}catch(o){return {path:e,exists:true,sessions:[],executions:[],events:[],duplicateCandidates:[],hookFallbacks:[],memoryTurns:[],error:o instanceof Error?o.message:String(o)}}finally{n?.close();}}function W(e,t){let n=join(e,".devflow","memory","memories.db"),o={databasePath:n,session:null,eventCount:0,processedEventCount:0,pendingEventCount:0,eventsByTool:[],duplicateCandidates:[],projectObservationCount:0,quarantinedObservationCount:0,supersededObservationCount:0,sessionObservationCount:0,sessionObservationVectorCount:0,projectObservationVectorCount:0,pendingLeaseCount:0,distillReceiptIds:[],activeSessionCount:0};if(!existsSync(n))return o;let i=null;try{if(i=x(n),!i)return o;let u=(c(i,"session_events")?i.prepare("SELECT * FROM session_events WHERE session_id = ? ORDER BY created_at").all(t):[]).map(r=>({id:a(r.id)??"unknown",sessionId:a(r.session_id),executionId:null,timestamp:j(r.created_at),tool:a(r.tool),toolType:null,toolUseId:null,input:T(r.payload),command:a(r.command),kind:a(r.kind),fallback:!1,failed:!1,blocked:!1,processed:S(r.processed)})),p=c(i,"observations")?i.prepare(`
1
+ import {execFileSync}from'node:child_process';import {createRequire}from'node:module';import {existsSync,readdirSync,readFileSync}from'node:fs';import {homedir}from'node:os';import {join}from'node:path';var ne=6e4,A;function te(){if(A)return A;let e=createRequire(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("audit-session-data requires Node.js with node:sqlite (Node.js >=22.13.0)");return A=e.DatabaseSync,A}function se(e){let t,n,s=false,o=false;for(let c=0;c<e.length;c+=1){let u=e[c];if(u==="--json")s=true;else if(u==="--strict")o=true;else if(u==="--project")t=e[++c];else if(u==="--session")n=e[++c];else throw new Error(`Unknown argument: ${u}`)}if(!t)throw new Error("--project is required");if(!n)throw new Error("--session is required");return {project:t,session:n,json:s,strict:o}}function i(e){return typeof e=="string"&&e.length>0?e:null}function j(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function F(e){return e===true||e===1}function p(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type IN ('table', 'view') AND name = ?").get(t)}function M(e,t,n){return p(e,t)?e.prepare(`PRAGMA table_info(${t})`).all().some(s=>s.name===n):false}function D(e,t,n=[]){let s=e.prepare(t).get(...n);return Number(s?.count??0)}function W(e){if(typeof e!="string"||e.length===0)return e??null;try{return JSON.parse(e)}catch{return e}}function X(e){let t=W(e);return Array.isArray(t)?t.filter(n=>typeof n=="string"):[]}function L(e){return e===null||typeof e!="object"?JSON.stringify(e)??String(e):Array.isArray(e)?`[${e.map(L).join(",")}]`:`{${Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>`${JSON.stringify(t)}:${L(n)}`).join(",")}}`}function oe(e){return L({tool:e.tool,command:e.command,kind:e.kind,input:e.input})}function U(e){let t=new Map;for(let n of e){if(n.toolUseId){let c=`tool_use_id:${n.toolUseId}`,u=t.get(c)??{reason:"canonical_tool_use_id",events:[]};u.events.push(n),t.set(c,u);continue}let s=`payload:${oe(n)}`,o=t.get(s)??{reason:"normalized_payload",events:[]};o.events.push(n),t.set(s,o);}return [...t.entries()].map(([n,s])=>{let o=s.events.map(u=>u.timestamp).filter(u=>u!==null),c=o.length>1?Math.max(...o)-Math.min(...o):null;return {key:n,reason:s.reason,count:s.events.length,eventIds:s.events.map(u=>u.id),timeSpanMs:c,tool:s.events[0]?.tool??null}}).filter(n=>n.count>1&&(n.reason==="canonical_tool_use_id"||n.timeSpanMs===null||n.timeSpanMs<=ne)).sort((n,s)=>s.count-n.count||n.key.localeCompare(s.key))}function H(e){return existsSync(e)?new(te())(e,{readOnly:true,timeout:1e3}):null}function P(e,t,n){return {path:e,exists:t,sessions:[],executions:[],events:[],duplicateCandidates:[],hookFallbacks:[],memoryTurns:[],intentArtifacts:[],queryPlans:[],toolNameResolutions:[],terminalTransitions:[],transcriptCheckpoints:[],retrievalLedger:[],...n?{error:n}:{}}}function ie(e,t,n){if(!existsSync(e))return P(e,false);let s=null;try{if(s=H(e),!s)return P(e,!1);let o=p(s,"sessions")?s.prepare("SELECT * FROM sessions WHERE id = ?").all(n):[],c=M(s,"skill_executions","session_id"),u=p(s,"skill_executions")?s.prepare(c?"SELECT * FROM skill_executions WHERE session_id = ? OR execution_id = ? ORDER BY started_at":"SELECT * FROM skill_executions WHERE execution_id = ? ORDER BY started_at").all(...c?[n,n]:[n]):[],f=u.map(d=>i(d.execution_id)).filter(d=>d!==null),y=M(s,"tool_call_events","tool_use_id"),b=M(s,"tool_call_events","session_id"),g=M(s,"tool_call_events","kind"),m=f.length>0?`execution_id IN (${f.map(()=>"?").join(",")})`:"execution_id = ?",E=f.length>0?f:[n],a=(p(s,"tool_call_events")?s.prepare(`SELECT * FROM tool_call_events WHERE ${b?"session_id = ? OR ":""}${m} ORDER BY timestamp`).all(...b?[n,...E]:E):[]).map(d=>({id:i(d.event_id)??"unknown",sessionId:i(d.session_id),executionId:i(d.execution_id),timestamp:j(d.timestamp),tool:i(d.tool_name),toolType:i(d.tool_type),toolUseId:y?i(d.tool_use_id):null,input:W(d.input),command:null,kind:g?i(d.kind):null,fallback:F(d.mcp_fallback),failed:i(d.error)!==null&&!F(d.blocked),blocked:F(d.blocked),processed:!1})),_=p(s,"devflow_hook_fallbacks")?s.prepare("SELECT * FROM devflow_hook_fallbacks WHERE session_id = ? ORDER BY created_at").all(n):[],S=p(s,"devflow_memory_turns")?s.prepare("SELECT * FROM devflow_memory_turns WHERE session_id = ? ORDER BY created_at").all(n):[],k=(d,r)=>p(s,d)?s.prepare(`SELECT * FROM ${d} WHERE project_root = ? AND session_id = ? ORDER BY ${r}`).all(t,n):[];return {path:e,exists:!0,sessions:o,executions:u,events:a,duplicateCandidates:U(a),hookFallbacks:_,memoryTurns:S,intentArtifacts:k("devflow_task_intent_artifacts","created_at"),queryPlans:k("devflow_channel_query_plans","created_at"),toolNameResolutions:k("devflow_tool_name_resolutions","created_at"),terminalTransitions:k("devflow_terminal_transitions","created_at"),transcriptCheckpoints:k("devflow_transcript_checkpoints","created_at"),retrievalLedger:k("devflow_retrieval_ledger","created_at")}}catch(o){return P(e,true,o instanceof Error?o.message:String(o))}finally{s?.close();}}function re(e,t){let n=join(e,".devflow","memory","memories.db"),s={databasePath:n,session:null,eventCount:0,processedEventCount:0,pendingEventCount:0,eventsByTool:[],duplicateCandidates:[],projectObservationCount:0,quarantinedObservationCount:0,supersededObservationCount:0,sessionObservationCount:0,sessionObservationVectorCount:0,projectObservationVectorCount:0,pendingLeaseCount:0,distillReceiptIds:[],activeSessionCount:0};if(!existsSync(n))return s;let o=null;try{if(o=H(n),!o)return s;let u=(p(o,"session_events")?o.prepare("SELECT * FROM session_events WHERE session_id = ? ORDER BY created_at").all(t):[]).map(a=>({id:i(a.id)??"unknown",sessionId:i(a.session_id),executionId:null,timestamp:j(a.created_at),tool:i(a.tool),toolType:null,toolUseId:null,input:W(a.payload),command:i(a.command),kind:i(a.kind),fallback:!1,failed:!1,blocked:!1,processed:F(a.processed)})),f=p(o,"observations")?o.prepare(`
2
2
  SELECT session_id, embedding, quality_status, resolution_state
3
3
  FROM observations
4
- `).all():[],m=c(i,"sessions")?i.prepare("SELECT * FROM sessions WHERE id = ?").get(t)??null:null,y=new Map;for(let r of u){let f=`${r.tool??""}\0${r.kind??""}`,s=y.get(f)??{tool:r.tool,kind:r.kind,count:0};s.count+=1,y.set(f,s);}let g=p.filter(r=>a(r.quality_status)!=="quarantined"&&a(r.resolution_state)!=="superseded"),C=g.filter(r=>r.session_id===t),_=c(i,"distill_receipts")&&c(i,"distill_leases")?i.prepare(`
4
+ `).all():[],y=p(o,"sessions")?o.prepare("SELECT * FROM sessions WHERE id = ?").get(t)??null:null,b=new Map;for(let a of u){let _=`${a.tool??""}\0${a.kind??""}`,S=b.get(_)??{tool:a.tool,kind:a.kind,count:0};S.count+=1,b.set(_,S);}let g=f.filter(a=>i(a.quality_status)!=="quarantined"&&i(a.resolution_state)!=="superseded"),m=g.filter(a=>a.session_id===t),E=p(o,"distill_receipts")&&p(o,"distill_leases")?o.prepare(`
5
5
  SELECT r.receipt_id, l.session_ids
6
6
  FROM distill_receipts r
7
7
  JOIN distill_leases l ON l.batch_id = r.batch_id
8
8
  ORDER BY r.created_at
9
- `).all().filter(r=>L(r.session_ids).includes(t)).map(r=>a(r.receipt_id)).filter(r=>r!==null):[],k=r=>r.embedding!==null&&r.embedding!==void 0;return {databasePath:n,session:m,eventCount:u.length,processedEventCount:u.filter(r=>r.processed).length,pendingEventCount:u.filter(r=>!r.processed).length,eventsByTool:[...y.values()].sort((r,f)=>f.count-r.count),duplicateCandidates:$(u),projectObservationCount:g.length,quarantinedObservationCount:p.filter(r=>a(r.quality_status)==="quarantined").length,supersededObservationCount:p.filter(r=>a(r.resolution_state)==="superseded").length,sessionObservationCount:C.length,sessionObservationVectorCount:C.filter(k).length,projectObservationVectorCount:g.filter(k).length,pendingLeaseCount:c(i,"distill_leases")?R(i,"SELECT COUNT(*) AS count FROM distill_leases WHERE status = 'pending'"):0,distillReceiptIds:_,activeSessionCount:c(i,"sessions")?R(i,"SELECT COUNT(*) AS count FROM sessions WHERE status = 'active'"):0}}catch(l){return {...o,error:l instanceof Error?l.message:String(l)}}finally{i?.close();}}function B(e){let t=join(e,".devflow","knowledge","knowledge.db"),n={databasePath:t,documentCount:0,chunkCount:0,emptyTitleCount:0,vectorRowCount:0,sourceCounts:[]};if(!existsSync(t))return n;let o=null;try{if(o=x(t),!o)return n;let i=c(o,"knowledge_docs")?R(o,"SELECT COUNT(*) AS count FROM knowledge_docs"):0,l=c(o,"knowledge_chunks")?R(o,"SELECT COUNT(*) AS count FROM knowledge_chunks"):0,u=c(o,"knowledge_docs")?R(o,"SELECT COUNT(*) AS count FROM knowledge_docs WHERE TRIM(COALESCE(title, '')) = ''"):0,p=c(o,"knowledge_docs")?o.prepare("SELECT source, COUNT(*) AS count FROM knowledge_docs GROUP BY source ORDER BY count DESC").all().map(m=>({source:a(m.source),count:Number(m.count??0)})):[];return {databasePath:t,documentCount:i,chunkCount:l,emptyTitleCount:u,vectorRowCount:c(o,"knowledge_vec_rowids")?R(o,"SELECT COUNT(*) AS count FROM knowledge_vec_rowids"):0,sourceCounts:p}}catch(i){return {...n,error:i instanceof Error?i.message:String(i)}}finally{o?.close();}}function H(){let e=join(homedir(),".claude","plugins","cache","devflow-local","devflow");if(!existsSync(e))return null;let t=readdirSync(e,{withFileTypes:true}).filter(n=>n.isDirectory()).map(n=>n.name).sort();return t.length>0?join(e,t[t.length-1]):null}function D(e){if(!e)return null;try{let t=JSON.parse(readFileSync(join(e,".claude-plugin","plugin.json"),"utf8"));return a(t.version)}catch{return null}}function Y(e,t){try{return execFileSync(e,t,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function J(e,t,n){let o=join(e,".devflow","logs","traces");if(!existsSync(o))return null;let i=[];for(let l of readdirSync(o,{withFileTypes:true})){if(!l.isDirectory())continue;for(let p of t){let m=join(o,l.name,`${p}.jsonl`);existsSync(m)&&i.push(m);}let u=join(o,l.name,`${n}.jsonl`);existsSync(u)&&i.push(u);}return i[0]??null}function K(e){if(!e)return null;try{return readFileSync(e,"utf8").split(`
10
- `).filter(t=>t.trim().length>0).length}catch{return null}}function z(e){try{return execFileSync("git",["-C",e,"status","--short","--branch"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return "unavailable"}}function G(e,t){let n=process.env.DEVFLOW_STATE_DIR??join(homedir(),".devflow","global"),o=[join(n,"devflow.db"),join(e,".devflow","devflow.db")],i=o.filter((s,v)=>o.indexOf(s)===v).map(s=>U(s,t)),l=i.flatMap(s=>s.events),u=i.flatMap(s=>s.hookFallbacks),p=i.flatMap(s=>s.memoryTurns),m=[...new Set(i.flatMap(s=>s.executions).map(s=>a(s.execution_id)).filter(s=>s!==null))],y=new Map;for(let s of l)y.set(s.tool,(y.get(s.tool)??0)+1);let g=H(),C=J(e,m,t),_=W(e,t),k=B(e),r=join(homedir(),".claude","skills","devflow:react","SKILL.md"),f=i.find(s=>s.executions.length>0)??i.find(s=>s.sessions.length>0);return {schemaVersion:1,readOnly:true,generatedAt:new Date().toISOString(),project:{root:e,gitStatus:z(e)},query:{sessionId:t,executionIds:m},runtime:{nodeVersion:process.version,claudeVersion:Y("claude",["--version"]),devflowVersion:D(g),activePluginPath:g,activePluginVersion:D(g),activeReactSkillPath:g?join(g,"skills","react","SKILL.md"):null,activeReactSkillExists:g?existsSync(join(g,"skills","react","SKILL.md")):false,legacyReactSkillPath:r,legacyReactSkillExists:existsSync(r),tracePath:C,traceEventCount:K(C)},telemetry:{databases:i,eventCount:l.length,mcpEventCount:l.filter(s=>s.toolType==="mcp").length,fallbackCount:l.filter(s=>s.fallback).length+u.length,fallbackReasons:[...new Set([...l.filter(s=>s.fallback).map(()=>"direct_tool_during_context"),...u.map(s=>`daemon_${a(s.reason)??"unknown"}`)])],actualFailureCount:l.filter(s=>s.failed).length,missedTools:L(f?.executions[0]?.missed_mcp_tools),memoryReceiptIds:[...new Set(p.map(s=>a(s.receipt_id)).filter(s=>s!==null))],missingMemoryDecisionCount:p.filter(s=>a(s.status)==="pending").length,blockedCount:l.filter(s=>s.blocked).length,duplicateCandidates:$(l),byTool:[...y.entries()].map(([s,v])=>({tool:s,count:v})).sort((s,v)=>v.count-s.count||String(s.tool).localeCompare(String(v.tool)))},memory:_,knowledge:k,lifecycle:{telemetrySession:f?.sessions[0]??null,telemetryExecution:f?.executions[0]??null,memorySession:_.session}}}function Q(e){let t=e.telemetry,n=e.memory,o=e.lifecycle;return [`Session audit: ${e.query.sessionId}`,`Project: ${e.project.root}`,`Git: ${e.project.gitStatus||"(clean)"}`,`Telemetry: ${t.eventCount} events (${t.mcpEventCount} MCP, ${t.fallbackCount} fallback, ${t.actualFailureCount} failed, ${t.blockedCount} blocked)`,`Compliance: missed tools ${t.missedTools.join(", ")||"none"}; fallback reasons ${t.fallbackReasons.join(", ")||"none"}`,`Memory decisions: ${t.memoryReceiptIds.length} receipts, ${t.missingMemoryDecisionCount} pending; distill receipts ${e.memory.distillReceiptIds.length}`,`Memory events: ${n.eventCount} (${n.processedEventCount} processed, ${n.pendingEventCount} pending)`,`Observations: ${n.sessionObservationCount} eligible for session / ${n.projectObservationCount} eligible for project; embedding coverage ${n.sessionObservationVectorCount}/${n.sessionObservationCount} for session, ${n.projectObservationVectorCount}/${n.projectObservationCount} for project`,`Observation exclusions: ${n.quarantinedObservationCount} quarantined, ${n.supersededObservationCount} superseded`,`Duplicates: ${t.duplicateCandidates.length} telemetry candidate groups, ${n.duplicateCandidates.length} Memory candidate groups`,`Lifecycle: telemetry ${a(o.telemetrySession?.status)??"missing"}, execution ${a(o.telemetryExecution?.status)??"missing"}, memory ${a(o.memorySession?.status)??"missing"}`,`Knowledge: ${e.knowledge.documentCount} docs, ${e.knowledge.chunkCount} chunks, ${e.knowledge.vectorRowCount} vectors, ${e.knowledge.emptyTitleCount} empty titles`,`Runtime: Claude ${e.runtime.claudeVersion??"unknown"}, DevFlow ${e.runtime.devflowVersion??"unknown"}, trace events ${e.runtime.traceEventCount??"unknown"}`].join(`
11
- `)}function X(){try{let e=V(process.argv.slice(2)),t=G(e.project,e.session);process.stdout.write(e.json?`${JSON.stringify(t,null,2)}
12
- `:`${Q(t)}
13
- `);}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}
14
- `),process.exitCode=1;}}X();
9
+ `).all().filter(a=>X(a.session_ids).includes(t)).map(a=>i(a.receipt_id)).filter(a=>a!==null):[],w=a=>a.embedding!==null&&a.embedding!==void 0;return {databasePath:n,session:y,eventCount:u.length,processedEventCount:u.filter(a=>a.processed).length,pendingEventCount:u.filter(a=>!a.processed).length,eventsByTool:[...b.values()].sort((a,_)=>_.count-a.count),duplicateCandidates:U(u),projectObservationCount:g.length,quarantinedObservationCount:f.filter(a=>i(a.quality_status)==="quarantined").length,supersededObservationCount:f.filter(a=>i(a.resolution_state)==="superseded").length,sessionObservationCount:m.length,sessionObservationVectorCount:m.filter(w).length,projectObservationVectorCount:g.filter(w).length,pendingLeaseCount:p(o,"distill_leases")?D(o,"SELECT COUNT(*) AS count FROM distill_leases WHERE status = 'pending'"):0,distillReceiptIds:E,activeSessionCount:p(o,"sessions")?D(o,"SELECT COUNT(*) AS count FROM sessions WHERE status = 'active'"):0}}catch(c){return {...s,error:c instanceof Error?c.message:String(c)}}finally{o?.close();}}function ae(e){let t=join(e,".devflow","knowledge","knowledge.db"),n={databasePath:t,documentCount:0,chunkCount:0,emptyTitleCount:0,vectorRowCount:0,sourceCounts:[]};if(!existsSync(t))return n;let s=null;try{if(s=H(t),!s)return n;let o=p(s,"knowledge_docs")?D(s,"SELECT COUNT(*) AS count FROM knowledge_docs"):0,c=p(s,"knowledge_chunks")?D(s,"SELECT COUNT(*) AS count FROM knowledge_chunks"):0,u=p(s,"knowledge_docs")?D(s,"SELECT COUNT(*) AS count FROM knowledge_docs WHERE TRIM(COALESCE(title, '')) = ''"):0,f=p(s,"knowledge_docs")?s.prepare("SELECT source, COUNT(*) AS count FROM knowledge_docs GROUP BY source ORDER BY count DESC").all().map(y=>({source:i(y.source),count:Number(y.count??0)})):[];return {databasePath:t,documentCount:o,chunkCount:c,emptyTitleCount:u,vectorRowCount:p(s,"knowledge_vec_rowids")?D(s,"SELECT COUNT(*) AS count FROM knowledge_vec_rowids"):0,sourceCounts:f}}catch(o){return {...n,error:o instanceof Error?o.message:String(o)}}finally{s?.close();}}function le(){let e=join(homedir(),".claude","plugins","cache","devflow-local","devflow");if(!existsSync(e))return null;let t=readdirSync(e,{withFileTypes:true}).filter(n=>n.isDirectory()).map(n=>n.name).sort();return t.length>0?join(e,t[t.length-1]):null}function z(e){if(!e)return null;try{let t=JSON.parse(readFileSync(join(e,".claude-plugin","plugin.json"),"utf8"));return i(t.version)}catch{return null}}function ce(e,t){try{return execFileSync(e,t,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function ue(e,t,n){let s=join(e,".devflow","logs","traces");if(!existsSync(s))return null;let o=[];for(let c of readdirSync(s,{withFileTypes:true})){if(!c.isDirectory())continue;for(let f of t){let y=join(s,c.name,`${f}.jsonl`);existsSync(y)&&o.push(y);}let u=join(s,c.name,`${n}.jsonl`);existsSync(u)&&o.push(u);}return o[0]??null}function de(e){if(!e)return null;try{return readFileSync(e,"utf8").split(`
10
+ `).filter(t=>t.trim().length>0).length}catch{return null}}function me(e,t){let n=join(e,".devflow","logs","sessions");if(!existsSync(n))return [];let s=[],o=readdirSync(n).filter(c=>c.endsWith(".jsonl")).sort().slice(-32);for(let c of o){let u=join(n,c),f;try{f=readFileSync(u,"utf8").split(/\r?\n/u).filter(Boolean);}catch{continue}for(let y of f){let b;try{b=JSON.parse(y);}catch{continue}let g=G(b.data),m=G(g.identity);if((i(m.sessionId)??i(g.sessionId))!==t)continue;let w=i(b.event);w&&s.push({event:w,level:i(b.level),identity:m,data:g,timestamp:j(b.ts)??j(g.timestamp),sourcePath:u});}}return s}function G(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function ge(e){let t=me(e.project,e.sessionId),n=new Map;for(let l of t)n.set(l.event,(n.get(l.event)??0)+1);let s=l=>n.has(l),o=q(e.databases.flatMap(l=>l.intentArtifacts),"artifact_hash"),c=q(e.databases.flatMap(l=>l.queryPlans),"plan_hash"),u=q(e.databases.flatMap(l=>l.terminalTransitions),"receipt_id"),f=q(e.databases.flatMap(l=>l.transcriptCheckpoints),"id"),y=e.events.filter(l=>l.toolType==="mcp"),b=y.some(l=>I(l.tool)==="get_project_context"),g=[],m=l=>{g.includes(l)||g.push(l);};o.length>0&&["host.prompt.normalized","intent.artifact.created","intent.artifact.persisted","query.plan.created","terminal.state.transitioned"].forEach(m),y.length>0&&(m("canonical.tool.resolved"),m("mcp.action.started"),m("mcp.action.{completed|degraded|failed}")),b&&(m("retrieval.channel.completed"),m("codegraph.selection.completed"),m("memory.search.completed"),m("knowledge.{search.completed|search.degraded|abstained}"));let E=e.memoryTurns.filter(l=>i(l.status)!=="pending"),w=e.memoryTurns.filter(l=>i(l.status)==="committed");E.length>0&&m("memory.semantic.decided"),w.length>0&&m("memory.{write.completed|write.degraded}"),(f.length>0||e.executionCompleted)&&(m("session.reconciled"),m("hook.stop.{completed|degraded}"),m("hook.session_end.{completed|degraded}"));let a=g.filter(l=>!fe(l,s)),_=[];for(let l of o){let h=i(l.artifact_hash),v=i(l.turn_id),$=i(l.request_id);if(!h||!v||!$){_.push(`intent_artifact_missing_identity:${h??"unknown"}`);continue}let x=c.find(T=>i(T.source_intent_hash)===h);x?(i(x.turn_id)!==v||i(x.request_id)!==$)&&_.push(`query_plan_identity_mismatch:${v}`):_.push(`intent_without_query_plan:${v}`),u.filter(T=>i(T.turn_id)===v).some(T=>i(T.request_id)!==$)&&_.push(`terminal_identity_mismatch:${v}`);let J=t.filter(T=>i(T.identity.turnId)===v);J.length>0&&J.some(T=>{let K=i(T.identity.requestId);return K!==null&&K!==$})&&_.push(`semantic_log_request_mismatch:${v}`);}let S=new Set(["closed","closed_with_degradation","closed_with_retry_work"]),k=0;for(let l of o){let h=i(l.turn_id),v=u.filter($=>i($.turn_id)===h).sort(($,x)=>Number(x.sequence??0)-Number($.sequence??0))[0];(!v||!S.has(i(v.to_state)??""))&&(k+=1);}let d=[],r=new Set(t.filter(l=>l.event==="mcp.action.failed").map(l=>I(i(l.data.tool))).filter(l=>l!==null));for(let l of e.events.filter(h=>h.failed)){let h=I(l.tool);h&&!r.has(h)&&d.push(`tool_failure_without_semantic_log:${h}:${l.id}`);}e.hookFallbacks.length>0&&!s("hook.runtime.degraded")&&!s("hook.session_end.degraded")&&d.push(`hook_fallback_without_semantic_log:${e.hookFallbacks.length}`);let O=[...new Set(_)],Y=[...new Set(d)],Z={criticalEventsPresent:a.length===0,identityChainsComplete:O.length===0,noConsoleOnlyBusinessFailures:Y.length===0,noTerminalOrphans:k===0};return {logEventCount:t.length,eventClasses:[...n.entries()].map(([l,h])=>({event:l,count:h})).sort((l,h)=>l.event.localeCompare(h.event)),requiredEventClasses:g,missingCriticalEventClasses:a,brokenIdentityChains:O,consoleOnlyBusinessFailures:Y,terminalOrphanCount:k,gates:Z}}function fe(e,t){let n=e.match(/^(.*?)\.\{(.+)\}$/u);return n?n[2].split("|").some(s=>t(`${n[1]}.${s}`)):t(e)}function q(e,t){let n=new Map;for(let s of e)n.set(i(s[t])??L(s),s);return [...n.values()]}function I(e){return e?e.replace(/^mcp__[^_]+__/u,""):null}function pe(e){try{return execFileSync("git",["-C",e,"status","--short","--branch"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return "unavailable"}}function be(e,t){let n=process.env.DEVFLOW_STATE_DIR??join(homedir(),".devflow","global"),s=[join(n,"devflow.db"),join(e,".devflow","devflow.db")],o=s.filter((r,O)=>s.indexOf(r)===O).map(r=>ie(r,e,t)),c=o.flatMap(r=>r.events),u=o.flatMap(r=>r.hookFallbacks),f=o.flatMap(r=>r.memoryTurns),y=[...new Set(o.flatMap(r=>r.executions).map(r=>i(r.execution_id)).filter(r=>r!==null))],b=new Map;for(let r of c)b.set(r.tool,(b.get(r.tool)??0)+1);let g=le(),m=ue(e,y,t),E=re(e,t),w=ae(e),a=join(homedir(),".claude","skills","devflow:react","SKILL.md"),_=o.find(r=>r.executions.length>0)??o.find(r=>r.sessions.length>0),S=_?.executions.at(-1)??null,k=_?.sessions.at(-1)??null,d=ge({project:e,sessionId:t,databases:o,events:c,hookFallbacks:u,memoryTurns:f,executionCompleted:["completed","failed"].includes(i(S?.status)??"")});return {schemaVersion:1,readOnly:true,generatedAt:new Date().toISOString(),project:{root:e,gitStatus:pe(e)},query:{sessionId:t,executionIds:y},runtime:{nodeVersion:process.version,claudeVersion:ce("claude",["--version"]),devflowVersion:z(g),activePluginPath:g,activePluginVersion:z(g),activeReactSkillPath:g?join(g,"skills","react","SKILL.md"):null,activeReactSkillExists:g?existsSync(join(g,"skills","react","SKILL.md")):false,legacyReactSkillPath:a,legacyReactSkillExists:existsSync(a),tracePath:m,traceEventCount:de(m)},telemetry:{databases:o,eventCount:c.length,mcpEventCount:c.filter(r=>r.toolType==="mcp").length,fallbackCount:c.filter(r=>r.fallback).length+u.length,fallbackReasons:[...new Set([...c.filter(r=>r.fallback).map(()=>"direct_tool_during_context"),...u.map(r=>`daemon_${i(r.reason)??"unknown"}`)])],actualFailureCount:c.filter(r=>r.failed).length,missedTools:X(S?.missed_mcp_tools),memoryReceiptIds:[...new Set(f.map(r=>i(r.receipt_id)).filter(r=>r!==null))],missingMemoryDecisionCount:f.filter(r=>i(r.status)==="pending").length,blockedCount:c.filter(r=>r.blocked).length,duplicateCandidates:U(c),byTool:[...b.entries()].map(([r,O])=>({tool:r,count:O})).sort((r,O)=>O.count-r.count||String(r.tool).localeCompare(String(O.tool)))},memory:E,knowledge:w,lifecycle:{telemetrySession:k,telemetryExecution:S,memorySession:E.session},semantic:d}}function ye(e){let t=e.telemetry,n=e.memory,s=e.lifecycle;return [`Session audit: ${e.query.sessionId}`,`Project: ${e.project.root}`,`Git: ${e.project.gitStatus||"(clean)"}`,`Telemetry: ${t.eventCount} events (${t.mcpEventCount} MCP, ${t.fallbackCount} fallback, ${t.actualFailureCount} failed, ${t.blockedCount} blocked)`,`Compliance: missed tools ${t.missedTools.join(", ")||"none"}; fallback reasons ${t.fallbackReasons.join(", ")||"none"}`,`Memory decisions: ${t.memoryReceiptIds.length} receipts, ${t.missingMemoryDecisionCount} pending; distill receipts ${e.memory.distillReceiptIds.length}`,`Memory events: ${n.eventCount} (${n.processedEventCount} processed, ${n.pendingEventCount} pending)`,`Observations: ${n.sessionObservationCount} eligible for session / ${n.projectObservationCount} eligible for project; embedding coverage ${n.sessionObservationVectorCount}/${n.sessionObservationCount} for session, ${n.projectObservationVectorCount}/${n.projectObservationCount} for project`,`Observation exclusions: ${n.quarantinedObservationCount} quarantined, ${n.supersededObservationCount} superseded`,`Duplicates: ${t.duplicateCandidates.length} telemetry candidate groups, ${n.duplicateCandidates.length} Memory candidate groups`,`Lifecycle: telemetry ${i(s.telemetrySession?.status)??"missing"}, execution ${i(s.telemetryExecution?.status)??"missing"}, memory ${i(s.memorySession?.status)??"missing"}`,`Knowledge: ${e.knowledge.documentCount} docs, ${e.knowledge.chunkCount} chunks, ${e.knowledge.vectorRowCount} vectors, ${e.knowledge.emptyTitleCount} empty titles`,`Runtime: Claude ${e.runtime.claudeVersion??"unknown"}, DevFlow ${e.runtime.devflowVersion??"unknown"}, trace events ${e.runtime.traceEventCount??"unknown"}`,`Semantic logs: ${e.semantic.logEventCount} events; missing ${e.semantic.missingCriticalEventClasses.join(", ")||"none"}; broken identity ${e.semantic.brokenIdentityChains.length}; console-only failures ${e.semantic.consoleOnlyBusinessFailures.length}; terminal orphans ${e.semantic.terminalOrphanCount}`,`Semantic gates: ${Object.entries(e.semantic.gates).filter(([,o])=>!o).map(([o])=>o).join(", ")||"passed"}`].join(`
11
+ `)}function _e(){try{let e=se(process.argv.slice(2)),t=be(e.project,e.session);process.stdout.write(e.json?`${JSON.stringify(t,null,2)}
12
+ `:`${ye(t)}
13
+ `),e.strict&&!Object.values(t.semantic.gates).every(Boolean)&&(process.exitCode=1);}catch(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}
14
+ `),process.exitCode=1;}}_e();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/devflow",
3
- "version": "0.16.34",
3
+ "version": "0.17.1",
4
4
  "type": "module",
5
5
  "description": "DevFlow - Developer Intelligence Platform (Distribution Package)",
6
6
  "bin": {
@@ -16,17 +16,17 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@colbymchenry/codegraph": "^1.1.1",
19
- "@devflow-tools/adapters": "0.16.34",
20
- "@devflow-tools/benchmark": "0.16.34",
21
- "@devflow-tools/context-engine": "0.16.34",
22
- "@devflow-tools/database": "0.16.34",
23
- "@devflow-tools/knowledge-engine": "0.16.34",
24
- "@devflow-tools/mcp-server": "0.16.34",
25
- "@devflow-tools/memory-engine": "0.16.34",
26
- "@devflow-tools/sdk": "0.16.34",
27
- "@devflow-tools/server": "0.16.34",
28
- "@devflow-tools/telemetry": "0.16.34",
29
- "@devflow-tools/workflow-engine": "0.16.34",
19
+ "@devflow-tools/adapters": "0.17.1",
20
+ "@devflow-tools/benchmark": "0.17.1",
21
+ "@devflow-tools/context-engine": "0.17.1",
22
+ "@devflow-tools/database": "0.17.1",
23
+ "@devflow-tools/knowledge-engine": "0.17.1",
24
+ "@devflow-tools/mcp-server": "0.17.1",
25
+ "@devflow-tools/memory-engine": "0.17.1",
26
+ "@devflow-tools/sdk": "0.17.1",
27
+ "@devflow-tools/server": "0.17.1",
28
+ "@devflow-tools/telemetry": "0.17.1",
29
+ "@devflow-tools/workflow-engine": "0.17.1",
30
30
  "@inquirer/prompts": "^7.10.1",
31
31
  "@modelcontextprotocol/sdk": "^1.0.0",
32
32
  "@nestjs/common": "^10.4.0",
@@ -1,172 +1,172 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "lastUpdated": "2026-07-30T01:58:38.895Z",
3
+ "lastUpdated": "2026-07-31T01:43:56.765Z",
4
4
  "plugins": [
5
5
  {
6
6
  "name": "@devflow-tools/plugin-animation",
7
- "version": "0.16.34",
7
+ "version": "0.17.1",
8
8
  "description": "",
9
9
  "tags": [],
10
10
  "compatibleStacks": [
11
11
  "animation"
12
12
  ],
13
- "size": "71542 B",
13
+ "size": "71887 B",
14
14
  "author": "DevFlow Team",
15
15
  "homepage": ""
16
16
  },
17
17
  {
18
18
  "name": "@devflow-tools/plugin-css",
19
- "version": "0.16.34",
19
+ "version": "0.17.1",
20
20
  "description": "",
21
21
  "tags": [],
22
22
  "compatibleStacks": [
23
23
  "css"
24
24
  ],
25
- "size": "58872 B",
25
+ "size": "59205 B",
26
26
  "author": "DevFlow Team",
27
27
  "homepage": ""
28
28
  },
29
29
  {
30
30
  "name": "@devflow-tools/plugin-docker",
31
- "version": "0.16.34",
31
+ "version": "0.17.1",
32
32
  "description": "",
33
33
  "tags": [],
34
34
  "compatibleStacks": [
35
35
  "docker"
36
36
  ],
37
- "size": "87529 B",
37
+ "size": "87868 B",
38
38
  "author": "DevFlow Team",
39
39
  "homepage": ""
40
40
  },
41
41
  {
42
42
  "name": "@devflow-tools/plugin-electron",
43
- "version": "0.16.34",
43
+ "version": "0.17.1",
44
44
  "description": "",
45
45
  "tags": [],
46
46
  "compatibleStacks": [
47
47
  "electron"
48
48
  ],
49
- "size": "103259 B",
49
+ "size": "103602 B",
50
50
  "author": "DevFlow Team",
51
51
  "homepage": ""
52
52
  },
53
53
  {
54
54
  "name": "@devflow-tools/plugin-git",
55
- "version": "0.16.34",
55
+ "version": "0.17.1",
56
56
  "description": "",
57
57
  "tags": [],
58
58
  "compatibleStacks": [
59
59
  "git"
60
60
  ],
61
- "size": "69180 B",
61
+ "size": "69513 B",
62
62
  "author": "DevFlow Team",
63
63
  "homepage": ""
64
64
  },
65
65
  {
66
66
  "name": "@devflow-tools/plugin-graphql",
67
- "version": "0.16.34",
67
+ "version": "0.17.1",
68
68
  "description": "",
69
69
  "tags": [],
70
70
  "compatibleStacks": [
71
71
  "graphql"
72
72
  ],
73
- "size": "71238 B",
73
+ "size": "71579 B",
74
74
  "author": "DevFlow Team",
75
75
  "homepage": ""
76
76
  },
77
77
  {
78
78
  "name": "@devflow-tools/plugin-nest",
79
- "version": "0.16.34",
79
+ "version": "0.17.1",
80
80
  "description": "",
81
81
  "tags": [],
82
82
  "compatibleStacks": [
83
83
  "nest"
84
84
  ],
85
- "size": "108004 B",
85
+ "size": "108339 B",
86
86
  "author": "DevFlow Team",
87
87
  "homepage": ""
88
88
  },
89
89
  {
90
90
  "name": "@devflow-tools/plugin-nextjs",
91
- "version": "0.16.34",
91
+ "version": "0.17.1",
92
92
  "description": "",
93
93
  "tags": [],
94
94
  "compatibleStacks": [
95
95
  "nextjs"
96
96
  ],
97
- "size": "69615 B",
97
+ "size": "69954 B",
98
98
  "author": "DevFlow Team",
99
99
  "homepage": ""
100
100
  },
101
101
  {
102
102
  "name": "@devflow-tools/plugin-performance",
103
- "version": "0.16.34",
103
+ "version": "0.17.1",
104
104
  "description": "",
105
105
  "tags": [],
106
106
  "compatibleStacks": [
107
107
  "performance"
108
108
  ],
109
- "size": "119843 B",
109
+ "size": "120192 B",
110
110
  "author": "DevFlow Team",
111
111
  "homepage": ""
112
112
  },
113
113
  {
114
114
  "name": "@devflow-tools/plugin-react",
115
- "version": "0.16.34",
115
+ "version": "0.17.1",
116
116
  "description": "",
117
117
  "tags": [],
118
118
  "compatibleStacks": [
119
119
  "react"
120
120
  ],
121
- "size": "247320 B",
121
+ "size": "247657 B",
122
122
  "author": "DevFlow Team",
123
123
  "homepage": ""
124
124
  },
125
125
  {
126
126
  "name": "@devflow-tools/plugin-tailwind",
127
- "version": "0.16.34",
127
+ "version": "0.17.1",
128
128
  "description": "",
129
129
  "tags": [],
130
130
  "compatibleStacks": [
131
131
  "tailwind"
132
132
  ],
133
- "size": "75957 B",
133
+ "size": "76300 B",
134
134
  "author": "DevFlow Team",
135
135
  "homepage": ""
136
136
  },
137
137
  {
138
138
  "name": "@devflow-tools/plugin-taro",
139
- "version": "0.16.34",
139
+ "version": "0.17.1",
140
140
  "description": "",
141
141
  "tags": [],
142
142
  "compatibleStacks": [
143
143
  "taro"
144
144
  ],
145
- "size": "79684 B",
145
+ "size": "80019 B",
146
146
  "author": "DevFlow Team",
147
147
  "homepage": ""
148
148
  },
149
149
  {
150
150
  "name": "@devflow-tools/plugin-ui-layout",
151
- "version": "0.16.34",
151
+ "version": "0.17.1",
152
152
  "description": "",
153
153
  "tags": [],
154
154
  "compatibleStacks": [
155
155
  "ui-layout"
156
156
  ],
157
- "size": "56913 B",
157
+ "size": "57258 B",
158
158
  "author": "DevFlow Team",
159
159
  "homepage": ""
160
160
  },
161
161
  {
162
162
  "name": "@devflow-tools/plugin-vue",
163
- "version": "0.16.34",
163
+ "version": "0.17.1",
164
164
  "description": "",
165
165
  "tags": [],
166
166
  "compatibleStacks": [
167
167
  "vue"
168
168
  ],
169
- "size": "87847 B",
169
+ "size": "88180 B",
170
170
  "author": "DevFlow Team",
171
171
  "homepage": ""
172
172
  }