@devflow-tools/devflow 0.18.5 → 0.18.7

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 (111) hide show
  1. package/dist/cli.js +63 -63
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/__next.__PAGE__.txt +1 -1
  4. package/dist/dashboard/__next._full.txt +1 -1
  5. package/dist/dashboard/__next._tree.txt +1 -1
  6. package/dist/dashboard/_next/static/chunks/framework-c1b02f45b1ee571e.js +1 -0
  7. package/dist/dashboard/_not-found/__next._full.txt +1 -1
  8. package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +1 -1
  9. package/dist/dashboard/_not-found/__next._tree.txt +1 -1
  10. package/dist/dashboard/_not-found.html +1 -1
  11. package/dist/dashboard/_not-found.txt +1 -1
  12. package/dist/dashboard/accuracy/__next._full.txt +1 -1
  13. package/dist/dashboard/accuracy/__next._tree.txt +1 -1
  14. package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +1 -1
  15. package/dist/dashboard/accuracy.html +1 -1
  16. package/dist/dashboard/accuracy.txt +1 -1
  17. package/dist/dashboard/benchmark/__next._full.txt +1 -1
  18. package/dist/dashboard/benchmark/__next._tree.txt +1 -1
  19. package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +1 -1
  20. package/dist/dashboard/benchmark.html +1 -1
  21. package/dist/dashboard/benchmark.txt +1 -1
  22. package/dist/dashboard/context/__next._full.txt +1 -1
  23. package/dist/dashboard/context/__next._tree.txt +1 -1
  24. package/dist/dashboard/context/__next.context.__PAGE__.txt +1 -1
  25. package/dist/dashboard/context.html +1 -1
  26. package/dist/dashboard/context.txt +1 -1
  27. package/dist/dashboard/doctor/__next._full.txt +1 -1
  28. package/dist/dashboard/doctor/__next._tree.txt +1 -1
  29. package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +1 -1
  30. package/dist/dashboard/doctor.html +1 -1
  31. package/dist/dashboard/doctor.txt +1 -1
  32. package/dist/dashboard/executions/__next._full.txt +1 -1
  33. package/dist/dashboard/executions/__next._tree.txt +1 -1
  34. package/dist/dashboard/executions/__next.executions.__PAGE__.txt +1 -1
  35. package/dist/dashboard/executions.html +1 -1
  36. package/dist/dashboard/executions.txt +1 -1
  37. package/dist/dashboard/graph/__next._full.txt +1 -1
  38. package/dist/dashboard/graph/__next._tree.txt +1 -1
  39. package/dist/dashboard/graph/__next.graph.__PAGE__.txt +1 -1
  40. package/dist/dashboard/graph.html +1 -1
  41. package/dist/dashboard/graph.txt +1 -1
  42. package/dist/dashboard/index.html +1 -1
  43. package/dist/dashboard/index.txt +1 -1
  44. package/dist/dashboard/intelligence/__next._full.txt +1 -1
  45. package/dist/dashboard/intelligence/__next._tree.txt +1 -1
  46. package/dist/dashboard/intelligence/__next.intelligence.__PAGE__.txt +1 -1
  47. package/dist/dashboard/intelligence/knowledge/__next._full.txt +1 -1
  48. package/dist/dashboard/intelligence/knowledge/__next._tree.txt +1 -1
  49. package/dist/dashboard/intelligence/knowledge/__next.intelligence.knowledge.__PAGE__.txt +1 -1
  50. package/dist/dashboard/intelligence/knowledge.html +1 -1
  51. package/dist/dashboard/intelligence/knowledge.txt +1 -1
  52. package/dist/dashboard/intelligence/memory/__next._full.txt +1 -1
  53. package/dist/dashboard/intelligence/memory/__next._tree.txt +1 -1
  54. package/dist/dashboard/intelligence/memory/__next.intelligence.memory.__PAGE__.txt +1 -1
  55. package/dist/dashboard/intelligence/memory.html +1 -1
  56. package/dist/dashboard/intelligence/memory.txt +1 -1
  57. package/dist/dashboard/intelligence.html +1 -1
  58. package/dist/dashboard/intelligence.txt +1 -1
  59. package/dist/dashboard/knowledge/__next._full.txt +1 -1
  60. package/dist/dashboard/knowledge/__next._tree.txt +1 -1
  61. package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +1 -1
  62. package/dist/dashboard/knowledge.html +1 -1
  63. package/dist/dashboard/knowledge.txt +1 -1
  64. package/dist/dashboard/memory/__next._full.txt +1 -1
  65. package/dist/dashboard/memory/__next._tree.txt +1 -1
  66. package/dist/dashboard/memory/__next.memory.__PAGE__.txt +1 -1
  67. package/dist/dashboard/memory.html +1 -1
  68. package/dist/dashboard/memory.txt +1 -1
  69. package/dist/dashboard/replay/__next._full.txt +1 -1
  70. package/dist/dashboard/replay/__next._tree.txt +1 -1
  71. package/dist/dashboard/replay/__next.replay.__PAGE__.txt +1 -1
  72. package/dist/dashboard/replay.html +1 -1
  73. package/dist/dashboard/replay.txt +1 -1
  74. package/dist/dashboard/runs/_/__next._full.txt +1 -1
  75. package/dist/dashboard/runs/_/__next._tree.txt +1 -1
  76. package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +1 -1
  77. package/dist/dashboard/runs/_.html +1 -1
  78. package/dist/dashboard/runs/_.txt +1 -1
  79. package/dist/dashboard/runs/__next._full.txt +1 -1
  80. package/dist/dashboard/runs/__next._tree.txt +1 -1
  81. package/dist/dashboard/runs/__next.runs.__PAGE__.txt +1 -1
  82. package/dist/dashboard/runs.html +1 -1
  83. package/dist/dashboard/runs.txt +1 -1
  84. package/dist/dashboard/settings/__next._full.txt +1 -1
  85. package/dist/dashboard/settings/__next._tree.txt +1 -1
  86. package/dist/dashboard/settings/__next.settings.__PAGE__.txt +1 -1
  87. package/dist/dashboard/settings.html +1 -1
  88. package/dist/dashboard/settings.txt +1 -1
  89. package/dist/dashboard/timeline/__next._full.txt +1 -1
  90. package/dist/dashboard/timeline/__next._tree.txt +1 -1
  91. package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +1 -1
  92. package/dist/dashboard/timeline.html +1 -1
  93. package/dist/dashboard/timeline.txt +1 -1
  94. package/dist/dashboard/tool-metrics/__next._full.txt +1 -1
  95. package/dist/dashboard/tool-metrics/__next._tree.txt +1 -1
  96. package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +1 -1
  97. package/dist/dashboard/tool-metrics.html +1 -1
  98. package/dist/dashboard/tool-metrics.txt +1 -1
  99. package/dist/dashboard/workflows/__next._full.txt +1 -1
  100. package/dist/dashboard/workflows/__next._tree.txt +1 -1
  101. package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +1 -1
  102. package/dist/dashboard/workflows.html +1 -1
  103. package/dist/dashboard/workflows.txt +1 -1
  104. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  105. package/dist/plugin/dist/command-registry.json +5 -5
  106. package/dist/plugin/package.json +14 -14
  107. package/package.json +16 -16
  108. package/plugin-registry.json +29 -29
  109. package/dist/dashboard/_next/static/chunks/framework-3b2aca1ee87fa7ee.js +0 -1
  110. /package/dist/dashboard/_next/static/{EvEIGY0RpP7e0gDVLEPam → PfeZke3w547xZY5zc3H-0}/_buildManifest.js +0 -0
  111. /package/dist/dashboard/_next/static/{EvEIGY0RpP7e0gDVLEPam → PfeZke3w547xZY5zc3H-0}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -1,51 +1,51 @@
1
1
  #!/usr/bin/env node
