@devflow-tools/cli 0.17.8 → 0.18.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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/dist/commands/context.d.ts +1 -1
  3. package/dist/commands/context.d.ts.map +1 -1
  4. package/dist/commands/context.js +8 -2
  5. package/dist/commands/context.js.map +1 -1
  6. package/dist/commands/db.js +1 -1
  7. package/dist/commands/db.js.map +1 -1
  8. package/dist/commands/docs.d.ts.map +1 -1
  9. package/dist/commands/docs.js +2 -0
  10. package/dist/commands/docs.js.map +1 -1
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +34 -44
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/graph.js +1 -1
  15. package/dist/commands/graph.js.map +1 -1
  16. package/dist/commands/index-cmd.js +1 -1
  17. package/dist/commands/index-cmd.js.map +1 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +2 -1
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/knowledge.d.ts +1 -1
  22. package/dist/commands/knowledge.d.ts.map +1 -1
  23. package/dist/commands/knowledge.js +21 -5
  24. package/dist/commands/knowledge.js.map +1 -1
  25. package/dist/commands/logs.d.ts +14 -0
  26. package/dist/commands/logs.d.ts.map +1 -0
  27. package/dist/commands/logs.js +40 -0
  28. package/dist/commands/logs.js.map +1 -0
  29. package/dist/commands/memory.d.ts.map +1 -1
  30. package/dist/commands/memory.js +3 -2
  31. package/dist/commands/memory.js.map +1 -1
  32. package/dist/commands/plugin-memory-hints.js +3 -0
  33. package/dist/commands/plugin-memory-hints.js.map +1 -1
  34. package/dist/commands/workflow.js +1 -1
  35. package/dist/commands/workflow.js.map +1 -1
  36. package/dist/index.js +18 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/plugin-files/.claude-plugin/plugin.json +1 -1
  39. package/dist/plugin-files/dist/command-registry.json +5 -5
  40. package/dist/plugin-files/dist/hooks/enforcer-summary.js +3 -3
  41. package/dist/plugin-files/dist/hooks/hook-client.js +3 -3
  42. package/dist/plugin-files/dist/hooks/hook-daemon.js +27 -25
  43. package/dist/plugin-files/dist/hooks/post-tool-use-failure.js +2 -2
  44. package/dist/plugin-files/dist/hooks/post-tool-use.js +6 -6
  45. package/dist/plugin-files/dist/hooks/pre-compact.js +3 -3
  46. package/dist/plugin-files/dist/hooks/pre-tool-use.js +4 -4
  47. package/dist/plugin-files/dist/hooks/server-bootstrap.js +22 -22
  48. package/dist/plugin-files/dist/hooks/session-end.js +6 -6
  49. package/dist/plugin-files/dist/hooks/stop.js +10 -10
  50. package/dist/plugin-files/dist/hooks/user-prompt-submit.js +11 -9
  51. package/dist/plugin-files/package.json +28 -19
  52. package/package.json +39 -29
