@devflow-tools/devflow 0.16.1 → 0.16.2

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 (105) hide show
  1. package/dist/cli.js +86 -61
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/_next/static/chunks/{736-db1a009357c222d2.js → 384-484184f146e1b764.js} +1 -1
  4. package/dist/dashboard/_next/static/chunks/{429-eac85fdc49353ed8.js → 429-3a8e078af4ea04bd.js} +1 -1
  5. package/dist/dashboard/_next/static/chunks/app/accuracy/{page-ca6a419d8b29eb4f.js → page-3b8b7448c9c7aeee.js} +1 -1
  6. package/dist/dashboard/_next/static/chunks/app/benchmark/page-d8f3f089f1d15cc7.js +1 -0
  7. package/dist/dashboard/_next/static/chunks/app/context/{page-1874ae1050524cb6.js → page-480f7324dee9cf74.js} +1 -1
  8. package/dist/dashboard/_next/static/chunks/app/doctor/{page-d542f2ab8d6a1c59.js → page-c32c81c69968099f.js} +1 -1
  9. package/dist/dashboard/_next/static/chunks/app/executions/{page-b98ec834dcda8d93.js → page-bee250062acc03a8.js} +1 -1
  10. package/dist/dashboard/_next/static/chunks/app/graph/{page-f0e7e15288791e9c.js → page-75947209e5b7741c.js} +1 -1
  11. package/dist/dashboard/_next/static/chunks/app/knowledge/{page-86808abd0d47c026.js → page-61a2d663940fb04b.js} +1 -1
  12. package/dist/dashboard/_next/static/chunks/app/{layout-4b78776412bd4fee.js → layout-572650e435947896.js} +1 -1
  13. package/dist/dashboard/_next/static/chunks/app/memory/{page-e169762426ac7a23.js → page-71d7c8926179b065.js} +1 -1
  14. package/dist/dashboard/_next/static/chunks/app/{page-c3e980fb2621470c.js → page-10dcf844701d7903.js} +1 -1
  15. package/dist/dashboard/_next/static/chunks/app/replay/{page-a8a465ed885df0cf.js → page-f354eb8ed0bfbb11.js} +1 -1
  16. package/dist/dashboard/_next/static/chunks/app/runs/[id]/{page-cc1d5182707fca5b.js → page-ffc0fda72263722c.js} +1 -1
  17. package/dist/dashboard/_next/static/chunks/app/runs/{page-bbf0a58abd70430c.js → page-4da6997bddcfeb45.js} +1 -1
  18. package/dist/dashboard/_next/static/chunks/app/settings/{page-9602ff45892e7910.js → page-0fa1d3b02152a97c.js} +1 -1
  19. package/dist/dashboard/_next/static/chunks/app/timeline/{page-a8eb3caf23be8a86.js → page-b676878a19561da3.js} +1 -1
  20. package/dist/dashboard/_next/static/chunks/app/tool-metrics/{page-1f86f62b187f2b5e.js → page-6452423bc1f543ec.js} +1 -1
  21. package/dist/dashboard/_next/static/chunks/app/workflows/{page-551939c9e86b26c6.js → page-0ff0044616ac56aa.js} +1 -1
  22. package/dist/dashboard/_next/static/chunks/main-app-cf693a9b955f073e.js +1 -0
  23. package/dist/dashboard/accuracy.html +1 -1
  24. package/dist/dashboard/accuracy.txt +3 -3
  25. package/dist/dashboard/benchmark.html +1 -1
  26. package/dist/dashboard/benchmark.txt +3 -3
  27. package/dist/dashboard/context.html +1 -1
  28. package/dist/dashboard/context.txt +3 -3
  29. package/dist/dashboard/doctor.html +1 -1
  30. package/dist/dashboard/doctor.txt +3 -3
  31. package/dist/dashboard/executions.html +1 -1
  32. package/dist/dashboard/executions.txt +3 -3
  33. package/dist/dashboard/graph.html +1 -1
  34. package/dist/dashboard/graph.txt +3 -3
  35. package/dist/dashboard/index.html +1 -1
  36. package/dist/dashboard/index.txt +3 -3
  37. package/dist/dashboard/knowledge.html +1 -1
  38. package/dist/dashboard/knowledge.txt +3 -3
  39. package/dist/dashboard/memory.html +1 -1
  40. package/dist/dashboard/memory.txt +3 -3
  41. package/dist/dashboard/replay.html +1 -1
  42. package/dist/dashboard/replay.txt +3 -3
  43. package/dist/dashboard/runs/_.html +1 -1
  44. package/dist/dashboard/runs/_.txt +3 -3
  45. package/dist/dashboard/runs.html +1 -1
  46. package/dist/dashboard/runs.txt +3 -3
  47. package/dist/dashboard/settings.html +1 -1
  48. package/dist/dashboard/settings.txt +3 -3
  49. package/dist/dashboard/timeline.html +1 -1
  50. package/dist/dashboard/timeline.txt +3 -3
  51. package/dist/dashboard/tool-metrics.html +1 -1
  52. package/dist/dashboard/tool-metrics.txt +3 -3
  53. package/dist/dashboard/workflows.html +1 -1
  54. package/dist/dashboard/workflows.txt +3 -3
  55. package/dist/hooks/hook-client.js +5 -5
  56. package/dist/hooks/hook-daemon.js +11 -11
  57. package/dist/hooks/post-tool-use-failure.js +2 -2
  58. package/dist/hooks/post-tool-use.js +3 -3
  59. package/dist/hooks/pre-compact.js +2 -2
  60. package/dist/hooks/pre-tool-use.js +2 -2
  61. package/dist/hooks/session-end.js +2 -2
  62. package/dist/hooks/stop.js +2 -2
  63. package/dist/hooks/user-prompt-submit.js +3 -2
  64. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  65. package/dist/plugin/dist/hooks/hook-client.js +5 -5
  66. package/dist/plugin/dist/hooks/hook-daemon.js +11 -11
  67. package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
  68. package/dist/plugin/dist/hooks/post-tool-use.js +3 -3
  69. package/dist/plugin/dist/hooks/pre-compact.js +2 -2
  70. package/dist/plugin/dist/hooks/pre-tool-use.js +2 -2
  71. package/dist/plugin/dist/hooks/session-end.js +2 -2
  72. package/dist/plugin/dist/hooks/stop.js +2 -2
  73. package/dist/plugin/dist/hooks/user-prompt-submit.js +3 -2
  74. package/dist/plugin/dist/skills/devflow:react/SKILL.md +16 -3
  75. package/dist/plugin/hooks/session-start +0 -10
  76. package/dist/plugin/hooks/stop +3 -2
  77. package/dist/plugin/package.json +7 -8
  78. package/dist/plugin/skills/{devflow:react → react}/SKILL.md +16 -3
  79. package/package.json +13 -13
  80. package/plugin-registry.json +29 -29
  81. package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +0 -1
  82. package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +0 -1
  83. /package/dist/dashboard/_next/static/{PV20UFAxDva62WLq6zWVa → ZaapgyqOj6AXHY5zdw6_X}/_buildManifest.js +0 -0
  84. /package/dist/dashboard/_next/static/{PV20UFAxDva62WLq6zWVa → ZaapgyqOj6AXHY5zdw6_X}/_ssgManifest.js +0 -0
  85. /package/dist/plugin/{hooks.json → hooks/hooks.json} +0 -0
  86. /package/dist/plugin/skills/{devflow:animation → animation}/SKILL.md +0 -0
  87. /package/dist/plugin/skills/{devflow:context → context}/SKILL.md +0 -0
  88. /package/dist/plugin/skills/{devflow:css → css}/SKILL.md +0 -0
  89. /package/dist/plugin/skills/{devflow:docker → docker}/SKILL.md +0 -0
  90. /package/dist/plugin/skills/{devflow:doctor → doctor}/SKILL.md +0 -0
  91. /package/dist/plugin/skills/{devflow:electron → electron}/SKILL.md +0 -0
  92. /package/dist/plugin/skills/{devflow:git → git}/SKILL.md +0 -0
  93. /package/dist/plugin/skills/{devflow:graph → graph}/SKILL.md +0 -0
  94. /package/dist/plugin/skills/{devflow:graphql → graphql}/SKILL.md +0 -0
  95. /package/dist/plugin/skills/{devflow:knowledge → knowledge}/SKILL.md +0 -0
  96. /package/dist/plugin/skills/{devflow:memory → memory}/SKILL.md +0 -0
  97. /package/dist/plugin/skills/{devflow:nest → nest}/SKILL.md +0 -0
  98. /package/dist/plugin/skills/{devflow:nextjs → nextjs}/SKILL.md +0 -0
  99. /package/dist/plugin/skills/{devflow:performance → performance}/SKILL.md +0 -0
  100. /package/dist/plugin/skills/{devflow:start → start}/SKILL.md +0 -0
  101. /package/dist/plugin/skills/{devflow:tailwind → tailwind}/SKILL.md +0 -0
  102. /package/dist/plugin/skills/{devflow:taro → taro}/SKILL.md +0 -0
  103. /package/dist/plugin/skills/{devflow:ui-layout → ui-layout}/SKILL.md +0 -0
  104. /package/dist/plugin/skills/{devflow:vue → vue}/SKILL.md +0 -0
  105. /package/dist/plugin/skills/{devflow:workflow → workflow}/SKILL.md +0 -0