2
- import {LogCleanupService}from'@devflow-tools/telemetry';import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {createHash,createHmac,randomUUID}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 {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,createRuntimeManager,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,resolveStableProjectIdentity,selectHostAdapter,loadPluginsWithDiagnostics,readRuntimeState,getDevFlowStateRoot,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,getDaemonRegistryPath,getProjectStateDir,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import Zt,{existsSync,readFileSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import mo,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import Do from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import {projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';import Rc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {Command}from'commander';var ii=Object.defineProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var A=(e,t)=>{for(var n in t)ii(e,n,{get:t[n],enumerable:true});};var vo={};A(vo,{renderLogCleanupResult:()=>gi,runLogsCleanupCommand:()=>di});function ho(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function di(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:ho(e.olderThanDays,"older-than"),maxBytes:ho(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function yo(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function gi(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${yo(e.deletedBytes)}`,` Remaining: ${yo(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
3
- `)}var ko=D(()=>{});function xt(){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 De(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 Si)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:wo(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,nn);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:wo(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 nt(e,t){let n=_i(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=_o(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=tn(c.content),d=readFileSync$1(l,"utf-8"),g=tn(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 So(e,t,n,o=Date.now,r={}){let s=nt(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()||tn(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)}
4
- `,"utf-8"),a}function _i(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=_o(r);s&&t.set(s.name,r);}return t}function _o(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 tn(e){return createHash("sha256").update(e).digest("hex")}function wo(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 Ro(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=de(t.enabledPlugins)?t.enabledPlugins:{};n[Et]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",Be),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[Be]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
5
- `);}function Eo(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 Ot(e,t,n){let o=join$1(t,Be,nn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Pt(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)&&Pt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Pt(a,join$1(o,"skills")),Pi(o,e),Ci(o),Ri(t,o),Ei(t,o,n);}function Ri(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:nn,source:s}]},null,2)}
6
- `);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[Be]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
7
- `);}function Ei(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!de(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Et];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Et}`);let c=a??[],l=c.find(f=>de(f)&&f.scope==="user"),u=new Date().toISOString(),d=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!de(f)||f.scope!=="user");i[Et]=[...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)}
8
- `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Pi(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Pt(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()?Pt(o,r):cpSync(o,r,{force:true});}}function Ci(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 Et,Be,nn,Si,Je=D(()=>{Et="devflow@devflow-local",Be="devflow-local",nn="devflow",Si=["devflow@devflow-local","devflow@devflow"];});var Ao={};A(Ao,{initProject:()=>Ni,renderInitReport:()=>Oo});async function Ni(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(xo.isInitialized(e)||await xo.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,Oo(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=xt(),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";Ot(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=So(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");Ro(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=$i.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}Eo(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Oo(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(`
9
- `)}var xo,$i,jo=D(()=>{Je();xo=Do.default??Do,$i=createRequire(import.meta.url);});var $o={};A($o,{reviewPluginMemoryHints:()=>Li});async function Li(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Fi).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let u of r){let d=s.get(u);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${u}:${g.key}`,pluginName:u,convention:g});}if(i.length===0)return {available:0,selected:0};let a=i.map(u=>({name:`${u.pluginName}: ${u.convention.value}`,value:u.id,checked:false})),c=await(n.select??(u=>checkbox({message:"Select optional plugin memory hints to save",choices:u})))(a),l=i.filter(u=>c.includes(u.id));return l.length>0&&await(n.write??Hi)(e,l),{available:i.length,selected:l.length}}function Fi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Hi(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}`},{actorId:"actor:devflow-cli",sessionId:"session:plugin-memory-hints"});}finally{n.close();}}var No=D(()=>{});function Oe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ji,"../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 Io(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Ki,Ji,At=D(()=>{Ki=fileURLToPath$1(import.meta.url),Ji=dirname$1(Ki);});async function N(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??ta();if(!r)return n();let s=oa(r),i=false,a=To.get(r);if(a&&Date.now()-a.ts<ea?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await na(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),To.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function ta(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function na(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function oa(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var To,ea,be=D(()=>{To=new Map,ea=3e4;});var Lo=D(()=>{});var rt={};A(rt,{installSkill:()=>Ae,listSkills:()=>qo,listSkillsSync:()=>la,searchSkills:()=>ua,uninstallSkill:()=>ln});async function qo(e){return N(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function la(){return []}async function ua(e,t){let n=await qo(),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 Ko(e){let t=e.trim().replace(/^@devflow-tools\/(?:plugin-)?/,"");if(!/^[a-z0-9-]+$/.test(t))throw new Error(`Invalid plugin name: ${e}`);return `@devflow-tools/plugin-${t}`}function Jo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function zo(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
10
- `,"utf-8"),renameSync$1(o,n);}async function Ae(e,t=process.cwd(),n){return N(t,async o=>await o.installPlugin(e),async()=>{let o=Ko(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(ot,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",ot,o],{stdio:"pipe",timeout:6e4});let a=Jo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),zo(t,a));let c=[],l="0.0.0",u=join(ot,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function ln(e,t=process.cwd(),n){return N(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Ko(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Jo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),zo(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",ot,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(ot,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var ot,Se=D(()=>{be();Lo();ot=getPluginInstallRoot();});var un={};A(un,{detectTechStack:()=>ga,guidePluginInstallation:()=>fa,installPluginsFromList:()=>ma,resolvePluginName:()=>Go});function ga(e){let t=Oe();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Go(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function ma(e){let t=e.split(",").map(Go).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Ae(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function fa(e){let t=Oe();if(t.plugins.length===0)return console.log(`
2
+ import {readFileSync as readFileSync$1,existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import {DeliveryLineError,createDeliveryLineFacade}from'@devflow-tools/delivery-line';import {LogCleanupService}from'@devflow-tools/telemetry';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {resolveStableProjectIdentity,loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,createRuntimeManager,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,readRuntimeState,getDevFlowStateRoot,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,getDaemonRegistryPath,getProjectStateDir,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import Zt,{existsSync,readFileSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import mo,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import Ao from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import {projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';import Lc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';var mi=Object.defineProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)mi(e,n,{get:t[n],enumerable:true});};var ko={};j(ko,{createDefaultDeliveryCommand:()=>wi,createDeliveryCommand:()=>vo,deliveryCliError:()=>yo});function yo(e){let t=e instanceof DeliveryLineError?e.code:"DELIVERY_INTERNAL_ERROR",n=e instanceof Error?e.message:"Delivery operation failed",o=/token|secret|password|transcript/i.test(n)?"Delivery operation failed":n.slice(0,500);return {ok:false,error:{code:t,message:o}}}function vo(e){let t=new Command("delivery").description("Run the complete, auditable development delivery line"),n=(i,a)=>({actor:{id:String(i.actor??"cli-user"),kind:"human",...i.actorRole?{role:String(i.actorRole)}:{}},sessionId:String(i.session??"cli-session"),executionId:String(i.execution??"cli-execution"),idempotencyKey:a,contextReceipt:String(i.contextReceipt)}),o=i=>i.requiredOption("--idempotency-key <key>").requiredOption("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),r=(i,a)=>console.log(a?JSON.stringify(i,null,2):JSON.stringify(i)),s=async(i,a)=>{try{r(await i(),a);}catch(c){r(yo(c),a),process.exitCode=1;}};o(t.command("create").requiredOption("--input <file>").option("--project <path>","Project root",process.cwd()).option("--base-ref <ref>","Base ref","HEAD").option("--target-ref <ref>","Protected target ref","main").option("--title <title>")).action(async i=>{let a=readFileSync$1(i.input,"utf8");await s(()=>e.createCase({...n(i,i.idempotencyKey),projectRoot:i.project,baseRef:i.baseRef,targetRef:i.targetRef,title:i.title??a.trim()}),i.json);}),t.command("status").argument("<caseId>").option("--json").action(async(i,a)=>s(()=>e.status(i),a.json)),o(t.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(i,a)=>s(()=>e.answer(i,{...n(a,a.idempotencyKey),turn:Number(a.turn),value:a.value}),a.json)),o(t.command("revise").argument("<caseId>").requiredOption("--phase <phase>").requiredOption("--input <file>")).action(async(i,a)=>s(()=>e.revise(i,{...n(a,a.idempotencyKey),phase:a.phase,content:readFileSync$1(a.input,"utf8")}),a.json)),o(t.command("compare").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--decision <option>")).action(async(i,a)=>s(()=>e.compareOptions(i,{...n(a,a.idempotencyKey),turn:Number(a.turn),option:a.decision}),a.json));for(let[i,a]of [["approve","approve"],["reject","reject"]])o(t.command(i).argument("<caseId>").requiredOption("--turn <n>").requiredOption("--stage <stage>").requiredOption("--reason <reason>").option("--artifact-hash <hash>")).action(async(c,l)=>s(()=>e[a](c,{...n(l,l.idempotencyKey),turn:Number(l.turn),stage:l.stage,...l.artifactHash?{artifactHash:l.artifactHash}:{},reason:l.reason}),l.json));return o(t.command("resume").argument("<caseId>").option("--continue","Resume the same recoverable case")).action(async(i,a)=>s(()=>e.resume(i,n(a,a.idempotencyKey)),a.json)),o(t.command("cancel").argument("<caseId>").requiredOption("--reason <reason>")).action(async(i,a)=>s(()=>e.cancel(i,{...n(a,a.idempotencyKey),reason:a.reason}),a.json)),o(t.command("retry-task").argument("<caseId>").requiredOption("--task-id <taskId>")).action(async(i,a)=>s(()=>e.retryTask(i,{...n(a,a.idempotencyKey),taskId:a.taskId}),a.json)),o(t.command("export").argument("<caseId>").requiredOption("--path <path>")).action(async(i,a)=>s(()=>e.export(i,{...n(a,a.idempotencyKey),path:a.path}),a.json)),t}function wi(e=process.cwd()){let t=createDeliveryLineFacade(e);return vo(t)}var wo=D(()=>{});var _o={};j(_o,{renderLogCleanupResult:()=>_i,runLogsCleanupCommand:()=>Si});function bo(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function Si(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:bo(e.olderThanDays,"older-than"),maxBytes:bo(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function So(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function _i(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${So(e.deletedBytes)}`,` Remaining: ${So(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
3
+ `)}var Ro=D(()=>{});function xt(){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 De(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 Ai)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Eo(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,nn);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:Eo(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 nt(e,t){let n=$i(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=Do(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=tn(c.content),d=readFileSync$1(l,"utf-8"),g=tn(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 Co(e,t,n,o=Date.now,r={}){let s=nt(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()||tn(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)}
4
+ `,"utf-8"),a}function $i(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=Do(r);s&&t.set(s.name,r);}return t}function Do(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 tn(e){return createHash("sha256").update(e).digest("hex")}function Eo(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 xo(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=de(t.enabledPlugins)?t.enabledPlugins:{};n[Et]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",qe),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[qe]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
5
+ `);}function Oo(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 Ot(e,t,n){let o=join$1(t,qe,nn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Pt(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)&&Pt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Pt(a,join$1(o,"skills")),Mi(o,e),Li(o),Ii(t,o),Ti(t,o,n);}function Ii(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",qe),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:qe,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:nn,source:s}]},null,2)}
6
+ `);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[qe]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
7
+ `);}function Ti(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!de(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Et];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Et}`);let c=a??[],l=c.find(f=>de(f)&&f.scope==="user"),u=new Date().toISOString(),d=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!de(f)||f.scope!=="user");i[Et]=[...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)}
8
+ `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Mi(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Pt(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()?Pt(o,r):cpSync(o,r,{force:true});}}function Li(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 Et,qe,nn,Ai,Je=D(()=>{Et="devflow@devflow-local",qe="devflow-local",nn="devflow",Ai=["devflow@devflow-local","devflow@devflow"];});var Lo={};j(Lo,{initProject:()=>Ji,renderInitReport:()=>Mo});async function Ji(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json"),s=existsSync(r),i=s?Vi(r):{},a=zi(e,i);(!s||t.force||!To(i))&&(writeFileSync(r,JSON.stringify({...i,version:"0.1.0",initialized:new Date().toISOString(),...a},null,2),"utf-8"),o.push(".devflow/config.json"));let c={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if($o.isInitialized(e)||await $o.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:l,graph:u}=await createEngines(e),{files:d,symbols:g,imports:f}=await l.indexAll(e),m=await u.build(g,f);c.indexed={files:d.length,symbols:g.length,graphNodes:m.nodes.length};}catch{c.indexed={files:0,symbols:0,graphNodes:0};}if(t.scan!==false)try{let l=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let u=join(n,"init-report.md");writeFileSync(u,Mo(l),"utf-8"),o.push(".devflow/init-report.md"),c.onboardingPack=l;}catch(l){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${l.message}`);}try{let l=xt(),u=homedir(),d=join(u,".claude","plugins","cache"),g=join(l,"package.json"),f=existsSync(g)?JSON.parse(readFileSync(g,"utf-8")).version:"0.0.0";Ot(l,d,f),c.pluginDeployed=!0;let m=join(d,"devflow-local","devflow",f);try{c.migratedLegacySkills=Co(u,m,f,Date.now,{includeModified:t.migrateLegacySkills}).map(p=>p.skillName);}catch(p){console.warn(`Warning: Legacy skill migration skipped \u2014 ${p.message}`);}}catch(l){console.warn(`Warning: Plugin deployment skipped \u2014 ${l.message}`);}try{let l=homedir(),u=join(l,".claude","settings.json");xo(u),c.pluginEnabled=!0;}catch(l){console.warn(`Warning: Plugin enablement skipped \u2014 ${l.message}`);}try{let l;try{l=Ki.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{l="devflow-mcp";}Oo(e,l),c.mcpConfigured=!0;}catch(l){console.warn(`Warning: MCP config skipped \u2014 ${l.message}`);}return c}function Vi(e){try{let t=JSON.parse(readFileSync(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return {}}}function To(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function zi(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(To(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function Mo(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(`
9
+ `)}var $o,Ki,Fo=D(()=>{Je();$o=Ao.default??Ao,Ki=createRequire(import.meta.url);});var Ho={};j(Ho,{reviewPluginMemoryHints:()=>Qi});async function Qi(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Xi).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??ea)(e,l),{available:i.length,selected:l.length}}function Xi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function ea(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}`},{actorId:"actor:devflow-cli",sessionId:"session:plugin-memory-hints"});}finally{n.close();}}var Wo=D(()=>{});function Oe(){let e=[join(process.cwd(),"plugin-registry.json"),join(ia,"../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 Uo(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var sa,ia,jt=D(()=>{sa=fileURLToPath$1(import.meta.url),ia=dirname$1(sa);});async function $(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??pa();if(!r)return n();let s=ya(r),i=false,a=qo.get(r);if(a&&Date.now()-a.ts<fa?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await ha(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),qo.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function pa(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function ha(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function ya(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var qo,fa,be=D(()=>{qo=new Map,fa=3e4;});var Ko=D(()=>{});var rt={};j(rt,{installSkill:()=>je,listSkills:()=>Zo,listSkillsSync:()=>_a,searchSkills:()=>Ra,uninstallSkill:()=>ln});async function Zo(e){return $(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function _a(){return []}async function Ra(e,t){let n=await Zo(),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 Qo(e){let t=e.trim().replace(/^@devflow-tools\/(?:plugin-)?/,"");if(!/^[a-z0-9-]+$/.test(t))throw new Error(`Invalid plugin name: ${e}`);return `@devflow-tools/plugin-${t}`}function Xo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function er(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
10
+ `,"utf-8"),renameSync$1(o,n);}async function je(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=Qo(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(ot,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",ot,o],{stdio:"pipe",timeout:6e4});let a=Xo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),er(t,a));let c=[],l="0.0.0",u=join(ot,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function ln(e,t=process.cwd(),n){return $(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Qo(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Xo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),er(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",ot,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(ot,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var ot,Se=D(()=>{be();Ko();ot=getPluginInstallRoot();});var un={};j(un,{detectTechStack:()=>Pa,guidePluginInstallation:()=>Da,installPluginsFromList:()=>Ca,resolvePluginName:()=>nr});function Pa(e){let t=Oe();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function nr(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Ca(e){let t=e.split(",").map(nr).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await je(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Da(e){let t=Oe();if(t.plugins.length===0)return console.log(`
11
11
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
12
12
  `),[];console.log(`
13
13
  \u{1F50C} Plugin Installation Guide
14
14
  `);let n=resolveProjectCapabilityProfile(e,{registry:t}),o=n.detectedStacks;o.length>0&&console.log(`Detected tech stack: ${o.join(", ")}
15
15
  `);let r=new Set(n.selectedPlugins);if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
16
- `);let a=[...r];for(let c of a)try{await Ae(c,e,!0),console.log(`\u2713 ${c}`);}catch{console.error(`\u2717 Failed to install ${c}`);}return a}let s=t.plugins.map(a=>({name:`${a.name.replace("@devflow-tools/","")} - ${a.description.substring(0,50)}`,value:a.name,checked:r.has(a.name)})),i;try{i=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:s});}catch{return console.log(`
16
+ `);let a=[...r];for(let c of a)try{await je(c,e,!0),console.log(`\u2713 ${c}`);}catch{console.error(`\u2717 Failed to install ${c}`);}return a}let s=t.plugins.map(a=>({name:`${a.name.replace("@devflow-tools/","")} - ${a.description.substring(0,50)}`,value:a.name,checked:r.has(a.name)})),i;try{i=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:s});}catch{return console.log(`
17
17
  Plugin installation cancelled.
18
18
  `),[]}if(i.length>0){console.log(`
19
19
  Installing selected plugins...
20
- `);for(let a of i)try{await Ae(a,e,!0),console.log(`\u2713 ${a}
20
+ `);for(let a of i)try{await je(a,e,!0),console.log(`\u2713 ${a}
21
21
  `);}catch{console.error(`\u2717 Failed to install ${a}
22
22
  `);}}else console.log(`
23
23
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
24
- `);return i}var dn=D(()=>{At();Se();});var ir={};A(ir,{ResetExecutionError:()=>st,executeResetCommand:()=>Ta,formatResetResult:()=>hn,runReset:()=>sr});function Ca(){if(jt)return jt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return jt=e.DatabaseSync,jt}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function hn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Da(e){return e==="all"||tr.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function mn(e){let t=resolve(e),n=[];for(;!se(t);){let o=dirname(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function yn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function xa(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 nr(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=se(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(se(t)){let o=realpathSync(t);if(!yn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Oa(e,t){return (e==="all"?tr:[e]).map(o=>({scope:o,path:join$1(t,...er[o])}))}function or(e,t){let n=se(t);if(n)return nr(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function rr(e,t){let n=or(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 Aa(e){let t=se(e);if(!t?.isFile()||t.size<gn.length)return false;let n=Buffer.alloc(gn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(gn)}finally{closeSync(o);}}function ja(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}Aa(o)&&t.push(o);}}return n(e),t}function $a(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Ca())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Na(e,t,n){let o=ja(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));$a(s,i);}}function Ia(e,t,n,o,r){let s=!!se(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),Na(c.path,join$1(i,c.scope),()=>rr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(se(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&se(t))try{rmdirSync(t);}catch{}}}function sr(e,t={}){if(!Da(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=xa(e.project??process.cwd()),o=Oa(e.scope,n);for(let c of o)nr(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=or(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?mn(e.backupTo):void 0;if(s){let c=se(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=mn(l.path),d=join$1(s,l.scope),g=mn(d);if(yn(u,g)||yn(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(se(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Ia(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),rr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new st(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Ta(e,t={},n=console){try{let o=sr(e,t),r=hn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof st)for(let r of hn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var jt,st,er,tr,gn,ar=D(()=>{st=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};er={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},tr=Object.keys(er),gn=Buffer.from("SQLite format 3\0","binary");});var hr={};A(hr,{consolidateDatabases:()=>Ha,formatConsolidateResult:()=>Wa});function Ha(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=[lr("project",o,s?n:void 0),lr("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")?Ua(o):null;try{let f=new Map;for(let y of c){let v=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);ur(y.path,v),f.set(y.kind,v);}s&&ur(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?qa(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")&&dr(p,"project_source",void 0,a.inserted),f.has("codegraph")){dr(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of ct(p,"codegraph_source").filter(R=>R.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${H(v)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw pr(m),y}finally{p?.close();}return a}finally{Ba(g);}}function Wa(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 lr(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 ct(r).filter(c=>!i||i.has(c)))o.tables[a]=bn(r,a),o.conflicts[a]=s&&ct(s).includes(a)?Ka(r,s,a):0;}finally{r.close(),s?.close();}return o}function ur(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 Ua(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 Ba(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function qa(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 pr(n),o}return n}function pr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function dr(e,t,n,o){let r=new Set(ct(e)),s=ct(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Nt(e,"main",i),c=new Set(Nt(e,t,i).map(m=>m.name)),l=a.filter(m=>c.has(m.name));if(wn.has(i)&&(l=l.filter(m=>m.pk===0)),l.length===0)continue;let u=bn(e,i),d=l.map(m=>H(m.name)).join(", "),g=l.map(m=>`s.${H(m.name)}`).join(", ");if(l.filter(m=>m.pk>0).length>0&&!wn.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${d}) SELECT ${g} FROM ${H(t)}.${H(i)} s`);else {let m=l.map(p=>`t.${H(p.name)} IS s.${H(p.name)}`).join(" AND ");e.exec(`
24
+ `);return i}var dn=D(()=>{jt();Se();});var mr={};j(mr,{ResetExecutionError:()=>st,executeResetCommand:()=>Ya,formatResetResult:()=>hn,runReset:()=>gr});function Wa(){if(Nt)return Nt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Nt=e.DatabaseSync,Nt}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function hn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Ua(e){return e==="all"||cr.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function mn(e){let t=resolve(e),n=[];for(;!se(t);){let o=dirname(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function yn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function qa(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 lr(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=se(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(se(t)){let o=realpathSync(t);if(!yn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Ba(e,t){return (e==="all"?cr:[e]).map(o=>({scope:o,path:join$1(t,...ar[o])}))}function ur(e,t){let n=se(t);if(n)return lr(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function dr(e,t){let n=ur(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 Ka(e){let t=se(e);if(!t?.isFile()||t.size<gn.length)return false;let n=Buffer.alloc(gn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(gn)}finally{closeSync(o);}}function Ja(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}Ka(o)&&t.push(o);}}return n(e),t}function Va(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Wa())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function za(e,t,n){let o=Ja(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));Va(s,i);}}function Ga(e,t,n,o,r){let s=!!se(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),za(c.path,join$1(i,c.scope),()=>dr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(se(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&se(t))try{rmdirSync(t);}catch{}}}function gr(e,t={}){if(!Ua(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=qa(e.project??process.cwd()),o=Ba(e.scope,n);for(let c of o)lr(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=ur(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?mn(e.backupTo):void 0;if(s){let c=se(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=mn(l.path),d=join$1(s,l.scope),g=mn(d);if(yn(u,g)||yn(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(se(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&Ga(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),dr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new st(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Ya(e,t={},n=console){try{let o=gr(e,t),r=hn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof st)for(let r of hn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Nt,st,ar,cr,gn,fr=D(()=>{st=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};ar={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},cr=Object.keys(ar),gn=Buffer.from("SQLite format 3\0","binary");});var _r={};j(_r,{consolidateDatabases:()=>ec,formatConsolidateResult:()=>tc});function ec(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=[hr("project",o,s?n:void 0),hr("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")?nc(o):null;try{let f=new Map;for(let y of c){let v=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);yr(y.path,v),f.set(y.kind,v);}s&&yr(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?rc(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")&&vr(p,"project_source",void 0,a.inserted),f.has("codegraph")){vr(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of ct(p,"codegraph_source").filter(R=>R.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${H(v)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw Sr(m),y}finally{p?.close();}return a}finally{oc(g);}}function tc(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 hr(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 ct(r).filter(c=>!i||i.has(c)))o.tables[a]=bn(r,a),o.conflicts[a]=s&&ct(s).includes(a)?sc(r,s,a):0;}finally{r.close(),s?.close();}return o}function yr(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 nc(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 oc(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function rc(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 Sr(n),o}return n}function Sr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function vr(e,t,n,o){let r=new Set(ct(e)),s=ct(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=$t(e,"main",i),c=new Set($t(e,t,i).map(m=>m.name)),l=a.filter(m=>c.has(m.name));if(wn.has(i)&&(l=l.filter(m=>m.pk===0)),l.length===0)continue;let u=bn(e,i),d=l.map(m=>H(m.name)).join(", "),g=l.map(m=>`s.${H(m.name)}`).join(", ");if(l.filter(m=>m.pk>0).length>0&&!wn.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${d}) SELECT ${g} FROM ${H(t)}.${H(i)} s`);else {let m=l.map(p=>`t.${H(p.name)} IS s.${H(p.name)}`).join(" AND ");e.exec(`
25
25
  INSERT INTO main.${H(i)} (${d})
26
26
  SELECT ${g} FROM ${H(t)}.${H(i)} s
27
27
  WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${m})
28
- `);}o[i]=(o[i]??0)+(bn(e,i)-u);}}function Ka(e,t,n){let o=new Set(Nt(t,"main",n).map(l=>l.name)),r=Nt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||wn.has(n))return 0;let s=r.map(l=>H(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${H(n)}`).all(),a=r.map(l=>`${H(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${H(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function ct(e,t="main"){return e.prepare(`SELECT name FROM ${H(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Nt(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function bn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${H(t)}`).get();return Number(n.count)}function H(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var wn,yr=D(()=>{wn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var vr={};A(vr,{connectAgent:()=>Va,getAvailableAgents:()=>Ga});async function Va(e){let t=[],n={command:e.command??"devflow-mcp",args:["--mode","stdio"]},o=e.agent?[e.agent]:await import('@devflow-tools/adapters').then(r=>r.detectAll());for(let r of o){let s=await connect(r,n);t.push(`${r}: ${s.configPath} (${s.written?"written":"skipped"})`);}return t}function Ga(){return listAdapters()}var kr=D(()=>{});var br={};A(br,{getIndexStatus:()=>Ya,refreshIndex:()=>Za});async function Ya(e){return N(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 Za(e){return N(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var Sr=D(()=>{be();});var _r={};A(_r,{getGraph:()=>Xa});async function Xa(e={}){let t=e.target??"all",n=e.depth??2;return N(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 Rr=D(()=>{be();});var Sn={};A(Sn,{getContext:()=>nc,getTaskContext:()=>oc});async function nc(e){return N(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 oc(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return N(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,a=`diagnostic:${stableRuntimeHash({rootPath:t,query:e.query,taskOptions:n})}`;return projectDiagnosticCodeResult(await o.buildTaskContext(e.query,n),i,{projectRoot:t,query:e.query,host:"cli",sessionId:a,executionId:a,requestId:a,turnId:a})},{skipServer:e.skipServer})}var _n=D(()=>{be();});var lt={};A(lt,{getWorkflowRuns:()=>Pr,getWorkflowStatus:()=>ic,listWorkflows:()=>rc,runWorkflow:()=>sc});async function rc(e){return N(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function sc(e,t,n){return N(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function ic(e){return Pr(e)}async function Pr(e){return N(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ut=D(()=>{be();});var Ze={};A(Ze,{cancelWorker:()=>mc,listWorkers:()=>dc,retryWorkerCleanup:()=>fc,showWorker:()=>gc,workerMergeStatus:()=>pc});function dc(e){return dt(e,t=>Ye(e.json,{projectRoot:Ge(e.projectRoot),workers:t.listWorkflowWorkers(Ge(e.projectRoot))}))}function gc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot),r=It(n,o,e);return Ye(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function mc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot),r=It(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),Ye(t.json,s)})}function fc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot),r=It(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return Ye(t.json,s)})}function pc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot);It(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Ye(t.json,r??{workerId:e,state:"not_queued"})})}function It(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function Ge(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function dt(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Ye(e,t){if(e)return JSON.stringify(t,null,2);if(hc(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(yc(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>Ye(false,o)).join(`
29
- `)}return JSON.stringify(t,null,2)}function hc(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function yc(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Qe=D(()=>{});var En={};A(En,{getEmbeddingStatus:()=>wc,prepareEmbeddings:()=>bc,renderEmbeddingStatus:()=>Sc});async function wc(){return inspectEmbeddingModel()}async function bc(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Sc(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
30
- `)}var Pn=D(()=>{});var je={};A(je,{backfillObservationVectors:()=>xc,queryMemory:()=>Pc,reviewCandidates:()=>Dc,reviewMemories:()=>Ac,setMemory:()=>Cc,showMemory:()=>Ec});async function Ec(e,t){let n=await N(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 Pc(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return N(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function Cc(e,t,n){return N(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 Dc(e){return N(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function xc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Oc(e){let t=Rc.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Ac(){let t=await N(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(`
31
- [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Oc(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await N(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await N(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
32
- Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A(Dr,{getDocsStatus:()=>Nc,queryKnowledge:()=>Cr,searchKnowledge:()=>$c,syncDocs:()=>Ic});async function Cr(e,t,n,o){return N(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=process.cwd(),s=new KnowledgeEngine({projectRoot:r,projectId:resolveStableProjectIdentity(r).projectId,embedder:new EmbeddingProvider});return getDiagnosticKnowledgeResult(s,{query:e,scope:t,budgetTokens:n},{projectRoot:process.cwd(),adapter:"cli"})},{skipServer:o})}async function $c(e,t,n){return (await Cr(e,t,void 0,n)).results}async function Nc(e){return N(process.cwd(),t=>t.getKnowledgeSources(),()=>{let t=process.cwd();return new KnowledgeEngine({projectRoot:t,projectId:resolveStableProjectIdentity(t).projectId,embedder:new EmbeddingProvider}).getSources()},{skipServer:e})}async function Ic(e,t){return N(process.cwd(),n=>n.syncDocs(e),()=>{let n=process.cwd();return new KnowledgeEngine({projectRoot:n,projectId:resolveStableProjectIdentity(n).projectId,embedder:new EmbeddingProvider}).syncDocs(e)},{skipServer:t})}var xr=D(()=>{be();});var An={};A(An,{backfillKnowledgeVectors:()=>Wc,resyncKnowledgeDocs:()=>Hc});function Or(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function Hc(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Or(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Wc(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Or(t);On(t,{phase:"started",source:e.source??"all",batchSize:e.batchSize??32});try{let r=await o.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress});return On(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw On(t,{phase:"failed",source:e.source??"all",errorCategory:Uc(r),error:r instanceof Error?r.message.slice(0,500):String(r).slice(0,500),success:false},Date.now()-n),r}finally{o.close();}}function On(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:"knowledge_vector_backfill",timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:{projectRoot:e,...t}});}finally{o.close();}}catch{}}function Uc(e){let t=e instanceof Error?e.message:String(e);return /warmup|model|embedding provider/iu.test(t)?"embedding_provider_unavailable":/dimension|vector|shape/iu.test(t)?"embedding_contract_mismatch":/sqlite|database|locked|busy/iu.test(t)?"storage_unavailable":"unexpected_backfill_failure"}var jn=D(()=>{});var Ar={};A(Ar,{inspectSkillHealth:()=>Tt,showSkillHealth:()=>Yc});function Vc(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function Tt(e){let t=e===void 0?De(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];Gc(t,n);let o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=Vc(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let d=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&d!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let g=a.get(u.name)??[];g.push(l),a.set(u.name,g);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),d=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(d)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function Gc(e,t){try{if(!JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8")).dependencies?.["@devflow-tools/memory-engine"])return;let o=readPersistedClaudeHookNode(e);if(!o){t.push({category:"runtime",path:e,reason:"Claude Hook Node identity is missing; redeploy the plugin to bind and verify native dependencies."});return}let r=resolveClaudeHookRuntime({env:{...process.env,DEVFLOW_HOOK_NODE:o}});verifyClaudeHookNativeRuntime(e,r);}catch(n){t.push({category:"runtime",path:e,reason:n instanceof Error?n.message:String(n)});}}function Yc(e={}){let t=Tt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var Nn=D(()=>{Je();});var In={};A(In,{showMcpHealth:()=>nl,showMcpInventory:()=>tl});async function tl(e={}){let t=redactMcpInventory(readMcpInventory(e.project??process.cwd()));if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.servers){let o=n.drift?.length?` [${n.drift.join(", ")}]`:"";console.log(`${n.name} ${n.transport} ${n.enabled?"enabled":"disabled"}${o}`),console.log(` sources: ${n.sourcePaths.join(", ")}`),console.log(` fingerprint: ${n.fingerprint}`);}t.duplicates.length&&console.log(`duplicates: ${t.duplicates.map(n=>n.name).join(", ")}`),t.unreadable.length&&console.error(`unreadable: ${t.unreadable.map(n=>n.path).join(", ")}`);}async function nl(e={}){let t=e.refresh?await checkMcpHealth(readMcpInventory(e.project??process.cwd())):readCachedMcpHealth(homedir$1());if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.records){let o=n.failureCategory?` ${n.failureCategory}: ${n.lastError??""}`:"";console.log(`${n.status.toUpperCase()} ${n.name} failures=${n.failureCount}${o}`);}}var Tn=D(()=>{});var ft={};A(ft,{DEFAULT_SERVER_PORT:()=>il,ensureCliRuntime:()=>Ir,getRuntimeManager:()=>Ie,resolveServerLaunch:()=>Nr,serverStatus:()=>mt,startServer:()=>Mn,stopServer:()=>Ln});function Nr(e=process.cwd()){let t=[()=>sl.resolve("@devflow-tools/server/dist/main.js"),()=>join$1(e,"node_modules","@devflow-tools","server","dist","main.js"),()=>join$1(e,"apps","server","dist","main.js")];for(let n of t)try{return {command:process.execPath,args:[n()],cwd:e}}catch{}throw new Error("DevFlow server entry point is not installed or built")}function Ie(){return createRuntimeManager()}async function Ir(e){return Ie().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:Nr(e.projectRoot)})}async function Mn(e={}){let t=e.projectRoot??process.cwd(),n=await Ir({reason:"cli-start",projectRoot:t,port:e.port,explicitPort:e.explicitPort});return {pid:n.state.pid,port:n.state.port,state:n.state,reused:n.reused}}async function Ln(){return (await Ie().stop()).stopped}async function mt(){let e=await Ie().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var sl,il,me=D(()=>{sl=createRequire$1(import.meta.url),il=13337;});var ws={};A(ws,{renderDoctorText:()=>vs,runDoctor:()=>Uu,runDoctorAudit:()=>qu,runDoctorAuditFix:()=>Ku,runDoctorCommand:()=>Bu,runDoctorReceipts:()=>zu,runDoctorViolations:()=>Ju,runLegacyDoctorReport:()=>ks,runStructuredDoctor:()=>no});function rs(){if(Lt)return Lt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Lt=e.DatabaseSync,Lt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ie(e){return {homeDir:e.homePath,env:e.env??process.env}}function qt(e){return join$1(getDevFlowStateRoot(ie(e)),"global","devflow.db")}function I(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Sl(e,t){let n=t.homePath??homedir$1(),o=ie(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let h=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:h,target:"unsupported capabilities have explicit degradation",ok:h.every(y=>y.status==="supported"||!!(y.reason&&y.fallback)),severity:"error"});}let i=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),a=i.diagnostics.filter(h=>h.status==="failed");r.push({key:"plugin_runtime",value:i.diagnostics,target:"configured plugins loadable with diagnostics",ok:a.length===0,severity:"warning"});let c=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));r.push({key:"mcp_inventory",value:{servers:c.servers.length,duplicates:c.duplicates.length,unreadable:c.unreadable.length},target:{duplicates:0,unreadable:0},ok:c.unreadable.length===0,severity:c.unreadable.length>0?"error":"info"}),r.push({key:"mcp_configuration_drift",value:c.duplicates.filter(h=>h.fingerprints.length>1).map(h=>h.name),target:[],ok:c.duplicates.every(h=>h.fingerprints.length===1),severity:"warning"});let l=await checkMcpHealth(c,n),u=l.records.filter(h=>h.status==="unhealthy");r.push({key:"mcp_health",value:l.records,target:"no unhealthy enabled servers",ok:u.length===0,severity:"warning"});let d=t.activePluginRoot??De(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(d){let h=Tt(d);r.push({key:"skill_health",value:{root:h.pluginRoot,skills:h.skills,commands:h.commands,issues:h.issues},target:"valid and fully bound installed skills",ok:h.healthy,severity:"warning"});}let g=readRuntimeState(o);r.push({key:"runtime_state_v2",value:g??"not registered",target:"ready while active, stopped or absent while idle",ok:!g||g.status==="ready"||g.status==="stopped",severity:g?.status==="failed"?"error":"warning"});let f=join$1(getDevFlowStateRoot(o),["runtime","endpoint.json"].join("-"));r.push({key:"legacy_runtime_endpoint_ignored",value:existsSync$1(f),target:false,ok:!existsSync$1(f),severity:"warning"});let m=(t.now??Date.now)(),p=listRuntimeHttpCircuits(o).filter(h=>h.status==="open"&&(h.openUntil??0)>m);return r.push({key:"runtime_http_circuits",value:p,target:[],ok:p.length===0,severity:p.some(h=>h.failures>=2)?"error":"warning"}),{name:"Contract",status:I(r),metrics:r}}function Jn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function _l(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!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Rl(e,t){let n=Jn(e),o=ie(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(f=>_l(f).length>0);i.push({key:"daemon_registry",value:l.length===0?"valid":"malformed",target:"valid daemon entry array",ok:l.length===0,severity:l.length===0?"info":"warning"}),i.push({key:"invalid_daemon_registry_entries",value:l.length,target:0,ok:l.length===0,severity:"warning"});let u=c.filter(f=>{if(typeof f!="object"||f===null)return !1;let m=f;return typeof m.rootPath!="string"||m.rootPath.length===0?!1:Jn(m.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let d=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:d,target:[s],ok:!0,severity:"info"});let g=u.filter((f,m)=>f.projectHash!==r||d[m]!==s).length;i.push({key:"daemon_identity_mismatches",value:g,target:0,ok:g===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:I(i),metrics:i}}function Pl(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(El)){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 ss(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 Cl(e){let t=ss(e);return t&&t.length>0?t:null}function Hn(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 Dl(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Mr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Ol(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:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(rs())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Pl(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
28
+ `);}o[i]=(o[i]??0)+(bn(e,i)-u);}}function sc(e,t,n){let o=new Set($t(t,"main",n).map(l=>l.name)),r=$t(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||wn.has(n))return 0;let s=r.map(l=>H(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${H(n)}`).all(),a=r.map(l=>`${H(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${H(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function ct(e,t="main"){return e.prepare(`SELECT name FROM ${H(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function $t(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function bn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${H(t)}`).get();return Number(n.count)}function H(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var wn,Rr=D(()=>{wn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var Er={};j(Er,{connectAgent:()=>cc,getAvailableAgents:()=>lc});async function cc(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 lc(){return listAdapters()}var Pr=D(()=>{});var Dr={};j(Dr,{getIndexStatus:()=>uc,refreshIndex:()=>dc});async function uc(e){return $(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function dc(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var xr=D(()=>{be();});var Or={};j(Or,{getGraph:()=>mc});async function mc(e={}){let t=e.target??"all",n=e.depth??2;return $(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 jr=D(()=>{be();});var Sn={};j(Sn,{getContext:()=>hc,getTaskContext:()=>yc});async function hc(e){return $(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function yc(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return $(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,a=`diagnostic:${stableRuntimeHash({rootPath:t,query:e.query,taskOptions:n})}`;return projectDiagnosticCodeResult(await o.buildTaskContext(e.query,n),i,{projectRoot:t,query:e.query,host:"cli",sessionId:a,executionId:a,requestId:a,turnId:a})},{skipServer:e.skipServer})}var _n=D(()=>{be();});var lt={};j(lt,{getWorkflowRuns:()=>Ar,getWorkflowStatus:()=>wc,listWorkflows:()=>vc,runWorkflow:()=>kc});async function vc(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function kc(e,t,n){return $(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function wc(e){return Ar(e)}async function Ar(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ut=D(()=>{be();});var Ze={};j(Ze,{cancelWorker:()=>Cc,listWorkers:()=>Ec,retryWorkerCleanup:()=>Dc,showWorker:()=>Pc,workerMergeStatus:()=>xc});function Ec(e){return dt(e,t=>Ye(e.json,{projectRoot:Ge(e.projectRoot),workers:t.listWorkflowWorkers(Ge(e.projectRoot))}))}function Pc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot),r=It(n,o,e);return Ye(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function Cc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot),r=It(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),Ye(t.json,s)})}function Dc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot),r=It(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return Ye(t.json,s)})}function xc(e,t){return dt(t,n=>{let o=Ge(t.projectRoot);It(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Ye(t.json,r??{workerId:e,state:"not_queued"})})}function It(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function Ge(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function dt(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Ye(e,t){if(e)return JSON.stringify(t,null,2);if(Oc(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(jc(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>Ye(false,o)).join(`
29
+ `)}return JSON.stringify(t,null,2)}function Oc(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function jc(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Qe=D(()=>{});var En={};j(En,{getEmbeddingStatus:()=>$c,prepareEmbeddings:()=>Ic,renderEmbeddingStatus:()=>Tc});async function $c(){return inspectEmbeddingModel()}async function Ic(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Tc(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
30
+ `)}var Pn=D(()=>{});var Ne={};j(Ne,{backfillObservationVectors:()=>qc,queryMemory:()=>Hc,reviewCandidates:()=>Uc,reviewMemories:()=>Kc,setMemory:()=>Wc,showMemory:()=>Fc});async function Fc(e,t){let n=await $(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 Hc(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return $(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function Wc(e,t,n){return $(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 Uc(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function qc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Bc(e){let t=Lc.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Kc(){let t=await $(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(`
31
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Bc(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await $(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await $(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
32
+ Reviewed ${o}/${t.length} pending memories.`);}var Ae=D(()=>{be();});var Ir={};j(Ir,{getDocsStatus:()=>zc,queryKnowledge:()=>$r,searchKnowledge:()=>Vc,syncDocs:()=>Gc});async function $r(e,t,n,o){return $(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=process.cwd(),s=new KnowledgeEngine({projectRoot:r,projectId:resolveStableProjectIdentity(r).projectId,embedder:new EmbeddingProvider});return getDiagnosticKnowledgeResult(s,{query:e,scope:t,budgetTokens:n},{projectRoot:process.cwd(),adapter:"cli"})},{skipServer:o})}async function Vc(e,t,n){return (await $r(e,t,void 0,n)).results}async function zc(e){return $(process.cwd(),t=>t.getKnowledgeSources(),()=>{let t=process.cwd();return new KnowledgeEngine({projectRoot:t,projectId:resolveStableProjectIdentity(t).projectId,embedder:new EmbeddingProvider}).getSources()},{skipServer:e})}async function Gc(e,t){return $(process.cwd(),n=>n.syncDocs(e),()=>{let n=process.cwd();return new KnowledgeEngine({projectRoot:n,projectId:resolveStableProjectIdentity(n).projectId,embedder:new EmbeddingProvider}).syncDocs(e)},{skipServer:t})}var Tr=D(()=>{be();});var jn={};j(jn,{backfillKnowledgeVectors:()=>tl,resyncKnowledgeDocs:()=>el});function Mr(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function el(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Mr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function tl(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Mr(t);On(t,{phase:"started",source:e.source??"all",batchSize:e.batchSize??32});try{let r=await o.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress});return On(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw On(t,{phase:"failed",source:e.source??"all",errorCategory:nl(r),error:r instanceof Error?r.message.slice(0,500):String(r).slice(0,500),success:false},Date.now()-n),r}finally{o.close();}}function On(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:"knowledge_vector_backfill",timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:{projectRoot:e,...t}});}finally{o.close();}}catch{}}function nl(e){let t=e instanceof Error?e.message:String(e);return /warmup|model|embedding provider/iu.test(t)?"embedding_provider_unavailable":/dimension|vector|shape/iu.test(t)?"embedding_contract_mismatch":/sqlite|database|locked|busy/iu.test(t)?"storage_unavailable":"unexpected_backfill_failure"}var Nn=D(()=>{});var Lr={};j(Lr,{inspectSkillHealth:()=>Tt,showSkillHealth:()=>ul});function cl(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function Tt(e){let t=e===void 0?De(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];ll(t,n);let o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=cl(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let d=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&d!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let g=a.get(u.name)??[];g.push(l),a.set(u.name,g);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),d=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(d)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function ll(e,t){try{if(!JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8")).dependencies?.["@devflow-tools/memory-engine"])return;let o=readPersistedClaudeHookNode(e);if(!o){t.push({category:"runtime",path:e,reason:"Claude Hook Node identity is missing; redeploy the plugin to bind and verify native dependencies."});return}let r=resolveClaudeHookRuntime({env:{...process.env,DEVFLOW_HOOK_NODE:o}});verifyClaudeHookNativeRuntime(e,r);}catch(n){t.push({category:"runtime",path:e,reason:n instanceof Error?n.message:String(n)});}}function ul(e={}){let t=Tt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var $n=D(()=>{Je();});var In={};j(In,{showMcpHealth:()=>hl,showMcpInventory:()=>pl});async function pl(e={}){let t=redactMcpInventory(readMcpInventory(e.project??process.cwd()));if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.servers){let o=n.drift?.length?` [${n.drift.join(", ")}]`:"";console.log(`${n.name} ${n.transport} ${n.enabled?"enabled":"disabled"}${o}`),console.log(` sources: ${n.sourcePaths.join(", ")}`),console.log(` fingerprint: ${n.fingerprint}`);}t.duplicates.length&&console.log(`duplicates: ${t.duplicates.map(n=>n.name).join(", ")}`),t.unreadable.length&&console.error(`unreadable: ${t.unreadable.map(n=>n.path).join(", ")}`);}async function hl(e={}){let t=e.refresh?await checkMcpHealth(readMcpInventory(e.project??process.cwd())):readCachedMcpHealth(homedir$1());if(e.json){console.log(JSON.stringify(t,null,2));return}for(let n of t.records){let o=n.failureCategory?` ${n.failureCategory}: ${n.lastError??""}`:"";console.log(`${n.status.toUpperCase()} ${n.name} failures=${n.failureCount}${o}`);}}var Tn=D(()=>{});var ft={};j(ft,{DEFAULT_SERVER_PORT:()=>wl,ensureCliRuntime:()=>Ur,getRuntimeManager:()=>Ie,resolveServerLaunch:()=>Wr,serverStatus:()=>mt,startServer:()=>Mn,stopServer:()=>Ln});function Wr(e=process.cwd()){let t=[()=>kl.resolve("@devflow-tools/server/dist/main.js"),()=>join$1(e,"node_modules","@devflow-tools","server","dist","main.js"),()=>join$1(e,"apps","server","dist","main.js")];for(let n of t)try{return {command:process.env.DEVFLOW_SERVER_NODE??process.execPath,args:[n()],cwd:e}}catch{}throw new Error("DevFlow server entry point is not installed or built")}function Ie(){return createRuntimeManager()}async function Ur(e){return Ie().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:Wr(e.projectRoot)})}async function Mn(e={}){let t=e.projectRoot??process.cwd(),n=await Ur({reason:"cli-start",projectRoot:t,port:e.port,explicitPort:e.explicitPort});return {pid:n.state.pid,port:n.state.port,state:n.state,reused:n.reused}}async function Ln(){return (await Ie().stop()).stopped}async function mt(){let e=await Ie().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var kl,wl,me=D(()=>{kl=createRequire$1(import.meta.url),wl=13337;});var Cs={};j(Cs,{renderDoctorText:()=>Es,runDoctor:()=>nd,runDoctorAudit:()=>rd,runDoctorAuditFix:()=>sd,runDoctorCommand:()=>od,runDoctorReceipts:()=>ad,runDoctorViolations:()=>id,runLegacyDoctorReport:()=>Ps,runStructuredDoctor:()=>no});function ds(){if(Lt)return Lt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Lt=e.DatabaseSync,Lt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ie(e){return {homeDir:e.homePath,env:e.env??process.env}}function Bt(e){return join$1(getDevFlowStateRoot(ie(e)),"global","devflow.db")}function I(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Tl(e,t){let n=t.homePath??homedir$1(),o=ie(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let h=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:h,target:"unsupported capabilities have explicit degradation",ok:h.every(y=>y.status==="supported"||!!(y.reason&&y.fallback)),severity:"error"});}let i=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),a=i.diagnostics.filter(h=>h.status==="failed");r.push({key:"plugin_runtime",value:i.diagnostics,target:"configured plugins loadable with diagnostics",ok:a.length===0,severity:"warning"});let c=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));r.push({key:"mcp_inventory",value:{servers:c.servers.length,duplicates:c.duplicates.length,unreadable:c.unreadable.length},target:{duplicates:0,unreadable:0},ok:c.unreadable.length===0,severity:c.unreadable.length>0?"error":"info"}),r.push({key:"mcp_configuration_drift",value:c.duplicates.filter(h=>h.fingerprints.length>1).map(h=>h.name),target:[],ok:c.duplicates.every(h=>h.fingerprints.length===1),severity:"warning"});let l=await checkMcpHealth(c,n),u=l.records.filter(h=>h.status==="unhealthy");r.push({key:"mcp_health",value:l.records,target:"no unhealthy enabled servers",ok:u.length===0,severity:"warning"});let d=t.activePluginRoot??De(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(d){let h=Tt(d);r.push({key:"skill_health",value:{root:h.pluginRoot,skills:h.skills,commands:h.commands,issues:h.issues},target:"valid and fully bound installed skills",ok:h.healthy,severity:"warning"});}let g=readRuntimeState(o);r.push({key:"runtime_state_v2",value:g??"not registered",target:"ready while active, stopped or absent while idle",ok:!g||g.status==="ready"||g.status==="stopped",severity:g?.status==="failed"?"error":"warning"});let f=join$1(getDevFlowStateRoot(o),["runtime","endpoint.json"].join("-"));r.push({key:"legacy_runtime_endpoint_ignored",value:existsSync$1(f),target:false,ok:!existsSync$1(f),severity:"warning"});let m=(t.now??Date.now)(),p=listRuntimeHttpCircuits(o).filter(h=>h.status==="open"&&(h.openUntil??0)>m);return r.push({key:"runtime_http_circuits",value:p,target:[],ok:p.length===0,severity:p.some(h=>h.failures>=2)?"error":"warning"}),{name:"Contract",status:I(r),metrics:r}}function Jn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Ml(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!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Ll(e,t){let n=Jn(e),o=ie(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(f=>Ml(f).length>0);i.push({key:"daemon_registry",value:l.length===0?"valid":"malformed",target:"valid daemon entry array",ok:l.length===0,severity:l.length===0?"info":"warning"}),i.push({key:"invalid_daemon_registry_entries",value:l.length,target:0,ok:l.length===0,severity:"warning"});let u=c.filter(f=>{if(typeof f!="object"||f===null)return !1;let m=f;return typeof m.rootPath!="string"||m.rootPath.length===0?!1:Jn(m.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let d=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:d,target:[s],ok:!0,severity:"info"});let g=u.filter((f,m)=>f.projectHash!==r||d[m]!==s).length;i.push({key:"daemon_identity_mismatches",value:g,target:0,ok:g===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:I(i),metrics:i}}function Hl(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(Fl)){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 gs(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 Wl(e){let t=gs(e);return t&&t.length>0?t:null}function Hn(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 Ul(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Br(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Bl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(ds())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Hl(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
33
33
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
34
34
  FROM distill_leases
35
- `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let T=Cl(_.event_ids),J=ss(_.session_ids),Y=Hn(_.event_count),O=Hn(_.created_at),q=Hn(_.expires_at),x=typeof _.status=="string"&&xl.has(_.status)?_.status:null,j=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&Dl(Y,T.length);if(!j||!T||!J||!F||O===null||q===null||x===null){g+=1,_.status==="pending"&&(q===null||Mr(q,c))&&(f+=1);continue}if(!(x!=="pending"||!Mr(q,c)))for(let $ of T)d.add($);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let p=i.prepare(`
35
+ `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let T=Wl(_.event_ids),J=gs(_.session_ids),Y=Hn(_.event_count),O=Hn(_.created_at),B=Hn(_.expires_at),x=typeof _.status=="string"&&ql.has(_.status)?_.status:null,N=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&Ul(Y,T.length);if(!N||!T||!J||!F||O===null||B===null||x===null){g+=1,_.status==="pending"&&(B===null||Br(B,c))&&(f+=1);continue}if(!(x!=="pending"||!Br(B,c)))for(let A of T)d.add(A);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let p=i.prepare(`
36
36
  SELECT id
37
37
  FROM session_events
38
38
  WHERE processed = 0 AND created_at < ?
39
- `).all(c-300*1e3).filter(_=>!d.has(_.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let h=B(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),v=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:v===null?0:Math.max(0,c-v),target:"<= 300000 when no active lease is present",ok:v===null||p===0,severity:"warning"});let R=B(i,`
39
+ `).all(c-300*1e3).filter(_=>!d.has(_.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let h=q(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),v=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:v===null?0:Math.max(0,c-v),target:"<= 300000 when no active lease is present",ok:v===null||p===0,severity:"warning"});let R=q(i,`
40
40
  SELECT COUNT(*) count
41
41
  FROM session_events event
42
42
  LEFT JOIN sessions session ON session.id = event.session_id
43
43
  WHERE TRIM(event.session_id) = '' OR session.id IS NULL
44
- `);n.push({key:"orphan_memory_events",value:R,target:0,ok:R===0,severity:"error"});let k=B(i,`
44
+ `);n.push({key:"orphan_memory_events",value:R,target:0,ok:R===0,severity:"error"});let k=q(i,`
45
45
  SELECT COUNT(*) count
46
46
  FROM sessions
47
47
  WHERE status = 'active' AND created_at < ?
48
- `,c-zn);n.push({key:"stale_memory_sessions",value:k,target:0,ok:k===0,severity:"error"});let w=i.prepare(`
48
+ `,c-Vn);n.push({key:"stale_memory_sessions",value:k,target:0,ok:k===0,severity:"error"});let w=i.prepare(`
49
49
  SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
50
50
  FROM (
51
51
  SELECT project, session_id, title, COUNT(*) AS title_count
@@ -53,12 +53,12 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A
53
53
  GROUP BY project, session_id, title
54
54
  HAVING COUNT(*) > 1
55
55
  )
56
- `).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:I(n),metrics:n}}function Q(e,t){return (t.openDatabase??(o=>new(rs())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function B(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function is(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Vn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Al(e){let t=Vn(is(e.output)),n=Vn(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,i=!(!!e.blocked&&typeof e.block_reason=="string"&&e.block_reason.startsWith("DEVFLOW_"))&&(!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error"),a=!i&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:i,degraded:a}}function jl(e){let t=is(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=Vn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Lr(e,t){return t===0?0:e/t}function Wn(e,t){return e===0?1:t/e}async function $l(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let g;try{g=Q(s,t),M(g,"nodes")?(o=B(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let g;try{g=Q(i,t);let f=M(g,"symbols_vec_rowids")?"symbols_vec_rowids":M(g,"symbol_sources")?"symbol_sources":null;f?(r=B(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Wn(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let g;try{g=Q(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!M(g,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=B(g,`
56
+ `).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:I(n),metrics:n}}function Q(e,t){return (t.openDatabase??(o=>new(ds())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function q(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function ms(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function zn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Kl(e){let t=zn(ms(e.output)),n=zn(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,i=!(!!e.blocked&&typeof e.block_reason=="string"&&e.block_reason.startsWith("DEVFLOW_"))&&(!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error"),a=!i&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:i,degraded:a}}function Jl(e){let t=ms(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=zn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Kr(e,t){return t===0?0:e/t}function Wn(e,t){return e===0?1:t/e}async function Vl(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let g;try{g=Q(s,t),M(g,"nodes")?(o=q(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let g;try{g=Q(i,t);let f=M(g,"symbols_vec_rowids")?"symbols_vec_rowids":M(g,"symbol_sources")?"symbol_sources":null;f?(r=q(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Wn(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let g;try{g=Q(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!M(g,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=q(g,`
57
57
  SELECT COUNT(*) count
58
58
  FROM knowledge_chunks c
59
59
  JOIN knowledge_docs d ON d.id = c.doc_id
60
60
  WHERE 1 = 1 ${h}
61
- `),v=B(g,`
61
+ `),v=q(g,`
62
62
  SELECT COUNT(*) count
63
63
  FROM knowledge_vec_rowids v
64
64
  JOIN knowledge_chunks c ON c.id = v.id
@@ -72,38 +72,38 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A
72
72
  LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
73
73
  WHERE 1 = 1 ${h}
74
74
  GROUP BY d.source ORDER BY d.source
75
- `).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:Wn(T,J)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:v,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:R,target:">= 0.95",ok:R>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:w,target:"every source >= 0.95",ok:w.every(_=>_.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=Q(c,t),!M(g,"observations")||!M(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=fe(g,"observations"),m=f.has("quality_status")&&f.has("resolution_state"),h=B(g,`SELECT COUNT(*) count FROM observations ${m?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=B(g,`
75
+ `).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:Wn(T,J)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:v,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:R,target:">= 0.95",ok:R>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:w,target:"every source >= 0.95",ok:w.every(_=>_.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=Q(c,t),!M(g,"observations")||!M(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=fe(g,"observations"),m=f.has("quality_status")&&f.has("resolution_state"),h=q(g,`SELECT COUNT(*) count FROM observations ${m?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=q(g,`
76
76
  SELECT COUNT(DISTINCT e.source_id) count
77
77
  FROM embeddings e JOIN observations o ON o.id = e.source_id
78
78
  WHERE e.source_type = 'observation'
79
79
  ${m?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
80
80
  `),v=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:v,target:0,ok:v===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(getDevFlowStateRoot(ie(t)),"errors","embedder.log"),d=0;if(existsSync$1(u))try{let g=l-864e5;d=readFileSync$1(u,"utf8").split(`
81
- `).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"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function Nl(e,t,n){let o=[],r=qt(n),s=(n.now??Date.now)()-1440*60*1e3,i=(n.now??Date.now)(),a=t?"error":"warning";if(!existsSync$1(r))o.push({key:"global_telemetry_db",value:"missing",target:r,ok:false,severity:"warning"});else {let m;try{m=Q(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[x,j]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(m,j)?B(m,`SELECT COUNT(*) count FROM ${j} WHERE created_at >= ?`,s):0;o.push({key:x,value:F,ok:!0,severity:"info"});}let p=M(m,"telemetry_failures")?B(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=fe(m,"sessions"),y=fe(m,"tool_call_events"),v=fe(m,"skill_executions"),R=["id","project_root","started_at","status"].every(x=>h.has(x));if(o.push({key:"telemetry_session_schema",value:R?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:R,severity:"error"}),R){let x=B(m,`
81
+ `).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"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function zl(e,t,n){let o=[],r=Bt(n),s=(n.now??Date.now)()-1440*60*1e3,i=(n.now??Date.now)(),a=t?"error":"warning";if(!existsSync$1(r))o.push({key:"global_telemetry_db",value:"missing",target:r,ok:false,severity:"warning"});else {let m;try{m=Q(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[x,N]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(m,N)?q(m,`SELECT COUNT(*) count FROM ${N} WHERE created_at >= ?`,s):0;o.push({key:x,value:F,ok:!0,severity:"info"});}let p=M(m,"telemetry_failures")?q(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=fe(m,"sessions"),y=fe(m,"tool_call_events"),v=fe(m,"skill_executions"),R=["id","project_root","started_at","status"].every(x=>h.has(x));if(o.push({key:"telemetry_session_schema",value:R?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:R,severity:"error"}),R){let x=q(m,`
82
82
  SELECT COUNT(*) count FROM sessions
83
83
  WHERE project_root = ? AND started_at >= ?
84
- `,e,s);o.push({key:"session_start_evidence_24h",value:x,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let j=B(m,`
84
+ `,e,s);o.push({key:"session_start_evidence_24h",value:x,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let N=q(m,`
85
85
  SELECT COUNT(*) count FROM sessions
86
86
  WHERE project_root = ? AND status = 'running' AND started_at < ?
87
- `,e,(n.now??Date.now)()-zn);o.push({key:"stale_telemetry_sessions",value:j,target:0,ok:j===0,severity:"error"});let F=m.prepare(`
87
+ `,e,(n.now??Date.now)()-Vn);o.push({key:"stale_telemetry_sessions",value:N,target:0,ok:N===0,severity:"error"});let F=m.prepare(`
88
88
  SELECT status, COUNT(*) count
89
89
  FROM sessions
90
90
  WHERE project_root = ?
91
91
  GROUP BY status
92
- `).all(e),$={running:0,completed:0,failed:0};for(let L of F)L.status in $&&($[L.status]=Number(L.count));let z=$.running+$.completed+$.failed,Z=$.completed+$.failed;if(o.push({key:"project_session_closure_state",value:{total:z,...$,closed:Z,closureRate:z===0?1:Z/z},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(m,"devflow_session_closures")){let L=m.prepare(`
92
+ `).all(e),A={running:0,completed:0,failed:0};for(let L of F)L.status in A&&(A[L.status]=Number(L.count));let V=A.running+A.completed+A.failed,Z=A.completed+A.failed;if(o.push({key:"project_session_closure_state",value:{total:V,...A,closed:Z,closureRate:V===0?1:Z/V},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(m,"devflow_session_closures")){let L=m.prepare(`
93
93
  SELECT state, COUNT(*) count
94
94
  FROM devflow_session_closures
95
95
  WHERE project_root = ?
96
96
  GROUP BY state
97
- `).all(e),U={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Ue of L)Ue.state in U&&(U[Ue.state]=Number(Ue.count));let le=B(m,`
97
+ `).all(e),U={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Ue of L)Ue.state in U&&(U[Ue.state]=Number(Ue.count));let le=q(m,`
98
98
  SELECT COUNT(*) count
99
99
  FROM devflow_session_closures
100
100
  WHERE project_root = ? AND state = 'closing' AND updated_at < ?
101
- `,e,i-zn);o.push({key:"durable_session_closure_state",value:{...U,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:U.active===0&&U.closing===0&&le===0,severity:a});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:a});let ve=0;y.has("session_id")&&(ve=B(m,`
101
+ `,e,i-Vn);o.push({key:"durable_session_closure_state",value:{...U,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:U.active===0&&U.closing===0&&le===0,severity:a});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:a});let ve=0;y.has("session_id")&&(ve=q(m,`
102
102
  SELECT COUNT(*) count
103
103
  FROM tool_call_events event
104
104
  LEFT JOIN sessions session ON session.id = event.session_id
105
105
  WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
106
- `));let ce=0;if(v.has("session_id")&&(ce=B(m,`
106
+ `));let ce=0;if(v.has("session_id")&&(ce=q(m,`
107
107
  SELECT COUNT(*) count
108
108
  FROM skill_executions execution
109
109
  LEFT JOIN sessions session ON session.id = execution.session_id
@@ -118,7 +118,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A
118
118
  WHERE session.project_root = ?
119
119
  AND execution.status = 'running'
120
120
  AND (execution.started_at < ? OR session.status <> 'running')
121
- `).get(L,e,L),le=Number(U?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(U?.older_than_30m??0),attachedToNonRunningSession:Number(U?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!M(m,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let x=fe(m,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter($=>!x.has($));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let $=m.prepare(`
121
+ `).get(L,e,L),le=Number(U?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(U?.older_than_30m??0),attachedToNonRunningSession:Number(U?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!M(m,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let x=fe(m,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(A=>!x.has(A));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let A=m.prepare(`
122
122
  SELECT
123
123
  COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
124
124
  COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
@@ -130,7 +130,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A
130
130
  MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
131
131
  FROM devflow_work_items
132
132
  WHERE project_root = ?
133
- `).get(i,e),z=Number($?.queue_depth??0),Z=Number($?.pending??0),ve=Number($?.leased??0),ce=Number($?.failed??0),ke=Number($?.dead_letters??0),L=Number($?.expired_leases??0),U=$?.oldest_pending_at==null?void 0:Number($.oldest_pending_at),le=$?.last_successful_drain_at==null?void 0:Number($.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:z,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ve,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:U===void 0?0:Math.max(0,i-U),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ke,target:0,ok:ke===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}if(!M(m,"devflow_workflow_workers")||!M(m,"devflow_merge_queue"))o.push({key:"workflow_worker_schema",value:"worker or merge queue table missing",target:"canonical isolated worker lifecycle schema",ok:!1,severity:"warning"});else {let x=m.prepare(`
133
+ `).get(i,e),V=Number(A?.queue_depth??0),Z=Number(A?.pending??0),ve=Number(A?.leased??0),ce=Number(A?.failed??0),ke=Number(A?.dead_letters??0),L=Number(A?.expired_leases??0),U=A?.oldest_pending_at==null?void 0:Number(A.oldest_pending_at),le=A?.last_successful_drain_at==null?void 0:Number(A.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:V,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ve,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:U===void 0?0:Math.max(0,i-U),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ke,target:0,ok:ke===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}if(!M(m,"devflow_workflow_workers")||!M(m,"devflow_merge_queue"))o.push({key:"workflow_worker_schema",value:"worker or merge queue table missing",target:"canonical isolated worker lifecycle schema",ok:!1,severity:"warning"});else {let x=m.prepare(`
134
134
  SELECT
135
135
  COUNT(*) total,
136
136
  COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
@@ -138,62 +138,62 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A
138
138
  COALESCE(SUM(CASE WHEN lease_expires_at IS NOT NULL AND lease_expires_at <= ?
139
139
  AND state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) lost_heartbeats
140
140
  FROM devflow_workflow_workers WHERE project_root = ?
141
- `).get(i,e),j=B(m,`
141
+ `).get(i,e),N=q(m,`
142
142
  SELECT COUNT(*) count FROM devflow_merge_queue
143
143
  WHERE project_root = ? AND state = 'conflict'
144
144
  `,e),F=m.prepare(`
145
145
  SELECT MIN(created_at) oldest FROM devflow_merge_queue
146
146
  WHERE project_root = ? AND state IN ('waiting','ready')
147
- `).get(e),$=Number(x?.active??0),z=Number(x?.held??0),Z=Number(x?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:$,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:z,target:0,ok:z===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:Z,target:0,ok:Z===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:j,target:0,ok:j===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,i-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let k=getProjectStateDir(e,ie(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(x=>{let j=join$1(k,x),F=existsSync$1(j)?readdirSync(j).filter($=>$.includes(".json")).length:0;return [x,F]})),T=Object.values(_).reduce((x,j)=>x+j,0);if(o.push({key:"hook_spool_backlog",value:{total:T,..._},target:{total:0},ok:T===0,severity:a}),M(m,"tool_call_events")){let x=R&&y.has("session_id"),j=fe(m,"tool_metrics"),F=y.has("event_id")&&j.has("tool_call_event_id")&&j.has("status"),$=[y.has("error")?"event.error":"NULL error",y.has("failure_category")?"event.failure_category":"NULL failure_category",y.has("output")?"event.output":"NULL output",y.has("blocked")?"event.blocked":"0 blocked",y.has("block_reason")?"event.block_reason":"NULL block_reason",x?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),z=m.prepare(`
148
- SELECT ${$}
147
+ `).get(e),A=Number(x?.active??0),V=Number(x?.held??0),Z=Number(x?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:A,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:V,target:0,ok:V===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:Z,target:0,ok:Z===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:N,target:0,ok:N===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,i-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let k=getProjectStateDir(e,ie(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(x=>{let N=join$1(k,x),F=existsSync$1(N)?readdirSync(N).filter(A=>A.includes(".json")).length:0;return [x,F]})),T=Object.values(_).reduce((x,N)=>x+N,0);if(o.push({key:"hook_spool_backlog",value:{total:T,..._},target:{total:0},ok:T===0,severity:a}),M(m,"tool_call_events")){let x=R&&y.has("session_id"),N=fe(m,"tool_metrics"),F=y.has("event_id")&&N.has("tool_call_event_id")&&N.has("status"),A=[y.has("error")?"event.error":"NULL error",y.has("failure_category")?"event.failure_category":"NULL failure_category",y.has("output")?"event.output":"NULL output",y.has("blocked")?"event.blocked":"0 blocked",y.has("block_reason")?"event.block_reason":"NULL block_reason",x?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),V=m.prepare(`
148
+ SELECT ${A}
149
149
  FROM tool_call_events event
150
150
  ${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
151
151
  ${x?"JOIN sessions event_session ON event_session.id = event.session_id":""}
152
152
  WHERE event.timestamp >= ?
153
153
  ${x?"AND event_session.project_root = ?":""}
154
- `).all(...x?[s,e]:[s]),Z=z.map(Al),ve=Z.filter(L=>L.failed).length,ce=Z.filter((L,U)=>L.failed&&z[U]?.session_status!=="completed").length,ke=Z.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:z.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ve,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:a}),o.push({key:"semantic_tool_degradations_24h",value:ke,target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Lr(ve,z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Lr(ke,z.length),target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:x?"project":"global fallback; session identity unavailable",target:"project",ok:x,severity:"warning"}),y.has("failure_category")){let L={};for(let ue of z)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(L[ue.failure_category]=(L[ue.failure_category]??0)+1);let U=z.filter((ue,si)=>Z[si]?.failed&&ue.session_status!=="completed"),le=U.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Ue=U.length===0?1:le/U.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Ue,target:">= 0.80",ok:Ue>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let J=R&&["session_id","started_at","fallback_count","fallback_reasons"].every(x=>v.has(x)),Y=0,O={};if(J){let x=m.prepare(`
154
+ `).all(...x?[s,e]:[s]),Z=V.map(Kl),ve=Z.filter(L=>L.failed).length,ce=Z.filter((L,U)=>L.failed&&V[U]?.session_status!=="completed").length,ke=Z.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:V.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ve,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:a}),o.push({key:"semantic_tool_degradations_24h",value:ke,target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Kr(ve,V.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Kr(ke,V.length),target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:x?"project":"global fallback; session identity unavailable",target:"project",ok:x,severity:"warning"}),y.has("failure_category")){let L={};for(let ue of V)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(L[ue.failure_category]=(L[ue.failure_category]??0)+1);let U=V.filter((ue,gi)=>Z[gi]?.failed&&ue.session_status!=="completed"),le=U.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Ue=U.length===0?1:le/U.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Ue,target:">= 0.80",ok:Ue>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let J=R&&["session_id","started_at","fallback_count","fallback_reasons"].every(x=>v.has(x)),Y=0,O={};if(J){let x=m.prepare(`
155
155
  SELECT execution.fallback_count, execution.fallback_reasons
156
156
  FROM skill_executions execution
157
157
  JOIN sessions session ON session.id = execution.session_id
158
158
  WHERE session.project_root = ? AND execution.started_at >= ?
159
- `).all(e,s);for(let j of x){Y+=Number(j.fallback_count??0);for(let F of jl(j.fallback_reasons))O[F]=(O[F]??0)+1;}}let q=0;if(M(m,"devflow_hook_fallbacks")){let x=m.prepare(`
159
+ `).all(e,s);for(let N of x){Y+=Number(N.fallback_count??0);for(let F of Jl(N.fallback_reasons))O[F]=(O[F]??0)+1;}}let B=0;if(M(m,"devflow_hook_fallbacks")){let x=m.prepare(`
160
160
  SELECT reason, COUNT(*) count
161
161
  FROM devflow_hook_fallbacks
162
162
  WHERE project_root = ? AND created_at >= ?
163
163
  GROUP BY reason ORDER BY reason
164
- `).all(e,s);for(let j of x){let F=Number(j.count);q+=F,O[`hook:${j.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:Y,target:0,ok:Y===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:q,target:0,ok:q===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:O,target:{},ok:Object.keys(O).length===0,severity:"warning"});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let c=[join$1(dirname(r),"telemetry-cache")],l=0;try{l=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),d=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:d?u:"absent",target:"absent",ok:!d,severity:a});let g=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(g)){let m;try{m=Q(g,n),f=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){o.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:I(o),metrics:o}}function Hr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function as(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function Il(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(ie(e)),"keys"),r=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!r.some(([,l])=>!n[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),u=Hr(o),d=l.isDirectory()&&!l.isSymbolicLink(),g=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:d&&g,severity:d?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,u,d]of r){if(n[u]?.trim()){t.push({key:`${l}_source`,value:u,target:"environment override or generated key file",ok:true,severity:"info"});continue}let g=join$1(o,d);if(!existsSync$1(g)){t.push({key:`${l}_source`,value:"missing",target:g,ok:false,severity:"warning"});continue}try{let f=lstatSync(g),m=Hr(g),p=readFileSync$1(g,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:g,mode:m,bytes:Buffer.byteLength(p)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&p.length>0&&(process.platform==="win32"||m==="400"),severity:!h||p.length===0?"error":"warning"});}catch(f){t.push({key:`${l}_source`,value:f.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let i=join$1(getDevFlowStateRoot(ie(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-et;for(let u of readFileSync$1(i,"utf8").split(`
165
- `))if(u.trim())try{let d=JSON.parse(u),g=as(d.ts);g===null?c+=1:g>=l&&(a+=1);}catch{c+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:c,target:0,ok:c===0,severity:"error"}),{name:"Runtime security",status:I(t),metrics:t}}function Tl(e){let t=[],n=qt(e);if(!existsSync$1(n))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let o;try{if(o=Q(n,e),!M(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let r=o.prepare(`
164
+ `).all(e,s);for(let N of x){let F=Number(N.count);B+=F,O[`hook:${N.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:Y,target:0,ok:Y===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:B,target:0,ok:B===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:O,target:{},ok:Object.keys(O).length===0,severity:"warning"});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let c=[join$1(dirname(r),"telemetry-cache")],l=0;try{l=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),d=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:d?u:"absent",target:"absent",ok:!d,severity:a});let g=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(g)){let m;try{m=Q(g,n),f=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){o.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:I(o),metrics:o}}function Vr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function fs(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e!="string")return null;let t=Date.parse(e);return Number.isFinite(t)?t:null}function Gl(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(ie(e)),"keys"),r=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!r.some(([,l])=>!n[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),u=Vr(o),d=l.isDirectory()&&!l.isSymbolicLink(),g=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:d&&g,severity:d?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,u,d]of r){if(n[u]?.trim()){t.push({key:`${l}_source`,value:u,target:"environment override or generated key file",ok:true,severity:"info"});continue}let g=join$1(o,d);if(!existsSync$1(g)){t.push({key:`${l}_source`,value:"missing",target:g,ok:false,severity:"warning"});continue}try{let f=lstatSync(g),m=Vr(g),p=readFileSync$1(g,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:g,mode:m,bytes:Buffer.byteLength(p)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&p.length>0&&(process.platform==="win32"||m==="400"),severity:!h||p.length===0?"error":"warning"});}catch(f){t.push({key:`${l}_source`,value:f.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let i=join$1(getDevFlowStateRoot(ie(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-et;for(let u of readFileSync$1(i,"utf8").split(`
165
+ `))if(u.trim())try{let d=JSON.parse(u),g=fs(d.ts);g===null?c+=1:g>=l&&(a+=1);}catch{c+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:c,target:0,ok:c===0,severity:"error"}),{name:"Runtime security",status:I(t),metrics:t}}function Yl(e){let t=[],n=Bt(e);if(!existsSync$1(n))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let o;try{if(o=Q(n,e),!M(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let r=o.prepare(`
166
166
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
167
167
  FROM benchmark_reports
168
168
  ORDER BY created_at DESC
169
169
  LIMIT 1
170
- `).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/et).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=Gn,severity:c<0||!Number.isFinite(c)?"error":"warning"});}catch(r){t.push({key:"benchmark_database_read",value:r.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:I(t),metrics:t}}function Ml(e,t){let n=[],o=qt(t);if(!existsSync$1(o))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
170
+ `).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/et).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=Gn,severity:c<0||!Number.isFinite(c)?"error":"warning"});}catch(r){t.push({key:"benchmark_database_read",value:r.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:I(t),metrics:t}}function Zl(e,t){let n=[],o=Bt(t);if(!existsSync$1(o))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
171
171
  SELECT report_json, created_at
172
172
  FROM benchmark_reports
173
173
  WHERE suite_id = 'retrieval-quality' AND project_root = ?
174
174
  ORDER BY created_at DESC
175
175
  LIMIT 1
176
- `).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:Gn},ok:i.qualityStatus==="passed"&&a<=Gn,severity:i.qualityStatus==="failed"?"error":"warning"});for(let[c,l]of Object.entries(i.gates??{}))n.push({key:`retrieval_${c}`,value:i.metrics?.[c],target:i.thresholds?.[c],ok:l,severity:"error"});}catch(s){n.push({key:"retrieval_quality_read",value:s.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{r?.close();}return {name:"Retrieval quality",status:I(n),metrics:n}}function Ll(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 Fl(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(ie(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let v of readdirSync(s))v.endsWith(".log")&&r.push(join$1(s,v));}catch(v){t.push({key:"hook_fallback_directory_read",value:v.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-et,a=0,c=0;for(let v of [...new Set(r)])if(existsSync$1(v))try{for(let R of readFileSync$1(v,"utf8").split(`
177
- `))if(R.trim())try{let k=JSON.parse(R),w=as(k.ts);w===null||typeof k.reason!="string"?c+=1:w>=i&&(a+=1);}catch{c+=1;}}catch(R){t.push({key:"hook_fallback_log_read",value:{path:v,error:R.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:c,target:0,ok:c===0,severity:"error"});let l=qt(e),u=0,d=0,g=null;if(existsSync$1(l)){let v;try{if(v=Q(l,e),M(v,"telemetry_events")){let R=v.prepare(`
176
+ `).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:Gn},ok:i.qualityStatus==="passed"&&a<=Gn,severity:i.qualityStatus==="failed"?"error":"warning"});for(let[c,l]of Object.entries(i.gates??{}))n.push({key:`retrieval_${c}`,value:i.metrics?.[c],target:i.thresholds?.[c],ok:l,severity:"error"});}catch(s){n.push({key:"retrieval_quality_read",value:s.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{r?.close();}return {name:"Retrieval quality",status:I(n),metrics:n}}function Ql(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 Xl(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(ie(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let v of readdirSync(s))v.endsWith(".log")&&r.push(join$1(s,v));}catch(v){t.push({key:"hook_fallback_directory_read",value:v.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-et,a=0,c=0;for(let v of [...new Set(r)])if(existsSync$1(v))try{for(let R of readFileSync$1(v,"utf8").split(`
177
+ `))if(R.trim())try{let k=JSON.parse(R),w=fs(k.ts);w===null||typeof k.reason!="string"?c+=1:w>=i&&(a+=1);}catch{c+=1;}}catch(R){t.push({key:"hook_fallback_log_read",value:{path:v,error:R.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:c,target:0,ok:c===0,severity:"error"});let l=Bt(e),u=0,d=0,g=null;if(existsSync$1(l)){let v;try{if(v=Q(l,e),M(v,"telemetry_events")){let R=v.prepare(`
178
178
  SELECT COUNT(*) total,
179
179
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
180
180
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
181
181
  FROM telemetry_events
182
182
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
183
- `).get(i);u=Number(R?.total??0),d=Number(R?.failures??0),g=R?.average_duration==null?null:Math.round(Number(R.average_duration)*100)/100;}}catch(R){t.push({key:"hook_daemon_metrics_read",value:R.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{v?.close();}}let f=Math.max(a,d),m=Math.max(u,f),p=m===0?0:f/m;t.push({key:"hook_daemon_requests_24h",value:m,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:f===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:g??"no successful requests",target:"<= 1000",ok:g===null||g<=1e3,severity:"warning"});let h=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:h,target:[],ok:h.length===0,severity:"warning"});let y=join$1(getDevFlowStateRoot(ie(e)),"logs","hook-debug");try{let v=Ll(y);t.push({key:"hook_debug_log_bytes",value:v.bytes,target:`<= ${Fr}`,ok:v.bytes<=Fr,severity:"warning"}),t.push({key:"hook_debug_log_files",value:v.files,target:"rotated per project",ok:!0,severity:"info"});}catch(v){t.push({key:"hook_debug_log_read",value:v.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:I(t),metrics:t}}function Pe(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function He(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function ds(e,t){return Ul.has(e)&&!(t.tolerateControlSyntax&&Bl.has(e))}function wt(e,t={}){if(Buffer.byteLength(e)>us)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let d=e[u];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[u+1]===`
183
+ `).get(i);u=Number(R?.total??0),d=Number(R?.failures??0),g=R?.average_duration==null?null:Math.round(Number(R.average_duration)*100)/100;}}catch(R){t.push({key:"hook_daemon_metrics_read",value:R.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{v?.close();}}let f=Math.max(a,d),m=Math.max(u,f),p=m===0?0:f/m;t.push({key:"hook_daemon_requests_24h",value:m,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:f===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:g??"no successful requests",target:"<= 1000",ok:g===null||g<=1e3,severity:"warning"});let h=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:h,target:[],ok:h.length===0,severity:"warning"});let y=join$1(getDevFlowStateRoot(ie(e)),"logs","hook-debug");try{let v=Ql(y);t.push({key:"hook_debug_log_bytes",value:v.bytes,target:`<= ${Jr}`,ok:v.bytes<=Jr,severity:"warning"}),t.push({key:"hook_debug_log_files",value:v.files,target:"rotated per project",ok:!0,severity:"info"});}catch(v){t.push({key:"hook_debug_log_read",value:v.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:I(t),metrics:t}}function Pe(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function He(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function vs(e,t){return nu.has(e)&&!(t.tolerateControlSyntax&&ou.has(e))}function wt(e,t={}){if(Buffer.byteLength(e)>ys)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let d=e[u];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[u+1]===`
184
184
  `){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
185
185
  `){u+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let g=e.slice(u,u+2);if(d==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
186
- `;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&ql.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
187
- `].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&ds(d,t)})&&(a=true),{segments:n,malformed:a}}function Kl(e){return wt(e).segments.flat().join(" ")}function Jl(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function gs(e,t){return Jl(e,t)?"shell":/^#![^\n]*\b(?:node|tsx)\b/.test(t)?"node":/^#![^\n]*\bpython(?:3)?\b/.test(t)?"python":[".cjs",".js",".mjs",".ts"].includes(extname(e))?"node":extname(e)===".py"?"python":"infer"}function zl(e){let t=e.split(""),n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n!==null){r==="\\"?o+=1:r===n&&(n=null);continue}if(r==="'"||r==='"'||r==="`"){n=r;continue}if(r!=="/"||!["/","*"].includes(e[o+1]??""))continue;let s=e[o+1]==="*";for(t[o]=" ",t[o+1]=" ",o+=2;o<e.length;){if(s&&e[o]==="*"&&e[o+1]==="/"){t[o]=" ",t[o+1]=" ",o+=1;break}if(!s&&e[o]===`
186
+ `;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&ru.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
187
+ `].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&vs(d,t)})&&(a=true),{segments:n,malformed:a}}function su(e){return wt(e).segments.flat().join(" ")}function iu(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function ks(e,t){return iu(e,t)?"shell":/^#![^\n]*\b(?:node|tsx)\b/.test(t)?"node":/^#![^\n]*\bpython(?:3)?\b/.test(t)?"python":[".cjs",".js",".mjs",".ts"].includes(extname(e))?"node":extname(e)===".py"?"python":"infer"}function au(e){let t=e.split(""),n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n!==null){r==="\\"?o+=1:r===n&&(n=null);continue}if(r==="'"||r==='"'||r==="`"){n=r;continue}if(r!=="/"||!["/","*"].includes(e[o+1]??""))continue;let s=e[o+1]==="*";for(t[o]=" ",t[o+1]=" ",o+=2;o<e.length;){if(s&&e[o]==="*"&&e[o+1]==="/"){t[o]=" ",t[o+1]=" ",o+=1;break}if(!s&&e[o]===`
188
188
  `){o-=1;break}e[o]!==`
189
- `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Vl(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="#"){for(;n<e.length&&e[n]!==`
189
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function cu(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="#"){for(;n<e.length&&e[n]!==`
190
190
  `;)t[n]=" ",n+=1;continue}if(o!=="'"&&o!=='"')continue;let r=o,s=e.slice(n,n+3)===r.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===r.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
191
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function pe(e,t,n="infer"){let o=t?Kl(e):n==="node"?zl(e):n==="python"?Vl(e):e;return [...new Set(o.match(Hl)??[])]}function Gl(e){return wt(e).segments.flat()}function he(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Ee(a,i)?a:Ee(c,i)?c:dirname(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function Yl(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),o=e.slice(t+1),r=n.split(";").includes("base64")?Buffer.from(o,"base64"):Buffer.from(decodeURIComponent(o),"utf8");if(r.length>us||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function to(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Yl(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ht(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:he(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Fe(n))return {malformed:true};let o=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!o)return {malformed:false};let r={project:e.project,homePath:e.homePath,cwd:e.cwd};if(o){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=Ql(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:he(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:he(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:he(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Zl(e){let t=[e];extname(e)===""&&t.push(...Wr.map(n=>`${e}${n}`),...Wr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Ql(e,t,n){if(n==="cjs")try{let r=createRequire$1(t).resolve(e);return isBuiltin(r)?null:r}catch{}let o=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return Zl(o)??o}function Xl(e){let t=[],n=false;for(let o=0;o<e.length;){let r=e[o];if(/\s/.test(r)){o+=1;continue}if(r==="/"&&e[o+1]==="/"){for(o+=2;o<e.length&&e[o]!==`
191
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function pe(e,t,n="infer"){let o=t?su(e):n==="node"?au(e):n==="python"?cu(e):e;return [...new Set(o.match(eu)??[])]}function lu(e){return wt(e).segments.flat()}function he(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Ee(a,i)?a:Ee(c,i)?c:dirname(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function uu(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),o=e.slice(t+1),r=n.split(";").includes("base64")?Buffer.from(o,"base64"):Buffer.from(decodeURIComponent(o),"utf8");if(r.length>ys||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function to(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=uu(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ht(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:he(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Fe(n))return {malformed:true};let o=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!o)return {malformed:false};let r={project:e.project,homePath:e.homePath,cwd:e.cwd};if(o){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=gu(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:he(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:he(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:he(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function du(e){let t=[e];extname(e)===""&&t.push(...zr.map(n=>`${e}${n}`),...zr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function gu(e,t,n){if(n==="cjs")try{let r=createRequire$1(t).resolve(e);return isBuiltin(r)?null:r}catch{}let o=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return du(o)??o}function mu(e){let t=[],n=false;for(let o=0;o<e.length;){let r=e[o];if(/\s/.test(r)){o+=1;continue}if(r==="/"&&e[o+1]==="/"){for(o+=2;o<e.length&&e[o]!==`
192
192
  `;)o+=1;continue}if(r==="/"&&e[o+1]==="*"){let s=e.indexOf("*/",o+2);if(s<0){n=true;break}o=s+2;continue}if(r==="'"||r==='"'){let s=r,i="",a=true;o+=1;let c=false;for(;o<e.length;){let l=e[o];if(l===s){c=true,o+=1;break}if(l==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(l===`
193
- `||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 eu(e,t,n,o=true){let r=Xl(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=to(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 tu(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]!==`
193
+ `||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 fu(e,t,n,o=true){let r=mu(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=to(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 pu(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]!==`
194
194
  `;)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]===`
195
195
  `||e[d]==="\r"))break;e[d]!==`
196
- `&&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 Ur(e,t){let n=t.split(".");if(n.length>eo)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 nu(e,t,n){let o=tu(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=he(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=Ur(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&&Ur(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 k=f.slice(7).split(",");for(let w of k)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 k=c(h,p);u(k,m[3]);continue}if(p===0){s=true;continue}let y=i(p),v=join$1(y,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),u(y,m[3]);continue}for(let k of l(m[3]))c(k,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function ms(e,t,n,o,r=true){return n==="node"?eu(e,t,o,r):n==="python"?nu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Br(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=>he(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=to(g);m.reference&&c.push(m.reference),m.inlineContent&&l.push(m.inlineContent),u||=m.malformed;continue}let f=he(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 fs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Fe(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 Ht(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function au(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||=Fe(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(iu.has(u))return a();if(su.has(u)){l=true,c+=1;continue}let d=qr.has(u)?"cjs":Kr.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=pt(u,qr),f=pt(u,Kr),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(Jr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ht(h))}let p=pt(u,Jr);if(p!==null)return a(s||Ht(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ht(u.slice(2)));if(zr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,zr)!==null){c+=1;continue}if(ru.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function du(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:Fe(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(cu.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:Fe(i)}}return {tokens:[],malformed:true}}function gu(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:Fe(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:Fe(r)};if(uu.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Vr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,Vr)!==null){o+=1;continue}if(lu.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Un(e,t){let n=he(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Ee(r,o)?null:o}function pu(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(fs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=wt(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?Un(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Un(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=Un(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>ls)return {tokens:[],malformed:true};let r=wt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=ps(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 ps(e,t,n,o){let r=0;for(;fs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;mu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>ls)return {tokens:i,malformed:true};let p=pu(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=ps(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)&&ds(l,o),d=c&&!fu.has(l);if(u||d)return {tokens:i,malformed:true};let g=Fe(s);i.push(s);let f=l;if(!ou.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?au(e,r+1,n):["bash","sh","zsh"].includes(f)?du(e,r+1,a,n,o):gu(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function hs(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Pe(t.slice(0,o))}function hu(e,t){let n=new Map;for(let o of t)for(let r of Gl(o)){let s=hs(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 yu(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function vu(e){return e.slice(e.lastIndexOf("@")+1)}function Gr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Pe(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function ku(e,t,n){let o=vu(e),r=W(t.extraKnownMarketplaces),s=W(r?.[o]);if(s){let i=W(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Gr(i.path):null}}try{let i=W(He(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Gr(c.path):null}}}catch{}return {configured:false,root:null}}function Yr(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 wu(e,t){let n=W(e.entry),o=W(t.entry),r=Yr(n),s=Yr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Bt(n.version):null,a=typeof o?.version=="string"?Bt(o.version):null;if(i&&a){let c=ys(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function bu(e,t){try{let n=W(He(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=W(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(wu)[0],i=W(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Pe(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Bt(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 ys(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 Su(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=W(He(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=Bt(a.version),u=Bt(c.version);if(l&&u){let d=ys(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]?Pe(i[0].path):null}function _u(e,t){if(t.legacyArtifactRoots!==void 0){let k=t.legacyArtifactRoots.map(w=>Pe(w)).filter(w=>w!==null).map(w=>({root:w,inspectPluginConfig:true}));return {targets:k,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:k.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 k of l)if(existsSync$1(k))try{let w=W(He(k));if(!w)throw new Error("settings must be an object");i.push({path:k,settings:w});}catch{a.push(k);}if(i.reduce((k,w)=>typeof w.settings.disableAllHooks=="boolean"?w.settings.disableAllHooks:k,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(k=>{let w=[];return vt(k.settings.hooks,w),{path:k.path,commands:w}}),g=d.flatMap(k=>k.commands),f=d.flatMap(k=>hu(k.path,k.commands)),p=[...i.reduce((k,w)=>{let _=w.settings.enabledPlugins;if(typeof _!="object"||_===null)return k;for(let[T,J]of Object.entries(_))yu(T)&&typeof J=="boolean"&&k.set(T,J);return k},new Map)].filter(([,k])=>k).map(([k])=>k).sort(),h=[...f],y=false;for(let k of p){let w=bu(k,o);w.malformed&&c.push(o);let _=w.root;if(!w.configured){let T=i.map(Y=>ku(k,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=Su(k,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let v=[...h.reduce((k,w)=>{let _=k.get(w.root);return _?(k.set(w.root,{root:w.root,configPath:_.configPath??w.configPath,commands:[...new Set([..._.commands??[],...w.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||w.inspectPluginConfig)}),k):(k.set(w.root,w),k)},new Map).values()],R=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(k=>k!==null);return {targets:v,configCommands:d.filter(k=>k.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Ru(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 vt(e,t){if(Array.isArray(e)){for(let n of e)vt(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):vt(o,t);}function Bn(e){return [...e.matchAll(Wl)].map(t=>t[1])}function Eu(e){let t=new Map,n=wt(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 Pu(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 Cu(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 qn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Ee(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Yn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ft)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>Ft)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ft+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>Ft)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 Zn(e,t){return `${e} (${t})`}function Du(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>eo){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)){Ee(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(!Ee(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=Br(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of pe(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>=cs){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Yn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Zn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?gs(l,d):c.parserKind,f=g==="shell";for(let m of pe(d,f,g))o.findings.push({artifact:l,endpoint:m});if(f){let m=Br(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of pe(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=ms(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 pe(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}}}function xu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ru(r),c=0,l=(f,m=false,p=r,h="infer",y=e,v=0)=>{if(v>eo){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(p),k=resolve(f);if(!existsSync$1(k)){if(!Ee(R,k)){o.escapedArtifacts.push(k);return}m&&o.missing.push(k);return}let w;try{w=realpathSync.native(k);}catch{m&&o.missing.push(k);return}if(!Ee(R,w)){o.escapedArtifacts.push(k);return}let _=`${w}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:w,parserKind:h,cwd:y,depth:v}));},u=(f,m,p,h=0)=>{for(let y of Bn(f)){let v=qn(r,y);if(!v)continue;let R=(m.artifacts??[]).find(k=>k.value.includes("PLUGIN_ROOT")&&k.value.endsWith(y));l(v,true,r,R?.parserKind??"infer",R?.cwd??p,h);}},d=(f,m,p=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?to(y,!h):{reference:he(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let R of pe(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},g=f=>{for(let p of pe(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=hs(p),y=(m.artifacts??[]).find(v=>v.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&&!Ee(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=Yn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Zn(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 v=JSON.parse(y.content),R=[];vt(v,R);for(let k of R)g(k);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=cs){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=Yn(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Zn(m,p.reason));continue}let{content:h}=p;o.inspected.push(m);let y=f.parserKind==="infer"?gs(m,h):f.parserKind,v=y==="shell";for(let w of pe(h,v,y))o.findings.push({artifact:m,endpoint:w});if(v){let w=Eu(h),_=Ut(w,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});Pu(h)&&o.malformedCommands.push(m),u(w,_,dirname(m),f.depth+1),d(_,dirname(m),f.depth+1,true);}else if(y==="node"||y==="python"){let w=ms(m,h,y,{project:e,homePath:t,cwd:dirname(m)},false);(y==="node"?Cu(m):w.malformed)&&o.malformedCommands.push(m);for(let _ of w.inlineContents)for(let T of pe(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of w.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of Bn(h)){let T=qn(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let w of Bn(h)){let _=qn(r,w);_&&l(_,true,r,y,f.cwd,f.depth+1);}let R=m.startsWith(`${r}/`)?m.slice(r.length+1):"",k=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${k}.ts`),false,a),R.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${k}.js`));}}function Ou(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=W(He(t)),r=W(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=W(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Pe(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 Zr(e){try{let t=W(He(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Au(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Ou(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 v=W(He(d)),R=W(v?.hooks),k=[];vt(R?.SessionStart,k),k.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=Zr(i),f=Zr(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(v=>v!==g))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function ju(e,t){let n=_u(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let O of n.configCommands){o.configsInspected.push(O.path);for(let q of O.commands){o.commandsInspected.push({configPath:O.path,command:q});for(let x of pe(q,true))o.findings.push({artifact:O.path,endpoint:x});}}Du(e,t.homePath??homedir$1(),n.configCommands.flatMap(O=>O.commands).filter(O=>!n.targets.some(q=>q.commands?.includes(O))),o);for(let O of n.targets)xu(e,t.homePath??homedir$1(),O,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((O,q,x)=>x.findIndex(j=>j.configPath===O.configPath&&j.command===O.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((O,q,x)=>x.findIndex(j=>j.artifact===O.artifact&&j.endpoint===O.endpoint)===q),m=a.length>0||g.length>0||u.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Au(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),R=n.targets.map(O=>O.root).find(O=>existsSync$1(join$1(O,"skills")))??null,k=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:R?{root:R,version:null}:De(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,_=w?nt(v,w):[],T=_.filter(O=>!O.isKnownDevFlowArtifact).map(O=>({skillName:O.skillName,path:O.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{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(O=>O.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],Y=k.version??h.versionRecords.find(O=>O.root===w)?.packageVersion;return Y&&J.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(J),metrics:J}}function $u(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 Kt(e){let t=$u(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)/et: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 Nu(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=Q(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:B(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:I(n),metrics:n}}function Iu(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:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(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*et,i=r.prepare(`
196
+ `&&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 Gr(e,t){let n=t.split(".");if(n.length>eo)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 hu(e,t,n){let o=pu(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=he(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=Gr(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&&Gr(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 k=f.slice(7).split(",");for(let w of k)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 k=c(h,p);u(k,m[3]);continue}if(p===0){s=true;continue}let y=i(p),v=join$1(y,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),u(y,m[3]);continue}for(let k of l(m[3]))c(k,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function ws(e,t,n,o,r=true){return n==="node"?fu(e,t,o,r):n==="python"?hu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Yr(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=>he(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=to(g);m.reference&&c.push(m.reference),m.inlineContent&&l.push(m.inlineContent),u||=m.malformed;continue}let f=he(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 bs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Fe(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 Ht(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function bu(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||=Fe(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(wu.has(u))return a();if(ku.has(u)){l=true,c+=1;continue}let d=Zr.has(u)?"cjs":Qr.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=pt(u,Zr),f=pt(u,Qr),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(Xr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ht(h))}let p=pt(u,Xr);if(p!==null)return a(s||Ht(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ht(u.slice(2)));if(es.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,es)!==null){c+=1;continue}if(vu.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Eu(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:Fe(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(Su.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:Fe(i)}}return {tokens:[],malformed:true}}function Pu(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:Fe(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:Fe(r)};if(Ru.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(ts.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,ts)!==null){o+=1;continue}if(_u.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Un(e,t){let n=he(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Ee(r,o)?null:o}function xu(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(bs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=wt(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?Un(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Un(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=Un(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>hs)return {tokens:[],malformed:true};let r=wt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Ss(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 Ss(e,t,n,o){let r=0;for(;bs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Cu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>hs)return {tokens:i,malformed:true};let p=xu(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=Ss(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)&&vs(l,o),d=c&&!Du.has(l);if(u||d)return {tokens:i,malformed:true};let g=Fe(s);i.push(s);let f=l;if(!yu.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?bu(e,r+1,n):["bash","sh","zsh"].includes(f)?Eu(e,r+1,a,n,o):Pu(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function _s(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Pe(t.slice(0,o))}function Ou(e,t){let n=new Map;for(let o of t)for(let r of lu(o)){let s=_s(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 ju(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Nu(e){return e.slice(e.lastIndexOf("@")+1)}function ns(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Pe(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Au(e,t,n){let o=Nu(e),r=W(t.extraKnownMarketplaces),s=W(r?.[o]);if(s){let i=W(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?ns(i.path):null}}try{let i=W(He(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?ns(c.path):null}}}catch{}return {configured:false,root:null}}function os(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 $u(e,t){let n=W(e.entry),o=W(t.entry),r=os(n),s=os(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?qt(n.version):null,a=typeof o?.version=="string"?qt(o.version):null;if(i&&a){let c=Rs(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Iu(e,t){try{let n=W(He(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=W(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($u)[0],i=W(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Pe(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function qt(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 Rs(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 Tu(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=W(He(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=qt(a.version),u=qt(c.version);if(l&&u){let d=Rs(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]?Pe(i[0].path):null}function Mu(e,t){if(t.legacyArtifactRoots!==void 0){let k=t.legacyArtifactRoots.map(w=>Pe(w)).filter(w=>w!==null).map(w=>({root:w,inspectPluginConfig:true}));return {targets:k,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:k.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 k of l)if(existsSync$1(k))try{let w=W(He(k));if(!w)throw new Error("settings must be an object");i.push({path:k,settings:w});}catch{a.push(k);}if(i.reduce((k,w)=>typeof w.settings.disableAllHooks=="boolean"?w.settings.disableAllHooks:k,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(k=>{let w=[];return vt(k.settings.hooks,w),{path:k.path,commands:w}}),g=d.flatMap(k=>k.commands),f=d.flatMap(k=>Ou(k.path,k.commands)),p=[...i.reduce((k,w)=>{let _=w.settings.enabledPlugins;if(typeof _!="object"||_===null)return k;for(let[T,J]of Object.entries(_))ju(T)&&typeof J=="boolean"&&k.set(T,J);return k},new Map)].filter(([,k])=>k).map(([k])=>k).sort(),h=[...f],y=false;for(let k of p){let w=Iu(k,o);w.malformed&&c.push(o);let _=w.root;if(!w.configured){let T=i.map(Y=>Au(k,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=Tu(k,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let v=[...h.reduce((k,w)=>{let _=k.get(w.root);return _?(k.set(w.root,{root:w.root,configPath:_.configPath??w.configPath,commands:[...new Set([..._.commands??[],...w.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||w.inspectPluginConfig)}),k):(k.set(w.root,w),k)},new Map).values()],R=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(k=>k!==null);return {targets:v,configCommands:d.filter(k=>k.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Lu(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 vt(e,t){if(Array.isArray(e)){for(let n of e)vt(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):vt(o,t);}function qn(e){return [...e.matchAll(tu)].map(t=>t[1])}function Fu(e){let t=new Map,n=wt(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 Hu(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 Wu(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 Bn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Ee(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Yn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ft)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>Ft)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ft+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>Ft)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 Zn(e,t){return `${e} (${t})`}function Uu(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>eo){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)){Ee(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(!Ee(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=Yr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of pe(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>=ps){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Yn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Zn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?ks(l,d):c.parserKind,f=g==="shell";for(let m of pe(d,f,g))o.findings.push({artifact:l,endpoint:m});if(f){let m=Yr(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of pe(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=ws(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 pe(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}}}function qu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Lu(r),c=0,l=(f,m=false,p=r,h="infer",y=e,v=0)=>{if(v>eo){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(p),k=resolve(f);if(!existsSync$1(k)){if(!Ee(R,k)){o.escapedArtifacts.push(k);return}m&&o.missing.push(k);return}let w;try{w=realpathSync.native(k);}catch{m&&o.missing.push(k);return}if(!Ee(R,w)){o.escapedArtifacts.push(k);return}let _=`${w}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:w,parserKind:h,cwd:y,depth:v}));},u=(f,m,p,h=0)=>{for(let y of qn(f)){let v=Bn(r,y);if(!v)continue;let R=(m.artifacts??[]).find(k=>k.value.includes("PLUGIN_ROOT")&&k.value.endsWith(y));l(v,true,r,R?.parserKind??"infer",R?.cwd??p,h);}},d=(f,m,p=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?to(y,!h):{reference:he(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let R of pe(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},g=f=>{for(let p of pe(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=_s(p),y=(m.artifacts??[]).find(v=>v.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&&!Ee(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=Yn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Zn(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 v=JSON.parse(y.content),R=[];vt(v,R);for(let k of R)g(k);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=ps){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=Yn(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Zn(m,p.reason));continue}let{content:h}=p;o.inspected.push(m);let y=f.parserKind==="infer"?ks(m,h):f.parserKind,v=y==="shell";for(let w of pe(h,v,y))o.findings.push({artifact:m,endpoint:w});if(v){let w=Fu(h),_=Ut(w,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});Hu(h)&&o.malformedCommands.push(m),u(w,_,dirname(m),f.depth+1),d(_,dirname(m),f.depth+1,true);}else if(y==="node"||y==="python"){let w=ws(m,h,y,{project:e,homePath:t,cwd:dirname(m)},false);(y==="node"?Wu(m):w.malformed)&&o.malformedCommands.push(m);for(let _ of w.inlineContents)for(let T of pe(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of w.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of qn(h)){let T=Bn(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let w of qn(h)){let _=Bn(r,w);_&&l(_,true,r,y,f.cwd,f.depth+1);}let R=m.startsWith(`${r}/`)?m.slice(r.length+1):"",k=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${k}.ts`),false,a),R.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${k}.js`));}}function Bu(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=W(He(t)),r=W(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=W(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Pe(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 rs(e){try{let t=W(He(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ku(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Bu(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 v=W(He(d)),R=W(v?.hooks),k=[];vt(R?.SessionStart,k),k.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=rs(i),f=rs(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(v=>v!==g))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Ju(e,t){let n=Mu(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let O of n.configCommands){o.configsInspected.push(O.path);for(let B of O.commands){o.commandsInspected.push({configPath:O.path,command:B});for(let x of pe(B,true))o.findings.push({artifact:O.path,endpoint:x});}}Uu(e,t.homePath??homedir$1(),n.configCommands.flatMap(O=>O.commands).filter(O=>!n.targets.some(B=>B.commands?.includes(O))),o);for(let O of n.targets)qu(e,t.homePath??homedir$1(),O,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((O,B,x)=>x.findIndex(N=>N.configPath===O.configPath&&N.command===O.command)===B),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((O,B,x)=>x.findIndex(N=>N.artifact===O.artifact&&N.endpoint===O.endpoint)===B),m=a.length>0||g.length>0||u.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Ku(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),R=n.targets.map(O=>O.root).find(O=>existsSync$1(join$1(O,"skills")))??null,k=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:R?{root:R,version:null}:De(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,_=w?nt(v,w):[],T=_.filter(O=>!O.isKnownDevFlowArtifact).map(O=>({skillName:O.skillName,path:O.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{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(O=>O.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],Y=k.version??h.versionRecords.find(O=>O.root===w)?.packageVersion;return Y&&J.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(J),metrics:J}}function Vu(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 Kt(e){let t=Vu(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)/et: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 zu(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=Q(i,t);let l=(M(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:q(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:I(n),metrics:n}}function Gu(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:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(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*et,i=r.prepare(`
197
197
  SELECT source, COUNT(*) count FROM memories
198
198
  WHERE created_at >= ? GROUP BY source ORDER BY source
199
199
  `).all(s),a=r.prepare(`
@@ -211,14 +211,14 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{be();});var Dr={};A
211
211
  SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
212
212
  FROM observations
213
213
  WHERE source = 'explicit_intent' AND quality_status = 'accepted'
214
- `).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:I(n),metrics:n}}function Tu(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:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(g=>Number(g.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),d=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:d?"trigram":"missing/non-trigram",target:"trigram",ok:d,severity:"warning"}),M(r,"knowledge_source_readiness")){let g=r.prepare(`
214
+ `).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:I(n),metrics:n}}function Yu(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:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(g=>Number(g.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),d=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:d?"trigram":"missing/non-trigram",target:"trigram",ok:d,severity:"warning"}),M(r,"knowledge_source_readiness")){let g=r.prepare(`
215
215
  SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
216
216
  FROM knowledge_source_readiness ORDER BY source
217
- `).all(),f=g.filter(p=>Number(p.documents??0)>0||Number(p.chunks??0)>0),m=f.length>0?Math.min(...f.map(p=>Number(p.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(p=>p.status==="ready"&&Number(p.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:m,target:">= 0.95",ok:f.length>0&&m>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:I(n),metrics:n}}function Mu(e){let{manifest:t,metrics:n}=Kt(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:I(n),metrics:n}}function Lu(e){let{manifest:t,metrics:n}=Kt(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:I(n),metrics:n}}function Fu(e){let{manifest:t,metrics:n}=Kt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["projectDiagnosticCodeResult","getDiagnosticMemoryResult","getDiagnosticKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:I(n),metrics:n}}async function Hu(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 Wu(e){let{manifest:t,metrics:n}=Kt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeState(ie(e));if((!r||r.status!=="ready")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:I(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/ready`;try{let a=await(e.httpGet??Hu)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:I(n),metrics:n}}async function no(e={},t={}){let n=e.project??process.cwd(),o=Jn(n),r=Mu(t),s=await Sl(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Rl(n,t),Ol(o.path,t),ju(o.path,t),await $l(o.path,t),Nl(o.path,!!e.strict,t),Nu(o.path,t),Iu(o.path,t),Tu(o.path,t),r,Lu(t),Tl(t),Ml(o.path,t),Fu(t),Il(t),await Wu(t),Fl(t)],a=i.some(c=>c.status==="red"||e.strict&&c.status==="yellow")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function Uu(e,t={}){return e===void 0?ks():no(e,t)}function Qr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function vs(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: ${Qr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Qr(s.value)}${i}`);}}return t.join(`
218
- `)}async function Bu(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await no(e,n);return t.stdout(e.json?JSON.stringify(o):vs(o)),o.exitCode}async function Jt(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function ks(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Jt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let m=await mt(),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 qu(){let{data:e}=await Jt(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){if(r.prevHash!==o)return {valid:false,brokenAt:r.seq,entryCount:n.length};let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");if(r.signature!==i)return {valid:false,brokenAt:r.seq,entryCount:n.length};o=r.signature;}return {valid:true,brokenAt:null,entryCount:n.length}}async function Ku(){let{data:e}=await Jt(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[o,i,r.seq]),o=i;}return {rebuilt:true}}async function Ju(e){let{data:t}=await Jt(process.cwd()),o=(await t.auditGetAll()).filter(r=>r.decision!=="allow");if(e){let r=e.match(/^(\d+)([dh])$/);if(r){let s=Number.parseInt(r[1],10),i=r[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;o=o.filter(c=>c.ts>a);}}return {violations:o.map(r=>({tool:r.tool,decision:r.decision,ruleId:r.ruleId,ts:r.ts,sessionId:r.sessionId}))}}function zu(){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 Lt,El,zn,xl,et,Gn,Fr,Hl,Wl,cs,Ft,eo,ls,us,Ul,Bl,ql,Wr,ou,qr,Kr,Jr,zr,ru,su,iu,cu,lu,Vr,uu,mu,fu,bs=D(()=>{Je();me();Nn();El={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},zn=3600*1e3;xl=new Set(["pending","committed","expired"]);et=1440*60*1e3,Gn=30*et,Fr=60*1024*1024;Hl=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Wl=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,cs=64,Ft=1024*1024,eo=8,ls=8,us=64*1024;Ul=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Bl=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),ql=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Wr=[".cjs",".js",".mjs",".ts",".tsx"];ou=new Set(["bash","node","python","python3","sh","tsx","zsh"]);qr=new Set(["-r","--require"]),Kr=new Set(["--experimental-loader","--import","--loader"]),Jr=new Set(["-e","--eval","-p","--print"]),zr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),ru=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),su=new Set(["--check","-c"]),iu=new Set(["--help","--version","-h","-v"]);cu=new Set(["-e","-eu","-o","-u","-ue"]),lu=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Vr=new Set(["-W","-X","--check-hash-based-pycs"]),uu=new Set(["--help","--version","-h","-V"]);mu=new Set(["builtin","command","env","exec","nohup","timeout"]),fu=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Ss={};A(Ss,{runMemoryMaintainCommand:()=>Zu});function Yu(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 Zu(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Yu(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(`
219
- `)}var _s=D(()=>{});var Rs={};A(Rs,{generateToken:()=>ed});async function ed(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 Es=D(()=>{});var oo={};A(oo,{reportBenchmarkCommand:()=>sd,runBenchmarkCommand:()=>rd});async function rd(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}
217
+ `).all(),f=g.filter(p=>Number(p.documents??0)>0||Number(p.chunks??0)>0),m=f.length>0?Math.min(...f.map(p=>Number(p.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(p=>p.status==="ready"&&Number(p.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:m,target:">= 0.95",ok:f.length>0&&m>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:I(n),metrics:n}}function Zu(e){let{manifest:t,metrics:n}=Kt(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:I(n),metrics:n}}function Qu(e){let{manifest:t,metrics:n}=Kt(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:I(n),metrics:n}}function Xu(e){let{manifest:t,metrics:n}=Kt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["projectDiagnosticCodeResult","getDiagnosticMemoryResult","getDiagnosticKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:I(n),metrics:n}}async function ed(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 td(e){let{manifest:t,metrics:n}=Kt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeState(ie(e));if((!r||r.status!=="ready")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:I(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/ready`;try{let a=await(e.httpGet??ed)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:I(n),metrics:n}}async function no(e={},t={}){let n=e.project??process.cwd(),o=Jn(n),r=Zu(t),s=await Tl(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Ll(n,t),Bl(o.path,t),Ju(o.path,t),await Vl(o.path,t),zl(o.path,!!e.strict,t),zu(o.path,t),Gu(o.path,t),Yu(o.path,t),r,Qu(t),Yl(t),Zl(o.path,t),Xu(t),Gl(t),await td(t),Xl(t)],a=i.some(c=>c.status==="red"||e.strict&&c.status==="yellow")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function nd(e,t={}){return e===void 0?Ps():no(e,t)}function ss(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Es(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: ${ss(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${ss(s.value)}${i}`);}}return t.join(`
218
+ `)}async function od(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await no(e,n);return t.stdout(e.json?JSON.stringify(o):Es(o)),o.exitCode}async function Jt(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function Ps(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Jt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let m=await mt(),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 rd(){let{data:e}=await Jt(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){if(r.prevHash!==o)return {valid:false,brokenAt:r.seq,entryCount:n.length};let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");if(r.signature!==i)return {valid:false,brokenAt:r.seq,entryCount:n.length};o=r.signature;}return {valid:true,brokenAt:null,entryCount:n.length}}async function sd(){let{data:e}=await Jt(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[o,i,r.seq]),o=i;}return {rebuilt:true}}async function id(e){let{data:t}=await Jt(process.cwd()),o=(await t.auditGetAll()).filter(r=>r.decision!=="allow");if(e){let r=e.match(/^(\d+)([dh])$/);if(r){let s=Number.parseInt(r[1],10),i=r[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;o=o.filter(c=>c.ts>a);}}return {violations:o.map(r=>({tool:r.tool,decision:r.decision,ruleId:r.ruleId,ts:r.ts,sessionId:r.sessionId}))}}function ad(){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 Lt,Fl,Vn,ql,et,Gn,Jr,eu,tu,ps,Ft,eo,hs,ys,nu,ou,ru,zr,yu,Zr,Qr,Xr,es,vu,ku,wu,Su,_u,ts,Ru,Cu,Du,Ds=D(()=>{Je();me();$n();Fl={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Vn=3600*1e3;ql=new Set(["pending","committed","expired"]);et=1440*60*1e3,Gn=30*et,Jr=60*1024*1024;eu=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,tu=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,ps=64,Ft=1024*1024,eo=8,hs=8,ys=64*1024;nu=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),ou=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),ru=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;zr=[".cjs",".js",".mjs",".ts",".tsx"];yu=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Zr=new Set(["-r","--require"]),Qr=new Set(["--experimental-loader","--import","--loader"]),Xr=new Set(["-e","--eval","-p","--print"]),es=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),vu=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),ku=new Set(["--check","-c"]),wu=new Set(["--help","--version","-h","-v"]);Su=new Set(["-e","-eu","-o","-u","-ue"]),_u=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),ts=new Set(["-W","-X","--check-hash-based-pycs"]),Ru=new Set(["--help","--version","-h","-V"]);Cu=new Set(["builtin","command","env","exec","nohup","timeout"]),Du=new Set([":","[","echo","false","printf","pwd","test","true"]);});var xs={};j(xs,{runMemoryMaintainCommand:()=>dd});function ud(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 dd(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:ud(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(`
219
+ `)}var Os=D(()=>{});var js={};j(js,{generateToken:()=>fd});async function fd(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 Ns=D(()=>{});var oo={};j(oo,{reportBenchmarkCommand:()=>kd,runBenchmarkCommand:()=>vd});async function vd(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}
220
220
 
221
- Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function sd(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=id(o,n);return r==="markdown"?`${s}
221
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function kd(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=wd(o,n);return r==="markdown"?`${s}
222
222
  ## Change From Prior Baseline
223
223
 
224
224
  ${i.map(a=>`- ${a}`).join(`
@@ -227,19 +227,19 @@ ${i.map(a=>`- ${a}`).join(`
227
227
 
228
228
  Change from ${o.runId}:
229
229
  ${i.map(a=>`- ${a}`).join(`
230
- `)}`}function id(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [zt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),zt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),zt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),zt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function zt(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 ro=D(()=>{});var io={};A(io,{reportEvaluationCommand:()=>fd,runEvaluationCommand:()=>md});async function md(e){let t=getBenchmarkSuite(e.suite);if(!t)throw new Error(`Unknown evaluation suite "${e.suite}"`);let n=e.database??openGlobalDevFlowDatabase();try{if(e.suite.startsWith("agent:")){let i=`eval-waiting:${Date.now()}:${randomUUID().slice(0,8)}`,a=t.tasks.flatMap(c=>Array.from({length:e.trials},(l,u)=>n.requestHostAction({runId:i,engineRunId:i,stepId:`${c.id}:trial-${u+1}`,projectRoot:e.projectRoot})));return JSON.stringify({status:"waiting",runId:i,actionIds:a.map(c=>c.actionId)},null,2)}let o=pd(e.projectRoot),r=[];for(let i=0;i<e.trials;i+=1){let a=await new BenchmarkEngine().runSuite(e.projectRoot,t,{rounds:1});for(let c of a.tasks){let l=c.devflow.correctnessScore>=1,u={graderId:"retrieval_correctness",kind:"deterministic",status:l?"passed":"failed",score:c.devflow.correctnessScore,threshold:1,evidence:[{type:"matched_files",value:JSON.stringify(c.devflow.matchedFiles)},{type:"matched_symbols",value:JSON.stringify(c.devflow.matchedSymbols)}],reason:l?"All expected retrieval targets were selected.":"Expected retrieval targets were missing.",durationMs:c.devflow.durationMs,receipt:`grader:${Vt(JSON.stringify(c)).slice(0,24)}`},d={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:Vt(c.prompt),toolProfileHash:Vt("benchmark-context-deep:r3.v1"),acceptanceHash:Vt(JSON.stringify(t.tasks.find(g=>g.id===c.taskId))),status:u.status,graderResults:[u],durationMs:c.devflow.durationMs,tokensUsed:c.devflow.tokensUsed,fallbackCount:0,failureCategory:l?void 0:"retrieval_correctness",simulated:!1};r.push({...d,evidenceReceipt:createTrialReceipt(d)});}}let s=aggregateRepeatedTrials({suiteId:t.id,suiteVersion:t.version,projectRoot:e.projectRoot,commit:o,k:e.trials,trials:r});return n.insertBenchmarkReport(s),renderRepeatedTrialReport(s,e.output??"text")}finally{e.database||n.close();}}function fd(e){let t=e.database??openGlobalDevFlowDatabase();try{let n=t.getBenchmarkReport(e.runId);if(!n||!("k"in n)||!Array.isArray(n.trials))throw new Error(`Evaluation report "${e.runId}" not found`);return renderRepeatedTrialReport(n,e.output??"text")}finally{e.database||t.close();}}function pd(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function Vt(e){return createHash("sha256").update(e).digest("hex")}var ao=D(()=>{});var As={};A(As,{runReview:()=>hd});async function hd(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(`
231
- `)}var js=D(()=>{});var bt={};A(bt,{resolveRuntimeLocale:()=>Ns,runtimeMessage:()=>X,runtimeMessages:()=>$s});function Ns(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function X(e,t={},n){return $s[Ns(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var $s,Ce=D(()=>{$s={en:{starting:"Starting the DevFlow Runtime...",ready:"Dashboard ready at {url}",reused:"Reused the existing DevFlow Runtime.",stopped:"DevFlow Runtime stopped.",notRunning:"No DevFlow Runtime is running.",portInUse:"Port {port} is already in use.",bundleMissing:"The Dashboard bundle is missing from this installation.",projectRequired:"Choose a project with --project <path>.",ownerMismatch:"Runtime ownership could not be verified; no process was stopped.",runtimeFailed:"DevFlow Runtime could not be started: {message}",openingFailed:"The Dashboard is ready, but the browser could not be opened: {message}",running:"DevFlow Runtime is running at {url} (PID {pid}, generation {generation}).",statusHeader:"DevFlow Status",dashboardUnavailable:"Dashboard is unavailable ({status})."},zh:{starting:"\u6B63\u5728\u542F\u52A8 DevFlow \u8FD0\u884C\u65F6...",ready:"Dashboard \u5DF2\u5C31\u7EEA\uFF1A{url}",reused:"\u5DF2\u590D\u7528\u73B0\u6709 DevFlow \u8FD0\u884C\u65F6\u3002",stopped:"DevFlow \u8FD0\u884C\u65F6\u5DF2\u505C\u6B62\u3002",notRunning:"\u5F53\u524D\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684 DevFlow \u8FD0\u884C\u65F6\u3002",portInUse:"\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\u3002",bundleMissing:"\u5F53\u524D\u5B89\u88C5\u5305\u4E2D\u7F3A\u5C11 Dashboard \u9759\u6001\u8D44\u6E90\u3002",projectRequired:"\u8BF7\u4F7F\u7528 --project <path> \u9009\u62E9\u9879\u76EE\u3002",ownerMismatch:"\u65E0\u6CD5\u9A8C\u8BC1\u8FD0\u884C\u65F6\u5F52\u5C5E\uFF0C\u672A\u505C\u6B62\u4EFB\u4F55\u8FDB\u7A0B\u3002",runtimeFailed:"DevFlow \u8FD0\u884C\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A{message}",openingFailed:"Dashboard \u5DF2\u5C31\u7EEA\uFF0C\u4F46\u65E0\u6CD5\u6253\u5F00\u6D4F\u89C8\u5668\uFF1A{message}",running:"DevFlow \u8FD0\u884C\u65F6\u6B63\u5728 {url} \u8FD0\u884C\uFF08PID {pid}\uFF0C\u4EE3\u6B21 {generation}\uFF09\u3002",statusHeader:"DevFlow \u72B6\u6001",dashboardUnavailable:"Dashboard \u4E0D\u53EF\u7528\uFF08{status}\uFF09\u3002"}};});var Is={};A(Is,{startAll:()=>yd});async function yd(e){let t=e.projectRoot??process.cwd();console.log(S.blue(X("starting")));let n=await Mn({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(S.green(X("ready",{url:n.state.url}))),n.reused&&console.log(S.dim(X("reused"))),!e.background&&await new Promise(o=>{let r=false,s=async()=>{if(r)return;r=true,process.off("SIGINT",s),process.off("SIGTERM",s);let i=Ie().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await Ie().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var Ts=D(()=>{me();Ce();});var Ls={};A(Ls,{stopAll:()=>vd});async function vd(){let e=await Ln();console.log(e?S.green(X("stopped")):S.dim(X("notRunning")));}var Fs=D(()=>{me();Ce();});var Hs={};A(Hs,{showStatus:()=>Rd});function _d(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 Rd(e={}){let t=await mt(),n=e.projectRoot??process.cwd();if(e.json){console.log(JSON.stringify({runtime:t.state??null,running:t.running,project:{root:n,initialized:existsSync(join(n,".devflow"))}}));return}if(console.log(S.blue(X("statusHeader"))),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(S.green(X("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(S.yellow(X(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=De(o),s=r.root?nt(o,r.root):[];r.root?console.log(`Plugin: ${S.green("\u2713")} v${r.version??"unknown"} (${r.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${s.length===0?S.green("\u2713"):S.red("!")} ${s.length} shadowed`);let i=getGlobalDevFlowDbPath();if(existsSync(i)){let d=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${d} MB)`);}else console.log(`Data: ${S.dim(`no global database (${i})`)}`);let a=join(process.cwd(),".devflow","devflow.db"),c=join(process.cwd(),".codegraph","codegraph.db"),l=[...existsSync(a)?[a]:[],..._d(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${S.yellow(l.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Ws=D(()=>{me();Je();Ce();});var Us={};A(Us,{setupCommand:()=>Id});function Ad(){try{return xt()}catch{return}}function jd(e){try{return Od.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs")}catch{let t=join$1(e,"node_modules","@devflow-tools","mcp-server","bin","devflow-mcp.cjs");return existsSync$1(t)?t:void 0}}function $d(e){let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8"));if(typeof t.version!="string"||!t.version.trim())throw new Error(`Claude plugin version is missing from ${e}`);return t.version}function Nd(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(S.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(S.yellow(` ! ${e.artifact}: ${t}`)):console.log(S.green(` + ${e.artifact}: ${t}`));}async function Id(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp){let l=jd(n.projectRoot);l?s.push(r.mcp.project(n,{command:l,args:["--mode","stdio"],env:{CLAUDE_PROJECT_DIR:n.projectRoot,DEVFLOW_PROJECT_ROOT:n.projectRoot}})):s.push({artifact:"mcp",status:"failed",changed:false,message:"The @devflow-tools/mcp-server launcher could not be resolved. Install it in the project and retry setup."});}if(!e.skipPlugin){let l=Ad();if(r.id==="claude-code"&&l)try{let u=$d(l),d=join$1(n.homeDir,".claude","plugins","cache");Ot(l,d,u),l=join$1(d,"devflow-local","devflow",u);}catch(u){s.push({artifact:"plugin",status:"failed",changed:false,path:l,message:u instanceof Error?u.message:String(u)}),l=void 0;}l?s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:join$1(l,"skills")})):s.some(u=>u.artifact==="plugin"&&u.status==="failed")||s.push({artifact:"plugin",status:"failed",changed:false,message:"Claude plugin files could not be resolved."});}for(let l of s)Nd(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(S.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(S.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(S.green(`Setup complete for ${r.id}.`)),console.log(S.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var Od,Bs=D(()=>{Je();Od=createRequire$1(import.meta.url);});var qs={};A(qs,{pluginListCommand:()=>Md});var Md,Ks=D(()=>{At();Md=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Oe();if(e.installed){let n=Io();if(n.length===0){console.log("No plugins installed."),console.log(`
230
+ `)}`}function wd(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Vt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Vt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Vt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Vt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Vt(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 ro=D(()=>{});var io={};j(io,{reportEvaluationCommand:()=>Dd,runEvaluationCommand:()=>Cd});async function Cd(e){let t=getBenchmarkSuite(e.suite);if(!t)throw new Error(`Unknown evaluation suite "${e.suite}"`);let n=e.database??openGlobalDevFlowDatabase();try{if(e.suite.startsWith("agent:")){let i=`eval-waiting:${Date.now()}:${randomUUID().slice(0,8)}`,a=t.tasks.flatMap(c=>Array.from({length:e.trials},(l,u)=>n.requestHostAction({runId:i,engineRunId:i,stepId:`${c.id}:trial-${u+1}`,projectRoot:e.projectRoot})));return JSON.stringify({status:"waiting",runId:i,actionIds:a.map(c=>c.actionId)},null,2)}let o=xd(e.projectRoot),r=[];for(let i=0;i<e.trials;i+=1){let a=await new BenchmarkEngine().runSuite(e.projectRoot,t,{rounds:1});for(let c of a.tasks){let l=c.devflow.correctnessScore>=1,u={graderId:"retrieval_correctness",kind:"deterministic",status:l?"passed":"failed",score:c.devflow.correctnessScore,threshold:1,evidence:[{type:"matched_files",value:JSON.stringify(c.devflow.matchedFiles)},{type:"matched_symbols",value:JSON.stringify(c.devflow.matchedSymbols)}],reason:l?"All expected retrieval targets were selected.":"Expected retrieval targets were missing.",durationMs:c.devflow.durationMs,receipt:`grader:${zt(JSON.stringify(c)).slice(0,24)}`},d={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:zt(c.prompt),toolProfileHash:zt("benchmark-context-deep:r3.v1"),acceptanceHash:zt(JSON.stringify(t.tasks.find(g=>g.id===c.taskId))),status:u.status,graderResults:[u],durationMs:c.devflow.durationMs,tokensUsed:c.devflow.tokensUsed,fallbackCount:0,failureCategory:l?void 0:"retrieval_correctness",simulated:!1};r.push({...d,evidenceReceipt:createTrialReceipt(d)});}}let s=aggregateRepeatedTrials({suiteId:t.id,suiteVersion:t.version,projectRoot:e.projectRoot,commit:o,k:e.trials,trials:r});return n.insertBenchmarkReport(s),renderRepeatedTrialReport(s,e.output??"text")}finally{e.database||n.close();}}function Dd(e){let t=e.database??openGlobalDevFlowDatabase();try{let n=t.getBenchmarkReport(e.runId);if(!n||!("k"in n)||!Array.isArray(n.trials))throw new Error(`Evaluation report "${e.runId}" not found`);return renderRepeatedTrialReport(n,e.output??"text")}finally{e.database||t.close();}}function xd(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function zt(e){return createHash("sha256").update(e).digest("hex")}var ao=D(()=>{});var Ls={};j(Ls,{runReview:()=>Od});async function Od(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(`
231
+ `)}var Fs=D(()=>{});var bt={};j(bt,{resolveRuntimeLocale:()=>Ws,runtimeMessage:()=>X,runtimeMessages:()=>Hs});function Ws(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function X(e,t={},n){return Hs[Ws(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var Hs,Ce=D(()=>{Hs={en:{starting:"Starting the DevFlow Runtime...",ready:"Dashboard ready at {url}",reused:"Reused the existing DevFlow Runtime.",stopped:"DevFlow Runtime stopped.",notRunning:"No DevFlow Runtime is running.",portInUse:"Port {port} is already in use.",bundleMissing:"The Dashboard bundle is missing from this installation.",projectRequired:"Choose a project with --project <path>.",ownerMismatch:"Runtime ownership could not be verified; no process was stopped.",runtimeFailed:"DevFlow Runtime could not be started: {message}",openingFailed:"The Dashboard is ready, but the browser could not be opened: {message}",running:"DevFlow Runtime is running at {url} (PID {pid}, generation {generation}).",statusHeader:"DevFlow Status",dashboardUnavailable:"Dashboard is unavailable ({status})."},zh:{starting:"\u6B63\u5728\u542F\u52A8 DevFlow \u8FD0\u884C\u65F6...",ready:"Dashboard \u5DF2\u5C31\u7EEA\uFF1A{url}",reused:"\u5DF2\u590D\u7528\u73B0\u6709 DevFlow \u8FD0\u884C\u65F6\u3002",stopped:"DevFlow \u8FD0\u884C\u65F6\u5DF2\u505C\u6B62\u3002",notRunning:"\u5F53\u524D\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684 DevFlow \u8FD0\u884C\u65F6\u3002",portInUse:"\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\u3002",bundleMissing:"\u5F53\u524D\u5B89\u88C5\u5305\u4E2D\u7F3A\u5C11 Dashboard \u9759\u6001\u8D44\u6E90\u3002",projectRequired:"\u8BF7\u4F7F\u7528 --project <path> \u9009\u62E9\u9879\u76EE\u3002",ownerMismatch:"\u65E0\u6CD5\u9A8C\u8BC1\u8FD0\u884C\u65F6\u5F52\u5C5E\uFF0C\u672A\u505C\u6B62\u4EFB\u4F55\u8FDB\u7A0B\u3002",runtimeFailed:"DevFlow \u8FD0\u884C\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A{message}",openingFailed:"Dashboard \u5DF2\u5C31\u7EEA\uFF0C\u4F46\u65E0\u6CD5\u6253\u5F00\u6D4F\u89C8\u5668\uFF1A{message}",running:"DevFlow \u8FD0\u884C\u65F6\u6B63\u5728 {url} \u8FD0\u884C\uFF08PID {pid}\uFF0C\u4EE3\u6B21 {generation}\uFF09\u3002",statusHeader:"DevFlow \u72B6\u6001",dashboardUnavailable:"Dashboard \u4E0D\u53EF\u7528\uFF08{status}\uFF09\u3002"}};});var Us={};j(Us,{startAll:()=>jd});async function jd(e){let t=e.projectRoot??process.cwd();console.log(S.blue(X("starting")));let n=await Mn({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(S.green(X("ready",{url:n.state.url}))),n.reused&&console.log(S.dim(X("reused"))),!e.background&&await new Promise(o=>{let r=false,s=async()=>{if(r)return;r=true,process.off("SIGINT",s),process.off("SIGTERM",s);let i=Ie().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await Ie().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var qs=D(()=>{me();Ce();});var Ks={};j(Ks,{stopAll:()=>Nd});async function Nd(){let e=await Ln();console.log(e?S.green(X("stopped")):S.dim(X("notRunning")));}var Js=D(()=>{me();Ce();});var Vs={};j(Vs,{showStatus:()=>Ld});function Md(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 Ld(e={}){let t=await mt(),n=e.projectRoot??process.cwd();if(e.json){console.log(JSON.stringify({runtime:t.state??null,running:t.running,project:{root:n,initialized:existsSync(join(n,".devflow"))}}));return}if(console.log(S.blue(X("statusHeader"))),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(S.green(X("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(S.yellow(X(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=De(o),s=r.root?nt(o,r.root):[];r.root?console.log(`Plugin: ${S.green("\u2713")} v${r.version??"unknown"} (${r.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${s.length===0?S.green("\u2713"):S.red("!")} ${s.length} shadowed`);let i=getGlobalDevFlowDbPath();if(existsSync(i)){let d=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${d} MB)`);}else console.log(`Data: ${S.dim(`no global database (${i})`)}`);let a=join(process.cwd(),".devflow","devflow.db"),c=join(process.cwd(),".codegraph","codegraph.db"),l=[...existsSync(a)?[a]:[],...Md(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${S.yellow(l.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var zs=D(()=>{me();Je();Ce();});var Gs={};j(Gs,{setupCommand:()=>Gd});function Kd(){try{return xt()}catch{return}}function Jd(e){try{return Bd.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs")}catch{let t=join$1(e,"node_modules","@devflow-tools","mcp-server","bin","devflow-mcp.cjs");return existsSync$1(t)?t:void 0}}function Vd(e){let t=JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8"));if(typeof t.version!="string"||!t.version.trim())throw new Error(`Claude plugin version is missing from ${e}`);return t.version}function zd(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(S.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(S.yellow(` ! ${e.artifact}: ${t}`)):console.log(S.green(` + ${e.artifact}: ${t}`));}async function Gd(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp){let l=Jd(n.projectRoot);l?s.push(r.mcp.project(n,{command:l,args:["--mode","stdio"],env:{CLAUDE_PROJECT_DIR:n.projectRoot,DEVFLOW_PROJECT_ROOT:n.projectRoot}})):s.push({artifact:"mcp",status:"failed",changed:false,message:"The @devflow-tools/mcp-server launcher could not be resolved. Install it in the project and retry setup."});}if(!e.skipPlugin){let l=Kd();if(r.id==="claude-code"&&l)try{let u=Vd(l),d=join$1(n.homeDir,".claude","plugins","cache");Ot(l,d,u),l=join$1(d,"devflow-local","devflow",u);}catch(u){s.push({artifact:"plugin",status:"failed",changed:false,path:l,message:u instanceof Error?u.message:String(u)}),l=void 0;}l?s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:join$1(l,"skills")})):s.some(u=>u.artifact==="plugin"&&u.status==="failed")||s.push({artifact:"plugin",status:"failed",changed:false,message:"Claude plugin files could not be resolved."});}for(let l of s)zd(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(S.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(S.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(S.green(`Setup complete for ${r.id}.`)),console.log(S.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var Bd,Ys=D(()=>{Je();Bd=createRequire$1(import.meta.url);});var Zs={};j(Zs,{pluginListCommand:()=>Zd});var Zd,Qs=D(()=>{jt();Zd=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Oe();if(e.installed){let n=Uo();if(n.length===0){console.log("No plugins installed."),console.log(`
232
232
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
233
233
  `),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}):
234
234
  `);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(`
235
- Install a plugin: devflow plugin install <name>`);}});});var Js={};A(Js,{pluginSearchCommand:()=>Hd});var Hd,zs=D(()=>{At();Hd=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Oe(),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(`
235
+ Install a plugin: devflow plugin install <name>`);}});});var Xs={};j(Xs,{pluginSearchCommand:()=>eg});var eg,ei=D(()=>{jt();eg=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Oe(),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(`
236
236
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
237
- `),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 Gs={};A(Gs,{pluginInstallCommand:()=>Ud});var Ud,Ys=D(()=>{Se();Ud=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await Ae(n,process.cwd(),!0);console.log(`
237
+ `),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 ni={};j(ni,{pluginInstallCommand:()=>ng});var ng,oi=D(()=>{Se();ng=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await je(n,process.cwd(),!0);console.log(`
238
238
  ${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
239
239
  Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
240
- ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Qs={};A(Qs,{pluginUninstallCommand:()=>qd});var qd,Xs=D(()=>{Se();qd=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await ln(n,process.cwd(),!0),console.log(`
240
+ ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var si={};j(si,{pluginUninstallCommand:()=>rg});var rg,ii=D(()=>{Se();rg=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await ln(n,process.cwd(),!0),console.log(`
241
241
  ${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
242
- ${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Xt(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 ei=createRequire(import.meta.url),go="0.0.0";try{go=ei("../package.json").version;}catch{try{go=ei("../../package.json").version;}catch{}}var E=new Command;function Vd(e){let t=new URL(e);if(t.protocol!=="http:"||t.hostname!=="127.0.0.1")return Promise.reject(new Error("Only loopback Dashboard URLs can be opened."));let[n,o]=process.platform==="darwin"?["/usr/bin/open",[e]]:process.platform==="win32"?["cmd.exe",["/c","start","",e]]:["xdg-open",[e]];return new Promise((r,s)=>{execFile(n,o,i=>i?s(i):r());})}E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(go).option("--local","Force local engine, skip server");var Gd=E.command("logs").description("Inspect and clean diagnostic logs");Gd.command("cleanup").description("Clean registered diagnostic logs (dry-run by default)").option("--execute","Apply deletions; default is dry-run").option("--older-than <days>","Override retention days").option("--max-bytes <bytes>","Override project and global log budgets").option("--json","Print JSON result").action(async e=>{let{renderLogCleanupResult:t,runLogsCleanupCommand:n}=await Promise.resolve().then(()=>(ko(),vo)),o=n({projectRoot:process.cwd(),execute:!!e.execute,olderThanDays:e.olderThan===void 0?void 0:Number(e.olderThan),maxBytes:e.maxBytes===void 0?void 0:Number(e.maxBytes)});console.log(e.json?JSON.stringify(o):t(o));});E.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=mo.join(t,a);Zt.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Zt.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
243
- `));}let n=Xt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(jo(),Ao)),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(()=>(No(),$o)),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(()=>(dn(),un));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(dn(),un));await i(t);}}});E.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(ar(),ir));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var Yd=E.command("db").description("Manage DevFlow databases");Yd.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(()=>(yr(),hr)),o=t(e);for(let r of n(o))console.log(r);});E.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=Xt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(kr(),vr));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});E.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(Sr(),br)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(Rr(),_r)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});E.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(_n(),Sn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(_n(),Sn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var Qt=E.command("workflow").description("Workflow management");Qt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ut(),lt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var _t=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");_t.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(o({projectRoot:n.project,json:n.json}));});_t.command("show <id>").description("Show worker lifecycle and merge evidence").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{showWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("retry-cleanup <id>").description("Retry conservative cleanup for a terminal or held worker").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{retryWorkerCleanup:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("merge-status <id>").description("Show the worker merge gate state").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{workerMergeStatus:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});Qt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ut(),lt)),o=await n(e,{input:t??""},E.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Qt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ut(),lt)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Qt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ut(),lt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var ti=E.command("embeddings").description("Manage the shared verified embedding model");ti.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Pn(),En)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});ti.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Pn(),En)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var We=E.command("memory").description("Memory management");We.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>($e(),je)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});We.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>($e(),je));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});We.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>($e(),je)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});We.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>($e(),je));await n(e,t,E.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});We.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>($e(),je)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});We.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>($e(),je)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});E.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(xr(),Dr)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fo=E.command("docs").description("Documentation index management");fo.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(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,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(`
242
+ ${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Xt(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 ai=createRequire(import.meta.url),go="0.0.0";try{go=ai("../package.json").version;}catch{try{go=ai("../../package.json").version;}catch{}}var E=new Command;try{let e=await Promise.resolve().then(()=>(wo(),ko));E.addCommand(e.createDefaultDeliveryCommand());}catch(e){if(!(e instanceof Error)||!/Cannot find package ['"]?@devflow-tools\/delivery-line|ERR_MODULE_NOT_FOUND/u.test(e.message))throw e}function cg(e){let t=new URL(e);if(t.protocol!=="http:"||t.hostname!=="127.0.0.1")return Promise.reject(new Error("Only loopback Dashboard URLs can be opened."));let[n,o]=process.platform==="darwin"?["/usr/bin/open",[e]]:process.platform==="win32"?["cmd.exe",["/c","start","",e]]:["xdg-open",[e]];return new Promise((r,s)=>{execFile(n,o,i=>i?s(i):r());})}E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(go).option("--local","Force local engine, skip server");var lg=E.command("logs").description("Inspect and clean diagnostic logs");lg.command("cleanup").description("Clean registered diagnostic logs (dry-run by default)").option("--execute","Apply deletions; default is dry-run").option("--older-than <days>","Override retention days").option("--max-bytes <bytes>","Override project and global log budgets").option("--json","Print JSON result").action(async e=>{let{renderLogCleanupResult:t,runLogsCleanupCommand:n}=await Promise.resolve().then(()=>(Ro(),_o)),o=n({projectRoot:process.cwd(),execute:!!e.execute,olderThanDays:e.olderThan===void 0?void 0:Number(e.olderThan),maxBytes:e.maxBytes===void 0?void 0:Number(e.maxBytes)});console.log(e.json?JSON.stringify(o):t(o));});E.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=mo.join(t,a);Zt.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Zt.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
243
+ `));}let n=Xt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Fo(),Lo)),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(()=>(Wo(),Ho)),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(()=>(dn(),un));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(dn(),un));await i(t);}}});E.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(fr(),mr));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var ug=E.command("db").description("Manage DevFlow databases");ug.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(()=>(Rr(),_r)),o=t(e);for(let r of n(o))console.log(r);});E.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=Xt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Pr(),Er));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});E.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(xr(),Dr)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(jr(),Or)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});E.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(_n(),Sn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(_n(),Sn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var Qt=E.command("workflow").description("Workflow management");Qt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ut(),lt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var _t=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");_t.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(o({projectRoot:n.project,json:n.json}));});_t.command("show <id>").description("Show worker lifecycle and merge evidence").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{showWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("retry-cleanup <id>").description("Retry conservative cleanup for a terminal or held worker").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{retryWorkerCleanup:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("merge-status <id>").description("Show the worker merge gate state").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{workerMergeStatus:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});Qt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ut(),lt)),o=await n(e,{input:t??""},E.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Qt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ut(),lt)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Qt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ut(),lt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var ci=E.command("embeddings").description("Manage the shared verified embedding model");ci.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Pn(),En)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});ci.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(Pn(),En)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var We=E.command("memory").description("Memory management");We.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),Ne)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});We.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),Ne));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});We.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(Ae(),Ne)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});We.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Ae(),Ne));await n(e,t,E.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});We.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Ae(),Ne)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});We.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(Ae(),Ne)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});E.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(Tr(),Ir)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fo=E.command("docs").description("Documentation index management");fo.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(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,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(`
244
244
  ${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(`
245
- All docs synced.`));}});fo.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(()=>(jn(),An)),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`));});fo.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(()=>(jn(),An));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 Rt=E.command("skill").description("Plugin/Skill management");Rt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Se(),rt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Rt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Se(),rt)),n=await t(e,E.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Rt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Se(),rt)),n=await t(e,process.cwd(),E.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Rt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Se(),rt));await t(e,process.cwd(),E.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Rt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(Nn(),Ar));process.exitCode=t(e);});var ni=E.command("mcp").description("Inspect MCP configuration and health");ni.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(Tn(),In));await t(e);});ni.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(Tn(),In));await t(e);});E.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(bs(),ws));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;});We.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(()=>(_s(),Ss));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(Es(),Rs)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var oi=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");oi.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(()=>(ro(),oo));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var ri=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");ri.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(ao(),io));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});ri.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(ao(),io));console.log(t({runId:e.run,output:e.json?"json":"text"}));});oi.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(()=>(ro(),oo));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});E.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(js(),As)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var po=E.command("server").description("Manage DevFlow server");po.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async(e,t)=>{let{startServer:n}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Ce(),bt));console.log(S.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(S.green(o("ready",{url:r.state.url}))),r.reused&&console.log(S.dim(o("reused")));});po.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Ce(),bt)),n=await e();console.log(n?S.green(t("stopped")):S.dim(t("notRunning")));});po.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Ce(),bt)),n=await e();n.running&&n.state?console.log(S.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(S.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Ce(),bt)),r=mo.resolve(e.project);if(!Zt.existsSync(r)||!Zt.statSync(r).isDirectory())throw new Error(o("projectRequired"));let s=await n({reason:"cli-dashboard",projectRoot:r,port:e.port===void 0?void 0:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli",noStart:e.start===false}),i={url:s.state.url,projectId:s.projectId,runtime:s.state,reused:s.reused};if(e.json?console.log(JSON.stringify(i)):(console.log(S.green(o("ready",{url:s.state.url}))),s.reused&&console.log(S.dim(o("reused")))),e.open)try{await Vd(s.state.url);}catch(a){console.error(S.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(Ts(),Is));await n({port:Number(e.port),background:!!e.background,explicitPort:t.getOptionValueSource("port")==="cli"});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Fs(),Ls));await e();});E.command("status").description("Show DevFlow services status").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).action(async e=>{let{showStatus:t}=await Promise.resolve().then(()=>(Ws(),Hs));await t({json:!!e.json,projectRoot:mo.resolve(e.project)});});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Bs(),Us));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=E.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Ks(),qs)),Promise.resolve().then(()=>(zs(),Js)),Promise.resolve().then(()=>(Ys(),Gs)),Promise.resolve().then(()=>(Xs(),Qs))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await E.parseAsync();
245
+ All docs synced.`));}});fo.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(()=>(Nn(),jn)),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`));});fo.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(()=>(Nn(),jn));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 Rt=E.command("skill").description("Plugin/Skill management");Rt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Se(),rt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Rt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Se(),rt)),n=await t(e,E.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Rt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Se(),rt)),n=await t(e,process.cwd(),E.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Rt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Se(),rt));await t(e,process.cwd(),E.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Rt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>($n(),Lr));process.exitCode=t(e);});var li=E.command("mcp").description("Inspect MCP configuration and health");li.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(Tn(),In));await t(e);});li.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(Tn(),In));await t(e);});E.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(Ds(),Cs));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;});We.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(()=>(Os(),xs));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(Ns(),js)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ui=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ui.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(()=>(ro(),oo));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var di=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");di.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(ao(),io));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});di.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(ao(),io));console.log(t({runId:e.run,output:e.json?"json":"text"}));});ui.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(()=>(ro(),oo));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});E.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(Fs(),Ls)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var po=E.command("server").description("Manage DevFlow server");po.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async(e,t)=>{let{startServer:n}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Ce(),bt));console.log(S.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(S.green(o("ready",{url:r.state.url}))),r.reused&&console.log(S.dim(o("reused")));});po.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Ce(),bt)),n=await e();console.log(n?S.green(t("stopped")):S.dim(t("notRunning")));});po.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Ce(),bt)),n=await e();n.running&&n.state?console.log(S.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(S.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(me(),ft)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Ce(),bt)),r=mo.resolve(e.project);if(!Zt.existsSync(r)||!Zt.statSync(r).isDirectory())throw new Error(o("projectRequired"));let s=await n({reason:"cli-dashboard",projectRoot:r,port:e.port===void 0?void 0:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli",noStart:e.start===false}),i={url:s.state.url,projectId:s.projectId,runtime:s.state,reused:s.reused};if(e.json?console.log(JSON.stringify(i)):(console.log(S.green(o("ready",{url:s.state.url}))),s.reused&&console.log(S.dim(o("reused")))),e.open)try{await cg(s.state.url);}catch(a){console.error(S.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(qs(),Us));await n({port:Number(e.port),background:!!e.background,explicitPort:t.getOptionValueSource("port")==="cli"});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Js(),Ks));await e();});E.command("status").description("Show DevFlow services status").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).action(async e=>{let{showStatus:t}=await Promise.resolve().then(()=>(zs(),Vs));await t({json:!!e.json,projectRoot:mo.resolve(e.project)});});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Ys(),Gs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=E.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Qs(),Zs)),Promise.resolve().then(()=>(ei(),Xs)),Promise.resolve().then(()=>(oi(),ni)),Promise.resolve().then(()=>(ii(),si))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await E.parseAsync();