@devflow-tools/devflow 0.16.11 → 0.16.13

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 (106) hide show
  1. package/dist/cli.js +101 -68
  2. package/dist/dashboard/404.html +1 -0
  3. package/dist/dashboard/_next/static/DMSlahSU9ERwQ2grwM6p9/_buildManifest.js +1 -0
  4. package/dist/dashboard/_next/static/DMSlahSU9ERwQ2grwM6p9/_ssgManifest.js +1 -0
  5. package/dist/dashboard/_next/static/chunks/1dd3208c-f3e84932bdc53383.js +1 -0
  6. package/dist/dashboard/_next/static/chunks/221-893fab1a7d7d9317.js +1 -0
  7. package/dist/dashboard/_next/static/chunks/249-e04c1de6240fd78a.js +1 -0
  8. package/dist/dashboard/_next/static/chunks/343-09a7e255220705c5.js +1 -0
  9. package/dist/dashboard/_next/static/chunks/402-a2e4eb98bb6a524c.js +1 -0
  10. package/dist/dashboard/_next/static/chunks/429-eac85fdc49353ed8.js +1 -0
  11. package/dist/dashboard/_next/static/chunks/458-75822399a849befa.js +1 -0
  12. package/dist/dashboard/_next/static/chunks/528-7d4fc14903647f1e.js +2 -0
  13. package/dist/dashboard/_next/static/chunks/568-50487ea5e93fe11f.js +1 -0
  14. package/dist/dashboard/_next/static/chunks/697-05cf55b6c667773f.js +1 -0
  15. package/dist/dashboard/_next/static/chunks/6b3bb038-34d5cf36bd0210d6.js +1 -0
  16. package/dist/dashboard/_next/static/chunks/736-db1a009357c222d2.js +1 -0
  17. package/dist/dashboard/_next/static/chunks/806-195d4d5cc6c28f6c.js +1 -0
  18. package/dist/dashboard/_next/static/chunks/app/_not-found/page-5252c260804ee1ce.js +1 -0
  19. package/dist/dashboard/_next/static/chunks/app/accuracy/page-ca6a419d8b29eb4f.js +1 -0
  20. package/dist/dashboard/_next/static/chunks/app/benchmark/page-6c6d0acbcde4eb85.js +1 -0
  21. package/dist/dashboard/_next/static/chunks/app/context/page-1874ae1050524cb6.js +1 -0
  22. package/dist/dashboard/_next/static/chunks/app/doctor/page-d542f2ab8d6a1c59.js +1 -0
  23. package/dist/dashboard/_next/static/chunks/app/executions/page-b98ec834dcda8d93.js +1 -0
  24. package/dist/dashboard/_next/static/chunks/app/graph/page-f0e7e15288791e9c.js +1 -0
  25. package/dist/dashboard/_next/static/chunks/app/knowledge/page-86808abd0d47c026.js +1 -0
  26. package/dist/dashboard/_next/static/chunks/app/layout-4b78776412bd4fee.js +1 -0
  27. package/dist/dashboard/_next/static/chunks/app/memory/page-e169762426ac7a23.js +1 -0
  28. package/dist/dashboard/_next/static/chunks/app/page-c3e980fb2621470c.js +1 -0
  29. package/dist/dashboard/_next/static/chunks/app/replay/page-a8a465ed885df0cf.js +1 -0
  30. package/dist/dashboard/_next/static/chunks/app/runs/[id]/page-cc1d5182707fca5b.js +1 -0
  31. package/dist/dashboard/_next/static/chunks/app/runs/page-bbf0a58abd70430c.js +1 -0
  32. package/dist/dashboard/_next/static/chunks/app/settings/page-9602ff45892e7910.js +1 -0
  33. package/dist/dashboard/_next/static/chunks/app/timeline/page-a8eb3caf23be8a86.js +1 -0
  34. package/dist/dashboard/_next/static/chunks/app/tool-metrics/page-1f86f62b187f2b5e.js +1 -0
  35. package/dist/dashboard/_next/static/chunks/app/workflows/page-551939c9e86b26c6.js +1 -0
  36. package/dist/dashboard/_next/static/chunks/framework-58c3457e28c4602f.js +1 -0
  37. package/dist/dashboard/_next/static/chunks/main-3175faffdbfc3051.js +1 -0
  38. package/dist/dashboard/_next/static/chunks/main-app-202a5f91ead17fa7.js +1 -0
  39. package/dist/dashboard/_next/static/chunks/pages/_app-58c3f1a8a070bd35.js +1 -0
  40. package/dist/dashboard/_next/static/chunks/pages/_error-312a564ec7e2663f.js +1 -0
  41. package/dist/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  42. package/dist/dashboard/_next/static/chunks/webpack-d6388c5dcd85b0c5.js +1 -0
  43. package/dist/dashboard/_next/static/css/322e14d06135256b.css +31 -0
  44. package/dist/dashboard/_next/static/css/7d4d1db5aa137b5a.css +3 -0
  45. package/dist/dashboard/accuracy.html +1 -0
  46. package/dist/dashboard/accuracy.txt +7 -0
  47. package/dist/dashboard/benchmark.html +1 -0
  48. package/dist/dashboard/benchmark.txt +7 -0
  49. package/dist/dashboard/context.html +1 -0
  50. package/dist/dashboard/context.txt +7 -0
  51. package/dist/dashboard/doctor.html +1 -0
  52. package/dist/dashboard/doctor.txt +7 -0
  53. package/dist/dashboard/executions.html +1 -0
  54. package/dist/dashboard/executions.txt +7 -0
  55. package/dist/dashboard/graph.html +1 -0
  56. package/dist/dashboard/graph.txt +7 -0
  57. package/dist/dashboard/index.html +1 -0
  58. package/dist/dashboard/index.txt +7 -0
  59. package/dist/dashboard/knowledge.html +1 -0
  60. package/dist/dashboard/knowledge.txt +7 -0
  61. package/dist/dashboard/locales/en.json +335 -0
  62. package/dist/dashboard/locales/zh.json +335 -0
  63. package/dist/dashboard/memory.html +1 -0
  64. package/dist/dashboard/memory.txt +7 -0
  65. package/dist/dashboard/replay.html +1 -0
  66. package/dist/dashboard/replay.txt +7 -0
  67. package/dist/dashboard/runs/_.html +1 -0
  68. package/dist/dashboard/runs/_.txt +8 -0
  69. package/dist/dashboard/runs.html +1 -0
  70. package/dist/dashboard/runs.txt +7 -0
  71. package/dist/dashboard/settings.html +1 -0
  72. package/dist/dashboard/settings.txt +7 -0
  73. package/dist/dashboard/timeline.html +1 -0
  74. package/dist/dashboard/timeline.txt +7 -0
  75. package/dist/dashboard/tool-metrics.html +1 -0
  76. package/dist/dashboard/tool-metrics.txt +7 -0
  77. package/dist/dashboard/workflows.html +1 -0
  78. package/dist/dashboard/workflows.txt +7 -0
  79. package/dist/hooks/hook-daemon.js +32 -14
  80. package/dist/hooks/memory-snapshot-cache.js +11 -0
  81. package/dist/hooks/post-tool-use-failure.js +2 -2
  82. package/dist/hooks/post-tool-use.js +6 -3
  83. package/dist/hooks/pre-compact.js +3 -2
  84. package/dist/hooks/pre-tool-use.js +3 -2
  85. package/dist/hooks/server-bootstrap.js +22 -22
  86. package/dist/hooks/session-end.js +4 -2
  87. package/dist/hooks/stop.js +17 -2
  88. package/dist/hooks/user-prompt-submit.js +15 -4
  89. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  90. package/dist/plugin/dist/command-registry.json +5 -5
  91. package/dist/plugin/dist/hooks/hook-daemon.js +32 -14
  92. package/dist/plugin/dist/hooks/memory-snapshot-cache.js +11 -0
  93. package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
  94. package/dist/plugin/dist/hooks/post-tool-use.js +6 -3
  95. package/dist/plugin/dist/hooks/pre-compact.js +3 -2
  96. package/dist/plugin/dist/hooks/pre-tool-use.js +3 -2
  97. package/dist/plugin/dist/hooks/server-bootstrap.js +22 -22
  98. package/dist/plugin/dist/hooks/session-end.js +4 -2
  99. package/dist/plugin/dist/hooks/stop.js +17 -2
  100. package/dist/plugin/dist/hooks/user-prompt-submit.js +15 -4
  101. package/dist/plugin/dist/skills/devflow:react/SKILL.md +8 -0
  102. package/dist/plugin/hooks/session-start +12 -15
  103. package/dist/plugin/package.json +7 -7
  104. package/dist/plugin/skills/react/SKILL.md +8 -0
  105. package/package.json +13 -13
  106. package/plugin-registry.json +29 -29
package/dist/cli.js CHANGED
@@ -1,51 +1,52 @@
1
1
  #!/usr/bin/env node