package/dist/cli.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,cpSync,writeFileSync as writeFileSync$1,rmSync,statSync as statSync$1,realpathSync,lstatSync,mkdtempSync,rmdirSync,readdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {execFileSync,spawnSync}from'node:child_process';import Mo,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import ol,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import _n from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,EmbeddingProvider}from'@devflow-tools/memory-engine';import {loadPlugins,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,getLocalHmacSecret,DevFlowApiClient}from'@devflow-tools/sdk';import {execSync,spawn}from'child_process';import {fileURLToPath as fileURLToPath$1}from'url';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import k from'chalk';import hi from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Wo=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var x=(e,t)=>{for(var n in t)Wo(e,n,{get:t[n],enumerable:true});};function hn(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function yn(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=Z(t.enabledPlugins)?t.enabledPlugins:{};n[Le]=true,t.enabledPlugins=n;let r=join$1(dirname(e),"plugins","marketplaces",fe),o=Z(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};o[fe]={source:{source:"directory",path:r}},t.extraKnownMarketplaces=o,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
3
- `);}function wn(e,t){let n=join$1(e,".claude"),r=join$1(n,"mcp.json"),o={};if(existsSync$1(r))try{o=JSON.parse(readFileSync$1(r,"utf-8"));}catch{console.warn("Warning: Could not parse existing mcp.json, skipping MCP config");return}else mkdirSync$1(n,{recursive:true});let s=o.mcpServers??{};s.devflow||(s.devflow={command:t,args:[],env:{}},o.mcpServers=s,writeFileSync$1(r,JSON.stringify(o,null,2)));}function vn(e,t,n,r){let o=join$1(t,fe,pn,n);mkdirSync$1(o,{recursive:true});let s=join$1(e,"hooks");existsSync$1(s)&&ke(s,join$1(o,"hooks"));for(let u of ["hooks.json","CLAUDE.md","package.json"]){let l=join$1(e,u);existsSync$1(l)&&cpSync(l,join$1(o,u),{force:true});}let i=join$1(e,".claude-plugin","plugin.json");existsSync$1(i)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(i,join$1(o,".claude-plugin","plugin.json"),{force:true}));let a=join$1(e,"dist");existsSync$1(a)&&ke(a,join$1(o,"dist"));let c=join$1(e,"skills");if(existsSync$1(c)&&ke(c,join$1(o,"skills")),Yo(o,e),r){let u=join$1(e,"dist","skills");existsSync$1(u)&&ke(u,r);}Zo(o),Jo(t,o),Vo(t,o,n);}function Jo(e,t){let n=join$1(e,".."),r=join$1(n,"marketplaces",fe),o=join$1(r,".claude-plugin");mkdirSync$1(o,{recursive:true});let s=relative(r,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(o,"marketplace.json"),`${JSON.stringify({name:fe,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:pn,source:s}]},null,2)}
4
- `);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!Z(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[fe]={source:{source:"directory",path:r},installLocation:r,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
5
- `);}function Vo(e,t,n){let r=join$1(e,"..","installed_plugins.json"),o={version:2,plugins:{}};if(existsSync$1(r)){let g;try{g=JSON.parse(readFileSync$1(r,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${r}`)}if(!Z(g))throw new Error(`Invalid Claude plugin registry: ${r}`);o=g;}else mkdirSync$1(dirname(r),{recursive:true});let s=o.plugins;if(s!==void 0&&!Z(s))throw new Error(`Invalid Claude plugin registry plugins: ${r}`);let i=s??{},a=i[Le];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Le}`);let c=a??[],u=c.find(g=>Z(g)&&g.scope==="user"),l=new Date().toISOString(),d=Z(u)&&typeof u.installedAt=="string"?u.installedAt:l,f=c.filter(g=>!Z(g)||g.scope!=="user");i[Le]=[...f,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:l}],o.version=2,o.plugins=i,writeFileSync$1(r,`${JSON.stringify(o,null,2)}
6
- `);}function Z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Yo(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let r=JSON.parse(readFileSync$1(n,"utf-8")),o=Object.keys(r.dependencies??{});if(o.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=o.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function ke(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let r=join$1(e,n),o=join$1(t,n);statSync$1(r).isDirectory()?ke(r,o):cpSync(r,o,{force:true});}}function Zo(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let r of readdirSync(t))if(r!==n){let o=join$1(t,r);statSync$1(o).isDirectory()&&rmSync(o,{recursive:true,force:true});}}var Le,fe,pn,kn=E(()=>{Le="devflow@devflow-local",fe="devflow-local",pn="devflow";});var Dn={};x(Dn,{initProject:()=>os,renderInitReport:()=>Rn});async function os(e,t={}){let n=join(e,".devflow"),r=[];existsSync(n)||(mkdirSync(n,{recursive:true}),r.push(".devflow/"));let o=join(n,"config.json");(!existsSync(o)||t.force)&&(writeFileSync(o,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),r.push(".devflow/config.json"));let s={created:r,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false};if(Pn.isInitialized(e)||await Pn.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:u,imports:l}=await i.indexAll(e),d=await a.build(u,l);s.indexed={files:c.length,symbols:u.length,graphNodes:d.nodes.length};}catch{s.indexed={files:0,symbols:0,graphNodes:0};}if(t.scan!==false)try{let i=await new OnboardingPackBuilder().build(e);r.push(".devflow/onboarding-pack.json");let a=join(n,"init-report.md");writeFileSync(a,Rn(i),"utf-8"),r.push(".devflow/init-report.md"),s.onboardingPack=i;}catch(i){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${i.message}`);}try{let i=hn(),a=homedir(),c=join(a,".claude","plugins","cache"),u=join(a,".claude","skills"),l=join(i,"package.json"),d=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";vn(i,c,d,u),s.pluginDeployed=!0;}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");yn(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=rs.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}wn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Rn(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
7
- `)}var Pn,rs,Cn=E(()=>{kn();Pn=_n.default??_n,rs=createRequire(import.meta.url);});var En={};x(En,{reviewPluginMemoryHints:()=>cs});async function cs(e,t,n={}){let r=n.isTTY??!!process.stdout.isTTY,o=new Set(t.split(",").map(ls).filter(Boolean));if(!r||o.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let l of o){let d=s.get(l);for(let f of d?.memory?.project?.conventions??[])i.push({id:`${l}:${f.key}`,pluginName:l,convention:f});}if(i.length===0)return {available:0,selected:0};let a=i.map(l=>({name:`${l.pluginName}: ${l.convention.value}`,value:l.id,checked:false})),c=await(n.select??(l=>checkbox({message:"Select optional plugin memory hints to save",choices:l})))(a),u=i.filter(l=>c.includes(l.id));return u.length>0&&await(n.write??us)(e,u),{available:i.length,selected:u.length}}function ls(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function us(e,t){let n=new MemoryGate(e);try{for(let r of t)await n.addMemory({category:"project_knowledge",content:`${r.convention.key}: ${r.convention.value}`,originalText:r.convention.value,source:"manual",confidence:r.convention.confidence,scope:`plugin:${r.pluginName}`});}finally{n.close();}}var $n=E(()=>{});function ge(){let e=[join(process.cwd(),"plugin-registry.json"),join(hs,"../plugin-registry.json"),join(process.cwd(),"packages/devflow/plugin-registry.json")];for(let t of e)try{let n=readFileSync(t,"utf-8");return JSON.parse(n)}catch{continue}return {version:"0.0.0",lastUpdated:new Date().toISOString(),plugins:[]}}function xn(){try{let e=execSync("npm list -g --depth=0 --json",{encoding:"utf-8"}),t=JSON.parse(e);return Object.keys(t.dependencies||{}).filter(n=>n.startsWith("@devflow-tools/plugin-"))}catch{return []}}var ps,hs,Ue=E(()=>{ps=fileURLToPath$1(import.meta.url),hs=dirname$1(ps);});var pt={};x(pt,{detectTechStack:()=>An,guidePluginInstallation:()=>bs,installPluginsFromList:()=>ks,resolvePluginName:()=>On});function An(e){let t=[];try{let n=JSON.parse(readFileSync(join(e,"package.json"),"utf-8")),r={...n.dependencies??{},...n.devDependencies??{}};r.react&&t.push("react"),r.next&&t.push("nextjs"),r.vue&&t.push("vue"),r.tailwindcss&&t.push("tailwind"),(r.nest||r["@nestjs/core"])&&t.push("nest"),r.express&&t.push("express"),r.typescript&&t.push("typescript");}catch{}return t}function On(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function ks(e){let t=e.split(",").map(On).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{execSync(`npm install -g ${n}`,{stdio:"inherit"}),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function bs(e){let t=ge();if(t.plugins.length===0)return console.log(`
2
+ import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,rmSync,cpSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,lstatSync,mkdtempSync,rmdirSync,readdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {execFileSync,spawnSync}from'node:child_process';import Wr,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import gl,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import Rn from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,EmbeddingProvider}from'@devflow-tools/memory-engine';import {loadPlugins,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,getLocalHmacSecret,DevFlowApiClient}from'@devflow-tools/sdk';import {execSync,spawn}from'child_process';import {fileURLToPath as fileURLToPath$1}from'url';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import S from'chalk';import Si from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var zr=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var $=(e,t)=>{for(var n in t)zr(e,n,{get:t[n],enumerable:true});};function wn(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function vn(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=X(t.enabledPlugins)?t.enabledPlugins:{};n[Ue]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",me),r=X(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[me]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
3
+ `);}function kn(e,t){let n=join$1(e,".claude"),o=join$1(n,"mcp.json"),r={};if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf-8"));}catch{console.warn("Warning: Could not parse existing mcp.json, skipping MCP config");return}else mkdirSync$1(n,{recursive:true});let s=r.mcpServers??{};s.devflow||(s.devflow={command:t,args:[],env:{}},r.mcpServers=s,writeFileSync$1(o,JSON.stringify(r,null,2)));}function bn(e,t,n,o){let r=join$1(t,me,yn,n);rmSync(r,{recursive:true,force:true}),mkdirSync$1(r,{recursive:true});let s=join$1(e,"hooks");existsSync$1(s)&&We(s,join$1(r,"hooks"));for(let u of ["CLAUDE.md","package.json"]){let l=join$1(e,u);existsSync$1(l)&&cpSync(l,join$1(r,u),{force:true});}let i=join$1(e,".claude-plugin","plugin.json");existsSync$1(i)&&(mkdirSync$1(join$1(r,".claude-plugin"),{recursive:true}),cpSync(i,join$1(r,".claude-plugin","plugin.json"),{force:true}));let a=join$1(e,"dist");existsSync$1(a)&&We(a,join$1(r,"dist"));let c=join$1(e,"skills");existsSync$1(c)&&We(c,join$1(r,"skills")),ns(r,e),os(r),es(t,r),ts(t,r,n);}function es(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",me),r=join$1(o,".claude-plugin");mkdirSync$1(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:me,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:yn,source:s}]},null,2)}
4
+ `);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!X(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[me]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
5
+ `);}function ts(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!X(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!X(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Ue];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Ue}`);let c=a??[],u=c.find(f=>X(f)&&f.scope==="user"),l=new Date().toISOString(),d=X(u)&&typeof u.installedAt=="string"?u.installedAt:l,g=c.filter(f=>!X(f)||f.scope!=="user");i[Ue]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:l}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
6
+ `);}function X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ns(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function We(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?We(o,r):cpSync(o,r,{force:true});}}function os(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let o of readdirSync(t))if(o!==n){let r=join$1(t,o);statSync$1(r).isDirectory()&&rmSync(r,{recursive:true,force:true});}}var Ue,me,yn,Sn=C(()=>{Ue="devflow@devflow-local",me="devflow-local",yn="devflow";});var Cn={};$(Cn,{initProject:()=>us,renderInitReport:()=>Dn});async function us(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json");(!existsSync(r)||t.force)&&(writeFileSync(r,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),o.push(".devflow/config.json"));let s={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false};if(En.isInitialized(e)||await En.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:u,imports:l}=await i.indexAll(e),d=await a.build(u,l);s.indexed={files:c.length,symbols:u.length,graphNodes:d.nodes.length};}catch{s.indexed={files:0,symbols:0,graphNodes:0};}if(t.scan!==false)try{let i=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let a=join(n,"init-report.md");writeFileSync(a,Dn(i),"utf-8"),o.push(".devflow/init-report.md"),s.onboardingPack=i;}catch(i){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${i.message}`);}try{let i=wn(),a=homedir(),c=join(a,".claude","plugins","cache"),u=join(a,".claude","skills"),l=join(i,"package.json"),d=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";bn(i,c,d,u),s.pluginDeployed=!0;}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");vn(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=ls.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}kn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Dn(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
7
+ `)}var En,ls,xn=C(()=>{Sn();En=Rn.default??Rn,ls=createRequire(import.meta.url);});var $n={};$($n,{reviewPluginMemoryHints:()=>ms});async function ms(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(ps).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let l of r){let d=s.get(l);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${l}:${g.key}`,pluginName:l,convention:g});}if(i.length===0)return {available:0,selected:0};let a=i.map(l=>({name:`${l.pluginName}: ${l.convention.value}`,value:l.id,checked:false})),c=await(n.select??(l=>checkbox({message:"Select optional plugin memory hints to save",choices:l})))(a),u=i.filter(l=>c.includes(l.id));return u.length>0&&await(n.write??hs)(e,u),{available:i.length,selected:u.length}}function ps(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function hs(e,t){let n=new MemoryGate(e);try{for(let o of t)await n.addMemory({category:"project_knowledge",content:`${o.convention.key}: ${o.convention.value}`,originalText:o.convention.value,source:"manual",confidence:o.convention.confidence,scope:`plugin:${o.pluginName}`});}finally{n.close();}}var An=C(()=>{});function pe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ss,"../plugin-registry.json"),join(process.cwd(),"packages/devflow/plugin-registry.json")];for(let t of e)try{let n=readFileSync(t,"utf-8");return JSON.parse(n)}catch{continue}return {version:"0.0.0",lastUpdated:new Date().toISOString(),plugins:[]}}function On(){try{let e=execSync("npm list -g --depth=0 --json",{encoding:"utf-8"}),t=JSON.parse(e);return Object.keys(t.dependencies||{}).filter(n=>n.startsWith("@devflow-tools/plugin-"))}catch{return []}}var bs,Ss,He=C(()=>{bs=fileURLToPath$1(import.meta.url),Ss=dirname$1(bs);});var yt={};$(yt,{detectTechStack:()=>Tn,guidePluginInstallation:()=>Ds,installPluginsFromList:()=>Es,resolvePluginName:()=>In});function Tn(e){let t=[];try{let n=JSON.parse(readFileSync(join(e,"package.json"),"utf-8")),o={...n.dependencies??{},...n.devDependencies??{}};o.react&&t.push("react"),o.next&&t.push("nextjs"),o.vue&&t.push("vue"),o.tailwindcss&&t.push("tailwind"),(o.nest||o["@nestjs/core"])&&t.push("nest"),o.express&&t.push("express"),o.typescript&&t.push("typescript");}catch{}return t}function In(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function Es(e){let t=e.split(",").map(In).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{execSync(`npm install -g ${n}`,{stdio:"inherit"}),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Ds(e){let t=pe();if(t.plugins.length===0)return console.log(`
8
8
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
9
9
  `),[];console.log(`
10
10
  \u{1F50C} Plugin Installation Guide
11
- `);let n=An(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
12
- `);let r=new Set(t.plugins.filter(i=>i.compatibleStacks.some(a=>n.includes(a))).map(i=>i.name));if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
13
- `);let i=[...r];for(let a of i)try{execSync(`npm install -g ${a}`,{stdio:"inherit"}),console.log(`\u2713 ${a}`);}catch{console.error(`\u2717 Failed to install ${a}`);}return i}let o=t.plugins.map(i=>({name:`${i.name.replace("@devflow-tools/","")} - ${i.description.substring(0,50)}`,value:i.name,checked:r.has(i.name)})),s;try{s=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:o});}catch{return console.log(`
11
+ `);let n=Tn(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
12
+ `);let o=new Set(t.plugins.filter(i=>i.compatibleStacks.some(a=>n.includes(a))).map(i=>i.name));if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
13
+ `);let i=[...o];for(let a of i)try{execSync(`npm install -g ${a}`,{stdio:"inherit"}),console.log(`\u2713 ${a}`);}catch{console.error(`\u2717 Failed to install ${a}`);}return i}let r=t.plugins.map(i=>({name:`${i.name.replace("@devflow-tools/","")} - ${i.description.substring(0,50)}`,value:i.name,checked:o.has(i.name)})),s;try{s=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:r});}catch{return console.log(`
14
14
  Plugin installation cancelled.
15
15
  `),[]}if(s.length>0){console.log(`
16
16
  Installing selected plugins...
@@ -18,23 +18,32 @@ Installing selected plugins...
18
18
  `);}catch{console.error(`\u2717 Failed to install ${i}
19
19
  `);}}else console.log(`
20
20
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
21
- `);return s}var ht=E(()=>{Ue();});var Hn={};x(Hn,{ResetExecutionError:()=>_e,executeResetCommand:()=>Hs,formatResetResult:()=>bt,runReset:()=>Bn});function Ns(){if(We)return We;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return We=e.DatabaseSync,We}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function bt(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Is(e){return e==="all"||Ln.includes(e)}function B(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function wt(e){let t=resolve(e),n=[];for(;!B(t);){let r=dirname(t);if(r===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=r;}return resolve(realpathSync(t),...n)}function St(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function js(e){if(typeof e!="string"||e.trim()==="")throw new Error("Project path must be an existing directory.");let t=resolve(e);try{if(!statSync$1(t).isDirectory())throw new Error("not a directory");return realpathSync(t)}catch{throw new Error(`Project path must be an existing directory: ${t}`)}}function Fn(e,t){let n=e;for(let r of relative(e,t).split(sep)){n=join$1(n,r);let o=B(n);if(!o)break;if(o.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(B(t)){let r=realpathSync(t);if(!St(e,r))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Ms(e,t){return (e==="all"?Ln:[e]).map(r=>({scope:r,path:join$1(t,...Mn[r])}))}function Un(e,t){let n=B(t);if(n)return Fn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Wn(e,t){let n=Un(e,t.path);if(!n||n.canonicalPath!==t.identity.canonicalPath||n.device!==t.identity.device||n.inode!==t.identity.inode)throw new Error(`Reset target changed after preflight: ${t.path}`)}function Ls(e){let t=B(e);if(!t?.isFile()||t.size<yt.length)return false;let n=Buffer.alloc(yt.length),r=openSync(e,"r");try{return readSync(r,n,0,n.length,0)===n.length&&n.equals(yt)}finally{closeSync(r);}}function Fs(e){let t=[];function n(r){let o=lstatSync(r);if(!o.isSymbolicLink()){if(o.isDirectory()){for(let s of readdirSync(r).sort())n(join$1(r,s));return}Ls(r)&&t.push(r);}}return n(e),t}function Us(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Ns())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Ws(e,t,n){let r=Fs(e),o=new Set;for(let s of r)o.add(s),o.add(`${s}-journal`),o.add(`${s}-shm`),o.add(`${s}-wal`);n(),cpSync(e,t,{recursive:true,filter:s=>!o.has(s)});for(let s of r){n();let i=join$1(t,relative(e,s));Us(s,i);}}function Bs(e,t,n,r,o){let s=!!B(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)o.beforeBackup(c.path),Ws(c.path,join$1(i,c.scope),()=>Wn(e,c));for(let c of n){let u=join$1(i,c.scope),l=join$1(t,c.scope);if(B(l))throw new Error(`Backup destination already exists: ${l}`);o.renamePath(u,l),a.push(l),r.backedUp.push({source:c.path,destination:l});}}catch(c){for(let u of a.reverse())rmSync(u,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&B(t))try{rmdirSync(t);}catch{}}}function Bn(e,t={}){if(!Is(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=js(e.project??process.cwd()),r=Ms(e.scope,n);for(let c of r)Fn(n,c.path);if(!e.backupTo&&!e.force)throw new Error("Refusing to reset without a backup. Provide --backup-to <dir> or use --force.");let o=r.flatMap(c=>{let u=Un(n,c.path);return u?[{...c,identity:u}]:[]}),s=e.backupTo?wt(e.backupTo):void 0;if(s){let c=B(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let u of o){let l=wt(u.path),d=join$1(s,u.scope),f=wt(d);if(St(l,f)||St(f,l))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${f}`);if(B(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,u)=>renameSync(c,u),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&o.length>0&&Bs(n,s,o,i,a);for(let c of o){try{a.beforeRemoval(c.path),Wn(n,c),a.removePath(c.path);}catch(u){let l=u instanceof Error?`: ${u.message}`:"";throw new _e(`Failed to remove reset target: ${c.path}${l}`,i,u)}i.removed.push(c.path);}return i}function Hs(e,t={},n=console){try{let r=Bn(e,t),o=bt(r);for(let s of o)n.log(s);return o.length===0&&n.log("Nothing to reset."),!0}catch(r){if(r instanceof _e)for(let o of bt(r.result))n.log(o);return n.error(`Error: ${r.message}`),false}}var We,_e,Mn,Ln,yt,Kn=E(()=>{_e=class extends Error{constructor(t,n,r){super(t,{cause:r}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Mn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Ln=Object.keys(Mn),yt=Buffer.from("SQLite format 3\0","binary");});var Xn={};x(Xn,{consolidateDatabases:()=>zs,formatConsolidateResult:()=>Js});function zs(e){let t=resolve(e.project),n=e.globalDbPath??getGlobalDevFlowDbPath(),r=join$1(t,".devflow","devflow.db"),o=join$1(t,".codegraph","codegraph.db");if(resolve(n)===resolve(r))throw new Error("The global target database cannot be the project-local legacy database");let s=existsSync$1(n),i=[Gn("project",r,s?n:void 0),Gn("codegraph",o,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(g=>g.exists&&Object.keys(g.tables).length>0),u=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),l=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??l,u);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let f=c.some(g=>g.kind==="project")?Vs(r):null;try{let g=new Map;for(let h of c){let v=join$1(d,`${h.kind}-${basename(h.path)}.snapshot`);zn(h.path,v),g.set(h.kind,v);}s&&zn(n,join$1(d,"global-devflow.db.before"));let m=g.has("project")?Zs(r,d):[];a.retired.push(...m.map(h=>h.destination));let p=null,w=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),g.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(g.get("project")),g.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(o),p.exec("BEGIN IMMEDIATE"),w=!0,g.has("project")&&Jn(p,"project_source",void 0,a.inserted),g.has("codegraph")){Jn(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of De(p,"codegraph_source").filter(R=>R.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${O(v)}`);}p.exec("COMMIT"),w=!1;}catch(h){if(w)try{p?.exec("ROLLBACK");}catch{}throw Qn(m),h}finally{p?.close();}return a}finally{Ys(f);}}function Js(e){let t=[`${e.dryRun?"Dry run":"Consolidated"} target: ${e.targetPath}`];for(let n of e.sources){let r=Object.values(n.tables).reduce((s,i)=>s+i,0),o=Object.values(n.conflicts).reduce((s,i)=>s+i,0);t.push(`${n.kind}: ${n.exists?`${r} rows, ${o} conflicts`:"not found"} (${n.path})`);}if(!e.dryRun){let n=Object.values(e.inserted).reduce((r,o)=>r+o,0);t.push(`Inserted: ${n} rows`),e.backupDir&&t.push(`Backup: ${e.backupDir}`);}return t}function Gn(e,t,n){let r={kind:e,path:t,exists:existsSync$1(t),tables:{},conflicts:{}};if(!r.exists)return r;let o=new DatabaseSync(t,{readOnly:true}),s=n&&existsSync$1(n)?new DatabaseSync(n,{readOnly:true}):null;try{let i=e==="codegraph"?new Set(DEVFLOW_TABLE_NAMES):null;for(let a of De(o).filter(c=>!i||i.has(c)))r.tables[a]=Dt(o,a),r.conflicts[a]=s&&De(s).includes(a)?Qs(o,s,a):0;}finally{o.close(),s?.close();}return r}function zn(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new DatabaseSync(e,{readOnly:true,timeout:1e4});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Vs(e){let t=new DatabaseSync(e);t.exec("PRAGMA busy_timeout = 1000");try{return t.exec("BEGIN IMMEDIATE"),t}catch(n){throw t.close(),new Error(`Cannot lock legacy database for migration: ${n.message}`)}}function Ys(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Zs(e,t){let n=[];try{for(let r of ["","-wal","-shm"]){let o=`${e}${r}`;if(!existsSync$1(o))continue;let s=join$1(t,`project-devflow.db.retired${r}`);renameSync(o,s),n.push({source:o,destination:s});}}catch(r){throw Qn(n),r}return n}function Qn(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Jn(e,t,n,r){let o=new Set(De(e)),s=De(e,t).filter(i=>o.has(i)&&(!n||n.has(i)));for(let i of s){let a=He(e,"main",i),c=new Set(He(e,t,i).map(m=>m.name)),u=a.filter(m=>c.has(m.name));if(Rt.has(i)&&(u=u.filter(m=>m.pk===0)),u.length===0)continue;let l=Dt(e,i),d=u.map(m=>O(m.name)).join(", "),f=u.map(m=>`s.${O(m.name)}`).join(", ");if(u.filter(m=>m.pk>0).length>0&&!Rt.has(i))e.exec(`INSERT OR IGNORE INTO main.${O(i)} (${d}) SELECT ${f} FROM ${O(t)}.${O(i)} s`);else {let m=u.map(p=>`t.${O(p.name)} IS s.${O(p.name)}`).join(" AND ");e.exec(`
22
- INSERT INTO main.${O(i)} (${d})
23
- SELECT ${f} FROM ${O(t)}.${O(i)} s
24
- WHERE NOT EXISTS (SELECT 1 FROM main.${O(i)} t WHERE ${m})
25
- `);}r[i]=(r[i]??0)+(Dt(e,i)-l);}}function Qs(e,t,n){let r=new Set(He(t,"main",n).map(u=>u.name)),o=He(e,"main",n).filter(u=>u.pk>0&&r.has(u.name));if(o.length===0||Rt.has(n))return 0;let s=o.map(u=>O(u.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${O(n)}`).all(),a=o.map(u=>`${O(u.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${O(n)} WHERE ${a} LIMIT 1`);return i.reduce((u,l)=>u+(c.get(...o.map(d=>l[d.name]))?1:0),0)}function De(e,t="main"){return e.prepare(`SELECT name FROM ${O(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(r=>r.name)}function He(e,t,n){return e.prepare(`PRAGMA ${O(t)}.table_info(${O(n)})`).all()}function Dt(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${O(t)}`).get();return Number(n.count)}function O(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var Rt,er=E(()=>{Rt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var tr={};x(tr,{connectAgent:()=>Ct,getAvailableAgents:()=>ti});async function Ct(e){let t=[],n={command:e.command??"devflow-mcp",args:["--mode","stdio"]},r=e.agent?[e.agent]:await import('@devflow-tools/adapters').then(o=>o.detectAll());for(let o of r){let s=await connect(o,n);t.push(`${o}: ${s.configPath} (${s.written?"written":"skipped"})`);}return t}function ti(){return listAdapters()}var Et=E(()=>{});async function $(e,t,n,r={}){let o=r.serverUrl??ri;if(r.skipServer)return n();let s=false,i=rr.get(o);if(i&&Date.now()-i.ts<oi?s=i.result:(s=await new DevFlowApiClient({baseUrl:o,projectRoot:e}).ping(),rr.set(o,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:o,projectRoot:e});return t(a)}return console.error(k.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var ri,rr,oi,X=E(()=>{ri=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",rr=new Map,oi=3e4;});var sr={};x(sr,{getIndexStatus:()=>si,refreshIndex:()=>ii});async function si(e){return $(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function ii(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var ir=E(()=>{X();});var ar={};x(ar,{getGraph:()=>ci});async function ci(e={}){let t=e.target??"all",n=e.depth??2;return $(process.cwd(),r=>r.getGraph(t,n),async()=>{let{graph:r}=await createEngines(process.cwd());if(t==="all")return r.export();let o=r.getSubGraph(t,n);return {nodes:o.nodes,edges:o.edges}},{skipServer:e.skipServer})}var cr=E(()=>{X();});var $t={};x($t,{getContext:()=>ui,getTaskContext:()=>di});async function ui(e){return $(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function di(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return $(t,r=>r.buildTaskContext(e.query,t,n),async()=>{let{context:r,codegraph:o}=await createEngines(t),s=o.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(r,{query:e.query,...n},i)},{skipServer:e.skipServer})}var xt=E(()=>{X();});var Ce={};x(Ce,{getWorkflowRuns:()=>ur,getWorkflowStatus:()=>mi,listWorkflows:()=>fi,runWorkflow:()=>gi});async function fi(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function gi(e,t,n){return $(process.cwd(),r=>r.runWorkflow(e,t),async()=>{let{workflow:r}=await createEngines(process.cwd());return r.run(e,t)},{skipServer:n})}async function mi(e){return ur(e)}async function ur(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Ee=E(()=>{X();});var ae={};x(ae,{backfillObservationVectors:()=>bi,queryMemory:()=>wi,reviewCandidates:()=>ki,reviewMemories:()=>_i,setMemory:()=>vi,showMemory:()=>yi});async function yi(e,t){let n=await $(process.cwd(),o=>o.getMemory(t),async()=>{let{memory:o}=await createEngines(process.cwd());return o.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let r=n;return Array.isArray(r.memories)?{...r,memories:r.memories.filter(o=>o?.source===t)}:n}async function wi(e={}){let t=process.cwd(),{skipServer:n,...r}=e;return $(t,o=>o.queryMemory(r),async()=>{let{memory:o}=await createEngines(t);return getMemoryResult(o,r)},{skipServer:n})}async function vi(e,t,n){return $(process.cwd(),async r=>{await r.setMemory("project",e,t);},async()=>{let{memory:r}=await createEngines(process.cwd());await r.updateUserPreference(e,t);},{skipServer:n})}async function ki(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function bi(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Si(e){let t=hi.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,r=>{t.close(),n(r.trim().toLowerCase());});})}async function _i(){let t=await $(process.cwd(),async o=>(await o.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:o}=await createEngines(process.cwd());return o.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((o,s)=>o.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&o.category!=="failure_lesson"?1:0),r=0;for(let o of n){console.log(`
26
- [${o.category}] (confidence: ${(o.confidence*100).toFixed(0)}%)`),console.log(` ${o.content}`);let s=await Si(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await $(process.cwd(),async i=>{await i.approveMemory(o.id);},async()=>{},{skipServer:false}),console.log(" Approved"),r++):s==="n"?(await $(process.cwd(),async i=>{await i.rejectMemory(o.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),r++):console.log(" -> Skipped");}console.log(`
27
- Reviewed ${r}/${t.length} pending memories.`);}var ce=E(()=>{X();});var fr={};x(fr,{getDocsStatus:()=>Di,queryKnowledge:()=>dr,searchKnowledge:()=>Ri,syncDocs:()=>Ci});async function dr(e,t,n,r){return $(process.cwd(),o=>o.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let o=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(o,{query:e,scope:t,budgetTokens:n})},{skipServer:r})}async function Ri(e,t,n){return (await dr(e,t,void 0,n)).results}async function Di(e){return $(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ci(e,t){return $(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var gr=E(()=>{X();});var Nt={};x(Nt,{backfillKnowledgeVectors:()=>Ai,resyncKnowledgeDocs:()=>xi});function mr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function xi(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=mr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Ai(e={}){let t=mr(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var It=E(()=>{});var hr=E(()=>{});var xe={};x(xe,{installSkill:()=>Li,listSkills:()=>vr,listSkillsSync:()=>ji,searchSkills:()=>Mi,uninstallSkill:()=>Fi});async function vr(e){return $(process.cwd(),async t=>(await t.listPlugins()).map(r=>({name:r.name,version:r.version,description:r.description,icon:r.icon,tags:r.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:e})}function ji(){return []}async function Mi(e,t){let n=await vr(t),r=e.toLowerCase();return n.filter(o=>o.name.toLowerCase().includes(r)||o.description.toLowerCase().includes(r)||o.tags.some(s=>s.toLowerCase().includes(r)))}function kr(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function br(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function Li(e,t=process.cwd(),n){return $(t,async r=>await r.installPlugin(e),async()=>{let r=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`,o=e.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(Ke,{recursive:true});try{execSync(`npm install --prefix "${Ke}" ${r}`,{stdio:"pipe",timeout:6e4});}catch{}let s=kr(t);s.plugins||(s.plugins=[]),s.plugins.includes(o)||(s.plugins.push(o),br(t,s));let i=[];try{i=JSON.parse(readFileSync(join(Ke,"node_modules",r,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:o,version:"0.1.0",templates:i}},{skipServer:n})}async function Fi(e,t=process.cwd(),n){return $(t,async r=>{await r.uninstallPlugin(e);},async()=>{let r=e.replace(/^@devflow-tools\/plugin-/,""),o=kr(t);o.plugins&&(o.plugins=o.plugins.filter(i=>i!==r),br(t,o));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(Ke,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var Ke,Ae=E(()=>{X();hr();Ke=join(process.env.HOME??"~",".devflow","skills");});var Ge={};x(Ge,{DEFAULT_SERVER_PORT:()=>qe,readPidFromFile:()=>Ft,readPortFromFile:()=>Rr,serverStatus:()=>Te,startServer:()=>Ut,stopServer:()=>Oe});function Lt(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Ki(){try{return _r.resolve("./server.js")}catch{try{return _r.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Rr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
28
- `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function Ft(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
29
- `),n=t.length>=2?t[1]:t[0],r=parseInt(n,10);return isNaN(r)?null:r}async function Ut(e){let t=Ki(),n=Lt(process.cwd()),r=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
30
- ${r.pid??0}`),r.unref(),{pid:r.pid??0}}async function Oe(){let e=Lt(process.cwd()),t=Ft(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Te(){let e=Lt(process.cwd()),t=Rr(e)??qe,{DevFlowApiClient:n}=await import('@devflow-tools/sdk');return await new n({baseUrl:`http://127.0.0.1:${t}`,projectRoot:process.cwd()}).ping()?{running:true,pid:Ft(e)??void 0,port:t}:{running:false,port:t}}var _r,qe,ee=E(()=>{_r=createRequire(import.meta.url);qe=13337;});var so={};x(so,{renderDoctorText:()=>ro,runDoctor:()=>fc,runDoctorAudit:()=>mc,runDoctorAuditFix:()=>pc,runDoctorCommand:()=>gc,runDoctorReceipts:()=>yc,runDoctorViolations:()=>hc,runLegacyDoctorReport:()=>oo,runStructuredDoctor:()=>nn});function Xt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Dr(e){return join$1(homedir$1(),".devflow","daemons",`${Xt(e)}.sock`)}function Yi(){return join$1(homedir$1(),".devflow","daemons.json")}function Kr(){if(Je)return Je;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Je=e.DatabaseSync,Je}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function A(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}function Jt(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Zi(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==Xt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Qi(e,t){let n=Jt(e),r=Xt(n.path),o=Dr(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:o,target:`path containing ${r}`,ok:o.includes(r),severity:"error"}],i=t.registryPath??Yi();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(f=>Zi(f).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let u=a.filter(f=>{if(typeof f!="object"||f===null)return !1;let g=f;return typeof g.rootPath!="string"||g.rootPath.length===0?!1:Jt(g.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"});let l=u.map(f=>Dr(f.rootPath));s.push({key:"registered_daemon_socket_paths",value:l,target:[o],ok:!0,severity:"info"});let d=u.filter((f,g)=>f.projectHash!==r||l[g]!==o).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"});}return {name:"Isolation",status:A(s),metrics:s}}function ea(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(o=>o.name)),r=[];for(let[o,s]of Object.entries(Xi)){if(!n.has(o)){r.push(o);continue}let i=new Set(e.prepare(`PRAGMA table_info(${o})`).all().map(a=>a.name));for(let a of s)i.has(a)||r.push(`${o}.${a}`);}return r.sort()}function qr(e){if(typeof e!="string")return null;try{let t=JSON.parse(e);return !Array.isArray(t)||!t.every(n=>typeof n=="string"&&n.trim().length>0)||new Set(t).size!==t.length?null:t}catch{return null}}function ta(e){let t=qr(e);return t&&t.length>0?t:null}function Bt(e){return typeof e=="bigint"?e>=0n&&e<=BigInt(Number.MAX_SAFE_INTEGER)?e:null:typeof e!="number"?null:Number.isSafeInteger(e)&&e>=0?e:null}function na(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Cr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function oa(e,t){let n=[],r=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(r))return n.push({key:"memories_db",value:"missing",target:`initialize ${r} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:A(n),metrics:n};n.push({key:"memories_db",value:r,target:"readable memory database",ok:true,severity:"info"});let o=t.openDatabase??(i=>new(Kr())(i,{readOnly:true})),s;try{let i=o(r);s=i;let a=ea(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:A(n),metrics:n};let c=(t.now??Date.now)(),u=i.prepare(`
21
+ `);return s}var wt=C(()=>{He();});var qn={};$(qn,{ResetExecutionError:()=>_e,executeResetCommand:()=>Vs,formatResetResult:()=>_t,runReset:()=>Kn});function Us(){if(Ke)return Ke;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ke=e.DatabaseSync,Ke}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function _t(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Ws(e){return e==="all"||Un.includes(e)}function G(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function kt(e){let t=resolve(e),n=[];for(;!G(t);){let o=dirname(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function Pt(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Bs(e){if(typeof e!="string"||e.trim()==="")throw new Error("Project path must be an existing directory.");let t=resolve(e);try{if(!statSync$1(t).isDirectory())throw new Error("not a directory");return realpathSync(t)}catch{throw new Error(`Project path must be an existing directory: ${t}`)}}function Wn(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=G(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(G(t)){let o=realpathSync(t);if(!Pt(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Hs(e,t){return (e==="all"?Un:[e]).map(o=>({scope:o,path:join$1(t,...Fn[o])}))}function Bn(e,t){let n=G(t);if(n)return Wn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Hn(e,t){let n=Bn(e,t.path);if(!n||n.canonicalPath!==t.identity.canonicalPath||n.device!==t.identity.device||n.inode!==t.identity.inode)throw new Error(`Reset target changed after preflight: ${t.path}`)}function Ks(e){let t=G(e);if(!t?.isFile()||t.size<vt.length)return false;let n=Buffer.alloc(vt.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(vt)}finally{closeSync(o);}}function qs(e){let t=[];function n(o){let r=lstatSync(o);if(!r.isSymbolicLink()){if(r.isDirectory()){for(let s of readdirSync(o).sort())n(join$1(o,s));return}Ks(o)&&t.push(o);}}return n(e),t}function Gs(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Us())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function zs(e,t,n){let o=qs(e),r=new Set;for(let s of o)r.add(s),r.add(`${s}-journal`),r.add(`${s}-shm`),r.add(`${s}-wal`);n(),cpSync(e,t,{recursive:true,filter:s=>!r.has(s)});for(let s of o){n();let i=join$1(t,relative(e,s));Gs(s,i);}}function Js(e,t,n,o,r){let s=!!G(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),zs(c.path,join$1(i,c.scope),()=>Hn(e,c));for(let c of n){let u=join$1(i,c.scope),l=join$1(t,c.scope);if(G(l))throw new Error(`Backup destination already exists: ${l}`);r.renamePath(u,l),a.push(l),o.backedUp.push({source:c.path,destination:l});}}catch(c){for(let u of a.reverse())rmSync(u,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&G(t))try{rmdirSync(t);}catch{}}}function Kn(e,t={}){if(!Ws(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Bs(e.project??process.cwd()),o=Hs(e.scope,n);for(let c of o)Wn(n,c.path);if(!e.backupTo&&!e.force)throw new Error("Refusing to reset without a backup. Provide --backup-to <dir> or use --force.");let r=o.flatMap(c=>{let u=Bn(n,c.path);return u?[{...c,identity:u}]:[]}),s=e.backupTo?kt(e.backupTo):void 0;if(s){let c=G(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let u of r){let l=kt(u.path),d=join$1(s,u.scope),g=kt(d);if(Pt(l,g)||Pt(g,l))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(G(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,u)=>renameSync(c,u),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Js(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Hn(n,c),a.removePath(c.path);}catch(u){let l=u instanceof Error?`: ${u.message}`:"";throw new _e(`Failed to remove reset target: ${c.path}${l}`,i,u)}i.removed.push(c.path);}return i}function Vs(e,t={},n=console){try{let o=Kn(e,t),r=_t(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof _e)for(let r of _t(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ke,_e,Fn,Un,vt,Gn=C(()=>{_e=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Fn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Un=Object.keys(Fn),vt=Buffer.from("SQLite format 3\0","binary");});var to={};$(to,{consolidateDatabases:()=>Xs,formatConsolidateResult:()=>ei});function Xs(e){let t=resolve(e.project),n=e.globalDbPath??getGlobalDevFlowDbPath(),o=join$1(t,".devflow","devflow.db"),r=join$1(t,".codegraph","codegraph.db");if(resolve(n)===resolve(o))throw new Error("The global target database cannot be the project-local legacy database");let s=existsSync$1(n),i=[Jn("project",o,s?n:void 0),Jn("codegraph",r,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(f=>f.exists&&Object.keys(f.tables).length>0),u=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),l=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??l,u);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let g=c.some(f=>f.kind==="project")?ti(o):null;try{let f=new Map;for(let w of c){let v=join$1(d,`${w.kind}-${basename(w.path)}.snapshot`);Vn(w.path,v),f.set(w.kind,v);}s&&Vn(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?oi(o,d):[];a.retired.push(...m.map(w=>w.destination));let p=null,y=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),y=!0,f.has("project")&&Yn(p,"project_source",void 0,a.inserted),f.has("codegraph")){Yn(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of Ee(p,"codegraph_source").filter(_=>_.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${T(v)}`);}p.exec("COMMIT"),y=!1;}catch(w){if(y)try{p?.exec("ROLLBACK");}catch{}throw eo(m),w}finally{p?.close();}return a}finally{ni(g);}}function ei(e){let t=[`${e.dryRun?"Dry run":"Consolidated"} target: ${e.targetPath}`];for(let n of e.sources){let o=Object.values(n.tables).reduce((s,i)=>s+i,0),r=Object.values(n.conflicts).reduce((s,i)=>s+i,0);t.push(`${n.kind}: ${n.exists?`${o} rows, ${r} conflicts`:"not found"} (${n.path})`);}if(!e.dryRun){let n=Object.values(e.inserted).reduce((o,r)=>o+r,0);t.push(`Inserted: ${n} rows`),e.backupDir&&t.push(`Backup: ${e.backupDir}`);}return t}function Jn(e,t,n){let o={kind:e,path:t,exists:existsSync$1(t),tables:{},conflicts:{}};if(!o.exists)return o;let r=new DatabaseSync(t,{readOnly:true}),s=n&&existsSync$1(n)?new DatabaseSync(n,{readOnly:true}):null;try{let i=e==="codegraph"?new Set(DEVFLOW_TABLE_NAMES):null;for(let a of Ee(r).filter(c=>!i||i.has(c)))o.tables[a]=Ct(r,a),o.conflicts[a]=s&&Ee(s).includes(a)?ri(r,s,a):0;}finally{r.close(),s?.close();}return o}function Vn(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new DatabaseSync(e,{readOnly:true,timeout:1e4});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function ti(e){let t=new DatabaseSync(e);t.exec("PRAGMA busy_timeout = 1000");try{return t.exec("BEGIN IMMEDIATE"),t}catch(n){throw t.close(),new Error(`Cannot lock legacy database for migration: ${n.message}`)}}function ni(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function oi(e,t){let n=[];try{for(let o of ["","-wal","-shm"]){let r=`${e}${o}`;if(!existsSync$1(r))continue;let s=join$1(t,`project-devflow.db.retired${o}`);renameSync(r,s),n.push({source:r,destination:s});}}catch(o){throw eo(n),o}return n}function eo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Yn(e,t,n,o){let r=new Set(Ee(e)),s=Ee(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Ge(e,"main",i),c=new Set(Ge(e,t,i).map(m=>m.name)),u=a.filter(m=>c.has(m.name));if(Dt.has(i)&&(u=u.filter(m=>m.pk===0)),u.length===0)continue;let l=Ct(e,i),d=u.map(m=>T(m.name)).join(", "),g=u.map(m=>`s.${T(m.name)}`).join(", ");if(u.filter(m=>m.pk>0).length>0&&!Dt.has(i))e.exec(`INSERT OR IGNORE INTO main.${T(i)} (${d}) SELECT ${g} FROM ${T(t)}.${T(i)} s`);else {let m=u.map(p=>`t.${T(p.name)} IS s.${T(p.name)}`).join(" AND ");e.exec(`
22
+ INSERT INTO main.${T(i)} (${d})
23
+ SELECT ${g} FROM ${T(t)}.${T(i)} s
24
+ WHERE NOT EXISTS (SELECT 1 FROM main.${T(i)} t WHERE ${m})
25
+ `);}o[i]=(o[i]??0)+(Ct(e,i)-l);}}function ri(e,t,n){let o=new Set(Ge(t,"main",n).map(u=>u.name)),r=Ge(e,"main",n).filter(u=>u.pk>0&&o.has(u.name));if(r.length===0||Dt.has(n))return 0;let s=r.map(u=>T(u.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${T(n)}`).all(),a=r.map(u=>`${T(u.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${T(n)} WHERE ${a} LIMIT 1`);return i.reduce((u,l)=>u+(c.get(...r.map(d=>l[d.name]))?1:0),0)}function Ee(e,t="main"){return e.prepare(`SELECT name FROM ${T(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Ge(e,t,n){return e.prepare(`PRAGMA ${T(t)}.table_info(${T(n)})`).all()}function Ct(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${T(t)}`).get();return Number(n.count)}function T(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var Dt,no=C(()=>{Dt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var oo={};$(oo,{connectAgent:()=>xt,getAvailableAgents:()=>ai});async function xt(e){let t=[],n={command:e.command??"devflow-mcp",args:["--mode","stdio"]},o=e.agent?[e.agent]:await import('@devflow-tools/adapters').then(r=>r.detectAll());for(let r of o){let s=await connect(r,n);t.push(`${r}: ${s.configPath} (${s.written?"written":"skipped"})`);}return t}function ai(){return listAdapters()}var $t=C(()=>{});async function x(e,t,n,o={}){let r=o.serverUrl??li;if(o.skipServer)return n();let s=false,i=so.get(r);if(i&&Date.now()-i.ts<ui?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),so.set(r,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:r,projectRoot:e});return t(a)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var li,so,ui,te=C(()=>{li=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",so=new Map,ui=3e4;});var ao={};$(ao,{getIndexStatus:()=>di,refreshIndex:()=>gi});async function di(e){return x(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function gi(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var co=C(()=>{te();});var lo={};$(lo,{getGraph:()=>mi});async function mi(e={}){let t=e.target??"all",n=e.depth??2;return x(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var uo=C(()=>{te();});var At={};$(At,{getContext:()=>hi,getTaskContext:()=>yi});async function hi(e){return x(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function yi(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var Ot=C(()=>{te();});var De={};$(De,{getWorkflowRuns:()=>fo,getWorkflowStatus:()=>ki,listWorkflows:()=>wi,runWorkflow:()=>vi});async function wi(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function vi(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function ki(e){return fo(e)}async function fo(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Ce=C(()=>{te();});var le={};$(le,{backfillObservationVectors:()=>Di,queryMemory:()=>Pi,reviewCandidates:()=>Ei,reviewMemories:()=>xi,setMemory:()=>Ri,showMemory:()=>_i});async function _i(e,t){let n=await x(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function Pi(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Ri(e,t,n){return x(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function Ei(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Di(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ci(e){let t=Si.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function xi(){let t=await x(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
26
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ci(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await x(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await x(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
27
+ Reviewed ${o}/${t.length} pending memories.`);}var ue=C(()=>{te();});var po={};$(po,{getDocsStatus:()=>Oi,queryKnowledge:()=>mo,searchKnowledge:()=>Ai,syncDocs:()=>Ti});async function mo(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function Ai(e,t,n){return (await mo(e,t,void 0,n)).results}async function Oi(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ti(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var ho=C(()=>{te();});var jt={};$(jt,{backfillKnowledgeVectors:()=>Mi,resyncKnowledgeDocs:()=>ji});function yo(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function ji(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=yo(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Mi(e={}){let t=yo(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var Mt=C(()=>{});var vo=C(()=>{});var $e={};$($e,{installSkill:()=>Ki,listSkills:()=>So,listSkillsSync:()=>Bi,searchSkills:()=>Hi,uninstallSkill:()=>qi});async function So(e){return x(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:e})}function Bi(){return []}async function Hi(e,t){let n=await So(t),o=e.toLowerCase();return n.filter(r=>r.name.toLowerCase().includes(o)||r.description.toLowerCase().includes(o)||r.tags.some(s=>s.toLowerCase().includes(o)))}function _o(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Po(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function Ki(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`,r=e.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(ze,{recursive:true});try{execSync(`npm install --prefix "${ze}" ${o}`,{stdio:"pipe",timeout:6e4});}catch{}let s=_o(t);s.plugins||(s.plugins=[]),s.plugins.includes(r)||(s.plugins.push(r),Po(t,s));let i=[];try{i=JSON.parse(readFileSync(join(ze,"node_modules",o,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:r,version:"0.1.0",templates:i}},{skipServer:n})}async function qi(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=e.replace(/^@devflow-tools\/plugin-/,""),r=_o(t);r.plugins&&(r.plugins=r.plugins.filter(i=>i!==o),Po(t,r));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(ze,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var ze,Ae=C(()=>{te();vo();ze=join(process.env.HOME??"~",".devflow","skills");});var Ve={};$(Ve,{DEFAULT_SERVER_PORT:()=>Je,readPidFromFile:()=>Wt,readPortFromFile:()=>Co,serverStatus:()=>Te,startServer:()=>Bt,stopServer:()=>Oe});function Ut(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Yi(){try{return Eo.resolve("./server.js")}catch{try{return Eo.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Co(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
28
+ `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function Wt(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
29
+ `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Bt(e){let t=Yi(),n=Ut(process.cwd()),o=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
30
+ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Oe(){let e=Ut(process.cwd()),t=Wt(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Te(){let e=Ut(process.cwd()),t=Co(e)??Je,{DevFlowApiClient:n}=await import('@devflow-tools/sdk');return await new n({baseUrl:`http://127.0.0.1:${t}`,projectRoot:process.cwd()}).ping()?{running:true,pid:Wt(e)??void 0,port:t}:{running:false,port:t}}var Eo,Je,ne=C(()=>{Eo=createRequire(import.meta.url);Je=13337;});var ur={};$(ur,{renderDoctorText:()=>cr,runDoctor:()=>kc,runDoctorAudit:()=>Sc,runDoctorAuditFix:()=>_c,runDoctorCommand:()=>bc,runDoctorReceipts:()=>Rc,runDoctorViolations:()=>Pc,runLegacyDoctorReport:()=>lr,runStructuredDoctor:()=>sn});function nn(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function xo(e){return join$1(homedir$1(),".devflow","daemons",`${nn(e)}.sock`)}function na(){return join$1(homedir$1(),".devflow","daemons.json")}function Jo(){if(Ze)return Ze;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ze=e.DatabaseSync,Ze}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function O(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}function Zt(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function oa(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==nn(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function ra(e,t){let n=Zt(e),o=nn(n.path),r=xo(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:o,ok:true,severity:"info"},{key:"daemon_socket_path",value:r,target:`path containing ${o}`,ok:r.includes(o),severity:"error"}],i=t.registryPath??na();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(g=>oa(g).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let u=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Zt(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let l=u.map(g=>xo(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:l,target:[r],ok:!0,severity:"info"});let d=u.filter((g,f)=>g.projectHash!==o||l[f]!==r).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),s.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:O(s),metrics:s}}function ia(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(r=>r.name)),o=[];for(let[r,s]of Object.entries(sa)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function Yo(e){if(typeof e!="string")return null;try{let t=JSON.parse(e);return !Array.isArray(t)||!t.every(n=>typeof n=="string"&&n.trim().length>0)||new Set(t).size!==t.length?null:t}catch{return null}}function aa(e){let t=Yo(e);return t&&t.length>0?t:null}function Kt(e){return typeof e=="bigint"?e>=0n&&e<=BigInt(Number.MAX_SAFE_INTEGER)?e:null:typeof e!="number"?null:Number.isSafeInteger(e)&&e>=0?e:null}function ca(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function $o(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function ua(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:O(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Jo())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=ia(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:O(n),metrics:n};let c=(t.now??Date.now)(),u=i.prepare(`
31
31
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
32
32
  FROM distill_leases
33
- `);u.setReadBigInts?.(!0);let l=u.all(),d=new Set,f=0,g=0;for(let h of l){let v=ta(h.event_ids),R=qr(h.session_ids),y=Bt(h.event_count),S=Bt(h.created_at),_=Bt(h.expires_at),N=typeof h.status=="string"&&ra.has(h.status)?h.status:null,oe=typeof h.batch_id=="string"&&h.batch_id.trim().length>0,ve=v!==null&&y!==null&&na(y,v.length);if(!oe||!v||!R||!ve||S===null||_===null||N===null){f+=1,h.status==="pending"&&(_===null||Cr(_,c))&&(g+=1);continue}if(!(N!=="pending"||!Cr(_,c)))for(let Uo of v)d.add(Uo);}n.push({key:"malformed_distill_leases",value:f,target:0,ok:f===0,severity:g>0?"error":"warning"});let p=i.prepare(`
33
+ `);u.setReadBigInts?.(!0);let l=u.all(),d=new Set,g=0,f=0;for(let h of l){let k=aa(h.event_ids),P=Yo(h.session_ids),A=Kt(h.event_count),q=Kt(h.created_at),W=Kt(h.expires_at),Fe=typeof h.status=="string"&&la.has(h.status)?h.status:null,Kr=typeof h.batch_id=="string"&&h.batch_id.trim().length>0,qr=k!==null&&A!==null&&ca(A,k.length);if(!Kr||!k||!P||!qr||q===null||W===null||Fe===null){g+=1,h.status==="pending"&&(W===null||$o(W,c))&&(f+=1);continue}if(!(Fe!=="pending"||!$o(W,c)))for(let Gr of k)d.add(Gr);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let p=i.prepare(`
34
34
  SELECT id
35
35
  FROM session_events
36
36
  WHERE processed = 0 AND created_at < ?
37
- `).all(c-300*1e3).filter(h=>!d.has(h.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let w=i.prepare(`
37
+ `).all(c-300*1e3).filter(h=>!d.has(h.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let y=j(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:y,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let w=j(i,`
38
+ SELECT COUNT(*) count
39
+ FROM session_events event
40
+ LEFT JOIN sessions session ON session.id = event.session_id
41
+ WHERE TRIM(event.session_id) = '' OR session.id IS NULL
42
+ `);n.push({key:"orphan_memory_events",value:w,target:0,ok:w===0,severity:"error"});let v=j(i,`
43
+ SELECT COUNT(*) count
44
+ FROM sessions
45
+ WHERE status = 'active' AND created_at < ?
46
+ `,c-Vo);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let _=i.prepare(`
38
47
  SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
39
48
  FROM (
40
49
  SELECT project, session_id, title, COUNT(*) AS title_count
@@ -42,84 +51,100 @@ ${r.pid??0}`),r.unref(),{pid:r.pid??0}}async function Oe(){let e=Lt(process.cwd(
42
51
  GROUP BY project, session_id, title
43
52
  HAVING COUNT(*) > 1
44
53
  )
45
- `).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:A(n),metrics:n}}function W(e,t){return (t.openDatabase??(r=>new(Kr())(r,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function H(e,t,...n){let r=e.prepare(t).get(...n);return Number(r?.count??0)}function Ht(e,t){return e===0?1:t/e}function sa(e,t){let n=[],r=null,o=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let f;try{f=W(s,t),L(f,"nodes")?(r=H(f,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:r,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});}catch(g){n.push({key:"codegraph_db_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let f;try{f=W(i,t);let g=L(f,"symbols_vec_rowids")?"symbols_vec_rowids":L(f,"symbol_sources")?"symbol_sources":null;g?(o=H(f,`SELECT COUNT(*) count FROM ${g}`),n.push({key:"symbols_vectors",value:o,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(g){n.push({key:"symbols_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}if(r!==null&&o!==null){let f=Ht(r,o);n.push({key:"symbols_vector_coverage",value:f,target:">= 0.90",ok:f>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let f;try{f=W(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!L(f,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let p=H(f,"SELECT COUNT(*) count FROM knowledge_chunks"),w=H(f,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),h=Ht(p,w),R=f.prepare(`
54
+ `).get();n.push({key:"duplicate_observation_title_groups",value:Number(_.group_count),target:0,ok:Number(_.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(_.row_count),target:0,ok:Number(_.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:O(n),metrics:n}}function H(e,t){return (t.openDatabase??(o=>new(Jo())(o,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function qt(e,t){return L(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function j(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Gt(e,t){return e===0?1:t/e}function da(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let g;try{g=H(s,t),L(g,"nodes")?(o=j(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let g;try{g=H(i,t);let f=L(g,"symbols_vec_rowids")?"symbols_vec_rowids":L(g,"symbol_sources")?"symbol_sources":null;f?(r=j(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Gt(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let g;try{g=H(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!L(g,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let p=j(g,"SELECT COUNT(*) count FROM knowledge_chunks"),y=j(g,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),w=Gt(p,y),_=g.prepare(`
46
55
  SELECT d.source source, COUNT(c.id) chunks,
47
56
  SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
48
57
  FROM knowledge_docs d
49
58
  LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
50
59
  LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
51
60
  GROUP BY d.source ORDER BY d.source
52
- `).all().map(y=>{let S=Number(y.chunks),_=Number(y.vectors);return {source:y.source,chunks:S,vectors:_,coverage:Ht(S,_)}});n.push({key:"knowledge_chunks",value:p,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:w,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:h,target:">= 0.95",ok:h>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:R,target:"every source >= 0.95",ok:R.every(y=>y.coverage>=.95),severity:"warning"});}}catch(g){n.push({key:"knowledge_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let f;try{if(f=W(c,t),!L(f,"observations")||!L(f,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let g=H(f,"SELECT COUNT(*) count FROM observations"),m=H(f,`
61
+ `).all().map(h=>{let k=Number(h.chunks),P=Number(h.vectors);return {source:h.source,chunks:k,vectors:P,coverage:Gt(k,P)}});n.push({key:"knowledge_chunks",value:p,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:w,target:">= 0.95",ok:w>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:_,target:"every source >= 0.95",ok:_.every(h=>h.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=H(c,t),!L(g,"observations")||!L(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=j(g,"SELECT COUNT(*) count FROM observations"),m=j(g,`
53
62
  SELECT COUNT(DISTINCT e.source_id) count
54
63
  FROM embeddings e JOIN observations o ON o.id = e.source_id
55
64
  WHERE e.source_type = 'observation'
56
- `),p=Math.max(0,g-m);n.push({key:"observations",value:g,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:m,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:p,target:0,ok:p===0,severity:"warning"});}}catch(g){n.push({key:"observation_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let u=(t.now??Date.now)(),l=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(l))try{let f=u-864e5;d=readFileSync$1(l,"utf8").split(`
57
- `).filter(g=>{let m=/^\[([^\]]+)\]/.exec(g);return m?Date.parse(m[1])>=f:!1}).length;}catch(f){n.push({key:"embedder_error_log_read",value:f.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:A(n),metrics:n}}function ia(e,t,n){let r=[],o=n.homePath??homedir$1(),s=n.homePath?join$1(o,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(o),i=(n.now??Date.now)()-1440*60*1e3,a=t?"error":"warning";if(!existsSync$1(s))r.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=W(s,n),r.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[w,h]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let v=L(m,h)?H(m,`SELECT COUNT(*) count FROM ${h} WHERE created_at >= ?`,i):0;r.push({key:w,value:v,ok:!0,severity:"info"});}let p=L(m,"telemetry_failures")?H(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;if(r.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a}),L(m,"tool_call_events"))if(m.prepare("PRAGMA table_info(tool_call_events)").all().map(h=>h.name).includes("failure_category")){let h=m.prepare(`
65
+ `),p=Math.max(0,f-m);n.push({key:"observations",value:f,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:m,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:p,target:0,ok:p===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let u=(t.now??Date.now)(),l=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(l))try{let g=u-864e5;d=readFileSync$1(l,"utf8").split(`
66
+ `).filter(f=>{let m=/^\[([^\]]+)\]/.exec(f);return m?Date.parse(m[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:O(n),metrics:n}}function ga(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=H(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[h,k]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let P=L(m,k)?j(m,`SELECT COUNT(*) count FROM ${k} WHERE created_at >= ?`,i):0;o.push({key:h,value:P,ok:!0,severity:"info"});}let p=L(m,"telemetry_failures")?j(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let y=qt(m,"sessions"),w=qt(m,"tool_call_events"),v=qt(m,"skill_executions"),_=["id","project_root","started_at","status"].every(h=>y.has(h));if(o.push({key:"telemetry_session_schema",value:_?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:_,severity:"error"}),_){let h=j(m,`
67
+ SELECT COUNT(*) count FROM sessions
68
+ WHERE project_root = ? AND started_at >= ?
69
+ `,e,i);o.push({key:"session_start_evidence_24h",value:h,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let k=j(m,`
70
+ SELECT COUNT(*) count FROM sessions
71
+ WHERE project_root = ? AND status = 'running' AND started_at < ?
72
+ `,e,(n.now??Date.now)()-Vo);o.push({key:"stale_telemetry_sessions",value:k,target:0,ok:k===0,severity:"error"});let P=0;w.has("session_id")&&(P=j(m,`
73
+ SELECT COUNT(*) count
74
+ FROM tool_call_events event
75
+ LEFT JOIN sessions session ON session.id = event.session_id
76
+ WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
77
+ `));let A=0;v.has("session_id")&&(A=j(m,`
78
+ SELECT COUNT(*) count
79
+ FROM skill_executions execution
80
+ LEFT JOIN sessions session ON session.id = execution.session_id
81
+ WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
82
+ `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:P,skillExecutions:A},target:{toolCalls:0,skillExecutions:0},ok:P===0&&A===0,severity:"error"});}if(L(m,"tool_call_events"))if(w.has("failure_category")){let h=m.prepare(`
58
83
  SELECT failure_category category, COUNT(*) count
59
84
  FROM tool_call_events
60
85
  WHERE timestamp >= ? AND failure_category IS NOT NULL
61
86
  GROUP BY failure_category
62
87
  ORDER BY failure_category
63
- `).all(i),v=Object.fromEntries(h.map(_=>[_.category,Number(_.count)])),R=H(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),y=h.reduce((_,N)=>_+Number(N.count),0),S=R===0?1:y/R;r.push({key:"failure_categories_24h",value:v,ok:!0,severity:"info"}),r.push({key:"failure_category_coverage_24h",value:S,target:">= 0.80",ok:S>=.8,severity:a});}else r.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}catch(p){r.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let c=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(o,".devflow","telemetry-cache")])],u=0;try{u=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(w=>w.endsWith(".json")).length:0),0),r.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:a});}catch(m){r.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let l=join$1(e,".devflow","devflow.db"),d=existsSync$1(l);r.push({key:"project_local_telemetry_db",value:d?l:"absent",target:"absent",ok:!d,severity:a});let f=join$1(e,".codegraph","codegraph.db"),g=[];if(existsSync$1(f)){let m;try{m=W(f,n),g=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){r.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return r.push({key:"codegraph_devflow_tables",value:g,target:[],ok:g.length===0,severity:a}),{name:"Telemetry",status:A(r),metrics:r}}function $r(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Gr(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function ca(e){let t=[],n=e.homePath??homedir$1(),r=e.env??process.env,o=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,l])=>!r[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),d=$r(o),f=l.isDirectory()&&!l.isSymbolicLink(),g=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:o,mode:d},target:{type:"directory",mode:"700"},ok:f&&g,severity:f?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,d,f]of s){if(r[d]?.trim()){t.push({key:`${l}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let g=join$1(o,f);if(!existsSync$1(g)){t.push({key:`${l}_source`,value:"missing",target:g,ok:false,severity:"warning"});continue}try{let m=lstatSync(g),p=$r(g),w=readFileSync$1(g,"utf8").trim(),h=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:g,mode:p,bytes:Buffer.byteLength(w)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&w.length>0&&(process.platform==="win32"||p==="400"),severity:!h||w.length===0?"error":"warning"});}catch(m){t.push({key:`${l}_source`,value:m.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,u=0;if(existsSync$1(a))try{let l=(e.now??Date.now)()-ye;for(let d of readFileSync$1(a,"utf8").split(`
64
- `))if(d.trim())try{let f=JSON.parse(d),g=Gr(f.ts);g===null?u+=1:g>=l&&(c+=1);}catch{u+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:u,target:0,ok:u===0,severity:"error"}),{name:"Runtime security",status:A(t),metrics:t}}function la(e){let t=[],n=e.homePath??homedir$1(),r=getGlobalDevFlowDbPath(n);if(!existsSync$1(r))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:A(t),metrics:t};let o;try{if(o=W(r,e),!L(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:A(t),metrics:t};let s=o.prepare(`
88
+ `).all(i),k=Object.fromEntries(h.map(W=>[W.category,Number(W.count)])),P=j(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),A=h.reduce((W,Fe)=>W+Number(Fe.count),0),q=P===0?1:A/P;o.push({key:"failure_categories_24h",value:k,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:q,target:">= 0.80",ok:q>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let c=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:a});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let l=join$1(e,".devflow","devflow.db"),d=existsSync$1(l);o.push({key:"project_local_telemetry_db",value:d?l:"absent",target:"absent",ok:!d,severity:a});let g=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(g)){let m;try{m=H(g,n),f=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){o.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:O(o),metrics:o}}function Oo(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Zo(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function ma(e){let t=[],n=e.homePath??homedir$1(),o=e.env??process.env,r=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,l])=>!o[l]?.trim())&&!existsSync$1(r))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(r))t.push({key:"key_directory",value:"missing",target:r,ok:false,severity:"warning"});else try{let l=lstatSync(r),d=Oo(r),g=l.isDirectory()&&!l.isSymbolicLink(),f=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:g&&f,severity:g?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,d,g]of s){if(o[d]?.trim()){t.push({key:`${l}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let f=join$1(r,g);if(!existsSync$1(f)){t.push({key:`${l}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let m=lstatSync(f),p=Oo(f),y=readFileSync$1(f,"utf8").trim(),w=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:f,mode:p,bytes:Buffer.byteLength(y)},target:{type:"regular file",mode:"400",nonempty:!0},ok:w&&y.length>0&&(process.platform==="win32"||p==="400"),severity:!w||y.length===0?"error":"warning"});}catch(m){t.push({key:`${l}_source`,value:m.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,u=0;if(existsSync$1(a))try{let l=(e.now??Date.now)()-ve;for(let d of readFileSync$1(a,"utf8").split(`
89
+ `))if(d.trim())try{let g=JSON.parse(d),f=Zo(g.ts);f===null?u+=1:f>=l&&(c+=1);}catch{u+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:u,target:0,ok:u===0,severity:"error"}),{name:"Runtime security",status:O(t),metrics:t}}function pa(e){let t=[],n=e.homePath??homedir$1(),o=getGlobalDevFlowDbPath(n);if(!existsSync$1(o))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:O(t),metrics:t};let r;try{if(r=H(o,e),!L(r,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:O(t),metrics:t};let s=r.prepare(`
65
90
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
66
91
  FROM benchmark_reports
67
92
  ORDER BY created_at DESC
68
93
  LIMIT 1
69
- `).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:A(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(s.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");i=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),u=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(u)?Number((u/ye).toFixed(2)):null,target:"0-30",ok:Number.isFinite(u)&&u>=0&&u<=aa,severity:u<0||!Number.isFinite(u)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:A(t),metrics:t}}function ua(e){if(!existsSync$1(e))return {bytes:0,files:0};let t=[e],n=0,r=0;for(;t.length>0;){let o=t.pop(),s=lstatSync(o);if(!s.isSymbolicLink()){if(s.isDirectory()){for(let i of readdirSync(o))t.push(join$1(o,i));continue}s.isFile()&&(n+=s.size,r+=1);}}return {bytes:n,files:r}}function da(e){let t=[],n=e.homePath??homedir$1(),r=[join$1(n,".devflow","errors","hook-fallback.log")],o=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(o))try{for(let h of readdirSync(o))h.endsWith(".log")&&r.push(join$1(o,h));}catch(h){t.push({key:"hook_fallback_directory_read",value:h.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ye,i=0,a=0;for(let h of [...new Set(r)])if(existsSync$1(h))try{for(let v of readFileSync$1(h,"utf8").split(`
70
- `))if(v.trim())try{let R=JSON.parse(v),y=Gr(R.ts);y===null||typeof R.reason!="string"?a+=1:y>=s&&(i+=1);}catch{a+=1;}}catch(v){t.push({key:"hook_fallback_log_read",value:{path:h,error:v.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),u=0,l=0,d=null;if(existsSync$1(c)){let h;try{if(h=W(c,e),L(h,"telemetry_events")){let v=h.prepare(`
94
+ `).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:O(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(s.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");i=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),u=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(u)?Number((u/ve).toFixed(2)):null,target:"0-30",ok:Number.isFinite(u)&&u>=0&&u<=fa,severity:u<0||!Number.isFinite(u)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Benchmark",status:O(t),metrics:t}}function ha(e){if(!existsSync$1(e))return {bytes:0,files:0};let t=[e],n=0,o=0;for(;t.length>0;){let r=t.pop(),s=lstatSync(r);if(!s.isSymbolicLink()){if(s.isDirectory()){for(let i of readdirSync(r))t.push(join$1(r,i));continue}s.isFile()&&(n+=s.size,o+=1);}}return {bytes:n,files:o}}function ya(e){let t=[],n=e.homePath??homedir$1(),o=[join$1(n,".devflow","errors","hook-fallback.log")],r=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(r))try{for(let w of readdirSync(r))w.endsWith(".log")&&o.push(join$1(r,w));}catch(w){t.push({key:"hook_fallback_directory_read",value:w.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ve,i=0,a=0;for(let w of [...new Set(o)])if(existsSync$1(w))try{for(let v of readFileSync$1(w,"utf8").split(`
95
+ `))if(v.trim())try{let _=JSON.parse(v),h=Zo(_.ts);h===null||typeof _.reason!="string"?a+=1:h>=s&&(i+=1);}catch{a+=1;}}catch(v){t.push({key:"hook_fallback_log_read",value:{path:w,error:v.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),u=0,l=0,d=null;if(existsSync$1(c)){let w;try{if(w=H(c,e),L(w,"telemetry_events")){let v=w.prepare(`
71
96
  SELECT COUNT(*) total,
72
97
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
73
98
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
74
99
  FROM telemetry_events
75
100
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
76
- `).get(s);u=Number(v?.total??0),l=Number(v?.failures??0),d=v?.average_duration==null?null:Math.round(Number(v.average_duration)*100)/100;}}catch(v){t.push({key:"hook_daemon_metrics_read",value:v.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{h?.close();}}let f=Math.max(i,l),g=Math.max(u,f),m=g===0?0:f/g;t.push({key:"hook_daemon_requests_24h",value:g,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(m*1e4)/1e4,target:0,ok:f===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let p=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:p,target:[],ok:p.length===0,severity:"warning"});let w=join$1(n,".devflow","logs","hook-debug");try{let h=ua(w);t.push({key:"hook_debug_log_bytes",value:h.bytes,target:`<= ${Er}`,ok:h.bytes<=Er,severity:"warning"}),t.push({key:"hook_debug_log_files",value:h.files,target:"rotated per project",ok:!0,severity:"info"});}catch(h){t.push({key:"hook_debug_log_read",value:h.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:A(t),metrics:t}}function ue(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function rt(e){return JSON.parse(readFileSync$1(e,"utf8"))}function U(e){return typeof e=="object"&&e!==null?e:null}function Yr(e,t){return ma.has(e)&&!(t.tolerateControlSyntax&&pa.has(e))}function Me(e,t={}){if(Buffer.byteLength(e)>Vr)return {segments:[],malformed:true};let n=[],r=[],o="",s=null,i=false,a=false,c=()=>{o.length>0&&r.push(o),o="";},u=()=>{c(),r.length>0&&n.push(r),r=[];};for(let l=0;l<e.length;l+=1){let d=e[l];if(i){o+=d,i=false;continue}if(s==="'"){d==="'"?s=null:o+=d;continue}if(d==="\\"){if(e[l+1]===`
101
+ `).get(s);u=Number(v?.total??0),l=Number(v?.failures??0),d=v?.average_duration==null?null:Math.round(Number(v.average_duration)*100)/100;}}catch(v){t.push({key:"hook_daemon_metrics_read",value:v.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{w?.close();}}let g=Math.max(i,l),f=Math.max(u,g),m=f===0?0:g/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(m*1e4)/1e4,target:0,ok:g===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let p=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:p,target:[],ok:p.length===0,severity:"warning"});let y=join$1(n,".devflow","logs","hook-debug");try{let w=ha(y);t.push({key:"hook_debug_log_bytes",value:w.bytes,target:`<= ${Ao}`,ok:w.bytes<=Ao,severity:"warning"}),t.push({key:"hook_debug_log_files",value:w.files,target:"rotated per project",ok:!0,severity:"info"});}catch(w){t.push({key:"hook_debug_log_read",value:w.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:O(t),metrics:t}}function ie(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function fe(e){return JSON.parse(readFileSync$1(e,"utf8"))}function N(e){return typeof e=="object"&&e!==null?e:null}function tr(e,t){return ka.has(e)&&!(t.tolerateControlSyntax&&ba.has(e))}function Le(e,t={}){if(Buffer.byteLength(e)>er)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},u=()=>{c(),o.length>0&&n.push(o),o=[];};for(let l=0;l<e.length;l+=1){let d=e[l];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[l+1]===`
77
102
  `){l+=1;continue}if(e[l+1]==="\r"&&e[l+2]===`
78
- `){l+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax&&(a=true),o+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax){a=true,o+=d;continue}let f=e.slice(l,l+2);if(d==="#"&&o.length===0){for(;l<e.length&&e[l]!==`
79
- `;)l+=1;u();continue}f==="<<"&&!t.tolerateControlSyntax&&(a=true);let g=d==="{"&&o==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(l))||d==="}"&&ha.test(`${o}}`);if(["(",")","{","}"].includes(d)&&!g&&!t.tolerateControlSyntax&&(a=true),f==="&&"||f==="||"){u(),l+=1;continue}if([";","|","&",`
80
- `].includes(d)){u();continue}if(/\s/.test(d)){c();continue}o+=d;}return (s!==null||i)&&(a=true),u(),n.some(l=>{let d=l.find(f=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(f));return d!==void 0&&Yr(d,t)})&&(a=true),{segments:n,malformed:a}}function ya(e){return Me(e).segments.flat().join(" ")}function wa(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function Zr(e,t){return wa(e,t)?"shell":/^#![^\n]*\b(?:node|tsx)\b/.test(t)?"node":/^#![^\n]*\bpython(?:3)?\b/.test(t)?"python":[".cjs",".js",".mjs",".ts"].includes(extname(e))?"node":extname(e)===".py"?"python":"infer"}function va(e){let t=e.split(""),n=null;for(let r=0;r<e.length;r+=1){let o=e[r];if(n!==null){o==="\\"?r+=1:o===n&&(n=null);continue}if(o==="'"||o==='"'||o==="`"){n=o;continue}if(o!=="/"||!["/","*"].includes(e[r+1]??""))continue;let s=e[r+1]==="*";for(t[r]=" ",t[r+1]=" ",r+=2;r<e.length;){if(s&&e[r]==="*"&&e[r+1]==="/"){t[r]=" ",t[r+1]=" ",r+=1;break}if(!s&&e[r]===`
81
- `){r-=1;break}e[r]!==`
82
- `&&e[r]!=="\r"&&(t[r]=" "),r+=1;}}return t.join("")}function ka(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="#"){for(;n<e.length&&e[n]!==`
83
- `;)t[n]=" ",n+=1;continue}if(r!=="'"&&r!=='"')continue;let o=r,s=e.slice(n,n+3)===o.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===o.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
84
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function J(e,t,n="infer"){let r=t?ya(e):n==="node"?va(e):n==="python"?ka(e):e;return [...new Set(r.match(fa)??[])]}function ba(e){return Me(e).segments.flat()}function V(e,t,n=false,r="infer"){let o=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of o){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:r}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),u=re(a,i)?a:re(c,i)?c:dirname(i);return {path:i,containmentRoot:u,cwd:t.cwd,parserKind:r}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:r}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:r}:null}function Sa(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),r=e.slice(t+1),o=n.split(";").includes("base64")?Buffer.from(r,"base64"):Buffer.from(decodeURIComponent(r),"utf8");if(o.length>Vr||o.includes(0))return null;let s=o.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function tn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Sa(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ye(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:V(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||de(n))return {malformed:true};let r=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!r)return {malformed:false};let o={project:e.project,homePath:e.homePath,cwd:e.cwd};if(r){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=Pa(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:V(s,o,true,e.parserKind)??void 0,malformed:false}}return {reference:V(n,o,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:V(i,o,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function _a(e){let t=[e];extname(e)===""&&t.push(...xr.map(n=>`${e}${n}`),...xr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Pa(e,t,n){if(n==="cjs")try{let o=createRequire$1(t).resolve(e);return isBuiltin(o)?null:o}catch{}let r=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return _a(r)??r}function Ra(e){let t=[],n=false;for(let r=0;r<e.length;){let o=e[r];if(/\s/.test(o)){r+=1;continue}if(o==="/"&&e[r+1]==="/"){for(r+=2;r<e.length&&e[r]!==`
85
- `;)r+=1;continue}if(o==="/"&&e[r+1]==="*"){let s=e.indexOf("*/",r+2);if(s<0){n=true;break}r=s+2;continue}if(o==="'"||o==='"'){let s=o,i="",a=true;r+=1;let c=false;for(;r<e.length;){let u=e[r];if(u===s){c=true,r+=1;break}if(u==="\\"){if(a=false,r+1>=e.length)break;i+=e[r+1],r+=2;continue}if(u===`
86
- `||u==="\r"){a=false;break}i+=u,r+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(o==="`"){let s=false,i=false;for(r+=1;r<e.length;){let a=e[r];if(!s&&a==="`"){i=true,r+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),r+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(o)){let s=r+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(r,s),valid:true}),r=s;continue}t.push({kind:"punctuation",value:o,valid:true}),r+=1;}return {tokens:t,malformed:n}}function Da(e,t,n,r=true){let o=Ra(t),s=[],i=o.malformed,a=(d,f)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:f,issuerPath:e});},{tokens:c}=o;for(let d=0;d<c.length;d+=1){let f=c[d],g=c[d-1];if(f.kind!=="identifier")continue;if(f.value==="eval"&&g?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(f.value==="require"){if(g?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(g?.value==="."||!["export","import"].includes(f.value))continue;if(f.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"esm");continue}if(f.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(f.value==="import"&&c[d+1]?.value===".")continue;let m=-1;for(let p=d+1;p<Math.min(c.length,d+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){m=p;break}m>=0?a(c[m+1],"esm"):f.value==="import"&&(i=true);}let u=[],l=[];for(let d of s){let f=tn(d,r);f.reference&&u.push(f.reference),f.inlineContent&&l.push(f.inlineContent),i||=f.malformed;}return {references:u,inlineContents:l,malformed:i}}function Ca(e){let t=e.split(""),n=false;for(let r=0;r<e.length;){let o=e[r];if(o==="#"){for(;r<e.length&&e[r]!==`
87
- `;)t[r]=" ",r+=1;continue}if(o!=="'"&&o!=='"'){r+=1;continue}let s=r;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,r),a=/^(?:f|fr|rf)$/i.test(i),c=o,u=e.slice(r,r+3)===c.repeat(3),l=u?3:1,d=r;for(let g=0;g<l;g+=1)t[d+g]=" ";d+=l;let f=false;for(;d<e.length;){if(e[d]==="\\"){t[d]=" ",d+1<e.length&&(t[d+1]=" "),d+=2;continue}if(e.slice(d,d+l)===c.repeat(l)){for(let g=0;g<l;g+=1)t[d+g]=" ";d+=l,f=true;break}if(!u&&(e[d]===`
103
+ `){l+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let g=e.slice(l,l+2);if(d==="#"&&r.length===0){for(;l<e.length&&e[l]!==`
104
+ `;)l+=1;u();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(l))||d==="}"&&Sa.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){u(),l+=1;continue}if([";","|","&",`
105
+ `].includes(d)){u();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),u(),n.some(l=>{let d=l.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&tr(d,t)})&&(a=true),{segments:n,malformed:a}}function _a(e){return Le(e).segments.flat().join(" ")}function Pa(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function nr(e,t){return Pa(e,t)?"shell":/^#![^\n]*\b(?:node|tsx)\b/.test(t)?"node":/^#![^\n]*\bpython(?:3)?\b/.test(t)?"python":[".cjs",".js",".mjs",".ts"].includes(extname(e))?"node":extname(e)===".py"?"python":"infer"}function Ra(e){let t=e.split(""),n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n!==null){r==="\\"?o+=1:r===n&&(n=null);continue}if(r==="'"||r==='"'||r==="`"){n=r;continue}if(r!=="/"||!["/","*"].includes(e[o+1]??""))continue;let s=e[o+1]==="*";for(t[o]=" ",t[o+1]=" ",o+=2;o<e.length;){if(s&&e[o]==="*"&&e[o+1]==="/"){t[o]=" ",t[o+1]=" ",o+=1;break}if(!s&&e[o]===`
106
+ `){o-=1;break}e[o]!==`
107
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Ea(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="#"){for(;n<e.length&&e[n]!==`
108
+ `;)t[n]=" ",n+=1;continue}if(o!=="'"&&o!=='"')continue;let r=o,s=e.slice(n,n+3)===r.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===r.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
109
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function Y(e,t,n="infer"){let o=t?_a(e):n==="node"?Ra(e):n==="python"?Ea(e):e;return [...new Set(o.match(wa)??[])]}function Da(e){return Le(e).segments.flat()}function Z(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),u=se(a,i)?a:se(c,i)?c:dirname(i);return {path:i,containmentRoot:u,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function Ca(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),o=e.slice(t+1),r=n.split(";").includes("base64")?Buffer.from(o,"base64"):Buffer.from(decodeURIComponent(o),"utf8");if(r.length>er||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function rn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Ca(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Xe(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:Z(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||ge(n))return {malformed:true};let o=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!o)return {malformed:false};let r={project:e.project,homePath:e.homePath,cwd:e.cwd};if(o){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=$a(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:Z(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:Z(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:Z(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function xa(e){let t=[e];extname(e)===""&&t.push(...To.map(n=>`${e}${n}`),...To.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function $a(e,t,n){if(n==="cjs")try{let r=createRequire$1(t).resolve(e);return isBuiltin(r)?null:r}catch{}let o=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return xa(o)??o}function Aa(e){let t=[],n=false;for(let o=0;o<e.length;){let r=e[o];if(/\s/.test(r)){o+=1;continue}if(r==="/"&&e[o+1]==="/"){for(o+=2;o<e.length&&e[o]!==`
110
+ `;)o+=1;continue}if(r==="/"&&e[o+1]==="*"){let s=e.indexOf("*/",o+2);if(s<0){n=true;break}o=s+2;continue}if(r==="'"||r==='"'){let s=r,i="",a=true;o+=1;let c=false;for(;o<e.length;){let u=e[o];if(u===s){c=true,o+=1;break}if(u==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(u===`
111
+ `||u==="\r"){a=false;break}i+=u,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function Oa(e,t,n,o=true){let r=Aa(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let m=-1;for(let p=d+1;p<Math.min(c.length,d+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){m=p;break}m>=0?a(c[m+1],"esm"):g.value==="import"&&(i=true);}let u=[],l=[];for(let d of s){let g=rn(d,o);g.reference&&u.push(g.reference),g.inlineContent&&l.push(g.inlineContent),i||=g.malformed;}return {references:u,inlineContents:l,malformed:i}}function Ta(e){let t=e.split(""),n=false;for(let o=0;o<e.length;){let r=e[o];if(r==="#"){for(;o<e.length&&e[o]!==`
112
+ `;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,u=e.slice(o,o+3)===c.repeat(3),l=u?3:1,d=o;for(let f=0;f<l;f+=1)t[d+f]=" ";d+=l;let g=false;for(;d<e.length;){if(e[d]==="\\"){t[d]=" ",d+1<e.length&&(t[d+1]=" "),d+=2;continue}if(e.slice(d,d+l)===c.repeat(l)){for(let f=0;f<l;f+=1)t[d+f]=" ";d+=l,g=true;break}if(!u&&(e[d]===`
88
113
  `||e[d]==="\r"))break;e[d]!==`
89
- `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let g=e.slice(r+l,d-l);for(let m=0;m<g.length;m+=1)if(g[m]==="{"){if(g[m+1]==="{"){m+=1;continue}n=true;break}}n||=!f,r=d;}return {content:t.join(""),malformed:n}}function Ar(e,t){let n=t.split(".");if(n.length>en)return {paths:[],resolved:false};let r=[],o=e;for(let s=0;s<n.length;s+=1){o=join$1(o,n[s]);let i=join$1(o,"__init__.py");try{if(statSync$1(i).isFile()){r.push(i);continue}}catch{}if(s===n.length-1){let c=`${o}.py`;try{if(statSync$1(c).isFile())return r.push(c),{paths:r,resolved:!0}}catch{return {paths:r,resolved:false}}return {paths:r,resolved:false}}try{if(!statSync$1(o).isDirectory())return {paths:r,resolved:!1}}catch{return {paths:r,resolved:false}}}return {paths:r,resolved:r.length>0}}function Ea(e,t,n){let r=Ca(t),o=[],s=r.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(r.content),i=d=>{let f=dirname(e);for(let g=1;g<d;g+=1)f=dirname(f);return f},a=d=>{let f=V(d,{...n,cwd:dirname(e)},true,"python");f?o.push(f):s=true;},c=(d,f=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let g=i(f),m=Ar(g,d);s||=!m.resolved;for(let w of m.paths)a(w);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},u=d=>{let f=[];for(let g of d.split(",")){let m=g.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}f.push(m);}return f},l=(d,f)=>{for(let g of u(f))d&&Ar(d,g).resolved&&(s=true);};for(let d of r.content.split(/\r?\n/))for(let f of d.split(/[;:]/)){let g=f.trim();if(g.startsWith("import ")){let y=g.slice(7).split(",");for(let S of y)c(S.trim().split(/\s+as\s+/)[0]);continue}let m=g.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,w=m[2];if(w){let y=c(w,p);l(y,m[3]);continue}if(p===0){s=true;continue}let h=i(p),v=join$1(h,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),l(h,m[3]);continue}for(let y of u(m[3]))c(y,p);}return {references:[...new Map(o.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Qr(e,t,n,r,o=true){return n==="node"?Da(e,t,r,o):n==="python"?Ea(e,t,r):{references:[],inlineContents:[],malformed:false}}function Or(e,t,n,r=t){let o={project:t,homePath:n,cwd:r},s=Qe(e,0,o),i=new Set((s.artifacts??[]).map(f=>f.value)),a=s.tokens.filter(f=>!i.has(f)).map(f=>V(f,o)).filter(f=>f!==null),c=[],u=[...s.inlineContents??[]],l=s.malformed;for(let f of s.artifacts??[]){if(f.nodeResolutionKind){let m=tn(f);m.reference&&c.push(m.reference),m.inlineContent&&u.push(m.inlineContent),l||=m.malformed;continue}let g=V(f.value,{...o,cwd:f.cwd},true,f.parserKind);g?c.push(g):l=true;}let d=[...a,...c];return {references:[...new Map(d.map(f=>[`${f.path}:${f.parserKind}`,f])).values()],inlineContents:u,malformed:l}}function Xr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function de(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Ye(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function Ne(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Ta(e,t,n){let r=[],o=[],s=false,i=(l,d)=>{r.push(l),o.push({value:l,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=de(l);},a=(l=s)=>({tokens:r,artifacts:o,malformed:l}),c=t,u=false;for(;c<e.length;){let l=e[c];if(l==="--"){let w=e[c+1];return w&&!u&&i(w),w?a():a(true)}if(!l.startsWith("-"))return u||i(l),a();if(Oa.has(l))return a();if(Aa.has(l)){u=true,c+=1;continue}let d=Tr.has(l)?"cjs":Nr.has(l)?"esm":null;if(d){let w=e[c+1];if(!w)return a(true);i(w,d),c+=2;continue}let f=Ne(l,Tr),g=Ne(l,Nr),m=f??g;if(m!==null){if(!m)return a(true);i(m,f!==null?"cjs":"esm"),c+=1;continue}if(l.startsWith("-r")&&l.length>2){i(l.slice(2),"cjs"),c+=1;continue}if(Ir.has(l)){let w=e[c+1];return a(w===void 0?true:s||Ye(w))}let p=Ne(l,Ir);if(p!==null)return a(s||Ye(p));if((l.startsWith("-e")||l.startsWith("-p"))&&l.length>2)return a(s||Ye(l.slice(2)));if(jr.has(l)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(Ne(l,jr)!==null){c+=1;continue}if(xa.has(l)){c+=1;continue}return a(true)}return u?a():a(true)}function Ma(e,t,n,r,o){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:r.cwd,project:r.project,homePath:r.homePath,parserKind:"shell"}],malformed:de(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Qe(a,n+1,r,o):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Na.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:r.cwd,project:r.project,homePath:r.homePath,parserKind:"shell"}],malformed:de(i)}}return {tokens:[],malformed:true}}function La(e,t,n){let r=t;for(;r<e.length;){let o=e[r];if(o==="--"){let s=e[r+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:de(s)}:{tokens:[],malformed:true}}if(!o.startsWith("-"))return {tokens:[o],artifacts:[{value:o,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:de(o)};if(ja.has(o))return {tokens:[],malformed:false};if(o==="-c"||o==="-m"||o.startsWith("-c"))return {tokens:[],malformed:true};if(Mr.has(o)){if(e[r+1]===void 0)return {tokens:[],malformed:true};r+=2;continue}if(Ne(o,Mr)!==null){r+=1;continue}if(Ia.has(o)){r+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Kt(e,t){let n=V(e,t,true);if(!n)return null;let r=ue(n.path),o=ue(t.project);return !r||!o||!re(o,r)?null:r}function Wa(e,t,n,r,o){let s=n;if(e==="builtin"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="command"){for(;t[s]?.startsWith("-");){let i=t[s];if(/^-[pvV]+$/.test(i)&&/[vV]/.test(i))return {index:t.length,malformed:false};s+=1;}return {index:s,malformed:s>=t.length}}if(e==="exec"){for(;t[s]?.startsWith("-");)t[s]==="-a"||t[s]==="--argv0"?s+=2:s+=1;return {index:s,malformed:s>=t.length}}if(e==="nohup"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="env"){let i=r;for(;s<t.length;){let a=t[s];if(Xr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let u=Me(c,o);return u.malformed||u.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...u.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],u=c?Kt(c,i):null;if(!u)return {index:s,malformed:true};i={...i,cwd:u},s+=2;}else if(a.startsWith("--chdir=")){let c=Kt(a.slice(8),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(a.startsWith("-C")&&a.length>2){let c=Kt(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function Qe(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},r={}){if(t>Jr)return {tokens:[],malformed:true};let o=Me(e,r),s=[],i=[],a=[],c=o.malformed;for(let u of o.segments){let l=eo(u,t,n,r);s.push(...l.tokens),i.push(...l.artifacts??[]),a.push(...l.inlineContents??[]),c||=l.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function eo(e,t,n,r){let o=0;for(;Xr(e[o]??"");)o+=1;let s=e[o];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Fa.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Jr)return {tokens:i,malformed:true};let p=Wa(basename(s),e,o+1,n,r);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let w=eo(p.replacement,a,p.context??n,r);return i.push(...w.tokens),{tokens:i,artifacts:w.artifacts,inlineContents:w.inlineContents,malformed:w.malformed}}if(o=p.index,s=e[o],!s)return {tokens:i,malformed:false}}let u=basename(s),l=!s.includes(sep)&&Yr(u,r),d=c&&!Ua.has(u);if(l||d)return {tokens:i,malformed:true};let f=de(s);i.push(s);let g=u;if(!$a.has(g))return {tokens:i,malformed:f};let m=["node","tsx"].includes(g)?Ta(e,o+1,n):["bash","sh","zsh"].includes(g)?Ma(e,o+1,a,n,r):La(e,o+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:f||m.malformed}}function to(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,r=t.lastIndexOf(n);return r<0?null:ue(t.slice(0,r))}function Ba(e,t){let n=new Map;for(let r of t)for(let o of ba(r)){let s=to(o);if(!s)continue;let i=n.get(s)??[];i.push(r),n.set(s,i);}return [...n].map(([r,o])=>({root:r,configPath:e,commands:[...new Set(o)]}))}function Ha(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Ka(e){return e.slice(e.lastIndexOf("@")+1)}function Lr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=ue(t);if(n&&existsSync$1(join$1(n,"hooks.json")))return n}return null}function qa(e,t,n){let r=Ka(e),o=U(t.extraKnownMarketplaces),s=U(o?.[r]);if(s){let i=U(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Lr(i.path):null}}try{let i=U(rt(n)),a=U(i?.[r]);if(a){let c=U(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Lr(c.path):null}}}catch{}return {configured:false,root:null}}function Fr(e){let t=[e?.lastUpdated,e?.installedAt].map(n=>{if(typeof n=="number"&&Number.isFinite(n)&&n>=0)return n;if(typeof n!="string")return null;let r=Date.parse(n);return Number.isFinite(r)?r:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function Ga(e,t){let n=U(e.entry),r=U(t.entry),o=Fr(n),s=Fr(r);if(o!==s)return o===null?1:s===null?-1:s-o;let i=typeof n?.version=="string"?Xe(n.version):null,a=typeof r?.version=="string"?Xe(r.version):null;if(i&&a){let c=no(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function za(e,t){try{let n=U(rt(t));if(!n)throw new Error("installed plugin manifest must be an object");let r=U(n.plugins);if(!r)throw new Error("installed plugin manifest plugins must be an object");let o=r?.[e];if(o===void 0)return {configured:!1,root:null};if(!Array.isArray(o)||o.length===0)return {configured:!0,malformed:!0,root:null};let s=o.map((a,c)=>({entry:a,index:c})).sort(Ga)[0],i=U(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:ue(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Xe(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function no(e,t){for(let r of ["major","minor","patch"])if(e[r]!==t[r])return e[r]-t[r];if(e.prerelease.length===0||t.prerelease.length===0)return t.prerelease.length-e.prerelease.length;let n=Math.max(e.prerelease.length,t.prerelease.length);for(let r=0;r<n;r+=1){let o=e.prerelease[r],s=t.prerelease[r];if(o===void 0)return -1;if(s===void 0)return 1;if(o===s)continue;let i=/^\d+$/.test(o)?Number(o):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:o.localeCompare(s)}return 0}function Ja(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let r=e.slice(0,n),o=e.slice(n+1),s=join$1(t,o,r),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),u=a.name;try{let l=U(rt(join$1(c,"package.json")));typeof l?.version=="string"&&(u=l.version);}catch{}return {name:a.name,path:c,version:u,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let u=Xe(a.version),l=Xe(c.version);if(u&&l){let d=no(l,u);if(d!==0)return d}else if(u||l)return u?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?ue(i[0].path):null}function Va(e,t){if(t.legacyArtifactRoots!==void 0){let y=t.legacyArtifactRoots.map(S=>ue(S)).filter(S=>S!==null).map(S=>({root:S,inspectPluginConfig:true}));return {targets:y,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:y.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),r=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),o=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],u=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let y of u)if(existsSync$1(y))try{let S=U(rt(y));if(!S)throw new Error("settings must be an object");i.push({path:y,settings:S});}catch{a.push(y);}if(i.reduce((y,S)=>typeof S.settings.disableAllHooks=="boolean"?S.settings.disableAllHooks:y,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(y=>{let S=[];return et(y.settings.hooks,S),{path:y.path,commands:S}}),f=d.flatMap(y=>y.commands),g=d.flatMap(y=>Ba(y.path,y.commands)),p=[...i.reduce((y,S)=>{let _=S.settings.enabledPlugins;if(typeof _!="object"||_===null)return y;for(let[N,oe]of Object.entries(_))Ha(N)&&typeof oe=="boolean"&&y.set(N,oe);return y},new Map)].filter(([,y])=>y).map(([y])=>y).sort(),w=[...g],h=false;for(let y of p){let S=za(y,r);S.malformed&&c.push(r);let _=S.root;if(!S.configured){let N=i.map(ve=>qa(y,ve.settings,o)).filter(ve=>ve.configured),oe=N[N.length-1];oe?_=oe.root:_=Ja(y,s);}_?w.push({root:_,inspectPluginConfig:true}):h=true;}let v=[...w.reduce((y,S)=>{let _=y.get(S.root);return _?(y.set(S.root,{root:S.root,configPath:_.configPath??S.configPath,commands:[...new Set([..._.commands??[],...S.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||S.inspectPluginConfig)}),y):(y.set(S.root,S),y)},new Map).values()],R=[f.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(y=>y!==null);return {targets:v,configCommands:d.filter(y=>y.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${h?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||f.length>0)&&!h&&a.length===0&&c.length===0}}function Ya(e){let t=e;for(;;){let n=join$1(t,"package.json");if(existsSync$1(n))try{if(JSON.parse(readFileSync$1(n,"utf8")).workspaces)return t}catch{}let r=dirname(t);if(r===t)return;t=r;}}function et(e,t){if(Array.isArray(e)){for(let n of e)et(n,t);return}if(!(typeof e!="object"||e===null))for(let[n,r]of Object.entries(e))n==="command"&&typeof r=="string"?t.push(r):et(r,t);}function qt(e){return [...e.matchAll(ga)].map(t=>t[1])}function Za(e){let t=new Map,n=Me(e,{tolerateControlSyntax:true});for(let r of n.segments.flat()){let o=r.match(/^([A-Za-z_][A-Za-z0-9_]*)=(\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/[A-Za-z0-9._/-]+)$/);o&&t.set(o[1],o[2]);}return t.size===0?e:e.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,(r,o,s)=>t.get(o??s??"")??r)}function Qa(e){let t=spawnSync("bash",["--noprofile","--norc","-n"],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??"",BASH_ENV:"",ENV:""},input:e,timeout:2e3});return t.error!==void 0||t.status!==0}function Xa(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function Gt(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Vt(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ve)return {kind:"unsafe",reason:"oversized"};let n;try{n=openSync(e,constants.O_RDONLY|constants.O_NONBLOCK|constants.O_NOFOLLOW);}catch{return {kind:"missing"}}try{let r=fstatSync(n);if(!r.isFile())return {kind:"unsafe",reason:"nonregular"};if(r.size>Ve)return {kind:"unsafe",reason:"oversized"};let o=Buffer.alloc(Math.min(r.size+1,Ve+1)),s=0;for(;s<o.length;){let c=readSync(n,o,s,o.length-s,null);if(c===0)break;s+=c;}if(s>Ve)return {kind:"unsafe",reason:"oversized"};let i=o.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Yt(e,t){return `${e} (${t})`}function ec(e,t,n,r){let o=[],s=new Set,i=0,a=(c,u=0)=>{if(u>en){r.traversalLimitRoots.push(e);return}let l=resolve(c.path),d=resolve(c.containmentRoot),f;try{f=realpathSync.native(d);}catch{f=d;}if(!existsSync$1(l)){re(d,l)?r.missing.push(l):r.escapedArtifacts.push(l);return}let g;try{g=realpathSync.native(l);}catch{r.missing.push(l);return}if(!re(f,g)){r.escapedArtifacts.push(l);return}let m=`${g}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),o.push({...c,path:g,depth:u}));};for(let c of n){let u=Or(c,e,t);u.malformed&&r.malformedCommands.push(c);for(let l of u.inlineContents)for(let d of J(l.content,false,"node"))r.findings.push({artifact:l.source,endpoint:d});for(let l of u.references)a(l);}for(;o.length>0;){if(i>=zr){r.traversalLimitRoots.push(e);break}let c=o.shift(),u=c.path;i+=1;let l=Vt(u);if(l.kind==="missing"){r.missing.push(u);continue}if(l.kind==="unsafe"){l.reason!=="binary"&&r.unsafeArtifacts.push(Yt(u,l.reason));continue}let{content:d}=l;r.inspected.push(u);let f=c.parserKind==="infer"?Zr(u,d):c.parserKind,g=f==="shell";for(let m of J(d,g,f))r.findings.push({artifact:u,endpoint:m});if(g){let m=Or(d,e,t,c.cwd);m.malformed&&r.malformedCommands.push(u);for(let p of m.inlineContents)for(let w of J(p.content,false,"node"))r.findings.push({artifact:p.source,endpoint:w});for(let p of m.references)a(p,c.depth+1);}else if(f==="node"||f==="python"){let m=Qr(u,d,f,{project:e,homePath:t,cwd:dirname(u)});m.malformed&&r.malformedCommands.push(u);for(let p of m.inlineContents)for(let w of J(p.content,false,"node"))r.findings.push({artifact:p.source,endpoint:w});for(let p of m.references)a(p,c.depth+1);}}}function tc(e,t,n,r){let o=realpathSync.native(n.root),s=[],i=new Set,a=Ya(o),c=0,u=(g,m=false,p=o,w="infer",h=e,v=0)=>{if(v>en){r.traversalLimitRoots.push(o);return}let R=realpathSync.native(p),y=resolve(g);if(!existsSync$1(y)){if(!re(R,y)){r.escapedArtifacts.push(y);return}m&&r.missing.push(y);return}let S;try{S=realpathSync.native(y);}catch{m&&r.missing.push(y);return}if(!re(R,S)){r.escapedArtifacts.push(y);return}let _=`${S}:${w}:${h}`;i.has(_)||(i.add(_),s.push({path:S,parserKind:w,cwd:h,depth:v}));},l=(g,m,p,w=0)=>{for(let h of qt(g)){let v=Gt(o,h);if(!v)continue;let R=(m.artifacts??[]).find(y=>y.value.includes("PLUGIN_ROOT")&&y.value.endsWith(h));u(v,true,o,R?.parserKind??"infer",R?.cwd??p,w);}},d=(g,m,p=0,w=false)=>{for(let h of g.artifacts??[]){if(h.value.includes("PLUGIN_ROOT"))continue;let v=h.nodeResolutionKind?tn(h,!w):{reference:V(h.value,{project:h.project,homePath:h.homePath,cwd:h.cwd},true,h.parserKind)??void 0,malformed:false};if(v.malformed){r.malformedCommands.push(h.value);continue}if(v.inlineContent)for(let R of J(v.inlineContent.content,false,"node"))r.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&u(v.reference.path,true,w?o:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},f=g=>{for(let p of J(g,true))r.findings.push({artifact:n.configPath??join$1(o,"hooks.json"),endpoint:p});let m=Qe(g,0,{project:e,homePath:t,cwd:e});m.malformed&&r.malformedCommands.push(g),l(g,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let w=to(p),h=(m.artifacts??[]).find(v=>v.value===p);w===o&&u(p,true,o,h?.parserKind??"infer",h?.cwd??e);}};if(n.commands){n.configPath&&r.configsInspected.push(n.configPath);for(let g of n.commands)f(g);}if(n.inspectPluginConfig||!n.commands){let g=join$1(o,"hooks.json");if(!existsSync$1(g))r.missing.push(g),u(join$1(o,"hooks","session-start"));else {r.configsInspected.push(g);let m;try{m=realpathSync.native(g);}catch{r.missing.push(g),u(join$1(o,"hooks","session-start")),m="";}if(m&&!re(o,m)&&(r.escapedArtifacts.push(g),u(join$1(o,"hooks","session-start")),m=""),m){let p=Vt(m);if(p.kind==="unsafe")r.unsafeArtifacts.push(Yt(g,p.reason)),u(join$1(o,"hooks","session-start"));else if(p.kind==="missing")r.missing.push(g),u(join$1(o,"hooks","session-start"));else try{let w=JSON.parse(p.content),h=[];et(w,h);for(let v of h)f(v);}catch{r.malformedConfigs.push(g),u(join$1(o,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=zr){r.traversalLimitRoots.push(o);break}let g=s.shift(),m=g.path;c+=1;let p=Vt(m);if(p.kind==="missing"){r.missing.push(m);continue}if(p.kind==="unsafe"){r.unsafeArtifacts.push(Yt(m,p.reason));continue}let{content:w}=p;r.inspected.push(m);let h=g.parserKind==="infer"?Zr(m,w):g.parserKind,v=h==="shell";for(let S of J(w,v,h))r.findings.push({artifact:m,endpoint:S});if(v){let S=Za(w),_=Qe(S,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});Qa(w)&&r.malformedCommands.push(m),l(S,_,dirname(m),g.depth+1),d(_,dirname(m),g.depth+1,true);}else if(h==="node"||h==="python"){let S=Qr(m,w,h,{project:e,homePath:t,cwd:dirname(m)},false);(h==="node"?Xa(m):S.malformed)&&r.malformedCommands.push(m);for(let _ of S.inlineContents)for(let N of J(_.content,false,"node"))r.findings.push({artifact:_.source,endpoint:N});for(let _ of S.references){let N=relative(o,resolve(_.path));!N.startsWith(`..${sep}`)&&N.split(sep).includes("node_modules")||u(_.path,true,o,_.parserKind,_.cwd,g.depth+1);}for(let _ of qt(w)){let N=Gt(o,_);N&&u(N,true,o,h,g.cwd,g.depth+1);}}else for(let S of qt(w)){let _=Gt(o,S);_&&u(_,true,o,h,g.cwd,g.depth+1);}let R=m.startsWith(`${o}/`)?m.slice(o.length+1):"",y=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&u(join$1(a,"packages","devflow","src","hooks",`${y}.ts`),false,a),R.startsWith("hooks/")&&u(join$1(o,"dist","hooks",`${y}.js`));}}function nc(e,t){let n=Va(e,t),r={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let h of n.configCommands){r.configsInspected.push(h.path);for(let v of h.commands){r.commandsInspected.push({configPath:h.path,command:v});for(let R of J(v,true))r.findings.push({artifact:h.path,endpoint:R});}}ec(e,t.homePath??homedir$1(),n.configCommands.flatMap(h=>h.commands).filter(h=>!n.targets.some(v=>v.commands?.includes(h))),r);for(let h of n.targets)tc(e,t.homePath??homedir$1(),h,r);let o=[...new Set(r.configsInspected)],s=[...new Set(r.inspected)],i=r.commandsInspected.filter((h,v,R)=>R.findIndex(y=>y.configPath===h.configPath&&y.command===h.command)===v),a=[...new Set(r.missing)],c=[...new Set(r.malformedConfigs)],u=[...new Set(r.malformedCommands)],l=[...new Set(r.unsafeArtifacts)],d=[...new Set(r.traversalLimitRoots)],f=[...new Set(r.escapedArtifacts)],g=r.findings.filter((h,v,R)=>R.findIndex(y=>y.artifact===h.artifact&&y.endpoint===h.endpoint)===v),m=a.length>0||f.length>0||l.length>0,w=[{key:"active_plugin_resolution",value:m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(h=>h.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:o.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||o.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:f.length,target:0,ok:f.length===0,severity:"warning"},{key:"retired_producer_paths",value:g.length,target:0,ok:g.length===0,severity:"error"},{key:"retired_producer_path_findings",value:g,ok:true,severity:"info"}];return {name:"Legacy paths",status:A(w),metrics:w}}function rc(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(r=>!!r))];for(let r of n)if(existsSync$1(r))try{return {path:r,manifest:JSON.parse(readFileSync$1(r,"utf8"))}}catch(o){return {path:r,error:o.message}}return {error:`not found (${n.join(", ")})`}}function ot(e){let t=rc(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),r=Number.isFinite(n)?((e.now??Date.now)()-n)/ye:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(r)?Number(r.toFixed(2)):"invalid timestamp",target:"0-30",ok:r>=0&&r<=30,severity:"warning"}]}}function oc(e,t){let n=[],r=join$1(e,".devflow","config.json"),o="default-enabled";if(existsSync$1(r))try{o=JSON.parse(readFileSync$1(r,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=o!==false;n.push({key:"session_start_memory_injection",value:o,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=W(i,t);let u=(L(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(l=>l.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:u?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:u,severity:"warning"}),u&&n.push({key:"explicit_memory_observations",value:H(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:A(n),metrics:n}}function sc(e,t){let n=[],r=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(r))return n.push({key:"memories_db",value:"missing",target:r,ok:false,severity:"warning"}),{name:"Memory quality",status:A(n),metrics:n};let o;try{if(o=W(r,t),!L(o,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*ye,i=o.prepare(`
114
+ `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+l,d-l);for(let m=0;m<f.length;m+=1)if(f[m]==="{"){if(f[m+1]==="{"){m+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Io(e,t){let n=t.split(".");if(n.length>on)return {paths:[],resolved:false};let o=[],r=e;for(let s=0;s<n.length;s+=1){r=join$1(r,n[s]);let i=join$1(r,"__init__.py");try{if(statSync$1(i).isFile()){o.push(i);continue}}catch{}if(s===n.length-1){let c=`${r}.py`;try{if(statSync$1(c).isFile())return o.push(c),{paths:o,resolved:!0}}catch{return {paths:o,resolved:false}}return {paths:o,resolved:false}}try{if(!statSync$1(r).isDirectory())return {paths:o,resolved:!1}}catch{return {paths:o,resolved:false}}}return {paths:o,resolved:o.length>0}}function Ia(e,t,n){let o=Ta(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=Z(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),m=Io(f,d);s||=!m.resolved;for(let y of m.paths)a(y);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},u=d=>{let g=[];for(let f of d.split(",")){let m=f.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}g.push(m);}return g},l=(d,g)=>{for(let f of u(g))d&&Io(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let h=f.slice(7).split(",");for(let k of h)c(k.trim().split(/\s+as\s+/)[0]);continue}let m=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,y=m[2];if(y){let h=c(y,p);l(h,m[3]);continue}if(p===0){s=true;continue}let w=i(p),v=join$1(w,"__init__.py"),_=false;try{_=statSync$1(v).isFile();}catch{}if(_){a(v),l(w,m[3]);continue}for(let h of u(m[3]))c(h,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function or(e,t,n,o,r=true){return n==="node"?Oa(e,t,o,r):n==="python"?Ia(e,t,o):{references:[],inlineContents:[],malformed:false}}function No(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=tt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>Z(g,r)).filter(g=>g!==null),c=[],u=[...s.inlineContents??[]],l=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=rn(g);m.reference&&c.push(m.reference),m.inlineContent&&u.push(m.inlineContent),l||=m.malformed;continue}let f=Z(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):l=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:u,malformed:l}}function rr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function ge(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Xe(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function Ie(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Fa(e,t,n){let o=[],r=[],s=false,i=(l,d)=>{o.push(l),r.push({value:l,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=ge(l);},a=(l=s)=>({tokens:o,artifacts:r,malformed:l}),c=t,u=false;for(;c<e.length;){let l=e[c];if(l==="--"){let y=e[c+1];return y&&!u&&i(y),y?a():a(true)}if(!l.startsWith("-"))return u||i(l),a();if(La.has(l))return a();if(Ma.has(l)){u=true,c+=1;continue}let d=jo.has(l)?"cjs":Mo.has(l)?"esm":null;if(d){let y=e[c+1];if(!y)return a(true);i(y,d),c+=2;continue}let g=Ie(l,jo),f=Ie(l,Mo),m=g??f;if(m!==null){if(!m)return a(true);i(m,g!==null?"cjs":"esm"),c+=1;continue}if(l.startsWith("-r")&&l.length>2){i(l.slice(2),"cjs"),c+=1;continue}if(Lo.has(l)){let y=e[c+1];return a(y===void 0?true:s||Xe(y))}let p=Ie(l,Lo);if(p!==null)return a(s||Xe(p));if((l.startsWith("-e")||l.startsWith("-p"))&&l.length>2)return a(s||Xe(l.slice(2)));if(Fo.has(l)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(Ie(l,Fo)!==null){c+=1;continue}if(ja.has(l)){c+=1;continue}return a(true)}return u?a():a(true)}function Ha(e,t,n,o,r){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:ge(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?tt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Ua.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:ge(i)}}return {tokens:[],malformed:true}}function Ka(e,t,n){let o=t;for(;o<e.length;){let r=e[o];if(r==="--"){let s=e[o+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:ge(s)}:{tokens:[],malformed:true}}if(!r.startsWith("-"))return {tokens:[r],artifacts:[{value:r,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:ge(r)};if(Ba.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Uo.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(Ie(r,Uo)!==null){o+=1;continue}if(Wa.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function zt(e,t){let n=Z(e,t,true);if(!n)return null;let o=ie(n.path),r=ie(t.project);return !o||!r||!se(r,o)?null:o}function za(e,t,n,o,r){let s=n;if(e==="builtin"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="command"){for(;t[s]?.startsWith("-");){let i=t[s];if(/^-[pvV]+$/.test(i)&&/[vV]/.test(i))return {index:t.length,malformed:false};s+=1;}return {index:s,malformed:s>=t.length}}if(e==="exec"){for(;t[s]?.startsWith("-");)t[s]==="-a"||t[s]==="--argv0"?s+=2:s+=1;return {index:s,malformed:s>=t.length}}if(e==="nohup"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="env"){let i=o;for(;s<t.length;){let a=t[s];if(rr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let u=Le(c,r);return u.malformed||u.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...u.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],u=c?zt(c,i):null;if(!u)return {index:s,malformed:true};i={...i,cwd:u},s+=2;}else if(a.startsWith("--chdir=")){let c=zt(a.slice(8),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(a.startsWith("-C")&&a.length>2){let c=zt(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function tt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Xo)return {tokens:[],malformed:true};let r=Le(e,o),s=[],i=[],a=[],c=r.malformed;for(let u of r.segments){let l=sr(u,t,n,o);s.push(...l.tokens),i.push(...l.artifacts??[]),a.push(...l.inlineContents??[]),c||=l.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function sr(e,t,n,o){let r=0;for(;rr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;qa.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Xo)return {tokens:i,malformed:true};let p=za(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let y=sr(p.replacement,a,p.context??n,o);return i.push(...y.tokens),{tokens:i,artifacts:y.artifacts,inlineContents:y.inlineContents,malformed:y.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let u=basename(s),l=!s.includes(sep)&&tr(u,o),d=c&&!Ga.has(u);if(l||d)return {tokens:i,malformed:true};let g=ge(s);i.push(s);let f=u;if(!Na.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?Fa(e,r+1,n):["bash","sh","zsh"].includes(f)?Ha(e,r+1,a,n,o):Ka(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function ir(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:ie(t.slice(0,o))}function Ja(e,t){let n=new Map;for(let o of t)for(let r of Da(o)){let s=ir(r);if(!s)continue;let i=n.get(s)??[];i.push(o),n.set(s,i);}return [...n].map(([o,r])=>({root:o,configPath:e,commands:[...new Set(r)]}))}function Va(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Ya(e){return e.slice(e.lastIndexOf("@")+1)}function Wo(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=ie(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Za(e,t,n){let o=Ya(e),r=N(t.extraKnownMarketplaces),s=N(r?.[o]);if(s){let i=N(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Wo(i.path):null}}try{let i=N(fe(n)),a=N(i?.[o]);if(a){let c=N(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Wo(c.path):null}}}catch{}return {configured:false,root:null}}function Bo(e){let t=[e?.lastUpdated,e?.installedAt].map(n=>{if(typeof n=="number"&&Number.isFinite(n)&&n>=0)return n;if(typeof n!="string")return null;let o=Date.parse(n);return Number.isFinite(o)?o:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function Qa(e,t){let n=N(e.entry),o=N(t.entry),r=Bo(n),s=Bo(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?nt(n.version):null,a=typeof o?.version=="string"?nt(o.version):null;if(i&&a){let c=ar(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Xa(e,t){try{let n=N(fe(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=N(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort(Qa)[0],i=N(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:ie(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function nt(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function ar(e,t){for(let o of ["major","minor","patch"])if(e[o]!==t[o])return e[o]-t[o];if(e.prerelease.length===0||t.prerelease.length===0)return t.prerelease.length-e.prerelease.length;let n=Math.max(e.prerelease.length,t.prerelease.length);for(let o=0;o<n;o+=1){let r=e.prerelease[o],s=t.prerelease[o];if(r===void 0)return -1;if(s===void 0)return 1;if(r===s)continue;let i=/^\d+$/.test(r)?Number(r):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:r.localeCompare(s)}return 0}function ec(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),u=a.name;try{let l=N(fe(join$1(c,"package.json")));typeof l?.version=="string"&&(u=l.version);}catch{}return {name:a.name,path:c,version:u,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let u=nt(a.version),l=nt(c.version);if(u&&l){let d=ar(l,u);if(d!==0)return d}else if(u||l)return u?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?ie(i[0].path):null}function tc(e,t){if(t.legacyArtifactRoots!==void 0){let h=t.legacyArtifactRoots.map(k=>ie(k)).filter(k=>k!==null).map(k=>({root:k,inspectPluginConfig:true}));return {targets:h,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:h.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),o=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),r=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],u=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let h of u)if(existsSync$1(h))try{let k=N(fe(h));if(!k)throw new Error("settings must be an object");i.push({path:h,settings:k});}catch{a.push(h);}if(i.reduce((h,k)=>typeof k.settings.disableAllHooks=="boolean"?k.settings.disableAllHooks:h,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(h=>{let k=[];return je(h.settings.hooks,k),{path:h.path,commands:k}}),g=d.flatMap(h=>h.commands),f=d.flatMap(h=>Ja(h.path,h.commands)),p=[...i.reduce((h,k)=>{let P=k.settings.enabledPlugins;if(typeof P!="object"||P===null)return h;for(let[A,q]of Object.entries(P))Va(A)&&typeof q=="boolean"&&h.set(A,q);return h},new Map)].filter(([,h])=>h).map(([h])=>h).sort(),y=[...f],w=false;for(let h of p){let k=Xa(h,o);k.malformed&&c.push(o);let P=k.root;if(!k.configured){let A=i.map(W=>Za(h,W.settings,r)).filter(W=>W.configured),q=A[A.length-1];q?P=q.root:P=ec(h,s);}P?y.push({root:P,inspectPluginConfig:true}):w=true;}let v=[...y.reduce((h,k)=>{let P=h.get(k.root);return P?(h.set(k.root,{root:k.root,configPath:P.configPath??k.configPath,commands:[...new Set([...P.commands??[],...k.commands??[]])],inspectPluginConfig:!!(P.inspectPluginConfig||k.inspectPluginConfig)}),h):(h.set(k.root,k),h)},new Map).values()],_=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(h=>h!==null);return {targets:v,configCommands:d.filter(h=>h.commands.length>0),hooksDisabled:false,method:_.length>0?`${_.join("+")}${w?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||g.length>0)&&!w&&a.length===0&&c.length===0}}function nc(e){let t=e;for(;;){let n=join$1(t,"package.json");if(existsSync$1(n))try{if(JSON.parse(readFileSync$1(n,"utf8")).workspaces)return t}catch{}let o=dirname(t);if(o===t)return;t=o;}}function je(e,t){if(Array.isArray(e)){for(let n of e)je(n,t);return}if(!(typeof e!="object"||e===null))for(let[n,o]of Object.entries(e))n==="command"&&typeof o=="string"?t.push(o):je(o,t);}function Jt(e){return [...e.matchAll(va)].map(t=>t[1])}function oc(e){let t=new Map,n=Le(e,{tolerateControlSyntax:true});for(let o of n.segments.flat()){let r=o.match(/^([A-Za-z_][A-Za-z0-9_]*)=(\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/[A-Za-z0-9._/-]+)$/);r&&t.set(r[1],r[2]);}return t.size===0?e:e.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,(o,r,s)=>t.get(r??s??"")??o)}function rc(e){let t=spawnSync("bash",["--noprofile","--norc","-n"],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??"",BASH_ENV:"",ENV:""},input:e,timeout:2e3});return t.error!==void 0||t.status!==0}function sc(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function Vt(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function se(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Qt(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Qe)return {kind:"unsafe",reason:"oversized"};let n;try{n=openSync(e,constants.O_RDONLY|constants.O_NONBLOCK|constants.O_NOFOLLOW);}catch{return {kind:"missing"}}try{let o=fstatSync(n);if(!o.isFile())return {kind:"unsafe",reason:"nonregular"};if(o.size>Qe)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Qe+1)),s=0;for(;s<r.length;){let c=readSync(n,r,s,r.length-s,null);if(c===0)break;s+=c;}if(s>Qe)return {kind:"unsafe",reason:"oversized"};let i=r.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Xt(e,t){return `${e} (${t})`}function ic(e,t,n,o){let r=[],s=new Set,i=0,a=(c,u=0)=>{if(u>on){o.traversalLimitRoots.push(e);return}let l=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(l)){se(d,l)?o.missing.push(l):o.escapedArtifacts.push(l);return}let f;try{f=realpathSync.native(l);}catch{o.missing.push(l);return}if(!se(g,f)){o.escapedArtifacts.push(l);return}let m=`${f}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),r.push({...c,path:f,depth:u}));};for(let c of n){let u=No(c,e,t);u.malformed&&o.malformedCommands.push(c);for(let l of u.inlineContents)for(let d of Y(l.content,false,"node"))o.findings.push({artifact:l.source,endpoint:d});for(let l of u.references)a(l);}for(;r.length>0;){if(i>=Qo){o.traversalLimitRoots.push(e);break}let c=r.shift(),u=c.path;i+=1;let l=Qt(u);if(l.kind==="missing"){o.missing.push(u);continue}if(l.kind==="unsafe"){l.reason!=="binary"&&o.unsafeArtifacts.push(Xt(u,l.reason));continue}let{content:d}=l;o.inspected.push(u);let g=c.parserKind==="infer"?nr(u,d):c.parserKind,f=g==="shell";for(let m of Y(d,f,g))o.findings.push({artifact:u,endpoint:m});if(f){let m=No(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(u);for(let p of m.inlineContents)for(let y of Y(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:y});for(let p of m.references)a(p,c.depth+1);}else if(g==="node"||g==="python"){let m=or(u,d,g,{project:e,homePath:t,cwd:dirname(u)});m.malformed&&o.malformedCommands.push(u);for(let p of m.inlineContents)for(let y of Y(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:y});for(let p of m.references)a(p,c.depth+1);}}}function ac(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=nc(r),c=0,u=(f,m=false,p=r,y="infer",w=e,v=0)=>{if(v>on){o.traversalLimitRoots.push(r);return}let _=realpathSync.native(p),h=resolve(f);if(!existsSync$1(h)){if(!se(_,h)){o.escapedArtifacts.push(h);return}m&&o.missing.push(h);return}let k;try{k=realpathSync.native(h);}catch{m&&o.missing.push(h);return}if(!se(_,k)){o.escapedArtifacts.push(h);return}let P=`${k}:${y}:${w}`;i.has(P)||(i.add(P),s.push({path:k,parserKind:y,cwd:w,depth:v}));},l=(f,m,p,y=0)=>{for(let w of Jt(f)){let v=Vt(r,w);if(!v)continue;let _=(m.artifacts??[]).find(h=>h.value.includes("PLUGIN_ROOT")&&h.value.endsWith(w));u(v,true,r,_?.parserKind??"infer",_?.cwd??p,y);}},d=(f,m,p=0,y=false)=>{for(let w of f.artifacts??[]){if(w.value.includes("PLUGIN_ROOT"))continue;let v=w.nodeResolutionKind?rn(w,!y):{reference:Z(w.value,{project:w.project,homePath:w.homePath,cwd:w.cwd},true,w.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(w.value);continue}if(v.inlineContent)for(let _ of Y(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:_});v.reference&&u(v.reference.path,true,y?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},g=f=>{for(let p of Y(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=tt(f,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(f),l(f,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let y=ir(p),w=(m.artifacts??[]).find(v=>v.value===p);y===r&&u(p,true,r,w?.parserKind??"infer",w?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),m=join$1(r,"hooks.json"),p=existsSync$1(m)?m:f;if(!existsSync$1(p))o.missing.push(p),u(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let y;try{y=realpathSync.native(p);}catch{o.missing.push(p),u(join$1(r,"hooks","session-start")),y="";}if(y&&!se(r,y)&&(o.escapedArtifacts.push(p),u(join$1(r,"hooks","session-start")),y=""),y){let w=Qt(y);if(w.kind==="unsafe")o.unsafeArtifacts.push(Xt(p,w.reason)),u(join$1(r,"hooks","session-start"));else if(w.kind==="missing")o.missing.push(p),u(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(w.content),_=[];je(v,_);for(let h of _)g(h);}catch{o.malformedConfigs.push(p),u(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Qo){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=Qt(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Xt(m,p.reason));continue}let{content:y}=p;o.inspected.push(m);let w=f.parserKind==="infer"?nr(m,y):f.parserKind,v=w==="shell";for(let k of Y(y,v,w))o.findings.push({artifact:m,endpoint:k});if(v){let k=oc(y),P=tt(k,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});rc(y)&&o.malformedCommands.push(m),l(k,P,dirname(m),f.depth+1),d(P,dirname(m),f.depth+1,true);}else if(w==="node"||w==="python"){let k=or(m,y,w,{project:e,homePath:t,cwd:dirname(m)},false);(w==="node"?sc(m):k.malformed)&&o.malformedCommands.push(m);for(let P of k.inlineContents)for(let A of Y(P.content,false,"node"))o.findings.push({artifact:P.source,endpoint:A});for(let P of k.references){let A=relative(r,resolve(P.path));!A.startsWith(`..${sep}`)&&A.split(sep).includes("node_modules")||u(P.path,true,r,P.parserKind,P.cwd,f.depth+1);}for(let P of Jt(y)){let A=Vt(r,P);A&&u(A,true,r,w,f.cwd,f.depth+1);}}else for(let k of Jt(y)){let P=Vt(r,k);P&&u(P,true,r,w,f.cwd,f.depth+1);}let _=m.startsWith(`${r}/`)?m.slice(r.length+1):"",h=basename(_).replace(/\.js$/,"");a&&(_.startsWith("hooks/")||_.startsWith("dist/hooks/"))&&u(join$1(a,"packages","devflow","src","hooks",`${h}.ts`),false,a),_.startsWith("hooks/")&&u(join$1(r,"dist","hooks",`${h}.js`));}}function cc(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=N(fe(t)),r=N(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=N(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=ie(a.installPath);if(!c)continue;let u=n.get(c)??new Set;u.add(a.version),n.set(c,u);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Ho(e){try{let t=N(fe(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function lc(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=cc(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let u=join$1(s,"hooks","hooks.json"),l=join$1(s,"hooks.json");existsSync$1(u)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(l)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(u)?u:l;try{let v=N(fe(d)),_=N(v?.hooks),h=[];je(_?.SessionStart,h),h.some(k=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(k))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Ho(i),f=Ho(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(v=>v!==g))&&n.versionIssues.push(p);let y=join$1(s,"hooks","session-start"),w=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(y,"utf8");(!existsSync$1(w)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function uc(e,t){let n=tc(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let v of n.configCommands){o.configsInspected.push(v.path);for(let _ of v.commands){o.commandsInspected.push({configPath:v.path,command:_});for(let h of Y(_,true))o.findings.push({artifact:v.path,endpoint:h});}}ic(e,t.homePath??homedir$1(),n.configCommands.flatMap(v=>v.commands).filter(v=>!n.targets.some(_=>_.commands?.includes(v))),o);for(let v of n.targets)ac(e,t.homePath??homedir$1(),v,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((v,_,h)=>h.findIndex(k=>k.configPath===v.configPath&&k.command===v.command)===_),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],u=[...new Set(o.malformedCommands)],l=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((v,_,h)=>h.findIndex(k=>k.artifact===v.artifact&&k.endpoint===v.endpoint)===_),m=a.length>0||g.length>0||l.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,y=lc(n.targets,t),w=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(v=>v.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:y.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:y.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:y.versionRecords,target:"manifest, package, and installed registry versions match",ok:y.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:y.sessionStartIssues,target:[],ok:y.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:y.daemonIssues,target:[],ok:y.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"}];return {name:"Legacy paths",status:O(w),metrics:w}}function dc(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function st(e){let t=dc(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/ve:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function gc(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=H(i,t);let u=(L(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(l=>l.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:u?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:u,severity:"warning"}),u&&n.push({key:"explicit_memory_observations",value:j(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:O(n),metrics:n}}function fc(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:O(n),metrics:n};let r;try{if(r=H(o,t),!L(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*ve,i=r.prepare(`
90
115
  SELECT source, COUNT(*) count FROM memories
91
116
  WHERE created_at >= ? GROUP BY source ORDER BY source
92
- `).all(s),a=o.prepare(`
117
+ `).all(s),a=r.prepare(`
93
118
  SELECT
94
119
  SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
95
120
  SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
96
121
  FROM memories WHERE status = 'active'
97
- `).get();n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Memory quality",status:A(n),metrics:n}}function ic(e,t){let n=[],r=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(r))return n.push({key:"knowledge_db",value:"missing",target:r,ok:false,severity:"warning"}),{name:"Knowledge quality",status:A(n),metrics:n};let o;try{if(o=W(r,t),!L(o,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let s=o.prepare("SELECT length(content) length FROM knowledge_chunks ORDER BY length(content)").all().map(l=>Number(l.length)),i=Math.max(0,Math.ceil(s.length*.95)-1),a=s.length===0?0:s[i];n.push({key:"knowledge_chunk_length_p95",value:a,target:"<= 3000",ok:a<=3e3,severity:"warning"});let c=o.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),u=/tokenize\s*=\s*['\"]?trigram/i.test(c?.sql??"");n.push({key:"knowledge_fts_tokenizer",value:u?"trigram":"missing/non-trigram",target:"trigram",ok:u,severity:"warning"});}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Knowledge quality",status:A(n),metrics:n}}function ac(e){let{manifest:t,metrics:n}=ot(e),r=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:r,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&r.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:A(n),metrics:n}}function cc(e){let{manifest:t,metrics:n}=ot(e),r=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:r??"missing",target:0,ok:t?.deadcode?.status==="green"&&r===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:A(n),metrics:n}}function lc(e){let{manifest:t,metrics:n}=ot(e),r=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:r,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&r.length===3,severity:"error"}),{name:"Data face",status:A(n),metrics:n}}async function uc(e){let t=new AbortController,n=setTimeout(()=>t.abort(),500);try{return {status:(await fetch(e,{signal:t.signal})).status}}finally{clearTimeout(n);}}async function dc(e){let{manifest:t,metrics:n}=ot(e),r=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:r.length,target:">= 13",ok:t?.ui?.status==="green"&&r.length>=13,severity:"warning"});let s=`http://127.0.0.1:${e.env?.PORT??process.env.PORT??"13337"}/api/health`;try{let i=await(e.httpGet??uc)(s);n.push({key:"dashboard_server_health",value:{url:s,status:i.status},target:"HTTP 200",ok:i.status===200,severity:"warning"});}catch(i){n.push({key:"dashboard_server_health",value:i.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:A(n),metrics:n}}async function nn(e={},t={}){let n=e.project??process.cwd(),r=Jt(n),o=[Qi(n,t),oa(r.path,t),nc(r.path,t),sa(r.path,t),ia(r.path,!!e.strict,t),oc(r.path,t),sc(r.path,t),ic(r.path,t),ac(t),cc(t),la(t),lc(t),ca(t),await dc(t),da(t)],s=e.strict&&o.some(i=>i.status!=="green")?1:0;return {sections:o,exitCode:s}}function fc(e,t={}){return e===void 0?oo():nn(e,t)}function Ur(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ro(e){let t=[];for(let n of e.sections){let r=`[${n.status.toUpperCase()}]`,o=n.status==="green"?k.green:n.status==="yellow"?k.yellow:k.red;t.push(`${o(r)} ${k.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Ur(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ur(s.value)}${i}`);}}return t.join(`
98
- `)}async function gc(e={},t={stdout:r=>console.log(r),stderr:r=>console.error(r)},n={}){let r=await nn(e,n);return t.stdout(e.json?JSON.stringify(r):ro(r)),r.exitCode}async function st(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function oo(e=process.cwd()){let{codegraph:t,graph:n,memory:r,knowledge:o,workflow:s,data:i}=await st(e),a=t.getStats(),c=n.export(),u=0;try{u=(await s.list()).length;}catch{}let l=false,d=0;try{let w=await r.getAll();l=!!w?.project,d=Object.keys(w?.user??{}).length;}catch{}let f=0;try{f=(await o.getSources()).length;}catch{}let g={total:0,byTool:{}};try{g=await i.getToolCallStats();}catch{}let m=await Te(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),l&&(p+=15),f>0&&(p+=10),u>0&&(p+=5),m.running&&(p+=10),g.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:l,userPrefs:d},knowledge:{sources:f},plugins:{installed:0,names:[]},workflows:{registered:u},server:{running:m.running},toolCalls:g,readyScore:p}}async function mc(){let{data:e}=await st(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),r=createHash("sha256").update("genesis").digest("hex");for(let o of n){if(o.prevHash!==r)return {valid:false,brokenAt:o.seq,entryCount:n.length};let s=`${o.seq}|${o.ts}|${o.tool}|${o.argsHash}|${o.decision}|${o.ruleId??""}|${o.sessionId}|${r}`,i=createHmac("sha256",t).update(s).digest("hex");if(o.signature!==i)return {valid:false,brokenAt:o.seq,entryCount:n.length};r=o.signature;}return {valid:true,brokenAt:null,entryCount:n.length}}async function pc(){let{data:e}=await st(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),r=createHash("sha256").update("genesis").digest("hex");for(let o of n){let s=`${o.seq}|${o.ts}|${o.tool}|${o.argsHash}|${o.decision}|${o.ruleId??""}|${o.sessionId}|${r}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[r,i,o.seq]),r=i;}return {rebuilt:true}}async function hc(e){let{data:t}=await st(process.cwd()),r=(await t.auditGetAll()).filter(o=>o.decision!=="allow");if(e){let o=e.match(/^(\d+)([dh])$/);if(o){let s=Number.parseInt(o[1],10),i=o[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;r=r.filter(c=>c.ts>a);}}return {violations:r.map(o=>({tool:o.tool,decision:o.decision,ruleId:o.ruleId,ts:o.ts,sessionId:o.sessionId}))}}function yc(){let e=`${process.env.TMPDIR??"/tmp"}/.devflow-receipts`,t=createHash("sha256").update(process.cwd()).digest("hex").slice(0,16),n=`${e}/${t}.json`;try{return {sessionId:t,data:JSON.parse(readFileSync$1(n,"utf8"))}}catch{return {sessionId:t,data:null}}}var Je,Xi,ra,ye,aa,Er,fa,ga,zr,Ve,en,Jr,Vr,ma,pa,ha,xr,$a,Tr,Nr,Ir,jr,xa,Aa,Oa,Na,Ia,Mr,ja,Fa,Ua,io=E(()=>{ee();Xi={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"]};ra=new Set(["pending","committed","expired"]);ye=1440*60*1e3,aa=30*ye,Er=60*1024*1024;fa=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,ga=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,zr=64,Ve=1024*1024,en=8,Jr=8,Vr=64*1024;ma=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),pa=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),ha=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;xr=[".cjs",".js",".mjs",".ts",".tsx"];$a=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Tr=new Set(["-r","--require"]),Nr=new Set(["--experimental-loader","--import","--loader"]),Ir=new Set(["-e","--eval","-p","--print"]),jr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),xa=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Aa=new Set(["--check","-c"]),Oa=new Set(["--help","--version","-h","-v"]);Na=new Set(["-e","-eu","-o","-u","-ue"]),Ia=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Mr=new Set(["-W","-X","--check-hash-based-pycs"]),ja=new Set(["--help","--version","-h","-V"]);Fa=new Set(["builtin","command","env","exec","nohup","timeout"]),Ua=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ao={};x(ao,{generateToken:()=>kc});async function kc(e,t=3600){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),r=Math.floor(Date.now()/1e3),o={sub:`devflow-session-${Date.now().toString(36)}`,project:e.split("/").pop()??"unknown",iat:r,exp:r+t,scope:["context","knowledge","memory","workflow","graph"]},s=Buffer.from(JSON.stringify(o)).toString("base64url"),i=getLocalHmacSecret(),a=createHmac("sha256",i).update(`${n}.${s}`).digest("base64url");return {token:`${n}.${s}.${a}`,expiresAt:o.exp,scope:o.scope}}var co=E(()=>{});var rn={};x(rn,{reportBenchmarkCommand:()=>Rc,runBenchmarkCommand:()=>Pc});async function Pc(e){let t=e.suite??"default",n=getBenchmarkSuite(t);if(!n)throw new Error(`Unknown benchmark suite "${t}"`);let o=await new BenchmarkEngine().runSuite(e.projectRoot,n,{rounds:e.rounds}),s=e.database??openGlobalDevFlowDatabase();try{s.insertBenchmarkReport(o);}finally{e.database||s.close();}let i=renderBenchmarkReport(o,e.output??"text");return e.output==="json"?i:`${i}
122
+ `).get();n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:O(n),metrics:n}}function mc(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:O(n),metrics:n};let r;try{if(r=H(o,t),!L(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let s=r.prepare("SELECT length(content) length FROM knowledge_chunks ORDER BY length(content)").all().map(l=>Number(l.length)),i=Math.max(0,Math.ceil(s.length*.95)-1),a=s.length===0?0:s[i];n.push({key:"knowledge_chunk_length_p95",value:a,target:"<= 3000",ok:a<=3e3,severity:"warning"});let c=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),u=/tokenize\s*=\s*['\"]?trigram/i.test(c?.sql??"");n.push({key:"knowledge_fts_tokenizer",value:u?"trigram":"missing/non-trigram",target:"trigram",ok:u,severity:"warning"});}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:O(n),metrics:n}}function pc(e){let{manifest:t,metrics:n}=st(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:O(n),metrics:n}}function hc(e){let{manifest:t,metrics:n}=st(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:O(n),metrics:n}}function yc(e){let{manifest:t,metrics:n}=st(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:O(n),metrics:n}}async function wc(e){let t=new AbortController,n=setTimeout(()=>t.abort(),500);try{return {status:(await fetch(e,{signal:t.signal})).status}}finally{clearTimeout(n);}}async function vc(e){let{manifest:t,metrics:n}=st(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let s=`http://127.0.0.1:${e.env?.PORT??process.env.PORT??"13337"}/api/health`;try{let i=await(e.httpGet??wc)(s);n.push({key:"dashboard_server_health",value:{url:s,status:i.status},target:"HTTP 200",ok:i.status===200,severity:"warning"});}catch(i){n.push({key:"dashboard_server_health",value:i.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:O(n),metrics:n}}async function sn(e={},t={}){let n=e.project??process.cwd(),o=Zt(n),r=[ra(n,t),ua(o.path,t),uc(o.path,t),da(o.path,t),ga(o.path,!!e.strict,t),gc(o.path,t),fc(o.path,t),mc(o.path,t),pc(t),hc(t),pa(t),yc(t),ma(t),await vc(t),ya(t)],s=e.strict&&r.some(i=>i.status!=="green")?1:0;return {sections:r,exitCode:s}}function kc(e,t={}){return e===void 0?lr():sn(e,t)}function Ko(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function cr(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?S.green:n.status==="yellow"?S.yellow:S.red;t.push(`${r(o)} ${S.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Ko(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ko(s.value)}${i}`);}}return t.join(`
123
+ `)}async function bc(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await sn(e,n);return t.stdout(e.json?JSON.stringify(o):cr(o)),o.exitCode}async function it(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function lr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await it(e),a=t.getStats(),c=n.export(),u=0;try{u=(await s.list()).length;}catch{}let l=false,d=0;try{let y=await o.getAll();l=!!y?.project,d=Object.keys(y?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let m=await Te(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),l&&(p+=15),g>0&&(p+=10),u>0&&(p+=5),m.running&&(p+=10),f.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:l,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:u},server:{running:m.running},toolCalls:f,readyScore:p}}async function Sc(){let{data:e}=await it(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){if(r.prevHash!==o)return {valid:false,brokenAt:r.seq,entryCount:n.length};let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");if(r.signature!==i)return {valid:false,brokenAt:r.seq,entryCount:n.length};o=r.signature;}return {valid:true,brokenAt:null,entryCount:n.length}}async function _c(){let{data:e}=await it(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[o,i,r.seq]),o=i;}return {rebuilt:true}}async function Pc(e){let{data:t}=await it(process.cwd()),o=(await t.auditGetAll()).filter(r=>r.decision!=="allow");if(e){let r=e.match(/^(\d+)([dh])$/);if(r){let s=Number.parseInt(r[1],10),i=r[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;o=o.filter(c=>c.ts>a);}}return {violations:o.map(r=>({tool:r.tool,decision:r.decision,ruleId:r.ruleId,ts:r.ts,sessionId:r.sessionId}))}}function Rc(){let e=`${process.env.TMPDIR??"/tmp"}/.devflow-receipts`,t=createHash("sha256").update(process.cwd()).digest("hex").slice(0,16),n=`${e}/${t}.json`;try{return {sessionId:t,data:JSON.parse(readFileSync$1(n,"utf8"))}}catch{return {sessionId:t,data:null}}}var Ze,sa,Vo,la,ve,fa,Ao,wa,va,Qo,Qe,on,Xo,er,ka,ba,Sa,To,Na,jo,Mo,Lo,Fo,ja,Ma,La,Ua,Wa,Uo,Ba,qa,Ga,dr=C(()=>{ne();sa={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Vo=3600*1e3;la=new Set(["pending","committed","expired"]);ve=1440*60*1e3,fa=30*ve,Ao=60*1024*1024;wa=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,va=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Qo=64,Qe=1024*1024,on=8,Xo=8,er=64*1024;ka=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),ba=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Sa=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;To=[".cjs",".js",".mjs",".ts",".tsx"];Na=new Set(["bash","node","python","python3","sh","tsx","zsh"]);jo=new Set(["-r","--require"]),Mo=new Set(["--experimental-loader","--import","--loader"]),Lo=new Set(["-e","--eval","-p","--print"]),Fo=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),ja=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Ma=new Set(["--check","-c"]),La=new Set(["--help","--version","-h","-v"]);Ua=new Set(["-e","-eu","-o","-u","-ue"]),Wa=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Uo=new Set(["-W","-X","--check-hash-based-pycs"]),Ba=new Set(["--help","--version","-h","-V"]);qa=new Set(["builtin","command","env","exec","nohup","timeout"]),Ga=new Set([":","[","echo","false","printf","pwd","test","true"]);});var gr={};$(gr,{generateToken:()=>Cc});async function Cc(e,t=3600){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),o=Math.floor(Date.now()/1e3),r={sub:`devflow-session-${Date.now().toString(36)}`,project:e.split("/").pop()??"unknown",iat:o,exp:o+t,scope:["context","knowledge","memory","workflow","graph"]},s=Buffer.from(JSON.stringify(r)).toString("base64url"),i=getLocalHmacSecret(),a=createHmac("sha256",i).update(`${n}.${s}`).digest("base64url");return {token:`${n}.${s}.${a}`,expiresAt:r.exp,scope:r.scope}}var fr=C(()=>{});var an={};$(an,{reportBenchmarkCommand:()=>Tc,runBenchmarkCommand:()=>Oc});async function Oc(e){let t=e.suite??"default",n=getBenchmarkSuite(t);if(!n)throw new Error(`Unknown benchmark suite "${t}"`);let r=await new BenchmarkEngine().runSuite(e.projectRoot,n,{rounds:e.rounds}),s=e.database??openGlobalDevFlowDatabase();try{s.insertBenchmarkReport(r);}finally{e.database||s.close();}let i=renderBenchmarkReport(r,e.output??"text");return e.output==="json"?i:`${i}
99
124
 
100
- Stored: ${getGlobalDevFlowDbPath()} (${o.runId})`}async function Rc(e={}){let t=e.database??openGlobalDevFlowDatabase(),n,r=null;try{n=e.runId?t.getBenchmarkReport(e.runId):t.getLatestBenchmarkReport(),e.baselineRunId&&(r=t.getBenchmarkReport(e.baselineRunId));}finally{e.database||t.close();}if(!n)throw new Error(e.runId?`Benchmark report "${e.runId}" not found`:"No benchmark reports found. Run `devflow benchmark run` first.");if(e.baselineRunId&&!r)throw new Error(`Benchmark baseline "${e.baselineRunId}" not found`);let o=e.output??"text",s=renderBenchmarkReport(n,o);if(!r||o==="json")return s;let i=Dc(r,n);return o==="markdown"?`${s}
125
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Tc(e={}){let t=e.database??openGlobalDevFlowDatabase(),n,o=null;try{n=e.runId?t.getBenchmarkReport(e.runId):t.getLatestBenchmarkReport(),e.baselineRunId&&(o=t.getBenchmarkReport(e.baselineRunId));}finally{e.database||t.close();}if(!n)throw new Error(e.runId?`Benchmark report "${e.runId}" not found`:"No benchmark reports found. Run `devflow benchmark run` first.");if(e.baselineRunId&&!o)throw new Error(`Benchmark baseline "${e.baselineRunId}" not found`);let r=e.output??"text",s=renderBenchmarkReport(n,r);if(!o||r==="json")return s;let i=Ic(o,n);return r==="markdown"?`${s}
101
126
  ## Change From Prior Baseline
102
127
 
103
128
  ${i.map(a=>`- ${a}`).join(`
104
129
  `)}
105
130
  `:`${s}
106
131
 
107
- Change from ${r.runId}:
132
+ Change from ${o.runId}:
108
133
  ${i.map(a=>`- ${a}`).join(`
109
- `)}`}function Dc(e,t){let n=e.summary.devflow,r=t.summary.devflow;return [it("tokensUsed",n.avgTokensUsed,r.avgTokensUsed,false),it("filesTouched",n.avgFilesTouched,r.avgFilesTouched,false),it("correctnessScore",n.avgCorrectnessScore,r.avgCorrectnessScore,true),it("durationMs",n.avgDurationMs,r.avgDurationMs,false)]}function it(e,t,n,r){let o=t>0?(n-t)/t:0,s=r?o<-0.1:o>.1,i=o>0?"+":"";return `${e}: ${i}${(o*100).toFixed(1)}%${s?" (regression >10%)":""}`}var on=E(()=>{});var go={};x(go,{runReview:()=>Cc});async function Cc(e){let t,n;if(e.prUrl){let l=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${l?`#${l[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let r=(t.match(/^diff --git/gm)??[]).length,o=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[k.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${r}`,`+${o} / -${s}`,"",i.length>0?k.red(`Critical (${i.length})`):"",...i.map(l=>` ${k.red("\u25CF")} ${l}`),"",a.length>0?k.yellow(`Warning (${a.length})`):"",...a.map(l=>` ${k.yellow("\u25CB")} ${l}`),"",c.length>0?k.green(`Suggestion (${c.length})`):"",...c.map(l=>` ${k.green("\u25CB")} ${l}`),"",i.length>0?k.red("Overall: Need changes"):a.length>0?k.yellow("Overall: Approve with comments"):k.green("Overall: LGTM")].join(`
110
- `)}var mo=E(()=>{});var po={};x(po,{startAll:()=>$c});async function Ec(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(r=>setTimeout(r,500));}return false}async function $c(e){console.log(k.blue("Starting DevFlow server..."));let{pid:t}=await Ut({port:e.port});console.log(k.green(` Server started (PID: ${t})`)),console.log(k.blue(" Waiting for server..."));let n=await Ec(e.port);console.log(n?k.green(" Server ready"):k.yellow(" Server started but health check timed out")),console.log(""),console.log(k.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(k.green("\u2551")+" DevFlow Started! "+k.green("\u2551")),console.log(k.green("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563")),console.log(k.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+k.green("\u2551")),console.log(k.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+k.green("\u2551")),console.log(k.green("\u2551")+" "+k.green("\u2551")),console.log(k.green("\u2551")+" Press Ctrl+C to stop "+k.green("\u2551")),console.log(k.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),e.background||await new Promise(r=>{let o=false,s=async()=>{o||(o=true,console.log(k.blue(`
111
- Shutting down...`)),await Oe(),console.log(k.green("Server stopped.")),r());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var ho=E(()=>{ee();});var wo={};x(wo,{stopAll:()=>xc});async function xc(){let e=await Oe();console.log(e?k.green("Server stopped"):k.dim("No DevFlow services running"));}var vo=E(()=>{ee();});var bo={};x(bo,{showStatus:()=>Ic});function Nc(e){if(!existsSync(e))return false;try{let t=new DatabaseSync(e,{readOnly:!0});try{return !!t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' LIMIT 1").get()}finally{t.close();}}catch{return true}}async function Ic(){console.log(k.blue("DevFlow Status")),console.log(k.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await Te(),t=e.port??qe;e.running?(console.log(`Server: ${k.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${k.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${k.yellow("\u25CB")} not running`),console.log(`Dashboard: ${k.yellow("\u25CB")} not running`));let n=getGlobalDevFlowDbPath();if(existsSync(n)){let a=(statSync(n).size/1024/1024).toFixed(1);console.log(`Data: ${n} (${a} MB)`);}else console.log(`Data: ${k.dim(`no global database (${n})`)}`);let r=join(process.cwd(),".devflow","devflow.db"),o=join(process.cwd(),".codegraph","codegraph.db"),s=[...existsSync(r)?[r]:[],...Nc(o)?[`${o} (devflow_* tables)`]:[]];s.length>0?console.log(`Legacy: ${k.yellow(s.join(", "))}`):console.log(`Legacy: ${k.green("none")}`);}var So=E(()=>{ee();});var Ro={};x(Ro,{setupCommand:()=>qc});function Hc(){let e=[resolve$1(dirname$1(Bc.resolve("../../package.json")),"dist","plugin"),resolve$1(process.cwd(),"plugins","claude-code")];for(let t of e)if(existsSync(join(t,".claude-plugin","plugin.json")))return t;return null}function Kc(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let r={...n,...t};writeFileSync(e,JSON.stringify(r,null,2));}async function qc(e){if(console.log(k.blue("DevFlow Setup")),console.log(k.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await Ct({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(k.green(` \u2713 MCP: ${n}`));}catch(t){console.log(k.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(k.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=Hc();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let r=join(n,"known_marketplaces.json");Kc(r,{devflow:{source:{directory:t}}}),console.log(k.green(` \u2713 Plugin registered: ${t}`));}else console.log(k.yellow(" \u26A0 Plugin directory not found")),console.log(k.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(k.green("Setup complete!")),console.log(k.dim("Restart Claude Code to use /devflow:* commands"));}var Bc,Do=E(()=>{Et();Bc=createRequire(import.meta.url);});var Co={};x(Co,{pluginListCommand:()=>zc});var zc,Eo=E(()=>{Ue();zc=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=ge();if(e.installed){let n=xn();if(n.length===0){console.log("No plugins installed."),console.log(`
134
+ `)}`}function Ic(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [at("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),at("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),at("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),at("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function at(e,t,n,o){let r=t>0?(n-t)/t:0,s=o?r<-0.1:r>.1,i=r>0?"+":"";return `${e}: ${i}${(r*100).toFixed(1)}%${s?" (regression >10%)":""}`}var cn=C(()=>{});var yr={};$(yr,{runReview:()=>Nc});async function Nc(e){let t,n;if(e.prUrl){let l=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${l?`#${l[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[S.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?S.red(`Critical (${i.length})`):"",...i.map(l=>` ${S.red("\u25CF")} ${l}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(l=>` ${S.yellow("\u25CB")} ${l}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(l=>` ${S.green("\u25CB")} ${l}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
135
+ `)}var wr=C(()=>{});var vr={};$(vr,{startAll:()=>Mc});async function jc(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function Mc(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Bt({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await jc(e.port);console.log(n?S.green(" Server ready"):S.yellow(" Server started but health check timed out")),console.log(""),console.log(S.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(S.green("\u2551")+" DevFlow Started! "+S.green("\u2551")),console.log(S.green("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563")),console.log(S.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+" "+S.green("\u2551")),console.log(S.green("\u2551")+" Press Ctrl+C to stop "+S.green("\u2551")),console.log(S.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),e.background||await new Promise(o=>{let r=false,s=async()=>{r||(r=true,console.log(S.blue(`
136
+ Shutting down...`)),await Oe(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var kr=C(()=>{ne();});var Sr={};$(Sr,{stopAll:()=>Lc});async function Lc(){let e=await Oe();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var _r=C(()=>{ne();});var Rr={};$(Rr,{showStatus:()=>Hc});function Bc(e){if(!existsSync(e))return false;try{let t=new DatabaseSync(e,{readOnly:!0});try{return !!t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' LIMIT 1").get()}finally{t.close();}}catch{return true}}async function Hc(){console.log(S.blue("DevFlow Status")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await Te(),t=e.port??Je;e.running?(console.log(`Server: ${S.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${S.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${S.yellow("\u25CB")} not running`),console.log(`Dashboard: ${S.yellow("\u25CB")} not running`));let n=getGlobalDevFlowDbPath();if(existsSync(n)){let a=(statSync(n).size/1024/1024).toFixed(1);console.log(`Data: ${n} (${a} MB)`);}else console.log(`Data: ${S.dim(`no global database (${n})`)}`);let o=join(process.cwd(),".devflow","devflow.db"),r=join(process.cwd(),".codegraph","codegraph.db"),s=[...existsSync(o)?[o]:[],...Bc(r)?[`${r} (devflow_* tables)`]:[]];s.length>0?console.log(`Legacy: ${S.yellow(s.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Er=C(()=>{ne();});var xr={};$(xr,{setupCommand:()=>Xc});function Zc(){let e=[resolve$1(dirname$1(Yc.resolve("../../package.json")),"dist","plugin"),resolve$1(process.cwd(),"plugins","claude-code")];for(let t of e)if(existsSync(join(t,".claude-plugin","plugin.json")))return t;return null}function Qc(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let o={...n,...t};writeFileSync(e,JSON.stringify(o,null,2));}async function Xc(e){if(console.log(S.blue("DevFlow Setup")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await xt({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(S.green(` \u2713 MCP: ${n}`));}catch(t){console.log(S.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(S.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=Zc();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let o=join(n,"known_marketplaces.json");Qc(o,{devflow:{source:{directory:t}}}),console.log(S.green(` \u2713 Plugin registered: ${t}`));}else console.log(S.yellow(" \u26A0 Plugin directory not found")),console.log(S.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(S.green("Setup complete!")),console.log(S.dim("Restart Claude Code to use /devflow:* commands"));}var Yc,$r=C(()=>{$t();Yc=createRequire(import.meta.url);});var Ar={};$(Ar,{pluginListCommand:()=>tl});var tl,Or=C(()=>{He();tl=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=pe();if(e.installed){let n=On();if(n.length===0){console.log("No plugins installed."),console.log(`
112
137
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
113
- `),n.forEach(r=>{let o=t.plugins.find(s=>s.name===r);o?(console.log(` ${k.green(o.name)}@${o.version}`),console.log(` ${o.description}`)):console.log(` ${k.green(r)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
114
- `);let n=Math.max(...t.plugins.map(r=>r.name.length));t.plugins.forEach(r=>{let o=" ".repeat(n-r.name.length+2);console.log(` ${k.green(r.name)}${o}v${r.version}`),console.log(` ${" ".repeat(n)}${r.description.substring(0,60)}`),r.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${r.tags.join(", ")}`),console.log("");}),console.log(`
115
- Install a plugin: devflow plugin install <name>`);}});});var $o={};x($o,{pluginSearchCommand:()=>Yc});var Yc,xo=E(()=>{Ue();Yc=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=ge(),n=e.toLowerCase(),r=t.plugins.filter(o=>o.name.toLowerCase().includes(n)||o.description.toLowerCase().includes(n)||o.tags.some(s=>s.toLowerCase().includes(n)));if(r.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
116
- Try: devflow plugin list`);return}console.log(`Found ${r.length} plugin(s) matching "${e}":
117
- `),r.forEach(o=>{console.log(` ${k.green(o.name)}@${o.version}`),console.log(` ${o.description}`),o.tags.length>0&&console.log(` Tags: ${o.tags.join(", ")}`),console.log(` Size: ${o.size}`),console.log("");});});});var Oo={};x(Oo,{pluginInstallCommand:()=>Xc});var Xc,To=E(()=>{Xc=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Installing ${t}...`);try{execSync(`npm install -g ${t}`,{stdio:"inherit"}),console.log(`
118
- ${k.green("\u2713")} ${t} installed successfully`),console.log(`
138
+ `),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${S.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
139
+ `);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${S.green(o.name)}${r}v${o.version}`),console.log(` ${" ".repeat(n)}${o.description.substring(0,60)}`),o.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${o.tags.join(", ")}`),console.log("");}),console.log(`
140
+ Install a plugin: devflow plugin install <name>`);}});});var Tr={};$(Tr,{pluginSearchCommand:()=>rl});var rl,Ir=C(()=>{He();rl=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=pe(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
141
+ Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
142
+ `),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var jr={};$(jr,{pluginInstallCommand:()=>al});var al,Mr=C(()=>{al=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Installing ${t}...`);try{execSync(`npm install -g ${t}`,{stdio:"inherit"}),console.log(`
143
+ ${S.green("\u2713")} ${t} installed successfully`),console.log(`
119
144
  Run "devflow plugin list --installed" to verify.`);}catch(n){console.error(`
120
- ${k.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Io={};x(Io,{pluginUninstallCommand:()=>nl});var nl,jo=E(()=>{nl=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Uninstalling ${t}...`);try{execSync(`npm uninstall -g ${t}`,{stdio:"inherit"}),console.log(`
121
- ${k.green("\u2713")} ${t} uninstalled successfully`);}catch(n){console.error(`
122
- ${k.red("\u2717")} Uninstallation failed: ${n.message}`),process.exit(1);}});});function ut(e){let t=join(e,".devflow","config.json");if(existsSync(t))try{let n=readFileSync(t,"utf-8");if(JSON.parse(n).serverUrl)return "server"}catch{}return "local"}var Lo=createRequire(import.meta.url),ln="0.0.0";try{ln=Lo("../package.json").version;}catch{try{ln=Lo("../../package.json").version;}catch{}}var P=new Command;P.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(ln).option("--local","Force local engine, skip server");P.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").action(async e=>{let t=process.cwd();if(e.abort){console.log(k.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=ol.join(t,a);Mo.existsSync(c)&&(console.log(k.dim(` Removing ${a}/...`)),Mo.rmSync(c,{recursive:true,force:true}));}console.log(k.green(`\u2705 Existing directories removed
123
- `));}let n=ut(t);console.error(k.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:r,renderInitReport:o}=await Promise.resolve().then(()=>(Cn(),Dn)),s=await r(t,{force:e.force});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(o(s.onboardingPack));else {if(s.created.length>0){console.log(k.green("Created:"));for(let i of s.created)console.log(` ${k.dim("+")} ${i}`);}else console.log(k.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(k.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(k.green("\u2705 Onboarding pack generated")),console.log(k.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(k.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(k.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(k.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(k.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>($n(),En)),a=await i(t,e.withPlugin);console.log(k.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(ht(),pt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(ht(),pt));await i(t);}}});P.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(Kn(),Hn));t(e,{},{log:r=>console.log(r),error:r=>console.error(k.red(r))})||(process.exitCode=1);});var il=P.command("db").description("Manage DevFlow databases");il.command("consolidate").description("Merge legacy project databases into the global database").option("--project <path>","Project directory",process.cwd()).option("--dry-run","Report rows and conflicts without writing").action(async e=>{let{consolidateDatabases:t,formatConsolidateResult:n}=await Promise.resolve().then(()=>(er(),Xn)),r=t(e);for(let o of n(r))console.log(o);});P.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),r=ut(n);console.log(k.blue(`DevFlow connect \u2014 mode: ${r}`));let{connectAgent:o,getAvailableAgents:s}=await Promise.resolve().then(()=>(Et(),tr));if(e){let i=s();i.includes(e)||(console.log(k.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await o({agent:e,command:t.command});for(let a of i)console.log(k.green(`\u2713 ${a}`));}catch(i){console.error(k.red(`Error: ${i.message}`)),process.exit(1);}});P.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(ir(),sr)),r=e.backfillVectors?await n(P.opts().local):await t(P.opts().local);console.log(k.blue("Index Status")),console.log(` Files: ${r.totalFiles}`),console.log(` Symbols: ${r.totalSymbols}`),console.log(` Indexing: ${r.indexing?"active":"idle"}`),e.watch&&console.log(k.dim(" (watch mode not yet implemented)"));});P.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(cr(),ar)),r=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(k.blue("Dependency Graph")),console.log(` Nodes: ${r.nodes.length}`),console.log(` Edges: ${r.edges.length}`);});P.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(xt(),$t)),r=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(JSON.stringify({requiredFiles:r.requiredFiles,optionalFiles:r.optionalFiles,riskHints:r.riskHints,nextActions:r.nextActions,reasoning:t.why?r.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(xt(),$t)),r=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(k.blue(`Context: "${e}"`)),console.log(` Files: ${r.files.length}`),console.log(` Confidence: ${(r.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${r.tokenCount}`);}});var ct=P.command("workflow").description("Workflow management");ct.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(Ee(),Ce)),t=await e(P.opts().local);if(t.length===0){console.log(k.dim("No workflows registered."));return}for(let n of t)console.log(`${k.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});ct.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ee(),Ce)),r=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${r.runId}`),console.log(`Status: ${r.status}`),console.log(`Duration: ${r.duration}ms`);});ct.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(Ee(),Ce)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});ct.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(Ee(),Ce)),t=await e(P.opts().local);if(t.length===0){console.log(k.dim("No runs yet."));return}for(let n of t){let r=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${k.yellow(n.status)} ${r}`);}});var we=P.command("memory").description("Memory management");we.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ce(),ae)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});we.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ce(),ae));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});we.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(ce(),ae)),r=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:P.opts().local});console.log(JSON.stringify(r,null,2));});we.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(ce(),ae));await n(e,t,P.opts().local),console.log(k.green(`Memory set: ${e} = ${t}`));});we.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(ce(),ae)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});we.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(ce(),ae)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:r,remaining:o})=>{console.log(` vectors: ${r} processed, ${o} remaining`);}});console.log(k.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(gr(),fr)),r=(await t(e,void 0,void 0,P.opts().local)).results;console.log(k.blue(`Knowledge: "${e}"`)),console.log(` Results: ${r.length}`);for(let o of r.slice(0,5))console.log(` \u2014 ${o.title}`);});var un=P.command("docs").description("Documentation index management");un.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(k.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),r=new t({projectRoot:process.cwd(),embedder:new n});if(e){let o=await r.syncDocs(e);for(let s of o)s.added>0?console.log(` ${k.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${k.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(k.green(`
124
- ${e} docs synced to .devflow/knowledge/${e}/`));}else {let o=await r.getSources();for(let s of o){let i=await r.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${k.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${k.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(k.green(`
125
- All docs synced.`));}});un.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>(It(),Nt)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:r,remaining:o})=>{console.log(` vectors: ${r} processed, ${o} remaining`);}});console.log(k.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});un.command("resync [plugin-name]").description("Rebuild documentation chunks before vector backfill").requiredOption("--with-headings","Use heading-aware 500-3000 character chunks").action(async(e,t)=>{let{resyncKnowledgeDocs:n}=await Promise.resolve().then(()=>(It(),Nt));console.log(k.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let r=await n({source:e,withHeadings:t.withHeadings});for(let o of r)o.added>0?console.log(` ${k.green("\u2713")} ${o.source} \u2192 ${o.added} chunks`):console.log(` ${k.red("\u2717")} ${o.source} \u2014 ${o.errors.join(", ")||"no content"}`);console.log(k.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var lt=P.command("skill").description("Plugin/Skill management");lt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Ae(),xe)),t=await e(P.opts().local);if(t.length===0){console.log(k.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${k.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});lt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Ae(),xe)),n=await t(e,P.opts().local);if(console.log(k.blue(`Search: "${e}"`)),n.length===0){console.log(k.dim(" No matching plugins found."));return}for(let r of n)console.log(` ${k.green(r.name)} @ ${r.version} \u2014 ${r.description}`);});lt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Ae(),xe)),n=await t(e,process.cwd(),P.opts().local);console.log(k.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});lt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Ae(),xe));await t(e,process.cwd(),P.opts().local),console.log(k.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});P.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:r,runDoctorViolations:o,runDoctorReceipts:s}=await Promise.resolve().then(()=>(io(),so));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await r();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await o(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});P.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(co(),ao)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Fo=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Fo.command("run").description("Run a benchmark suite and persist the report").option("--suite <id>","Benchmark suite","default").option("--project <root>","Initialized project root",process.cwd()).option("--rounds <n>","Rounds per task","1").option("--output <format>","text | json","text").action(async e=>{let{runBenchmarkCommand:t}=await Promise.resolve().then(()=>(on(),rn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Fo.command("report").description("Render a persisted benchmark report").option("--run-id <id>","Specific report; defaults to latest").option("--baseline <id>","Prior report used for regression comparison").option("--output <format>","text | json | markdown","text").action(async e=>{let{reportBenchmarkCommand:t}=await Promise.resolve().then(()=>(on(),rn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});P.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(mo(),go)),r=await n({prUrl:e,agent:t.agent});console.log(r);});var dn=P.command("server").description("Manage DevFlow server");dn.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(k.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(ee(),Ge)),n=await t({port:parseInt(e.port,10)});console.log(k.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});dn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ee(),Ge)),t=await e();console.log(t?k.green("Server stopped"):k.dim("No server running"));});dn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ee(),Ge)),t=await e();t.running?console.log(k.green(`Running (pid: ${t.pid})`)):console.log(k.yellow("Not running"));});P.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(k.blue("The Dashboard is served by the DevFlow server.")),console.log(k.dim("Run: devflow start")),console.log(k.dim("Then open: http://localhost:13337"));});P.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(ho(),po));await t({port:parseInt(e.port,10),background:!!e.background});});P.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(vo(),wo));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(So(),bo));await e();});P.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Do(),Ro));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var at=P.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:r}]=await Promise.all([Promise.resolve().then(()=>(Eo(),Co)),Promise.resolve().then(()=>(xo(),$o)),Promise.resolve().then(()=>(To(),Oo)),Promise.resolve().then(()=>(jo(),Io))]);at.addCommand(e),at.addCommand(t),at.addCommand(n),at.addCommand(r);}await P.parseAsync();
145
+ ${S.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Fr={};$(Fr,{pluginUninstallCommand:()=>ul});var ul,Ur=C(()=>{ul=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Uninstalling ${t}...`);try{execSync(`npm uninstall -g ${t}`,{stdio:"inherit"}),console.log(`
146
+ ${S.green("\u2713")} ${t} uninstalled successfully`);}catch(n){console.error(`
147
+ ${S.red("\u2717")} Uninstallation failed: ${n.message}`),process.exit(1);}});});function dt(e){let t=join(e,".devflow","config.json");if(existsSync(t))try{let n=readFileSync(t,"utf-8");if(JSON.parse(n).serverUrl)return "server"}catch{}return "local"}var Br=createRequire(import.meta.url),gn="0.0.0";try{gn=Br("../package.json").version;}catch{try{gn=Br("../../package.json").version;}catch{}}var R=new Command;R.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(gn).option("--local","Force local engine, skip server");R.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").action(async e=>{let t=process.cwd();if(e.abort){console.log(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=gl.join(t,a);Wr.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Wr.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
148
+ `));}let n=dt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(xn(),Cn)),s=await o(t,{force:e.force});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(r(s.onboardingPack));else {if(s.created.length>0){console.log(S.green("Created:"));for(let i of s.created)console.log(` ${S.dim("+")} ${i}`);}else console.log(S.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(S.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(S.green("\u2705 Onboarding pack generated")),console.log(S.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(S.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(S.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(S.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(An(),$n)),a=await i(t,e.withPlugin);console.log(S.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(wt(),yt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(wt(),yt));await i(t);}}});R.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(Gn(),qn));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var ml=R.command("db").description("Manage DevFlow databases");ml.command("consolidate").description("Merge legacy project databases into the global database").option("--project <path>","Project directory",process.cwd()).option("--dry-run","Report rows and conflicts without writing").action(async e=>{let{consolidateDatabases:t,formatConsolidateResult:n}=await Promise.resolve().then(()=>(no(),to)),o=t(e);for(let r of n(o))console.log(r);});R.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=dt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>($t(),oo));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});R.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(co(),ao)),o=e.backfillVectors?await n(R.opts().local):await t(R.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});R.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(uo(),lo)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:R.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});R.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Ot(),At)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(Ot(),At)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var lt=R.command("workflow").description("Workflow management");lt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(Ce(),De)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});lt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ce(),De)),o=await n(e,{input:t??""},R.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});lt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(Ce(),De)),t=await e(R.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});lt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(Ce(),De)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var ke=R.command("memory").description("Memory management");ke.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ue(),le)),n=await t(R.opts().local,e.source);console.log(JSON.stringify(n,null,2));});ke.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ue(),le));console.log(JSON.stringify(await t(R.opts().local,e.source),null,2));});ke.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(ue(),le)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:R.opts().local});console.log(JSON.stringify(o,null,2));});ke.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(ue(),le));await n(e,t,R.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});ke.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(ue(),le)),t=await e(R.opts().local);console.log(JSON.stringify(t,null,2));});ke.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(ue(),le)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});R.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(ho(),po)),o=(await t(e,void 0,void 0,R.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fn=R.command("docs").description("Documentation index management");fn.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
149
+ ${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${S.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${S.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(S.green(`
150
+ All docs synced.`));}});fn.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>(Mt(),jt)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});fn.command("resync [plugin-name]").description("Rebuild documentation chunks before vector backfill").requiredOption("--with-headings","Use heading-aware 500-3000 character chunks").action(async(e,t)=>{let{resyncKnowledgeDocs:n}=await Promise.resolve().then(()=>(Mt(),jt));console.log(S.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${S.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${S.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(S.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var ut=R.command("skill").description("Plugin/Skill management");ut.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Ae(),$e)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});ut.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Ae(),$e)),n=await t(e,R.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});ut.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Ae(),$e)),n=await t(e,process.cwd(),R.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});ut.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Ae(),$e));await t(e,process.cwd(),R.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});R.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(dr(),ur));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});R.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(fr(),gr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Hr=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Hr.command("run").description("Run a benchmark suite and persist the report").option("--suite <id>","Benchmark suite","default").option("--project <root>","Initialized project root",process.cwd()).option("--rounds <n>","Rounds per task","1").option("--output <format>","text | json","text").action(async e=>{let{runBenchmarkCommand:t}=await Promise.resolve().then(()=>(cn(),an));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Hr.command("report").description("Render a persisted benchmark report").option("--run-id <id>","Specific report; defaults to latest").option("--baseline <id>","Prior report used for regression comparison").option("--output <format>","text | json | markdown","text").action(async e=>{let{reportBenchmarkCommand:t}=await Promise.resolve().then(()=>(cn(),an));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(wr(),yr)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var mn=R.command("server").description("Manage DevFlow server");mn.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(S.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(ne(),Ve)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});mn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ne(),Ve)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});mn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ne(),Ve)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(S.blue("The Dashboard is served by the DevFlow server.")),console.log(S.dim("Run: devflow start")),console.log(S.dim("Then open: http://localhost:13337"));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(kr(),vr));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(_r(),Sr));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Er(),Rr));await e();});R.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>($r(),xr));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var ct=R.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Or(),Ar)),Promise.resolve().then(()=>(Ir(),Tr)),Promise.resolve().then(()=>(Mr(),jr)),Promise.resolve().then(()=>(Ur(),Fr))]);ct.addCommand(e),ct.addCommand(t),ct.addCommand(n),ct.addCommand(o);}await R.parseAsync();