@devflow-tools/devflow 0.16.3 → 0.16.5

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 (98) hide show
  1. package/dist/cli.js +21 -21
  2. package/dist/dashboard/404.html +1 -0
  3. package/dist/dashboard/_next/static/GZG2xsR50-1j8vTi6g2g0/_buildManifest.js +1 -0
  4. package/dist/dashboard/_next/static/GZG2xsR50-1j8vTi6g2g0/_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-client.js +6 -6
  80. package/dist/hooks/hook-daemon.js +3 -3
  81. package/dist/hooks/post-tool-use-failure.js +1 -1
  82. package/dist/hooks/post-tool-use.js +3 -3
  83. package/dist/hooks/pre-compact.js +1 -1
  84. package/dist/hooks/pre-tool-use.js +2 -2
  85. package/dist/hooks/session-end.js +1 -1
  86. package/dist/hooks/user-prompt-submit.js +2 -2
  87. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  88. package/dist/plugin/dist/hooks/hook-client.js +6 -6
  89. package/dist/plugin/dist/hooks/hook-daemon.js +3 -3
  90. package/dist/plugin/dist/hooks/post-tool-use-failure.js +1 -1
  91. package/dist/plugin/dist/hooks/post-tool-use.js +3 -3
  92. package/dist/plugin/dist/hooks/pre-compact.js +1 -1
  93. package/dist/plugin/dist/hooks/pre-tool-use.js +2 -2
  94. package/dist/plugin/dist/hooks/session-end.js +1 -1
  95. package/dist/plugin/dist/hooks/user-prompt-submit.js +2 -2
  96. package/dist/plugin/package.json +9 -8
  97. package/package.json +13 -13
  98. package/plugin-registry.json +29 -29
