@devflow-tools/devflow 0.16.21 → 0.16.23

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 (47) hide show
  1. package/dist/cli.js +89 -74
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/accuracy.html +1 -1
  4. package/dist/dashboard/accuracy.txt +1 -1
  5. package/dist/dashboard/benchmark.html +1 -1
  6. package/dist/dashboard/benchmark.txt +1 -1
  7. package/dist/dashboard/context.html +1 -1
  8. package/dist/dashboard/context.txt +1 -1
  9. package/dist/dashboard/doctor.html +1 -1
  10. package/dist/dashboard/doctor.txt +1 -1
  11. package/dist/dashboard/executions.html +1 -1
  12. package/dist/dashboard/executions.txt +1 -1
  13. package/dist/dashboard/graph.html +1 -1
  14. package/dist/dashboard/graph.txt +1 -1
  15. package/dist/dashboard/index.html +1 -1
  16. package/dist/dashboard/index.txt +1 -1
  17. package/dist/dashboard/knowledge.html +1 -1
  18. package/dist/dashboard/knowledge.txt +1 -1
  19. package/dist/dashboard/memory.html +1 -1
  20. package/dist/dashboard/memory.txt +1 -1
  21. package/dist/dashboard/replay.html +1 -1
  22. package/dist/dashboard/replay.txt +1 -1
  23. package/dist/dashboard/runs/_.html +1 -1
  24. package/dist/dashboard/runs/_.txt +1 -1
  25. package/dist/dashboard/runs.html +1 -1
  26. package/dist/dashboard/runs.txt +1 -1
  27. package/dist/dashboard/settings.html +1 -1
  28. package/dist/dashboard/settings.txt +1 -1
  29. package/dist/dashboard/timeline.html +1 -1
  30. package/dist/dashboard/timeline.txt +1 -1
  31. package/dist/dashboard/tool-metrics.html +1 -1
  32. package/dist/dashboard/tool-metrics.txt +1 -1
  33. package/dist/dashboard/workflows.html +1 -1
  34. package/dist/dashboard/workflows.txt +1 -1
  35. package/dist/hooks/hook-daemon.js +22 -21
  36. package/dist/hooks/pre-tool-use.js +1 -1
  37. package/dist/hooks/user-prompt-submit.js +8 -8
  38. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  39. package/dist/plugin/dist/command-registry.json +5 -5
  40. package/dist/plugin/dist/hooks/hook-daemon.js +22 -21
  41. package/dist/plugin/dist/hooks/pre-tool-use.js +1 -1
  42. package/dist/plugin/dist/hooks/user-prompt-submit.js +8 -8
  43. package/dist/plugin/package.json +7 -7
  44. package/package.json +13 -13
  45. package/plugin-registry.json +29 -29
  46. /package/dist/dashboard/_next/static/{IECrml6HprTKh-FqL5nOf → F4k3SsSAFHs_wWTynLm-l}/_buildManifest.js +0 -0
  47. /package/dist/dashboard/_next/static/{IECrml6HprTKh-FqL5nOf → F4k3SsSAFHs_wWTynLm-l}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {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 {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import js,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import td,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import uo from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {spawn,execSync,execFileSync}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import Fa from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Us=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var n in t)Us(e,n,{get:t[n],enumerable:true});};function bt(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function Ce(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of ei)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:no(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,Vt);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:no(l)??c.name,mtimeMs:statSync$1(l).mtimeMs});}}catch{}}r.sort((i,a)=>a.mtimeMs-i.mtimeMs);let s=r[0];return s?{root:s.root,version:s.version}:{root:null,version:null}}function Ge(e,t){let n=ti(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=so(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=zt(c.content),d=readFileSync$1(l,"utf-8"),g=zt(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 ro(e,t,n,o=Date.now,r={}){let s=Ge(e,t).filter(c=>c.isKnownDevFlowArtifact||r.includeModified===true);if(s.length===0)return [];let i=join$1(e,".devflow","backups","global-skills",new Date(o()).toISOString().replace(/[:.]/g,"-")),a=[];for(let c of s){if(!existsSync$1(c.globalPath)||!lstatSync(c.globalPath).isFile()||zt(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(dirname(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname(c.globalPath),{recursive:!1,force:!1});}catch{}a.push({skillName:c.skillName,originalPath:c.globalPath,backupPath:l,hash:c.globalHash,pluginHash:c.pluginHash,contentChanged:!c.isKnownDevFlowArtifact,version:n});}return a.length>0&&writeFileSync$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
3
- `,"utf-8"),a}function ti(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=so(r);s&&t.set(s.name,r);}return t}function so(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 zt(e){return createHash("sha256").update(e).digest("hex")}function no(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 io(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[yt]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",He),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[He]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
- `);}function ao(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 St(e,t,n){let o=join$1(t,He,Vt,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&vt(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)&&vt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&vt(a,join$1(o,"skills")),ri(o,e),si(o),ni(t,o),oi(t,o,n);}function ni(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",He),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:He,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:Vt,source:s}]},null,2)}
2
+ import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import Vs,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Td,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import _o from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import _ from'chalk';import {spawn,execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import uc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {Command}from'commander';var ti=Object.defineProperty;var O=(e,t)=>()=>(e&&(t=e(e=0)),t);var x=(e,t)=>{for(var n in t)ti(e,n,{get:t[n],enumerable:true});};function Ct(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function Ce(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of mi)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:mo(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:mo(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 Xe(e,t){let n=pi(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=yo(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 ho(e,t,n,o=Date.now,r={}){let s=Xe(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)}
3
+ `,"utf-8"),a}function pi(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=yo(r);s&&t.set(s.name,r);}return t}function yo(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 mo(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 vo(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[St]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",He),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[He]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
4
+ `);}function ko(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 Dt(e,t,n){let o=join$1(t,He,nn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Et(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)&&Et(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Et(a,join$1(o,"skills")),vi(o,e),ki(o),hi(t,o),yi(t,o,n);}function hi(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",He),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:He,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:nn,source:s}]},null,2)}
5
5
  `);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[He]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
6
- `);}function oi(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[yt];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${yt}`);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[yt]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
7
- `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ri(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 vt(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()?vt(o,r):cpSync(o,r,{force:true});}}function si(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 yt,He,Vt,ei,Be=A(()=>{yt="devflow@devflow-local",He="devflow-local",Vt="devflow",ei=["devflow@devflow-local","devflow@devflow"];});var mo={};O(mo,{initProject:()=>gi,renderInitReport:()=>fo});async function gi(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(go.isInitialized(e)||await go.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,fo(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=bt(),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";St(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=ro(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");io(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=di.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}ao(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function fo(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
8
- `)}var go,di,po=A(()=>{Be();go=uo.default??uo,di=createRequire(import.meta.url);});var ho={};O(ho,{reviewPluginMemoryHints:()=>hi});async function hi(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(yi).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??vi)(e,l),{available:i.length,selected:l.length}}function yi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function vi(e,t){let n=new MemoryGate(e);try{for(let o of t)await n.addMemory({category:"project_knowledge",content:`${o.convention.key}: ${o.convention.value}`,originalText:o.convention.value,source:"manual",confidence:o.convention.confidence,scope:`plugin:${o.pluginName}`});}finally{n.close();}}var yo=A(()=>{});function Ae(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ei,"../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 vo(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var _i,Ei,_t=A(()=>{_i=fileURLToPath$1(import.meta.url),Ei=dirname$1(_i);});async function x(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url;if(o.skipServer)return n();let s=false,i=wo.get(r);if(i&&Date.now()-i.ts<$i?s=i.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),s?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),wo.set(r,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:r,projectRoot:e});return t(a)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var wo,$i,we=A(()=>{wo=new Map,$i=3e4;});var So=A(()=>{});var Ze={};O(Ze,{installSkill:()=>$e,listSkills:()=>Do,listSkillsSync:()=>Ii,searchSkills:()=>Mi,uninstallSkill:()=>en});async function Do(e){return x(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function Ii(){return []}async function Mi(e,t){let n=await Do(),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 Ao(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 $o(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Oo(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
9
- `,"utf-8"),renameSync$1(o,n);}async function $e(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=Ao(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(Ye,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync("npm",["install","--prefix",Ye,o],{stdio:"pipe",timeout:6e4});let a=$o(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Oo(t,a));let c=[],l="0.0.0",u=join(Ye,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function en(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Ao(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=$o(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Oo(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("npm",["uninstall","--prefix",Ye,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(Ye,"node_modules",o);existsSync(l)&&rmSync$1(l,{recursive:true,force:true});}a&&(c.length>0?(a.projects=c,upsertPluginInstallRecord(a)):removePluginInstallRecord(o));},{skipServer:true})}var Ye,be=A(()=>{we();So();Ye=getPluginInstallRoot();});var tn={};O(tn,{detectTechStack:()=>Fi,guidePluginInstallation:()=>Ui,installPluginsFromList:()=>Hi,resolvePluginName:()=>No});function Fi(e){let t=Ae();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function No(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Hi(e){let t=e.split(",").map(No).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await $e(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Ui(e){let t=Ae();if(t.plugins.length===0)return console.log(`
6
+ `);}function yi(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[St];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${St}`);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[St]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
7
+ `);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function vi(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 Et(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()?Et(o,r):cpSync(o,r,{force:true});}}function ki(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 St,He,nn,mi,qe=O(()=>{St="devflow@devflow-local",He="devflow-local",nn="devflow",mi=["devflow@devflow-local","devflow@devflow"];});var Ro={};x(Ro,{initProject:()=>Pi,renderInitReport:()=>Eo});async function Pi(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(So.isInitialized(e)||await So.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,Eo(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=Ct(),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";Dt(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=ho(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");vo(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Ri.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}ko(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Eo(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
8
+ `)}var So,Ri,Po=O(()=>{qe();So=_o.default??_o,Ri=createRequire(import.meta.url);});var Co={};x(Co,{reviewPluginMemoryHints:()=>$i});async function $i(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??Ai)(e,l),{available:i.length,selected:l.length}}function xi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ai(e,t){let n=new MemoryGate(e);try{for(let o of t)await n.addMemory({category:"project_knowledge",content:`${o.convention.key}: ${o.convention.value}`,originalText:o.convention.value,source:"manual",confidence:o.convention.confidence,scope:`plugin:${o.pluginName}`});}finally{n.close();}}var Do=O(()=>{});function Oe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Li,"../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 Oo(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Mi,Li,Ot=O(()=>{Mi=fileURLToPath$1(import.meta.url),Li=dirname$1(Mi);});async function A(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url;if(o.skipServer)return n();let s=false,i=xo.get(r);if(i&&Date.now()-i.ts<Bi?s=i.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),s?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),xo.set(r,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:r,projectRoot:e});return t(a)}return console.error(_.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var xo,Bi,we=O(()=>{xo=new Map,Bi=3e4;});var No=O(()=>{});var tt={};x(tt,{installSkill:()=>$e,listSkills:()=>Fo,listSkillsSync:()=>Yi,searchSkills:()=>Zi,uninstallSkill:()=>ln});async function Fo(e){return A(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 Yi(){return []}async function Zi(e,t){let n=await Fo(),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 Ho(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 Wo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Uo(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
9
+ `,"utf-8"),renameSync$1(o,n);}async function $e(e,t=process.cwd(),n){return A(t,async o=>await o.installPlugin(e),async()=>{let o=Ho(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(et,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",et,o],{stdio:"pipe",timeout:6e4});let a=Wo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Uo(t,a));let c=[],l="0.0.0",u=join(et,"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 A(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Ho(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Wo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Uo(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",et,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(et,"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 et,be=O(()=>{we();No();et=getPluginInstallRoot();});var un={};x(un,{detectTechStack:()=>Xi,guidePluginInstallation:()=>ta,installPluginsFromList:()=>ea,resolvePluginName:()=>Bo});function Xi(e){let t=Oe();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Bo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function ea(e){let t=e.split(",").map(Bo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await $e(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function ta(e){let t=Oe();if(t.plugins.length===0)return console.log(`
10
10
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
11
11
  `),[];console.log(`
12
12
  \u{1F50C} Plugin Installation Guide
@@ -20,33 +20,34 @@ Installing selected plugins...
20
20
  `);}catch{console.error(`\u2717 Failed to install ${a}
21
21
  `);}}else console.log(`
22
22
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
23
- `);return i}var nn=A(()=>{_t();be();});var qo={};O(qo,{ResetExecutionError:()=>Qe,executeResetCommand:()=>la,formatResetResult:()=>cn,runReset:()=>Bo});function ea(){if(Et)return Et;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Et=e.DatabaseSync,Et}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function cn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function ta(e){return e==="all"||Fo.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function rn(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 ln(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function na(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 Ho(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(!ln(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function oa(e,t){return (e==="all"?Fo:[e]).map(o=>({scope:o,path:join$1(t,...Lo[o])}))}function Uo(e,t){let n=se(t);if(n)return Ho(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Wo(e,t){let n=Uo(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 ra(e){let t=se(e);if(!t?.isFile()||t.size<on.length)return false;let n=Buffer.alloc(on.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(on)}finally{closeSync(o);}}function sa(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}ra(o)&&t.push(o);}}return n(e),t}function ia(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ea())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function aa(e,t,n){let o=sa(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));ia(s,i);}}function ca(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),aa(c.path,join$1(i,c.scope),()=>Wo(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 Bo(e,t={}){if(!ta(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=na(e.project??process.cwd()),o=oa(e.scope,n);for(let c of o)Ho(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=Uo(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?rn(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=rn(l.path),d=join$1(s,l.scope),g=rn(d);if(ln(u,g)||ln(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&&ca(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Wo(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new Qe(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function la(e,t={},n=console){try{let o=Bo(e,t),r=cn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof Qe)for(let r of cn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Et,Qe,Lo,Fo,on,Ko=A(()=>{Qe=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Lo={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Fo=Object.keys(Lo),on=Buffer.from("SQLite format 3\0","binary");});var er={};O(er,{consolidateDatabases:()=>fa,formatConsolidateResult:()=>ma});function fa(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=[zo("project",o,s?n:void 0),zo("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")?pa(o):null;try{let f=new Map;for(let y of c){let k=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);Vo(y.path,k),f.set(y.kind,k);}s&&Vo(n,join$1(d,"global-devflow.db.before"));let p=f.has("project")?ya(o,d):[];a.retired.push(...p.map(y=>y.destination));let m=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),m=new DatabaseSync(n),m.exec("PRAGMA busy_timeout = 10000"),m.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&m.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&m.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),m.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&Go(m,"project_source",void 0,a.inserted),f.has("codegraph")){Go(m,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let k of tt(m,"codegraph_source").filter(C=>C.startsWith("devflow_")))m.exec(`DROP TABLE codegraph_source.${F(k)}`);}m.exec("COMMIT"),h=!1;}catch(y){if(h)try{m?.exec("ROLLBACK");}catch{}throw Xo(p),y}finally{m?.close();}return a}finally{ha(g);}}function ma(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 zo(e,t,n){let o={kind:e,path:t,exists:existsSync$1(t),tables:{},conflicts:{}};if(!o.exists)return o;let r=new DatabaseSync(t,{readOnly:true}),s=n&&existsSync$1(n)?new DatabaseSync(n,{readOnly:true}):null;try{let i=e==="codegraph"?new Set(DEVFLOW_TABLE_NAMES):null;for(let a of tt(r).filter(c=>!i||i.has(c)))o.tables[a]=fn(r,a),o.conflicts[a]=s&&tt(s).includes(a)?va(r,s,a):0;}finally{r.close(),s?.close();}return o}function Vo(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 pa(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 ha(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function ya(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 Xo(n),o}return n}function Xo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Go(e,t,n,o){let r=new Set(tt(e)),s=tt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Rt(e,"main",i),c=new Set(Rt(e,t,i).map(p=>p.name)),l=a.filter(p=>c.has(p.name));if(gn.has(i)&&(l=l.filter(p=>p.pk===0)),l.length===0)continue;let u=fn(e,i),d=l.map(p=>F(p.name)).join(", "),g=l.map(p=>`s.${F(p.name)}`).join(", ");if(l.filter(p=>p.pk>0).length>0&&!gn.has(i))e.exec(`INSERT OR IGNORE INTO main.${F(i)} (${d}) SELECT ${g} FROM ${F(t)}.${F(i)} s`);else {let p=l.map(m=>`t.${F(m.name)} IS s.${F(m.name)}`).join(" AND ");e.exec(`
24
- INSERT INTO main.${F(i)} (${d})
25
- SELECT ${g} FROM ${F(t)}.${F(i)} s
26
- WHERE NOT EXISTS (SELECT 1 FROM main.${F(i)} t WHERE ${p})
27
- `);}o[i]=(o[i]??0)+(fn(e,i)-u);}}function va(e,t,n){let o=new Set(Rt(t,"main",n).map(l=>l.name)),r=Rt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||gn.has(n))return 0;let s=r.map(l=>F(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${F(n)}`).all(),a=r.map(l=>`${F(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${F(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function tt(e,t="main"){return e.prepare(`SELECT name FROM ${F(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Rt(e,t,n){return e.prepare(`PRAGMA ${F(t)}.table_info(${F(n)})`).all()}function fn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${F(t)}`).get();return Number(n.count)}function F(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var gn,tr=A(()=>{gn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var nr={};O(nr,{connectAgent:()=>ba,getAvailableAgents:()=>Sa});async function ba(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 Sa(){return listAdapters()}var or=A(()=>{});var sr={};O(sr,{getIndexStatus:()=>_a,refreshIndex:()=>Ea});async function _a(e){return x(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function Ea(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var ir=A(()=>{we();});var ar={};O(ar,{getGraph:()=>Ra});async function Ra(e={}){let t=e.target??"all",n=e.depth??2;return x(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var cr=A(()=>{we();});var mn={};O(mn,{getContext:()=>Da,getTaskContext:()=>Aa});async function Da(e){return x(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function Aa(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var pn=A(()=>{we();});var nt={};O(nt,{getWorkflowRuns:()=>ur,getWorkflowStatus:()=>xa,listWorkflows:()=>$a,runWorkflow:()=>Oa});async function $a(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Oa(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function xa(e){return ur(e)}async function ur(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ot=A(()=>{we();});var yn={};O(yn,{getEmbeddingStatus:()=>ja,prepareEmbeddings:()=>Ia,renderEmbeddingStatus:()=>Ma});async function ja(){return inspectEmbeddingModel()}async function Ia(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Ma(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
28
- `)}var vn=A(()=>{});var Oe={};O(Oe,{backfillObservationVectors:()=>qa,queryMemory:()=>Ua,reviewCandidates:()=>Ba,reviewMemories:()=>Ja,setMemory:()=>Wa,showMemory:()=>Ha});async function Ha(e,t){let n=await x(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function Ua(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Wa(e,t,n){return x(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function Ba(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function qa(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ka(e){let t=Fa.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Ja(){let t=await x(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
29
- [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ka(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await x(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await x(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
30
- Reviewed ${o}/${t.length} pending memories.`);}var xe=A(()=>{we();});var gr={};O(gr,{getDocsStatus:()=>Ga,queryKnowledge:()=>dr,searchKnowledge:()=>Va,syncDocs:()=>Ya});async function dr(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function Va(e,t,n){return (await dr(e,t,void 0,n)).results}async function Ga(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ya(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var fr=A(()=>{we();});var bn={};O(bn,{backfillKnowledgeVectors:()=>ec,resyncKnowledgeDocs:()=>Xa});function mr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Xa(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 ec(e={}){let t=mr(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var Sn=A(()=>{});var pr={};O(pr,{inspectSkillHealth:()=>Ct,showSkillHealth:()=>cc});function ic(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 Ct(e){let t=e===void 0?Ce(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];ac(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=ic(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 ac(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 cc(e={}){let t=Ct(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 En=A(()=>{Be();});var Pn={};O(Pn,{showMcpHealth:()=>mc,showMcpInventory:()=>fc});async function fc(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 mc(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 Rn=A(()=>{});var At={};O(At,{DEFAULT_SERVER_PORT:()=>$n,readPidFromFile:()=>st,readPortFromFile:()=>wr,serverStatus:()=>ct,startServer:()=>On,stopServer:()=>at});function An(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function _c(){try{return vr.resolve("./server.js")}catch{try{return vr.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function wr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
31
- `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function st(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
32
- `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function On(e){let t=_c(),n=An(process.cwd()),o=randomUUID(),r=spawn(process.execPath,[t,"--devflow-instance-token",o],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});writeFileSync(n,`${e.port}
33
- ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await Ec(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function at(){let e=An(process.cwd()),t=st(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),!0}catch{return unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),false}}async function ct(){let e=An(process.cwd()),t=resolveRuntimeEndpoint(),n=wr(e)??t.port,{DevFlowApiClient:o}=await import('@devflow-tools/sdk');if(await new o({baseUrl:`http://127.0.0.1:${n}`,projectRoot:process.cwd()}).ping()){let a=st(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!st(e)||i.pid===st(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function Ec(e,t){let n=Date.now()+t;for(;Date.now()<n;){try{if((await fetch(new URL("/api/health",e),{signal:AbortSignal.timeout(500)})).ok)return !0}catch{}await new Promise(o=>setTimeout(o,100));}return false}var vr,$n,_e=A(()=>{vr=createRequire(import.meta.url);$n=DEFAULT_DEVFLOW_SERVER_PORT;});var rs={};O(rs,{renderDoctorText:()=>ns,runDoctor:()=>su,runDoctorAudit:()=>au,runDoctorAuditFix:()=>cu,runDoctorCommand:()=>iu,runDoctorReceipts:()=>uu,runDoctorViolations:()=>lu,runLegacyDoctorReport:()=>os,runStructuredDoctor:()=>Vn});function Ft(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function br(e){return join$1(homedir$1(),".devflow","daemons",`${Ft(e)}.sock`)}function Lc(){return join$1(homedir$1(),".devflow","daemons.json")}function Wr(){if(Ot)return Ot;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ot=e.DatabaseSync,Ot}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function N(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Fc(e,t){let n=t.homePath??homedir$1(),o=[],r=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(o.push({key:"host_adapter",value:r.status==="selected"?{id:r.adapter.id,candidates:r.candidates,explicit:r.explicit}:{status:"failed",code:r.code,candidates:r.candidates,reason:r.reason,action:r.action},target:"one explicitly selected or uniquely detected host",ok:r.status==="selected",severity:"warning"}),r.status==="selected"){let p=await r.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});o.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(m=>m.status==="supported"||!!(m.reason&&m.fallback)),severity:"error"});}let s=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),i=s.diagnostics.filter(p=>p.status==="failed");o.push({key:"plugin_runtime",value:s.diagnostics,target:"configured plugins loadable with diagnostics",ok:i.length===0,severity:"warning"});let a=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));o.push({key:"mcp_inventory",value:{servers:a.servers.length,duplicates:a.duplicates.length,unreadable:a.unreadable.length},target:{duplicates:0,unreadable:0},ok:a.unreadable.length===0,severity:a.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:a.duplicates.filter(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:a.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let c=await checkMcpHealth(a,n),l=c.records.filter(p=>p.status==="unhealthy");o.push({key:"mcp_health",value:c.records,target:"no unhealthy enabled servers",ok:l.length===0,severity:"warning"});let u=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(u){let p=Ct(u);o.push({key:"skill_health",value:{root:p.pluginRoot,skills:p.skills,commands:p.commands,issues:p.issues},target:"valid and fully bound installed skills",ok:p.healthy,severity:"warning"});}let d=readRuntimeEndpointState(n);o.push({key:"runtime_endpoint_registry",value:d??"not registered",target:"healthy while active, stopped or absent while idle",ok:!d||d.status==="healthy"||d.status==="stopped",severity:d?.status==="degraded"?"error":"warning"});let g=(t.now??Date.now)(),f=listRuntimeHttpCircuits(n).filter(p=>p.status==="open"&&(p.openUntil??0)>g);return o.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:N(o),metrics:o}}function Fn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Hc(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!==Ft(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Uc(e,t){let n=Fn(e),o=Ft(n.path),r=br(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:o,ok:true,severity:"info"},{key:"daemon_socket_path",value:r,target:`path containing ${o}`,ok:r.includes(o),severity:"error"}],i=t.registryPath??Lc();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(g=>Hc(g).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let l=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Fn(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:l.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:l.length},target:"0 when idle or 1 while active",ok:l.length<=1,severity:"warning"});let u=l.map(g=>br(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:u,target:[r],ok:!0,severity:"info"});let d=l.filter((g,f)=>g.projectHash!==o||u[f]!==r).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),s.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:N(s),metrics:s}}function Bc(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(Wc)){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 Br(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 qc(e){let t=Br(e);return t&&t.length>0?t:null}function Nn(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 Kc(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Sr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function zc(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:N(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Wr())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Bc(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:N(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
23
+ `);return i}var dn=O(()=>{Ot();be();});var tr={};x(tr,{ResetExecutionError:()=>nt,executeResetCommand:()=>Sa,formatResetResult:()=>hn,runReset:()=>er});function ma(){if($t)return $t;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return $t=e.DatabaseSync,$t}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 pa(e){return e==="all"||Yo.includes(e)}function ie(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function fn(e){let t=resolve(e),n=[];for(;!ie(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 ha(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 Zo(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=ie(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(ie(t)){let o=realpathSync(t);if(!yn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function ya(e,t){return (e==="all"?Yo:[e]).map(o=>({scope:o,path:join$1(t,...Go[o])}))}function Qo(e,t){let n=ie(t);if(n)return Zo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Xo(e,t){let n=Qo(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 va(e){let t=ie(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 ka(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}va(o)&&t.push(o);}}return n(e),t}function wa(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ma())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function ba(e,t,n){let o=ka(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));wa(s,i);}}function _a(e,t,n,o,r){let s=!!ie(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),ba(c.path,join$1(i,c.scope),()=>Xo(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(ie(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&&ie(t))try{rmdirSync(t);}catch{}}}function er(e,t={}){if(!pa(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=ha(e.project??process.cwd()),o=ya(e.scope,n);for(let c of o)Zo(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=Qo(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?fn(e.backupTo):void 0;if(s){let c=ie(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=fn(l.path),d=join$1(s,l.scope),g=fn(d);if(yn(u,g)||yn(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(ie(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&&_a(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Xo(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new nt(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Sa(e,t={},n=console){try{let o=er(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 nt)for(let r of hn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var $t,nt,Go,Yo,gn,nr=O(()=>{nt=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Go={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Yo=Object.keys(Go),gn=Buffer.from("SQLite format 3\0","binary");});var dr={};x(dr,{consolidateDatabases:()=>Ca,formatConsolidateResult:()=>Da});function Ca(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=[rr("project",o,s?n:void 0),rr("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")?Oa(o):null;try{let f=new Map;for(let y of c){let k=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);sr(y.path,k),f.set(y.kind,k);}s&&sr(n,join$1(d,"global-devflow.db.before"));let p=f.has("project")?xa(o,d):[];a.retired.push(...p.map(y=>y.destination));let m=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),m=new DatabaseSync(n),m.exec("PRAGMA busy_timeout = 10000"),m.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&m.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&m.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),m.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&ir(m,"project_source",void 0,a.inserted),f.has("codegraph")){ir(m,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let k of st(m,"codegraph_source").filter(C=>C.startsWith("devflow_")))m.exec(`DROP TABLE codegraph_source.${H(k)}`);}m.exec("COMMIT"),h=!1;}catch(y){if(h)try{m?.exec("ROLLBACK");}catch{}throw ur(p),y}finally{m?.close();}return a}finally{$a(g);}}function Da(e){let t=[`${e.dryRun?"Dry run":"Consolidated"} target: ${e.targetPath}`];for(let n of e.sources){let o=Object.values(n.tables).reduce((s,i)=>s+i,0),r=Object.values(n.conflicts).reduce((s,i)=>s+i,0);t.push(`${n.kind}: ${n.exists?`${o} rows, ${r} conflicts`:"not found"} (${n.path})`);}if(!e.dryRun){let n=Object.values(e.inserted).reduce((o,r)=>o+r,0);t.push(`Inserted: ${n} rows`),e.backupDir&&t.push(`Backup: ${e.backupDir}`);}return t}function rr(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 st(r).filter(c=>!i||i.has(c)))o.tables[a]=bn(r,a),o.conflicts[a]=s&&st(s).includes(a)?Aa(r,s,a):0;}finally{r.close(),s?.close();}return o}function sr(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 Oa(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 $a(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function xa(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 ur(n),o}return n}function ur(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function ir(e,t,n,o){let r=new Set(st(e)),s=st(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=At(e,"main",i),c=new Set(At(e,t,i).map(p=>p.name)),l=a.filter(p=>c.has(p.name));if(wn.has(i)&&(l=l.filter(p=>p.pk===0)),l.length===0)continue;let u=bn(e,i),d=l.map(p=>H(p.name)).join(", "),g=l.map(p=>`s.${H(p.name)}`).join(", ");if(l.filter(p=>p.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 p=l.map(m=>`t.${H(m.name)} IS s.${H(m.name)}`).join(" AND ");e.exec(`
24
+ INSERT INTO main.${H(i)} (${d})
25
+ SELECT ${g} FROM ${H(t)}.${H(i)} s
26
+ WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${p})
27
+ `);}o[i]=(o[i]??0)+(bn(e,i)-u);}}function Aa(e,t,n){let o=new Set(At(t,"main",n).map(l=>l.name)),r=At(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 st(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 At(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,gr=O(()=>{wn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var fr={};x(fr,{connectAgent:()=>Ta,getAvailableAgents:()=>Ia});async function Ta(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 Ia(){return listAdapters()}var mr=O(()=>{});var hr={};x(hr,{getIndexStatus:()=>Ma,refreshIndex:()=>La});async function Ma(e){return A(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function La(e){return A(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var yr=O(()=>{we();});var vr={};x(vr,{getGraph:()=>Ha});async function Ha(e={}){let t=e.target??"all",n=e.depth??2;return A(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 kr=O(()=>{we();});var _n={};x(_n,{getContext:()=>Ua,getTaskContext:()=>qa});async function Ua(e){return A(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 qa(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return A(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var Sn=O(()=>{we();});var it={};x(it,{getWorkflowRuns:()=>br,getWorkflowStatus:()=>Ja,listWorkflows:()=>Ba,runWorkflow:()=>Ka});async function Ba(e){return A(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Ka(e,t,n){return A(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Ja(e){return br(e)}async function br(e){return A(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var at=O(()=>{we();});var Ve={};x(Ve,{cancelWorker:()=>Xa,listWorkers:()=>Za,retryWorkerCleanup:()=>ec,showWorker:()=>Qa,workerMergeStatus:()=>tc});function Za(e){return ct(e,t=>ze(e.json,{projectRoot:Je(e.projectRoot),workers:t.listWorkflowWorkers(Je(e.projectRoot))}))}function Qa(e,t){return ct(t,n=>{let o=Je(t.projectRoot),r=Nt(n,o,e);return ze(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function Xa(e,t){return ct(t,n=>{let o=Je(t.projectRoot),r=Nt(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"}}),ze(t.json,s)})}function ec(e,t){return ct(t,n=>{let o=Je(t.projectRoot),r=Nt(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 ze(t.json,s)})}function tc(e,t){return ct(t,n=>{let o=Je(t.projectRoot);Nt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return ze(t.json,r??{workerId:e,state:"not_queued"})})}function Nt(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 Je(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function ct(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function ze(e,t){if(e)return JSON.stringify(t,null,2);if(nc(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(oc(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=>ze(false,o)).join(`
28
+ `)}return JSON.stringify(t,null,2)}function nc(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function oc(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Ge=O(()=>{});var Rn={};x(Rn,{getEmbeddingStatus:()=>ic,prepareEmbeddings:()=>ac,renderEmbeddingStatus:()=>cc});async function ic(){return inspectEmbeddingModel()}async function ac(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function cc(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(`
29
+ `)}var Pn=O(()=>{});var xe={};x(xe,{backfillObservationVectors:()=>pc,queryMemory:()=>gc,reviewCandidates:()=>mc,reviewMemories:()=>yc,setMemory:()=>fc,showMemory:()=>dc});async function dc(e,t){let n=await A(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 gc(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return A(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function fc(e,t,n){return A(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 mc(e){return A(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function pc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function hc(e){let t=uc.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function yc(){let t=await A(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(`
30
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await hc(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await A(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await A(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
31
+ Reviewed ${o}/${t.length} pending memories.`);}var Ae=O(()=>{we();});var Sr={};x(Sr,{getDocsStatus:()=>wc,queryKnowledge:()=>_r,searchKnowledge:()=>kc,syncDocs:()=>bc});async function _r(e,t,n,o){return A(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function kc(e,t,n){return (await _r(e,t,void 0,n)).results}async function wc(e){return A(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function bc(e,t){return A(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var Er=O(()=>{we();});var On={};x(On,{backfillKnowledgeVectors:()=>Rc,resyncKnowledgeDocs:()=>Ec});function Rr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Ec(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Rr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Rc(e={}){let t=Rr(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var $n=O(()=>{});var Pr={};x(Pr,{inspectSkillHealth:()=>jt,showSkillHealth:()=>Nc});function xc(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 jt(e){let t=e===void 0?Ce(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];Ac(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=xc(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 Ac(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 Nc(e={}){let t=jt(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 An=O(()=>{qe();});var Nn={};x(Nn,{showMcpHealth:()=>Fc,showMcpInventory:()=>Lc});async function Lc(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 Fc(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 jn=O(()=>{});var It={};x(It,{DEFAULT_SERVER_PORT:()=>Ln,readPidFromFile:()=>ut,readPortFromFile:()=>xr,serverStatus:()=>ft,startServer:()=>Fn,stopServer:()=>gt});function Mn(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Vc(){try{return Or.resolve("./server.js")}catch{try{return Or.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function xr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
32
+ `);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function ut(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
33
+ `),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Fn(e){let t=Vc(),n=Mn(process.cwd()),o=randomUUID(),r=spawn(process.execPath,[t,"--devflow-instance-token",o],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});writeFileSync(n,`${e.port}
34
+ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await Gc(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function gt(){let e=Mn(process.cwd()),t=ut(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),!0}catch{return unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),false}}async function ft(){let e=Mn(process.cwd()),t=resolveRuntimeEndpoint(),n=xr(e)??t.port,{DevFlowApiClient:o}=await import('@devflow-tools/sdk');if(await new o({baseUrl:`http://127.0.0.1:${n}`,projectRoot:process.cwd()}).ping()){let a=ut(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!ut(e)||i.pid===ut(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function Gc(e,t){let n=Date.now()+t;for(;Date.now()<n;){try{if((await fetch(new URL("/api/health",e),{signal:AbortSignal.timeout(500)})).ok)return !0}catch{}await new Promise(o=>setTimeout(o,100));}return false}var Or,Ln,Se=O(()=>{Or=createRequire(import.meta.url);Ln=DEFAULT_DEVFLOW_SERVER_PORT;});var ps={};x(ps,{renderDoctorText:()=>fs,runDoctor:()=>$u,runDoctorAudit:()=>Au,runDoctorAuditFix:()=>Nu,runDoctorCommand:()=>xu,runDoctorReceipts:()=>Tu,runDoctorViolations:()=>ju,runLegacyDoctorReport:()=>ms,runStructuredDoctor:()=>no});function Jt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Ar(e){return join$1(homedir$1(),".devflow","daemons",`${Jt(e)}.sock`)}function ll(){return join$1(homedir$1(),".devflow","daemons.json")}function Xr(){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 N(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function ul(e,t){let n=t.homePath??homedir$1(),o=[],r=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(o.push({key:"host_adapter",value:r.status==="selected"?{id:r.adapter.id,candidates:r.candidates,explicit:r.explicit}:{status:"failed",code:r.code,candidates:r.candidates,reason:r.reason,action:r.action},target:"one explicitly selected or uniquely detected host",ok:r.status==="selected",severity:"warning"}),r.status==="selected"){let p=await r.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});o.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(m=>m.status==="supported"||!!(m.reason&&m.fallback)),severity:"error"});}let s=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),i=s.diagnostics.filter(p=>p.status==="failed");o.push({key:"plugin_runtime",value:s.diagnostics,target:"configured plugins loadable with diagnostics",ok:i.length===0,severity:"warning"});let a=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));o.push({key:"mcp_inventory",value:{servers:a.servers.length,duplicates:a.duplicates.length,unreadable:a.unreadable.length},target:{duplicates:0,unreadable:0},ok:a.unreadable.length===0,severity:a.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:a.duplicates.filter(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:a.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let c=await checkMcpHealth(a,n),l=c.records.filter(p=>p.status==="unhealthy");o.push({key:"mcp_health",value:c.records,target:"no unhealthy enabled servers",ok:l.length===0,severity:"warning"});let u=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(u){let p=jt(u);o.push({key:"skill_health",value:{root:p.pluginRoot,skills:p.skills,commands:p.commands,issues:p.issues},target:"valid and fully bound installed skills",ok:p.healthy,severity:"warning"});}let d=readRuntimeEndpointState(n);o.push({key:"runtime_endpoint_registry",value:d??"not registered",target:"healthy while active, stopped or absent while idle",ok:!d||d.status==="healthy"||d.status==="stopped",severity:d?.status==="degraded"?"error":"warning"});let g=(t.now??Date.now)(),f=listRuntimeHttpCircuits(n).filter(p=>p.status==="open"&&(p.openUntil??0)>g);return o.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:N(o),metrics:o}}function zn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function dl(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!==Jt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function gl(e,t){let n=zn(e),o=Jt(n.path),r=Ar(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:o,ok:true,severity:"info"},{key:"daemon_socket_path",value:r,target:`path containing ${o}`,ok:r.includes(o),severity:"error"}],i=t.registryPath??ll();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(g=>dl(g).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let l=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:zn(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:l.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:l.length},target:"0 when idle or 1 while active",ok:l.length<=1,severity:"warning"});let u=l.map(g=>Ar(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:u,target:[r],ok:!0,severity:"info"});let d=l.filter((g,f)=>g.projectHash!==o||u[f]!==r).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),s.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:N(s),metrics:s}}function ml(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 es(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 pl(e){let t=es(e);return t&&t.length>0?t:null}function Wn(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 hl(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Nr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function vl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:N(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Xr())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=ml(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:N(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
34
35
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
35
36
  FROM distill_leases
36
- `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let T=qc(_.event_ids),J=Br(_.session_ids),ne=Nn(_.event_count),D=Nn(_.created_at),U=Nn(_.expires_at),X=typeof _.status=="string"&&Jc.has(_.status)?_.status:null,$=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,M=T!==null&&ne!==null&&Kc(ne,T.length);if(!$||!T||!J||!M||D===null||U===null||X===null){g+=1,_.status==="pending"&&(U===null||Sr(U,c))&&(f+=1);continue}if(!(X!=="pending"||!Sr(U,c)))for(let W of T)d.add(W);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let m=i.prepare(`
37
+ `);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let S of u){let T=pl(S.event_ids),z=es(S.session_ids),oe=Wn(S.event_count),$=Wn(S.created_at),U=Wn(S.expires_at),X=typeof S.status=="string"&&yl.has(S.status)?S.status:null,D=typeof S.batch_id=="string"&&S.batch_id.trim().length>0,I=T!==null&&oe!==null&&hl(oe,T.length);if(!D||!T||!z||!I||$===null||U===null||X===null){g+=1,S.status==="pending"&&(U===null||Nr(U,c))&&(f+=1);continue}if(!(X!=="pending"||!Nr(U,c)))for(let F of T)d.add(F);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let m=i.prepare(`
37
38
  SELECT id
38
39
  FROM session_events
39
40
  WHERE processed = 0 AND created_at < ?
40
- `).all(c-300*1e3).filter(_=>!d.has(_.id)).length;n.push({key:"unprocessed_stale_events",value:m,target:0,ok:m===0,severity:"error"});let h=z(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:m===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),k=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:k===null?0:Math.max(0,c-k),target:"<= 300000 when no active lease is present",ok:k===null||m===0,severity:"warning"});let C=z(i,`
41
+ `).all(c-300*1e3).filter(S=>!d.has(S.id)).length;n.push({key:"unprocessed_stale_events",value:m,target:0,ok:m===0,severity:"error"});let h=J(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:m===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),k=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:k===null?0:Math.max(0,c-k),target:"<= 300000 when no active lease is present",ok:k===null||m===0,severity:"warning"});let C=J(i,`
41
42
  SELECT COUNT(*) count
42
43
  FROM session_events event
43
44
  LEFT JOIN sessions session ON session.id = event.session_id
44
45
  WHERE TRIM(event.session_id) = '' OR session.id IS NULL
45
- `);n.push({key:"orphan_memory_events",value:C,target:0,ok:C===0,severity:"error"});let v=z(i,`
46
+ `);n.push({key:"orphan_memory_events",value:C,target:0,ok:C===0,severity:"error"});let v=J(i,`
46
47
  SELECT COUNT(*) count
47
48
  FROM sessions
48
49
  WHERE status = 'active' AND created_at < ?
49
- `,c-Hn);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let b=i.prepare(`
50
+ `,c-Vn);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let b=i.prepare(`
50
51
  SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
51
52
  FROM (
52
53
  SELECT project, session_id, title, COUNT(*) AS title_count
@@ -54,18 +55,18 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
54
55
  GROUP BY project, session_id, title
55
56
  HAVING COUNT(*) > 1
56
57
  )
57
- `).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:N(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(Wr())(o,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return L(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function z(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function qr(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Un(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Vc(e){let t=Un(qr(e.output)),n=Un(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 Gc(e){let t=qr(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=Un(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function _r(e,t){return t===0?0:e/t}function Tn(e,t){return e===0?1:t/e}async function Yc(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let g;try{g=ee(s,t),L(g,"nodes")?(o=z(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let g;try{g=ee(i,t);let f=L(g,"symbols_vec_rowids")?"symbols_vec_rowids":L(g,"symbol_sources")?"symbol_sources":null;f?(r=z(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Tn(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let g;try{g=ee(a,t);let p=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(m=>!L(g,m));if(p.length>0)n.push({key:"knowledge_vector_schema",value:p,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=z(g,`
58
+ `).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:N(n),metrics:n}}function te(e,t){return (t.openDatabase??(o=>new(Xr())(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 J(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function ts(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Gn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function kl(e){let t=Gn(ts(e.output)),n=Gn(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 wl(e){let t=ts(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=Gn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function jr(e,t){return t===0?0:e/t}function Un(e,t){return e===0?1:t/e}async function bl(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=te(s,t),M(g,"nodes")?(o=J(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});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=te(i,t);let f=M(g,"symbols_vec_rowids")?"symbols_vec_rowids":M(g,"symbol_sources")?"symbol_sources":null;f?(r=J(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=Un(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=te(a,t);let p=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(m=>!M(g,m));if(p.length>0)n.push({key:"knowledge_vector_schema",value:p,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=J(g,`
58
59
  SELECT COUNT(*) count
59
60
  FROM knowledge_chunks c
60
61
  JOIN knowledge_docs d ON d.id = c.doc_id
61
62
  WHERE 1 = 1 ${h}
62
- `),k=z(g,`
63
+ `),k=J(g,`
63
64
  SELECT COUNT(*) count
64
65
  FROM knowledge_vec_rowids v
65
66
  JOIN knowledge_chunks c ON c.id = v.id
66
67
  JOIN knowledge_docs d ON d.id = c.doc_id
67
68
  WHERE 1 = 1 ${h}
68
- `),C=Tn(y,k),b=g.prepare(`
69
+ `),C=Un(y,k),b=g.prepare(`
69
70
  SELECT d.source source, COUNT(c.id) chunks,
70
71
  SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
71
72
  FROM knowledge_docs d
@@ -73,43 +74,43 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
73
74
  LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
74
75
  WHERE 1 = 1 ${h}
75
76
  GROUP BY d.source ORDER BY d.source
76
- `).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:Tn(T,J)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:k,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:C,target:">= 0.95",ok:C>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:b,target:"every source >= 0.95",ok:b.every(_=>_.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=ee(c,t),!L(g,"observations")||!L(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=fe(g,"observations"),p=f.has("quality_status")&&f.has("resolution_state"),h=z(g,`SELECT COUNT(*) count FROM observations ${p?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=z(g,`
77
+ `).all().map(S=>{let T=Number(S.chunks),z=Number(S.vectors);return {source:S.source,chunks:T,vectors:z,coverage:Un(T,z)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:k,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:C,target:">= 0.95",ok:C>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:b,target:"every source >= 0.95",ok:b.every(S=>S.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=te(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"),p=f.has("quality_status")&&f.has("resolution_state"),h=J(g,`SELECT COUNT(*) count FROM observations ${p?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=J(g,`
77
78
  SELECT COUNT(DISTINCT e.source_id) count
78
79
  FROM embeddings e JOIN observations o ON o.id = e.source_id
79
80
  WHERE e.source_type = 'observation'
80
81
  ${p?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
81
82
  `),k=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:k,target:0,ok:k===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let l=(t.now??Date.now)(),u=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(u))try{let g=l-864e5;d=readFileSync$1(u,"utf8").split(`
82
- `).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:N(n),metrics:n}}function Zc(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=(n.now??Date.now)(),c=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=ee(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[$,M]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let W=L(m,M)?z(m,`SELECT COUNT(*) count FROM ${M} WHERE created_at >= ?`,i):0;o.push({key:$,value:W,ok:!0,severity:"info"});}let h=L(m,"telemetry_failures")?z(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:h,target:0,ok:h===0,severity:c});let y=fe(m,"sessions"),k=fe(m,"tool_call_events"),C=fe(m,"skill_executions"),v=["id","project_root","started_at","status"].every($=>y.has($));if(o.push({key:"telemetry_session_schema",value:v?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:v,severity:"error"}),v){let $=z(m,`
83
+ `).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:N(n),metrics:n}}function _l(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=(n.now??Date.now)(),c=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=te(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[D,I]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(m,I)?J(m,`SELECT COUNT(*) count FROM ${I} WHERE created_at >= ?`,i):0;o.push({key:D,value:F,ok:!0,severity:"info"});}let h=M(m,"telemetry_failures")?J(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:h,target:0,ok:h===0,severity:c});let y=fe(m,"sessions"),k=fe(m,"tool_call_events"),C=fe(m,"skill_executions"),v=["id","project_root","started_at","status"].every(D=>y.has(D));if(o.push({key:"telemetry_session_schema",value:v?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:v,severity:"error"}),v){let D=J(m,`
83
84
  SELECT COUNT(*) count FROM sessions
84
85
  WHERE project_root = ? AND started_at >= ?
85
- `,e,i);o.push({key:"session_start_evidence_24h",value:$,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let M=z(m,`
86
+ `,e,i);o.push({key:"session_start_evidence_24h",value:D,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let I=J(m,`
86
87
  SELECT COUNT(*) count FROM sessions
87
88
  WHERE project_root = ? AND status = 'running' AND started_at < ?
88
- `,e,(n.now??Date.now)()-Hn);o.push({key:"stale_telemetry_sessions",value:M,target:0,ok:M===0,severity:"error"});let W=m.prepare(`
89
+ `,e,(n.now??Date.now)()-Vn);o.push({key:"stale_telemetry_sessions",value:I,target:0,ok:I===0,severity:"error"});let F=m.prepare(`
89
90
  SELECT status, COUNT(*) count
90
91
  FROM sessions
91
92
  WHERE project_root = ?
92
93
  GROUP BY status
93
- `).all(e),j={running:0,completed:0,failed:0};for(let I of W)I.status in j&&(j[I.status]=Number(I.count));let Z=j.running+j.completed+j.failed,ae=j.completed+j.failed;if(o.push({key:"project_session_closure_state",value:{total:Z,...j,closed:ae,closureRate:Z===0?1:ae/Z},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),L(m,"devflow_session_closures")){let I=m.prepare(`
94
+ `).all(e),j={running:0,completed:0,failed:0};for(let L of F)L.status in j&&(j[L.status]=Number(L.count));let G=j.running+j.completed+j.failed,ee=j.completed+j.failed;if(o.push({key:"project_session_closure_state",value:{total:G,...j,closed:ee,closureRate:G===0?1:ee/G},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(m,"devflow_session_closures")){let L=m.prepare(`
94
95
  SELECT state, COUNT(*) count
95
96
  FROM devflow_session_closures
96
97
  WHERE project_root = ?
97
98
  GROUP BY state
98
- `).all(e),K={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Fe of I)Fe.state in K&&(K[Fe.state]=Number(Fe.count));let le=z(m,`
99
+ `).all(e),K={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Fe of L)Fe.state in K&&(K[Fe.state]=Number(Fe.count));let le=J(m,`
99
100
  SELECT COUNT(*) count
100
101
  FROM devflow_session_closures
101
102
  WHERE project_root = ? AND state = 'closing' AND updated_at < ?
102
- `,e,a-Hn);o.push({key:"durable_session_closure_state",value:{...K,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:K.active===0&&K.closing===0&&le===0,severity:c});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:c});let ye=0;k.has("session_id")&&(ye=z(m,`
103
+ `,e,a-Vn);o.push({key:"durable_session_closure_state",value:{...K,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:K.active===0&&K.closing===0&&le===0,severity:c});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:c});let ye=0;k.has("session_id")&&(ye=J(m,`
103
104
  SELECT COUNT(*) count
104
105
  FROM tool_call_events event
105
106
  LEFT JOIN sessions session ON session.id = event.session_id
106
107
  WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
107
- `));let ce=0;if(C.has("session_id")&&(ce=z(m,`
108
+ `));let ce=0;if(C.has("session_id")&&(ce=J(m,`
108
109
  SELECT COUNT(*) count
109
110
  FROM skill_executions execution
110
111
  LEFT JOIN sessions session ON session.id = execution.session_id
111
112
  WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
112
- `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(I=>C.has(I))){let I=a-18e5,K=m.prepare(`
113
+ `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(L=>C.has(L))){let L=a-18e5,K=m.prepare(`
113
114
  SELECT
114
115
  COUNT(*) total,
115
116
  COALESCE(SUM(CASE WHEN execution.started_at < ? THEN 1 ELSE 0 END), 0) older_than_30m,
@@ -119,7 +120,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
119
120
  WHERE session.project_root = ?
120
121
  AND execution.status = 'running'
121
122
  AND (execution.started_at < ? OR session.status <> 'running')
122
- `).get(I,e,I),le=Number(K?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(K?.older_than_30m??0),attachedToNonRunningSession:Number(K?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!L(m,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let $=fe(m,"devflow_work_items"),W=["project_root","state","lease_expires_at","created_at","completed_at"].filter(j=>!$.has(j));if(W.length>0)o.push({key:"work_queue_schema",value:{missingColumns:W,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let j=m.prepare(`
123
+ `).get(L,e,L),le=Number(K?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(K?.older_than_30m??0),attachedToNonRunningSession:Number(K?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!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 D=fe(m,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(j=>!D.has(j));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 j=m.prepare(`
123
124
  SELECT
124
125
  COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
125
126
  COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
@@ -131,56 +132,70 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
131
132
  MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
132
133
  FROM devflow_work_items
133
134
  WHERE project_root = ?
134
- `).get(a,e),Z=Number(j?.queue_depth??0),ae=Number(j?.pending??0),ye=Number(j?.leased??0),ce=Number(j?.failed??0),ve=Number(j?.dead_letters??0),I=Number(j?.expired_leases??0),K=j?.oldest_pending_at==null?void 0:Number(j.oldest_pending_at),le=j?.last_successful_drain_at==null?void 0:Number(j.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:ae,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ye,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:K===void 0?0:Math.max(0,a-K),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ve,target:0,ok:ve===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:I,target:0,ok:I===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}let b=n.env?.DEVFLOW_STATE_DIR??join$1(r,".devflow","state",Ft(e)),T=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map($=>{let M=join$1(b,$),W=existsSync$1(M)?readdirSync(M).filter(j=>j.includes(".json")).length:0;return [$,W]})),J=Object.values(T).reduce(($,M)=>$+M,0);if(o.push({key:"hook_spool_backlog",value:{total:J,...T},target:{total:0},ok:J===0,severity:c}),L(m,"tool_call_events")){let $=v&&k.has("session_id"),M=fe(m,"tool_metrics"),W=k.has("event_id")&&M.has("tool_call_event_id")&&M.has("status"),j=[k.has("error")?"event.error":"NULL error",k.has("failure_category")?"event.failure_category":"NULL failure_category",k.has("output")?"event.output":"NULL output",k.has("blocked")?"event.blocked":"0 blocked",k.has("block_reason")?"event.block_reason":"NULL block_reason",$?"event_session.status session_status":"NULL session_status",W?"metric.status metric_status":"NULL metric_status"].join(", "),Z=m.prepare(`
135
+ `).get(a,e),G=Number(j?.queue_depth??0),ee=Number(j?.pending??0),ye=Number(j?.leased??0),ce=Number(j?.failed??0),ve=Number(j?.dead_letters??0),L=Number(j?.expired_leases??0),K=j?.oldest_pending_at==null?void 0:Number(j.oldest_pending_at),le=j?.last_successful_drain_at==null?void 0:Number(j.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:G,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:ee,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ye,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:K===void 0?0:Math.max(0,a-K),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ve,target:0,ok:ve===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value: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 D=m.prepare(`
136
+ SELECT
137
+ COUNT(*) total,
138
+ COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
139
+ COALESCE(SUM(CASE WHEN state = 'hold' THEN 1 ELSE 0 END), 0) held,
140
+ COALESCE(SUM(CASE WHEN lease_expires_at IS NOT NULL AND lease_expires_at <= ?
141
+ AND state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) lost_heartbeats
142
+ FROM devflow_workflow_workers WHERE project_root = ?
143
+ `).get(a,e),I=J(m,`
144
+ SELECT COUNT(*) count FROM devflow_merge_queue
145
+ WHERE project_root = ? AND state = 'conflict'
146
+ `,e),F=m.prepare(`
147
+ SELECT MIN(created_at) oldest FROM devflow_merge_queue
148
+ WHERE project_root = ? AND state IN ('waiting','ready')
149
+ `).get(e),j=Number(D?.active??0),G=Number(D?.held??0),ee=Number(D?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:j,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:G,target:0,ok:G===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:ee,target:0,ok:ee===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:I,target:0,ok:I===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,a-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let b=n.env?.DEVFLOW_STATE_DIR??join$1(r,".devflow","state",Jt(e)),T=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(D=>{let I=join$1(b,D),F=existsSync$1(I)?readdirSync(I).filter(j=>j.includes(".json")).length:0;return [D,F]})),z=Object.values(T).reduce((D,I)=>D+I,0);if(o.push({key:"hook_spool_backlog",value:{total:z,...T},target:{total:0},ok:z===0,severity:c}),M(m,"tool_call_events")){let D=v&&k.has("session_id"),I=fe(m,"tool_metrics"),F=k.has("event_id")&&I.has("tool_call_event_id")&&I.has("status"),j=[k.has("error")?"event.error":"NULL error",k.has("failure_category")?"event.failure_category":"NULL failure_category",k.has("output")?"event.output":"NULL output",k.has("blocked")?"event.blocked":"0 blocked",k.has("block_reason")?"event.block_reason":"NULL block_reason",D?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),G=m.prepare(`
135
150
  SELECT ${j}
136
151
  FROM tool_call_events event
137
- ${W?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
138
- ${$?"JOIN sessions event_session ON event_session.id = event.session_id":""}
152
+ ${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
153
+ ${D?"JOIN sessions event_session ON event_session.id = event.session_id":""}
139
154
  WHERE event.timestamp >= ?
140
- ${$?"AND event_session.project_root = ?":""}
141
- `).all(...$?[i,e]:[i]),ae=Z.map(Vc),ye=ae.filter(I=>I.failed).length,ce=ae.filter((I,K)=>I.failed&&Z[K]?.session_status!=="completed").length,ve=ae.filter(I=>I.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:Z.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:c}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_failure_rate_24h",value:_r(ye,Z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:_r(ve,Z.length),target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_project_scope",value:$?"project":"global fallback; session identity unavailable",target:"project",ok:$,severity:"warning"}),k.has("failure_category")){let I={};for(let ue of Z)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(I[ue.failure_category]=(I[ue.failure_category]??0)+1);let K=Z.filter((ue,Hs)=>ae[Hs]?.failed&&ue.session_status!=="completed"),le=K.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Fe=K.length===0?1:le/K.length;o.push({key:"failure_categories_24h",value:I,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Fe,target:">= 0.80",ok:Fe>=.8,severity:c});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:c});}let ne=v&&["session_id","started_at","fallback_count","fallback_reasons"].every($=>C.has($)),D=0,U={};if(ne){let $=m.prepare(`
155
+ ${D?"AND event_session.project_root = ?":""}
156
+ `).all(...D?[i,e]:[i]),ee=G.map(kl),ye=ee.filter(L=>L.failed).length,ce=ee.filter((L,K)=>L.failed&&G[K]?.session_status!=="completed").length,ve=ee.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:G.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:c}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_failure_rate_24h",value:jr(ye,G.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:jr(ve,G.length),target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_project_scope",value:D?"project":"global fallback; session identity unavailable",target:"project",ok:D,severity:"warning"}),k.has("failure_category")){let L={};for(let ue of G)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(L[ue.failure_category]=(L[ue.failure_category]??0)+1);let K=G.filter((ue,ei)=>ee[ei]?.failed&&ue.session_status!=="completed"),le=K.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Fe=K.length===0?1:le/K.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Fe,target:">= 0.80",ok:Fe>=.8,severity:c});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:c});}let oe=v&&["session_id","started_at","fallback_count","fallback_reasons"].every(D=>C.has(D)),$=0,U={};if(oe){let D=m.prepare(`
142
157
  SELECT execution.fallback_count, execution.fallback_reasons
143
158
  FROM skill_executions execution
144
159
  JOIN sessions session ON session.id = execution.session_id
145
160
  WHERE session.project_root = ? AND execution.started_at >= ?
146
- `).all(e,i);for(let M of $){D+=Number(M.fallback_count??0);for(let W of Gc(M.fallback_reasons))U[W]=(U[W]??0)+1;}}let X=0;if(L(m,"devflow_hook_fallbacks")){let $=m.prepare(`
161
+ `).all(e,i);for(let I of D){$+=Number(I.fallback_count??0);for(let F of wl(I.fallback_reasons))U[F]=(U[F]??0)+1;}}let X=0;if(M(m,"devflow_hook_fallbacks")){let D=m.prepare(`
147
162
  SELECT reason, COUNT(*) count
148
163
  FROM devflow_hook_fallbacks
149
164
  WHERE project_root = ? AND created_at >= ?
150
165
  GROUP BY reason ORDER BY reason
151
- `).all(e,i);for(let M of $){let W=Number(M.count);X+=W,U[`hook:${M.reason}`]=W;}}o.push({key:"skill_fallbacks_24h",value:D,target:0,ok:D===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:U,target:{},ok:Object.keys(U).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=ee(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:N(o),metrics:o}}function Pr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Kr(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 Qc(e){let t=[],n=e.homePath??homedir$1(),o=e.env??process.env,r=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,u])=>!o[u]?.trim())&&!existsSync$1(r))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(r))t.push({key:"key_directory",value:"missing",target:r,ok:false,severity:"warning"});else try{let u=lstatSync(r),d=Pr(r),g=u.isDirectory()&&!u.isSymbolicLink(),f=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:g&&f,severity:g?"warning":"error"});}catch(u){t.push({key:"key_directory",value:u.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[u,d,g]of s){if(o[d]?.trim()){t.push({key:`${u}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let f=join$1(r,g);if(!existsSync$1(f)){t.push({key:`${u}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let p=lstatSync(f),m=Pr(f),h=readFileSync$1(f,"utf8").trim(),y=p.isFile()&&!p.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:m,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||m==="400"),severity:!y||h.length===0?"error":"warning"});}catch(p){t.push({key:`${u}_source`,value:p.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,l=0;if(existsSync$1(a))try{let u=(e.now??Date.now)()-ze;for(let d of readFileSync$1(a,"utf8").split(`
152
- `))if(d.trim())try{let g=JSON.parse(d),f=Kr(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:N(t),metrics:t}}function Xc(e){let t=[],n=e.homePath??homedir$1(),o=getGlobalDevFlowDbPath(n);if(!existsSync$1(o))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let r;try{if(r=ee(o,e),!L(r,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let s=r.prepare(`
166
+ `).all(e,i);for(let I of D){let F=Number(I.count);X+=F,U[`hook:${I.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:$,target:0,ok:$===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:U,target:{},ok:Object.keys(U).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=te(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:N(o),metrics:o}}function Ir(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function ns(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 Sl(e){let t=[],n=e.homePath??homedir$1(),o=e.env??process.env,r=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,u])=>!o[u]?.trim())&&!existsSync$1(r))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(r))t.push({key:"key_directory",value:"missing",target:r,ok:false,severity:"warning"});else try{let u=lstatSync(r),d=Ir(r),g=u.isDirectory()&&!u.isSymbolicLink(),f=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:g&&f,severity:g?"warning":"error"});}catch(u){t.push({key:"key_directory",value:u.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[u,d,g]of s){if(o[d]?.trim()){t.push({key:`${u}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let f=join$1(r,g);if(!existsSync$1(f)){t.push({key:`${u}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let p=lstatSync(f),m=Ir(f),h=readFileSync$1(f,"utf8").trim(),y=p.isFile()&&!p.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:m,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||m==="400"),severity:!y||h.length===0?"error":"warning"});}catch(p){t.push({key:`${u}_source`,value:p.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,l=0;if(existsSync$1(a))try{let u=(e.now??Date.now)()-Ze;for(let d of readFileSync$1(a,"utf8").split(`
167
+ `))if(d.trim())try{let g=JSON.parse(d),f=ns(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:N(t),metrics:t}}function El(e){let t=[],n=e.homePath??homedir$1(),o=getGlobalDevFlowDbPath(n);if(!existsSync$1(o))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let r;try{if(r=te(o,e),!M(r,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let s=r.prepare(`
153
168
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
154
169
  FROM benchmark_reports
155
170
  ORDER BY created_at DESC
156
171
  LIMIT 1
157
- `).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(l)?Number((l/ze).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=Wn,severity:l<0||!Number.isFinite(l)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Benchmark",status:N(t),metrics:t}}function el(e,t){let n=[],o=t.homePath??homedir$1(),r=getGlobalDevFlowDbPath(o);if(!existsSync$1(r))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let s;try{if(s=ee(r,t),!L(s,"benchmark_reports"))throw new Error("benchmark_reports table missing");let i=s.prepare(`
172
+ `).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(l)?Number((l/Ze).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=Yn,severity:l<0||!Number.isFinite(l)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Benchmark",status:N(t),metrics:t}}function Rl(e,t){let n=[],o=t.homePath??homedir$1(),r=getGlobalDevFlowDbPath(o);if(!existsSync$1(r))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let s;try{if(s=te(r,t),!M(s,"benchmark_reports"))throw new Error("benchmark_reports table missing");let i=s.prepare(`
158
173
  SELECT report_json, created_at
159
174
  FROM benchmark_reports
160
175
  WHERE suite_id = 'retrieval-quality' AND project_root = ?
161
176
  ORDER BY created_at DESC
162
177
  LIMIT 1
163
- `).get(e);if(!i?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let a=JSON.parse(i.report_json),c=(t.now??Date.now)()-Number(i.created_at??0);n.push({key:"retrieval_quality_report",value:{status:a.qualityStatus,ageMs:c,diagnostics:a.diagnostics??[]},target:{status:"passed",maxAgeMs:Wn},ok:a.qualityStatus==="passed"&&c<=Wn,severity:a.qualityStatus==="failed"?"error":"warning"});for(let[l,u]of Object.entries(a.gates??{}))n.push({key:`retrieval_${l}`,value:a.metrics?.[l],target:a.thresholds?.[l],ok:u,severity:"error"});}catch(i){n.push({key:"retrieval_quality_read",value:i.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{s?.close();}return {name:"Retrieval quality",status:N(n),metrics:n}}function tl(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 nl(e){let t=[],n=e.homePath??homedir$1(),o=[join$1(n,".devflow","errors","hook-fallback.log")],r=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(r))try{for(let y of readdirSync(r))y.endsWith(".log")&&o.push(join$1(r,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ze,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let k of readFileSync$1(y,"utf8").split(`
164
- `))if(k.trim())try{let C=JSON.parse(k),v=Kr(C.ts);v===null||typeof C.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(k){t.push({key:"hook_fallback_log_read",value:{path:y,error:k.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),l=0,u=0,d=null;if(existsSync$1(c)){let y;try{if(y=ee(c,e),L(y,"telemetry_events")){let k=y.prepare(`
178
+ `).get(e);if(!i?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let a=JSON.parse(i.report_json),c=(t.now??Date.now)()-Number(i.created_at??0);n.push({key:"retrieval_quality_report",value:{status:a.qualityStatus,ageMs:c,diagnostics:a.diagnostics??[]},target:{status:"passed",maxAgeMs:Yn},ok:a.qualityStatus==="passed"&&c<=Yn,severity:a.qualityStatus==="failed"?"error":"warning"});for(let[l,u]of Object.entries(a.gates??{}))n.push({key:`retrieval_${l}`,value:a.metrics?.[l],target:a.thresholds?.[l],ok:u,severity:"error"});}catch(i){n.push({key:"retrieval_quality_read",value:i.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{s?.close();}return {name:"Retrieval quality",status:N(n),metrics:n}}function Pl(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 Cl(e){let t=[],n=e.homePath??homedir$1(),o=[join$1(n,".devflow","errors","hook-fallback.log")],r=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(r))try{for(let y of readdirSync(r))y.endsWith(".log")&&o.push(join$1(r,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-Ze,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let k of readFileSync$1(y,"utf8").split(`
179
+ `))if(k.trim())try{let C=JSON.parse(k),v=ns(C.ts);v===null||typeof C.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(k){t.push({key:"hook_fallback_log_read",value:{path:y,error:k.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),l=0,u=0,d=null;if(existsSync$1(c)){let y;try{if(y=te(c,e),M(y,"telemetry_events")){let k=y.prepare(`
165
180
  SELECT COUNT(*) total,
166
181
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
167
182
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
168
183
  FROM telemetry_events
169
184
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
170
- `).get(s);l=Number(k?.total??0),u=Number(k?.failures??0),d=k?.average_duration==null?null:Math.round(Number(k.average_duration)*100)/100;}}catch(k){t.push({key:"hook_daemon_metrics_read",value:k.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=f===0?0:g/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:g===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=tl(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${Er}`,ok:y.bytes<=Er,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:N(t),metrics:t}}function Re(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Me(e){return JSON.parse(readFileSync$1(e,"utf8"))}function B(e){return typeof e=="object"&&e!==null?e:null}function Gr(e,t){return sl.has(e)&&!(t.tolerateControlSyntax&&il.has(e))}function mt(e,t={}){if(Buffer.byteLength(e)>Vr)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]===`
185
+ `).get(s);l=Number(k?.total??0),u=Number(k?.failures??0),d=k?.average_duration==null?null:Math.round(Number(k.average_duration)*100)/100;}}catch(k){t.push({key:"hook_daemon_metrics_read",value:k.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=f===0?0:g/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:g===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=Pl(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${Tr}`,ok:y.bytes<=Tr,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:N(t),metrics:t}}function Pe(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Me(e){return JSON.parse(readFileSync$1(e,"utf8"))}function q(e){return typeof e=="object"&&e!==null?e:null}function is(e,t){return $l.has(e)&&!(t.tolerateControlSyntax&&xl.has(e))}function kt(e,t={}){if(Buffer.byteLength(e)>ss)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]===`
171
186
  `){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
172
187
  `){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]!==`
173
- `;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&al.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
174
- `].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&Gr(d,t)})&&(a=true),{segments:n,malformed:a}}function cl(e){return mt(e).segments.flat().join(" ")}function ll(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 Yr(e,t){return ll(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 ul(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
+ `;)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==="}"&&Al.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
189
+ `].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&&is(d,t)})&&(a=true),{segments:n,malformed:a}}function Nl(e){return kt(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 as(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 Tl(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]===`
175
190
  `){o-=1;break}e[o]!==`
176
- `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function dl(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]!==`
191
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Il(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]!==`
177
192
  `;)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]===`
178
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?cl(e):n==="node"?ul(e):n==="python"?dl(e):e;return [...new Set(o.match(ol)??[])]}function gl(e){return mt(e).segments.flat()}function pe(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Pe(a,i)?a:Pe(c,i)?c:dirname(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function fl(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>Vr||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function zn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=fl(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Nt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:pe(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ie(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=pl(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:pe(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:pe(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:pe(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function ml(e){let t=[e];extname(e)===""&&t.push(...Rr.map(n=>`${e}${n}`),...Rr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function pl(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 ml(o)??o}function hl(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]!==`
193
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?Nl(e):n==="node"?Tl(e):n==="python"?Il(e):e;return [...new Set(o.match(Dl)??[])]}function Ml(e){return kt(e).segments.flat()}function pe(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Re(a,i)?a:Re(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 Ll(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>ss||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=Ll(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:pe(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ie(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=Hl(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:pe(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:pe(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:pe(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Fl(e){let t=[e];extname(e)===""&&t.push(...Mr.map(n=>`${e}${n}`),...Mr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Hl(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 Fl(o)??o}function Wl(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]!==`
179
194
  `;)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===`
180
- `||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function yl(e,t,n,o=true){let r=hl(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let p=-1;for(let m=d+1;m<Math.min(c.length,d+32)&&c[m].value!==";";m+=1)if(c[m].value==="from"){p=m;break}p>=0?a(c[p+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=zn(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 vl(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]!==`
195
+ `||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function Ul(e,t,n,o=true){let r=Wl(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let p=-1;for(let m=d+1;m<Math.min(c.length,d+32)&&c[m].value!==";";m+=1)if(c[m].value==="from"){p=m;break}p>=0?a(c[p+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=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 ql(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]!==`
181
196
  `;)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]===`
182
197
  `||e[d]==="\r"))break;e[d]!==`
183
- `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Cr(e,t){let n=t.split(".");if(n.length>Jn)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 kl(e,t,n){let o=vl(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=pe(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),p=Cr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&Cr(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),k=join$1(y,"__init__.py"),C=false;try{C=statSync$1(k).isFile();}catch{}if(C){a(k),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Zr(e,t,n,o,r=true){return n==="node"?yl(e,t,o,r):n==="python"?kl(e,t,o):{references:[],inlineContents:[],malformed:false}}function Dr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=jt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>pe(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=zn(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=pe(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function Qr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ie(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 Nt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function lt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function El(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||=Ie(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(_l.has(u))return a();if(Sl.has(u)){l=true,c+=1;continue}let d=Ar.has(u)?"cjs":$r.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=lt(u,Ar),f=lt(u,$r),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Or.has(u)){let h=e[c+1];return a(h===void 0?true:s||Nt(h))}let m=lt(u,Or);if(m!==null)return a(s||Nt(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Nt(u.slice(2)));if(xr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(lt(u,xr)!==null){c+=1;continue}if(bl.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Dl(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:Ie(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?jt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Pl.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:Ie(i)}}return {tokens:[],malformed:true}}function Al(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:Ie(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:Ie(r)};if(Cl.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Nr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(lt(r,Nr)!==null){o+=1;continue}if(Rl.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function jn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Re(n.path),r=Re(t.project);return !o||!r||!Pe(r,o)?null:o}function xl(e,t,n,o,r){let s=n;if(e==="builtin"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="command"){for(;t[s]?.startsWith("-");){let i=t[s];if(/^-[pvV]+$/.test(i)&&/[vV]/.test(i))return {index:t.length,malformed:false};s+=1;}return {index:s,malformed:s>=t.length}}if(e==="exec"){for(;t[s]?.startsWith("-");)t[s]==="-a"||t[s]==="--argv0"?s+=2:s+=1;return {index:s,malformed:s>=t.length}}if(e==="nohup"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="env"){let i=o;for(;s<t.length;){let a=t[s];if(Qr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=mt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?jn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=jn(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=jn(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 jt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>zr)return {tokens:[],malformed:true};let r=mt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Xr(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 Xr(e,t,n,o){let r=0;for(;Qr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;$l.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>zr)return {tokens:i,malformed:true};let m=xl(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=Xr(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Gr(l,o),d=c&&!Ol.has(l);if(u||d)return {tokens:i,malformed:true};let g=Ie(s);i.push(s);let f=l;if(!wl.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?El(e,r+1,n):["bash","sh","zsh"].includes(f)?Dl(e,r+1,a,n,o):Al(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function es(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Re(t.slice(0,o))}function Nl(e,t){let n=new Map;for(let o of t)for(let r of gl(o)){let s=es(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 Tl(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function jl(e){return e.slice(e.lastIndexOf("@")+1)}function Tr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Re(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Il(e,t,n){let o=jl(e),r=B(t.extraKnownMarketplaces),s=B(r?.[o]);if(s){let i=B(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Tr(i.path):null}}try{let i=B(Me(n)),a=B(i?.[o]);if(a){let c=B(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Tr(c.path):null}}}catch{}return {configured:false,root:null}}function jr(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 Ml(e,t){let n=B(e.entry),o=B(t.entry),r=jr(n),s=jr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?It(n.version):null,a=typeof o?.version=="string"?It(o.version):null;if(i&&a){let c=ts(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Ll(e,t){try{let n=B(Me(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=B(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort(Ml)[0],i=B(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Re(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function It(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 ts(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 Fl(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=B(Me(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=It(a.version),u=It(c.version);if(l&&u){let d=ts(u,l);if(d!==0)return d}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Re(i[0].path):null}function Hl(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>Re(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),o=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),r=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let v of l)if(existsSync$1(v))try{let b=B(Me(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return gt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>Nl(v.path,v.commands)),m=[...i.reduce((v,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return v;for(let[T,J]of Object.entries(_))Tl(T)&&typeof J=="boolean"&&v.set(T,J);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=Ll(v,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let T=i.map(ne=>Il(v,ne.settings,r)).filter(ne=>ne.configured),J=T[T.length-1];J?_=J.root:_=Fl(v,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let k=[...h.reduce((v,b)=>{let _=v.get(b.root);return _?(v.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],C=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:k,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:C.length>0?`${C.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(k.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Ul(e){let t=e;for(;;){let n=join$1(t,"package.json");if(existsSync$1(n))try{if(JSON.parse(readFileSync$1(n,"utf8")).workspaces)return t}catch{}let o=dirname(t);if(o===t)return;t=o;}}function gt(e,t){if(Array.isArray(e)){for(let n of e)gt(n,t);return}if(!(typeof e!="object"||e===null))for(let[n,o]of Object.entries(e))n==="command"&&typeof o=="string"?t.push(o):gt(o,t);}function In(e){return [...e.matchAll(rl)].map(t=>t[1])}function Wl(e){let t=new Map,n=mt(e,{tolerateControlSyntax:true});for(let o of n.segments.flat()){let r=o.match(/^([A-Za-z_][A-Za-z0-9_]*)=(\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/[A-Za-z0-9._/-]+)$/);r&&t.set(r[1],r[2]);}return t.size===0?e:e.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,(o,r,s)=>t.get(r??s??"")??o)}function Bl(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 ql(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 Mn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Pe(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Bn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>xt)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>xt)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,xt+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>xt)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 qn(e,t){return `${e} (${t})`}function Kl(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>Jn){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(u)){Pe(d,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Pe(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Dr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Jr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Bn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(qn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?Yr(l,d):c.parserKind,f=g==="shell";for(let p of me(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=Dr(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=Zr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function Jl(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ul(r),c=0,l=(f,p=false,m=r,h="infer",y=e,k=0)=>{if(k>Jn){o.traversalLimitRoots.push(r);return}let C=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Pe(C,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Pe(C,b)){o.escapedArtifacts.push(v);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:k}));},u=(f,p,m,h=0)=>{for(let y of In(f)){let k=Mn(r,y);if(!k)continue;let C=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(k,true,r,C?.parserKind??"infer",C?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let k=y.nodeResolutionKind?zn(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(k.malformed){o.malformedCommands.push(y.value);continue}if(k.inlineContent)for(let C of me(k.inlineContent.content,false,"node"))o.findings.push({artifact:k.inlineContent.source,endpoint:C});k.reference&&l(k.reference.path,true,h?r:k.reference.containmentRoot,k.reference.parserKind,k.reference.cwd??p,m);}},g=f=>{for(let m of me(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=jt(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=es(m),y=(p.artifacts??[]).find(k=>k.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Bn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(qn(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let k=JSON.parse(y.content),C=[];gt(k,C);for(let v of C)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Jr){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Bn(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(qn(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?Yr(p,h):f.parserKind,k=y==="shell";for(let b of me(h,k,y))o.findings.push({artifact:p,endpoint:b});if(k){let b=Wl(h),_=jt(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});Bl(h)&&o.malformedCommands.push(p),u(b,_,dirname(p),f.depth+1),d(_,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Zr(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?ql(p):b.malformed)&&o.malformedCommands.push(p);for(let _ of b.inlineContents)for(let T of me(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of b.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of In(h)){let T=Mn(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of In(h)){let _=Mn(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let C=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(C).replace(/\.js$/,"");a&&(C.startsWith("hooks/")||C.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),C.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function zl(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=B(Me(t)),r=B(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=B(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Re(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Ir(e){try{let t=B(Me(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Vl(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=zl(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(l)?l:u;try{let k=B(Me(d)),C=B(k?.hooks),v=[];gt(C?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Ir(i),f=Ir(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(k=>k!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let k=readFileSync$1(h,"utf8");(!existsSync$1(y)||!k.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Gl(e,t){let n=Hl(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let D of n.configCommands){o.configsInspected.push(D.path);for(let U of D.commands){o.commandsInspected.push({configPath:D.path,command:U});for(let X of me(U,true))o.findings.push({artifact:D.path,endpoint:X});}}Kl(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(U=>U.commands?.includes(D))),o);for(let D of n.targets)Jl(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,U,X)=>X.findIndex($=>$.configPath===D.configPath&&$.command===D.command)===U),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((D,U,X)=>X.findIndex($=>$.artifact===D.artifact&&$.endpoint===D.endpoint)===U),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Vl(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,k=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),C=n.targets.map(D=>D.root).find(D=>existsSync$1(join$1(D,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:C?{root:C,version:null}:Ce(k,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,_=b?Ge(k,b):[],T=_.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(D=>D.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],ne=v.version??h.versionRecords.find(D=>D.root===b)?.packageVersion;return ne&&J.push({key:"active_plugin_version",value:ne,ok:true,severity:"info"}),{name:"Legacy paths",status:N(J),metrics:J}}function Yl(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 Ht(e){let t=Yl(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/ze:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function Zl(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=ee(i,t);let l=(L(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:z(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:N(n),metrics:n}}function Ql(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:N(n),metrics:n};let r;try{if(r=ee(o,t),!L(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*ze,i=r.prepare(`
198
+ `&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Lr(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 Bl(e,t,n){let o=ql(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=pe(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),p=Lr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&Lr(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),k=join$1(y,"__init__.py"),C=false;try{C=statSync$1(k).isFile();}catch{}if(C){a(k),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function cs(e,t,n,o,r=true){return n==="node"?Ul(e,t,o,r):n==="python"?Bl(e,t,o):{references:[],inlineContents:[],malformed:false}}function Fr(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=>pe(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=to(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=pe(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function ls(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ie(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 mt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Gl(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||=Ie(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(Vl.has(u))return a();if(zl.has(u)){l=true,c+=1;continue}let d=Hr.has(u)?"cjs":Wr.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=mt(u,Hr),f=mt(u,Wr),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Ur.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ht(h))}let m=mt(u,Ur);if(m!==null)return a(s||Ht(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ht(u.slice(2)));if(qr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(mt(u,qr)!==null){c+=1;continue}if(Jl.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Xl(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:Ie(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(Yl.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:Ie(i)}}return {tokens:[],malformed:true}}function eu(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:Ie(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:Ie(r)};if(Ql.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Br.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(mt(r,Br)!==null){o+=1;continue}if(Zl.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function qn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Re(r,o)?null:o}function ou(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(ls(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=kt(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?qn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=qn(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=qn(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>rs)return {tokens:[],malformed:true};let r=kt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=us(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 us(e,t,n,o){let r=0;for(;ls(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;tu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>rs)return {tokens:i,malformed:true};let m=ou(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=us(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&is(l,o),d=c&&!nu.has(l);if(u||d)return {tokens:i,malformed:true};let g=Ie(s);i.push(s);let f=l;if(!Kl.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?Gl(e,r+1,n):["bash","sh","zsh"].includes(f)?Xl(e,r+1,a,n,o):eu(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function ds(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 ru(e,t){let n=new Map;for(let o of t)for(let r of Ml(o)){let s=ds(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 su(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function iu(e){return e.slice(e.lastIndexOf("@")+1)}function Kr(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=iu(e),r=q(t.extraKnownMarketplaces),s=q(r?.[o]);if(s){let i=q(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Kr(i.path):null}}try{let i=q(Me(n)),a=q(i?.[o]);if(a){let c=q(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Kr(c.path):null}}}catch{}return {configured:false,root:null}}function Jr(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 cu(e,t){let n=q(e.entry),o=q(t.entry),r=Jr(n),s=Jr(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=gs(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function lu(e,t){try{let n=q(Me(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=q(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(cu)[0],i=q(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 gs(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 uu(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=q(Me(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=gs(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 du(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>Pe(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),o=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),r=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let v of l)if(existsSync$1(v))try{let b=q(Me(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return yt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>ru(v.path,v.commands)),m=[...i.reduce((v,b)=>{let S=b.settings.enabledPlugins;if(typeof S!="object"||S===null)return v;for(let[T,z]of Object.entries(S))su(T)&&typeof z=="boolean"&&v.set(T,z);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=lu(v,o);b.malformed&&c.push(o);let S=b.root;if(!b.configured){let T=i.map(oe=>au(v,oe.settings,r)).filter(oe=>oe.configured),z=T[T.length-1];z?S=z.root:S=uu(v,s);}S?h.push({root:S,inspectPluginConfig:true}):y=true;}let k=[...h.reduce((v,b)=>{let S=v.get(b.root);return S?(v.set(b.root,{root:b.root,configPath:S.configPath??b.configPath,commands:[...new Set([...S.commands??[],...b.commands??[]])],inspectPluginConfig:!!(S.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],C=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:k,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:C.length>0?`${C.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(k.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function gu(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 yt(e,t){if(Array.isArray(e)){for(let n of e)yt(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):yt(o,t);}function Bn(e){return [...e.matchAll(Ol)].map(t=>t[1])}function fu(e){let t=new Map,n=kt(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 mu(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 pu(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 Kn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Zn(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 Qn(e,t){return `${e} (${t})`}function hu(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)){Re(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(!Re(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Fr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=os){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Zn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Qn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?as(l,d):c.parserKind,f=g==="shell";for(let p of me(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=Fr(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=cs(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function yu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=gu(r),c=0,l=(f,p=false,m=r,h="infer",y=e,k=0)=>{if(k>eo){o.traversalLimitRoots.push(r);return}let C=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Re(C,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Re(C,b)){o.escapedArtifacts.push(v);return}let S=`${b}:${h}:${y}`;i.has(S)||(i.add(S),s.push({path:b,parserKind:h,cwd:y,depth:k}));},u=(f,p,m,h=0)=>{for(let y of Bn(f)){let k=Kn(r,y);if(!k)continue;let C=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(k,true,r,C?.parserKind??"infer",C?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let k=y.nodeResolutionKind?to(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(k.malformed){o.malformedCommands.push(y.value);continue}if(k.inlineContent)for(let C of me(k.inlineContent.content,false,"node"))o.findings.push({artifact:k.inlineContent.source,endpoint:C});k.reference&&l(k.reference.path,true,h?r:k.reference.containmentRoot,k.reference.parserKind,k.reference.cwd??p,m);}},g=f=>{for(let m of me(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=Ut(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=ds(m),y=(p.artifacts??[]).find(k=>k.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Re(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Zn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Qn(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let k=JSON.parse(y.content),C=[];yt(k,C);for(let v of C)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=os){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Zn(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(Qn(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?as(p,h):f.parserKind,k=y==="shell";for(let b of me(h,k,y))o.findings.push({artifact:p,endpoint:b});if(k){let b=fu(h),S=Ut(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});mu(h)&&o.malformedCommands.push(p),u(b,S,dirname(p),f.depth+1),d(S,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=cs(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?pu(p):b.malformed)&&o.malformedCommands.push(p);for(let S of b.inlineContents)for(let T of me(S.content,false,"node"))o.findings.push({artifact:S.source,endpoint:T});for(let S of b.references){let T=relative(r,resolve(S.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(S.path,true,r,S.parserKind,S.cwd,f.depth+1);}for(let S of Bn(h)){let T=Kn(r,S);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of Bn(h)){let S=Kn(r,b);S&&l(S,true,r,y,f.cwd,f.depth+1);}let C=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(C).replace(/\.js$/,"");a&&(C.startsWith("hooks/")||C.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),C.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function vu(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=q(Me(t)),r=q(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=q(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=q(Me(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function ku(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=vu(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let d=existsSync$1(l)?l:u;try{let k=q(Me(d)),C=q(k?.hooks),v=[];yt(C?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=zr(i),f=zr(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(k=>k!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let k=readFileSync$1(h,"utf8");(!existsSync$1(y)||!k.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function wu(e,t){let n=du(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let $ of n.configCommands){o.configsInspected.push($.path);for(let U of $.commands){o.commandsInspected.push({configPath:$.path,command:U});for(let X of me(U,true))o.findings.push({artifact:$.path,endpoint:X});}}hu(e,t.homePath??homedir$1(),n.configCommands.flatMap($=>$.commands).filter($=>!n.targets.some(U=>U.commands?.includes($))),o);for(let $ of n.targets)yu(e,t.homePath??homedir$1(),$,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter(($,U,X)=>X.findIndex(D=>D.configPath===$.configPath&&D.command===$.command)===U),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter(($,U,X)=>X.findIndex(D=>D.artifact===$.artifact&&D.endpoint===$.endpoint)===U),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=ku(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,k=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),C=n.targets.map($=>$.root).find($=>existsSync$1(join$1($,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:C?{root:C,version:null}:Ce(k,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,S=b?Xe(k,b):[],T=S.filter($=>!$.isKnownDevFlowArtifact).map($=>({skillName:$.skillName,path:$.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),z=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map($=>$.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:S.length,target:0,ok:S.length===0,severity:"error"},{key:"shadowed_skills",value:S,target:[],ok:S.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],oe=v.version??h.versionRecords.find($=>$.root===b)?.packageVersion;return oe&&z.push({key:"active_plugin_version",value:oe,ok:true,severity:"info"}),{name:"Legacy paths",status:N(z),metrics:z}}function bu(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 zt(e){let t=bu(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/Ze:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function _u(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=te(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:J(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:N(n),metrics:n}}function Su(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:N(n),metrics:n};let r;try{if(r=te(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*Ze,i=r.prepare(`
184
199
  SELECT source, COUNT(*) count FROM memories
185
200
  WHERE created_at >= ? GROUP BY source ORDER BY source
186
201
  `).all(s),a=r.prepare(`
@@ -188,24 +203,24 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
188
203
  SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
189
204
  SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
190
205
  FROM memories WHERE status = 'active'
191
- `).get();if(n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),L(r,"retrieval_access_log")){let c=r.prepare(`
206
+ `).get();if(n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),M(r,"retrieval_access_log")){let c=r.prepare(`
192
207
  SELECT access_type, COUNT(*) count
193
208
  FROM retrieval_access_log
194
209
  GROUP BY access_type
195
- `).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected/exposed are distinct from adopted",ok:!0,severity:"info"});}if(L(r,"observations"))if(!fe(r,"observations").has("evidence_status"))n.push({key:"explicit_memory_evidence_schema",value:"evidence_status missing",target:"memory schema v8+",ok:!1,severity:"error"});else {let l=r.prepare(`
210
+ `).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected/exposed are distinct from adopted",ok:!0,severity:"info"});}if(M(r,"observations"))if(!fe(r,"observations").has("evidence_status"))n.push({key:"explicit_memory_evidence_schema",value:"evidence_status missing",target:"memory schema v8+",ok:!1,severity:"error"});else {let l=r.prepare(`
196
211
  SELECT
197
212
  COUNT(*) total,
198
213
  SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
199
214
  FROM observations
200
215
  WHERE source = 'explicit_intent' AND quality_status = 'accepted'
201
- `).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:N(n),metrics:n}}function Xl(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:N(n),metrics:n};let r;try{if(r=ee(o,t),!L(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(g=>Number(g.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),d=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:d?"trigram":"missing/non-trigram",target:"trigram",ok:d,severity:"warning"}),L(r,"knowledge_source_readiness")){let g=r.prepare(`
216
+ `).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:N(n),metrics:n}}function Eu(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:N(n),metrics:n};let r;try{if(r=te(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(`
202
217
  SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
203
218
  FROM knowledge_source_readiness ORDER BY source
204
- `).all(),f=g.filter(m=>Number(m.documents??0)>0||Number(m.chunks??0)>0),p=f.length>0?Math.min(...f.map(m=>Number(m.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(m=>m.status==="ready"&&Number(m.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:p,target:">= 0.95",ok:f.length>0&&p>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:N(n),metrics:n}}function eu(e){let{manifest:t,metrics:n}=Ht(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:N(n),metrics:n}}function tu(e){let{manifest:t,metrics:n}=Ht(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:N(n),metrics:n}}function nu(e){let{manifest:t,metrics:n}=Ht(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:N(n),metrics:n}}async function ou(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 ru(e){let{manifest:t,metrics:n}=Ht(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeEndpointState(e.homePath??homedir$1());if((!r||r.status==="stopped")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:N(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/health`;try{let a=await(e.httpGet??ou)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:N(n),metrics:n}}async function Vn(e={},t={}){let n=e.project??process.cwd(),o=Fn(n),r=eu(t),s=await Fc(o.path,t);r.metrics.push(...s.metrics),r.status=N(r.metrics);let i=[Uc(n,t),zc(o.path,t),Gl(o.path,t),await Yc(o.path,t),Zc(o.path,!!e.strict,t),Zl(o.path,t),Ql(o.path,t),Xl(o.path,t),r,tu(t),Xc(t),el(o.path,t),nu(t),Qc(t),await ru(t),nl(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 su(e,t={}){return e===void 0?os():Vn(e,t)}function Mr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ns(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: ${Mr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Mr(s.value)}${i}`);}}return t.join(`
205
- `)}async function iu(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await Vn(e,n);return t.stdout(e.json?JSON.stringify(o):ns(o)),o.exitCode}async function Ut(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function os(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Ut(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let p=await ct(),m=0;return a.fileCount>0&&(m+=25),a.nodeCount>0&&(m+=15),c.nodes.length>0&&(m+=20),u&&(m+=15),g>0&&(m+=10),l>0&&(m+=5),p.running&&(m+=10),f.total>0&&(m+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:p.running},toolCalls:f,readyScore:m}}async function au(){let{data:e}=await Ut(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 cu(){let{data:e}=await Ut(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 lu(e){let{data:t}=await Ut(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 uu(){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 Ot,Wc,Hn,Jc,ze,Wn,Er,ol,rl,Jr,xt,Jn,zr,Vr,sl,il,al,Rr,wl,Ar,$r,Or,xr,bl,Sl,_l,Pl,Rl,Nr,Cl,$l,Ol,ss=A(()=>{Be();_e();En();Wc={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Hn=3600*1e3;Jc=new Set(["pending","committed","expired"]);ze=1440*60*1e3,Wn=30*ze,Er=60*1024*1024;ol=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,rl=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Jr=64,xt=1024*1024,Jn=8,zr=8,Vr=64*1024;sl=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),il=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),al=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Rr=[".cjs",".js",".mjs",".ts",".tsx"];wl=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Ar=new Set(["-r","--require"]),$r=new Set(["--experimental-loader","--import","--loader"]),Or=new Set(["-e","--eval","-p","--print"]),xr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),bl=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Sl=new Set(["--check","-c"]),_l=new Set(["--help","--version","-h","-v"]);Pl=new Set(["-e","-eu","-o","-u","-ue"]),Rl=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Nr=new Set(["-W","-X","--check-hash-based-pycs"]),Cl=new Set(["--help","--version","-h","-V"]);$l=new Set(["builtin","command","env","exec","nohup","timeout"]),Ol=new Set([":","[","echo","false","printf","pwd","test","true"]);});var is={};O(is,{runMemoryMaintainCommand:()=>mu});function fu(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 mu(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:fu(e.actions),apply:e.apply===true,dryRun:e.apply!==true,batchSize:e.batchSize});if(e.json)return JSON.stringify(t,null,2);let{before:n,after:o,changes:r}=t;return [`Memory maintenance: ${t.mode}`,`Pending events: ${n.pendingEvents.count} -> ${o.pendingEvents.count}`,`Eligible observation vectors: ${n.observationVectors.coverage.toFixed(3)} -> ${o.observationVectors.coverage.toFixed(3)}`,`Duplicate groups: ${n.duplicates.groups} -> ${o.duplicates.groups}`,`Changes: events=${r.duplicateEventsDeleted}, low-value=${r.lowValueEventsDiscarded}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
206
- `)}var as=A(()=>{});var cs={};O(cs,{generateToken:()=>yu});async function yu(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 ls=A(()=>{});var Gn={};O(Gn,{reportBenchmarkCommand:()=>Su,runBenchmarkCommand:()=>bu});async function bu(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}
219
+ `).all(),f=g.filter(m=>Number(m.documents??0)>0||Number(m.chunks??0)>0),p=f.length>0?Math.min(...f.map(m=>Number(m.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(m=>m.status==="ready"&&Number(m.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:p,target:">= 0.95",ok:f.length>0&&p>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:N(n),metrics:n}}function Ru(e){let{manifest:t,metrics:n}=zt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:N(n),metrics:n}}function Pu(e){let{manifest:t,metrics:n}=zt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:N(n),metrics:n}}function Cu(e){let{manifest:t,metrics:n}=zt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:N(n),metrics:n}}async function Du(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 Ou(e){let{manifest:t,metrics:n}=zt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeEndpointState(e.homePath??homedir$1());if((!r||r.status==="stopped")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:N(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/health`;try{let a=await(e.httpGet??Du)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:N(n),metrics:n}}async function no(e={},t={}){let n=e.project??process.cwd(),o=zn(n),r=Ru(t),s=await ul(o.path,t);r.metrics.push(...s.metrics),r.status=N(r.metrics);let i=[gl(n,t),vl(o.path,t),wu(o.path,t),await bl(o.path,t),_l(o.path,!!e.strict,t),_u(o.path,t),Su(o.path,t),Eu(o.path,t),r,Pu(t),El(t),Rl(o.path,t),Cu(t),Sl(t),await Ou(t),Cl(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 $u(e,t={}){return e===void 0?ms():no(e,t)}function Vr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function fs(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?_.green:n.status==="yellow"?_.yellow:_.red;t.push(`${r(o)} ${_.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Vr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Vr(s.value)}${i}`);}}return t.join(`
220
+ `)}async function xu(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):fs(o)),o.exitCode}async function Vt(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function ms(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Vt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let p=await ft(),m=0;return a.fileCount>0&&(m+=25),a.nodeCount>0&&(m+=15),c.nodes.length>0&&(m+=20),u&&(m+=15),g>0&&(m+=10),l>0&&(m+=5),p.running&&(m+=10),f.total>0&&(m+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:p.running},toolCalls:f,readyScore:m}}async function Au(){let{data:e}=await Vt(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 Nu(){let{data:e}=await Vt(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 Vt(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 Tu(){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,yl,Ze,Yn,Tr,Dl,Ol,os,Ft,eo,rs,ss,$l,xl,Al,Mr,Kl,Hr,Wr,Ur,qr,Jl,zl,Vl,Yl,Zl,Br,Ql,tu,nu,hs=O(()=>{qe();Se();An();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;yl=new Set(["pending","committed","expired"]);Ze=1440*60*1e3,Yn=30*Ze,Tr=60*1024*1024;Dl=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Ol=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,os=64,Ft=1024*1024,eo=8,rs=8,ss=64*1024;$l=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),xl=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Al=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Mr=[".cjs",".js",".mjs",".ts",".tsx"];Kl=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Hr=new Set(["-r","--require"]),Wr=new Set(["--experimental-loader","--import","--loader"]),Ur=new Set(["-e","--eval","-p","--print"]),qr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Jl=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),zl=new Set(["--check","-c"]),Vl=new Set(["--help","--version","-h","-v"]);Yl=new Set(["-e","-eu","-o","-u","-ue"]),Zl=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Br=new Set(["-W","-X","--check-hash-based-pycs"]),Ql=new Set(["--help","--version","-h","-V"]);tu=new Set(["builtin","command","env","exec","nohup","timeout"]),nu=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ys={};x(ys,{runMemoryMaintainCommand:()=>Fu});function Lu(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 Fu(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Lu(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(`
221
+ `)}var vs=O(()=>{});var ks={};x(ks,{generateToken:()=>Uu});async function Uu(e,t=3600){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),o=Math.floor(Date.now()/1e3),r={sub:`devflow-session-${Date.now().toString(36)}`,project:e.split("/").pop()??"unknown",iat:o,exp:o+t,scope:["context","knowledge","memory","workflow","graph"]},s=Buffer.from(JSON.stringify(r)).toString("base64url"),i=getLocalHmacSecret(),a=createHmac("sha256",i).update(`${n}.${s}`).digest("base64url");return {token:`${n}.${s}.${a}`,expiresAt:r.exp,scope:r.scope}}var ws=O(()=>{});var oo={};x(oo,{reportBenchmarkCommand:()=>zu,runBenchmarkCommand:()=>Ju});async function Ju(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}
207
222
 
208
- Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Su(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=_u(o,n);return r==="markdown"?`${s}
223
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function zu(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=Vu(o,n);return r==="markdown"?`${s}
209
224
  ## Change From Prior Baseline
210
225
 
211
226
  ${i.map(a=>`- ${a}`).join(`
@@ -214,20 +229,20 @@ ${i.map(a=>`- ${a}`).join(`
214
229
 
215
230
  Change from ${o.runId}:
216
231
  ${i.map(a=>`- ${a}`).join(`
217
- `)}`}function _u(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Wt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Wt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Wt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Wt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Wt(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 Yn=A(()=>{});var fs={};O(fs,{runReview:()=>Eu});async function Eu(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[S.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?S.red(`Critical (${i.length})`):"",...i.map(u=>` ${S.red("\u25CF")} ${u}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${S.yellow("\u25CB")} ${u}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${S.green("\u25CB")} ${u}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
218
- `)}var ms=A(()=>{});var ps={};O(ps,{startAll:()=>Ru});async function Pu(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function Ru(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await On({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await Pu(e.port);console.log(n?S.green(" Server ready"):S.yellow(" Server started but health check timed out")),console.log(""),console.log(S.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(S.green("\u2551")+" DevFlow Started! "+S.green("\u2551")),console.log(S.green("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563")),console.log(S.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+" "+S.green("\u2551")),console.log(S.green("\u2551")+" Press Ctrl+C to stop "+S.green("\u2551")),console.log(S.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),e.background||await new Promise(o=>{let r=false,s=async()=>{r||(r=true,console.log(S.blue(`
219
- Shutting down...`)),await at(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var hs=A(()=>{_e();});var vs={};O(vs,{stopAll:()=>Cu});async function Cu(){let e=await at();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var ks=A(()=>{_e();});var bs={};O(bs,{showStatus:()=>Nu});function xu(e){if(!existsSync(e))return false;try{let t=new DatabaseSync(e,{readOnly:!0});try{return !!t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' LIMIT 1").get()}finally{t.close();}}catch{return true}}async function Nu(){console.log(S.blue("DevFlow Status")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await ct(),t=e.port??$n;e.running?(console.log(`Server: ${S.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${S.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${S.yellow("\u25CB")} not running`),console.log(`Dashboard: ${S.yellow("\u25CB")} not running`));let n=homedir$1(),o=Ce(n),r=o.root?Ge(n,o.root):[];o.root?console.log(`Plugin: ${S.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?S.green("\u2713"):S.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${S.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],...xu(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Ss=A(()=>{_e();Be();});var _s={};O(_s,{setupCommand:()=>qu});function Hu(){try{return bt()}catch{return}}function Uu(e){try{return Fu.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 Wu(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 Bu(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 qu(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=Uu(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=Hu();if(r.id==="claude-code"&&l)try{let u=Wu(l),d=join$1(n.homeDir,".claude","plugins","cache");St(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)Bu(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 Fu,Es=A(()=>{Be();Fu=createRequire$1(import.meta.url);});var Ps={};O(Ps,{pluginListCommand:()=>Ju});var Ju,Rs=A(()=>{_t();Ju=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Ae();if(e.installed){let n=vo();if(n.length===0){console.log("No plugins installed."),console.log(`
232
+ `)}`}function Vu(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Gt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Gt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Gt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Gt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Gt(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=O(()=>{});var io={};x(io,{reportEvaluationCommand:()=>nd,runEvaluationCommand:()=>td});async function td(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=od(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:${Yt(JSON.stringify(c)).slice(0,24)}`},d={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:Yt(c.prompt),toolProfileHash:Yt("benchmark-context-deep:r3.v1"),acceptanceHash:Yt(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 nd(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 od(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function Yt(e){return createHash("sha256").update(e).digest("hex")}var ao=O(()=>{});var Ps={};x(Ps,{runReview:()=>rd});async function rd(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"),[_.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?_.red(`Critical (${i.length})`):"",...i.map(u=>` ${_.red("\u25CF")} ${u}`),"",a.length>0?_.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${_.yellow("\u25CB")} ${u}`),"",c.length>0?_.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${_.green("\u25CB")} ${u}`),"",i.length>0?_.red("Overall: Need changes"):a.length>0?_.yellow("Overall: Approve with comments"):_.green("Overall: LGTM")].join(`
233
+ `)}var Cs=O(()=>{});var Ds={};x(Ds,{startAll:()=>id});async function sd(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function id(e){console.log(_.blue("Starting DevFlow server..."));let{pid:t}=await Fn({port:e.port});console.log(_.green(` Server started (PID: ${t})`)),console.log(_.blue(" Waiting for server..."));let n=await sd(e.port);console.log(n?_.green(" Server ready"):_.yellow(" Server started but health check timed out")),console.log(""),console.log(_.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(_.green("\u2551")+" DevFlow Started! "+_.green("\u2551")),console.log(_.green("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563")),console.log(_.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+_.green("\u2551")),console.log(_.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+_.green("\u2551")),console.log(_.green("\u2551")+" "+_.green("\u2551")),console.log(_.green("\u2551")+" Press Ctrl+C to stop "+_.green("\u2551")),console.log(_.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),e.background||await new Promise(o=>{let r=false,s=async()=>{r||(r=true,console.log(_.blue(`
234
+ Shutting down...`)),await gt(),console.log(_.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var Os=O(()=>{Se();});var xs={};x(xs,{stopAll:()=>ad});async function ad(){let e=await gt();console.log(e?_.green("Server stopped"):_.dim("No DevFlow services running"));}var As=O(()=>{Se();});var js={};x(js,{showStatus:()=>fd});function gd(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 fd(){console.log(_.blue("DevFlow Status")),console.log(_.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await ft(),t=e.port??Ln;e.running?(console.log(`Server: ${_.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${_.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${_.yellow("\u25CB")} not running`),console.log(`Dashboard: ${_.yellow("\u25CB")} not running`));let n=homedir$1(),o=Ce(n),r=o.root?Xe(n,o.root):[];o.root?console.log(`Plugin: ${_.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${_.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?_.green("\u2713"):_.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${_.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],...gd(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${_.yellow(c.join(", "))}`):console.log(`Legacy: ${_.green("none")}`);}var Ts=O(()=>{Se();qe();});var Is={};x(Is,{setupCommand:()=>Ed});function wd(){try{return Ct()}catch{return}}function bd(e){try{return kd.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 Sd(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(_.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(_.yellow(` ! ${e.artifact}: ${t}`)):console.log(_.green(` + ${e.artifact}: ${t}`));}async function Ed(e){console.log(_.blue("DevFlow Setup")),console.log(_.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(_.red(` x Host selection failed: ${o.reason}`)),console.log(_.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(_.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp){let l=bd(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=wd();if(r.id==="claude-code"&&l)try{let u=_d(l),d=join$1(n.homeDir,".claude","plugins","cache");Dt(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)Sd(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(_.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(_.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(_.green(`Setup complete for ${r.id}.`)),console.log(_.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var kd,Ms=O(()=>{qe();kd=createRequire$1(import.meta.url);});var Ls={};x(Ls,{pluginListCommand:()=>Pd});var Pd,Fs=O(()=>{Ot();Pd=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=Oo();if(n.length===0){console.log("No plugins installed."),console.log(`
220
235
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
221
- `),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${S.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
222
- `);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${S.green(o.name)}${r}v${o.version}`),console.log(` ${" ".repeat(n)}${o.description.substring(0,60)}`),o.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${o.tags.join(", ")}`),console.log("");}),console.log(`
223
- Install a plugin: devflow plugin install <name>`);}});});var Cs={};O(Cs,{pluginSearchCommand:()=>Gu});var Gu,Ds=A(()=>{_t();Gu=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Ae(),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
+ `),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${_.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${_.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
237
+ `);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(` ${_.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(`
238
+ Install a plugin: devflow plugin install <name>`);}});});var Hs={};x(Hs,{pluginSearchCommand:()=>Od});var Od,Ws=O(()=>{Ot();Od=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(`
224
239
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
225
- `),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var $s={};O($s,{pluginInstallCommand:()=>Zu});var Zu,Os=A(()=>{be();Zu=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 $e(n,process.cwd(),!0);console.log(`
226
- ${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
240
+ `),o.forEach(r=>{console.log(` ${_.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 qs={};x(qs,{pluginInstallCommand:()=>xd});var xd,Bs=O(()=>{be();xd=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 $e(n,process.cwd(),!0);console.log(`
241
+ ${_.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
227
242
  Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
228
- ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Ns={};O(Ns,{pluginUninstallCommand:()=>Xu});var Xu,Ts=A(()=>{be();Xu=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 en(n,process.cwd(),!0),console.log(`
229
- ${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
230
- ${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Kt(e){let t=join(e,".devflow","config.json");if(existsSync(t))try{let n=readFileSync(t,"utf-8");if(JSON.parse(n).serverUrl)return "server"}catch{}return "local"}var Is=createRequire(import.meta.url),Xn="0.0.0";try{Xn=Is("../package.json").version;}catch{try{Xn=Is("../../package.json").version;}catch{}}var P=new Command;P.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(Xn).option("--local","Force local engine, skip server");P.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=td.join(t,a);js.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),js.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
231
- `));}let n=Kt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(po(),mo)),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(()=>(yo(),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(()=>(nn(),tn));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(nn(),tn));await i(t);}}});P.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(Ko(),qo));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var od=P.command("db").description("Manage DevFlow databases");od.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(()=>(tr(),er)),o=t(e);for(let r of n(o))console.log(r);});P.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=Kt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(or(),nr));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});P.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(ir(),sr)),o=e.backfillVectors?await n(P.opts().local):await t(P.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});P.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(cr(),ar)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});P.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(pn(),mn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(pn(),mn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var qt=P.command("workflow").description("Workflow management");qt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});qt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ot(),nt)),o=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});qt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});qt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var Ms=P.command("embeddings").description("Manage the shared verified embedding model");Ms.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(()=>(vn(),yn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Ms.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(()=>(vn(),yn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.migratedFrom&&console.log(` migrated from: ${r.migratedFrom}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Le=P.command("memory").description("Memory management");Le.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Oe)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Le.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Oe));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});Le.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(xe(),Oe)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:P.opts().local});console.log(JSON.stringify(o,null,2));});Le.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(xe(),Oe));await n(e,t,P.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Le.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(xe(),Oe)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});Le.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(xe(),Oe)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(fr(),gr)),o=(await t(e,void 0,void 0,P.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var eo=P.command("docs").description("Documentation index management");eo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
232
- ${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${S.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${S.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(S.green(`
233
- All docs synced.`));}});eo.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(()=>(Sn(),bn)),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`));});eo.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(()=>(Sn(),bn));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 ht=P.command("skill").description("Plugin/Skill management");ht.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),Ze)),t=await e(P.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});ht.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,P.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});ht.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,process.cwd(),P.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});ht.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),Ze));await t(e,process.cwd(),P.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});ht.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(()=>(En(),pr));process.exitCode=t(e);});var Ls=P.command("mcp").description("Inspect MCP configuration and health");Ls.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(()=>(Rn(),Pn));await t(e);});Ls.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(()=>(Rn(),Pn));await t(e);});P.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(ss(),rs));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;});Le.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(()=>(as(),is));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});P.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(ls(),cs)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Fs=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Fs.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(()=>(Yn(),Gn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Fs.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(()=>(Yn(),Gn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});P.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(ms(),fs)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var to=P.command("server").description("Manage DevFlow server");to.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(S.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(_e(),At)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});to.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(_e(),At)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});to.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(_e(),At)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});P.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');console.log(S.blue("The Dashboard is served by the DevFlow server.")),console.log(S.dim("Run: devflow start")),console.log(S.dim(`Then open: ${e().url}`));});P.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(hs(),ps));await t({port:parseInt(e.port,10),background:!!e.background});});P.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(ks(),vs));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Ss(),bs));await e();});P.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Es(),_s));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Bt=P.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Rs(),Ps)),Promise.resolve().then(()=>(Ds(),Cs)),Promise.resolve().then(()=>(Os(),$s)),Promise.resolve().then(()=>(Ts(),Ns))]);Bt.addCommand(e),Bt.addCommand(t),Bt.addCommand(n),Bt.addCommand(o);}await P.parseAsync();
243
+ ${_.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Js={};x(Js,{pluginUninstallCommand:()=>Nd});var Nd,zs=O(()=>{be();Nd=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(`
244
+ ${_.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
245
+ ${_.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 Gs=createRequire(import.meta.url),uo="0.0.0";try{uo=Gs("../package.json").version;}catch{try{uo=Gs("../../package.json").version;}catch{}}var E=new Command;E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(uo).option("--local","Force local engine, skip server");E.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(_.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Td.join(t,a);Vs.existsSync(c)&&(console.log(_.dim(` Removing ${a}/...`)),Vs.rmSync(c,{recursive:true,force:true}));}console.log(_.green(`\u2705 Existing directories removed
246
+ `));}let n=Xt(t);console.error(_.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Po(),Ro)),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(_.green("Created:"));for(let i of s.created)console.log(` ${_.dim("+")} ${i}`);}else console.log(_.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(_.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(_.green("\u2705 Onboarding pack generated")),console.log(_.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(_.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(_.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(_.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(_.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(Do(),Co)),a=await i(t,e.withPlugin);console.log(_.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(()=>(nr(),tr));t(e,{},{log:o=>console.log(o),error:o=>console.error(_.red(o))})||(process.exitCode=1);});var Md=E.command("db").description("Manage DevFlow databases");Md.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(()=>(gr(),dr)),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(_.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(mr(),fr));if(e){let i=s();i.includes(e)||(console.log(_.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(_.green(`\u2713 ${a}`));}catch(i){console.error(_.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(()=>(yr(),hr)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(_.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(_.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(()=>(kr(),vr)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(_.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(()=>(Sn(),_n)),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(()=>(Sn(),_n)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(_.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(()=>(at(),it)),t=await e(E.opts().local);if(t.length===0){console.log(_.dim("No workflows registered."));return}for(let n of t)console.log(`${_.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var bt=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");bt.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(o({projectRoot:n.project,json:n.json}));});bt.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(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});bt.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});bt.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(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});bt.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(()=>(Ge(),Ve));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(()=>(at(),it)),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(()=>(at(),it)),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(()=>(at(),it)),t=await e(E.opts().local);if(t.length===0){console.log(_.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${_.yellow(n.status)} ${o}`);}});var Ys=E.command("embeddings").description("Manage the shared verified embedding model");Ys.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(),Rn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Ys.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(),Rn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.migratedFrom&&console.log(` migrated from: ${r.migratedFrom}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(_.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Le=E.command("memory").description("Memory management");Le.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(),xe)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Le.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),xe));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Le.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(),xe)),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));});Le.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Ae(),xe));await n(e,t,E.opts().local),console.log(_.green(`Memory set: ${e} = ${t}`));});Le.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Ae(),xe)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Le.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(),xe)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(_.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(()=>(Er(),Sr)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(_.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var go=E.command("docs").description("Documentation index management");go.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(_.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${_.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${_.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(_.green(`
247
+ ${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(` ${_.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${_.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(_.green(`
248
+ All docs synced.`));}});go.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(()=>($n(),On)),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(_.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});go.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(()=>($n(),On));console.log(_.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(` ${_.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${_.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(_.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var _t=E.command("skill").description("Plugin/Skill management");_t.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),tt)),t=await e(E.opts().local);if(t.length===0){console.log(_.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${_.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});_t.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),tt)),n=await t(e,E.opts().local);if(console.log(_.blue(`Search: "${e}"`)),n.length===0){console.log(_.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${_.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});_t.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),tt)),n=await t(e,process.cwd(),E.opts().local);console.log(_.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});_t.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),tt));await t(e,process.cwd(),E.opts().local),console.log(_.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});_t.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(()=>(An(),Pr));process.exitCode=t(e);});var Zs=E.command("mcp").description("Inspect MCP configuration and health");Zs.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(()=>(jn(),Nn));await t(e);});Zs.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(()=>(jn(),Nn));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(()=>(hs(),ps));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;});Le.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(()=>(vs(),ys));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(_.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(()=>(ws(),ks)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Qs=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Qs.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 Xs=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");Xs.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}));});Xs.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"}));});Qs.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(()=>(Cs(),Ps)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var fo=E.command("server").description("Manage DevFlow server");fo.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(_.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(Se(),It)),n=await t({port:parseInt(e.port,10)});console.log(_.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});fo.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(Se(),It)),t=await e();console.log(t?_.green("Server stopped"):_.dim("No server running"));});fo.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(Se(),It)),t=await e();t.running?console.log(_.green(`Running (pid: ${t.pid})`)):console.log(_.yellow("Not running"));});E.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');console.log(_.blue("The Dashboard is served by the DevFlow server.")),console.log(_.dim("Run: devflow start")),console.log(_.dim(`Then open: ${e().url}`));});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(Os(),Ds));await t({port:parseInt(e.port,10),background:!!e.background});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(As(),xs));await e();});E.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Ts(),js));await e();});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Ms(),Is));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Zt=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(()=>(Fs(),Ls)),Promise.resolve().then(()=>(Ws(),Hs)),Promise.resolve().then(()=>(Bs(),qs)),Promise.resolve().then(()=>(zs(),Js))]);Zt.addCommand(e),Zt.addCommand(t),Zt.addCommand(n),Zt.addCommand(o);}await E.parseAsync();