2
- import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';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 Rs,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import ku,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import no from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {loadPlugins,getPluginInstallRoot,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,DevFlowApiClient,selectHostAdapter,loadPluginsWithDiagnostics,readPluginInstallState,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {spawn,execSync,execFileSync as execFileSync$1}from'child_process';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 ka from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var $s=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var $=(e,t)=>{for(var n in t)$s(e,n,{get:t[n],enumerable:true});};function yt(){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 Ee(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of Us)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Vn(l.installPath);return {root:l.installPath,version:u??null}}}catch{}let r=[];for(let i of ["devflow-local","devflow"]){let a=join$1(o,i,Wt);try{for(let c of readdirSync(a,{withFileTypes:!0})){if(!c.isDirectory())continue;let l=join$1(a,c.name);existsSync$1(join$1(l,"skills"))&&r.push({root:l,version:Vn(l)??c.name,mtimeMs:statSync$1(l).mtimeMs});}}catch{}}r.sort((i,a)=>a.mtimeMs-i.mtimeMs);let s=r[0];return s?{root:s.root,version:s.version}:{root:null,version:null}}function Ve(e,t){let n=Ws(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=Yn(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=Ut(c.content),d=readFileSync$1(l,"utf-8"),g=Ut(d);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:g,isKnownDevFlowArtifact:u===g});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function Gn(e,t,n,o=Date.now,r={}){let s=Ve(e,t).filter(c=>c.isKnownDevFlowArtifact||r.includeModified===true);if(s.length===0)return [];let i=join$1(e,".devflow","backups","global-skills",new Date(o()).toISOString().replace(/[:.]/g,"-")),a=[];for(let c of s){if(!existsSync$1(c.globalPath)||!lstatSync(c.globalPath).isFile()||Ut(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(dirname(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname(c.globalPath),{recursive:!1,force:!1});}catch{}a.push({skillName:c.skillName,originalPath:c.globalPath,backupPath:l,hash:c.globalHash,pluginHash:c.pluginHash,contentChanged:!c.isKnownDevFlowArtifact,version:n});}return a.length>0&&writeFileSync$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
3
- `,"utf-8"),a}function Ws(e){let t=new Map,n;try{n=readdirSync(e,{withFileTypes:!0});}catch{return t}for(let o of n){if(!o.isDirectory())continue;let r=join$1(e,o.name,"SKILL.md"),s=Yn(r);s&&t.set(s.name,r);}return t}function Yn(e){try{if(!lstatSync(e).isFile())return null;let t=readFileSync$1(e,"utf-8"),n=t.match(/^name:\s*([^\s]+)\s*$/m);return n?.[1]?{name:n[1],content:t}:null}catch{return null}}function Ut(e){return createHash("sha256").update(e).digest("hex")}function Vn(e){try{let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf-8"));return typeof t.version=="string"?t.version:null}catch{return null}}function Zn(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=de(t.enabledPlugins)?t.enabledPlugins:{};n[ft]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",je),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[je]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
- `);}function Qn(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 Xn(e,t,n){let o=join$1(t,je,Wt,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&mt(r,join$1(o,"hooks"));for(let c of ["CLAUDE.md","package.json"]){let l=join$1(e,c);existsSync$1(l)&&cpSync(l,join$1(o,c),{force:true});}let s=join$1(e,".claude-plugin","plugin.json");existsSync$1(s)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&mt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&mt(a,join$1(o,"skills")),Ks(o,e),zs(o),Bs(t,o),qs(t,o,n);}function Bs(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",je),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:je,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:Wt,source:s}]},null,2)}
5
- `);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(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[je]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
6
- `);}function qs(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(!de(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&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[ft];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${ft}`);let c=a??[],l=c.find(f=>de(f)&&f.scope==="user"),u=new Date().toISOString(),d=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!de(f)||f.scope!=="user");i[ft]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
7
- `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ks(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(l=>l.startsWith("@devflow-tools/")),a=i.map(l=>join$1(t,"../../packages",l.slice(15))).filter(l=>existsSync$1(join$1(l,"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 l of i)rmSync(join$1(e,"node_modules",...l.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function mt(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()?mt(o,r):cpSync(o,r,{force:true});}}function zs(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 ft,je,Wt,Us,Le=A(()=>{ft="devflow@devflow-local",je="devflow-local",Wt="devflow",Us=["devflow@devflow-local","devflow@devflow"];});var so={};$(so,{initProject:()=>Xs,renderInitReport:()=>ro});async function Xs(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,migratedLegacySkills:[]};if(oo.isInitialized(e)||await oo.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:l,imports:u}=await i.indexAll(e),d=await a.build(l,u);s.indexed={files:c.length,symbols:l.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,ro(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=yt(),a=homedir(),c=join(a,".claude","plugins","cache"),l=join(i,"package.json"),u=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";Xn(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=Gn(a,d,u,Date.now,{includeModified:t.migrateLegacySkills}).map(g=>g.skillName);}catch(g){console.warn(`Warning: Legacy skill migration skipped \u2014 ${g.message}`);}}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");Zn(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Qs.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}Qn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function ro(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(`
8
- `)}var oo,Qs,io=A(()=>{Le();oo=no.default??no,Qs=createRequire(import.meta.url);});var ao={};$(ao,{reviewPluginMemoryHints:()=>oi});async function oi(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(ri).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let u of r){let d=s.get(u);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${u}:${g.key}`,pluginName:u,convention:g});}if(i.length===0)return {available:0,selected:0};let a=i.map(u=>({name:`${u.pluginName}: ${u.convention.value}`,value:u.id,checked:false})),c=await(n.select??(u=>checkbox({message:"Select optional plugin memory hints to save",choices:u})))(a),l=i.filter(u=>c.includes(u.id));return l.length>0&&await(n.write??si)(e,l),{available:i.length,selected:l.length}}function ri(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function si(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 co=A(()=>{});function Fe(){let e=[join(process.cwd(),"plugin-registry.json"),join(di,"../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 lo(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var ui,di,vt=A(()=>{ui=fileURLToPath$1(import.meta.url),di=dirname$1(ui);});async function O(e,t,n,o={}){let r=o.serverUrl??fi;if(o.skipServer)return n();let s=false,i=go.get(r);if(i&&Date.now()-i.ts<mi?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),go.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 fi,go,mi,ye=A(()=>{fi=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",go=new Map,mi=3e4;});var mo=A(()=>{});var Ge={};$(Ge,{installSkill:()=>Re,listSkills:()=>wo,listSkillsSync:()=>wi,searchSkills:()=>bi,uninstallSkill:()=>Jt});async function wo(e){return O(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:true})}function wi(){return []}async function bi(e,t){let n=await wo(),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 bo(e){let t=e.trim().replace(/^@devflow-tools\/(?:plugin-)?/,"");if(!/^[a-z0-9-]+$/.test(t))throw new Error(`Invalid plugin name: ${e}`);return `@devflow-tools/plugin-${t}`}function So(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function _o(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
9
- `,"utf-8"),renameSync$1(o,n);}async function Re(e,t=process.cwd(),n){return O(t,async o=>await o.installPlugin(e),async()=>{let o=bo(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(Je,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",Je,o],{stdio:"pipe",timeout:6e4});let a=So(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),_o(t,a));let c=[],l="0.0.0",u=join(Je,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Jt(e,t=process.cwd(),n){return O(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=bo(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=So(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),_o(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",Je,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(Je,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var Je,ve=A(()=>{ye();mo();Je=getPluginInstallRoot();});var Gt={};$(Gt,{detectTechStack:()=>Po,guidePluginInstallation:()=>Ci,installPluginsFromList:()=>Ei,resolvePluginName:()=>Eo});function Po(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 Eo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Ei(e){let t=e.split(",").map(Eo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Re(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Ci(e){let t=Fe();if(t.plugins.length===0)return console.log(`
2
+ import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';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 Ts,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Bu,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import co from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {loadPlugins,getPluginInstallRoot,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,readPluginInstallState,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {spawn,execSync,execFileSync as execFileSync$1}from'child_process';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 Ia from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Hs=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var x=(e,t)=>{for(var n in t)Hs(e,n,{get:t[n],enumerable:true});};function wt(){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 Ce(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of Ys)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Xn(l.installPath);return {root:l.installPath,version:u??null}}}catch{}let r=[];for(let i of ["devflow-local","devflow"]){let a=join$1(o,i,Jt);try{for(let c of readdirSync(a,{withFileTypes:!0})){if(!c.isDirectory())continue;let l=join$1(a,c.name);existsSync$1(join$1(l,"skills"))&&r.push({root:l,version:Xn(l)??c.name,mtimeMs:statSync$1(l).mtimeMs});}}catch{}}r.sort((i,a)=>a.mtimeMs-i.mtimeMs);let s=r[0];return s?{root:s.root,version:s.version}:{root:null,version:null}}function Ge(e,t){let n=Zs(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=no(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=Kt(c.content),d=readFileSync$1(l,"utf-8"),g=Kt(d);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:g,isKnownDevFlowArtifact:u===g});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function to(e,t,n,o=Date.now,r={}){let s=Ge(e,t).filter(c=>c.isKnownDevFlowArtifact||r.includeModified===true);if(s.length===0)return [];let i=join$1(e,".devflow","backups","global-skills",new Date(o()).toISOString().replace(/[:.]/g,"-")),a=[];for(let c of s){if(!existsSync$1(c.globalPath)||!lstatSync(c.globalPath).isFile()||Kt(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(dirname(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname(c.globalPath),{recursive:!1,force:!1});}catch{}a.push({skillName:c.skillName,originalPath:c.globalPath,backupPath:l,hash:c.globalHash,pluginHash:c.pluginHash,contentChanged:!c.isKnownDevFlowArtifact,version:n});}return a.length>0&&writeFileSync$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
3
+ `,"utf-8"),a}function Zs(e){let t=new Map,n;try{n=readdirSync(e,{withFileTypes:!0});}catch{return t}for(let o of n){if(!o.isDirectory())continue;let r=join$1(e,o.name,"SKILL.md"),s=no(r);s&&t.set(s.name,r);}return t}function no(e){try{if(!lstatSync(e).isFile())return null;let t=readFileSync$1(e,"utf-8"),n=t.match(/^name:\s*([^\s]+)\s*$/m);return n?.[1]?{name:n[1],content:t}:null}catch{return null}}function Kt(e){return createHash("sha256").update(e).digest("hex")}function Xn(e){try{let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf-8"));return typeof t.version=="string"?t.version:null}catch{return null}}function oo(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=de(t.enabledPlugins)?t.enabledPlugins:{};n[ht]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",Le),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[Le]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
+ `);}function ro(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 so(e,t,n){let o=join$1(t,Le,Jt,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&yt(r,join$1(o,"hooks"));for(let c of ["CLAUDE.md","package.json"]){let l=join$1(e,c);existsSync$1(l)&&cpSync(l,join$1(o,c),{force:true});}let s=join$1(e,".claude-plugin","plugin.json");existsSync$1(s)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&yt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&yt(a,join$1(o,"skills")),ei(o,e),ti(o),Qs(t,o),Xs(t,o,n);}function Qs(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",Le),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:Le,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:Jt,source:s}]},null,2)}
5
+ `);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(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[Le]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
6
+ `);}function Xs(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(!de(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&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[ht];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${ht}`);let c=a??[],l=c.find(f=>de(f)&&f.scope==="user"),u=new Date().toISOString(),d=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!de(f)||f.scope!=="user");i[ht]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
7
+ `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ei(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(l=>l.startsWith("@devflow-tools/")),a=i.map(l=>join$1(t,"../../packages",l.slice(15))).filter(l=>existsSync$1(join$1(l,"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 l of i)rmSync(join$1(e,"node_modules",...l.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function yt(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()?yt(o,r):cpSync(o,r,{force:true});}}function ti(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 ht,Le,Jt,Ys,Ue=A(()=>{ht="devflow@devflow-local",Le="devflow-local",Jt="devflow",Ys=["devflow@devflow-local","devflow@devflow"];});var go={};x(go,{initProject:()=>ci,renderInitReport:()=>uo});async function ci(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,migratedLegacySkills:[]};if(lo.isInitialized(e)||await lo.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:l,imports:u}=await i.indexAll(e),d=await a.build(l,u);s.indexed={files:c.length,symbols:l.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,uo(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=wt(),a=homedir(),c=join(a,".claude","plugins","cache"),l=join(i,"package.json"),u=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";so(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=to(a,d,u,Date.now,{includeModified:t.migrateLegacySkills}).map(g=>g.skillName);}catch(g){console.warn(`Warning: Legacy skill migration skipped \u2014 ${g.message}`);}}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");oo(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=ai.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}ro(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function uo(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(`
8
+ `)}var lo,ai,fo=A(()=>{Ue();lo=co.default??co,ai=createRequire(import.meta.url);});var mo={};x(mo,{reviewPluginMemoryHints:()=>gi});async function gi(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(fi).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let u of r){let d=s.get(u);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${u}:${g.key}`,pluginName:u,convention:g});}if(i.length===0)return {available:0,selected:0};let a=i.map(u=>({name:`${u.pluginName}: ${u.convention.value}`,value:u.id,checked:false})),c=await(n.select??(u=>checkbox({message:"Select optional plugin memory hints to save",choices:u})))(a),l=i.filter(u=>c.includes(u.id));return l.length>0&&await(n.write??mi)(e,l),{available:i.length,selected:l.length}}function fi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function mi(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 po=A(()=>{});function We(){let e=[join(process.cwd(),"plugin-registry.json"),join(wi,"../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 ho(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var ki,wi,bt=A(()=>{ki=fileURLToPath$1(import.meta.url),wi=dirname$1(ki);});async function O(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url;if(o.skipServer)return n();let s=false,i=vo.get(r);if(i&&Date.now()-i.ts<Ri?s=i.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),s?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),vo.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 vo,Ri,we=A(()=>{vo=new Map,Ri=3e4;});var wo=A(()=>{});var Ze={};x(Ze,{installSkill:()=>Ae,listSkills:()=>Ro,listSkillsSync:()=>Oi,searchSkills:()=>Ni,uninstallSkill:()=>Qt});async function Ro(e){return O(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:true})}function Oi(){return []}async function Ni(e,t){let n=await Ro(),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 Co(e){let t=e.trim().replace(/^@devflow-tools\/(?:plugin-)?/,"");if(!/^[a-z0-9-]+$/.test(t))throw new Error(`Invalid plugin name: ${e}`);return `@devflow-tools/plugin-${t}`}function Do(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Ao(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
9
+ `,"utf-8"),renameSync$1(o,n);}async function Ae(e,t=process.cwd(),n){return O(t,async o=>await o.installPlugin(e),async()=>{let o=Co(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(Ye,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",Ye,o],{stdio:"pipe",timeout:6e4});let a=Do(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Ao(t,a));let c=[],l="0.0.0",u=join(Ye,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Qt(e,t=process.cwd(),n){return O(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Co(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Do(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Ao(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",Ye,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(Ye,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var Ye,be=A(()=>{we();wo();Ye=getPluginInstallRoot();});var Xt={};x(Xt,{detectTechStack:()=>$o,guidePluginInstallation:()=>Li,installPluginsFromList:()=>Mi,resolvePluginName:()=>xo});function $o(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 xo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Mi(e){let t=e.split(",").map(xo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Ae(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Li(e){let t=We();if(t.plugins.length===0)return console.log(`
10
10
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
11
11
  `),[];console.log(`
12
12
  \u{1F50C} Plugin Installation Guide
13
- `);let n=Po(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
13
+ `);let n=$o(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
14
14
  `);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...
15
- `);let i=[...o];for(let a of i)try{await Re(a,e,!0),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(`
15
+ `);let i=[...o];for(let a of i)try{await Ae(a,e,!0),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(`
16
16
  Plugin installation cancelled.
17
17
  `),[]}if(s.length>0){console.log(`
18
18
  Installing selected plugins...
19
- `);for(let i of s)try{await Re(i,e,!0),console.log(`\u2713 ${i}
19
+ `);for(let i of s)try{await Ae(i,e,!0),console.log(`\u2713 ${i}
20
20
  `);}catch{console.error(`\u2717 Failed to install ${i}
21
21
  `);}}else console.log(`
22
22
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
23
- `);return s}var Yt=A(()=>{vt();ve();});var Io={};$(Io,{ResetExecutionError:()=>Ye,executeResetCommand:()=>Ji,formatResetResult:()=>tn,runReset:()=>jo});function Fi(){if(kt)return kt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return kt=e.DatabaseSync,kt}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function tn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Hi(e){return e==="all"||$o.includes(e)}function le(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function Qt(e){let t=resolve(e),n=[];for(;!le(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 nn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Ui(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 Oo(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=le(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(le(t)){let o=realpathSync(t);if(!nn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Wi(e,t){return (e==="all"?$o:[e]).map(o=>({scope:o,path:join$1(t,...xo[o])}))}function No(e,t){let n=le(t);if(n)return Oo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function To(e,t){let n=No(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 Bi(e){let t=le(e);if(!t?.isFile()||t.size<Zt.length)return false;let n=Buffer.alloc(Zt.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(Zt)}finally{closeSync(o);}}function qi(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}Bi(o)&&t.push(o);}}return n(e),t}function Ki(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Fi())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function zi(e,t,n){let o=qi(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));Ki(s,i);}}function Vi(e,t,n,o,r){let s=!!le(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),zi(c.path,join$1(i,c.scope),()=>To(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(le(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&le(t))try{rmdirSync(t);}catch{}}}function jo(e,t={}){if(!Hi(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Ui(e.project??process.cwd()),o=Wi(e.scope,n);for(let c of o)Oo(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 l=No(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?Qt(e.backupTo):void 0;if(s){let c=le(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=Qt(l.path),d=join$1(s,l.scope),g=Qt(d);if(nn(u,g)||nn(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(le(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Vi(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),To(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new Ye(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Ji(e,t={},n=console){try{let o=jo(e,t),r=tn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof Ye)for(let r of tn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var kt,Ye,xo,$o,Zt,Mo=A(()=>{Ye=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};xo={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},$o=Object.keys(xo),Zt=Buffer.from("SQLite format 3\0","binary");});var zo={};$(zo,{consolidateDatabases:()=>Qi,formatConsolidateResult:()=>Xi});function Qi(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=[Fo("project",o,s?n:void 0),Fo("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),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??u,l);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let g=c.some(f=>f.kind==="project")?ea(o):null;try{let f=new Map;for(let y of c){let w=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);Ho(y.path,w),f.set(y.kind,w);}s&&Ho(n,join$1(d,"global-devflow.db.before"));let p=f.has("project")?na(o,d):[];a.retired.push(...p.map(y=>y.destination));let m=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),m=new DatabaseSync(n),m.exec("PRAGMA busy_timeout = 10000"),m.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&m.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&m.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),m.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&Uo(m,"project_source",void 0,a.inserted),f.has("codegraph")){Uo(m,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let w of Xe(m,"codegraph_source").filter(R=>R.startsWith("devflow_")))m.exec(`DROP TABLE codegraph_source.${M(w)}`);}m.exec("COMMIT"),h=!1;}catch(y){if(h)try{m?.exec("ROLLBACK");}catch{}throw Ko(p),y}finally{m?.close();}return a}finally{ta(g);}}function Xi(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 Fo(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 Xe(r).filter(c=>!i||i.has(c)))o.tables[a]=an(r,a),o.conflicts[a]=s&&Xe(s).includes(a)?oa(r,s,a):0;}finally{r.close(),s?.close();}return o}function Ho(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 ea(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 ta(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function na(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 Ko(n),o}return n}function Ko(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Uo(e,t,n,o){let r=new Set(Xe(e)),s=Xe(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=bt(e,"main",i),c=new Set(bt(e,t,i).map(p=>p.name)),l=a.filter(p=>c.has(p.name));if(sn.has(i)&&(l=l.filter(p=>p.pk===0)),l.length===0)continue;let u=an(e,i),d=l.map(p=>M(p.name)).join(", "),g=l.map(p=>`s.${M(p.name)}`).join(", ");if(l.filter(p=>p.pk>0).length>0&&!sn.has(i))e.exec(`INSERT OR IGNORE INTO main.${M(i)} (${d}) SELECT ${g} FROM ${M(t)}.${M(i)} s`);else {let p=l.map(m=>`t.${M(m.name)} IS s.${M(m.name)}`).join(" AND ");e.exec(`
24
- INSERT INTO main.${M(i)} (${d})
25
- SELECT ${g} FROM ${M(t)}.${M(i)} s
26
- WHERE NOT EXISTS (SELECT 1 FROM main.${M(i)} t WHERE ${p})
27
- `);}o[i]=(o[i]??0)+(an(e,i)-u);}}function oa(e,t,n){let o=new Set(bt(t,"main",n).map(l=>l.name)),r=bt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||sn.has(n))return 0;let s=r.map(l=>M(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${M(n)}`).all(),a=r.map(l=>`${M(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${M(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function Xe(e,t="main"){return e.prepare(`SELECT name FROM ${M(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function bt(e,t,n){return e.prepare(`PRAGMA ${M(t)}.table_info(${M(n)})`).all()}function an(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${M(t)}`).get();return Number(n.count)}function M(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var sn,Vo=A(()=>{sn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var Jo={};$(Jo,{connectAgent:()=>ia,getAvailableAgents:()=>aa});async function ia(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 aa(){return listAdapters()}var Go=A(()=>{});var Zo={};$(Zo,{getIndexStatus:()=>ca,refreshIndex:()=>la});async function ca(e){return O(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 la(e){return O(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var Qo=A(()=>{ye();});var Xo={};$(Xo,{getGraph:()=>da});async function da(e={}){let t=e.target??"all",n=e.depth??2;return O(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 er=A(()=>{ye();});var cn={};$(cn,{getContext:()=>fa,getTaskContext:()=>ma});async function fa(e){return O(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 ma(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return O(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 ln=A(()=>{ye();});var et={};$(et,{getWorkflowRuns:()=>nr,getWorkflowStatus:()=>ya,listWorkflows:()=>pa,runWorkflow:()=>ha});async function pa(e){return O(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function ha(e,t,n){return O(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function ya(e){return nr(e)}async function nr(e){return O(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var tt=A(()=>{ye();});var De={};$(De,{backfillObservationVectors:()=>Pa,queryMemory:()=>ba,reviewCandidates:()=>_a,reviewMemories:()=>Ca,setMemory:()=>Sa,showMemory:()=>wa});async function wa(e,t){let n=await O(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 ba(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return O(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Sa(e,t,n){return O(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 _a(e){return O(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Pa(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ea(e){let t=ka.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Ca(){let t=await O(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(`
28
- [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ea(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await O(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await O(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
29
- Reviewed ${o}/${t.length} pending memories.`);}var Ae=A(()=>{ye();});var rr={};$(rr,{getDocsStatus:()=>Aa,queryKnowledge:()=>or,searchKnowledge:()=>Da,syncDocs:()=>xa});async function or(e,t,n,o){return O(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 Da(e,t,n){return (await or(e,t,void 0,n)).results}async function Aa(e){return O(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function xa(e,t){return O(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var sr=A(()=>{ye();});var fn={};$(fn,{backfillKnowledgeVectors:()=>Ta,resyncKnowledgeDocs:()=>Na});function ir(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Na(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=ir(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Ta(e={}){let t=ir(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var mn=A(()=>{});var cr={};$(cr,{inspectSkillHealth:()=>St,showSkillHealth:()=>La});function Ma(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function St(e){let t=e===void 0?Ee(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[],o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=Ma(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let d=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&d!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let g=a.get(u.name)??[];g.push(l),a.set(u.name,g);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),d=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(d)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function La(e={}){let t=St(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var pn=A(()=>{Le();});var hn={};$(hn,{showMcpHealth:()=>qa,showMcpInventory:()=>Ba});async function Ba(e={}){let t=redactMcpInventory(readMcpInventory(e.project??process.cwd()));if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.servers){let o=n.drift?.length?` [${n.drift.join(", ")}]`:"";console.log(`${n.name} ${n.transport} ${n.enabled?"enabled":"disabled"}${o}`),console.log(` sources: ${n.sourcePaths.join(", ")}`),console.log(` fingerprint: ${n.fingerprint}`);}t.duplicates.length&&console.log(`duplicates: ${t.duplicates.map(n=>n.name).join(", ")}`),t.unreadable.length&&console.error(`unreadable: ${t.unreadable.map(n=>n.path).join(", ")}`);}async function qa(e={}){let t=e.refresh?await checkMcpHealth(readMcpInventory(e.project??process.cwd())):readCachedMcpHealth(homedir$1());if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.records){let o=n.failureCategory?` ${n.failureCategory}: ${n.lastError??""}`:"";console.log(`${n.status.toUpperCase()} ${n.name} failures=${n.failureCount}${o}`);}}var yn=A(()=>{});var Pt={};$(Pt,{DEFAULT_SERVER_PORT:()=>_t,readPidFromFile:()=>bn,readPortFromFile:()=>fr,serverStatus:()=>rt,startServer:()=>Sn,stopServer:()=>ot});function wn(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Ga(){try{return dr.resolve("./server.js")}catch{try{return dr.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function fr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
30
- `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function bn(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
31
- `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Sn(e){let t=Ga(),n=wn(process.cwd()),o=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
32
- ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function ot(){let e=wn(process.cwd()),t=bn(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function rt(){let e=wn(process.cwd()),t=fr(e)??_t,{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:bn(e)??void 0,port:t}:{running:false,port:t}}var dr,_t,we=A(()=>{dr=createRequire(import.meta.url);_t=13337;});var Yr={};$(Yr,{renderDoctorText:()=>Jr,runDoctor:()=>Dl,runDoctorAudit:()=>xl,runDoctorAuditFix:()=>$l,runDoctorCommand:()=>Al,runDoctorReceipts:()=>Nl,runDoctorViolations:()=>Ol,runLegacyDoctorReport:()=>Gr,runStructuredDoctor:()=>Fn});function Nt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function mr(e){return join$1(homedir$1(),".devflow","daemons",`${Nt(e)}.sock`)}function ac(){return join$1(homedir$1(),".devflow","daemons.json")}function Tr(){if(Ct)return Ct;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ct=e.DatabaseSync,Ct}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function T(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function cc(e,t){let n=t.homePath??homedir$1(),o=[],r=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(o.push({key:"host_adapter",value:r.status==="selected"?{id:r.adapter.id,candidates:r.candidates,explicit:r.explicit}:{status:"failed",code:r.code,candidates:r.candidates,reason:r.reason,action:r.action},target:"one explicitly selected or uniquely detected host",ok:r.status==="selected",severity:"warning"}),r.status==="selected"){let d=await r.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});o.push({key:"host_capabilities",value:d,target:"unsupported capabilities have explicit degradation",ok:d.every(g=>g.status==="supported"||!!(g.reason&&g.fallback)),severity:"error"});}let s=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),i=s.diagnostics.filter(d=>d.status==="failed");o.push({key:"plugin_runtime",value:s.diagnostics,target:"configured plugins loadable with diagnostics",ok:i.length===0,severity:"warning"});let a=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));o.push({key:"mcp_inventory",value:{servers:a.servers.length,duplicates:a.duplicates.length,unreadable:a.unreadable.length},target:{duplicates:0,unreadable:0},ok:a.unreadable.length===0,severity:a.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:a.duplicates.filter(d=>d.fingerprints.length>1).map(d=>d.name),target:[],ok:a.duplicates.every(d=>d.fingerprints.length===1),severity:"warning"});let c=await checkMcpHealth(a,n),l=c.records.filter(d=>d.status==="unhealthy");o.push({key:"mcp_health",value:c.records,target:"no unhealthy enabled servers",ok:l.length===0,severity:"warning"});let u=t.activePluginRoot??Ee(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(u){let d=St(u);o.push({key:"skill_health",value:{root:d.pluginRoot,skills:d.skills,commands:d.commands,issues:d.issues},target:"valid and fully bound installed skills",ok:d.healthy,severity:"warning"});}return {name:"Contract",status:T(o),metrics:o}}function xn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function lc(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!==Nt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function uc(e,t){let n=xn(e),o=Nt(n.path),r=mr(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??ac();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=>lc(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 l=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:xn(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:l.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:l.length},target:"0 when idle or 1 while active",ok:l.length<=1,severity:"warning"});let u=l.map(g=>mr(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:u,target:[r],ok:!0,severity:"info"});let d=l.filter((g,f)=>g.projectHash!==o||u[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:T(s),metrics:s}}function gc(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(dc)){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 jr(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 fc(e){let t=jr(e);return t&&t.length>0?t:null}function Pn(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 mc(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function pr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function hc(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:T(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Tr())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=gc(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:T(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
23
+ `);return s}var en=A(()=>{bt();be();});var Wo={};x(Wo,{ResetExecutionError:()=>Qe,executeResetCommand:()=>ia,formatResetResult:()=>sn,runReset:()=>Uo});function Zi(){if(St)return St;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return St=e.DatabaseSync,St}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function sn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Qi(e){return e==="all"||Mo.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function nn(e){let t=resolve(e),n=[];for(;!se(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 an(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Xi(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 Lo(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=se(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(se(t)){let o=realpathSync(t);if(!an(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function ea(e,t){return (e==="all"?Mo:[e]).map(o=>({scope:o,path:join$1(t,...Io[o])}))}function Fo(e,t){let n=se(t);if(n)return Lo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Ho(e,t){let n=Fo(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 ta(e){let t=se(e);if(!t?.isFile()||t.size<tn.length)return false;let n=Buffer.alloc(tn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(tn)}finally{closeSync(o);}}function na(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}ta(o)&&t.push(o);}}return n(e),t}function oa(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Zi())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function ra(e,t,n){let o=na(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));oa(s,i);}}function sa(e,t,n,o,r){let s=!!se(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),ra(c.path,join$1(i,c.scope),()=>Ho(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(se(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&se(t))try{rmdirSync(t);}catch{}}}function Uo(e,t={}){if(!Qi(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Xi(e.project??process.cwd()),o=ea(e.scope,n);for(let c of o)Lo(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 l=Fo(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?nn(e.backupTo):void 0;if(s){let c=se(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=nn(l.path),d=join$1(s,l.scope),g=nn(d);if(an(u,g)||an(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(se(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&sa(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Ho(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new Qe(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function ia(e,t={},n=console){try{let o=Uo(e,t),r=sn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof Qe)for(let r of sn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var St,Qe,Io,Mo,tn,Bo=A(()=>{Qe=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Io={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Mo=Object.keys(Io),tn=Buffer.from("SQLite format 3\0","binary");});var Qo={};x(Qo,{consolidateDatabases:()=>ua,formatConsolidateResult:()=>da});function ua(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=[Ko("project",o,s?n:void 0),Ko("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),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??u,l);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let g=c.some(f=>f.kind==="project")?ga(o):null;try{let f=new Map;for(let y of c){let k=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);Jo(y.path,k),f.set(y.kind,k);}s&&Jo(n,join$1(d,"global-devflow.db.before"));let p=f.has("project")?ma(o,d):[];a.retired.push(...p.map(y=>y.destination));let m=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),m=new DatabaseSync(n),m.exec("PRAGMA busy_timeout = 10000"),m.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&m.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&m.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),m.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&zo(m,"project_source",void 0,a.inserted),f.has("codegraph")){zo(m,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let k of tt(m,"codegraph_source").filter(C=>C.startsWith("devflow_")))m.exec(`DROP TABLE codegraph_source.${F(k)}`);}m.exec("COMMIT"),h=!1;}catch(y){if(h)try{m?.exec("ROLLBACK");}catch{}throw Zo(p),y}finally{m?.close();}return a}finally{fa(g);}}function da(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 Ko(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 tt(r).filter(c=>!i||i.has(c)))o.tables[a]=dn(r,a),o.conflicts[a]=s&&tt(s).includes(a)?pa(r,s,a):0;}finally{r.close(),s?.close();}return o}function Jo(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 ga(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 fa(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function ma(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 Zo(n),o}return n}function Zo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function zo(e,t,n,o){let r=new Set(tt(e)),s=tt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Et(e,"main",i),c=new Set(Et(e,t,i).map(p=>p.name)),l=a.filter(p=>c.has(p.name));if(un.has(i)&&(l=l.filter(p=>p.pk===0)),l.length===0)continue;let u=dn(e,i),d=l.map(p=>F(p.name)).join(", "),g=l.map(p=>`s.${F(p.name)}`).join(", ");if(l.filter(p=>p.pk>0).length>0&&!un.has(i))e.exec(`INSERT OR IGNORE INTO main.${F(i)} (${d}) SELECT ${g} FROM ${F(t)}.${F(i)} s`);else {let p=l.map(m=>`t.${F(m.name)} IS s.${F(m.name)}`).join(" AND ");e.exec(`
24
+ INSERT INTO main.${F(i)} (${d})
25
+ SELECT ${g} FROM ${F(t)}.${F(i)} s
26
+ WHERE NOT EXISTS (SELECT 1 FROM main.${F(i)} t WHERE ${p})
27
+ `);}o[i]=(o[i]??0)+(dn(e,i)-u);}}function pa(e,t,n){let o=new Set(Et(t,"main",n).map(l=>l.name)),r=Et(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||un.has(n))return 0;let s=r.map(l=>F(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${F(n)}`).all(),a=r.map(l=>`${F(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${F(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function tt(e,t="main"){return e.prepare(`SELECT name FROM ${F(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Et(e,t,n){return e.prepare(`PRAGMA ${F(t)}.table_info(${F(n)})`).all()}function dn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${F(t)}`).get();return Number(n.count)}function F(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var un,Xo=A(()=>{un=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var er={};x(er,{connectAgent:()=>va,getAvailableAgents:()=>ka});async function va(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 ka(){return listAdapters()}var tr=A(()=>{});var or={};x(or,{getIndexStatus:()=>wa,refreshIndex:()=>ba});async function wa(e){return O(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 ba(e){return O(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var rr=A(()=>{we();});var sr={};x(sr,{getGraph:()=>_a});async function _a(e={}){let t=e.target??"all",n=e.depth??2;return O(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 ir=A(()=>{we();});var gn={};x(gn,{getContext:()=>Pa,getTaskContext:()=>Ra});async function Pa(e){return O(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 Ra(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return O(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 fn=A(()=>{we();});var nt={};x(nt,{getWorkflowRuns:()=>cr,getWorkflowStatus:()=>Aa,listWorkflows:()=>Ca,runWorkflow:()=>Da});async function Ca(e){return O(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Da(e,t,n){return O(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Aa(e){return cr(e)}async function cr(e){return O(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ot=A(()=>{we();});var pn={};x(pn,{getEmbeddingStatus:()=>Oa,prepareEmbeddings:()=>Na,renderEmbeddingStatus:()=>Ta});async function Oa(){return inspectEmbeddingModel()}async function Na(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Ta(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
28
+ `)}var hn=A(()=>{});var $e={};x($e,{backfillObservationVectors:()=>Ua,queryMemory:()=>La,reviewCandidates:()=>Ha,reviewMemories:()=>Ba,setMemory:()=>Fa,showMemory:()=>Ma});async function Ma(e,t){let n=await O(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 La(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return O(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Fa(e,t,n){return O(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 Ha(e){return O(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Ua(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Wa(e){let t=Ia.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Ba(){let t=await O(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(`
29
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Wa(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await O(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await O(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
30
+ Reviewed ${o}/${t.length} pending memories.`);}var xe=A(()=>{we();});var ur={};x(ur,{getDocsStatus:()=>Ja,queryKnowledge:()=>lr,searchKnowledge:()=>Ka,syncDocs:()=>za});async function lr(e,t,n,o){return O(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 Ka(e,t,n){return (await lr(e,t,void 0,n)).results}async function Ja(e){return O(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function za(e,t){return O(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var dr=A(()=>{we();});var kn={};x(kn,{backfillKnowledgeVectors:()=>Za,resyncKnowledgeDocs:()=>Ya});function gr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Ya(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=gr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Za(e={}){let t=gr(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var wn=A(()=>{});var mr={};x(mr,{inspectSkillHealth:()=>Pt,showSkillHealth:()=>tc});function ec(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function Pt(e){let t=e===void 0?Ce(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[],o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=ec(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let d=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&d!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let g=a.get(u.name)??[];g.push(l),a.set(u.name,g);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),d=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(d)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function tc(e={}){let t=Pt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var bn=A(()=>{Ue();});var Sn={};x(Sn,{showMcpHealth:()=>ac,showMcpInventory:()=>ic});async function ic(e={}){let t=redactMcpInventory(readMcpInventory(e.project??process.cwd()));if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.servers){let o=n.drift?.length?` [${n.drift.join(", ")}]`:"";console.log(`${n.name} ${n.transport} ${n.enabled?"enabled":"disabled"}${o}`),console.log(` sources: ${n.sourcePaths.join(", ")}`),console.log(` fingerprint: ${n.fingerprint}`);}t.duplicates.length&&console.log(`duplicates: ${t.duplicates.map(n=>n.name).join(", ")}`),t.unreadable.length&&console.error(`unreadable: ${t.unreadable.map(n=>n.path).join(", ")}`);}async function ac(e={}){let t=e.refresh?await checkMcpHealth(readMcpInventory(e.project??process.cwd())):readCachedMcpHealth(homedir$1());if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.records){let o=n.failureCategory?` ${n.failureCategory}: ${n.lastError??""}`:"";console.log(`${n.status.toUpperCase()} ${n.name} failures=${n.failureCount}${o}`);}}var _n=A(()=>{});var Ct={};x(Ct,{DEFAULT_SERVER_PORT:()=>Cn,readPidFromFile:()=>st,readPortFromFile:()=>kr,serverStatus:()=>ct,startServer:()=>Dn,stopServer:()=>at});function Rn(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function hc(){try{return yr.resolve("./server.js")}catch{try{return yr.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function kr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
31
+ `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function st(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
32
+ `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Dn(e){let t=hc(),n=Rn(process.cwd()),o=randomUUID(),r=spawn(process.execPath,[t,"--devflow-instance-token",o],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});writeFileSync(n,`${e.port}
33
+ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await yc(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function at(){let e=Rn(process.cwd()),t=st(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),!0}catch{return unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),false}}async function ct(){let e=Rn(process.cwd()),t=resolveRuntimeEndpoint(),n=kr(e)??t.port,{DevFlowApiClient:o}=await import('@devflow-tools/sdk');if(await new o({baseUrl:`http://127.0.0.1:${n}`,projectRoot:process.cwd()}).ping()){let a=st(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!st(e)||i.pid===st(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function yc(e,t){let n=Date.now()+t;for(;Date.now()<n;){try{if((await fetch(new URL("/api/health",e),{signal:AbortSignal.timeout(500)})).ok)return !0}catch{}await new Promise(o=>setTimeout(o,100));}return false}var yr,Cn,_e=A(()=>{yr=createRequire(import.meta.url);Cn=DEFAULT_DEVFLOW_SERVER_PORT;});var os={};x(os,{renderDoctorText:()=>ts,runDoctor:()=>Ql,runDoctorAudit:()=>eu,runDoctorAuditFix:()=>tu,runDoctorCommand:()=>Xl,runDoctorReceipts:()=>ou,runDoctorViolations:()=>nu,runLegacyDoctorReport:()=>ns,runStructuredDoctor:()=>Kn});function Mt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function wr(e){return join$1(homedir$1(),".devflow","daemons",`${Mt(e)}.sock`)}function xc(){return join$1(homedir$1(),".devflow","daemons.json")}function Ur(){if(At)return At;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return At=e.DatabaseSync,At}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function N(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Oc(e,t){let n=t.homePath??homedir$1(),o=[],r=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(o.push({key:"host_adapter",value:r.status==="selected"?{id:r.adapter.id,candidates:r.candidates,explicit:r.explicit}:{status:"failed",code:r.code,candidates:r.candidates,reason:r.reason,action:r.action},target:"one explicitly selected or uniquely detected host",ok:r.status==="selected",severity:"warning"}),r.status==="selected"){let p=await r.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});o.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(m=>m.status==="supported"||!!(m.reason&&m.fallback)),severity:"error"});}let s=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),i=s.diagnostics.filter(p=>p.status==="failed");o.push({key:"plugin_runtime",value:s.diagnostics,target:"configured plugins loadable with diagnostics",ok:i.length===0,severity:"warning"});let a=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));o.push({key:"mcp_inventory",value:{servers:a.servers.length,duplicates:a.duplicates.length,unreadable:a.unreadable.length},target:{duplicates:0,unreadable:0},ok:a.unreadable.length===0,severity:a.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:a.duplicates.filter(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:a.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let c=await checkMcpHealth(a,n),l=c.records.filter(p=>p.status==="unhealthy");o.push({key:"mcp_health",value:c.records,target:"no unhealthy enabled servers",ok:l.length===0,severity:"warning"});let u=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(u){let p=Pt(u);o.push({key:"skill_health",value:{root:p.pluginRoot,skills:p.skills,commands:p.commands,issues:p.issues},target:"valid and fully bound installed skills",ok:p.healthy,severity:"warning"});}let d=readRuntimeEndpointState(n);o.push({key:"runtime_endpoint_registry",value:d??"not registered",target:"healthy while active, stopped or absent while idle",ok:!d||d.status==="healthy"||d.status==="stopped",severity:d?.status==="degraded"?"error":"warning"});let g=(t.now??Date.now)(),f=listRuntimeHttpCircuits(n).filter(p=>p.status==="open"&&(p.openUntil??0)>g);return o.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:N(o),metrics:o}}function In(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Nc(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!==Mt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Tc(e,t){let n=In(e),o=Mt(n.path),r=wr(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??xc();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=>Nc(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 l=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:In(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:l.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:l.length},target:"0 when idle or 1 while active",ok:l.length<=1,severity:"warning"});let u=l.map(g=>wr(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:u,target:[r],ok:!0,severity:"info"});let d=l.filter((g,f)=>g.projectHash!==o||u[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:N(s),metrics:s}}function Ic(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(jc)){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 Wr(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 Mc(e){let t=Wr(e);return t&&t.length>0?t:null}function $n(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 Lc(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function br(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Hc(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:N(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Ur())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Ic(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:N(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
33
34
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
34
35
  FROM distill_leases
35
- `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let j=fc(_.event_ids),Y=jr(_.session_ids),oe=Pn(_.event_count),D=Pn(_.created_at),F=Pn(_.expires_at),X=typeof _.status=="string"&&pc.has(_.status)?_.status:null,x=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,I=j!==null&&oe!==null&&mc(oe,j.length);if(!x||!j||!Y||!I||D===null||F===null||X===null){g+=1,_.status==="pending"&&(F===null||pr(F,c))&&(f+=1);continue}if(!(X!=="pending"||!pr(F,c)))for(let H of j)d.add(H);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let m=i.prepare(`
36
+ `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let T=Mc(_.event_ids),J=Wr(_.session_ids),ne=$n(_.event_count),D=$n(_.created_at),U=$n(_.expires_at),X=typeof _.status=="string"&&Fc.has(_.status)?_.status:null,$=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,M=T!==null&&ne!==null&&Lc(ne,T.length);if(!$||!T||!J||!M||D===null||U===null||X===null){g+=1,_.status==="pending"&&(U===null||br(U,c))&&(f+=1);continue}if(!(X!=="pending"||!br(U,c)))for(let W of T)d.add(W);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let m=i.prepare(`
36
37
  SELECT id
37
38
  FROM session_events
38
39
  WHERE processed = 0 AND created_at < ?
39
- `).all(c-300*1e3).filter(_=>!d.has(_.id)).length;n.push({key:"unprocessed_stale_events",value:m,target:0,ok:m===0,severity:"error"});let h=B(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:m===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),w=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:w===null?0:Math.max(0,c-w),target:"<= 300000 when no active lease is present",ok:w===null||m===0,severity:"warning"});let R=B(i,`
40
+ `).all(c-300*1e3).filter(_=>!d.has(_.id)).length;n.push({key:"unprocessed_stale_events",value:m,target:0,ok:m===0,severity:"error"});let h=z(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:m===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),k=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:k===null?0:Math.max(0,c-k),target:"<= 300000 when no active lease is present",ok:k===null||m===0,severity:"warning"});let C=z(i,`
40
41
  SELECT COUNT(*) count
41
42
  FROM session_events event
42
43
  LEFT JOIN sessions session ON session.id = event.session_id
43
44
  WHERE TRIM(event.session_id) = '' OR session.id IS NULL
44
- `);n.push({key:"orphan_memory_events",value:R,target:0,ok:R===0,severity:"error"});let v=B(i,`
45
+ `);n.push({key:"orphan_memory_events",value:C,target:0,ok:C===0,severity:"error"});let v=z(i,`
45
46
  SELECT COUNT(*) count
46
47
  FROM sessions
47
48
  WHERE status = 'active' AND created_at < ?
48
- `,c-$n);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let b=i.prepare(`
49
+ `,c-Mn);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let b=i.prepare(`
49
50
  SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
50
51
  FROM (
51
52
  SELECT project, session_id, title, COUNT(*) AS title_count
@@ -53,49 +54,62 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function ot(){let e=wn(process.cwd(
53
54
  GROUP BY project, session_id, title
54
55
  HAVING COUNT(*) > 1
55
56
  )
56
- `).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.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:T(n),metrics:n}}function ie(e,t){return (t.openDatabase??(o=>new(Tr())(o,{readOnly:true})))(e)}function W(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function st(e,t){return W(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function B(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Ir(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function On(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function yc(e){let t=On(Ir(e.output)),n=On(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,s=!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error",i=!s&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:s,degraded:i}}function vc(e){let t=Ir(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=On(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function hr(e,t){return t===0?0:e/t}function En(e,t){return e===0?1:t/e}function kc(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=ie(s,t),W(g,"nodes")?(o=B(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"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}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=ie(i,t);let f=W(g,"symbols_vec_rowids")?"symbols_vec_rowids":W(g,"symbol_sources")?"symbol_sources":null;f?(r=B(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=En(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=ie(a,t);let p=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(m=>!W(g,m));if(p.length>0)n.push({key:"knowledge_vector_schema",value:p,target:[],ok:!1,severity:"warning"});else {let m=B(g,"SELECT COUNT(*) count FROM knowledge_chunks"),h=B(g,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),y=En(m,h),R=g.prepare(`
57
+ `).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.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:N(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(Ur())(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 fe(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 z(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Br(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Ln(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Uc(e){let t=Ln(Br(e.output)),n=Ln(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,i=!(!!e.blocked&&typeof e.block_reason=="string"&&e.block_reason.startsWith("DEVFLOW_"))&&(!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error"),a=!i&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:i,degraded:a}}function Wc(e){let t=Br(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=Ln(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Sr(e,t){return t===0?0:e/t}function xn(e,t){return e===0?1:t/e}async function Bc(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=ee(s,t),L(g,"nodes")?(o=z(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"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}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=ee(i,t);let f=L(g,"symbols_vec_rowids")?"symbols_vec_rowids":L(g,"symbol_sources")?"symbol_sources":null;f?(r=z(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=xn(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=ee(a,t);let p=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(m=>!L(g,m));if(p.length>0)n.push({key:"knowledge_vector_schema",value:p,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=z(g,`
58
+ SELECT COUNT(*) count
59
+ FROM knowledge_chunks c
60
+ JOIN knowledge_docs d ON d.id = c.doc_id
61
+ WHERE 1 = 1 ${h}
62
+ `),k=z(g,`
63
+ SELECT COUNT(*) count
64
+ FROM knowledge_vec_rowids v
65
+ JOIN knowledge_chunks c ON c.id = v.id
66
+ JOIN knowledge_docs d ON d.id = c.doc_id
67
+ WHERE 1 = 1 ${h}
68
+ `),C=xn(y,k),b=g.prepare(`
57
69
  SELECT d.source source, COUNT(c.id) chunks,
58
70
  SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
59
71
  FROM knowledge_docs d
60
72
  LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
61
73
  LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
74
+ WHERE 1 = 1 ${h}
62
75
  GROUP BY d.source ORDER BY d.source
63
- `).all().map(v=>{let b=Number(v.chunks),_=Number(v.vectors);return {source:v.source,chunks:b,vectors:_,coverage:En(b,_)}});n.push({key:"knowledge_chunks",value:m,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:h,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:y,target:">= 0.95",ok:y>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:R,target:"every source >= 0.95",ok:R.every(v=>v.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=ie(c,t),!W(g,"observations")||!W(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=B(g,"SELECT COUNT(*) count FROM observations"),p=B(g,`
76
+ `).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:xn(T,J)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:k,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:C,target:">= 0.95",ok:C>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:b,target:"every source >= 0.95",ok:b.every(_=>_.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=ee(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=fe(g,"observations"),p=f.has("quality_status")&&f.has("resolution_state"),h=z(g,`SELECT COUNT(*) count FROM observations ${p?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=z(g,`
64
77
  SELECT COUNT(DISTINCT e.source_id) count
65
78
  FROM embeddings e JOIN observations o ON o.id = e.source_id
66
79
  WHERE e.source_type = 'observation'
67
- `),m=Math.max(0,f-p);n.push({key:"observations",value:f,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:p,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:m,target:0,ok:m===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 l=(t.now??Date.now)(),u=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(u))try{let g=l-864e5;d=readFileSync$1(u,"utf8").split(`
68
- `).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[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:T(n),metrics:n}}function wc(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=(n.now??Date.now)(),c=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=ie(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[x,I]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let H=W(m,I)?B(m,`SELECT COUNT(*) count FROM ${I} WHERE created_at >= ?`,i):0;o.push({key:x,value:H,ok:!0,severity:"info"});}let h=W(m,"telemetry_failures")?B(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:h,target:0,ok:h===0,severity:c});let y=st(m,"sessions"),w=st(m,"tool_call_events"),R=st(m,"skill_executions"),v=["id","project_root","started_at","status"].every(x=>y.has(x));if(o.push({key:"telemetry_session_schema",value:v?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:v,severity:"error"}),v){let x=B(m,`
80
+ ${p?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
81
+ `),k=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:k,target:0,ok:k===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 l=(t.now??Date.now)(),u=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(u))try{let g=l-864e5;d=readFileSync$1(u,"utf8").split(`
82
+ `).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:N(n),metrics:n}}function qc(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=(n.now??Date.now)(),c=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=ee(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[$,M]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let W=L(m,M)?z(m,`SELECT COUNT(*) count FROM ${M} WHERE created_at >= ?`,i):0;o.push({key:$,value:W,ok:!0,severity:"info"});}let h=L(m,"telemetry_failures")?z(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:h,target:0,ok:h===0,severity:c});let y=fe(m,"sessions"),k=fe(m,"tool_call_events"),C=fe(m,"skill_executions"),v=["id","project_root","started_at","status"].every($=>y.has($));if(o.push({key:"telemetry_session_schema",value:v?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:v,severity:"error"}),v){let $=z(m,`
69
83
  SELECT COUNT(*) count FROM sessions
70
84
  WHERE project_root = ? AND started_at >= ?
71
- `,e,i);o.push({key:"session_start_evidence_24h",value:x,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let I=B(m,`
85
+ `,e,i);o.push({key:"session_start_evidence_24h",value:$,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let M=z(m,`
72
86
  SELECT COUNT(*) count FROM sessions
73
87
  WHERE project_root = ? AND status = 'running' AND started_at < ?
74
- `,e,(n.now??Date.now)()-$n);o.push({key:"stale_telemetry_sessions",value:I,target:0,ok:I===0,severity:"error"});let H=m.prepare(`
88
+ `,e,(n.now??Date.now)()-Mn);o.push({key:"stale_telemetry_sessions",value:M,target:0,ok:M===0,severity:"error"});let W=m.prepare(`
75
89
  SELECT status, COUNT(*) count
76
90
  FROM sessions
77
91
  WHERE project_root = ?
78
92
  GROUP BY status
79
- `).all(e),N={running:0,completed:0,failed:0};for(let J of H)J.status in N&&(N[J.status]=Number(J.count));let re=N.running+N.completed+N.failed,Pe=N.completed+N.failed;if(o.push({key:"project_session_closure_state",value:{total:re,...N,closed:Pe,closureRate:re===0?1:Pe/re},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),W(m,"devflow_session_closures")){let J=m.prepare(`
93
+ `).all(e),j={running:0,completed:0,failed:0};for(let I of W)I.status in j&&(j[I.status]=Number(I.count));let Z=j.running+j.completed+j.failed,ae=j.completed+j.failed;if(o.push({key:"project_session_closure_state",value:{total:Z,...j,closed:ae,closureRate:Z===0?1:ae/Z},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),L(m,"devflow_session_closures")){let I=m.prepare(`
80
94
  SELECT state, COUNT(*) count
81
95
  FROM devflow_session_closures
82
96
  WHERE project_root = ?
83
97
  GROUP BY state
84
- `).all(e),G={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Ke of J)Ke.state in G&&(G[Ke.state]=Number(Ke.count));let Z=B(m,`
98
+ `).all(e),K={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Me of I)Me.state in K&&(K[Me.state]=Number(Me.count));let le=z(m,`
85
99
  SELECT COUNT(*) count
86
100
  FROM devflow_session_closures
87
101
  WHERE project_root = ? AND state = 'closing' AND updated_at < ?
88
- `,e,a-$n);o.push({key:"durable_session_closure_state",value:{...G,staleClosing:Z},target:{active:0,closing:0,staleClosing:0},ok:G.active===0&&G.closing===0&&Z===0,severity:c});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:c});let ee=0;w.has("session_id")&&(ee=B(m,`
102
+ `,e,a-Mn);o.push({key:"durable_session_closure_state",value:{...K,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:K.active===0&&K.closing===0&&le===0,severity:c});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:c});let ye=0;k.has("session_id")&&(ye=z(m,`
89
103
  SELECT COUNT(*) count
90
104
  FROM tool_call_events event
91
105
  LEFT JOIN sessions session ON session.id = event.session_id
92
106
  WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
93
- `));let se=0;if(R.has("session_id")&&(se=B(m,`
107
+ `));let ce=0;if(C.has("session_id")&&(ce=z(m,`
94
108
  SELECT COUNT(*) count
95
109
  FROM skill_executions execution
96
110
  LEFT JOIN sessions session ON session.id = execution.session_id
97
111
  WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
98
- `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ee,skillExecutions:se},target:{toolCalls:0,skillExecutions:0},ok:ee===0&&se===0,severity:"error"}),["session_id","status","started_at"].every(J=>R.has(J))){let J=a-18e5,G=m.prepare(`
112
+ `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(I=>C.has(I))){let I=a-18e5,K=m.prepare(`
99
113
  SELECT
100
114
  COUNT(*) total,
101
115
  COALESCE(SUM(CASE WHEN execution.started_at < ? THEN 1 ELSE 0 END), 0) older_than_30m,
@@ -105,7 +119,7 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function ot(){let e=wn(process.cwd(
105
119
  WHERE session.project_root = ?
106
120
  AND execution.status = 'running'
107
121
  AND (execution.started_at < ? OR session.status <> 'running')
108
- `).get(J,e,J),Z=Number(G?.total??0);o.push({key:"stale_skill_executions",value:{total:Z,olderThan30m:Number(G?.older_than_30m??0),attachedToNonRunningSession:Number(G?.non_running_session??0)},target:{total:0},ok:Z===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!W(m,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let x=st(m,"devflow_work_items"),H=["project_root","state","lease_expires_at","created_at","completed_at"].filter(N=>!x.has(N));if(H.length>0)o.push({key:"work_queue_schema",value:{missingColumns:H,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let N=m.prepare(`
122
+ `).get(I,e,I),le=Number(K?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(K?.older_than_30m??0),attachedToNonRunningSession:Number(K?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!L(m,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let $=fe(m,"devflow_work_items"),W=["project_root","state","lease_expires_at","created_at","completed_at"].filter(j=>!$.has(j));if(W.length>0)o.push({key:"work_queue_schema",value:{missingColumns:W,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let j=m.prepare(`
109
123
  SELECT
110
124
  COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
111
125
  COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
@@ -117,50 +131,56 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function ot(){let e=wn(process.cwd(
117
131
  MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
118
132
  FROM devflow_work_items
119
133
  WHERE project_root = ?
120
- `).get(a,e),re=Number(N?.queue_depth??0),Pe=Number(N?.pending??0),ee=Number(N?.leased??0),se=Number(N?.failed??0),te=Number(N?.dead_letters??0),J=Number(N?.expired_leases??0),G=N?.oldest_pending_at==null?void 0:Number(N.oldest_pending_at),Z=N?.last_successful_drain_at==null?void 0:Number(N.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:re,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:Pe,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ee,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:se,target:0,ok:se===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:G===void 0?0:Math.max(0,a-G),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:te,target:0,ok:te===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:J,target:0,ok:J===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:Z??null,ok:!0,severity:"info"});}}let b=n.env?.DEVFLOW_STATE_DIR??join$1(r,".devflow","state",Nt(e)),j=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(x=>{let I=join$1(b,x),H=existsSync$1(I)?readdirSync(I).filter(N=>N.includes(".json")).length:0;return [x,H]})),Y=Object.values(j).reduce((x,I)=>x+I,0);if(o.push({key:"hook_spool_backlog",value:{total:Y,...j},target:{total:0},ok:Y===0,severity:c}),W(m,"tool_call_events")){let x=v&&w.has("session_id"),I=st(m,"tool_metrics"),H=w.has("event_id")&&I.has("tool_call_event_id")&&I.has("status"),N=[w.has("error")?"event.error":"NULL error",w.has("failure_category")?"event.failure_category":"NULL failure_category",w.has("output")?"event.output":"NULL output",H?"metric.status metric_status":"NULL metric_status"].join(", "),re=m.prepare(`
121
- SELECT ${N}
134
+ `).get(a,e),Z=Number(j?.queue_depth??0),ae=Number(j?.pending??0),ye=Number(j?.leased??0),ce=Number(j?.failed??0),ve=Number(j?.dead_letters??0),I=Number(j?.expired_leases??0),K=j?.oldest_pending_at==null?void 0:Number(j.oldest_pending_at),le=j?.last_successful_drain_at==null?void 0:Number(j.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:ae,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ye,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:K===void 0?0:Math.max(0,a-K),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ve,target:0,ok:ve===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:I,target:0,ok:I===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}let b=n.env?.DEVFLOW_STATE_DIR??join$1(r,".devflow","state",Mt(e)),T=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map($=>{let M=join$1(b,$),W=existsSync$1(M)?readdirSync(M).filter(j=>j.includes(".json")).length:0;return [$,W]})),J=Object.values(T).reduce(($,M)=>$+M,0);if(o.push({key:"hook_spool_backlog",value:{total:J,...T},target:{total:0},ok:J===0,severity:c}),L(m,"tool_call_events")){let $=v&&k.has("session_id"),M=fe(m,"tool_metrics"),W=k.has("event_id")&&M.has("tool_call_event_id")&&M.has("status"),j=[k.has("error")?"event.error":"NULL error",k.has("failure_category")?"event.failure_category":"NULL failure_category",k.has("output")?"event.output":"NULL output",k.has("blocked")?"event.blocked":"0 blocked",k.has("block_reason")?"event.block_reason":"NULL block_reason",$?"event_session.status session_status":"NULL session_status",W?"metric.status metric_status":"NULL metric_status"].join(", "),Z=m.prepare(`
135
+ SELECT ${j}
122
136
  FROM tool_call_events event
123
- ${H?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
124
- ${x?"JOIN sessions event_session ON event_session.id = event.session_id":""}
137
+ ${W?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
138
+ ${$?"JOIN sessions event_session ON event_session.id = event.session_id":""}
125
139
  WHERE event.timestamp >= ?
126
- ${x?"AND event_session.project_root = ?":""}
127
- `).all(...x?[i,e]:[i]),Pe=re.map(yc),ee=Pe.filter(te=>te.failed).length,se=Pe.filter(te=>te.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:re.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ee,target:0,ok:ee===0,severity:c}),o.push({key:"semantic_tool_degradations_24h",value:se,target:0,ok:se===0,severity:c}),o.push({key:"semantic_tool_failure_rate_24h",value:hr(ee,re.length),target:0,ok:ee===0,severity:c}),o.push({key:"semantic_tool_degradation_rate_24h",value:hr(se,re.length),target:0,ok:se===0,severity:c}),o.push({key:"semantic_tool_project_scope",value:x?"project":"global fallback; session identity unavailable",target:"project",ok:x,severity:"warning"}),w.has("failure_category")){let te={};for(let Z of re)typeof Z.failure_category!="string"||!Z.failure_category.trim()||(te[Z.failure_category]=(te[Z.failure_category]??0)+1);let J=Object.values(te).reduce((Z,Ke)=>Z+Ke,0),G=ee===0?1:J/ee;o.push({key:"failure_categories_24h",value:te,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:G,target:">= 0.80",ok:G>=.8,severity:c});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:c});}let oe=v&&["session_id","started_at","fallback_count","fallback_reasons"].every(x=>R.has(x)),D=0,F={};if(oe){let x=m.prepare(`
140
+ ${$?"AND event_session.project_root = ?":""}
141
+ `).all(...$?[i,e]:[i]),ae=Z.map(Uc),ye=ae.filter(I=>I.failed).length,ce=ae.filter((I,K)=>I.failed&&Z[K]?.session_status!=="completed").length,ve=ae.filter(I=>I.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:Z.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:c}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_failure_rate_24h",value:Sr(ye,Z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Sr(ve,Z.length),target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_project_scope",value:$?"project":"global fallback; session identity unavailable",target:"project",ok:$,severity:"warning"}),k.has("failure_category")){let I={};for(let ue of Z)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(I[ue.failure_category]=(I[ue.failure_category]??0)+1);let K=Z.filter((ue,Fs)=>ae[Fs]?.failed&&ue.session_status!=="completed"),le=K.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Me=K.length===0?1:le/K.length;o.push({key:"failure_categories_24h",value:I,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Me,target:">= 0.80",ok:Me>=.8,severity:c});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:c});}let ne=v&&["session_id","started_at","fallback_count","fallback_reasons"].every($=>C.has($)),D=0,U={};if(ne){let $=m.prepare(`
128
142
  SELECT execution.fallback_count, execution.fallback_reasons
129
143
  FROM skill_executions execution
130
144
  JOIN sessions session ON session.id = execution.session_id
131
145
  WHERE session.project_root = ? AND execution.started_at >= ?
132
- `).all(e,i);for(let I of x){D+=Number(I.fallback_count??0);for(let H of vc(I.fallback_reasons))F[H]=(F[H]??0)+1;}}let X=0;if(W(m,"devflow_hook_fallbacks")){let x=m.prepare(`
146
+ `).all(e,i);for(let M of $){D+=Number(M.fallback_count??0);for(let W of Wc(M.fallback_reasons))U[W]=(U[W]??0)+1;}}let X=0;if(L(m,"devflow_hook_fallbacks")){let $=m.prepare(`
133
147
  SELECT reason, COUNT(*) count
134
148
  FROM devflow_hook_fallbacks
135
149
  WHERE project_root = ? AND created_at >= ?
136
150
  GROUP BY reason ORDER BY reason
137
- `).all(e,i);for(let I of x){let H=Number(I.count);X+=H,F[`hook:${I.reason}`]=H;}}o.push({key:"skill_fallbacks_24h",value:D,target:0,ok:D===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:F,target:{},ok:Object.keys(F).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=ie(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:T(o),metrics:o}}function vr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Mr(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 Sc(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(([,u])=>!o[u]?.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 u=lstatSync(r),d=vr(r),g=u.isDirectory()&&!u.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(u){t.push({key:"key_directory",value:u.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[u,d,g]of s){if(o[d]?.trim()){t.push({key:`${u}_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:`${u}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let p=lstatSync(f),m=vr(f),h=readFileSync$1(f,"utf8").trim(),y=p.isFile()&&!p.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:m,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||m==="400"),severity:!y||h.length===0?"error":"warning"});}catch(p){t.push({key:`${u}_source`,value:p.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,l=0;if(existsSync$1(a))try{let u=(e.now??Date.now)()-qe;for(let d of readFileSync$1(a,"utf8").split(`
138
- `))if(d.trim())try{let g=JSON.parse(d),f=Mr(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.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:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:T(t),metrics:t}}function _c(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:T(t),metrics:t};let r;try{if(r=ie(o,e),!W(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:T(t),metrics:t};let s=r.prepare(`
151
+ `).all(e,i);for(let M of $){let W=Number(M.count);X+=W,U[`hook:${M.reason}`]=W;}}o.push({key:"skill_fallbacks_24h",value:D,target:0,ok:D===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:U,target:{},ok:Object.keys(U).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=ee(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:N(o),metrics:o}}function Er(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function qr(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 Kc(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(([,u])=>!o[u]?.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 u=lstatSync(r),d=Er(r),g=u.isDirectory()&&!u.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(u){t.push({key:"key_directory",value:u.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[u,d,g]of s){if(o[d]?.trim()){t.push({key:`${u}_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:`${u}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let p=lstatSync(f),m=Er(f),h=readFileSync$1(f,"utf8").trim(),y=p.isFile()&&!p.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:m,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||m==="400"),severity:!y||h.length===0?"error":"warning"});}catch(p){t.push({key:`${u}_source`,value:p.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,l=0;if(existsSync$1(a))try{let u=(e.now??Date.now)()-ze;for(let d of readFileSync$1(a,"utf8").split(`
152
+ `))if(d.trim())try{let g=JSON.parse(d),f=qr(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.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:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:N(t),metrics:t}}function Jc(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:N(t),metrics:t};let r;try{if(r=ee(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:N(t),metrics:t};let s=r.prepare(`
139
153
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
140
154
  FROM benchmark_reports
141
155
  ORDER BY created_at DESC
142
156
  LIMIT 1
143
- `).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:T(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(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(l)?Number((l/qe).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=bc,severity:l<0||!Number.isFinite(l)?"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:T(t),metrics:t}}function Pc(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 Ec(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 y of readdirSync(r))y.endsWith(".log")&&o.push(join$1(r,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-qe,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let w of readFileSync$1(y,"utf8").split(`
144
- `))if(w.trim())try{let R=JSON.parse(w),v=Mr(R.ts);v===null||typeof R.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(w){t.push({key:"hook_fallback_log_read",value:{path:y,error:w.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),l=0,u=0,d=null;if(existsSync$1(c)){let y;try{if(y=ie(c,e),W(y,"telemetry_events")){let w=y.prepare(`
157
+ `).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:N(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(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(l)?Number((l/ze).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=Fn,severity:l<0||!Number.isFinite(l)?"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:N(t),metrics:t}}function zc(e,t){let n=[],o=t.homePath??homedir$1(),r=getGlobalDevFlowDbPath(o);if(!existsSync$1(r))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let s;try{if(s=ee(r,t),!L(s,"benchmark_reports"))throw new Error("benchmark_reports table missing");let i=s.prepare(`
158
+ SELECT report_json, created_at
159
+ FROM benchmark_reports
160
+ WHERE suite_id = 'retrieval-quality' AND project_root = ?
161
+ ORDER BY created_at DESC
162
+ LIMIT 1
163
+ `).get(e);if(!i?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let a=JSON.parse(i.report_json),c=(t.now??Date.now)()-Number(i.created_at??0);n.push({key:"retrieval_quality_report",value:{status:a.qualityStatus,ageMs:c,diagnostics:a.diagnostics??[]},target:{status:"passed",maxAgeMs:Fn},ok:a.qualityStatus==="passed"&&c<=Fn,severity:a.qualityStatus==="failed"?"error":"warning"});for(let[l,u]of Object.entries(a.gates??{}))n.push({key:`retrieval_${l}`,value:a.metrics?.[l],target:a.thresholds?.[l],ok:u,severity:"error"});}catch(i){n.push({key:"retrieval_quality_read",value:i.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{s?.close();}return {name:"Retrieval quality",status:N(n),metrics:n}}function Vc(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 Gc(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 y of readdirSync(r))y.endsWith(".log")&&o.push(join$1(r,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ze,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let k of readFileSync$1(y,"utf8").split(`
164
+ `))if(k.trim())try{let C=JSON.parse(k),v=qr(C.ts);v===null||typeof C.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(k){t.push({key:"hook_fallback_log_read",value:{path:y,error:k.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),l=0,u=0,d=null;if(existsSync$1(c)){let y;try{if(y=ee(c,e),L(y,"telemetry_events")){let k=y.prepare(`
145
165
  SELECT COUNT(*) total,
146
166
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
147
167
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
148
168
  FROM telemetry_events
149
169
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
150
- `).get(s);l=Number(w?.total??0),u=Number(w?.failures??0),d=w?.average_duration==null?null:Math.round(Number(w.average_duration)*100)/100;}}catch(w){t.push({key:"hook_daemon_metrics_read",value:w.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=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(p*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 m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=Pc(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${yr}`,ok:y.bytes<=yr,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:T(t),metrics:t}}function _e(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Ne(e){return JSON.parse(readFileSync$1(e,"utf8"))}function U(e){return typeof e=="object"&&e!==null?e:null}function Ur(e,t){return Dc.has(e)&&!(t.tolerateControlSyntax&&Ac.has(e))}function dt(e,t={}){if(Buffer.byteLength(e)>Hr)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let d=e[u];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[u+1]===`
170
+ `).get(s);l=Number(k?.total??0),u=Number(k?.failures??0),d=k?.average_duration==null?null:Math.round(Number(k.average_duration)*100)/100;}}catch(k){t.push({key:"hook_daemon_metrics_read",value:k.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=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(p*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 m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=Vc(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${_r}`,ok:y.bytes<=_r,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:N(t),metrics:t}}function Re(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function je(e){return JSON.parse(readFileSync$1(e,"utf8"))}function B(e){return typeof e=="object"&&e!==null?e:null}function Vr(e,t){return Qc.has(e)&&!(t.tolerateControlSyntax&&Xc.has(e))}function mt(e,t={}){if(Buffer.byteLength(e)>zr)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let d=e[u];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[u+1]===`
151
171
  `){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
152
172
  `){u+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let g=e.slice(u,u+2);if(d==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
153
- `;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&xc.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
154
- `].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&Ur(d,t)})&&(a=true),{segments:n,malformed:a}}function $c(e){return dt(e).segments.flat().join(" ")}function Oc(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 Wr(e,t){return Oc(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 Nc(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]===`
173
+ `;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&el.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
174
+ `].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&Vr(d,t)})&&(a=true),{segments:n,malformed:a}}function tl(e){return mt(e).segments.flat().join(" ")}function nl(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 Gr(e,t){return nl(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 ol(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]===`
155
175
  `){o-=1;break}e[o]!==`
156
- `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Tc(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]!==`
176
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function rl(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]!==`
157
177
  `;)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]===`
158
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function fe(e,t,n="infer"){let o=t?$c(e):n==="node"?Nc(e):n==="python"?Tc(e):e;return [...new Set(o.match(Cc)??[])]}function jc(e){return dt(e).segments.flat()}function me(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),l=Se(a,i)?a:Se(c,i)?c:dirname(i);return {path:i,containmentRoot:l,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 Ic(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>Hr||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function Ln(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Ic(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Dt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:me(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Oe(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=Lc(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:me(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:me(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:me(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Mc(e){let t=[e];extname(e)===""&&t.push(...kr.map(n=>`${e}${n}`),...kr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Lc(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 Mc(o)??o}function Fc(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]!==`
178
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?tl(e):n==="node"?ol(e):n==="python"?rl(e):e;return [...new Set(o.match(Yc)??[])]}function sl(e){return mt(e).segments.flat()}function pe(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),l=Pe(a,i)?a:Pe(c,i)?c:dirname(i);return {path:i,containmentRoot:l,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 il(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>zr||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function qn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=il(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:xt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:pe(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Te(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=cl(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:pe(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:pe(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:pe(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function al(e){let t=[e];extname(e)===""&&t.push(...Pr.map(n=>`${e}${n}`),...Pr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function cl(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 al(o)??o}function ll(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]!==`
159
179
  `;)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 l=e[o];if(l===s){c=true,o+=1;break}if(l==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(l===`
160
- `||l==="\r"){a=false;break}i+=l,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 Hc(e,t,n,o=true){let r=Fc(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 m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"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 p=-1;for(let m=d+1;m<Math.min(c.length,d+32)&&c[m].value!==";";m+=1)if(c[m].value==="from"){p=m;break}p>=0?a(c[p+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=Ln(d,o);g.reference&&l.push(g.reference),g.inlineContent&&u.push(g.inlineContent),i||=g.malformed;}return {references:l,inlineContents:u,malformed:i}}function Uc(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]!==`
180
+ `||l==="\r"){a=false;break}i+=l,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 ul(e,t,n,o=true){let r=ll(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 m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"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 p=-1;for(let m=d+1;m<Math.min(c.length,d+32)&&c[m].value!==";";m+=1)if(c[m].value==="from"){p=m;break}p>=0?a(c[p+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=qn(d,o);g.reference&&l.push(g.reference),g.inlineContent&&u.push(g.inlineContent),i||=g.malformed;}return {references:l,inlineContents:u,malformed:i}}function dl(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]!==`
161
181
  `;)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,l=e.slice(o,o+3)===c.repeat(3),u=l?3:1,d=o;for(let f=0;f<u;f+=1)t[d+f]=" ";d+=u;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+u)===c.repeat(u)){for(let f=0;f<u;f+=1)t[d+f]=" ";d+=u,g=true;break}if(!l&&(e[d]===`
162
182
  `||e[d]==="\r"))break;e[d]!==`
163
- `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function wr(e,t){let n=t.split(".");if(n.length>Mn)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 Wc(e,t,n){let o=Uc(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=me(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),p=wr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&wr(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 v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),w=join$1(y,"__init__.py"),R=false;try{R=statSync$1(w).isFile();}catch{}if(R){a(w),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Br(e,t,n,o,r=true){return n==="node"?Hc(e,t,o,r):n==="python"?Wc(e,t,o):{references:[],inlineContents:[],malformed:false}}function br(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=xt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>me(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=Ln(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=me(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function qr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Oe(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 Dt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function it(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Vc(e,t,n){let o=[],r=[],s=false,i=(u,d)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=Oe(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(zc.has(u))return a();if(Kc.has(u)){l=true,c+=1;continue}let d=Sr.has(u)?"cjs":_r.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=it(u,Sr),f=it(u,_r),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Pr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Dt(h))}let m=it(u,Pr);if(m!==null)return a(s||Dt(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Dt(u.slice(2)));if(Er.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(it(u,Er)!==null){c+=1;continue}if(qc.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Zc(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:Oe(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?xt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Jc.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:Oe(i)}}return {tokens:[],malformed:true}}function Qc(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:Oe(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:Oe(r)};if(Yc.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Cr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(it(r,Cr)!==null){o+=1;continue}if(Gc.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Cn(e,t){let n=me(e,t,true);if(!n)return null;let o=_e(n.path),r=_e(t.project);return !o||!r||!Se(r,o)?null:o}function tl(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(qr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=dt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?Cn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Cn(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=Cn(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 xt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Fr)return {tokens:[],malformed:true};let r=dt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Kr(l,t,n,o);s.push(...u.tokens),i.push(...u.artifacts??[]),a.push(...u.inlineContents??[]),c||=u.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function Kr(e,t,n,o){let r=0;for(;qr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Xc.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Fr)return {tokens:i,malformed:true};let m=tl(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=Kr(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Ur(l,o),d=c&&!el.has(l);if(u||d)return {tokens:i,malformed:true};let g=Oe(s);i.push(s);let f=l;if(!Bc.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?Vc(e,r+1,n):["bash","sh","zsh"].includes(f)?Zc(e,r+1,a,n,o):Qc(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function zr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:_e(t.slice(0,o))}function nl(e,t){let n=new Map;for(let o of t)for(let r of jc(o)){let s=zr(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 ol(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function rl(e){return e.slice(e.lastIndexOf("@")+1)}function Rr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=_e(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function sl(e,t,n){let o=rl(e),r=U(t.extraKnownMarketplaces),s=U(r?.[o]);if(s){let i=U(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Rr(i.path):null}}try{let i=U(Ne(n)),a=U(i?.[o]);if(a){let c=U(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Rr(c.path):null}}}catch{}return {configured:false,root:null}}function Dr(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 il(e,t){let n=U(e.entry),o=U(t.entry),r=Dr(n),s=Dr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?$t(n.version):null,a=typeof o?.version=="string"?$t(o.version):null;if(i&&a){let c=Vr(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function al(e,t){try{let n=U(Ne(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=U(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(il)[0],i=U(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:_e(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function $t(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 Vr(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 cl(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),l=a.name;try{let u=U(Ne(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=$t(a.version),u=$t(c.version);if(l&&u){let d=Vr(u,l);if(d!==0)return d}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?_e(i[0].path):null}function ll(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>_e(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.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=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let v of l)if(existsSync$1(v))try{let b=U(Ne(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return lt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>nl(v.path,v.commands)),m=[...i.reduce((v,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return v;for(let[j,Y]of Object.entries(_))ol(j)&&typeof Y=="boolean"&&v.set(j,Y);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=al(v,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let j=i.map(oe=>sl(v,oe.settings,r)).filter(oe=>oe.configured),Y=j[j.length-1];Y?_=Y.root:_=cl(v,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let w=[...h.reduce((v,b)=>{let _=v.get(b.root);return _?(v.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],R=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:w,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(w.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function ul(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 lt(e,t){if(Array.isArray(e)){for(let n of e)lt(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):lt(o,t);}function Rn(e){return [...e.matchAll(Rc)].map(t=>t[1])}function dl(e){let t=new Map,n=dt(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 gl(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 fl(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 Dn(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 Nn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Rt)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>Rt)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Rt+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>Rt)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 Tn(e,t){return `${e} (${t})`}function ml(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>Mn){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(u)){Se(d,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Se(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=br(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of fe(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Lr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Nn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Tn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?Wr(l,d):c.parserKind,f=g==="shell";for(let p of fe(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=br(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of fe(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=Br(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of fe(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function pl(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=ul(r),c=0,l=(f,p=false,m=r,h="infer",y=e,w=0)=>{if(w>Mn){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Se(R,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Se(R,b)){o.escapedArtifacts.push(v);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:w}));},u=(f,p,m,h=0)=>{for(let y of Rn(f)){let w=Dn(r,y);if(!w)continue;let R=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(w,true,r,R?.parserKind??"infer",R?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let w=y.nodeResolutionKind?Ln(y,!h):{reference:me(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(w.malformed){o.malformedCommands.push(y.value);continue}if(w.inlineContent)for(let R of fe(w.inlineContent.content,false,"node"))o.findings.push({artifact:w.inlineContent.source,endpoint:R});w.reference&&l(w.reference.path,true,h?r:w.reference.containmentRoot,w.reference.parserKind,w.reference.cwd??p,m);}},g=f=>{for(let m of fe(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=xt(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=zr(m),y=(p.artifacts??[]).find(w=>w.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.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"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Se(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Nn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Tn(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let w=JSON.parse(y.content),R=[];lt(w,R);for(let v of R)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Lr){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Nn(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(Tn(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?Wr(p,h):f.parserKind,w=y==="shell";for(let b of fe(h,w,y))o.findings.push({artifact:p,endpoint:b});if(w){let b=dl(h),_=xt(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});gl(h)&&o.malformedCommands.push(p),u(b,_,dirname(p),f.depth+1),d(_,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Br(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?fl(p):b.malformed)&&o.malformedCommands.push(p);for(let _ of b.inlineContents)for(let j of fe(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:j});for(let _ of b.references){let j=relative(r,resolve(_.path));!j.startsWith(`..${sep}`)&&j.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of Rn(h)){let j=Dn(r,_);j&&l(j,true,r,y,f.cwd,f.depth+1);}}else for(let b of Rn(h)){let _=Dn(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let R=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),R.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function hl(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=U(Ne(t)),r=U(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=U(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=_e(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Ar(e){try{let t=U(Ne(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function yl(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=hl(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 l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(l)?l:u;try{let w=U(Ne(d)),R=U(w?.hooks),v=[];lt(R?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Ar(i),f=Ar(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(w=>w!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let w=readFileSync$1(h,"utf8");(!existsSync$1(y)||!w.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 vl(e,t){let n=ll(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let D of n.configCommands){o.configsInspected.push(D.path);for(let F of D.commands){o.commandsInspected.push({configPath:D.path,command:F});for(let X of fe(F,true))o.findings.push({artifact:D.path,endpoint:X});}}ml(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(F=>F.commands?.includes(D))),o);for(let D of n.targets)pl(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,F,X)=>X.findIndex(x=>x.configPath===D.configPath&&x.command===D.command)===F),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((D,F,X)=>X.findIndex(x=>x.artifact===D.artifact&&x.endpoint===D.endpoint)===F),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=yl(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,w=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),R=n.targets.map(D=>D.root).find(D=>existsSync$1(join$1(D,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:R?{root:R,version:null}:Ee(w,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,_=b?Ve(w,b):[],j=_.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),Y=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(D=>D.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.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:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.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"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:j,target:[],ok:true,severity:"info"}],oe=v.version??h.versionRecords.find(D=>D.root===b)?.packageVersion;return oe&&Y.push({key:"active_plugin_version",value:oe,ok:true,severity:"info"}),{name:"Legacy paths",status:T(Y),metrics:Y}}function kl(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 Tt(e){let t=kl(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)/qe: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 wl(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=ie(i,t);let l=(W(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:B(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:T(n),metrics:n}}function bl(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:T(n),metrics:n};let r;try{if(r=ie(o,t),!W(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*qe,i=r.prepare(`
183
+ `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Rr(e,t){let n=t.split(".");if(n.length>Bn)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 gl(e,t,n){let o=dl(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=pe(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),p=Rr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&Rr(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 v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),k=join$1(y,"__init__.py"),C=false;try{C=statSync$1(k).isFile();}catch{}if(C){a(k),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Yr(e,t,n,o,r=true){return n==="node"?ul(e,t,o,r):n==="python"?gl(e,t,o):{references:[],inlineContents:[],malformed:false}}function Cr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Nt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>pe(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=qn(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=pe(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function Zr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Te(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 xt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function lt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function yl(e,t,n){let o=[],r=[],s=false,i=(u,d)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=Te(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(hl.has(u))return a();if(pl.has(u)){l=true,c+=1;continue}let d=Dr.has(u)?"cjs":Ar.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=lt(u,Dr),f=lt(u,Ar),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if($r.has(u)){let h=e[c+1];return a(h===void 0?true:s||xt(h))}let m=lt(u,$r);if(m!==null)return a(s||xt(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||xt(u.slice(2)));if(xr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(lt(u,xr)!==null){c+=1;continue}if(ml.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function bl(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:Te(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Nt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(vl.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:Te(i)}}return {tokens:[],malformed:true}}function Sl(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:Te(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:Te(r)};if(wl.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Or.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(lt(r,Or)!==null){o+=1;continue}if(kl.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function On(e,t){let n=pe(e,t,true);if(!n)return null;let o=Re(n.path),r=Re(t.project);return !o||!r||!Pe(r,o)?null:o}function Pl(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(Zr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=mt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?On(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=On(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=On(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 Nt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Jr)return {tokens:[],malformed:true};let r=mt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Qr(l,t,n,o);s.push(...u.tokens),i.push(...u.artifacts??[]),a.push(...u.inlineContents??[]),c||=u.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function Qr(e,t,n,o){let r=0;for(;Zr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;_l.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Jr)return {tokens:i,malformed:true};let m=Pl(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=Qr(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Vr(l,o),d=c&&!El.has(l);if(u||d)return {tokens:i,malformed:true};let g=Te(s);i.push(s);let f=l;if(!fl.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?yl(e,r+1,n):["bash","sh","zsh"].includes(f)?bl(e,r+1,a,n,o):Sl(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function Xr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Re(t.slice(0,o))}function Rl(e,t){let n=new Map;for(let o of t)for(let r of sl(o)){let s=Xr(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 Cl(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Dl(e){return e.slice(e.lastIndexOf("@")+1)}function Nr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Re(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Al(e,t,n){let o=Dl(e),r=B(t.extraKnownMarketplaces),s=B(r?.[o]);if(s){let i=B(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Nr(i.path):null}}try{let i=B(je(n)),a=B(i?.[o]);if(a){let c=B(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Nr(c.path):null}}}catch{}return {configured:false,root:null}}function Tr(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 $l(e,t){let n=B(e.entry),o=B(t.entry),r=Tr(n),s=Tr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Tt(n.version):null,a=typeof o?.version=="string"?Tt(o.version):null;if(i&&a){let c=es(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function xl(e,t){try{let n=B(je(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=B(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($l)[0],i=B(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Re(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Tt(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 es(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 Ol(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),l=a.name;try{let u=B(je(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Tt(a.version),u=Tt(c.version);if(l&&u){let d=es(u,l);if(d!==0)return d}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Re(i[0].path):null}function Nl(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>Re(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.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=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let v of l)if(existsSync$1(v))try{let b=B(je(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return gt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>Rl(v.path,v.commands)),m=[...i.reduce((v,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return v;for(let[T,J]of Object.entries(_))Cl(T)&&typeof J=="boolean"&&v.set(T,J);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=xl(v,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let T=i.map(ne=>Al(v,ne.settings,r)).filter(ne=>ne.configured),J=T[T.length-1];J?_=J.root:_=Ol(v,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let k=[...h.reduce((v,b)=>{let _=v.get(b.root);return _?(v.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],C=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:k,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:C.length>0?`${C.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(k.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Tl(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 gt(e,t){if(Array.isArray(e)){for(let n of e)gt(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):gt(o,t);}function Nn(e){return [...e.matchAll(Zc)].map(t=>t[1])}function jl(e){let t=new Map,n=mt(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 Il(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 Ml(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 Tn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Pe(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Hn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>$t)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>$t)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,$t+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>$t)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 Un(e,t){return `${e} (${t})`}function Ll(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>Bn){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(u)){Pe(d,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Pe(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Cr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Kr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Hn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Un(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?Gr(l,d):c.parserKind,f=g==="shell";for(let p of me(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=Cr(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=Yr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function Fl(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Tl(r),c=0,l=(f,p=false,m=r,h="infer",y=e,k=0)=>{if(k>Bn){o.traversalLimitRoots.push(r);return}let C=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Pe(C,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Pe(C,b)){o.escapedArtifacts.push(v);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:k}));},u=(f,p,m,h=0)=>{for(let y of Nn(f)){let k=Tn(r,y);if(!k)continue;let C=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(k,true,r,C?.parserKind??"infer",C?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let k=y.nodeResolutionKind?qn(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(k.malformed){o.malformedCommands.push(y.value);continue}if(k.inlineContent)for(let C of me(k.inlineContent.content,false,"node"))o.findings.push({artifact:k.inlineContent.source,endpoint:C});k.reference&&l(k.reference.path,true,h?r:k.reference.containmentRoot,k.reference.parserKind,k.reference.cwd??p,m);}},g=f=>{for(let m of me(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=Nt(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=Xr(m),y=(p.artifacts??[]).find(k=>k.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.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"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Hn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Un(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let k=JSON.parse(y.content),C=[];gt(k,C);for(let v of C)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Kr){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Hn(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(Un(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?Gr(p,h):f.parserKind,k=y==="shell";for(let b of me(h,k,y))o.findings.push({artifact:p,endpoint:b});if(k){let b=jl(h),_=Nt(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});Il(h)&&o.malformedCommands.push(p),u(b,_,dirname(p),f.depth+1),d(_,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Yr(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?Ml(p):b.malformed)&&o.malformedCommands.push(p);for(let _ of b.inlineContents)for(let T of me(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of b.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of Nn(h)){let T=Tn(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of Nn(h)){let _=Tn(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let C=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(C).replace(/\.js$/,"");a&&(C.startsWith("hooks/")||C.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),C.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function Hl(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=B(je(t)),r=B(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=B(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Re(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function jr(e){try{let t=B(je(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ul(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Hl(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 l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(l)?l:u;try{let k=B(je(d)),C=B(k?.hooks),v=[];gt(C?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=jr(i),f=jr(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(k=>k!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let k=readFileSync$1(h,"utf8");(!existsSync$1(y)||!k.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 Wl(e,t){let n=Nl(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let D of n.configCommands){o.configsInspected.push(D.path);for(let U of D.commands){o.commandsInspected.push({configPath:D.path,command:U});for(let X of me(U,true))o.findings.push({artifact:D.path,endpoint:X});}}Ll(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(U=>U.commands?.includes(D))),o);for(let D of n.targets)Fl(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,U,X)=>X.findIndex($=>$.configPath===D.configPath&&$.command===D.command)===U),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((D,U,X)=>X.findIndex($=>$.artifact===D.artifact&&$.endpoint===D.endpoint)===U),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Ul(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,k=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),C=n.targets.map(D=>D.root).find(D=>existsSync$1(join$1(D,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:C?{root:C,version:null}:Ce(k,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,_=b?Ge(k,b):[],T=_.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(D=>D.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.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:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.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"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],ne=v.version??h.versionRecords.find(D=>D.root===b)?.packageVersion;return ne&&J.push({key:"active_plugin_version",value:ne,ok:true,severity:"info"}),{name:"Legacy paths",status:N(J),metrics:J}}function Bl(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 Lt(e){let t=Bl(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)/ze: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 ql(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=ee(i,t);let l=(L(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:z(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:N(n),metrics:n}}function Kl(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:N(n),metrics:n};let r;try{if(r=ee(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*ze,i=r.prepare(`
164
184
  SELECT source, COUNT(*) count FROM memories
165
185
  WHERE created_at >= ? GROUP BY source ORDER BY source
166
186
  `).all(s),a=r.prepare(`
@@ -168,11 +188,24 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function ot(){let e=wn(process.cwd(
168
188
  SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
169
189
  SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
170
190
  FROM memories WHERE status = 'active'
171
- `).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:T(n),metrics:n}}function Sl(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:T(n),metrics:n};let r;try{if(r=ie(o,t),!W(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(u=>Number(u.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(),l=/tokenize\s*=\s*['\"]?trigram/i.test(c?.sql??"");n.push({key:"knowledge_fts_tokenizer",value:l?"trigram":"missing/non-trigram",target:"trigram",ok:l,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:T(n),metrics:n}}function _l(e){let{manifest:t,metrics:n}=Tt(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:T(n),metrics:n}}function Pl(e){let{manifest:t,metrics:n}=Tt(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:T(n),metrics:n}}function El(e){let{manifest:t,metrics:n}=Tt(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:T(n),metrics:n}}async function Cl(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 Rl(e){let{manifest:t,metrics:n}=Tt(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??Cl)(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:T(n),metrics:n}}async function Fn(e={},t={}){let n=e.project??process.cwd(),o=xn(n),r=_l(t),s=await cc(o.path,t);r.metrics.push(...s.metrics),r.status=T(r.metrics);let i=[uc(n,t),hc(o.path,t),vl(o.path,t),kc(o.path,t),wc(o.path,!!e.strict,t),wl(o.path,t),bl(o.path,t),Sl(o.path,t),r,Pl(t),_c(t),El(t),Sc(t),await Rl(t),Ec(t)],a=e.strict&&i.some(c=>c.status!=="green")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function Dl(e,t={}){return e===void 0?Gr():Fn(e,t)}function xr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Jr(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: ${xr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${xr(s.value)}${i}`);}}return t.join(`
172
- `)}async function Al(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await Fn(e,n);return t.stdout(e.json?JSON.stringify(o):Jr(o)),o.exitCode}async function jt(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function Gr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await jt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.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 p=await rt(),m=0;return a.fileCount>0&&(m+=25),a.nodeCount>0&&(m+=15),c.nodes.length>0&&(m+=20),u&&(m+=15),g>0&&(m+=10),l>0&&(m+=5),p.running&&(m+=10),f.total>0&&(m+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:p.running},toolCalls:f,readyScore:m}}async function xl(){let{data:e}=await jt(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 $l(){let{data:e}=await jt(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 Ol(e){let{data:t}=await jt(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 Nl(){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 Ct,dc,$n,pc,qe,bc,yr,Cc,Rc,Lr,Rt,Mn,Fr,Hr,Dc,Ac,xc,kr,Bc,Sr,_r,Pr,Er,qc,Kc,zc,Jc,Gc,Cr,Yc,Xc,el,Zr=A(()=>{Le();we();pn();dc={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},$n=3600*1e3;pc=new Set(["pending","committed","expired"]);qe=1440*60*1e3,bc=30*qe,yr=60*1024*1024;Cc=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Rc=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Lr=64,Rt=1024*1024,Mn=8,Fr=8,Hr=64*1024;Dc=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Ac=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),xc=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;kr=[".cjs",".js",".mjs",".ts",".tsx"];Bc=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Sr=new Set(["-r","--require"]),_r=new Set(["--experimental-loader","--import","--loader"]),Pr=new Set(["-e","--eval","-p","--print"]),Er=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),qc=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Kc=new Set(["--check","-c"]),zc=new Set(["--help","--version","-h","-v"]);Jc=new Set(["-e","-eu","-o","-u","-ue"]),Gc=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Cr=new Set(["-W","-X","--check-hash-based-pycs"]),Yc=new Set(["--help","--version","-h","-V"]);Xc=new Set(["builtin","command","env","exec","nohup","timeout"]),el=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Qr={};$(Qr,{runMemoryMaintainCommand:()=>Ml});function Il(e){if(!e)return;let t=e.split(",").map(o=>o.trim()).filter(Boolean),n=t.filter(o=>!MEMORY_MAINTENANCE_ACTIONS.includes(o));if(n.length>0)throw new Error(`Unknown memory maintenance action(s): ${n.join(", ")}`);return [...new Set(t)]}async function Ml(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Il(e.actions),apply:e.apply===true,dryRun:e.apply!==true,batchSize:e.batchSize});if(e.json)return JSON.stringify(t,null,2);let{before:n,after:o,changes:r}=t;return [`Memory maintenance: ${t.mode}`,`Pending events: ${n.pendingEvents.count} -> ${o.pendingEvents.count}`,`Eligible observation vectors: ${n.observationVectors.coverage.toFixed(3)} -> ${o.observationVectors.coverage.toFixed(3)}`,`Duplicate groups: ${n.duplicates.groups} -> ${o.duplicates.groups}`,`Changes: events=${r.duplicateEventsDeleted}, low-value=${r.lowValueEventsDiscarded}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
173
- `)}var Xr=A(()=>{});var es={};$(es,{generateToken:()=>Hl});async function Hl(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 ts=A(()=>{});var Hn={};$(Hn,{reportBenchmarkCommand:()=>Kl,runBenchmarkCommand:()=>ql});async function ql(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}
191
+ `).get();if(n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),L(r,"retrieval_access_log")){let c=r.prepare(`
192
+ SELECT access_type, COUNT(*) count
193
+ FROM retrieval_access_log
194
+ GROUP BY access_type
195
+ `).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected/exposed are distinct from adopted",ok:!0,severity:"info"});}if(L(r,"observations"))if(!fe(r,"observations").has("evidence_status"))n.push({key:"explicit_memory_evidence_schema",value:"evidence_status missing",target:"memory schema v8+",ok:!1,severity:"error"});else {let l=r.prepare(`
196
+ SELECT
197
+ COUNT(*) total,
198
+ SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
199
+ FROM observations
200
+ WHERE source = 'explicit_intent' AND quality_status = 'accepted'
201
+ `).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===u,severity:"warning"});}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:N(n),metrics:n}}function Jl(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:N(n),metrics:n};let r;try{if(r=ee(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 i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(g=>Number(g.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),d=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:d?"trigram":"missing/non-trigram",target:"trigram",ok:d,severity:"warning"}),L(r,"knowledge_source_readiness")){let g=r.prepare(`
202
+ SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
203
+ FROM knowledge_source_readiness ORDER BY source
204
+ `).all(),f=g.filter(m=>Number(m.documents??0)>0||Number(m.chunks??0)>0),p=f.length>0?Math.min(...f.map(m=>Number(m.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(m=>m.status==="ready"&&Number(m.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:p,target:">= 0.95",ok:f.length>0&&p>=.95,severity:"error"});}}}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:N(n),metrics:n}}function zl(e){let{manifest:t,metrics:n}=Lt(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:N(n),metrics:n}}function Vl(e){let{manifest:t,metrics:n}=Lt(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:N(n),metrics:n}}function Gl(e){let{manifest:t,metrics:n}=Lt(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:N(n),metrics:n}}async function Yl(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 Zl(e){let{manifest:t,metrics:n}=Lt(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 r=readRuntimeEndpointState(e.homePath??homedir$1());if((!r||r.status==="stopped")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:N(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/health`;try{let a=await(e.httpGet??Yl)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:N(n),metrics:n}}async function Kn(e={},t={}){let n=e.project??process.cwd(),o=In(n),r=zl(t),s=await Oc(o.path,t);r.metrics.push(...s.metrics),r.status=N(r.metrics);let i=[Tc(n,t),Hc(o.path,t),Wl(o.path,t),await Bc(o.path,t),qc(o.path,!!e.strict,t),ql(o.path,t),Kl(o.path,t),Jl(o.path,t),r,Vl(t),Jc(t),zc(o.path,t),Gl(t),Kc(t),await Zl(t),Gc(t)],a=i.some(c=>c.status==="red"||e.strict&&c.status==="yellow")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function Ql(e,t={}){return e===void 0?ns():Kn(e,t)}function Ir(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ts(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: ${Ir(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ir(s.value)}${i}`);}}return t.join(`
205
+ `)}async function Xl(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await Kn(e,n);return t.stdout(e.json?JSON.stringify(o):ts(o)),o.exitCode}async function Ft(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function ns(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Ft(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.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 p=await ct(),m=0;return a.fileCount>0&&(m+=25),a.nodeCount>0&&(m+=15),c.nodes.length>0&&(m+=20),u&&(m+=15),g>0&&(m+=10),l>0&&(m+=5),p.running&&(m+=10),f.total>0&&(m+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:p.running},toolCalls:f,readyScore:m}}async function eu(){let{data:e}=await Ft(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 tu(){let{data:e}=await Ft(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 nu(e){let{data:t}=await Ft(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 ou(){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 At,jc,Mn,Fc,ze,Fn,_r,Yc,Zc,Kr,$t,Bn,Jr,zr,Qc,Xc,el,Pr,fl,Dr,Ar,$r,xr,ml,pl,hl,vl,kl,Or,wl,_l,El,rs=A(()=>{Ue();_e();bn();jc={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Mn=3600*1e3;Fc=new Set(["pending","committed","expired"]);ze=1440*60*1e3,Fn=30*ze,_r=60*1024*1024;Yc=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Zc=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Kr=64,$t=1024*1024,Bn=8,Jr=8,zr=64*1024;Qc=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Xc=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),el=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Pr=[".cjs",".js",".mjs",".ts",".tsx"];fl=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Dr=new Set(["-r","--require"]),Ar=new Set(["--experimental-loader","--import","--loader"]),$r=new Set(["-e","--eval","-p","--print"]),xr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),ml=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),pl=new Set(["--check","-c"]),hl=new Set(["--help","--version","-h","-v"]);vl=new Set(["-e","-eu","-o","-u","-ue"]),kl=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Or=new Set(["-W","-X","--check-hash-based-pycs"]),wl=new Set(["--help","--version","-h","-V"]);_l=new Set(["builtin","command","env","exec","nohup","timeout"]),El=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ss={};x(ss,{runMemoryMaintainCommand:()=>au});function iu(e){if(!e)return;let t=e.split(",").map(o=>o.trim()).filter(Boolean),n=t.filter(o=>!MEMORY_MAINTENANCE_ACTIONS.includes(o));if(n.length>0)throw new Error(`Unknown memory maintenance action(s): ${n.join(", ")}`);return [...new Set(t)]}async function au(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:iu(e.actions),apply:e.apply===true,dryRun:e.apply!==true,batchSize:e.batchSize});if(e.json)return JSON.stringify(t,null,2);let{before:n,after:o,changes:r}=t;return [`Memory maintenance: ${t.mode}`,`Pending events: ${n.pendingEvents.count} -> ${o.pendingEvents.count}`,`Eligible observation vectors: ${n.observationVectors.coverage.toFixed(3)} -> ${o.observationVectors.coverage.toFixed(3)}`,`Duplicate groups: ${n.duplicates.groups} -> ${o.duplicates.groups}`,`Changes: events=${r.duplicateEventsDeleted}, low-value=${r.lowValueEventsDiscarded}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
206
+ `)}var is=A(()=>{});var as={};x(as,{generateToken:()=>uu});async function uu(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 cs=A(()=>{});var Jn={};x(Jn,{reportBenchmarkCommand:()=>pu,runBenchmarkCommand:()=>mu});async function mu(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}
174
207
 
175
- Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Kl(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=zl(o,n);return r==="markdown"?`${s}
208
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function pu(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=hu(o,n);return r==="markdown"?`${s}
176
209
  ## Change From Prior Baseline
177
210
 
178
211
  ${i.map(a=>`- ${a}`).join(`
@@ -181,20 +214,20 @@ ${i.map(a=>`- ${a}`).join(`
181
214
 
182
215
  Change from ${o.runId}:
183
216
  ${i.map(a=>`- ${a}`).join(`
184
- `)}`}function zl(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [It("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),It("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),It("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),It("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function It(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 Un=A(()=>{});var ss={};$(ss,{runReview:()=>Vl});async function Vl(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[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(u=>` ${S.red("\u25CF")} ${u}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${S.yellow("\u25CB")} ${u}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${S.green("\u25CB")} ${u}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
185
- `)}var is=A(()=>{});var as={};$(as,{startAll:()=>Gl});async function Jl(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 Gl(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Sn({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await Jl(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(`
186
- Shutting down...`)),await ot(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var cs=A(()=>{we();});var us={};$(us,{stopAll:()=>Yl});async function Yl(){let e=await ot();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var ds=A(()=>{we();});var fs={};$(fs,{showStatus:()=>nu});function tu(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 nu(){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 rt(),t=e.port??_t;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=homedir$1(),o=Ee(n),r=o.root?Ve(n,o.root):[];o.root?console.log(`Plugin: ${S.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?S.green("\u2713"):S.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${S.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],...tu(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var ms=A(()=>{we();Le();});var ps={};$(ps,{setupCommand:()=>cu});function iu(){try{return yt()}catch{return}}function au(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(S.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(S.yellow(` ! ${e.artifact}: ${t}`)):console.log(S.green(` + ${e.artifact}: ${t}`));}async function cu(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),e.skipMcp||s.push(r.mcp.project(n,{command:"devflow-mcp",args:["--mode","stdio"]})),!e.skipPlugin){let l=iu();s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:l?join$1(l,"skills"):void 0}));}for(let l of s)au(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(S.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(S.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(S.green(`Setup complete for ${r.id}.`)),console.log(S.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var hs=A(()=>{Le();});var ys={};$(ys,{pluginListCommand:()=>uu});var uu,vs=A(()=>{vt();uu=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Fe();if(e.installed){let n=lo();if(n.length===0){console.log("No plugins installed."),console.log(`
217
+ `)}`}function hu(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Ht("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Ht("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Ht("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Ht("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Ht(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 zn=A(()=>{});var gs={};x(gs,{runReview:()=>yu});async function yu(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[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(u=>` ${S.red("\u25CF")} ${u}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${S.yellow("\u25CB")} ${u}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${S.green("\u25CB")} ${u}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
218
+ `)}var fs=A(()=>{});var ms={};x(ms,{startAll:()=>ku});async function vu(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 ku(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Dn({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await vu(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(`
219
+ Shutting down...`)),await at(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var ps=A(()=>{_e();});var ys={};x(ys,{stopAll:()=>wu});async function wu(){let e=await at();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var vs=A(()=>{_e();});var ws={};x(ws,{showStatus:()=>Ru});function Pu(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 Ru(){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 ct(),t=e.port??Cn;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=homedir$1(),o=Ce(n),r=o.root?Ge(n,o.root):[];o.root?console.log(`Plugin: ${S.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?S.green("\u2713"):S.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${S.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],...Pu(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var bs=A(()=>{_e();Ue();});var Ss={};x(Ss,{setupCommand:()=>Ou});function $u(){try{return wt()}catch{return}}function xu(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(S.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(S.yellow(` ! ${e.artifact}: ${t}`)):console.log(S.green(` + ${e.artifact}: ${t}`));}async function Ou(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),e.skipMcp||s.push(r.mcp.project(n,{command:"devflow-mcp",args:["--mode","stdio"]})),!e.skipPlugin){let l=$u();s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:l?join$1(l,"skills"):void 0}));}for(let l of s)xu(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(S.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(S.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(S.green(`Setup complete for ${r.id}.`)),console.log(S.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var _s=A(()=>{Ue();});var Es={};x(Es,{pluginListCommand:()=>Tu});var Tu,Ps=A(()=>{bt();Tu=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=We();if(e.installed){let n=ho();if(n.length===0){console.log("No plugins installed."),console.log(`
187
220
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
188
221
  `),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}):
189
222
  `);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(`
190
- Install a plugin: devflow plugin install <name>`);}});});var ks={};$(ks,{pluginSearchCommand:()=>fu});var fu,ws=A(()=>{vt();fu=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Fe(),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(`
223
+ Install a plugin: devflow plugin install <name>`);}});});var Rs={};x(Rs,{pluginSearchCommand:()=>Mu});var Mu,Cs=A(()=>{bt();Mu=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=We(),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(`
191
224
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
192
- `),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 Ss={};$(Ss,{pluginInstallCommand:()=>pu});var pu,_s=A(()=>{ve();pu=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await Re(n,process.cwd(),!0);console.log(`
225
+ `),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 As={};x(As,{pluginInstallCommand:()=>Fu});var Fu,$s=A(()=>{be();Fu=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await Ae(n,process.cwd(),!0);console.log(`
193
226
  ${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
194
227
  Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
195
- ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Es={};$(Es,{pluginUninstallCommand:()=>yu});var yu,Cs=A(()=>{ve();yu=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await Jt(n,process.cwd(),!0),console.log(`
228
+ ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Os={};x(Os,{pluginUninstallCommand:()=>Uu});var Uu,Ns=A(()=>{be();Uu=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await Qt(n,process.cwd(),!0),console.log(`
196
229
  ${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
197
- ${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Ft(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 Ds=createRequire(import.meta.url),qn="0.0.0";try{qn=Ds("../package.json").version;}catch{try{qn=Ds("../../package.json").version;}catch{}}var E=new Command;E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(qn).option("--local","Force local engine, skip server");E.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").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").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=ku.join(t,a);Rs.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Rs.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
198
- `));}let n=Ft(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(io(),so)),s=await o(t,{force:e.force,migrateLegacySkills:e.migrateLegacySkills});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(()=>(co(),ao)),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(()=>(Yt(),Gt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(Yt(),Gt));await i(t);}}});E.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(()=>(Mo(),Io));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var bu=E.command("db").description("Manage DevFlow databases");bu.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(()=>(Vo(),zo)),o=t(e);for(let r of n(o))console.log(r);});E.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=Ft(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Go(),Jo));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);}});E.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(()=>(Qo(),Zo)),o=e.backfillVectors?await n(E.opts().local):await t(E.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)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(er(),Xo)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});E.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(()=>(ln(),cn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.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(()=>(ln(),cn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.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=E.command("workflow").description("Workflow management");Lt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(tt(),et)),t=await e(E.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(()=>(tt(),et)),o=await n(e,{input:t??""},E.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(()=>(tt(),et)),t=await e(E.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(()=>(tt(),et)),t=await e(E.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 Te=E.command("memory").description("Memory management");Te.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),De)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Te.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),De));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Te.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(()=>(Ae(),De)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});Te.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Ae(),De));await n(e,t,E.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Te.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Ae(),De)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Te.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(()=>(Ae(),De)),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`));});E.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(sr(),rr)),o=(await t(e,void 0,void 0,E.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 Kn=E.command("docs").description("Documentation index management");Kn.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(`
230
+ ${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Bt(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 js=createRequire(import.meta.url),Yn="0.0.0";try{Yn=js("../package.json").version;}catch{try{Yn=js("../../package.json").version;}catch{}}var P=new Command;P.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(Yn).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").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").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=Bu.join(t,a);Ts.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Ts.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
231
+ `));}let n=Bt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(fo(),go)),s=await o(t,{force:e.force,migrateLegacySkills:e.migrateLegacySkills});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(()=>(po(),mo)),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(()=>(en(),Xt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(en(),Xt));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(()=>(Bo(),Wo));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var Ku=P.command("db").description("Manage DevFlow databases");Ku.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(()=>(Xo(),Qo)),o=t(e);for(let r of n(o))console.log(r);});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(),o=Bt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(tr(),er));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);}});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(()=>(rr(),or)),o=e.backfillVectors?await n(P.opts().local):await t(P.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)"));});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(()=>(ir(),sr)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.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(()=>(fn(),gn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.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(()=>(fn(),gn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.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 Wt=P.command("workflow").description("Workflow management");Wt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.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)`);});Wt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ot(),nt)),o=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Wt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Wt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.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 Is=P.command("embeddings").description("Manage the shared verified embedding model");Is.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(hn(),pn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Is.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(hn(),pn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.migratedFrom&&console.log(` migrated from: ${r.migratedFrom}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Ie=P.command("memory").description("Memory management");Ie.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),$e)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Ie.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),$e));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});Ie.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(()=>(xe(),$e)),o=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(o,null,2));});Ie.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(xe(),$e));await n(e,t,P.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Ie.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(xe(),$e)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});Ie.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(()=>(xe(),$e)),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`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(dr(),ur)),o=(await t(e,void 0,void 0,P.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 Zn=P.command("docs").description("Documentation index management");Zn.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(`
199
232
  ${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(`
200
- All docs synced.`));}});Kn.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(()=>(mn(),fn)),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`));});Kn.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(()=>(mn(),fn));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 gt=E.command("skill").description("Plugin/Skill management");gt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(ve(),Ge)),t=await e(E.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}`);});gt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(ve(),Ge)),n=await t(e,E.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}`);});gt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(ve(),Ge)),n=await t(e,process.cwd(),E.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);}});gt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(ve(),Ge));await t(e,process.cwd(),E.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});gt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(pn(),cr));process.exitCode=t(e);});var As=E.command("mcp").description("Inspect MCP configuration and health");As.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(yn(),hn));await t(e);});As.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(yn(),hn));await t(e);});E.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(()=>(Zr(),Yr));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;});Te.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(Xr(),Qr));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.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(()=>(ts(),es)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var xs=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");xs.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(()=>(Un(),Hn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});xs.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(()=>(Un(),Hn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});E.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(()=>(is(),ss)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var zn=E.command("server").description("Manage DevFlow server");zn.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(()=>(we(),Pt)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});zn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(we(),Pt)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});zn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(we(),Pt)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});E.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"));});E.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(()=>(cs(),as));await t({port:parseInt(e.port,10),background:!!e.background});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(ds(),us));await e();});E.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(ms(),fs));await e();});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(hs(),ps));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Mt=E.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(()=>(vs(),ys)),Promise.resolve().then(()=>(ws(),ks)),Promise.resolve().then(()=>(_s(),Ss)),Promise.resolve().then(()=>(Cs(),Es))]);Mt.addCommand(e),Mt.addCommand(t),Mt.addCommand(n),Mt.addCommand(o);}await E.parseAsync();
233
+ All docs synced.`));}});Zn.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(()=>(wn(),kn)),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`));});Zn.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(()=>(wn(),kn));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 pt=P.command("skill").description("Plugin/Skill management");pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),Ze)),t=await e(P.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}`);});pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,P.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}`);});pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,process.cwd(),P.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);}});pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),Ze));await t(e,process.cwd(),P.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});pt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(bn(),mr));process.exitCode=t(e);});var Ms=P.command("mcp").description("Inspect MCP configuration and health");Ms.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(_n(),Sn));await t(e);});Ms.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(_n(),Sn));await t(e);});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:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(rs(),os));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;});Ie.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(is(),ss));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});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(()=>(cs(),as)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Ls=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Ls.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(()=>(zn(),Jn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Ls.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(()=>(zn(),Jn));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(()=>(fs(),gs)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Qn=P.command("server").description("Manage DevFlow server");Qn.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(()=>(_e(),Ct)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});Qn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(_e(),Ct)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});Qn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(_e(),Ct)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});P.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');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: ${e().url}`));});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(()=>(ps(),ms));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(()=>(vs(),ys));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(bs(),ws));await e();});P.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(_s(),Ss));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Ut=P.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(()=>(Ps(),Es)),Promise.resolve().then(()=>(Cs(),Rs)),Promise.resolve().then(()=>($s(),As)),Promise.resolve().then(()=>(Ns(),Os))]);Ut.addCommand(e),Ut.addCommand(t),Ut.addCommand(n),Ut.addCommand(o);}await P.parseAsync();