@@ -1,6 +1,6 @@
1
- import {existsSync}from'node:fs';import {homedir}from'node:os';import {resolve,join}from'node:path';import {fileURLToPath}from'node:url';async function m(n=homedir()){let a=process.env.DEVFLOW_STATE_DIR??join(n,".devflow","global"),r=join(a,"devflow.db");if(!existsSync(r))return {gateCount:4,ruleCount:null,source:"fallback"};let e;try{let{DatabaseSync:u}=await import('node:sqlite');e=new u(r,{readOnly:!0});let t=e.prepare(`
1
+ import {existsSync}from'node:fs';import {homedir}from'node:os';import {resolve,join}from'node:path';import {fileURLToPath}from'node:url';import {getDevFlowStateRoot}from'@devflow-tools/sdk';async function f(n=homedir()){let a=join(getDevFlowStateRoot({homeDir:n}),"global"),r=join(a,"devflow.db");if(!existsSync(r))return {gateCount:4,ruleCount:null,source:"fallback"};let e;try{let{DatabaseSync:u}=await import('node:sqlite');e=new u(r,{readOnly:!0});let t=e.prepare(`
2
2
  SELECT COUNT(*) AS rule_count, COUNT(DISTINCT gate) AS gate_count
3
3
  FROM devflow_rules
4
4
  WHERE enabled = 1
5
- `).get();return {gateCount:Number(t?.gate_count??0),ruleCount:Number(t?.rule_count??0),source:"database"}}catch{return {gateCount:4,ruleCount:null,source:"fallback"}}finally{e?.close();}}process.argv[1]&&fileURLToPath(import.meta.url)===resolve(process.argv[1])&&process.stdout.write(`${JSON.stringify(await m())}
6
- `);export{m as readEnforcerSummary};
5
+ `).get();return {gateCount:Number(t?.gate_count??0),ruleCount:Number(t?.rule_count??0),source:"database"}}catch{return {gateCount:4,ruleCount:null,source:"fallback"}}finally{e?.close();}}process.argv[1]&&fileURLToPath(import.meta.url)===resolve(process.argv[1])&&process.stdout.write(`${JSON.stringify(await f())}
6
+ `);export{f as readEnforcerSummary};
@@ -1,6 +1,6 @@
1
- import {createConnection}from'node:net';import {getDaemonSocketPath}from'@devflow-tools/sdk';import {mkdirSync,appendFileSync}from'node:fs';import {homedir}from'node:os';import {join,dirname}from'node:path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {createHash}from'node:crypto';function b(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:e,timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:t});}finally{o.close();}}catch{}}var S=["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"];function m(e){let t=N(e.input)??e.requestType;if(b("hook_daemon_request",{success:e.success,projectRoot:e.projectRoot,requestType:e.requestType,tool:t,attempts:e.attempts},e.durationMs),e.success)return;let n=Date.now(),o=v(e.input);try{let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{r.insertHookFallback({id:`hook-fallback:${createHash("sha256").update(`${e.projectRoot}\0${o.sessionId??""}\0${o.toolUseId??""}\0${e.requestType}\0${n}`).digest("hex").slice(0,24)}`,projectRoot:e.projectRoot,sessionId:o.sessionId,toolUseId:o.toolUseId,requestType:e.requestType,tool:t,reason:e.reason??"unknown",durationMs:e.durationMs,attempts:e.attempts,createdAt:n});}finally{r.close();}}catch{}try{let r=join(homedir(),".devflow","logs","hook-fallback",`${new Date(n).toISOString().slice(0,10)}.log`);mkdirSync(dirname(r),{recursive:!0,mode:448}),appendFileSync(r,`${JSON.stringify({ts:n,tool:t,requestType:e.requestType,projectRoot:e.projectRoot,reason:`daemon-${e.reason??"unknown"}`,durationMs:e.durationMs,attempts:e.attempts,bypassCountLost:!0,disabledFeatures:S})}
2
- `,{mode:384});}catch{}}function v(e){try{let t=JSON.parse(e);return {sessionId:typeof t.session_id=="string"?t.session_id:void 0,toolUseId:typeof t.tool_use_id=="string"?t.tool_use_id:void 0}}catch{return {}}}function N(e){try{let t=JSON.parse(e);return typeof t.tool_name=="string"&&t.tool_name?t.tool_name:null}catch{return null}}var d=process.env.CLAUDE_PROJECT_DIR||process.cwd(),q=getDaemonSocketPath(d),u=process.argv[2],h=process.argv[3],p=Number(process.env.DEVFLOW_HOOK_CLIENT_TIMEOUT_MS),F=Number.isFinite(p)&&p>0?p:1e3,f=Number(process.env.DEVFLOW_HOOK_CLIENT_RETRY_DELAY_MS),P=Number.isFinite(f)&&f>=0?f:100,g=2*1024*1024,y=u==="memory-snapshot"?2:1;async function L(){let e=h!==void 0?H(h):u==="memory-snapshot"?{input:"",truncated:false}:await j(),{input:t,truncated:n}=e,o=Date.now(),r="unknown";for(let a=0;a<y;a+=1){let s=await B(t,n);if(s.response!==null){if(x(s.response)){r="protocol";break}return m({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:true,attempts:a+1}),process.stdout.write(`${s.response}
3
- `),0}r=s.reason??"unknown",a<y-1&&await G(P);}return process.env.DEVFLOW_HOOK_CLIENT_SUPPRESS_FALLBACK_LOG!=="1"&&m({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:false,attempts:y,reason:r}),1}function x(e){try{let t=JSON.parse(e);return !!(t&&typeof t=="object"&&!Array.isArray(t)&&typeof t.error=="string")}catch{return true}}function B(e,t){return new Promise(n=>{let o=createConnection(q),r=false,a="",s=(c,l)=>{r||(r=true,clearTimeout(i),o.destroy(),n({response:c,reason:l}));},i=setTimeout(()=>s(null,"timeout"),F);o.setEncoding("utf8"),o.on("connect",()=>{o.write(`${JSON.stringify({type:"hello",rootPath:d})}
1
+ import {createConnection}from'node:net';import {getDaemonSocketPath,getDevFlowStateRoot}from'@devflow-tools/sdk';import {mkdirSync,appendFileSync}from'node:fs';import {join,dirname}from'node:path';import {openGlobalDevFlowDatabase}from'@devflow-tools/database';import {createHash}from'node:crypto';function b(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:e,timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:t});}finally{o.close();}}catch{}}var I=["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"];function p(e){let t=N(e.input)??e.requestType;if(b("hook_daemon_request",{success:e.success,projectRoot:e.projectRoot,requestType:e.requestType,tool:t,attempts:e.attempts},e.durationMs),e.success)return;let n=Date.now(),o=v(e.input);try{let r=openGlobalDevFlowDatabase(void 0,{busyTimeoutMs:250});try{r.insertHookFallback({id:`hook-fallback:${createHash("sha256").update(`${e.projectRoot}\0${o.sessionId??""}\0${o.toolUseId??""}\0${e.requestType}\0${n}`).digest("hex").slice(0,24)}`,projectRoot:e.projectRoot,sessionId:o.sessionId,toolUseId:o.toolUseId,requestType:e.requestType,tool:t,reason:e.reason??"unknown",durationMs:e.durationMs,attempts:e.attempts,createdAt:n});}finally{r.close();}}catch{}try{let r=join(getDevFlowStateRoot(),"logs","hook-fallback",`${new Date(n).toISOString().slice(0,10)}.log`);mkdirSync(dirname(r),{recursive:!0,mode:448}),appendFileSync(r,`${JSON.stringify({ts:n,tool:t,requestType:e.requestType,projectRoot:e.projectRoot,reason:`daemon-${e.reason??"unknown"}`,durationMs:e.durationMs,attempts:e.attempts,bypassCountLost:!0,disabledFeatures:I})}
2
+ `,{mode:384});}catch{}}function v(e){try{let t=JSON.parse(e);return {sessionId:typeof t.session_id=="string"?t.session_id:void 0,toolUseId:typeof t.tool_use_id=="string"?t.tool_use_id:void 0}}catch{return {}}}function N(e){try{let t=JSON.parse(e);return typeof t.tool_name=="string"&&t.tool_name?t.tool_name:null}catch{return null}}var d=process.env.CLAUDE_PROJECT_DIR||process.cwd(),q=getDaemonSocketPath(d),u=process.argv[2],h=process.argv[3],m=Number(process.env.DEVFLOW_HOOK_CLIENT_TIMEOUT_MS),F=Number.isFinite(m)&&m>0?m:1e3,f=Number(process.env.DEVFLOW_HOOK_CLIENT_RETRY_DELAY_MS),P=Number.isFinite(f)&&f>=0?f:100,g=2*1024*1024,y=u==="memory-snapshot"?2:1;async function L(){let e=h!==void 0?H(h):u==="memory-snapshot"?{input:"",truncated:false}:await j(),{input:t,truncated:n}=e,o=Date.now(),r="unknown";for(let a=0;a<y;a+=1){let s=await B(t,n);if(s.response!==null){if(x(s.response)){r="protocol";break}return p({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:true,attempts:a+1}),process.stdout.write(`${s.response}
3
+ `),0}r=s.reason??"unknown",a<y-1&&await G(P);}return process.env.DEVFLOW_HOOK_CLIENT_SUPPRESS_FALLBACK_LOG!=="1"&&p({projectRoot:d,requestType:u,input:t,durationMs:Date.now()-o,success:false,attempts:y,reason:r}),1}function x(e){try{let t=JSON.parse(e);return !!(t&&typeof t=="object"&&!Array.isArray(t)&&typeof t.error=="string")}catch{return true}}function B(e,t){return new Promise(n=>{let o=createConnection(q),r=false,a="",s=(c,l)=>{r||(r=true,clearTimeout(i),o.destroy(),n({response:c,reason:l}));},i=setTimeout(()=>s(null,"timeout"),F);o.setEncoding("utf8"),o.on("connect",()=>{o.write(`${JSON.stringify({type:"hello",rootPath:d})}
4
4
  `);let c=$(e,t);if(!c){s(null,"protocol");return}o.write(`${JSON.stringify(c)}
5
5
  `);}),o.on("data",c=>{a+=c;let l=a.indexOf(`
6
6
  `);if(l<0)return;let _=a.slice(0,l).trim();s(_||null);}),o.on("error",()=>s(null,"unreachable")),o.on("close",()=>s(null,"unreachable"));})}function $(e,t){let n=t?{truncated:true}:{};return u==="stop"?{type:"stop",input:e,...n}:u==="memory-snapshot"?{type:"memory-snapshot"}:["session-start","session-end","post-tool-use","post-tool-use-failure","pre-tool-use","user-prompt-submit","pre-compact"].includes(u)?{type:u,input:e,...n}:null}function j(){return new Promise(e=>{let t=[],n=0,o=false;process.stdin.on("data",r=>{let a=Buffer.isBuffer(r)?r:Buffer.from(r),s=g-n;if(s>0){let i=a.subarray(0,s);t.push(i),n+=i.length;}a.length>s&&(o=true);}),process.stdin.on("end",()=>e({input:Buffer.concat(t).toString("utf8"),truncated:o})),process.stdin.on("error",()=>e({input:"",truncated:false}));})}function H(e){let t=Buffer.from(e);return t.length<=g?{input:e,truncated:false}:{input:t.subarray(0,g).toString("utf8"),truncated:true}}function G(e){return new Promise(t=>setTimeout(t,e))}L().then(e=>process.exit(e)).catch(()=>process.exit(1));