package/dist/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,readdirSync,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 Xr,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import Nl,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import In 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,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,DevFlowApiClient}from'@devflow-tools/sdk';import {execSync,spawn}from'child_process';import {fileURLToPath as fileURLToPath$1}from'url';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import S from'chalk';import Li from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var rs=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var $=(e,t)=>{for(var n in t)rs(e,n,{get:t[n],enumerable:true});};function En(){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 Ye(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 ms)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!X(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Rn(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,_t);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:Rn(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 Ae(e,t){let n=ps(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=An(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=St(c.content),d=readFileSync$1(l,"utf-8"),g=St(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 Dn(e,t,n,o=Date.now,r={}){let s=Ae(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()||St(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 ps(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=An(r);s&&t.set(s.name,r);}return t}function An(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 St(e){return createHash("sha256").update(e).digest("hex")}function Rn(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 $n(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=X(t.enabledPlugins)?t.enabledPlugins:{};n[ze]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",be),r=X(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[be]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
2
+ import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,readdirSync,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 Xr,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import Nl,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import In 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,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,DevFlowApiClient}from'@devflow-tools/sdk';import {execSync,spawn}from'child_process';import {fileURLToPath as fileURLToPath$1}from'url';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import S from'chalk';import Li from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var rs=Object.defineProperty;var $=(e,t)=>()=>(e&&(t=e(e=0)),t);var A=(e,t)=>{for(var n in t)rs(e,n,{get:t[n],enumerable:true});};function En(){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 Ye(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 ms)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!X(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Rn(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,_t);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:Rn(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 $e(e,t){let n=ps(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=$n(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=St(c.content),d=readFileSync$1(l,"utf-8"),g=St(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 Dn(e,t,n,o=Date.now,r={}){let s=$e(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()||St(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 ps(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=$n(r);s&&t.set(s.name,r);}return t}function $n(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 St(e){return createHash("sha256").update(e).digest("hex")}function Rn(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 An(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=X(t.enabledPlugins)?t.enabledPlugins:{};n[ze]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",be),r=X(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[be]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
4
  `);}function xn(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 On(e,t,n){let o=join$1(t,be,_t,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Ve(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)&&Ve(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Ve(a,join$1(o,"skills")),vs(o,e),ws(o),hs(t,o),ys(t,o,n);}function hs(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",be),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:be,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:_t,source:s}]},null,2)}
5
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(!X(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[be]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
6
6
  `);}function ys(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!X(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!X(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[ze];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${ze}`);let c=a??[],l=c.find(f=>X(f)&&f.scope==="user"),u=new Date().toISOString(),d=X(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!X(f)||f.scope!=="user");i[ze]=[...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 X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function vs(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 Ve(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()?Ve(o,r):cpSync(o,r,{force:true});}}function ws(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 ze,be,_t,ms,Ze=A(()=>{ze="devflow@devflow-local",be="devflow-local",_t="devflow",ms=["devflow@devflow-local","devflow@devflow"];});var Ln={};$(Ln,{initProject:()=>Cs,renderInitReport:()=>jn});async function Cs(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(Mn.isInitialized(e)||await Mn.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,jn(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=En(),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";On(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=Dn(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");$n(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Rs.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}xn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function jn(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 Mn,Rs,Fn=A(()=>{Ze();Mn=In.default??In,Rs=createRequire(import.meta.url);});var Un={};$(Un,{reviewPluginMemoryHints:()=>$s});async function $s(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(xs).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??Os)(e,l),{available:i.length,selected:l.length}}function xs(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Os(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 Wn=A(()=>{});function Pe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ls,"../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 Hn(){try{let e=execSync("npm list -g --depth=0 --json",{encoding:"utf-8"}),t=JSON.parse(e);return Object.keys(t.dependencies||{}).filter(n=>n.startsWith("@devflow-tools/plugin-"))}catch{return []}}var js,Ls,Qe=A(()=>{js=fileURLToPath$1(import.meta.url),Ls=dirname$1(js);});var Et={};$(Et,{detectTechStack:()=>Bn,guidePluginInstallation:()=>Bs,installPluginsFromList:()=>Hs,resolvePluginName:()=>Kn});function Bn(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 Kn(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function Hs(e){let t=e.split(",").map(Kn).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{execSync(`npm install -g ${n}`,{stdio:"inherit"}),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Bs(e){let t=Pe();if(t.plugins.length===0)return console.log(`
7
+ `);}function X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function vs(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 Ve(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()?Ve(o,r):cpSync(o,r,{force:true});}}function ws(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 ze,be,_t,ms,Ze=$(()=>{ze="devflow@devflow-local",be="devflow-local",_t="devflow",ms=["devflow@devflow-local","devflow@devflow"];});var Ln={};A(Ln,{initProject:()=>Cs,renderInitReport:()=>jn});async function Cs(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(Mn.isInitialized(e)||await Mn.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,jn(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=En(),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";On(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=Dn(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");An(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Rs.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}xn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function jn(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 Mn,Rs,Fn=$(()=>{Ze();Mn=In.default??In,Rs=createRequire(import.meta.url);});var Un={};A(Un,{reviewPluginMemoryHints:()=>As});async function As(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(xs).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??Os)(e,l),{available:i.length,selected:l.length}}function xs(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Os(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 Wn=$(()=>{});function Pe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ls,"../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 Hn(){try{let e=execSync("npm list -g --depth=0 --json",{encoding:"utf-8"}),t=JSON.parse(e);return Object.keys(t.dependencies||{}).filter(n=>n.startsWith("@devflow-tools/plugin-"))}catch{return []}}var js,Ls,Qe=$(()=>{js=fileURLToPath$1(import.meta.url),Ls=dirname$1(js);});var Et={};A(Et,{detectTechStack:()=>Bn,guidePluginInstallation:()=>Bs,installPluginsFromList:()=>Hs,resolvePluginName:()=>Kn});function Bn(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 Kn(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function Hs(e){let t=e.split(",").map(Kn).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{execSync(`npm install -g ${n}`,{stdio:"inherit"}),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Bs(e){let t=Pe();if(t.plugins.length===0)return console.log(`
9
9
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
10
10
  `),[];console.log(`
11
11
  \u{1F50C} Plugin Installation Guide
@@ -19,16 +19,16 @@ Installing selected plugins...
19
19
  `);}catch{console.error(`\u2717 Failed to install ${i}
20
20
  `);}}else console.log(`
21
21
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
22
- `);return s}var Dt=A(()=>{Qe();});var to={};$(to,{ResetExecutionError:()=>$e,executeResetCommand:()=>di,formatResetResult:()=>Tt,runReset:()=>eo});function ni(){if(Xe)return Xe;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Xe=e.DatabaseSync,Xe}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function Tt(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function oi(e){return e==="all"||Yn.includes(e)}function Y(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function $t(e){let t=resolve(e),n=[];for(;!Y(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 Nt(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function ri(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 Zn(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=Y(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(Y(t)){let o=realpathSync(t);if(!Nt(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function si(e,t){return (e==="all"?Yn:[e]).map(o=>({scope:o,path:join$1(t,...Jn[o])}))}function Qn(e,t){let n=Y(t);if(n)return Zn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Xn(e,t){let n=Qn(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 ii(e){let t=Y(e);if(!t?.isFile()||t.size<At.length)return false;let n=Buffer.alloc(At.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(At)}finally{closeSync(o);}}function ai(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}ii(o)&&t.push(o);}}return n(e),t}function ci(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ni())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function li(e,t,n){let o=ai(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));ci(s,i);}}function ui(e,t,n,o,r){let s=!!Y(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),li(c.path,join$1(i,c.scope),()=>Xn(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(Y(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&&Y(t))try{rmdirSync(t);}catch{}}}function eo(e,t={}){if(!oi(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=ri(e.project??process.cwd()),o=si(e.scope,n);for(let c of o)Zn(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=Qn(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?$t(e.backupTo):void 0;if(s){let c=Y(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=$t(l.path),d=join$1(s,l.scope),g=$t(d);if(Nt(u,g)||Nt(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(Y(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&&ui(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Xn(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new $e(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function di(e,t={},n=console){try{let o=eo(e,t),r=Tt(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof $e)for(let r of Tt(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Xe,$e,Jn,Yn,At,no=A(()=>{$e=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Jn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Yn=Object.keys(Jn),At=Buffer.from("SQLite format 3\0","binary");});var go={};$(go,{consolidateDatabases:()=>pi,formatConsolidateResult:()=>hi});function pi(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=[ro("project",o,s?n:void 0),ro("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")?yi(o):null;try{let f=new Map;for(let y of c){let _=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);so(y.path,_),f.set(y.kind,_);}s&&so(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?wi(o,d):[];a.retired.push(...m.map(y=>y.destination));let p=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&io(p,"project_source",void 0,a.inserted),f.has("codegraph")){io(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let _ of Te(p,"codegraph_source").filter(E=>E.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${N(_)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw uo(m),y}finally{p?.close();}return a}finally{vi(g);}}function hi(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 ro(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 Te(r).filter(c=>!i||i.has(c)))o.tables[a]=Lt(r,a),o.conflicts[a]=s&&Te(s).includes(a)?ki(r,s,a):0;}finally{r.close(),s?.close();}return o}function so(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 yi(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 vi(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function wi(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 uo(n),o}return n}function uo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function io(e,t,n,o){let r=new Set(Te(e)),s=Te(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=tt(e,"main",i),c=new Set(tt(e,t,i).map(m=>m.name)),l=a.filter(m=>c.has(m.name));if(jt.has(i)&&(l=l.filter(m=>m.pk===0)),l.length===0)continue;let u=Lt(e,i),d=l.map(m=>N(m.name)).join(", "),g=l.map(m=>`s.${N(m.name)}`).join(", ");if(l.filter(m=>m.pk>0).length>0&&!jt.has(i))e.exec(`INSERT OR IGNORE INTO main.${N(i)} (${d}) SELECT ${g} FROM ${N(t)}.${N(i)} s`);else {let m=l.map(p=>`t.${N(p.name)} IS s.${N(p.name)}`).join(" AND ");e.exec(`
22
+ `);return s}var Dt=$(()=>{Qe();});var to={};A(to,{ResetExecutionError:()=>Ae,executeResetCommand:()=>di,formatResetResult:()=>Tt,runReset:()=>eo});function ni(){if(Xe)return Xe;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Xe=e.DatabaseSync,Xe}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function Tt(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function oi(e){return e==="all"||Yn.includes(e)}function Y(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function At(e){let t=resolve(e),n=[];for(;!Y(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 Nt(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function ri(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 Zn(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=Y(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(Y(t)){let o=realpathSync(t);if(!Nt(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function si(e,t){return (e==="all"?Yn:[e]).map(o=>({scope:o,path:join$1(t,...Jn[o])}))}function Qn(e,t){let n=Y(t);if(n)return Zn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Xn(e,t){let n=Qn(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 ii(e){let t=Y(e);if(!t?.isFile()||t.size<$t.length)return false;let n=Buffer.alloc($t.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals($t)}finally{closeSync(o);}}function ai(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}ii(o)&&t.push(o);}}return n(e),t}function ci(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ni())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function li(e,t,n){let o=ai(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));ci(s,i);}}function ui(e,t,n,o,r){let s=!!Y(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),li(c.path,join$1(i,c.scope),()=>Xn(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(Y(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&&Y(t))try{rmdirSync(t);}catch{}}}function eo(e,t={}){if(!oi(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=ri(e.project??process.cwd()),o=si(e.scope,n);for(let c of o)Zn(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=Qn(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?At(e.backupTo):void 0;if(s){let c=Y(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=At(l.path),d=join$1(s,l.scope),g=At(d);if(Nt(u,g)||Nt(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(Y(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&&ui(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Xn(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new Ae(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function di(e,t={},n=console){try{let o=eo(e,t),r=Tt(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof Ae)for(let r of Tt(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Xe,Ae,Jn,Yn,$t,no=$(()=>{Ae=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Jn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Yn=Object.keys(Jn),$t=Buffer.from("SQLite format 3\0","binary");});var go={};A(go,{consolidateDatabases:()=>pi,formatConsolidateResult:()=>hi});function pi(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=[ro("project",o,s?n:void 0),ro("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")?yi(o):null;try{let f=new Map;for(let y of c){let _=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);so(y.path,_),f.set(y.kind,_);}s&&so(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?wi(o,d):[];a.retired.push(...m.map(y=>y.destination));let p=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&io(p,"project_source",void 0,a.inserted),f.has("codegraph")){io(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let _ of Te(p,"codegraph_source").filter(E=>E.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${N(_)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw uo(m),y}finally{p?.close();}return a}finally{vi(g);}}function hi(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 ro(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 Te(r).filter(c=>!i||i.has(c)))o.tables[a]=Lt(r,a),o.conflicts[a]=s&&Te(s).includes(a)?ki(r,s,a):0;}finally{r.close(),s?.close();}return o}function so(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 yi(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 vi(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function wi(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 uo(n),o}return n}function uo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function io(e,t,n,o){let r=new Set(Te(e)),s=Te(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=tt(e,"main",i),c=new Set(tt(e,t,i).map(m=>m.name)),l=a.filter(m=>c.has(m.name));if(jt.has(i)&&(l=l.filter(m=>m.pk===0)),l.length===0)continue;let u=Lt(e,i),d=l.map(m=>N(m.name)).join(", "),g=l.map(m=>`s.${N(m.name)}`).join(", ");if(l.filter(m=>m.pk>0).length>0&&!jt.has(i))e.exec(`INSERT OR IGNORE INTO main.${N(i)} (${d}) SELECT ${g} FROM ${N(t)}.${N(i)} s`);else {let m=l.map(p=>`t.${N(p.name)} IS s.${N(p.name)}`).join(" AND ");e.exec(`
23
23
  INSERT INTO main.${N(i)} (${d})
24
24
  SELECT ${g} FROM ${N(t)}.${N(i)} s
25
25
  WHERE NOT EXISTS (SELECT 1 FROM main.${N(i)} t WHERE ${m})
26
- `);}o[i]=(o[i]??0)+(Lt(e,i)-u);}}function ki(e,t,n){let o=new Set(tt(t,"main",n).map(l=>l.name)),r=tt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||jt.has(n))return 0;let s=r.map(l=>N(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${N(n)}`).all(),a=r.map(l=>`${N(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${N(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function Te(e,t="main"){return e.prepare(`SELECT name FROM ${N(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function tt(e,t,n){return e.prepare(`PRAGMA ${N(t)}.table_info(${N(n)})`).all()}function Lt(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${N(t)}`).get();return Number(n.count)}function N(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var jt,fo=A(()=>{jt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var mo={};$(mo,{connectAgent:()=>Ft,getAvailableAgents:()=>_i});async function Ft(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 _i(){return listAdapters()}var Ut=A(()=>{});async function x(e,t,n,o={}){let r=o.serverUrl??Ri;if(o.skipServer)return n();let s=false,i=ho.get(r);if(i&&Date.now()-i.ts<Ci?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),ho.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 Ri,ho,Ci,ae=A(()=>{Ri=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",ho=new Map,Ci=3e4;});var vo={};$(vo,{getIndexStatus:()=>Ei,refreshIndex:()=>Di});async function Ei(e){return x(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function Di(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var wo=A(()=>{ae();});var ko={};$(ko,{getGraph:()=>$i});async function $i(e={}){let t=e.target??"all",n=e.depth??2;return x(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var bo=A(()=>{ae();});var Wt={};$(Wt,{getContext:()=>Oi,getTaskContext:()=>Ti});async function Oi(e){return x(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function Ti(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var Ht=A(()=>{ae();});var Ne={};$(Ne,{getWorkflowRuns:()=>_o,getWorkflowStatus:()=>Mi,listWorkflows:()=>Ni,runWorkflow:()=>Ii});async function Ni(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Ii(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Mi(e){return _o(e)}async function _o(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Ie=A(()=>{ae();});var me={};$(me,{backfillObservationVectors:()=>Bi,queryMemory:()=>Ui,reviewCandidates:()=>Hi,reviewMemories:()=>qi,setMemory:()=>Wi,showMemory:()=>Fi});async function Fi(e,t){let n=await x(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function Ui(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Wi(e,t,n){return x(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function Hi(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Bi(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ki(e){let t=Li.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function qi(){let t=await x(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
26
+ `);}o[i]=(o[i]??0)+(Lt(e,i)-u);}}function ki(e,t,n){let o=new Set(tt(t,"main",n).map(l=>l.name)),r=tt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||jt.has(n))return 0;let s=r.map(l=>N(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${N(n)}`).all(),a=r.map(l=>`${N(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${N(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function Te(e,t="main"){return e.prepare(`SELECT name FROM ${N(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function tt(e,t,n){return e.prepare(`PRAGMA ${N(t)}.table_info(${N(n)})`).all()}function Lt(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${N(t)}`).get();return Number(n.count)}function N(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var jt,fo=$(()=>{jt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var mo={};A(mo,{connectAgent:()=>Ft,getAvailableAgents:()=>_i});async function Ft(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 _i(){return listAdapters()}var Ut=$(()=>{});async function x(e,t,n,o={}){let r=o.serverUrl??Ri;if(o.skipServer)return n();let s=false,i=ho.get(r);if(i&&Date.now()-i.ts<Ci?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),ho.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 Ri,ho,Ci,ae=$(()=>{Ri=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",ho=new Map,Ci=3e4;});var vo={};A(vo,{getIndexStatus:()=>Ei,refreshIndex:()=>Di});async function Ei(e){return x(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function Di(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var wo=$(()=>{ae();});var ko={};A(ko,{getGraph:()=>Ai});async function Ai(e={}){let t=e.target??"all",n=e.depth??2;return x(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var bo=$(()=>{ae();});var Wt={};A(Wt,{getContext:()=>Oi,getTaskContext:()=>Ti});async function Oi(e){return x(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function Ti(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var Ht=$(()=>{ae();});var Ne={};A(Ne,{getWorkflowRuns:()=>_o,getWorkflowStatus:()=>Mi,listWorkflows:()=>Ni,runWorkflow:()=>Ii});async function Ni(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Ii(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Mi(e){return _o(e)}async function _o(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Ie=$(()=>{ae();});var me={};A(me,{backfillObservationVectors:()=>Bi,queryMemory:()=>Ui,reviewCandidates:()=>Hi,reviewMemories:()=>qi,setMemory:()=>Wi,showMemory:()=>Fi});async function Fi(e,t){let n=await x(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function Ui(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Wi(e,t,n){return x(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function Hi(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Bi(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ki(e){let t=Li.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function qi(){let t=await x(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
27
27
  [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ki(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await x(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await x(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
28
- Reviewed ${o}/${t.length} pending memories.`);}var pe=A(()=>{ae();});var Ro={};$(Ro,{getDocsStatus:()=>Gi,queryKnowledge:()=>Po,searchKnowledge:()=>Vi,syncDocs:()=>Ji});async function Po(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function Vi(e,t,n){return (await Po(e,t,void 0,n)).results}async function Gi(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ji(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var Co=A(()=>{ae();});var zt={};$(zt,{backfillKnowledgeVectors:()=>Xi,resyncKnowledgeDocs:()=>Qi});function Eo(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Qi(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Eo(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Xi(e={}){let t=Eo(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var Vt=A(()=>{});var Ao=A(()=>{});var je={};$(je,{installSkill:()=>ia,listSkills:()=>Oo,listSkillsSync:()=>ra,searchSkills:()=>sa,uninstallSkill:()=>aa});async function Oo(e){return x(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:e})}function ra(){return []}async function sa(e,t){let n=await Oo(t),o=e.toLowerCase();return n.filter(r=>r.name.toLowerCase().includes(o)||r.description.toLowerCase().includes(o)||r.tags.some(s=>s.toLowerCase().includes(o)))}function To(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function No(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function ia(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`,r=e.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(nt,{recursive:true});try{execSync(`npm install --prefix "${nt}" ${o}`,{stdio:"pipe",timeout:6e4});}catch{}let s=To(t);s.plugins||(s.plugins=[]),s.plugins.includes(r)||(s.plugins.push(r),No(t,s));let i=[];try{i=JSON.parse(readFileSync(join(nt,"node_modules",o,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:r,version:"0.1.0",templates:i}},{skipServer:n})}async function aa(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=e.replace(/^@devflow-tools\/plugin-/,""),r=To(t);r.plugins&&(r.plugins=r.plugins.filter(i=>i!==o),No(t,r));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(nt,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var nt,Le=A(()=>{ae();Ao();nt=join(process.env.HOME??"~",".devflow","skills");});var rt={};$(rt,{DEFAULT_SERVER_PORT:()=>ot,readPidFromFile:()=>Zt,readPortFromFile:()=>Lo,serverStatus:()=>Ue,startServer:()=>Qt,stopServer:()=>Fe});function Yt(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function ga(){try{return Mo.resolve("./server.js")}catch{try{return Mo.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Lo(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
28
+ Reviewed ${o}/${t.length} pending memories.`);}var pe=$(()=>{ae();});var Ro={};A(Ro,{getDocsStatus:()=>Gi,queryKnowledge:()=>Po,searchKnowledge:()=>Vi,syncDocs:()=>Ji});async function Po(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function Vi(e,t,n){return (await Po(e,t,void 0,n)).results}async function Gi(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ji(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var Co=$(()=>{ae();});var zt={};A(zt,{backfillKnowledgeVectors:()=>Xi,resyncKnowledgeDocs:()=>Qi});function Eo(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Qi(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Eo(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Xi(e={}){let t=Eo(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var Vt=$(()=>{});var $o=$(()=>{});var je={};A(je,{installSkill:()=>ia,listSkills:()=>Oo,listSkillsSync:()=>ra,searchSkills:()=>sa,uninstallSkill:()=>aa});async function Oo(e){return x(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:e})}function ra(){return []}async function sa(e,t){let n=await Oo(t),o=e.toLowerCase();return n.filter(r=>r.name.toLowerCase().includes(o)||r.description.toLowerCase().includes(o)||r.tags.some(s=>s.toLowerCase().includes(o)))}function To(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function No(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function ia(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`,r=e.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(nt,{recursive:true});try{execSync(`npm install --prefix "${nt}" ${o}`,{stdio:"pipe",timeout:6e4});}catch{}let s=To(t);s.plugins||(s.plugins=[]),s.plugins.includes(r)||(s.plugins.push(r),No(t,s));let i=[];try{i=JSON.parse(readFileSync(join(nt,"node_modules",o,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:r,version:"0.1.0",templates:i}},{skipServer:n})}async function aa(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=e.replace(/^@devflow-tools\/plugin-/,""),r=To(t);r.plugins&&(r.plugins=r.plugins.filter(i=>i!==o),No(t,r));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(nt,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var nt,Le=$(()=>{ae();$o();nt=join(process.env.HOME??"~",".devflow","skills");});var rt={};A(rt,{DEFAULT_SERVER_PORT:()=>ot,readPidFromFile:()=>Zt,readPortFromFile:()=>Lo,serverStatus:()=>Ue,startServer:()=>Qt,stopServer:()=>Fe});function Yt(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function ga(){try{return Mo.resolve("./server.js")}catch{try{return Mo.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Lo(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
29
29
  `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function Zt(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
30
30
  `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Qt(e){let t=ga(),n=Yt(process.cwd()),o=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
31
- ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd()),t=Zt(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Ue(){let e=Yt(process.cwd()),t=Lo(e)??ot,{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:Zt(e)??void 0,port:t}:{running:false,port:t}}var Mo,ot,ce=A(()=>{Mo=createRequire(import.meta.url);ot=13337;});var kr={};$(kr,{renderDoctorText:()=>vr,runDoctor:()=>jc,runDoctorAudit:()=>Fc,runDoctorAuditFix:()=>Uc,runDoctorCommand:()=>Lc,runDoctorReceipts:()=>Hc,runDoctorViolations:()=>Wc,runLegacyDoctorReport:()=>wr,runStructuredDoctor:()=>hn});function fn(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Fo(e){return join$1(homedir$1(),".devflow","daemons",`${fn(e)}.sock`)}function wa(){return join$1(homedir$1(),".devflow","daemons.json")}function rr(){if(it)return it;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return it=e.DatabaseSync,it}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"}function cn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function ka(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!==fn(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function ba(e,t){let n=cn(e),o=fn(n.path),r=Fo(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??wa();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=>ka(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:cn(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=>Fo(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 _a(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(r=>r.name)),o=[];for(let[r,s]of Object.entries(Sa)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function ir(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 Pa(e){let t=ir(e);return t&&t.length>0?t:null}function en(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 Ra(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Uo(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Ea(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(rr())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=_a(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(`
31
+ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd()),t=Zt(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Ue(){let e=Yt(process.cwd()),t=Lo(e)??ot,{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:Zt(e)??void 0,port:t}:{running:false,port:t}}var Mo,ot,ce=$(()=>{Mo=createRequire(import.meta.url);ot=13337;});var kr={};A(kr,{renderDoctorText:()=>vr,runDoctor:()=>jc,runDoctorAudit:()=>Fc,runDoctorAuditFix:()=>Uc,runDoctorCommand:()=>Lc,runDoctorReceipts:()=>Hc,runDoctorViolations:()=>Wc,runLegacyDoctorReport:()=>wr,runStructuredDoctor:()=>hn});function fn(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Fo(e){return join$1(homedir$1(),".devflow","daemons",`${fn(e)}.sock`)}function wa(){return join$1(homedir$1(),".devflow","daemons.json")}function rr(){if(it)return it;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return it=e.DatabaseSync,it}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"}function cn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function ka(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!==fn(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function ba(e,t){let n=cn(e),o=fn(n.path),r=Fo(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??wa();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=>ka(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:cn(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=>Fo(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 _a(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(r=>r.name)),o=[];for(let[r,s]of Object.entries(Sa)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function ir(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 Pa(e){let t=ir(e);return t&&t.length>0?t:null}function en(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 Ra(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Uo(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Ea(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(rr())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=_a(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(`
32
32
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
33
33
  FROM distill_leases
34
34
  `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let b of u){let O=Pa(b.event_ids),B=ir(b.session_ids),K=en(b.event_count),D=en(b.created_at),q=en(b.expires_at),re=typeof b.status=="string"&&Ca.has(b.status)?b.status:null,ge=typeof b.batch_id=="string"&&b.batch_id.trim().length>0,ns=O!==null&&K!==null&&Ra(K,O.length);if(!ge||!O||!B||!ns||D===null||q===null||re===null){g+=1,b.status==="pending"&&(q===null||Uo(q,c))&&(f+=1);continue}if(!(re!=="pending"||!Uo(q,c)))for(let os of O)d.add(os);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let p=i.prepare(`
@@ -64,7 +64,7 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd(
64
64
  FROM embeddings e JOIN observations o ON o.id = e.source_id
65
65
  WHERE e.source_type = 'observation'
66
66
  `),p=Math.max(0,f-m);n.push({key:"observations",value:f,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:m,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:p,target:0,ok:p===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let 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(`
67
- `).filter(f=>{let m=/^\[([^\]]+)\]/.exec(f);return m?Date.parse(m[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:T(n),metrics:n}}function Aa(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=V(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[v,w]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let b=H(m,w)?j(m,`SELECT COUNT(*) count FROM ${w} WHERE created_at >= ?`,i):0;o.push({key:v,value:b,ok:!0,severity:"info"});}let p=H(m,"telemetry_failures")?j(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=tn(m,"sessions"),y=tn(m,"tool_call_events"),_=tn(m,"skill_executions"),E=["id","project_root","started_at","status"].every(v=>h.has(v));if(o.push({key:"telemetry_session_schema",value:E?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:E,severity:"error"}),E){let v=j(m,`
67
+ `).filter(f=>{let m=/^\[([^\]]+)\]/.exec(f);return m?Date.parse(m[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:T(n),metrics:n}}function $a(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=V(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[v,w]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let b=H(m,w)?j(m,`SELECT COUNT(*) count FROM ${w} WHERE created_at >= ?`,i):0;o.push({key:v,value:b,ok:!0,severity:"info"});}let p=H(m,"telemetry_failures")?j(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=tn(m,"sessions"),y=tn(m,"tool_call_events"),_=tn(m,"skill_executions"),E=["id","project_root","started_at","status"].every(v=>h.has(v));if(o.push({key:"telemetry_session_schema",value:E?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:E,severity:"error"}),E){let v=j(m,`
68
68
  SELECT COUNT(*) count FROM sessions
69
69
  WHERE project_root = ? AND started_at >= ?
70
70
  `,e,i);o.push({key:"session_start_evidence_24h",value:v,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let w=j(m,`
@@ -92,7 +92,7 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd(
92
92
  FROM benchmark_reports
93
93
  ORDER BY created_at DESC
94
94
  LIMIT 1
95
- `).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/Ee).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=$a,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 Ta(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 Na(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)()-Ee,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let _ of readFileSync$1(y,"utf8").split(`
95
+ `).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/Ee).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=Aa,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 Ta(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 Na(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)()-Ee,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let _ of readFileSync$1(y,"utf8").split(`
96
96
  `))if(_.trim())try{let E=JSON.parse(_),v=ar(E.ts);v===null||typeof E.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(_){t.push({key:"hook_fallback_log_read",value:{path:y,error:_.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=V(c,e),H(y,"telemetry_events")){let _=y.prepare(`
97
97
  SELECT COUNT(*) total,
98
98
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
@@ -112,7 +112,7 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd(
112
112
  `||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 Ja(e,t,n,o=true){let r=Ga(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let m=-1;for(let p=d+1;p<Math.min(c.length,d+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){m=p;break}m>=0?a(c[m+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=pn(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 Ya(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]!==`
113
113
  `;)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]===`
114
114
  `||e[d]==="\r"))break;e[d]!==`
115
- `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let m=0;m<f.length;m+=1)if(f[m]==="{"){if(f[m+1]==="{"){m+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Ko(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 Za(e,t,n){let o=Ya(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=ne(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),m=Ko(f,d);s||=!m.resolved;for(let h of m.paths)a(h);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=d=>{let g=[];for(let f of d.split(",")){let m=f.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}g.push(m);}return g},u=(d,g)=>{for(let f of l(g))d&&Ko(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 w of v)c(w.trim().split(/\s+as\s+/)[0]);continue}let m=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,h=m[2];if(h){let v=c(h,p);u(v,m[3]);continue}if(p===0){s=true;continue}let y=i(p),_=join$1(y,"__init__.py"),E=false;try{E=statSync$1(_).isFile();}catch{}if(E){a(_),u(y,m[3]);continue}for(let v of l(m[3]))c(v,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function fr(e,t,n,o,r=true){return n==="node"?Ja(e,t,o,r):n==="python"?Za(e,t,o):{references:[],inlineContents:[],malformed:false}}function qo(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=ut(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>ne(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=pn(g);m.reference&&c.push(m.reference),m.inlineContent&&l.push(m.inlineContent),u||=m.malformed;continue}let f=ne(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 mr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function ve(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 ct(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function We(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function nc(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||=ve(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(tc.has(u))return a();if(ec.has(u)){l=true,c+=1;continue}let d=zo.has(u)?"cjs":Vo.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=We(u,zo),f=We(u,Vo),m=g??f;if(m!==null){if(!m)return a(true);i(m,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Go.has(u)){let h=e[c+1];return a(h===void 0?true:s||ct(h))}let p=We(u,Go);if(p!==null)return a(s||ct(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||ct(u.slice(2)));if(Jo.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(We(u,Jo)!==null){c+=1;continue}if(Xa.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function ic(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:ve(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?ut(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(oc.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:ve(i)}}return {tokens:[],malformed:true}}function ac(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:ve(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:ve(r)};if(sc.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Yo.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(We(r,Yo)!==null){o+=1;continue}if(rc.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function on(e,t){let n=ne(e,t,true);if(!n)return null;let o=de(n.path),r=de(t.project);return !o||!r||!ue(r,o)?null:o}function uc(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(mr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=qe(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 ut(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>lr)return {tokens:[],malformed:true};let r=qe(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=pr(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 pr(e,t,n,o){let r=0;for(;mr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;cc.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>lr)return {tokens:i,malformed:true};let p=uc(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=pr(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&dr(l,o),d=c&&!lc.has(l);if(u||d)return {tokens:i,malformed:true};let g=ve(s);i.push(s);let f=l;if(!Qa.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?nc(e,r+1,n):["bash","sh","zsh"].includes(f)?ic(e,r+1,a,n,o):ac(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function hr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:de(t.slice(0,o))}function dc(e,t){let n=new Map;for(let o of t)for(let r of Ka(o)){let s=hr(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 gc(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function fc(e){return e.slice(e.lastIndexOf("@")+1)}function Zo(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=de(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function mc(e,t,n){let o=fc(e),r=M(t.extraKnownMarketplaces),s=M(r?.[o]);if(s){let i=M(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Zo(i.path):null}}try{let i=M(we(n)),a=M(i?.[o]);if(a){let c=M(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Zo(c.path):null}}}catch{}return {configured:false,root:null}}function Qo(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 pc(e,t){let n=M(e.entry),o=M(t.entry),r=Qo(n),s=Qo(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?dt(n.version):null,a=typeof o?.version=="string"?dt(o.version):null;if(i&&a){let c=yr(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function hc(e,t){try{let n=M(we(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=M(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(pc)[0],i=M(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:de(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function dt(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 yr(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 yc(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=M(we(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=dt(a.version),u=dt(c.version);if(l&&u){let d=yr(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]?de(i[0].path):null}function vc(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(w=>de(w)).filter(w=>w!==null).map(w=>({root:w,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 w=M(we(v));if(!w)throw new Error("settings must be an object");i.push({path:v,settings:w});}catch{a.push(v);}if(i.reduce((v,w)=>typeof w.settings.disableAllHooks=="boolean"?w.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 w=[];return Be(v.settings.hooks,w),{path:v.path,commands:w}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>dc(v.path,v.commands)),p=[...i.reduce((v,w)=>{let b=w.settings.enabledPlugins;if(typeof b!="object"||b===null)return v;for(let[O,B]of Object.entries(b))gc(O)&&typeof B=="boolean"&&v.set(O,B);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of p){let w=hc(v,o);w.malformed&&c.push(o);let b=w.root;if(!w.configured){let O=i.map(K=>mc(v,K.settings,r)).filter(K=>K.configured),B=O[O.length-1];B?b=B.root:b=yc(v,s);}b?h.push({root:b,inspectPluginConfig:true}):y=true;}let _=[...h.reduce((v,w)=>{let b=v.get(w.root);return b?(v.set(w.root,{root:w.root,configPath:b.configPath??w.configPath,commands:[...new Set([...b.commands??[],...w.commands??[]])],inspectPluginConfig:!!(b.inspectPluginConfig||w.inspectPluginConfig)}),v):(v.set(w.root,w),v)},new Map).values()],E=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:_,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:E.length>0?`${E.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(_.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function wc(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 Be(e,t){if(Array.isArray(e)){for(let n of e)Be(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):Be(o,t);}function rn(e){return [...e.matchAll(Ma)].map(t=>t[1])}function kc(e){let t=new Map,n=qe(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 bc(e){let t=spawnSync("bash",["--noprofile","--norc","-n"],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??"",BASH_ENV:"",ENV:""},input:e,timeout:2e3});return t.error!==void 0||t.status!==0}function Sc(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function sn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function ue(e,t){return t===e||t.startsWith(`${e}${sep}`)}function ln(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>at)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>at)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,at+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>at)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 _c(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)){ue(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(!ue(g,f)){o.escapedArtifacts.push(u);return}let m=`${f}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),r.push({...c,path:f,depth:l}));};for(let c of n){let l=qo(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of te(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>=cr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=ln(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 m of te(d,f,g))o.findings.push({artifact:l,endpoint:m});if(f){let m=qo(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}else if(g==="node"||g==="python"){let m=fr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}}}function Pc(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=wc(r),c=0,l=(f,m=false,p=r,h="infer",y=e,_=0)=>{if(_>mn){o.traversalLimitRoots.push(r);return}let E=realpathSync.native(p),v=resolve(f);if(!existsSync$1(v)){if(!ue(E,v)){o.escapedArtifacts.push(v);return}m&&o.missing.push(v);return}let w;try{w=realpathSync.native(v);}catch{m&&o.missing.push(v);return}if(!ue(E,w)){o.escapedArtifacts.push(v);return}let b=`${w}:${h}:${y}`;i.has(b)||(i.add(b),s.push({path:w,parserKind:h,cwd:y,depth:_}));},u=(f,m,p,h=0)=>{for(let y of rn(f)){let _=sn(r,y);if(!_)continue;let E=(m.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(_,true,r,E?.parserKind??"infer",E?.cwd??p,h);}},d=(f,m,p=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let _=y.nodeResolutionKind?pn(y,!h):{reference:ne(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(_.malformed){o.malformedCommands.push(y.value);continue}if(_.inlineContent)for(let E of te(_.inlineContent.content,false,"node"))o.findings.push({artifact:_.inlineContent.source,endpoint:E});_.reference&&l(_.reference.path,true,h?r:_.reference.containmentRoot,_.reference.parserKind,_.reference.cwd??m,p);}},g=f=>{for(let p of te(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=ut(f,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(f),u(f,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let h=hr(p),y=(m.artifacts??[]).find(_=>_.value===p);h===r&&l(p,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"),m=join$1(r,"hooks.json"),p=existsSync$1(m)?m:f;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!ue(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=ln(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(un(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let _=JSON.parse(y.content),E=[];Be(_,E);for(let v of E)g(v);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=cr){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=ln(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(un(m,p.reason));continue}let{content:h}=p;o.inspected.push(m);let y=f.parserKind==="infer"?gr(m,h):f.parserKind,_=y==="shell";for(let w of te(h,_,y))o.findings.push({artifact:m,endpoint:w});if(_){let w=kc(h),b=ut(w,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});bc(h)&&o.malformedCommands.push(m),u(w,b,dirname(m),f.depth+1),d(b,dirname(m),f.depth+1,true);}else if(y==="node"||y==="python"){let w=fr(m,h,y,{project:e,homePath:t,cwd:dirname(m)},false);(y==="node"?Sc(m):w.malformed)&&o.malformedCommands.push(m);for(let b of w.inlineContents)for(let O of te(b.content,false,"node"))o.findings.push({artifact:b.source,endpoint:O});for(let b of w.references){let O=relative(r,resolve(b.path));!O.startsWith(`..${sep}`)&&O.split(sep).includes("node_modules")||l(b.path,true,r,b.parserKind,b.cwd,f.depth+1);}for(let b of rn(h)){let O=sn(r,b);O&&l(O,true,r,y,f.cwd,f.depth+1);}}else for(let w of rn(h)){let b=sn(r,w);b&&l(b,true,r,y,f.cwd,f.depth+1);}let E=m.startsWith(`${r}/`)?m.slice(r.length+1):"",v=basename(E).replace(/\.js$/,"");a&&(E.startsWith("hooks/")||E.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),E.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function Rc(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=M(we(t)),r=M(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=M(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=de(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 Xo(e){try{let t=M(we(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Cc(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Rc(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 _=M(we(d)),E=M(_?.hooks),v=[];Be(E?.SessionStart,v),v.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Xo(i),f=Xo(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(_=>_!==g))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let _=readFileSync$1(h,"utf8");(!existsSync$1(y)||!_.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 Ec(e,t){let n=vc(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 q of D.commands){o.commandsInspected.push({configPath:D.path,command:q});for(let re of te(q,true))o.findings.push({artifact:D.path,endpoint:re});}}_c(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(q=>q.commands?.includes(D))),o);for(let D of n.targets)Pc(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,q,re)=>re.findIndex(ge=>ge.configPath===D.configPath&&ge.command===D.command)===q),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,q,re)=>re.findIndex(ge=>ge.artifact===D.artifact&&ge.endpoint===D.endpoint)===q),m=a.length>0||g.length>0||u.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Cc(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,_=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),E=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}:E?{root:E,version:null}:Ye(_,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=v.root,b=w?Ae(_,w):[],O=b.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),B=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(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:b.length,target:0,ok:b.length===0,severity:"error"},{key:"shadowed_skills",value:b,target:[],ok:b.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:O,target:[],ok:true,severity:"info"}],K=v.version??h.versionRecords.find(D=>D.root===w)?.packageVersion;return K&&B.push({key:"active_plugin_version",value:K,ok:true,severity:"info"}),{name:"Legacy paths",status:T(B),metrics:B}}function Dc(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function mt(e){let t=Dc(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/Ee: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 Ac(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=V(i,t);let l=(H(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:j(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:T(n),metrics:n}}function $c(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=V(o,t),!H(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*Ee,i=r.prepare(`
115
+ `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let m=0;m<f.length;m+=1)if(f[m]==="{"){if(f[m+1]==="{"){m+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Ko(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 Za(e,t,n){let o=Ya(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=ne(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),m=Ko(f,d);s||=!m.resolved;for(let h of m.paths)a(h);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=d=>{let g=[];for(let f of d.split(",")){let m=f.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}g.push(m);}return g},u=(d,g)=>{for(let f of l(g))d&&Ko(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 w of v)c(w.trim().split(/\s+as\s+/)[0]);continue}let m=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,h=m[2];if(h){let v=c(h,p);u(v,m[3]);continue}if(p===0){s=true;continue}let y=i(p),_=join$1(y,"__init__.py"),E=false;try{E=statSync$1(_).isFile();}catch{}if(E){a(_),u(y,m[3]);continue}for(let v of l(m[3]))c(v,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function fr(e,t,n,o,r=true){return n==="node"?Ja(e,t,o,r):n==="python"?Za(e,t,o):{references:[],inlineContents:[],malformed:false}}function qo(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=ut(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>ne(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=pn(g);m.reference&&c.push(m.reference),m.inlineContent&&l.push(m.inlineContent),u||=m.malformed;continue}let f=ne(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 mr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function ve(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 ct(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function We(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function nc(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||=ve(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(tc.has(u))return a();if(ec.has(u)){l=true,c+=1;continue}let d=zo.has(u)?"cjs":Vo.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=We(u,zo),f=We(u,Vo),m=g??f;if(m!==null){if(!m)return a(true);i(m,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Go.has(u)){let h=e[c+1];return a(h===void 0?true:s||ct(h))}let p=We(u,Go);if(p!==null)return a(s||ct(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||ct(u.slice(2)));if(Jo.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(We(u,Jo)!==null){c+=1;continue}if(Xa.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function ic(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:ve(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?ut(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(oc.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:ve(i)}}return {tokens:[],malformed:true}}function ac(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:ve(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:ve(r)};if(sc.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Yo.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(We(r,Yo)!==null){o+=1;continue}if(rc.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function on(e,t){let n=ne(e,t,true);if(!n)return null;let o=de(n.path),r=de(t.project);return !o||!r||!ue(r,o)?null:o}function uc(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(mr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=qe(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 ut(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>lr)return {tokens:[],malformed:true};let r=qe(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=pr(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 pr(e,t,n,o){let r=0;for(;mr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;cc.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>lr)return {tokens:i,malformed:true};let p=uc(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=pr(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&dr(l,o),d=c&&!lc.has(l);if(u||d)return {tokens:i,malformed:true};let g=ve(s);i.push(s);let f=l;if(!Qa.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?nc(e,r+1,n):["bash","sh","zsh"].includes(f)?ic(e,r+1,a,n,o):ac(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function hr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:de(t.slice(0,o))}function dc(e,t){let n=new Map;for(let o of t)for(let r of Ka(o)){let s=hr(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 gc(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function fc(e){return e.slice(e.lastIndexOf("@")+1)}function Zo(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=de(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function mc(e,t,n){let o=fc(e),r=M(t.extraKnownMarketplaces),s=M(r?.[o]);if(s){let i=M(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Zo(i.path):null}}try{let i=M(we(n)),a=M(i?.[o]);if(a){let c=M(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Zo(c.path):null}}}catch{}return {configured:false,root:null}}function Qo(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 pc(e,t){let n=M(e.entry),o=M(t.entry),r=Qo(n),s=Qo(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?dt(n.version):null,a=typeof o?.version=="string"?dt(o.version):null;if(i&&a){let c=yr(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function hc(e,t){try{let n=M(we(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=M(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(pc)[0],i=M(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:de(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function dt(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 yr(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 yc(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=M(we(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=dt(a.version),u=dt(c.version);if(l&&u){let d=yr(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]?de(i[0].path):null}function vc(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(w=>de(w)).filter(w=>w!==null).map(w=>({root:w,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 w=M(we(v));if(!w)throw new Error("settings must be an object");i.push({path:v,settings:w});}catch{a.push(v);}if(i.reduce((v,w)=>typeof w.settings.disableAllHooks=="boolean"?w.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 w=[];return Be(v.settings.hooks,w),{path:v.path,commands:w}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>dc(v.path,v.commands)),p=[...i.reduce((v,w)=>{let b=w.settings.enabledPlugins;if(typeof b!="object"||b===null)return v;for(let[O,B]of Object.entries(b))gc(O)&&typeof B=="boolean"&&v.set(O,B);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of p){let w=hc(v,o);w.malformed&&c.push(o);let b=w.root;if(!w.configured){let O=i.map(K=>mc(v,K.settings,r)).filter(K=>K.configured),B=O[O.length-1];B?b=B.root:b=yc(v,s);}b?h.push({root:b,inspectPluginConfig:true}):y=true;}let _=[...h.reduce((v,w)=>{let b=v.get(w.root);return b?(v.set(w.root,{root:w.root,configPath:b.configPath??w.configPath,commands:[...new Set([...b.commands??[],...w.commands??[]])],inspectPluginConfig:!!(b.inspectPluginConfig||w.inspectPluginConfig)}),v):(v.set(w.root,w),v)},new Map).values()],E=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:_,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:E.length>0?`${E.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(_.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function wc(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 Be(e,t){if(Array.isArray(e)){for(let n of e)Be(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):Be(o,t);}function rn(e){return [...e.matchAll(Ma)].map(t=>t[1])}function kc(e){let t=new Map,n=qe(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 bc(e){let t=spawnSync("bash",["--noprofile","--norc","-n"],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??"",BASH_ENV:"",ENV:""},input:e,timeout:2e3});return t.error!==void 0||t.status!==0}function Sc(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function sn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function ue(e,t){return t===e||t.startsWith(`${e}${sep}`)}function ln(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>at)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>at)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,at+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>at)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 _c(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)){ue(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(!ue(g,f)){o.escapedArtifacts.push(u);return}let m=`${f}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),r.push({...c,path:f,depth:l}));};for(let c of n){let l=qo(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of te(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>=cr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=ln(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 m of te(d,f,g))o.findings.push({artifact:l,endpoint:m});if(f){let m=qo(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}else if(g==="node"||g==="python"){let m=fr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}}}function Pc(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=wc(r),c=0,l=(f,m=false,p=r,h="infer",y=e,_=0)=>{if(_>mn){o.traversalLimitRoots.push(r);return}let E=realpathSync.native(p),v=resolve(f);if(!existsSync$1(v)){if(!ue(E,v)){o.escapedArtifacts.push(v);return}m&&o.missing.push(v);return}let w;try{w=realpathSync.native(v);}catch{m&&o.missing.push(v);return}if(!ue(E,w)){o.escapedArtifacts.push(v);return}let b=`${w}:${h}:${y}`;i.has(b)||(i.add(b),s.push({path:w,parserKind:h,cwd:y,depth:_}));},u=(f,m,p,h=0)=>{for(let y of rn(f)){let _=sn(r,y);if(!_)continue;let E=(m.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(_,true,r,E?.parserKind??"infer",E?.cwd??p,h);}},d=(f,m,p=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let _=y.nodeResolutionKind?pn(y,!h):{reference:ne(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(_.malformed){o.malformedCommands.push(y.value);continue}if(_.inlineContent)for(let E of te(_.inlineContent.content,false,"node"))o.findings.push({artifact:_.inlineContent.source,endpoint:E});_.reference&&l(_.reference.path,true,h?r:_.reference.containmentRoot,_.reference.parserKind,_.reference.cwd??m,p);}},g=f=>{for(let p of te(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=ut(f,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(f),u(f,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let h=hr(p),y=(m.artifacts??[]).find(_=>_.value===p);h===r&&l(p,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"),m=join$1(r,"hooks.json"),p=existsSync$1(m)?m:f;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!ue(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=ln(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(un(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let _=JSON.parse(y.content),E=[];Be(_,E);for(let v of E)g(v);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=cr){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=ln(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(un(m,p.reason));continue}let{content:h}=p;o.inspected.push(m);let y=f.parserKind==="infer"?gr(m,h):f.parserKind,_=y==="shell";for(let w of te(h,_,y))o.findings.push({artifact:m,endpoint:w});if(_){let w=kc(h),b=ut(w,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});bc(h)&&o.malformedCommands.push(m),u(w,b,dirname(m),f.depth+1),d(b,dirname(m),f.depth+1,true);}else if(y==="node"||y==="python"){let w=fr(m,h,y,{project:e,homePath:t,cwd:dirname(m)},false);(y==="node"?Sc(m):w.malformed)&&o.malformedCommands.push(m);for(let b of w.inlineContents)for(let O of te(b.content,false,"node"))o.findings.push({artifact:b.source,endpoint:O});for(let b of w.references){let O=relative(r,resolve(b.path));!O.startsWith(`..${sep}`)&&O.split(sep).includes("node_modules")||l(b.path,true,r,b.parserKind,b.cwd,f.depth+1);}for(let b of rn(h)){let O=sn(r,b);O&&l(O,true,r,y,f.cwd,f.depth+1);}}else for(let w of rn(h)){let b=sn(r,w);b&&l(b,true,r,y,f.cwd,f.depth+1);}let E=m.startsWith(`${r}/`)?m.slice(r.length+1):"",v=basename(E).replace(/\.js$/,"");a&&(E.startsWith("hooks/")||E.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),E.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function Rc(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=M(we(t)),r=M(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=M(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=de(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 Xo(e){try{let t=M(we(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Cc(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Rc(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 _=M(we(d)),E=M(_?.hooks),v=[];Be(E?.SessionStart,v),v.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Xo(i),f=Xo(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(_=>_!==g))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let _=readFileSync$1(h,"utf8");(!existsSync$1(y)||!_.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 Ec(e,t){let n=vc(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 q of D.commands){o.commandsInspected.push({configPath:D.path,command:q});for(let re of te(q,true))o.findings.push({artifact:D.path,endpoint:re});}}_c(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(q=>q.commands?.includes(D))),o);for(let D of n.targets)Pc(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,q,re)=>re.findIndex(ge=>ge.configPath===D.configPath&&ge.command===D.command)===q),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,q,re)=>re.findIndex(ge=>ge.artifact===D.artifact&&ge.endpoint===D.endpoint)===q),m=a.length>0||g.length>0||u.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Cc(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,_=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),E=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}:E?{root:E,version:null}:Ye(_,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=v.root,b=w?$e(_,w):[],O=b.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),B=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(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:b.length,target:0,ok:b.length===0,severity:"error"},{key:"shadowed_skills",value:b,target:[],ok:b.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:O,target:[],ok:true,severity:"info"}],K=v.version??h.versionRecords.find(D=>D.root===w)?.packageVersion;return K&&B.push({key:"active_plugin_version",value:K,ok:true,severity:"info"}),{name:"Legacy paths",status:T(B),metrics:B}}function Dc(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function mt(e){let t=Dc(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/Ee: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 $c(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=V(i,t);let l=(H(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:j(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:T(n),metrics:n}}function Ac(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=V(o,t),!H(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*Ee,i=r.prepare(`
116
116
  SELECT source, COUNT(*) count FROM memories
117
117
  WHERE created_at >= ? GROUP BY source ORDER BY source
118
118
  `).all(s),a=r.prepare(`
@@ -120,9 +120,9 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd(
120
120
  SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
121
121
  SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
122
122
  FROM memories WHERE status = 'active'
123
- `).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 xc(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=V(o,t),!H(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 Oc(e){let{manifest:t,metrics:n}=mt(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 Tc(e){let{manifest:t,metrics:n}=mt(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 Nc(e){let{manifest:t,metrics:n}=mt(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 Ic(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 Mc(e){let{manifest:t,metrics:n}=mt(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??Ic)(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 hn(e={},t={}){let n=e.project??process.cwd(),o=cn(n),r=[ba(n,t),Ea(o.path,t),Ec(o.path,t),Da(o.path,t),Aa(o.path,!!e.strict,t),Ac(o.path,t),$c(o.path,t),xc(o.path,t),Oc(t),Tc(t),Oa(t),Nc(t),xa(t),await Mc(t),Na(t)],s=e.strict&&r.some(i=>i.status!=="green")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:r,exitCode:s}}function jc(e,t={}){return e===void 0?wr():hn(e,t)}function er(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function vr(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: ${er(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${er(s.value)}${i}`);}}return t.join(`
124
- `)}async function Lc(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await hn(e,n);return t.stdout(e.json?JSON.stringify(o):vr(o)),o.exitCode}async function pt(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function wr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await pt(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 m=await Ue(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),u&&(p+=15),g>0&&(p+=10),l>0&&(p+=5),m.running&&(p+=10),f.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:m.running},toolCalls:f,readyScore:p}}async function Fc(){let{data:e}=await pt(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 Uc(){let{data:e}=await pt(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 Wc(e){let{data:t}=await pt(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 Hc(){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 it,Sa,sr,Ca,Ee,$a,Wo,Ia,Ma,cr,at,mn,lr,ur,ja,La,Fa,Bo,Qa,zo,Vo,Go,Jo,Xa,ec,tc,oc,rc,Yo,sc,cc,lc,br=A(()=>{Ze();ce();Sa={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},sr=3600*1e3;Ca=new Set(["pending","committed","expired"]);Ee=1440*60*1e3,$a=30*Ee,Wo=60*1024*1024;Ia=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Ma=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,cr=64,at=1024*1024,mn=8,lr=8,ur=64*1024;ja=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),La=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Fa=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Bo=[".cjs",".js",".mjs",".ts",".tsx"];Qa=new Set(["bash","node","python","python3","sh","tsx","zsh"]);zo=new Set(["-r","--require"]),Vo=new Set(["--experimental-loader","--import","--loader"]),Go=new Set(["-e","--eval","-p","--print"]),Jo=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Xa=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),ec=new Set(["--check","-c"]),tc=new Set(["--help","--version","-h","-v"]);oc=new Set(["-e","-eu","-o","-u","-ue"]),rc=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Yo=new Set(["-W","-X","--check-hash-based-pycs"]),sc=new Set(["--help","--version","-h","-V"]);cc=new Set(["builtin","command","env","exec","nohup","timeout"]),lc=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Sr={};$(Sr,{runMemoryMaintainCommand:()=>zc});function qc(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 zc(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:qc(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}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
125
- `)}var _r=A(()=>{});var Pr={};$(Pr,{generateToken:()=>Jc});async function Jc(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 Rr=A(()=>{});var yn={};$(yn,{reportBenchmarkCommand:()=>el,runBenchmarkCommand:()=>Xc});async function Xc(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}
123
+ `).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 xc(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=V(o,t),!H(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 Oc(e){let{manifest:t,metrics:n}=mt(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 Tc(e){let{manifest:t,metrics:n}=mt(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 Nc(e){let{manifest:t,metrics:n}=mt(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 Ic(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 Mc(e){let{manifest:t,metrics:n}=mt(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??Ic)(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 hn(e={},t={}){let n=e.project??process.cwd(),o=cn(n),r=[ba(n,t),Ea(o.path,t),Ec(o.path,t),Da(o.path,t),$a(o.path,!!e.strict,t),$c(o.path,t),Ac(o.path,t),xc(o.path,t),Oc(t),Tc(t),Oa(t),Nc(t),xa(t),await Mc(t),Na(t)],s=e.strict&&r.some(i=>i.status!=="green")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:r,exitCode:s}}function jc(e,t={}){return e===void 0?wr():hn(e,t)}function er(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function vr(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: ${er(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${er(s.value)}${i}`);}}return t.join(`
124
+ `)}async function Lc(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await hn(e,n);return t.stdout(e.json?JSON.stringify(o):vr(o)),o.exitCode}async function pt(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function wr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await pt(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 m=await Ue(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),u&&(p+=15),g>0&&(p+=10),l>0&&(p+=5),m.running&&(p+=10),f.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:m.running},toolCalls:f,readyScore:p}}async function Fc(){let{data:e}=await pt(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 Uc(){let{data:e}=await pt(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 Wc(e){let{data:t}=await pt(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 Hc(){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 it,Sa,sr,Ca,Ee,Aa,Wo,Ia,Ma,cr,at,mn,lr,ur,ja,La,Fa,Bo,Qa,zo,Vo,Go,Jo,Xa,ec,tc,oc,rc,Yo,sc,cc,lc,br=$(()=>{Ze();ce();Sa={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},sr=3600*1e3;Ca=new Set(["pending","committed","expired"]);Ee=1440*60*1e3,Aa=30*Ee,Wo=60*1024*1024;Ia=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Ma=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,cr=64,at=1024*1024,mn=8,lr=8,ur=64*1024;ja=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),La=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Fa=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Bo=[".cjs",".js",".mjs",".ts",".tsx"];Qa=new Set(["bash","node","python","python3","sh","tsx","zsh"]);zo=new Set(["-r","--require"]),Vo=new Set(["--experimental-loader","--import","--loader"]),Go=new Set(["-e","--eval","-p","--print"]),Jo=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Xa=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),ec=new Set(["--check","-c"]),tc=new Set(["--help","--version","-h","-v"]);oc=new Set(["-e","-eu","-o","-u","-ue"]),rc=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Yo=new Set(["-W","-X","--check-hash-based-pycs"]),sc=new Set(["--help","--version","-h","-V"]);cc=new Set(["builtin","command","env","exec","nohup","timeout"]),lc=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Sr={};A(Sr,{runMemoryMaintainCommand:()=>zc});function qc(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 zc(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:qc(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(`
125
+ `)}var _r=$(()=>{});var Pr={};A(Pr,{generateToken:()=>Jc});async function Jc(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 Rr=$(()=>{});var yn={};A(yn,{reportBenchmarkCommand:()=>el,runBenchmarkCommand:()=>Xc});async function Xc(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}
126
126
 
127
127
  Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function el(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=tl(o,n);return r==="markdown"?`${s}
128
128
  ## Change From Prior Baseline
@@ -133,20 +133,20 @@ ${i.map(a=>`- ${a}`).join(`
133
133
 
134
134
  Change from ${o.runId}:
135
135
  ${i.map(a=>`- ${a}`).join(`
136
- `)}`}function tl(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 vn=A(()=>{});var Ar={};$(Ar,{runReview:()=>nl});async function nl(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(`
137
- `)}var $r=A(()=>{});var xr={};$(xr,{startAll:()=>rl});async function ol(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 rl(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Qt({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await ol(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(`
138
- Shutting down...`)),await Fe(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var Or=A(()=>{ce();});var Nr={};$(Nr,{stopAll:()=>sl});async function sl(){let e=await Fe();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var Ir=A(()=>{ce();});var jr={};$(jr,{showStatus:()=>dl});function ul(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 dl(){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 Ue(),t=e.port??ot;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=Ye(n),r=o.root?Ae(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]:[],...ul(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Lr=A(()=>{ce();Ze();});var Wr={};$(Wr,{setupCommand:()=>bl});function wl(){let e=[resolve$1(dirname$1(vl.resolve("../../package.json")),"dist","plugin"),resolve$1(process.cwd(),"plugins","claude-code")];for(let t of e)if(existsSync(join(t,".claude-plugin","plugin.json")))return t;return null}function kl(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let o={...n,...t};writeFileSync(e,JSON.stringify(o,null,2));}async function bl(e){if(console.log(S.blue("DevFlow Setup")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await Ft({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(S.green(` \u2713 MCP: ${n}`));}catch(t){console.log(S.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(S.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=wl();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let o=join(n,"known_marketplaces.json");kl(o,{devflow:{source:{directory:t}}}),console.log(S.green(` \u2713 Plugin registered: ${t}`));}else console.log(S.yellow(" \u26A0 Plugin directory not found")),console.log(S.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(S.green("Setup complete!")),console.log(S.dim("Restart Claude Code to use /devflow:* commands"));}var vl,Hr=A(()=>{Ut();vl=createRequire(import.meta.url);});var Br={};$(Br,{pluginListCommand:()=>_l});var _l,Kr=A(()=>{Qe();_l=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Pe();if(e.installed){let n=Hn();if(n.length===0){console.log("No plugins installed."),console.log(`
136
+ `)}`}function tl(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 vn=$(()=>{});var $r={};A($r,{runReview:()=>nl});async function nl(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(`
137
+ `)}var Ar=$(()=>{});var xr={};A(xr,{startAll:()=>rl});async function ol(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 rl(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Qt({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await ol(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(`
138
+ Shutting down...`)),await Fe(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var Or=$(()=>{ce();});var Nr={};A(Nr,{stopAll:()=>sl});async function sl(){let e=await Fe();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var Ir=$(()=>{ce();});var jr={};A(jr,{showStatus:()=>dl});function ul(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 dl(){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 Ue(),t=e.port??ot;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=Ye(n),r=o.root?$e(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]:[],...ul(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Lr=$(()=>{ce();Ze();});var Wr={};A(Wr,{setupCommand:()=>bl});function wl(){let e=[resolve$1(dirname$1(vl.resolve("../../package.json")),"dist","plugin"),resolve$1(process.cwd(),"plugins","claude-code")];for(let t of e)if(existsSync(join(t,".claude-plugin","plugin.json")))return t;return null}function kl(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let o={...n,...t};writeFileSync(e,JSON.stringify(o,null,2));}async function bl(e){if(console.log(S.blue("DevFlow Setup")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await Ft({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(S.green(` \u2713 MCP: ${n}`));}catch(t){console.log(S.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(S.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=wl();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let o=join(n,"known_marketplaces.json");kl(o,{devflow:{source:{directory:t}}}),console.log(S.green(` \u2713 Plugin registered: ${t}`));}else console.log(S.yellow(" \u26A0 Plugin directory not found")),console.log(S.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(S.green("Setup complete!")),console.log(S.dim("Restart Claude Code to use /devflow:* commands"));}var vl,Hr=$(()=>{Ut();vl=createRequire(import.meta.url);});var Br={};A(Br,{pluginListCommand:()=>_l});var _l,Kr=$(()=>{Qe();_l=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Pe();if(e.installed){let n=Hn();if(n.length===0){console.log("No plugins installed."),console.log(`
139
139
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
140
140
  `),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}):
141
141
  `);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(`
142
- Install a plugin: devflow plugin install <name>`);}});});var qr={};$(qr,{pluginSearchCommand:()=>Cl});var Cl,zr=A(()=>{Qe();Cl=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Pe(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
142
+ Install a plugin: devflow plugin install <name>`);}});});var qr={};A(qr,{pluginSearchCommand:()=>Cl});var Cl,zr=$(()=>{Qe();Cl=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Pe(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
143
143
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
144
- `),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 Gr={};$(Gr,{pluginInstallCommand:()=>Al});var Al,Jr=A(()=>{Al=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Installing ${t}...`);try{execSync(`npm install -g ${t}`,{stdio:"inherit"}),console.log(`
144
+ `),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 Gr={};A(Gr,{pluginInstallCommand:()=>$l});var $l,Jr=$(()=>{$l=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Installing ${t}...`);try{execSync(`npm install -g ${t}`,{stdio:"inherit"}),console.log(`
145
145
  ${S.green("\u2713")} ${t} installed successfully`),console.log(`
146
146
  Run "devflow plugin list --installed" to verify.`);}catch(n){console.error(`
147
- ${S.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Zr={};$(Zr,{pluginUninstallCommand:()=>Ol});var Ol,Qr=A(()=>{Ol=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Uninstalling ${t}...`);try{execSync(`npm uninstall -g ${t}`,{stdio:"inherit"}),console.log(`
147
+ ${S.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Zr={};A(Zr,{pluginUninstallCommand:()=>Ol});var Ol,Qr=$(()=>{Ol=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Uninstalling ${t}...`);try{execSync(`npm uninstall -g ${t}`,{stdio:"inherit"}),console.log(`
148
148
  ${S.green("\u2713")} ${t} uninstalled successfully`);}catch(n){console.error(`
149
149
  ${S.red("\u2717")} Uninstallation failed: ${n.message}`),process.exit(1);}});});function kt(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 es=createRequire(import.meta.url),Sn="0.0.0";try{Sn=es("../package.json").version;}catch{try{Sn=es("../../package.json").version;}catch{}}var R=new Command;R.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(Sn).option("--local","Force local engine, skip server");R.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").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=Nl.join(t,a);Xr.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Xr.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
150
150
  `));}let n=kt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Fn(),Ln)),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(()=>(Wn(),Un)),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(()=>(Dt(),Et));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(Dt(),Et));await i(t);}}});R.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(no(),to));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var Ml=R.command("db").description("Manage DevFlow databases");Ml.command("consolidate").description("Merge legacy project databases into the global database").option("--project <path>","Project directory",process.cwd()).option("--dry-run","Report rows and conflicts without writing").action(async e=>{let{consolidateDatabases:t,formatConsolidateResult:n}=await Promise.resolve().then(()=>(fo(),go)),o=t(e);for(let r of n(o))console.log(r);});R.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=kt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Ut(),mo));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});R.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(wo(),vo)),o=e.backfillVectors?await n(R.opts().local):await t(R.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});R.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(bo(),ko)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:R.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});R.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Ht(),Wt)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(Ht(),Wt)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var vt=R.command("workflow").description("Workflow management");vt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(Ie(),Ne)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});vt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ie(),Ne)),o=await n(e,{input:t??""},R.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});vt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(Ie(),Ne)),t=await e(R.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});vt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(Ie(),Ne)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var ke=R.command("memory").description("Memory management");ke.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(pe(),me)),n=await t(R.opts().local,e.source);console.log(JSON.stringify(n,null,2));});ke.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(pe(),me));console.log(JSON.stringify(await t(R.opts().local,e.source),null,2));});ke.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(pe(),me)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:R.opts().local});console.log(JSON.stringify(o,null,2));});ke.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(pe(),me));await n(e,t,R.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});ke.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(pe(),me)),t=await e(R.opts().local);console.log(JSON.stringify(t,null,2));});ke.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(pe(),me)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});R.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(Co(),Ro)),o=(await t(e,void 0,void 0,R.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var _n=R.command("docs").description("Documentation index management");_n.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(`
151
151
  ${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(`
152
- All docs synced.`));}});_n.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(()=>(Vt(),zt)),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`));});_n.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(()=>(Vt(),zt));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 wt=R.command("skill").description("Plugin/Skill management");wt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Le(),je)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});wt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Le(),je)),n=await t(e,R.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});wt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Le(),je)),n=await t(e,process.cwd(),R.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});wt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Le(),je));await t(e,process.cwd(),R.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});R.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(br(),kr));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;});ke.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(()=>(_r(),Sr));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;}});R.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(Rr(),Pr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ts=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ts.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(()=>(vn(),yn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});ts.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(()=>(vn(),yn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>($r(),Ar)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Pn=R.command("server").description("Manage DevFlow server");Pn.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(()=>(ce(),rt)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});Pn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ce(),rt)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});Pn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ce(),rt)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(S.blue("The Dashboard is served by the DevFlow server.")),console.log(S.dim("Run: devflow start")),console.log(S.dim("Then open: http://localhost:13337"));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(Or(),xr));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Ir(),Nr));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Lr(),jr));await e();});R.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Hr(),Wr));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var yt=R.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Kr(),Br)),Promise.resolve().then(()=>(zr(),qr)),Promise.resolve().then(()=>(Jr(),Gr)),Promise.resolve().then(()=>(Qr(),Zr))]);yt.addCommand(e),yt.addCommand(t),yt.addCommand(n),yt.addCommand(o);}await R.parseAsync();
152
+ All docs synced.`));}});_n.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(()=>(Vt(),zt)),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`));});_n.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(()=>(Vt(),zt));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 wt=R.command("skill").description("Plugin/Skill management");wt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Le(),je)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});wt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Le(),je)),n=await t(e,R.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});wt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Le(),je)),n=await t(e,process.cwd(),R.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});wt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Le(),je));await t(e,process.cwd(),R.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});R.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(br(),kr));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;});ke.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(()=>(_r(),Sr));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;}});R.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(Rr(),Pr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ts=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ts.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(()=>(vn(),yn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});ts.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(()=>(vn(),yn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(Ar(),$r)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Pn=R.command("server").description("Manage DevFlow server");Pn.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(()=>(ce(),rt)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});Pn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ce(),rt)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});Pn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ce(),rt)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(S.blue("The Dashboard is served by the DevFlow server.")),console.log(S.dim("Run: devflow start")),console.log(S.dim("Then open: http://localhost:13337"));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(Or(),xr));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Ir(),Nr));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Lr(),jr));await e();});R.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Hr(),Wr));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var yt=R.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Kr(),Br)),Promise.resolve().then(()=>(zr(),qr)),Promise.resolve().then(()=>(Jr(),Gr)),Promise.resolve().then(()=>(Qr(),Zr))]);yt.addCommand(e),yt.addCommand(t),yt.addCommand(n),yt.addCommand(o);}await R.parseAsync();