@devflow-tools/devflow 0.19.5 → 0.19.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/cli.js +54 -54
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/__next.__PAGE__.txt +1 -1
  4. package/dist/dashboard/__next._full.txt +1 -1
  5. package/dist/dashboard/__next._tree.txt +1 -1
  6. package/dist/dashboard/_not-found/__next._full.txt +1 -1
  7. package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +1 -1
  8. package/dist/dashboard/_not-found/__next._tree.txt +1 -1
  9. package/dist/dashboard/_not-found.html +1 -1
  10. package/dist/dashboard/_not-found.txt +1 -1
  11. package/dist/dashboard/accuracy/__next._full.txt +1 -1
  12. package/dist/dashboard/accuracy/__next._tree.txt +1 -1
  13. package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +1 -1
  14. package/dist/dashboard/accuracy.html +1 -1
  15. package/dist/dashboard/accuracy.txt +1 -1
  16. package/dist/dashboard/benchmark/__next._full.txt +1 -1
  17. package/dist/dashboard/benchmark/__next._tree.txt +1 -1
  18. package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +1 -1
  19. package/dist/dashboard/benchmark.html +1 -1
  20. package/dist/dashboard/benchmark.txt +1 -1
  21. package/dist/dashboard/context/__next._full.txt +1 -1
  22. package/dist/dashboard/context/__next._tree.txt +1 -1
  23. package/dist/dashboard/context/__next.context.__PAGE__.txt +1 -1
  24. package/dist/dashboard/context.html +1 -1
  25. package/dist/dashboard/context.txt +1 -1
  26. package/dist/dashboard/doctor/__next._full.txt +1 -1
  27. package/dist/dashboard/doctor/__next._tree.txt +1 -1
  28. package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +1 -1
  29. package/dist/dashboard/doctor.html +1 -1
  30. package/dist/dashboard/doctor.txt +1 -1
  31. package/dist/dashboard/executions/__next._full.txt +1 -1
  32. package/dist/dashboard/executions/__next._tree.txt +1 -1
  33. package/dist/dashboard/executions/__next.executions.__PAGE__.txt +1 -1
  34. package/dist/dashboard/executions.html +1 -1
  35. package/dist/dashboard/executions.txt +1 -1
  36. package/dist/dashboard/graph/__next._full.txt +1 -1
  37. package/dist/dashboard/graph/__next._tree.txt +1 -1
  38. package/dist/dashboard/graph/__next.graph.__PAGE__.txt +1 -1
  39. package/dist/dashboard/graph.html +1 -1
  40. package/dist/dashboard/graph.txt +1 -1
  41. package/dist/dashboard/index.html +1 -1
  42. package/dist/dashboard/index.txt +1 -1
  43. package/dist/dashboard/intelligence/__next._full.txt +1 -1
  44. package/dist/dashboard/intelligence/__next._tree.txt +1 -1
  45. package/dist/dashboard/intelligence/__next.intelligence.__PAGE__.txt +1 -1
  46. package/dist/dashboard/intelligence/knowledge/__next._full.txt +1 -1
  47. package/dist/dashboard/intelligence/knowledge/__next._tree.txt +1 -1
  48. package/dist/dashboard/intelligence/knowledge/__next.intelligence.knowledge.__PAGE__.txt +1 -1
  49. package/dist/dashboard/intelligence/knowledge.html +1 -1
  50. package/dist/dashboard/intelligence/knowledge.txt +1 -1
  51. package/dist/dashboard/intelligence/memory/__next._full.txt +1 -1
  52. package/dist/dashboard/intelligence/memory/__next._tree.txt +1 -1
  53. package/dist/dashboard/intelligence/memory/__next.intelligence.memory.__PAGE__.txt +1 -1
  54. package/dist/dashboard/intelligence/memory.html +1 -1
  55. package/dist/dashboard/intelligence/memory.txt +1 -1
  56. package/dist/dashboard/intelligence.html +1 -1
  57. package/dist/dashboard/intelligence.txt +1 -1
  58. package/dist/dashboard/knowledge/__next._full.txt +1 -1
  59. package/dist/dashboard/knowledge/__next._tree.txt +1 -1
  60. package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +1 -1
  61. package/dist/dashboard/knowledge.html +1 -1
  62. package/dist/dashboard/knowledge.txt +1 -1
  63. package/dist/dashboard/memory/__next._full.txt +1 -1
  64. package/dist/dashboard/memory/__next._tree.txt +1 -1
  65. package/dist/dashboard/memory/__next.memory.__PAGE__.txt +1 -1
  66. package/dist/dashboard/memory.html +1 -1
  67. package/dist/dashboard/memory.txt +1 -1
  68. package/dist/dashboard/replay/__next._full.txt +1 -1
  69. package/dist/dashboard/replay/__next._tree.txt +1 -1
  70. package/dist/dashboard/replay/__next.replay.__PAGE__.txt +1 -1
  71. package/dist/dashboard/replay.html +1 -1
  72. package/dist/dashboard/replay.txt +1 -1
  73. package/dist/dashboard/runs/_/__next._full.txt +1 -1
  74. package/dist/dashboard/runs/_/__next._tree.txt +1 -1
  75. package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +1 -1
  76. package/dist/dashboard/runs/_.html +1 -1
  77. package/dist/dashboard/runs/_.txt +1 -1
  78. package/dist/dashboard/runs/__next._full.txt +1 -1
  79. package/dist/dashboard/runs/__next._tree.txt +1 -1
  80. package/dist/dashboard/runs/__next.runs.__PAGE__.txt +1 -1
  81. package/dist/dashboard/runs.html +1 -1
  82. package/dist/dashboard/runs.txt +1 -1
  83. package/dist/dashboard/settings/__next._full.txt +1 -1
  84. package/dist/dashboard/settings/__next._tree.txt +1 -1
  85. package/dist/dashboard/settings/__next.settings.__PAGE__.txt +1 -1
  86. package/dist/dashboard/settings.html +1 -1
  87. package/dist/dashboard/settings.txt +1 -1
  88. package/dist/dashboard/timeline/__next._full.txt +1 -1
  89. package/dist/dashboard/timeline/__next._tree.txt +1 -1
  90. package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +1 -1
  91. package/dist/dashboard/timeline.html +1 -1
  92. package/dist/dashboard/timeline.txt +1 -1
  93. package/dist/dashboard/tool-metrics/__next._full.txt +1 -1
  94. package/dist/dashboard/tool-metrics/__next._tree.txt +1 -1
  95. package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +1 -1
  96. package/dist/dashboard/tool-metrics.html +1 -1
  97. package/dist/dashboard/tool-metrics.txt +1 -1
  98. package/dist/dashboard/workflows/__next._full.txt +1 -1
  99. package/dist/dashboard/workflows/__next._tree.txt +1 -1
  100. package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +1 -1
  101. package/dist/dashboard/workflows.html +1 -1
  102. package/dist/dashboard/workflows.txt +1 -1
  103. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  104. package/dist/plugin/dist/command-registry.json +7 -7
  105. package/dist/plugin/dist/runtime-manifest.json +5 -5
  106. package/dist/plugin/package.json +14 -14
  107. package/package.json +17 -17
  108. package/plugin-registry.json +15 -15
  109. /package/dist/dashboard/_next/static/{eY7q0gU4P0fA82n4zVzz_ → aecuMkA0GEsvon0-4LDye}/_buildManifest.js +0 -0
  110. /package/dist/dashboard/_next/static/{eY7q0gU4P0fA82n4zVzz_ → aecuMkA0GEsvon0-4LDye}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import {createRequire as createRequire$1,isBuiltin}from'node:module';import {join as join$1,resolve,basename,dirname as dirname$1,relative,sep,isAbsolute,extname}from'node:path';import {createRuntimeManager,resolveStableProjectIdentity,loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,getProjectStateDir,getDevFlowStateRoot,getBackupDir,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getDaemonPidPath,getDaemonRegistryPath,selectHostAdapter,loadPluginsWithDiagnostics,readRuntimeState,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,readPluginInstallState,persistClaudeHookRuntime,getLocalApiKey,runNpmWithClaudeHookRuntime,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {readFileSync as readFileSync$1,mkdirSync,existsSync as existsSync$1,writeFileSync,rmSync,lstatSync,realpathSync,cpSync,renameSync,readdirSync as readdirSync$1,statSync as statSync$1,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import k from'chalk';import sn,{existsSync,readFileSync,readdirSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Ao,{join,dirname}from'path';import {LogCleanupService}from'@devflow-tools/telemetry';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {fileURLToPath}from'node:url';import {homedir}from'os';import sr from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import {execSync,execFileSync as execFileSync$1}from'child_process';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import {projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';import Xl from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {createRequire}from'module';var Ji=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var n in t)Ji(e,n,{get:t[n],enumerable:true});};var Je={};O(Je,{DEFAULT_SERVER_PORT:()=>Xi,ensureCliRuntime:()=>Lo,getRuntimeManager:()=>xe,resolveServerLaunch:()=>Mo,serverStatus:()=>ot,startServer:()=>ln,stopServer:()=>un});function Mo(e=process.cwd()){let t=[()=>Qi.resolve("@devflow-tools/server/dist/main.js"),()=>join$1(e,"node_modules","@devflow-tools","server","dist","main.js"),()=>join$1(e,"apps","server","dist","main.js")];for(let n of t)try{return {command:process.env.DEVFLOW_SERVER_NODE??process.execPath,args:[n()],cwd:e}}catch{}throw new Error("DevFlow server entry point is not installed or built")}function xe(){return createRuntimeManager()}async function Lo(e){return xe().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:Mo(e.projectRoot)})}async function ln(e={}){let t=e.projectRoot??process.cwd(),n=await Lo({reason:"cli-start",projectRoot:t,port:e.port,explicitPort:e.explicitPort});return {pid:n.state.pid,port:n.state.port,state:n.state,reused:n.reused}}async function un(){return (await xe().stop()).stopped}async function ot(){let e=await xe().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var Qi,Xi,ie=C(()=>{Qi=createRequire$1(import.meta.url),Xi=13337;});var Wo={};O(Wo,{createDefaultDeliveryCommand:()=>ta,createDeliveryCommand:()=>Ho,deliveryCliError:()=>Fo});async function Fo(e){let{DeliveryLineError:t}=await import('@devflow-tools/delivery-line'),n=e instanceof t?e.code:"DELIVERY_INTERNAL_ERROR",o=e instanceof Error?e.message:"Delivery operation failed",r=/token|secret|password|transcript/i.test(o)?"Delivery operation failed":o.slice(0,500);return {ok:false,error:{code:n,message:r}}}function Ho(e,t=async()=>{if(!e)throw new Error("DELIVERY_RUNTIME_REQUIRED");return e},n=process.cwd(),o=t){let r=new Command("delivery").description("Run the complete, auditable development delivery line"),s=(d,g)=>({actor:{id:String(d.actor??"cli-user"),kind:"human",...d.actorRole?{role:String(d.actorRole)}:{}},sessionId:String(d.session??"cli-session"),executionId:String(d.execution??"cli-execution"),idempotencyKey:g}),i=(d,g)=>({...s(d,g),contextReceipt:String(d.contextReceipt)}),a=(d,g)=>({...s(d,g),...d.contextReceipt?{contextReceipt:String(d.contextReceipt)}:{}}),c=d=>d.option("--project <path>","Project root",n),l=d=>c(d).requiredOption("--idempotency-key <key>").requiredOption("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),u=d=>c(d).requiredOption("--idempotency-key <key>").option("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),p=(d,g)=>console.log(g?JSON.stringify(d,null,2):JSON.stringify(d)),m=async(d,g)=>{try{p(await d(),g);}catch(h){p(await Fo(h),g),process.exitCode=1;}},f=(d,g)=>async()=>g(await t(d));u(r.command("create").requiredOption("--input <file>").option("--base-ref <ref>","Base ref","HEAD").option("--target-ref <ref>","Protected target ref","main").option("--worktree-mode <mode>","clean, isolated, external, or auto","auto").option("--title <title>")).action(async d=>{await m(async()=>{let g=await o(d.project),h=readFileSync$1(d.input,"utf8");return g.createCase({...a(d,d.idempotencyKey),projectRoot:d.project,baseRef:d.baseRef,targetRef:d.targetRef,worktreeMode:d.worktreeMode,title:d.title??h.trim()})},d.json);}),c(r.command("status").argument("<caseId>")).option("--json").action(async(d,g)=>{await m(f(g.project,h=>h.status(d)),g.json);}),c(r.command("cleanup").option("--stale-only","Only stop the currently owned stale runtime lease")).option("--json").action(async d=>{await m(async()=>{let{getRuntimeManager:g}=await Promise.resolve().then(()=>(ie(),Je)),h=g(),y=await h.status();if(!y)return {ok:true,project:d.project,stopped:false,reason:"runtime_not_found"};if(d.staleOnly&&y.status==="ready")return {ok:true,project:d.project,stopped:false,reason:"runtime_is_ready"};let v=await h.stop();return {ok:true,project:d.project,stopped:v.stopped,runtimeStatus:v.state?.status??"stopped"}},d.json);}),l(r.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(d,g)=>{await m(f(g.project,h=>h.answer(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),value:g.value})),g.json);}),l(r.command("revise").argument("<caseId>").requiredOption("--phase <phase>").requiredOption("--input <file>")).action(async(d,g)=>{await m(f(g.project,h=>h.revise(d,{...i(g,g.idempotencyKey),phase:g.phase,content:readFileSync$1(g.input,"utf8")})),g.json);}),l(r.command("compare").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--decision <option>")).action(async(d,g)=>{await m(f(g.project,h=>h.compareOptions(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),option:g.decision})),g.json);});for(let[d,g]of [["approve","approve"],["reject","reject"]]){let h=r.command(d).argument("<caseId>").requiredOption("--turn <n>").requiredOption("--stage <stage>").requiredOption("--reason <reason>").option("--artifact-hash <hash>");d==="approve"&&h.option("--plan-file <path>","Executable plan JSON required for plan approval"),l(h).action(async(y,v)=>{await m(f(v.project,R=>R[g](y,{...i(v,v.idempotencyKey),turn:Number(v.turn),stage:v.stage,...v.artifactHash?{artifactHash:v.artifactHash}:{},...v.planFile?{plan:JSON.parse(readFileSync$1(v.planFile,"utf8"))}:{},reason:v.reason})),v.json);});}return l(r.command("resume").argument("<caseId>").option("--continue","Resume the same recoverable case")).action(async(d,g)=>{await m(f(g.project,h=>h.resume(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("recover-task").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.recoverTask(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("admit-worktree").argument("<caseId>").requiredOption("--mode <mode>").requiredOption("--admission-token <token>")).action(async(d,g)=>{await m(f(g.project,h=>h.admitWorktree(d,{...i(g,g.idempotencyKey),mode:g.mode,admissionToken:g.admissionToken})),g.json);}),l(r.command("refresh-activation").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.refreshActivation(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("cancel").argument("<caseId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.cancel(d,{...i(g,g.idempotencyKey),reason:g.reason})),g.json);}),l(r.command("rebind-session").argument("<caseId>").requiredOption("--previous-session <sessionId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.rebindSession(d,{...i(g,g.idempotencyKey),previousSessionId:g.previousSession,reason:g.reason})),g.json);}),l(r.command("retry-task").argument("<caseId>").requiredOption("--task-id <taskId>")).action(async(d,g)=>{await m(f(g.project,h=>h.retryTask(d,{...i(g,g.idempotencyKey),taskId:g.taskId})),g.json);}),l(r.command("import-external").argument("<caseId>").requiredOption("--task-id <taskId>").requiredOption("--candidate <revision>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.importExternalChange(d,{...i(g,g.idempotencyKey),taskId:g.taskId,candidateRevision:g.candidate,reason:g.reason})),g.json);}),l(r.command("export").argument("<caseId>").requiredOption("--path <path>")).action(async(d,g)=>{await m(f(g.project,h=>h.export(d,{...i(g,g.idempotencyKey),path:g.path})),g.json);}),r}function ta(e=process.cwd(),t){let n=async(o,r)=>{let i=await(t??(await import('@devflow-tools/mcp-server/retrieval')).createDeliveryProjectRuntime)({projectRoot:o,retrieval:r});return !("close"in i)||!i.close?i.facade:new Proxy(i.facade,{get(a,c,l){let u=Reflect.get(a,c,l);return typeof u!="function"?u:async(...p)=>{try{return await u.apply(a,p)}finally{await i.close?.();}}}})};return Ho(void 0,o=>n(o,false),e,o=>n(o,true))}var Uo=C(()=>{});var pn={};O(pn,{disableDevFlow:()=>ia,enableDevFlow:()=>aa,readKillSwitchState:()=>ca});function mn(e){return join$1(e.stateDir??getDevFlowStateRoot({}),"disable")}function ia(e){let t=mn(e);mkdirSync(join$1(t,".."),{recursive:true});let n=existsSync$1(t);return n||writeFileSync(t,"",{mode:420}),{marker:t,alreadyDisabled:n}}function aa(e){let t=mn(e),n=existsSync$1(t);return n&&rmSync(t,{force:true}),{marker:t,wasDisabled:n}}function ca(e){let t=mn(e);return e.env?.DEVFLOW_DISABLED==="1"?{disabled:true,source:"env",marker:t}:existsSync$1(t)?{disabled:true,source:"marker",marker:t}:{disabled:false,source:"off",marker:t}}var fn=C(()=>{});var Jo={};O(Jo,{aggregateShadowDenials:()=>vn,createHooksCommand:()=>ya,renderShadowStats:()=>kn});function Ot(){return process.cwd()}function xt(e){return join(e,".devflow","config.json")}function yn(e){try{return JSON.parse(readFileSync(xt(e),"utf8"))}catch{return {}}}function Bo(e,t){mkdirSync$1(join(e,".devflow"),{recursive:true}),writeFileSync$1(xt(e),`${JSON.stringify(t,null,2)}
3
- `);}function fa(e){let t=e.trim().replace(/_/g,"-").toLowerCase();return wn.includes(t)?t:void 0}function ha(e){if(process.env.DEVFLOW_DISABLED==="1")return true;try{return existsSync(join(getDevFlowStateRoot(),"disable"))}catch{return false}}function vn(e,t=14){let n=join(e,".devflow","logs","sessions"),o=Date.now()-t*24*60*60*1e3,r=new Map,s=0,i=[];try{i=readdirSync(n).filter(a=>a.endsWith(".jsonl"));}catch{return {windowDays:t,total:0,byCode:[]}}for(let a of i){let c;try{c=readFileSync(join(n,a),"utf8");}catch{continue}for(let l of c.split(`
2
+ import {createRequire as createRequire$1,isBuiltin}from'node:module';import {join as join$1,resolve,basename,dirname as dirname$1,relative,sep,isAbsolute,extname}from'node:path';import {createRuntimeManager,resolveStableProjectIdentity,loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,getProjectStateDir,getDevFlowStateRoot,getBackupDir,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,getDaemonPidPath,getDaemonRegistryPath,selectHostAdapter,loadPluginsWithDiagnostics,readRuntimeState,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,readPluginInstallState,persistClaudeHookRuntime,getLocalApiKey,runNpmWithClaudeHookRuntime,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {readFileSync as readFileSync$1,mkdirSync,existsSync as existsSync$1,writeFileSync,rmSync,lstatSync,realpathSync,cpSync,renameSync,readdirSync as readdirSync$1,statSync as statSync$1,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import k from'chalk';import sn,{existsSync,readFileSync,readdirSync,mkdirSync as mkdirSync$1,writeFileSync as writeFileSync$1,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Ao,{join,dirname}from'path';import {LogCleanupService}from'@devflow-tools/telemetry';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {fileURLToPath}from'node:url';import {homedir}from'os';import sr from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import {execSync,execFileSync as execFileSync$1}from'child_process';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import {projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';import nu from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {createRequire}from'module';var Gi=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var n in t)Gi(e,n,{get:t[n],enumerable:true});};var Je={};O(Je,{DEFAULT_SERVER_PORT:()=>na,ensureCliRuntime:()=>Lo,getRuntimeManager:()=>je,resolveServerLaunch:()=>Mo,serverStatus:()=>ot,startServer:()=>ln,stopServer:()=>un});function Mo(e=process.cwd()){let t=[()=>ta.resolve("@devflow-tools/server/dist/main.js"),()=>join$1(e,"node_modules","@devflow-tools","server","dist","main.js"),()=>join$1(e,"apps","server","dist","main.js")];for(let n of t)try{return {command:process.env.DEVFLOW_SERVER_NODE??process.execPath,args:[n()],cwd:e}}catch{}throw new Error("DevFlow server entry point is not installed or built")}function je(){return createRuntimeManager()}async function Lo(e){return je().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:Mo(e.projectRoot)})}async function ln(e={}){let t=e.projectRoot??process.cwd(),n=await Lo({reason:"cli-start",projectRoot:t,port:e.port,explicitPort:e.explicitPort});return {pid:n.state.pid,port:n.state.port,state:n.state,reused:n.reused}}async function un(){return (await je().stop()).stopped}async function ot(){let e=await je().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var ta,na,ie=C(()=>{ta=createRequire$1(import.meta.url),na=13337;});var Wo={};O(Wo,{createDefaultDeliveryCommand:()=>ra,createDeliveryCommand:()=>Ho,deliveryCliError:()=>Fo});async function Fo(e){let{DeliveryLineError:t}=await import('@devflow-tools/delivery-line'),n=e instanceof t?e.code:"DELIVERY_INTERNAL_ERROR",o=e instanceof Error?e.message:"Delivery operation failed",r=/token|secret|password|transcript/i.test(o)?"Delivery operation failed":o.slice(0,500);return {ok:false,error:{code:n,message:r}}}function Ho(e,t=async()=>{if(!e)throw new Error("DELIVERY_RUNTIME_REQUIRED");return e},n=process.cwd(),o=t){let r=new Command("delivery").description("Run the complete, auditable development delivery line"),s=(d,g)=>({actor:{id:String(d.actor??"cli-user"),kind:"human",...d.actorRole?{role:String(d.actorRole)}:{}},sessionId:String(d.session??"cli-session"),executionId:String(d.execution??"cli-execution"),idempotencyKey:g}),i=(d,g)=>({...s(d,g),contextReceipt:String(d.contextReceipt)}),a=(d,g)=>({...s(d,g),...d.contextReceipt?{contextReceipt:String(d.contextReceipt)}:{}}),c=d=>d.option("--project <path>","Project root",n),l=d=>c(d).requiredOption("--idempotency-key <key>").requiredOption("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),u=d=>c(d).requiredOption("--idempotency-key <key>").option("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),p=(d,g)=>console.log(g?JSON.stringify(d,null,2):JSON.stringify(d)),m=async(d,g)=>{try{p(await d(),g);}catch(h){p(await Fo(h),g),process.exitCode=1;}},f=(d,g)=>async()=>g(await t(d));u(r.command("create").requiredOption("--input <file>").option("--base-ref <ref>","Base ref","HEAD").option("--target-ref <ref>","Protected target ref","main").option("--worktree-mode <mode>","clean, isolated, external, or auto","auto").option("--title <title>")).action(async d=>{await m(async()=>{let g=await o(d.project),h=readFileSync$1(d.input,"utf8");return g.createCase({...a(d,d.idempotencyKey),projectRoot:d.project,baseRef:d.baseRef,targetRef:d.targetRef,worktreeMode:d.worktreeMode,title:d.title??h.trim()})},d.json);}),c(r.command("status").argument("<caseId>")).option("--json").action(async(d,g)=>{await m(f(g.project,h=>h.status(d)),g.json);}),c(r.command("cleanup").option("--stale-only","Only stop the currently owned stale runtime lease")).option("--json").action(async d=>{await m(async()=>{let{getRuntimeManager:g}=await Promise.resolve().then(()=>(ie(),Je)),h=g(),y=await h.status();if(!y)return {ok:true,project:d.project,stopped:false,reason:"runtime_not_found"};if(d.staleOnly&&y.status==="ready")return {ok:true,project:d.project,stopped:false,reason:"runtime_is_ready"};let v=await h.stop();return {ok:true,project:d.project,stopped:v.stopped,runtimeStatus:v.state?.status??"stopped"}},d.json);}),l(r.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(d,g)=>{await m(f(g.project,h=>h.answer(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),value:g.value})),g.json);}),l(r.command("revise").argument("<caseId>").requiredOption("--phase <phase>").requiredOption("--input <file>")).action(async(d,g)=>{await m(f(g.project,h=>h.revise(d,{...i(g,g.idempotencyKey),phase:g.phase,content:readFileSync$1(g.input,"utf8")})),g.json);}),l(r.command("compare").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--decision <option>")).action(async(d,g)=>{await m(f(g.project,h=>h.compareOptions(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),option:g.decision})),g.json);});for(let[d,g]of [["approve","approve"],["reject","reject"]]){let h=r.command(d).argument("<caseId>").requiredOption("--turn <n>").requiredOption("--stage <stage>").requiredOption("--reason <reason>").option("--artifact-hash <hash>");d==="approve"&&h.option("--plan-file <path>","Executable plan JSON required for plan approval"),l(h).action(async(y,v)=>{await m(f(v.project,R=>R[g](y,{...i(v,v.idempotencyKey),turn:Number(v.turn),stage:v.stage,...v.artifactHash?{artifactHash:v.artifactHash}:{},...v.planFile?{plan:JSON.parse(readFileSync$1(v.planFile,"utf8"))}:{},reason:v.reason})),v.json);});}return l(r.command("resume").argument("<caseId>").option("--continue","Resume the same recoverable case")).action(async(d,g)=>{await m(f(g.project,h=>h.resume(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("recover-task").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.recoverTask(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("admit-worktree").argument("<caseId>").requiredOption("--mode <mode>").requiredOption("--admission-token <token>")).action(async(d,g)=>{await m(f(g.project,h=>h.admitWorktree(d,{...i(g,g.idempotencyKey),mode:g.mode,admissionToken:g.admissionToken})),g.json);}),l(r.command("refresh-activation").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.refreshActivation(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("cancel").argument("<caseId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.cancel(d,{...i(g,g.idempotencyKey),reason:g.reason})),g.json);}),l(r.command("rebind-session").argument("<caseId>").requiredOption("--previous-session <sessionId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.rebindSession(d,{...i(g,g.idempotencyKey),previousSessionId:g.previousSession,reason:g.reason})),g.json);}),l(r.command("retry-task").argument("<caseId>").requiredOption("--task-id <taskId>")).action(async(d,g)=>{await m(f(g.project,h=>h.retryTask(d,{...i(g,g.idempotencyKey),taskId:g.taskId})),g.json);}),l(r.command("import-external").argument("<caseId>").requiredOption("--task-id <taskId>").requiredOption("--candidate <revision>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.importExternalChange(d,{...i(g,g.idempotencyKey),taskId:g.taskId,candidateRevision:g.candidate,reason:g.reason})),g.json);}),l(r.command("export").argument("<caseId>").requiredOption("--path <path>")).action(async(d,g)=>{await m(f(g.project,h=>h.export(d,{...i(g,g.idempotencyKey),path:g.path})),g.json);}),r}function ra(e=process.cwd(),t){let n=async(o,r)=>{let i=await(t??(await import('@devflow-tools/mcp-server/retrieval')).createDeliveryProjectRuntime)({projectRoot:o,retrieval:r});return !("close"in i)||!i.close?i.facade:new Proxy(i.facade,{get(a,c,l){let u=Reflect.get(a,c,l);return typeof u!="function"?u:async(...p)=>{try{return await u.apply(a,p)}finally{await i.close?.();}}}})};return Ho(void 0,o=>n(o,false),e,o=>n(o,true))}var Uo=C(()=>{});var pn={};O(pn,{disableDevFlow:()=>la,enableDevFlow:()=>ua,readKillSwitchState:()=>da});function mn(e){return join$1(e.stateDir??getDevFlowStateRoot({}),"disable")}function la(e){let t=mn(e);mkdirSync(join$1(t,".."),{recursive:true});let n=existsSync$1(t);return n||writeFileSync(t,"",{mode:420}),{marker:t,alreadyDisabled:n}}function ua(e){let t=mn(e),n=existsSync$1(t);return n&&rmSync(t,{force:true}),{marker:t,wasDisabled:n}}function da(e){let t=mn(e);return e.env?.DEVFLOW_DISABLED==="1"?{disabled:true,source:"env",marker:t}:existsSync$1(t)?{disabled:true,source:"marker",marker:t}:{disabled:false,source:"off",marker:t}}var fn=C(()=>{});var Jo={};O(Jo,{aggregateShadowDenials:()=>vn,createHooksCommand:()=>ka,renderShadowStats:()=>kn});function Ot(){return process.cwd()}function jt(e){return join(e,".devflow","config.json")}function yn(e){try{return JSON.parse(readFileSync(jt(e),"utf8"))}catch{return {}}}function Bo(e,t){mkdirSync$1(join(e,".devflow"),{recursive:true}),writeFileSync$1(jt(e),`${JSON.stringify(t,null,2)}
3
+ `);}function wa(e){let t=e.trim().replace(/_/g,"-").toLowerCase();return wn.includes(t)?t:void 0}function va(e){if(process.env.DEVFLOW_DISABLED==="1")return true;try{return existsSync(join(getDevFlowStateRoot(),"disable"))}catch{return false}}function vn(e,t=14){let n=join(e,".devflow","logs","sessions"),o=Date.now()-t*24*60*60*1e3,r=new Map,s=0,i=[];try{i=readdirSync(n).filter(a=>a.endsWith(".jsonl"));}catch{return {windowDays:t,total:0,byCode:[]}}for(let a of i){let c;try{c=readFileSync(join(n,a),"utf8");}catch{continue}for(let l of c.split(`
4
4
  `)){if(!l.includes("hook.enforcement.shadow"))continue;let u;try{u=JSON.parse(l);}catch{continue}if(u.message!=="hook.enforcement.shadow")continue;let p=u.data??{},m=typeof p.timestamp=="number"?p.timestamp:0;if(m<o)continue;let f=typeof p.code=="string"&&p.code.trim()?p.code.trim():"DEVFLOW_POLICY",d=typeof p.tool=="string"&&p.tool.trim()?p.tool.trim():"unknown",g=typeof p.reason=="string"?p.reason:void 0,h=r.get(f)??{code:f,count:0,tools:{},lastSeenAt:0};h.count+=1,h.tools[d]=(h.tools[d]??0)+1,m>=h.lastSeenAt&&(h.lastSeenAt=m,g&&(h.sampleReason=g)),r.set(f,h),s+=1;}}return {windowDays:t,total:s,byCode:[...r.values()].sort((a,c)=>c.count-a.count)}}function kn(e){return e.total===0?`\u5F71\u5B50\u6267\u6CD5\uFF1A\u8FD1 ${e.windowDays} \u5929\u65E0 hook.enforcement.shadow \u4E8B\u4EF6\u3002\u5F00\u542F\u65B9\u5F0F\uFF1Adevflow hooks profile advise`:[`\u5F71\u5B50\u6267\u6CD5\u7EDF\u8BA1\uFF08\u8FD1 ${e.windowDays} \u5929\uFF0C\u5171 ${e.total} \u6B21\u201C\u672C\u5E94\u62D2\u7EDD\u201D\uFF09\uFF1A`,...e.byCode.map(n=>{let o=Object.entries(n.tools).sort((s,i)=>i[1]-s[1]).map(([s,i])=>`${s}\xD7${i}`).join(", "),r=n.sampleReason?`
5
5
  \u6837\u672C\uFF1A${n.sampleReason.slice(0,160)}`:"";return ` ${n.code}: ${n.count} \u6B21\uFF08${o}\uFF09${r}`}),"","\u6BD5\u4E1A\u8BC4\u5BA1\uFF1A\u9010\u6761\u6838\u5BF9\u6837\u672C reason \u662F\u5426\u4E3A\u771F\u5B9E\u8FDD\u89C4\uFF08\u4EBA\u5DE5\u6807\u6CE8\u8BEF\u4F24\uFF09\u3002\u67D0 code \u8BEF\u4F24\u5360\u6BD4\u8DB3\u591F\u4F4E\u65F6\uFF0C","\u65B9\u53EF\u8003\u8651\u5728 enforce \u6863\u4F4D\u542F\u7528\u8BE5\u7B56\u7565\u2014\u2014\u6570\u636E\u4E0D\u81EA\u52A8\u5BA3\u5E03\u6BD5\u4E1A\u3002"].join(`
6
- `)}function ya(){let e=new Command("hooks").description("Inspect and control DevFlow hook runtime");e.command("status").description("Show profile, disabled handlers, kill switch, and shadow summary").action(()=>{let t=Ot(),n=yn(t),o=process.env.DEVFLOW_HOOK_PROFILE,r=o??n.hooks?.profile??"standard",s=o?"env":n.hooks?.profile?"project config":"default",i=n.hooks?.disabledHandlers??[];console.log(`profile: ${k.cyan(r)}\uFF08${s}\uFF09`),console.log(`kill switch: ${ha()?k.red("\u5DF2\u7981\u7528\uFF08hooks \u5168\u90E8\u7A7A\u9000\u51FA\uFF09"):k.green("\u672A\u89E6\u53D1")}`),console.log(i.length>0?`\u5DF2\u7981\u7528 handlers: ${i.join(", ")}`:"\u5DF2\u7981\u7528 handlers: \u65E0"),console.log(kn(vn(t)));}),e.command("profile <name>").description(`Set the project hook profile (${hn.join(" | ")})`).action(t=>{if(!hn.includes(t)){console.error(`\u672A\u77E5 profile\uFF1A${t}\uFF08\u53EF\u9009\uFF1A${hn.join(" | ")}\uFF09`),process.exitCode=1;return}let n=Ot(),o=yn(n);o.hooks={...o.hooks,profile:t},Bo(n,o),console.log(`\u5DF2\u5199\u5165 ${xt(n)} \u2192 hooks.profile = ${k.cyan(t)}`),t==="advise"&&console.log("\u5F71\u5B50\u6267\u6CD5\u5DF2\u542F\u7528\uFF1A\u7B56\u7565\u62D2\u7EDD\u5C06\u8BB0\u5F55\u5E76\u653E\u884C\u3002\u7528 devflow hooks shadow \u67E5\u770B\u6BD5\u4E1A\u6570\u636E\u3002");});for(let[t,n]of [["enable",true],["disable",false]])e.command(`${t} <handler>`).description(`${n?"Enable":"Disable"} a hook handler (${wn.join(" | ")})`).action(o=>{let r=fa(o);if(!r){console.error(`\u672A\u77E5 handler\uFF1A${o}\uFF08\u53EF\u9009\uFF1A${wn.join(" | ")}\uFF09`),process.exitCode=1;return}let s=Ot(),i=yn(s),a=new Set(i.hooks?.disabledHandlers??[]);n?a.delete(r):a.add(r),i.hooks={...i.hooks,disabledHandlers:[...a].sort()},Bo(s,i),console.log(`${r} \u5DF2${n?"\u542F\u7528":"\u7981\u7528"}\uFF08${xt(s)}\uFF09`);});return e.command("shadow").description("Aggregate shadow-enforcement events for graduation review").option("--days <n>","Lookback window in days","14").option("--json","Print JSON instead of text").action(t=>{let n=vn(Ot(),Math.max(1,Number(t.days)||14));console.log(t.json?JSON.stringify(n):kn(n));}),e}var hn,wn,Vo=C(()=>{hn=["minimal","standard","strict","advise"],wn=["session-start","user-prompt-submit","pre-tool-use","post-tool-use","post-tool-use-failure","stop","session-end","pre-compact","memory-snapshot"];});var Yo={};O(Yo,{renderLogCleanupResult:()=>ka,runLogsCleanupCommand:()=>va});function zo(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function va(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:zo(e.olderThanDays,"older-than"),maxBytes:zo(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function Go(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ka(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${Go(e.deletedBytes)}`,` Remaining: ${Go(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
7
- `)}var Zo=C(()=>{});function It(){let e=dirname$1(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 $e(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 xa)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!me(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Qo(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,_n);try{for(let c of readdirSync$1(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:Qo(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 at(e,t){let n=ja(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync$1(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=tr(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=Sn(c.content),p=readFileSync$1(l,"utf-8"),m=Sn(p);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:m,isKnownDevFlowArtifact:u===m});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function er(e,t,n,o=Date.now,r={}){let s=at(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()||Sn(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync(dirname$1(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname$1(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(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
8
- `,"utf-8"),a}function ja(e){let t=new Map,n;try{n=readdirSync$1(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=tr(r);s&&t.set(s.name,r);}return t}function tr(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 Sn(e){return createHash("sha256").update(e).digest("hex")}function Qo(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 nr(e,t){let n={};if(existsSync$1(e))try{n=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync(dirname$1(e),{recursive:true});let o=me(n.enabledPlugins)?n.enabledPlugins:{};if(o[jt]=true,n.enabledPlugins=o,t){let r=me(n.extraKnownMarketplaces)?n.extraKnownMarketplaces:{};r[st]={source:{source:"directory",path:t}},n.extraKnownMarketplaces=r;}writeFileSync(e,`${JSON.stringify(n,null,2)}
9
- `);}async function Tt(e,t,n){if(existsSync$1(join$1(e,"dist","skills")))throw new Error("Claude plugin dist/skills must not exist; rebuild the plugin bundle");let o=join$1(t,st,_n,n);rmSync(o,{recursive:true,force:true}),mkdirSync(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Nt(r,join$1(o,"hooks"));for(let c of ["package.json",".mcp.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(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)&&Nt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Nt(a,join$1(o,"skills")),await Ta(o,e),La(o),writeFileSync(join$1(dirname$1(o),"active.json"),`${JSON.stringify({plugin:st,buildId:n,installPath:o,activatedAt:new Date().toISOString()},null,2)}
10
- `),Na(t,o),Aa(t,o,n);}function Na(e,t){let n=join$1(e,".."),o=dirname$1(t),r=join$1(o,".claude-plugin");mkdirSync(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");if(s===".."||s.startsWith("../"))throw new Error(`Claude local marketplace source escapes its root: ${s}`);s.startsWith(".")||(s=`./${s}`),writeFileSync(join$1(r,"marketplace.json"),`${JSON.stringify({name:st,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:_n,source:s}]},null,2)}
6
+ `)}function ka(){let e=new Command("hooks").description("Inspect and control DevFlow hook runtime");e.command("status").description("Show profile, disabled handlers, kill switch, and shadow summary").action(()=>{let t=Ot(),n=yn(t),o=process.env.DEVFLOW_HOOK_PROFILE,r=o??n.hooks?.profile??"standard",s=o?"env":n.hooks?.profile?"project config":"default",i=n.hooks?.disabledHandlers??[];console.log(`profile: ${k.cyan(r)}\uFF08${s}\uFF09`),console.log(`kill switch: ${va()?k.red("\u5DF2\u7981\u7528\uFF08hooks \u5168\u90E8\u7A7A\u9000\u51FA\uFF09"):k.green("\u672A\u89E6\u53D1")}`),console.log(i.length>0?`\u5DF2\u7981\u7528 handlers: ${i.join(", ")}`:"\u5DF2\u7981\u7528 handlers: \u65E0"),console.log(kn(vn(t)));}),e.command("profile <name>").description(`Set the project hook profile (${hn.join(" | ")})`).action(t=>{if(!hn.includes(t)){console.error(`\u672A\u77E5 profile\uFF1A${t}\uFF08\u53EF\u9009\uFF1A${hn.join(" | ")}\uFF09`),process.exitCode=1;return}let n=Ot(),o=yn(n);o.hooks={...o.hooks,profile:t},Bo(n,o),console.log(`\u5DF2\u5199\u5165 ${jt(n)} \u2192 hooks.profile = ${k.cyan(t)}`),t==="advise"&&console.log("\u5F71\u5B50\u6267\u6CD5\u5DF2\u542F\u7528\uFF1A\u7B56\u7565\u62D2\u7EDD\u5C06\u8BB0\u5F55\u5E76\u653E\u884C\u3002\u7528 devflow hooks shadow \u67E5\u770B\u6BD5\u4E1A\u6570\u636E\u3002");});for(let[t,n]of [["enable",true],["disable",false]])e.command(`${t} <handler>`).description(`${n?"Enable":"Disable"} a hook handler (${wn.join(" | ")})`).action(o=>{let r=wa(o);if(!r){console.error(`\u672A\u77E5 handler\uFF1A${o}\uFF08\u53EF\u9009\uFF1A${wn.join(" | ")}\uFF09`),process.exitCode=1;return}let s=Ot(),i=yn(s),a=new Set(i.hooks?.disabledHandlers??[]);n?a.delete(r):a.add(r),i.hooks={...i.hooks,disabledHandlers:[...a].sort()},Bo(s,i),console.log(`${r} \u5DF2${n?"\u542F\u7528":"\u7981\u7528"}\uFF08${jt(s)}\uFF09`);});return e.command("shadow").description("Aggregate shadow-enforcement events for graduation review").option("--days <n>","Lookback window in days","14").option("--json","Print JSON instead of text").action(t=>{let n=vn(Ot(),Math.max(1,Number(t.days)||14));console.log(t.json?JSON.stringify(n):kn(n));}),e}var hn,wn,Vo=C(()=>{hn=["minimal","standard","strict","advise"],wn=["session-start","user-prompt-submit","pre-tool-use","post-tool-use","post-tool-use-failure","stop","session-end","pre-compact","memory-snapshot"];});var Yo={};O(Yo,{renderLogCleanupResult:()=>_a,runLogsCleanupCommand:()=>Sa});function zo(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function Sa(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:zo(e.olderThanDays,"older-than"),maxBytes:zo(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function Go(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function _a(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${Go(e.deletedBytes)}`,` Remaining: ${Go(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
7
+ `)}var Zo=C(()=>{});function It(){let e=dirname$1(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 $e(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 Aa)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!me(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Qo(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,_n);try{for(let c of readdirSync$1(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:Qo(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 at(e,t){let n=$a(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync$1(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=tr(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=Sn(c.content),p=readFileSync$1(l,"utf-8"),m=Sn(p);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:m,isKnownDevFlowArtifact:u===m});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function er(e,t,n,o=Date.now,r={}){let s=at(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()||Sn(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync(dirname$1(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname$1(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(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
8
+ `,"utf-8"),a}function $a(e){let t=new Map,n;try{n=readdirSync$1(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=tr(r);s&&t.set(s.name,r);}return t}function tr(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 Sn(e){return createHash("sha256").update(e).digest("hex")}function Qo(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 nr(e,t){let n={};if(existsSync$1(e))try{n=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync(dirname$1(e),{recursive:true});let o=me(n.enabledPlugins)?n.enabledPlugins:{};if(o[xt]=true,n.enabledPlugins=o,t){let r=me(n.extraKnownMarketplaces)?n.extraKnownMarketplaces:{};r[st]={source:{source:"directory",path:t}},n.extraKnownMarketplaces=r;}writeFileSync(e,`${JSON.stringify(n,null,2)}
9
+ `);}async function Tt(e,t,n){if(existsSync$1(join$1(e,"dist","skills")))throw new Error("Claude plugin dist/skills must not exist; rebuild the plugin bundle");let o=join$1(t,st,_n,n);rmSync(o,{recursive:true,force:true}),mkdirSync(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Nt(r,join$1(o,"hooks"));for(let c of ["package.json",".mcp.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(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)&&Nt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Nt(a,join$1(o,"skills")),await Fa(o,e),Wa(o),writeFileSync(join$1(dirname$1(o),"active.json"),`${JSON.stringify({plugin:st,buildId:n,installPath:o,activatedAt:new Date().toISOString()},null,2)}
10
+ `),Ia(t,o),Ta(t,o,n);}function Ia(e,t){let n=join$1(e,".."),o=dirname$1(t),r=join$1(o,".claude-plugin");mkdirSync(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");if(s===".."||s.startsWith("../"))throw new Error(`Claude local marketplace source escapes its root: ${s}`);s.startsWith(".")||(s=`./${s}`),writeFileSync(join$1(r,"marketplace.json"),`${JSON.stringify({name:st,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:_n,source:s}]},null,2)}
11
11
  `);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(!me(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[st]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync(i,`${JSON.stringify(a,null,2)}
12
- `);}function Aa(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(!me(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync(dirname$1(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!me(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[jt];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${jt}`);let c=a??[],l=c.find(f=>me(f)&&f.scope==="user"),u=new Date().toISOString(),p=me(l)&&typeof l.installedAt=="string"?l.installedAt:u,m=c.filter(f=>!me(f)||f.scope!=="user");i[jt]=[...m,{scope:"user",installPath:t,version:n,installedAt:p,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync(o,`${JSON.stringify(r,null,2)}
13
- `);}function me(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function Ia(e,t,n,o={}){let r=o.runner??runNpmWithClaudeHookRuntime,s=Math.max(1,o.attempts??3),i=Math.max(0,o.delayMs??3e4),a;for(let l=1;l<=s;l+=1)try{await r(e,t,{...n,stdio:"pipe"});return}catch(u){a=u;let p=`${u?.message??""} ${u?.stderr??""}`;if(!$a.test(p))throw u;if(l===s)break;await new Promise(m=>setTimeout(m,i));}let c=a;throw c?.stderr&&process.stderr.write(String(c.stderr)),a}async function Ta(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();await Ia(l,c,{cwd:e,env:s,timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Nt(e,t){mkdirSync(t,{recursive:true});for(let n of readdirSync$1(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?Nt(o,r):cpSync(o,r,{force:true});}}function La(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let o of readdirSync$1(t)){if(o===n||o.startsWith("."))continue;let r=join$1(t,o),s=false;try{s=statSync$1(r).isDirectory();}catch{continue}if(!s)continue;let i=join$1(r,".orphaned_at"),a=Number.NaN;if(existsSync$1(i)&&(a=Number.parseInt(readFileSync$1(i,"utf-8").trim(),10)),!Number.isFinite(a)){writeFileSync(i,`${Date.now()}
14
- `);continue}Date.now()-a>Ma&&rmSync(r,{recursive:true,force:true});}}var jt,st,_n,xa,$a,Ma,Ve=C(()=>{jt="devflow@devflow-local",st="devflow-local",_n="devflow",xa=["devflow@devflow-local","devflow@devflow"];$a=/ETARGET|E404|notarget/i;Ma=1440*60*1e3;});var ur={};O(ur,{initProject:()=>Ka,renderInitReport:()=>lr});async function Ka(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync$1(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json"),s=existsSync(r),i=s?Ja(r):{},a=Va(e,i);(!s||t.force||!cr(i))&&(writeFileSync$1(r,JSON.stringify({...i,version:"0.1.0",initialized:new Date().toISOString(),...a},null,2),"utf-8"),o.push(".devflow/config.json"));let c={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(ir.isInitialized(e)||await ir.init(e,{index:t.scan!==false}),t.scan!==false){let u;try{u=await createEngines(e);let{indexer:p,graph:m}=u,{files:f,symbols:d,imports:g}=await p.indexAll(e),h=await m.build(d,g);c.indexed={files:f.length,symbols:d.length,graphNodes:h.nodes.length};}catch{c.indexed={files:0,symbols:0,graphNodes:0};}finally{typeof u?.close=="function"&&u.close();}}if(t.scan!==false)try{let u=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let p=join(n,"init-report.md");writeFileSync$1(p,lr(u),"utf-8"),o.push(".devflow/init-report.md"),c.onboardingPack=u;}catch(u){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${u.message}`);}let l;if(t.plugins!==false)try{let u=It(),p=homedir(),m=join(p,".claude","plugins","cache"),f=join(u,"package.json"),d=existsSync(f)?JSON.parse(readFileSync(f,"utf-8")).version:"0.0.0";Tt(u,m,d),c.pluginDeployed=!0;let g=join(m,"devflow-local","devflow",d);l=g;try{c.migratedLegacySkills=er(p,g,d,Date.now,{includeModified:t.migrateLegacySkills}).map(h=>h.skillName);}catch(h){console.warn(`Warning: Legacy skill migration skipped \u2014 ${h.message}`);}}catch(u){console.warn(`Warning: Plugin deployment skipped \u2014 ${u.message}`);}if(t.plugins!==false)try{let u=homedir(),p=join(u,".claude","settings.json");nr(p,l?dirname(l):void 0),c.pluginEnabled=!0;}catch(u){console.warn(`Warning: Plugin enablement skipped \u2014 ${u.message}`);}return c.mcpConfigured=!!(l&&existsSync(join(l,".mcp.json"))),c}function Ja(e){try{let t=JSON.parse(readFileSync(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return {}}}function cr(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function Va(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(cr(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function lr(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(`
15
- `)}var ir,dr=C(()=>{Ve();ir=sr.default??sr;});var gr={};O(gr,{reviewPluginMemoryHints:()=>Za});async function Za(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Qa).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 p=s.get(u);for(let m of p?.memory?.project?.conventions??[])i.push({id:`${u}:${m.key}`,pluginName:u,convention:m});}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??Xa)(e,l),{available:i.length,selected:l.length}}function Qa(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Xa(e,t){let n=new MemoryGate(e);try{for(let o of t)await n.addMemory({category:"project_knowledge",content:`${o.convention.key}: ${o.convention.value}`,originalText:o.convention.value,source:"manual",confidence:o.convention.confidence,scope:`plugin:${o.pluginName}`},{actorId:"actor:devflow-cli",sessionId:"session:plugin-memory-hints"});}finally{n.close();}}var mr=C(()=>{});function Ie(){let e=[join(process.cwd(),"plugin-registry.json"),join(sc,"../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 pr(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var rc,sc,Lt=C(()=>{rc=fileURLToPath$1(import.meta.url),sc=dirname(rc);});async function $(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??pc();if(!r)return n();let s=hc(r),i=false,a=fr.get(r);if(a&&Date.now()-a.ts<mc?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await fc(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),fr.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(k.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function pc(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function fc(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function hc(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var fr,mc,Se=C(()=>{fr=new Map,mc=3e4;});var yr=C(()=>{});var lt={};O(lt,{installSkill:()=>Te,listSkills:()=>_r,listSkillsSync:()=>Sc,searchSkills:()=>_c,uninstallSkill:()=>Cn});async function _r(e){return $(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function Sc(){return []}async function _c(e,t){let n=await _r(),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 Rr(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 Er(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Dr(e,t){let n=join(e,".devflow","config.json");mkdirSync$1(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(o,`${JSON.stringify(t,null,2)}
16
- `,"utf-8"),renameSync$1(o,n);}async function Te(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=Rr(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync$1(ct,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",ct,o],{stdio:"pipe",timeout:6e4});let a=Er(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Dr(t,a));let c=[],l="0.0.0",u=join(ct,"node_modules",...o.split("/"));try{let p=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=p?.devflow?.templates??[],l=typeof p.version=="string"?p.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 p=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(p){let m={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&p.onUpdate?await p.onUpdate(m,i.version):!i&&p.onInstall&&await p.onInstall(m);}}catch(p){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:p.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${p.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Cn(e,t=process.cwd(),n){return $(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Rr(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Er(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Dr(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",ct,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(ct,"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 ct,_e=C(()=>{Se();yr();ct=getPluginInstallRoot();});var On={};O(On,{detectTechStack:()=>Ec,guidePluginInstallation:()=>Pc,installPluginsFromList:()=>Dc,resolvePluginName:()=>Cr});function Ec(e){let t=Ie();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Cr(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Dc(e){let t=e.split(",").map(Cr).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Te(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Pc(e){let t=Ie();if(t.plugins.length===0)return console.log(`
12
+ `);}function Ta(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(!me(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync(dirname$1(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!me(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[xt];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${xt}`);let c=a??[],l=c.find(f=>me(f)&&f.scope==="user"),u=new Date().toISOString(),p=me(l)&&typeof l.installedAt=="string"?l.installedAt:u,m=c.filter(f=>!me(f)||f.scope!=="user");i[xt]=[...m,{scope:"user",installPath:t,version:n,installedAt:p,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync(o,`${JSON.stringify(r,null,2)}
13
+ `);}function me(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}async function La(e,t,n,o={}){let r=o.runner??runNpmWithClaudeHookRuntime,s=Math.max(1,o.attempts??5),i=Math.max(0,o.delayMs??3e4),a;for(let l=1;l<=s;l+=1)try{await r(e,l===1?t:[...t,"--prefer-online"],{...n,stdio:"pipe"});return}catch(u){a=u;let p=`${u?.message??""} ${u?.stderr??""}`;if(!Ma.test(p))throw u;if(l===s)break;await new Promise(m=>setTimeout(m,i));}let c=a;throw c?.stderr&&process.stderr.write(String(c.stderr)),a}async function Fa(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();await La(l,c,{cwd:e,env:s,timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Nt(e,t){mkdirSync(t,{recursive:true});for(let n of readdirSync$1(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?Nt(o,r):cpSync(o,r,{force:true});}}function Wa(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let o of readdirSync$1(t)){if(o===n||o.startsWith("."))continue;let r=join$1(t,o),s=false;try{s=statSync$1(r).isDirectory();}catch{continue}if(!s)continue;let i=join$1(r,".orphaned_at"),a=Number.NaN;if(existsSync$1(i)&&(a=Number.parseInt(readFileSync$1(i,"utf-8").trim(),10)),!Number.isFinite(a)){writeFileSync(i,`${Date.now()}
14
+ `);continue}Date.now()-a>Ha&&rmSync(r,{recursive:true,force:true});}}var xt,st,_n,Aa,Ma,Ha,Ve=C(()=>{xt="devflow@devflow-local",st="devflow-local",_n="devflow",Aa=["devflow@devflow-local","devflow@devflow"];Ma=/ETARGET|E404|notarget/i;Ha=4320*60*1e3;});var ur={};O(ur,{initProject:()=>za,renderInitReport:()=>lr});async function za(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync$1(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json"),s=existsSync(r),i=s?Ga(r):{},a=Ya(e,i);(!s||t.force||!cr(i))&&(writeFileSync$1(r,JSON.stringify({...i,version:"0.1.0",initialized:new Date().toISOString(),...a},null,2),"utf-8"),o.push(".devflow/config.json"));let c={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(ir.isInitialized(e)||await ir.init(e,{index:t.scan!==false}),t.scan!==false){let u;try{u=await createEngines(e);let{indexer:p,graph:m}=u,{files:f,symbols:d,imports:g}=await p.indexAll(e),h=await m.build(d,g);c.indexed={files:f.length,symbols:d.length,graphNodes:h.nodes.length};}catch{c.indexed={files:0,symbols:0,graphNodes:0};}finally{typeof u?.close=="function"&&u.close();}}if(t.scan!==false)try{let u=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let p=join(n,"init-report.md");writeFileSync$1(p,lr(u),"utf-8"),o.push(".devflow/init-report.md"),c.onboardingPack=u;}catch(u){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${u.message}`);}let l;if(t.plugins!==false)try{let u=It(),p=homedir(),m=join(p,".claude","plugins","cache"),f=join(u,"package.json"),d=existsSync(f)?JSON.parse(readFileSync(f,"utf-8")).version:"0.0.0";Tt(u,m,d),c.pluginDeployed=!0;let g=join(m,"devflow-local","devflow",d);l=g;try{c.migratedLegacySkills=er(p,g,d,Date.now,{includeModified:t.migrateLegacySkills}).map(h=>h.skillName);}catch(h){console.warn(`Warning: Legacy skill migration skipped \u2014 ${h.message}`);}}catch(u){console.warn(`Warning: Plugin deployment skipped \u2014 ${u.message}`);}if(t.plugins!==false)try{let u=homedir(),p=join(u,".claude","settings.json");nr(p,l?dirname(l):void 0),c.pluginEnabled=!0;}catch(u){console.warn(`Warning: Plugin enablement skipped \u2014 ${u.message}`);}return c.mcpConfigured=!!(l&&existsSync(join(l,".mcp.json"))),c}function Ga(e){try{let t=JSON.parse(readFileSync(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return {}}}function cr(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function Ya(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(cr(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function lr(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(`
15
+ `)}var ir,dr=C(()=>{Ve();ir=sr.default??sr;});var gr={};O(gr,{reviewPluginMemoryHints:()=>ec});async function ec(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(tc).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 p=s.get(u);for(let m of p?.memory?.project?.conventions??[])i.push({id:`${u}:${m.key}`,pluginName:u,convention:m});}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??nc)(e,l),{available:i.length,selected:l.length}}function tc(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function nc(e,t){let n=new MemoryGate(e);try{for(let o of t)await n.addMemory({category:"project_knowledge",content:`${o.convention.key}: ${o.convention.value}`,originalText:o.convention.value,source:"manual",confidence:o.convention.confidence,scope:`plugin:${o.pluginName}`},{actorId:"actor:devflow-cli",sessionId:"session:plugin-memory-hints"});}finally{n.close();}}var mr=C(()=>{});function Ie(){let e=[join(process.cwd(),"plugin-registry.json"),join(cc,"../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 pr(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var ac,cc,Lt=C(()=>{ac=fileURLToPath$1(import.meta.url),cc=dirname(ac);});async function $(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??yc();if(!r)return n();let s=vc(r),i=false,a=fr.get(r);if(a&&Date.now()-a.ts<hc?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await wc(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),fr.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(k.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function yc(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function wc(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function vc(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var fr,hc,Se=C(()=>{fr=new Map,hc=3e4;});var yr=C(()=>{});var lt={};O(lt,{installSkill:()=>Te,listSkills:()=>_r,listSkillsSync:()=>Ec,searchSkills:()=>Dc,uninstallSkill:()=>Cn});async function _r(e){return $(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function Ec(){return []}async function Dc(e,t){let n=await _r(),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 Rr(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 Er(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Dr(e,t){let n=join(e,".devflow","config.json");mkdirSync$1(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync$1(o,`${JSON.stringify(t,null,2)}
16
+ `,"utf-8"),renameSync$1(o,n);}async function Te(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=Rr(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync$1(ct,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",ct,o],{stdio:"pipe",timeout:6e4});let a=Er(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Dr(t,a));let c=[],l="0.0.0",u=join(ct,"node_modules",...o.split("/"));try{let p=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=p?.devflow?.templates??[],l=typeof p.version=="string"?p.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 p=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(p){let m={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&p.onUpdate?await p.onUpdate(m,i.version):!i&&p.onInstall&&await p.onInstall(m);}}catch(p){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:p.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${p.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Cn(e,t=process.cwd(),n){return $(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Rr(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Er(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Dr(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",ct,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(ct,"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 ct,_e=C(()=>{Se();yr();ct=getPluginInstallRoot();});var On={};O(On,{detectTechStack:()=>Cc,guidePluginInstallation:()=>jc,installPluginsFromList:()=>Oc,resolvePluginName:()=>Cr});function Cc(e){let t=Ie();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Cr(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Oc(e){let t=e.split(",").map(Cr).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Te(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function jc(e){let t=Ie();if(t.plugins.length===0)return console.log(`
17
17
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
18
18
  `),[];console.log(`
19
19
  \u{1F50C} Plugin Installation Guide
@@ -27,19 +27,19 @@ Installing selected plugins...
27
27
  `);}catch{console.error(`\u2717 Failed to install ${a}
28
28
  `);}}else console.log(`
29
29
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
30
- `);return i}var xn=C(()=>{Lt();_e();});var Fr={};O(Fr,{ResetExecutionError:()=>ut,executeResetCommand:()=>Gc,formatResetResult:()=>In,runReset:()=>Lr});function Hc(){if(Ft)return Ft;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ft=e.DatabaseSync,Ft}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function In(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Wc(e){return e==="all"||$r.includes(e)}function ce(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function Nn(e){let t=resolve(e),n=[];for(;!ce(t);){let o=dirname$1(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function Tn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Uc(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 Ir(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=ce(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(ce(t)){let o=realpathSync(t);if(!Tn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function qc(e,t){return (e==="all"?$r:[e]).map(o=>({scope:o,path:join$1(t,...Ar[o])}))}function Tr(e,t){let n=ce(t);if(n)return Ir(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Mr(e,t){let n=Tr(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 Bc(e){let t=ce(e);if(!t?.isFile()||t.size<jn.length)return false;let n=Buffer.alloc(jn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(jn)}finally{closeSync(o);}}function Kc(e){let t=[];function n(o){let r=lstatSync(o);if(!r.isSymbolicLink()){if(r.isDirectory()){for(let s of readdirSync$1(o).sort())n(join$1(o,s));return}Bc(o)&&t.push(o);}}return n(e),t}function Jc(e,t){mkdirSync(dirname$1(t),{recursive:true});let n=new(Hc())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Vc(e,t,n){let o=Kc(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));Jc(s,i);}}function zc(e,t,n,o,r){let s=!!ce(t),i,a=[];try{mkdirSync(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),Vc(c.path,join$1(i,c.scope),()=>Mr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(ce(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&&ce(t))try{rmdirSync(t);}catch{}}}function Lr(e,t={}){if(!Wc(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Uc(e.project??process.cwd()),o=qc(e.scope,n);for(let c of o)Ir(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=Tr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?Nn(e.backupTo):void 0;if(s){let c=ce(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=Nn(l.path),p=join$1(s,l.scope),m=Nn(p);if(Tn(u,m)||Tn(m,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${m}`);if(ce(p))throw new Error(`Backup destination already exists: ${p}`)}}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&&zc(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Mr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new ut(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Gc(e,t={},n=console){try{let o=Lr(e,t),r=In(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof ut)for(let r of In(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ft,ut,Ar,$r,jn,Hr=C(()=>{ut=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Ar={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},$r=Object.keys(Ar),jn=Buffer.from("SQLite format 3\0","binary");});var Vr={};O(Vr,{cleanupProject:()=>dl});function qr(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}function al(e,t){let n=getDaemonPidPath(e,t);if(existsSync$1(n)){let i=Number(readFileSync$1(n,"utf8").trim());if(Number.isSafeInteger(i)&&i>0&&qr(i))throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${i}).`)}let o=getDaemonRegistryPath(t);if(!existsSync$1(o))return;let r=JSON.parse(readFileSync$1(o,"utf8"));if(!Array.isArray(r))throw new Error("Daemon registry is malformed.");let s=r.find(i=>i.rootPath===e&&Number.isSafeInteger(i.pid)&&qr(i.pid));if(s)throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${s.pid}).`)}function cl(e,t){let n=getDaemonRegistryPath(t);if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf8"));writeFileSync(n,`${JSON.stringify(o.filter(r=>r.rootPath!==e),null,2)}
31
- `,{mode:384});}function Jr(e,t){return new Set(e.prepare(`PRAGMA table_info("${t}")`).all().map(n=>n.name))}function ll(e){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'").all().flatMap(({name:n})=>{let o=Jr(e,n);return o.has("project_root")?[{name:n,hasSessionId:o.has("session_id")}]:[]})}function Br(e){return new Set(e.prepare("PRAGMA foreign_key_check").all().map(t=>`${t.table}:${t.rowid}:${t.parent}:${t.fkid}`))}function ul(e,t){let n={},o=ll(e);e.exec("CREATE TEMP TABLE cleanup_session_ids (id TEXT PRIMARY KEY)"),e.prepare("INSERT OR IGNORE INTO cleanup_session_ids SELECT id FROM sessions WHERE project_root = ?").run(t);for(let i of o.filter(a=>a.hasSessionId))e.prepare(`INSERT OR IGNORE INTO cleanup_session_ids SELECT session_id FROM "${i.name}" WHERE project_root = ? AND session_id IS NOT NULL`).run(t);let r=Number(e.prepare("SELECT COUNT(*) count FROM cleanup_session_ids").get().count);for(let i of o)n[i.name]=Number(e.prepare(`DELETE FROM "${i.name}" WHERE project_root = ?`).run(t).changes);let s=["skill_executions","tool_call_events","tool_metrics","accuracy_queries","devflow_sessions"];for(let i of s)Jr(e,i).has("session_id")&&(n[i]=Number(e.prepare(`DELETE FROM "${i}" WHERE session_id IN (SELECT id FROM cleanup_session_ids)`).run().changes));return e.exec("DROP TABLE cleanup_session_ids"),{sessions:r,removedRows:n}}async function dl(e){let t=resolve(e.projectRoot);if(!existsSync$1(t)||!lstatSync(t).isDirectory())throw new Error("Project directory does not exist.");let n=realpathSync(t),o={stateDir:e.stateDir,homeDir:e.homeDir,env:e.env};al(n,o);let r=join$1(n,".devflow"),s=getProjectStateDir(n,o);if(existsSync$1(r)&&!lstatSync(r).isDirectory())throw new Error("Project .devflow must be a regular directory.");if(existsSync$1(s)&&!lstatSync(s).isDirectory())throw new Error("Project runtime state must be a regular directory.");let i=e.globalDatabasePath??join$1(getDevFlowStateRoot(o),"global","devflow.db");if(!existsSync$1(i))throw new Error("Global telemetry database is missing.");let a=e.backupDirectory??join$1(getBackupDir(n,Date.now(),o),`cleanup-${randomUUID()}`);if(existsSync$1(a))throw new Error(`Backup destination already exists: ${a}`);mkdirSync(a,{recursive:true,mode:448});let c=new DatabaseSync(i),l,u;try{c.exec("PRAGMA busy_timeout = 5000"),await il(c,join$1(a,"global.db")),existsSync$1(r)&&cpSync(r,join$1(a,"project.devflow"),{recursive:!0,errorOnExist:!0}),existsSync$1(s)&&cpSync(s,join$1(a,"project-state"),{recursive:!0,errorOnExist:!0}),c.exec("PRAGMA foreign_keys = OFF");let p=Br(c);c.exec("BEGIN IMMEDIATE");let m;try{if(m=ul(c,n),[...Br(c)].filter(d=>!p.has(d)).length>0)throw new Error("Cleanup would leave new broken database references.");existsSync$1(r)&&(l=`${r}.cleanup-${randomUUID()}`,renameSync(r,l)),existsSync$1(s)&&(u=`${s}.cleanup-${randomUUID()}`,renameSync(s,u)),c.exec("COMMIT");}catch(f){throw c.exec("ROLLBACK"),l&&renameSync(l,r),u&&renameSync(u,s),f}return l&&rmSync(l,{recursive:!0,force:!0}),u&&rmSync(u,{recursive:!0,force:!0}),cl(n,o),{projectRoot:n,backupDirectory:a,...m,projectDataRemoved:!!l}}finally{c.close();}}var il,zr=C(()=>{il=createRequire$1(import.meta.url)("node:sqlite").backup;});var os={};O(os,{consolidateDatabases:()=>fl,formatConsolidateResult:()=>hl});function fl(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=[Yr("project",o,s?n:void 0),Yr("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$1(n))==="global"?join$1(dirname$1(dirname$1(n)),"backup"):join$1(dirname$1(n),"backup"),p=join$1(e.backupRoot??u,l);mkdirSync(p,{recursive:true}),a.backupDir=p;let m=c.some(f=>f.kind==="project")?yl(o):null;try{let f=new Map;for(let y of c){let v=join$1(p,`${y.kind}-${basename(y.path)}.snapshot`);Zr(y.path,v),f.set(y.kind,v);}s&&Zr(n,join$1(p,"global-devflow.db.before"));let d=f.has("project")?vl(o,p):[];a.retired.push(...d.map(y=>y.destination));let g=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),g=new DatabaseSync(n),g.exec("PRAGMA busy_timeout = 10000"),g.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&g.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&g.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),g.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&Qr(g,"project_source",void 0,a.inserted),f.has("codegraph")){Qr(g,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of mt(g,"codegraph_source").filter(R=>R.startsWith("devflow_")))g.exec(`DROP TABLE codegraph_source.${H(v)}`);}g.exec("COMMIT"),h=!1;}catch(y){if(h)try{g?.exec("ROLLBACK");}catch{}throw ns(d),y}finally{g?.close();}return a}finally{wl(m);}}function hl(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 Yr(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 mt(r).filter(c=>!i||i.has(c)))o.tables[a]=qn(r,a),o.conflicts[a]=s&&mt(s).includes(a)?kl(r,s,a):0;}finally{r.close(),s?.close();}return o}function Zr(e,t){mkdirSync(dirname$1(t),{recursive:true});let n=new DatabaseSync(e,{readOnly:true,timeout:1e4});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function yl(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 wl(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function vl(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 ns(n),o}return n}function ns(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Qr(e,t,n,o){let r=new Set(mt(e)),s=mt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Ut(e,"main",i),c=new Set(Ut(e,t,i).map(d=>d.name)),l=a.filter(d=>c.has(d.name));if(Un.has(i)&&(l=l.filter(d=>d.pk===0)),l.length===0)continue;let u=qn(e,i),p=l.map(d=>H(d.name)).join(", "),m=l.map(d=>`s.${H(d.name)}`).join(", ");if(l.filter(d=>d.pk>0).length>0&&!Un.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${p}) SELECT ${m} FROM ${H(t)}.${H(i)} s`);else {let d=l.map(g=>`t.${H(g.name)} IS s.${H(g.name)}`).join(" AND ");e.exec(`
30
+ `);return i}var jn=C(()=>{Lt();_e();});var Fr={};O(Fr,{ResetExecutionError:()=>ut,executeResetCommand:()=>Qc,formatResetResult:()=>In,runReset:()=>Lr});function qc(){if(Ft)return Ft;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ft=e.DatabaseSync,Ft}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function In(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Bc(e){return e==="all"||$r.includes(e)}function ce(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function Nn(e){let t=resolve(e),n=[];for(;!ce(t);){let o=dirname$1(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function Tn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Kc(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 Ir(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=ce(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(ce(t)){let o=realpathSync(t);if(!Tn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Jc(e,t){return (e==="all"?$r:[e]).map(o=>({scope:o,path:join$1(t,...Ar[o])}))}function Tr(e,t){let n=ce(t);if(n)return Ir(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Mr(e,t){let n=Tr(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 Vc(e){let t=ce(e);if(!t?.isFile()||t.size<xn.length)return false;let n=Buffer.alloc(xn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(xn)}finally{closeSync(o);}}function zc(e){let t=[];function n(o){let r=lstatSync(o);if(!r.isSymbolicLink()){if(r.isDirectory()){for(let s of readdirSync$1(o).sort())n(join$1(o,s));return}Vc(o)&&t.push(o);}}return n(e),t}function Gc(e,t){mkdirSync(dirname$1(t),{recursive:true});let n=new(qc())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Yc(e,t,n){let o=zc(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));Gc(s,i);}}function Zc(e,t,n,o,r){let s=!!ce(t),i,a=[];try{mkdirSync(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),Yc(c.path,join$1(i,c.scope),()=>Mr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(ce(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&&ce(t))try{rmdirSync(t);}catch{}}}function Lr(e,t={}){if(!Bc(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Kc(e.project??process.cwd()),o=Jc(e.scope,n);for(let c of o)Ir(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=Tr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?Nn(e.backupTo):void 0;if(s){let c=ce(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=Nn(l.path),p=join$1(s,l.scope),m=Nn(p);if(Tn(u,m)||Tn(m,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${m}`);if(ce(p))throw new Error(`Backup destination already exists: ${p}`)}}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&&Zc(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Mr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new ut(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Qc(e,t={},n=console){try{let o=Lr(e,t),r=In(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof ut)for(let r of In(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ft,ut,Ar,$r,xn,Hr=C(()=>{ut=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Ar={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},$r=Object.keys(Ar),xn=Buffer.from("SQLite format 3\0","binary");});var Vr={};O(Vr,{cleanupProject:()=>pl});function qr(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}function ul(e,t){let n=getDaemonPidPath(e,t);if(existsSync$1(n)){let i=Number(readFileSync$1(n,"utf8").trim());if(Number.isSafeInteger(i)&&i>0&&qr(i))throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${i}).`)}let o=getDaemonRegistryPath(t);if(!existsSync$1(o))return;let r=JSON.parse(readFileSync$1(o,"utf8"));if(!Array.isArray(r))throw new Error("Daemon registry is malformed.");let s=r.find(i=>i.rootPath===e&&Number.isSafeInteger(i.pid)&&qr(i.pid));if(s)throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${s.pid}).`)}function dl(e,t){let n=getDaemonRegistryPath(t);if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf8"));writeFileSync(n,`${JSON.stringify(o.filter(r=>r.rootPath!==e),null,2)}
31
+ `,{mode:384});}function Jr(e,t){return new Set(e.prepare(`PRAGMA table_info("${t}")`).all().map(n=>n.name))}function gl(e){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'").all().flatMap(({name:n})=>{let o=Jr(e,n);return o.has("project_root")?[{name:n,hasSessionId:o.has("session_id")}]:[]})}function Br(e){return new Set(e.prepare("PRAGMA foreign_key_check").all().map(t=>`${t.table}:${t.rowid}:${t.parent}:${t.fkid}`))}function ml(e,t){let n={},o=gl(e);e.exec("CREATE TEMP TABLE cleanup_session_ids (id TEXT PRIMARY KEY)"),e.prepare("INSERT OR IGNORE INTO cleanup_session_ids SELECT id FROM sessions WHERE project_root = ?").run(t);for(let i of o.filter(a=>a.hasSessionId))e.prepare(`INSERT OR IGNORE INTO cleanup_session_ids SELECT session_id FROM "${i.name}" WHERE project_root = ? AND session_id IS NOT NULL`).run(t);let r=Number(e.prepare("SELECT COUNT(*) count FROM cleanup_session_ids").get().count);for(let i of o)n[i.name]=Number(e.prepare(`DELETE FROM "${i.name}" WHERE project_root = ?`).run(t).changes);let s=["skill_executions","tool_call_events","tool_metrics","accuracy_queries","devflow_sessions"];for(let i of s)Jr(e,i).has("session_id")&&(n[i]=Number(e.prepare(`DELETE FROM "${i}" WHERE session_id IN (SELECT id FROM cleanup_session_ids)`).run().changes));return e.exec("DROP TABLE cleanup_session_ids"),{sessions:r,removedRows:n}}async function pl(e){let t=resolve(e.projectRoot);if(!existsSync$1(t)||!lstatSync(t).isDirectory())throw new Error("Project directory does not exist.");let n=realpathSync(t),o={stateDir:e.stateDir,homeDir:e.homeDir,env:e.env};ul(n,o);let r=join$1(n,".devflow"),s=getProjectStateDir(n,o);if(existsSync$1(r)&&!lstatSync(r).isDirectory())throw new Error("Project .devflow must be a regular directory.");if(existsSync$1(s)&&!lstatSync(s).isDirectory())throw new Error("Project runtime state must be a regular directory.");let i=e.globalDatabasePath??join$1(getDevFlowStateRoot(o),"global","devflow.db");if(!existsSync$1(i))throw new Error("Global telemetry database is missing.");let a=e.backupDirectory??join$1(getBackupDir(n,Date.now(),o),`cleanup-${randomUUID()}`);if(existsSync$1(a))throw new Error(`Backup destination already exists: ${a}`);mkdirSync(a,{recursive:true,mode:448});let c=new DatabaseSync(i),l,u;try{c.exec("PRAGMA busy_timeout = 5000"),await ll(c,join$1(a,"global.db")),existsSync$1(r)&&cpSync(r,join$1(a,"project.devflow"),{recursive:!0,errorOnExist:!0}),existsSync$1(s)&&cpSync(s,join$1(a,"project-state"),{recursive:!0,errorOnExist:!0}),c.exec("PRAGMA foreign_keys = OFF");let p=Br(c);c.exec("BEGIN IMMEDIATE");let m;try{if(m=ml(c,n),[...Br(c)].filter(d=>!p.has(d)).length>0)throw new Error("Cleanup would leave new broken database references.");existsSync$1(r)&&(l=`${r}.cleanup-${randomUUID()}`,renameSync(r,l)),existsSync$1(s)&&(u=`${s}.cleanup-${randomUUID()}`,renameSync(s,u)),c.exec("COMMIT");}catch(f){throw c.exec("ROLLBACK"),l&&renameSync(l,r),u&&renameSync(u,s),f}return l&&rmSync(l,{recursive:!0,force:!0}),u&&rmSync(u,{recursive:!0,force:!0}),dl(n,o),{projectRoot:n,backupDirectory:a,...m,projectDataRemoved:!!l}}finally{c.close();}}var ll,zr=C(()=>{ll=createRequire$1(import.meta.url)("node:sqlite").backup;});var os={};O(os,{consolidateDatabases:()=>wl,formatConsolidateResult:()=>vl});function wl(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=[Yr("project",o,s?n:void 0),Yr("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$1(n))==="global"?join$1(dirname$1(dirname$1(n)),"backup"):join$1(dirname$1(n),"backup"),p=join$1(e.backupRoot??u,l);mkdirSync(p,{recursive:true}),a.backupDir=p;let m=c.some(f=>f.kind==="project")?kl(o):null;try{let f=new Map;for(let y of c){let v=join$1(p,`${y.kind}-${basename(y.path)}.snapshot`);Zr(y.path,v),f.set(y.kind,v);}s&&Zr(n,join$1(p,"global-devflow.db.before"));let d=f.has("project")?Sl(o,p):[];a.retired.push(...d.map(y=>y.destination));let g=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),g=new DatabaseSync(n),g.exec("PRAGMA busy_timeout = 10000"),g.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&g.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&g.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),g.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&Qr(g,"project_source",void 0,a.inserted),f.has("codegraph")){Qr(g,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of mt(g,"codegraph_source").filter(R=>R.startsWith("devflow_")))g.exec(`DROP TABLE codegraph_source.${H(v)}`);}g.exec("COMMIT"),h=!1;}catch(y){if(h)try{g?.exec("ROLLBACK");}catch{}throw ns(d),y}finally{g?.close();}return a}finally{bl(m);}}function vl(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 Yr(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 mt(r).filter(c=>!i||i.has(c)))o.tables[a]=qn(r,a),o.conflicts[a]=s&&mt(s).includes(a)?_l(r,s,a):0;}finally{r.close(),s?.close();}return o}function Zr(e,t){mkdirSync(dirname$1(t),{recursive:true});let n=new DatabaseSync(e,{readOnly:true,timeout:1e4});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function kl(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 bl(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Sl(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 ns(n),o}return n}function ns(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Qr(e,t,n,o){let r=new Set(mt(e)),s=mt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Ut(e,"main",i),c=new Set(Ut(e,t,i).map(d=>d.name)),l=a.filter(d=>c.has(d.name));if(Un.has(i)&&(l=l.filter(d=>d.pk===0)),l.length===0)continue;let u=qn(e,i),p=l.map(d=>H(d.name)).join(", "),m=l.map(d=>`s.${H(d.name)}`).join(", ");if(l.filter(d=>d.pk>0).length>0&&!Un.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${p}) SELECT ${m} FROM ${H(t)}.${H(i)} s`);else {let d=l.map(g=>`t.${H(g.name)} IS s.${H(g.name)}`).join(" AND ");e.exec(`
32
32
  INSERT INTO main.${H(i)} (${p})
33
33
  SELECT ${m} FROM ${H(t)}.${H(i)} s
34
34
  WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${d})
35
- `);}o[i]=(o[i]??0)+(qn(e,i)-u);}}function kl(e,t,n){let o=new Set(Ut(t,"main",n).map(l=>l.name)),r=Ut(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||Un.has(n))return 0;let s=r.map(l=>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(p=>u[p.name]))?1:0),0)}function mt(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 Ut(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function qn(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 Un,rs=C(()=>{Un=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var ss={};O(ss,{connectAgent:()=>_l,getAvailableAgents:()=>Rl});async function _l(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 Rl(){return listAdapters()}var is=C(()=>{});var cs={};O(cs,{getIndexStatus:()=>El,refreshIndex:()=>Dl});async function El(e){return $(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function Dl(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var ls=C(()=>{Se();});var us={};O(us,{getGraph:()=>Cl});async function Cl(e={}){let t=e.target??"all",n=e.depth??2;return $(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var ds=C(()=>{Se();});var Bn={};O(Bn,{getContext:()=>jl,getTaskContext:()=>Nl});async function jl(e){return $(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function Nl(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return $(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0,a=`diagnostic:${stableRuntimeHash({rootPath:t,query:e.query,taskOptions:n})}`;return projectDiagnosticCodeResult(await o.buildTaskContext(e.query,n),i,{projectRoot:t,query:e.query,host:"cli",sessionId:a,executionId:a,requestId:a,turnId:a})},{skipServer:e.skipServer})}var Kn=C(()=>{Se();});var pt={};O(pt,{getWorkflowRuns:()=>ms,getWorkflowStatus:()=>Il,listWorkflows:()=>Al,runWorkflow:()=>$l});async function Al(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function $l(e,t,n){return $(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Il(e){return ms(e)}async function ms(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ft=C(()=>{Se();});var Xe={};O(Xe,{cancelWorker:()=>Ul,listWorkers:()=>Hl,retryWorkerCleanup:()=>ql,showWorker:()=>Wl,workerMergeStatus:()=>Bl});function Hl(e){return ht(e,t=>Qe(e.json,{projectRoot:Ze(e.projectRoot),workers:t.listWorkflowWorkers(Ze(e.projectRoot))}))}function Wl(e,t){return ht(t,n=>{let o=Ze(t.projectRoot),r=qt(n,o,e);return Qe(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function Ul(e,t){return ht(t,n=>{let o=Ze(t.projectRoot),r=qt(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"}}),Qe(t.json,s)})}function ql(e,t){return ht(t,n=>{let o=Ze(t.projectRoot),r=qt(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 Qe(t.json,s)})}function Bl(e,t){return ht(t,n=>{let o=Ze(t.projectRoot);qt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Qe(t.json,r??{workerId:e,state:"not_queued"})})}function qt(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 Ze(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function ht(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Qe(e,t){if(e)return JSON.stringify(t,null,2);if(Kl(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(Jl(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=>Qe(false,o)).join(`
36
- `)}return JSON.stringify(t,null,2)}function Kl(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function Jl(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var et=C(()=>{});var Vn={};O(Vn,{getEmbeddingStatus:()=>Gl,prepareEmbeddings:()=>Yl,renderEmbeddingStatus:()=>Zl});async function Gl(){return inspectEmbeddingModel()}async function Yl(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Zl(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(`
37
- `)}var zn=C(()=>{});var Me={};O(Me,{backfillObservationVectors:()=>ru,queryMemory:()=>tu,reviewCandidates:()=>ou,reviewMemories:()=>iu,setMemory:()=>nu,showMemory:()=>eu});async function eu(e,t){let n=await $(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function tu(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return $(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function nu(e,t,n){return $(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function ou(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function ru(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function su(e){let t=Xl.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function iu(){let t=await $(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
38
- [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await su(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await $(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await $(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
39
- Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O(fs,{getDocsStatus:()=>lu,queryKnowledge:()=>ps,searchKnowledge:()=>cu,syncDocs:()=>uu});async function ps(e,t,n,o){return $(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=process.cwd(),s=new KnowledgeEngine({projectRoot:r,projectId:resolveStableProjectIdentity(r).projectId,embedder:new EmbeddingProvider});return getDiagnosticKnowledgeResult(s,{query:e,scope:t,budgetTokens:n},{projectRoot:process.cwd(),adapter:"cli"})},{skipServer:o})}async function cu(e,t,n){return (await ps(e,t,void 0,n)).results}async function lu(e){return $(process.cwd(),t=>t.getKnowledgeSources(),()=>{let t=process.cwd();return new KnowledgeEngine({projectRoot:t,projectId:resolveStableProjectIdentity(t).projectId,embedder:new EmbeddingProvider}).getSources()},{skipServer:e})}async function uu(e,t){return $(process.cwd(),n=>n.syncDocs(e),()=>{let n=process.cwd();return new KnowledgeEngine({projectRoot:n,projectId:resolveStableProjectIdentity(n).projectId,embedder:new EmbeddingProvider}).syncDocs(e)},{skipServer:t})}var hs=C(()=>{Se();});var Xn={};O(Xn,{backfillKnowledgeVectors:()=>hu,resyncKnowledgeDocs:()=>fu});function ys(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function fu(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=ys(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function hu(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=ys(t);Qn(t,{phase:"started",source:e.source??"all",batchSize:e.batchSize??32});try{let r=await o.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress});return Qn(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw Qn(t,{phase:"failed",source:e.source??"all",errorCategory:yu(r),error:r instanceof Error?r.message.slice(0,500):String(r).slice(0,500),success:false},Date.now()-n),r}finally{o.close();}}function Qn(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:"knowledge_vector_backfill",timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:{projectRoot:e,...t}});}finally{o.close();}}catch{}}function yu(e){let t=e instanceof Error?e.message:String(e);return /warmup|model|embedding provider/iu.test(t)?"embedding_provider_unavailable":/dimension|vector|shape/iu.test(t)?"embedding_contract_mismatch":/sqlite|database|locked|busy/iu.test(t)?"storage_unavailable":"unexpected_backfill_failure"}var eo=C(()=>{});var ws={};O(ws,{inspectSkillHealth:()=>Bt,showSkillHealth:()=>Eu});function _u(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 Bt(e){let t=e===void 0?$e(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=[];Ru(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$1(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=_u(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 p=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&p!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let m=a.get(u.name)??[];m.push(l),a.set(u.name,m);}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),p=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(p)&&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 Ru(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 Eu(e={}){let t=Bt(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 no=C(()=>{Ve();});var oo={};O(oo,{showMcpHealth:()=>ju,showMcpInventory:()=>xu});async function xu(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 ju(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 ro=C(()=>{});var ri={};O(ri,{renderDoctorText:()=>ni,runDoctor:()=>mg,runDoctorAudit:()=>fg,runDoctorAuditFix:()=>hg,runDoctorCommand:()=>pg,runDoctorReceipts:()=>wg,runDoctorViolations:()=>yg,runLegacyDoctorReport:()=>oi,runStructuredDoctor:()=>_o});function Us(){if(Jt)return Jt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Jt=e.DatabaseSync,Jt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function oe(e){return {homeDir:e.homePath,env:e.env??process.env}}function Qt(e){return join$1(getDevFlowStateRoot(oe(e)),"global","devflow.db")}function I(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Vu(e,t){let n=t.homePath??homedir$1(),o=oe(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let h=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:h,target:"unsupported capabilities have explicit degradation",ok:h.every(y=>y.status==="supported"||!!(y.reason&&y.fallback)),severity:"error"});}let i=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),a=i.diagnostics.filter(h=>h.status==="failed");r.push({key:"plugin_runtime",value:i.diagnostics,target:"configured plugins loadable with diagnostics",ok:a.length===0,severity:"warning"});let c=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));r.push({key:"mcp_inventory",value:{servers:c.servers.length,duplicates:c.duplicates.length,unreadable:c.unreadable.length},target:{duplicates:0,unreadable:0},ok:c.unreadable.length===0,severity:c.unreadable.length>0?"error":"info"}),r.push({key:"mcp_configuration_drift",value:c.duplicates.filter(h=>h.fingerprints.length>1).map(h=>h.name),target:[],ok:c.duplicates.every(h=>h.fingerprints.length===1),severity:"warning"});let l=await checkMcpHealth(c,n),u=l.records.filter(h=>h.status==="unhealthy");r.push({key:"mcp_health",value:l.records,target:"no unhealthy enabled servers",ok:u.length===0,severity:"warning"});let p=t.activePluginRoot??$e(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(p){let h=Bt(p);r.push({key:"skill_health",value:{root:h.pluginRoot,skills:h.skills,commands:h.commands,issues:h.issues},target:"valid and fully bound installed skills",ok:h.healthy,severity:"warning"});}let m=readRuntimeState(o);r.push({key:"runtime_state_v2",value:m??"not registered",target:"ready while active, stopped or absent while idle",ok:!m||m.status==="ready"||m.status==="stopped",severity:m?.status==="failed"?"error":"warning"});let f=join$1(getDevFlowStateRoot(o),["runtime","endpoint.json"].join("-"));r.push({key:"legacy_runtime_endpoint_ignored",value:existsSync$1(f),target:false,ok:!existsSync$1(f),severity:"warning"});let d=(t.now??Date.now)(),g=listRuntimeHttpCircuits(o).filter(h=>h.status==="open"&&(h.openUntil??0)>d);return r.push({key:"runtime_http_circuits",value:g,target:[],ok:g.length===0,severity:g.some(h=>h.failures>=2)?"error":"warning"}),{name:"Contract",status:I(r),metrics:r}}function mo(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function zu(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Gu(e,t){let n=mo(e),o=oe(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(f=>zu(f).length>0);i.push({key:"daemon_registry",value:l.length===0?"valid":"malformed",target:"valid daemon entry array",ok:l.length===0,severity:l.length===0?"info":"warning"}),i.push({key:"invalid_daemon_registry_entries",value:l.length,target:0,ok:l.length===0,severity:"warning"});let u=c.filter(f=>{if(typeof f!="object"||f===null)return !1;let d=f;return typeof d.rootPath!="string"||d.rootPath.length===0?!1:mo(d.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let p=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:p,target:[s],ok:!0,severity:"info"});let m=u.filter((f,d)=>f.projectHash!==r||p[d]!==s).length;i.push({key:"daemon_identity_mismatches",value:m,target:0,ok:m===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:I(i),metrics:i}}function Zu(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(Yu)){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 qs(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 Qu(e){let t=qs(e);return t&&t.length>0?t:null}function io(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 Xu(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function bs(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function td(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Us())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Zu(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
35
+ `);}o[i]=(o[i]??0)+(qn(e,i)-u);}}function _l(e,t,n){let o=new Set(Ut(t,"main",n).map(l=>l.name)),r=Ut(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||Un.has(n))return 0;let s=r.map(l=>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(p=>u[p.name]))?1:0),0)}function mt(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 Ut(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function qn(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 Un,rs=C(()=>{Un=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var ss={};O(ss,{connectAgent:()=>Dl,getAvailableAgents:()=>Pl});async function Dl(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 Pl(){return listAdapters()}var is=C(()=>{});var cs={};O(cs,{getIndexStatus:()=>Cl,refreshIndex:()=>Ol});async function Cl(e){return $(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function Ol(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var ls=C(()=>{Se();});var us={};O(us,{getGraph:()=>xl});async function xl(e={}){let t=e.target??"all",n=e.depth??2;return $(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var ds=C(()=>{Se();});var Bn={};O(Bn,{getContext:()=>$l,getTaskContext:()=>Il});async function $l(e){return $(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function Il(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return $(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0,a=`diagnostic:${stableRuntimeHash({rootPath:t,query:e.query,taskOptions:n})}`;return projectDiagnosticCodeResult(await o.buildTaskContext(e.query,n),i,{projectRoot:t,query:e.query,host:"cli",sessionId:a,executionId:a,requestId:a,turnId:a})},{skipServer:e.skipServer})}var Kn=C(()=>{Se();});var pt={};O(pt,{getWorkflowRuns:()=>ms,getWorkflowStatus:()=>Ll,listWorkflows:()=>Tl,runWorkflow:()=>Ml});async function Tl(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Ml(e,t,n){return $(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function Ll(e){return ms(e)}async function ms(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ft=C(()=>{Se();});var Xe={};O(Xe,{cancelWorker:()=>Kl,listWorkers:()=>ql,retryWorkerCleanup:()=>Jl,showWorker:()=>Bl,workerMergeStatus:()=>Vl});function ql(e){return ht(e,t=>Qe(e.json,{projectRoot:Ze(e.projectRoot),workers:t.listWorkflowWorkers(Ze(e.projectRoot))}))}function Bl(e,t){return ht(t,n=>{let o=Ze(t.projectRoot),r=qt(n,o,e);return Qe(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function Kl(e,t){return ht(t,n=>{let o=Ze(t.projectRoot),r=qt(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"}}),Qe(t.json,s)})}function Jl(e,t){return ht(t,n=>{let o=Ze(t.projectRoot),r=qt(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 Qe(t.json,s)})}function Vl(e,t){return ht(t,n=>{let o=Ze(t.projectRoot);qt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Qe(t.json,r??{workerId:e,state:"not_queued"})})}function qt(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 Ze(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function ht(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Qe(e,t){if(e)return JSON.stringify(t,null,2);if(zl(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(Gl(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=>Qe(false,o)).join(`
36
+ `)}return JSON.stringify(t,null,2)}function zl(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function Gl(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var et=C(()=>{});var Vn={};O(Vn,{getEmbeddingStatus:()=>Ql,prepareEmbeddings:()=>Xl,renderEmbeddingStatus:()=>eu});async function Ql(){return inspectEmbeddingModel()}async function Xl(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function eu(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(`
37
+ `)}var zn=C(()=>{});var Me={};O(Me,{backfillObservationVectors:()=>au,queryMemory:()=>ru,reviewCandidates:()=>iu,reviewMemories:()=>lu,setMemory:()=>su,showMemory:()=>ou});async function ou(e,t){let n=await $(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function ru(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return $(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function su(e,t,n){return $(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function iu(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function au(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function cu(e){let t=nu.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function lu(){let t=await $(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
38
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await cu(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await $(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await $(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
39
+ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O(fs,{getDocsStatus:()=>gu,queryKnowledge:()=>ps,searchKnowledge:()=>du,syncDocs:()=>mu});async function ps(e,t,n,o){return $(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=process.cwd(),s=new KnowledgeEngine({projectRoot:r,projectId:resolveStableProjectIdentity(r).projectId,embedder:new EmbeddingProvider});return getDiagnosticKnowledgeResult(s,{query:e,scope:t,budgetTokens:n},{projectRoot:process.cwd(),adapter:"cli"})},{skipServer:o})}async function du(e,t,n){return (await ps(e,t,void 0,n)).results}async function gu(e){return $(process.cwd(),t=>t.getKnowledgeSources(),()=>{let t=process.cwd();return new KnowledgeEngine({projectRoot:t,projectId:resolveStableProjectIdentity(t).projectId,embedder:new EmbeddingProvider}).getSources()},{skipServer:e})}async function mu(e,t){return $(process.cwd(),n=>n.syncDocs(e),()=>{let n=process.cwd();return new KnowledgeEngine({projectRoot:n,projectId:resolveStableProjectIdentity(n).projectId,embedder:new EmbeddingProvider}).syncDocs(e)},{skipServer:t})}var hs=C(()=>{Se();});var Xn={};O(Xn,{backfillKnowledgeVectors:()=>vu,resyncKnowledgeDocs:()=>wu});function ys(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function wu(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=ys(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function vu(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=ys(t);Qn(t,{phase:"started",source:e.source??"all",batchSize:e.batchSize??32});try{let r=await o.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress});return Qn(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw Qn(t,{phase:"failed",source:e.source??"all",errorCategory:ku(r),error:r instanceof Error?r.message.slice(0,500):String(r).slice(0,500),success:false},Date.now()-n),r}finally{o.close();}}function Qn(e,t,n){try{let o=openGlobalDevFlowDatabase();try{o.insertEvent({kind:"knowledge_vector_backfill",timestamp:Date.now(),duration:n,success:t.success!==!1,metadata:{projectRoot:e,...t}});}finally{o.close();}}catch{}}function ku(e){let t=e instanceof Error?e.message:String(e);return /warmup|model|embedding provider/iu.test(t)?"embedding_provider_unavailable":/dimension|vector|shape/iu.test(t)?"embedding_contract_mismatch":/sqlite|database|locked|busy/iu.test(t)?"storage_unavailable":"unexpected_backfill_failure"}var eo=C(()=>{});var ws={};O(ws,{inspectSkillHealth:()=>Bt,showSkillHealth:()=>Cu});function Du(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 Bt(e){let t=e===void 0?$e(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=[];Pu(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$1(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=Du(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 p=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&p!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let m=a.get(u.name)??[];m.push(l),a.set(u.name,m);}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),p=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(p)&&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 Pu(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 Cu(e={}){let t=Bt(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 no=C(()=>{Ve();});var oo={};O(oo,{showMcpHealth:()=>$u,showMcpInventory:()=>Au});async function Au(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 $u(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 ro=C(()=>{});var ri={};O(ri,{renderDoctorText:()=>ni,runDoctor:()=>hg,runDoctorAudit:()=>wg,runDoctorAuditFix:()=>vg,runDoctorCommand:()=>yg,runDoctorReceipts:()=>bg,runDoctorViolations:()=>kg,runLegacyDoctorReport:()=>oi,runStructuredDoctor:()=>_o});function Us(){if(Jt)return Jt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Jt=e.DatabaseSync,Jt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function oe(e){return {homeDir:e.homePath,env:e.env??process.env}}function Qt(e){return join$1(getDevFlowStateRoot(oe(e)),"global","devflow.db")}function I(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Yu(e,t){let n=t.homePath??homedir$1(),o=oe(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let h=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:h,target:"unsupported capabilities have explicit degradation",ok:h.every(y=>y.status==="supported"||!!(y.reason&&y.fallback)),severity:"error"});}let i=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),a=i.diagnostics.filter(h=>h.status==="failed");r.push({key:"plugin_runtime",value:i.diagnostics,target:"configured plugins loadable with diagnostics",ok:a.length===0,severity:"warning"});let c=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));r.push({key:"mcp_inventory",value:{servers:c.servers.length,duplicates:c.duplicates.length,unreadable:c.unreadable.length},target:{duplicates:0,unreadable:0},ok:c.unreadable.length===0,severity:c.unreadable.length>0?"error":"info"}),r.push({key:"mcp_configuration_drift",value:c.duplicates.filter(h=>h.fingerprints.length>1).map(h=>h.name),target:[],ok:c.duplicates.every(h=>h.fingerprints.length===1),severity:"warning"});let l=await checkMcpHealth(c,n),u=l.records.filter(h=>h.status==="unhealthy");r.push({key:"mcp_health",value:l.records,target:"no unhealthy enabled servers",ok:u.length===0,severity:"warning"});let p=t.activePluginRoot??$e(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(p){let h=Bt(p);r.push({key:"skill_health",value:{root:h.pluginRoot,skills:h.skills,commands:h.commands,issues:h.issues},target:"valid and fully bound installed skills",ok:h.healthy,severity:"warning"});}let m=readRuntimeState(o);r.push({key:"runtime_state_v2",value:m??"not registered",target:"ready while active, stopped or absent while idle",ok:!m||m.status==="ready"||m.status==="stopped",severity:m?.status==="failed"?"error":"warning"});let f=join$1(getDevFlowStateRoot(o),["runtime","endpoint.json"].join("-"));r.push({key:"legacy_runtime_endpoint_ignored",value:existsSync$1(f),target:false,ok:!existsSync$1(f),severity:"warning"});let d=(t.now??Date.now)(),g=listRuntimeHttpCircuits(o).filter(h=>h.status==="open"&&(h.openUntil??0)>d);return r.push({key:"runtime_http_circuits",value:g,target:[],ok:g.length===0,severity:g.some(h=>h.failures>=2)?"error":"warning"}),{name:"Contract",status:I(r),metrics:r}}function mo(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Zu(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Qu(e,t){let n=mo(e),o=oe(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(f=>Zu(f).length>0);i.push({key:"daemon_registry",value:l.length===0?"valid":"malformed",target:"valid daemon entry array",ok:l.length===0,severity:l.length===0?"info":"warning"}),i.push({key:"invalid_daemon_registry_entries",value:l.length,target:0,ok:l.length===0,severity:"warning"});let u=c.filter(f=>{if(typeof f!="object"||f===null)return !1;let d=f;return typeof d.rootPath!="string"||d.rootPath.length===0?!1:mo(d.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let p=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:p,target:[s],ok:!0,severity:"info"});let m=u.filter((f,d)=>f.projectHash!==r||p[d]!==s).length;i.push({key:"daemon_identity_mismatches",value:m,target:0,ok:m===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:I(i),metrics:i}}function ed(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(Xu)){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 qs(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 td(e){let t=qs(e);return t&&t.length>0?t:null}function io(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 nd(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function bs(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function rd(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Us())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=ed(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
40
40
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
41
41
  FROM distill_leases
42
- `);l.setReadBigInts?.(!0);let u=l.all(),p=new Set,m=0,f=0;for(let _ of u){let T=Qu(_.event_ids),V=qs(_.session_ids),Y=io(_.event_count),j=io(_.created_at),B=io(_.expires_at),x=typeof _.status=="string"&&ed.has(_.status)?_.status:null,N=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&Xu(Y,T.length);if(!N||!T||!V||!F||j===null||B===null||x===null){m+=1,_.status==="pending"&&(B===null||bs(B,c))&&(f+=1);continue}if(!(x!=="pending"||!bs(B,c)))for(let A of T)p.add(A);}n.push({key:"malformed_distill_leases",value:m,target:0,ok:m===0,severity:f>0?"error":"warning"});let g=i.prepare(`
42
+ `);l.setReadBigInts?.(!0);let u=l.all(),p=new Set,m=0,f=0;for(let _ of u){let T=td(_.event_ids),V=qs(_.session_ids),Y=io(_.event_count),x=io(_.created_at),B=io(_.expires_at),j=typeof _.status=="string"&&od.has(_.status)?_.status:null,N=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&nd(Y,T.length);if(!N||!T||!V||!F||x===null||B===null||j===null){m+=1,_.status==="pending"&&(B===null||bs(B,c))&&(f+=1);continue}if(!(j!=="pending"||!bs(B,c)))for(let A of T)p.add(A);}n.push({key:"malformed_distill_leases",value:m,target:0,ok:m===0,severity:f>0?"error":"warning"});let g=i.prepare(`
43
43
  SELECT id
44
44
  FROM session_events
45
45
  WHERE processed = 0 AND created_at < ?
@@ -60,7 +60,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O
60
60
  GROUP BY project, session_id, title
61
61
  HAVING COUNT(*) > 1
62
62
  )
63
- `).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:I(n),metrics:n}}function X(e,t){return (t.openDatabase??(o=>new(Us())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function q(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Bs(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function fo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function nd(e){let t=fo(Bs(e.output)),n=fo(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 od(e){let t=Bs(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=fo(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Ss(e,t){return t===0?0:e/t}function ao(e,t){return e===0?1:t/e}async function rd(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 m;try{m=X(s,t),M(m,"nodes")?(o=q(m,"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{m?.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 m;try{m=X(i,t);let f=M(m,"symbols_vec_rowids")?"symbols_vec_rowids":M(m,"symbol_sources")?"symbol_sources":null;f?(r=q(m,`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{m?.close();}}if(o!==null&&r!==null){let m=ao(o,r);n.push({key:"symbols_vector_coverage",value:m,target:">= 0.90",ok:m>=.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 m;try{m=X(a,t);let d=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(g=>!M(m,g));if(d.length>0)n.push({key:"knowledge_vector_schema",value:d,target:[],ok:!1,severity:"warning"});else {let h=fe(m,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=q(m,`
63
+ `).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:I(n),metrics:n}}function X(e,t){return (t.openDatabase??(o=>new(Us())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function q(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Bs(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function fo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function sd(e){let t=fo(Bs(e.output)),n=fo(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 id(e){let t=Bs(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=fo(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Ss(e,t){return t===0?0:e/t}function ao(e,t){return e===0?1:t/e}async function ad(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 m;try{m=X(s,t),M(m,"nodes")?(o=q(m,"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{m?.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 m;try{m=X(i,t);let f=M(m,"symbols_vec_rowids")?"symbols_vec_rowids":M(m,"symbol_sources")?"symbol_sources":null;f?(r=q(m,`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{m?.close();}}if(o!==null&&r!==null){let m=ao(o,r);n.push({key:"symbols_vector_coverage",value:m,target:">= 0.90",ok:m>=.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 m;try{m=X(a,t);let d=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(g=>!M(m,g));if(d.length>0)n.push({key:"knowledge_vector_schema",value:d,target:[],ok:!1,severity:"warning"});else {let h=fe(m,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=q(m,`
64
64
  SELECT COUNT(*) count
65
65
  FROM knowledge_chunks c
66
66
  JOIN knowledge_docs d ON d.id = c.doc_id
@@ -85,10 +85,10 @@ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O
85
85
  WHERE e.source_type = 'observation'
86
86
  ${d?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
87
87
  `),v=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:v,target:0,ok:v===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(oe(t)),"errors","embedder.log"),p=0;if(existsSync$1(u))try{let m=l-864e5;p=readFileSync$1(u,"utf8").split(`
88
- `).filter(f=>{let d=/^\[([^\]]+)\]/.exec(f);return d?Date.parse(d[1])>=m:!1}).length;}catch(m){n.push({key:"embedder_error_log_read",value:m.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:p,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let m=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:m.state,modelId:m.modelId,revision:m.revision},target:{state:"ready"},ok:m.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:m.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:m.missingFiles,corruptFiles:m.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:m.missingFiles.length===0&&m.corruptFiles.length===0,severity:"warning"});}catch(m){n.push({key:"embedding_model_inspection",value:m.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function sd(e,t,n){let o=[],r=Qt(n),s=(n.now??Date.now)()-1440*60*1e3,i=(n.now??Date.now)(),a=t?"error":"warning";if(!existsSync$1(r))o.push({key:"global_telemetry_db",value:"missing",target:r,ok:false,severity:"warning"});else {let d;try{d=X(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[x,N]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(d,N)?q(d,`SELECT COUNT(*) count FROM ${N} WHERE created_at >= ?`,s):0;o.push({key:x,value:F,ok:!0,severity:"info"});}let g=M(d,"telemetry_failures")?q(d,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:g,target:0,ok:g===0,severity:a});let h=fe(d,"sessions"),y=fe(d,"tool_call_events"),v=fe(d,"skill_executions"),R=["id","project_root","started_at","status"].every(x=>h.has(x));if(o.push({key:"telemetry_session_schema",value:R?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:R,severity:"error"}),R){let x=q(d,`
88
+ `).filter(f=>{let d=/^\[([^\]]+)\]/.exec(f);return d?Date.parse(d[1])>=m:!1}).length;}catch(m){n.push({key:"embedder_error_log_read",value:m.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:p,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let m=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:m.state,modelId:m.modelId,revision:m.revision},target:{state:"ready"},ok:m.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:m.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:m.missingFiles,corruptFiles:m.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:m.missingFiles.length===0&&m.corruptFiles.length===0,severity:"warning"});}catch(m){n.push({key:"embedding_model_inspection",value:m.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function cd(e,t,n){let o=[],r=Qt(n),s=(n.now??Date.now)()-1440*60*1e3,i=(n.now??Date.now)(),a=t?"error":"warning";if(!existsSync$1(r))o.push({key:"global_telemetry_db",value:"missing",target:r,ok:false,severity:"warning"});else {let d;try{d=X(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[j,N]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(d,N)?q(d,`SELECT COUNT(*) count FROM ${N} WHERE created_at >= ?`,s):0;o.push({key:j,value:F,ok:!0,severity:"info"});}let g=M(d,"telemetry_failures")?q(d,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:g,target:0,ok:g===0,severity:a});let h=fe(d,"sessions"),y=fe(d,"tool_call_events"),v=fe(d,"skill_executions"),R=["id","project_root","started_at","status"].every(j=>h.has(j));if(o.push({key:"telemetry_session_schema",value:R?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:R,severity:"error"}),R){let j=q(d,`
89
89
  SELECT COUNT(*) count FROM sessions
90
90
  WHERE project_root = ? AND started_at >= ?
91
- `,e,s);o.push({key:"session_start_evidence_24h",value:x,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let N=q(d,`
91
+ `,e,s);o.push({key:"session_start_evidence_24h",value:j,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let N=q(d,`
92
92
  SELECT COUNT(*) count FROM sessions
93
93
  WHERE project_root = ? AND status = 'running' AND started_at < ?
94
94
  `,e,(n.now??Date.now)()-po);o.push({key:"stale_telemetry_sessions",value:N,target:0,ok:N===0,severity:"error"});let F=d.prepare(`
@@ -125,7 +125,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O
125
125
  WHERE session.project_root = ?
126
126
  AND execution.status = 'running'
127
127
  AND (execution.started_at < ? OR session.status <> 'running')
128
- `).get(L,e,L),de=Number(U?.total??0);o.push({key:"stale_skill_executions",value:{total:de,olderThan30m:Number(U?.older_than_30m??0),attachedToNonRunningSession:Number(U?.non_running_session??0)},target:{total:0},ok:de===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(d,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let x=fe(d,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(A=>!x.has(A));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let A=d.prepare(`
128
+ `).get(L,e,L),de=Number(U?.total??0);o.push({key:"stale_skill_executions",value:{total:de,olderThan30m:Number(U?.older_than_30m??0),attachedToNonRunningSession:Number(U?.non_running_session??0)},target:{total:0},ok:de===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(d,"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 j=fe(d,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(A=>!j.has(A));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let A=d.prepare(`
129
129
  SELECT
130
130
  COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
131
131
  COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
@@ -137,7 +137,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O
137
137
  MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
138
138
  FROM devflow_work_items
139
139
  WHERE project_root = ?
140
- `).get(i,e),z=Number(A?.queue_depth??0),Z=Number(A?.pending??0),ve=Number(A?.leased??0),ue=Number(A?.failed??0),ke=Number(A?.dead_letters??0),L=Number(A?.expired_leases??0),U=A?.oldest_pending_at==null?void 0:Number(A.oldest_pending_at),de=A?.last_successful_drain_at==null?void 0:Number(A.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:z,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ve,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ue,target:0,ok:ue===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:U===void 0?0:Math.max(0,i-U),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ke,target:0,ok:ke===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:de??null,ok:!0,severity:"info"});}}if(!M(d,"devflow_workflow_workers")||!M(d,"devflow_merge_queue"))o.push({key:"workflow_worker_schema",value:"worker or merge queue table missing",target:"canonical isolated worker lifecycle schema",ok:!1,severity:"warning"});else {let x=d.prepare(`
140
+ `).get(i,e),z=Number(A?.queue_depth??0),Z=Number(A?.pending??0),ve=Number(A?.leased??0),ue=Number(A?.failed??0),ke=Number(A?.dead_letters??0),L=Number(A?.expired_leases??0),U=A?.oldest_pending_at==null?void 0:Number(A.oldest_pending_at),de=A?.last_successful_drain_at==null?void 0:Number(A.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:z,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ve,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ue,target:0,ok:ue===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:U===void 0?0:Math.max(0,i-U),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ke,target:0,ok:ke===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:de??null,ok:!0,severity:"info"});}}if(!M(d,"devflow_workflow_workers")||!M(d,"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 j=d.prepare(`
141
141
  SELECT
142
142
  COUNT(*) total,
143
143
  COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
@@ -151,56 +151,56 @@ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O
151
151
  `,e),F=d.prepare(`
152
152
  SELECT MIN(created_at) oldest FROM devflow_merge_queue
153
153
  WHERE project_root = ? AND state IN ('waiting','ready')
154
- `).get(e),A=Number(x?.active??0),z=Number(x?.held??0),Z=Number(x?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:A,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:z,target:0,ok:z===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:Z,target:0,ok:Z===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:N,target:0,ok:N===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,i-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let w=getProjectStateDir(e,oe(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(x=>{let N=join$1(w,x),F=existsSync$1(N)?readdirSync$1(N).filter(A=>A.includes(".json")).length:0;return [x,F]})),T=Object.values(_).reduce((x,N)=>x+N,0);if(o.push({key:"hook_spool_backlog",value:{total:T,..._},target:{total:0},ok:T===0,severity:a}),M(d,"tool_call_events")){let x=R&&y.has("session_id"),N=fe(d,"tool_metrics"),F=y.has("event_id")&&N.has("tool_call_event_id")&&N.has("status"),A=[y.has("error")?"event.error":"NULL error",y.has("failure_category")?"event.failure_category":"NULL failure_category",y.has("output")?"event.output":"NULL output",y.has("blocked")?"event.blocked":"0 blocked",y.has("block_reason")?"event.block_reason":"NULL block_reason",x?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),z=d.prepare(`
154
+ `).get(e),A=Number(j?.active??0),z=Number(j?.held??0),Z=Number(j?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:A,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:z,target:0,ok:z===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:Z,target:0,ok:Z===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:N,target:0,ok:N===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,i-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let w=getProjectStateDir(e,oe(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(j=>{let N=join$1(w,j),F=existsSync$1(N)?readdirSync$1(N).filter(A=>A.includes(".json")).length:0;return [j,F]})),T=Object.values(_).reduce((j,N)=>j+N,0);if(o.push({key:"hook_spool_backlog",value:{total:T,..._},target:{total:0},ok:T===0,severity:a}),M(d,"tool_call_events")){let j=R&&y.has("session_id"),N=fe(d,"tool_metrics"),F=y.has("event_id")&&N.has("tool_call_event_id")&&N.has("status"),A=[y.has("error")?"event.error":"NULL error",y.has("failure_category")?"event.failure_category":"NULL failure_category",y.has("output")?"event.output":"NULL output",y.has("blocked")?"event.blocked":"0 blocked",y.has("block_reason")?"event.block_reason":"NULL block_reason",j?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),z=d.prepare(`
155
155
  SELECT ${A}
156
156
  FROM tool_call_events event
157
157
  ${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
158
- ${x?"JOIN sessions event_session ON event_session.id = event.session_id":""}
158
+ ${j?"JOIN sessions event_session ON event_session.id = event.session_id":""}
159
159
  WHERE event.timestamp >= ?
160
- ${x?"AND event_session.project_root = ?":""}
161
- `).all(...x?[s,e]:[s]),Z=z.map(nd),ve=Z.filter(L=>L.failed).length,ue=Z.filter((L,U)=>L.failed&&z[U]?.session_status!=="completed").length,ke=Z.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:z.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ve,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ue,target:0,ok:ue===0,severity:a}),o.push({key:"semantic_tool_degradations_24h",value:ke,target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Ss(ve,z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Ss(ke,z.length),target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:x?"project":"global fallback; session identity unavailable",target:"project",ok:x,severity:"warning"}),y.has("failure_category")){let L={};for(let ge of z)typeof ge.failure_category!="string"||!ge.failure_category.trim()||(L[ge.failure_category]=(L[ge.failure_category]??0)+1);let U=z.filter((ge,Ki)=>Z[Ki]?.failed&&ge.session_status!=="completed"),de=U.filter(ge=>typeof ge.failure_category=="string"&&ge.failure_category.trim().length>0).length,Ke=U.length===0?1:de/U.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Ke,target:">= 0.80",ok:Ke>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let V=R&&["session_id","started_at","fallback_count","fallback_reasons"].every(x=>v.has(x)),Y=0,j={};if(V){let x=d.prepare(`
160
+ ${j?"AND event_session.project_root = ?":""}
161
+ `).all(...j?[s,e]:[s]),Z=z.map(sd),ve=Z.filter(L=>L.failed).length,ue=Z.filter((L,U)=>L.failed&&z[U]?.session_status!=="completed").length,ke=Z.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:z.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ve,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ue,target:0,ok:ue===0,severity:a}),o.push({key:"semantic_tool_degradations_24h",value:ke,target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Ss(ve,z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Ss(ke,z.length),target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:j?"project":"global fallback; session identity unavailable",target:"project",ok:j,severity:"warning"}),y.has("failure_category")){let L={};for(let ge of z)typeof ge.failure_category!="string"||!ge.failure_category.trim()||(L[ge.failure_category]=(L[ge.failure_category]??0)+1);let U=z.filter((ge,zi)=>Z[zi]?.failed&&ge.session_status!=="completed"),de=U.filter(ge=>typeof ge.failure_category=="string"&&ge.failure_category.trim().length>0).length,Ke=U.length===0?1:de/U.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Ke,target:">= 0.80",ok:Ke>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let V=R&&["session_id","started_at","fallback_count","fallback_reasons"].every(j=>v.has(j)),Y=0,x={};if(V){let j=d.prepare(`
162
162
  SELECT execution.fallback_count, execution.fallback_reasons
163
163
  FROM skill_executions execution
164
164
  JOIN sessions session ON session.id = execution.session_id
165
165
  WHERE session.project_root = ? AND execution.started_at >= ?
166
- `).all(e,s);for(let N of x){Y+=Number(N.fallback_count??0);for(let F of od(N.fallback_reasons))j[F]=(j[F]??0)+1;}}let B=0;if(M(d,"devflow_hook_fallbacks")){let x=d.prepare(`
166
+ `).all(e,s);for(let N of j){Y+=Number(N.fallback_count??0);for(let F of id(N.fallback_reasons))x[F]=(x[F]??0)+1;}}let B=0;if(M(d,"devflow_hook_fallbacks")){let j=d.prepare(`
167
167
  SELECT reason, COUNT(*) count
168
168
  FROM devflow_hook_fallbacks
169
169
  WHERE project_root = ? AND created_at >= ?
170
170
  GROUP BY reason ORDER BY reason
171
- `).all(e,s);for(let N of x){let F=Number(N.count);B+=F,j[`hook:${N.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:Y,target:0,ok:Y===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:B,target:0,ok:B===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:j,target:{},ok:Object.keys(j).length===0,severity:"warning"});}catch(g){o.push({key:"global_telemetry_db_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}let c=[join$1(dirname$1(r),"telemetry-cache")],l=0;try{l=c.reduce((d,g)=>d+(existsSync$1(g)?readdirSync$1(g).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(d){o.push({key:"telemetry_cache_read",value:d.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),p=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:p?u:"absent",target:"absent",ok:!p,severity:a});let m=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(m)){let d;try{d=X(m,n),f=d.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(g=>g.name);}catch(g){o.push({key:"codegraph_telemetry_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:I(o),metrics:o}}function Rs(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Ks(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 id(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(oe(e)),"keys"),r=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!r.some(([,l])=>!n[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),u=Rs(o),p=l.isDirectory()&&!l.isSymbolicLink(),m=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:p&&m,severity:p?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,u,p]of r){if(n[u]?.trim()){t.push({key:`${l}_source`,value:u,target:"environment override or generated key file",ok:true,severity:"info"});continue}let m=join$1(o,p);if(!existsSync$1(m)){t.push({key:`${l}_source`,value:"missing",target:m,ok:false,severity:"warning"});continue}try{let f=lstatSync(m),d=Rs(m),g=readFileSync$1(m,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:m,mode:d,bytes:Buffer.byteLength(g)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&g.length>0&&(process.platform==="win32"||d==="400"),severity:!h||g.length===0?"error":"warning"});}catch(f){t.push({key:`${l}_source`,value:f.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let i=join$1(getDevFlowStateRoot(oe(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-nt;for(let u of readFileSync$1(i,"utf8").split(`
172
- `))if(u.trim())try{let p=JSON.parse(u),m=Ks(p.ts);m===null?c+=1:m>=l&&(a+=1);}catch{c+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:c,target:0,ok:c===0,severity:"error"}),{name:"Runtime security",status:I(t),metrics:t}}function ad(e){let t=[],n=Qt(e);if(!existsSync$1(n))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let o;try{if(o=X(n,e),!M(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let r=o.prepare(`
171
+ `).all(e,s);for(let N of j){let F=Number(N.count);B+=F,x[`hook:${N.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:Y,target:0,ok:Y===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:B,target:0,ok:B===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:x,target:{},ok:Object.keys(x).length===0,severity:"warning"});}catch(g){o.push({key:"global_telemetry_db_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}let c=[join$1(dirname$1(r),"telemetry-cache")],l=0;try{l=c.reduce((d,g)=>d+(existsSync$1(g)?readdirSync$1(g).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(d){o.push({key:"telemetry_cache_read",value:d.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),p=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:p?u:"absent",target:"absent",ok:!p,severity:a});let m=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(m)){let d;try{d=X(m,n),f=d.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(g=>g.name);}catch(g){o.push({key:"codegraph_telemetry_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:I(o),metrics:o}}function Rs(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Ks(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 ld(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(oe(e)),"keys"),r=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!r.some(([,l])=>!n[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),u=Rs(o),p=l.isDirectory()&&!l.isSymbolicLink(),m=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:p&&m,severity:p?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,u,p]of r){if(n[u]?.trim()){t.push({key:`${l}_source`,value:u,target:"environment override or generated key file",ok:true,severity:"info"});continue}let m=join$1(o,p);if(!existsSync$1(m)){t.push({key:`${l}_source`,value:"missing",target:m,ok:false,severity:"warning"});continue}try{let f=lstatSync(m),d=Rs(m),g=readFileSync$1(m,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:m,mode:d,bytes:Buffer.byteLength(g)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&g.length>0&&(process.platform==="win32"||d==="400"),severity:!h||g.length===0?"error":"warning"});}catch(f){t.push({key:`${l}_source`,value:f.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let i=join$1(getDevFlowStateRoot(oe(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-nt;for(let u of readFileSync$1(i,"utf8").split(`
172
+ `))if(u.trim())try{let p=JSON.parse(u),m=Ks(p.ts);m===null?c+=1:m>=l&&(a+=1);}catch{c+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:c,target:0,ok:c===0,severity:"error"}),{name:"Runtime security",status:I(t),metrics:t}}function ud(e){let t=[],n=Qt(e);if(!existsSync$1(n))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let o;try{if(o=X(n,e),!M(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let r=o.prepare(`
173
173
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
174
174
  FROM benchmark_reports
175
175
  ORDER BY created_at DESC
176
176
  LIMIT 1
177
- `).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/nt).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=ho,severity:c<0||!Number.isFinite(c)?"error":"warning"});}catch(r){t.push({key:"benchmark_database_read",value:r.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:I(t),metrics:t}}function cd(e,t){let n=[],o=Qt(t);if(!existsSync$1(o))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let r;try{if(r=X(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
177
+ `).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/nt).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=ho,severity:c<0||!Number.isFinite(c)?"error":"warning"});}catch(r){t.push({key:"benchmark_database_read",value:r.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:I(t),metrics:t}}function dd(e,t){let n=[],o=Qt(t);if(!existsSync$1(o))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let r;try{if(r=X(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
178
178
  SELECT report_json, created_at
179
179
  FROM benchmark_reports
180
180
  WHERE suite_id = 'retrieval-quality' AND project_root = ?
181
181
  ORDER BY created_at DESC
182
182
  LIMIT 1
183
- `).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:ho},ok:i.qualityStatus==="passed"&&a<=ho,severity:i.qualityStatus==="failed"?"error":"warning"});for(let[c,l]of Object.entries(i.gates??{}))n.push({key:`retrieval_${c}`,value:i.metrics?.[c],target:i.thresholds?.[c],ok:l,severity:"error"});}catch(s){n.push({key:"retrieval_quality_read",value:s.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{r?.close();}return {name:"Retrieval quality",status:I(n),metrics:n}}function ld(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$1(r))t.push(join$1(r,i));continue}s.isFile()&&(n+=s.size,o+=1);}}return {bytes:n,files:o}}function ud(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(oe(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let R of readdirSync$1(s))R.endsWith(".log")&&r.push(join$1(s,R));}catch(R){t.push({key:"hook_fallback_directory_read",value:R.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-nt,a=0,c=0;for(let R of [...new Set(r)])if(existsSync$1(R))try{for(let w of readFileSync$1(R,"utf8").split(`
183
+ `).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:ho},ok:i.qualityStatus==="passed"&&a<=ho,severity:i.qualityStatus==="failed"?"error":"warning"});for(let[c,l]of Object.entries(i.gates??{}))n.push({key:`retrieval_${c}`,value:i.metrics?.[c],target:i.thresholds?.[c],ok:l,severity:"error"});}catch(s){n.push({key:"retrieval_quality_read",value:s.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{r?.close();}return {name:"Retrieval quality",status:I(n),metrics:n}}function gd(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$1(r))t.push(join$1(r,i));continue}s.isFile()&&(n+=s.size,o+=1);}}return {bytes:n,files:o}}function md(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(oe(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let R of readdirSync$1(s))R.endsWith(".log")&&r.push(join$1(s,R));}catch(R){t.push({key:"hook_fallback_directory_read",value:R.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-nt,a=0,c=0;for(let R of [...new Set(r)])if(existsSync$1(R))try{for(let w of readFileSync$1(R,"utf8").split(`
184
184
  `))if(w.trim())try{let b=JSON.parse(w),_=Ks(b.ts);_===null||typeof b.reason!="string"?c+=1:_>=i&&(a+=1);}catch{c+=1;}}catch(w){t.push({key:"hook_fallback_log_read",value:{path:R,error:w.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:c,target:0,ok:c===0,severity:"error"});let l=Qt(e),u=0,p=0,m=null;if(existsSync$1(l)){let R;try{if(R=X(l,e),M(R,"telemetry_events")){let w=R.prepare(`
185
185
  SELECT COUNT(*) total,
186
186
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
187
187
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
188
188
  FROM telemetry_events
189
189
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
190
- `).get(i);u=Number(w?.total??0),p=Number(w?.failures??0),m=w?.average_duration==null?null:Math.round(Number(w.average_duration)*100)/100;}}catch(w){t.push({key:"hook_daemon_metrics_read",value:w.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{R?.close();}}let f=Math.max(a,p),d=Math.max(u,f),g=d===0?0:f/d,h=e.env?.DEVFLOW_DISABLED==="1"?"env":existsSync$1(join$1(getDevFlowStateRoot(oe(e)),"disable"))?"marker":"off";t.push({key:"kill_switch",value:h,target:"off",ok:h==="off",severity:h==="off"?"info":"warning"}),t.push({key:"hook_daemon_requests_24h",value:d,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(g*1e4)/1e4,target:0,ok:f===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:m??"no successful requests",target:"<= 1000",ok:m===null||m<=1e3,severity:"warning"});let y=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:y,target:[],ok:y.length===0,severity:"warning"});let v=join$1(getDevFlowStateRoot(oe(e)),"logs","hook-debug");try{let R=ld(v);t.push({key:"hook_debug_log_bytes",value:R.bytes,target:`<= ${_s}`,ok:R.bytes<=_s,severity:"warning"}),t.push({key:"hook_debug_log_files",value:R.files,target:"rotated per project",ok:!0,severity:"info"});}catch(R){t.push({key:"hook_debug_log_read",value:R.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:I(t),metrics:t}}function Ce(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function qe(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function Gs(e,t){return md.has(e)&&!(t.tolerateControlSyntax&&pd.has(e))}function _t(e,t={}){if(Buffer.byteLength(e)>zs)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 p=e[u];if(i){r+=p,i=false;continue}if(s==="'"){p==="'"?s=null:r+=p;continue}if(p==="\\"){if(e[u+1]===`
190
+ `).get(i);u=Number(w?.total??0),p=Number(w?.failures??0),m=w?.average_duration==null?null:Math.round(Number(w.average_duration)*100)/100;}}catch(w){t.push({key:"hook_daemon_metrics_read",value:w.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{R?.close();}}let f=Math.max(a,p),d=Math.max(u,f),g=d===0?0:f/d,h=e.env?.DEVFLOW_DISABLED==="1"?"env":existsSync$1(join$1(getDevFlowStateRoot(oe(e)),"disable"))?"marker":"off";t.push({key:"kill_switch",value:h,target:"off",ok:h==="off",severity:h==="off"?"info":"warning"}),t.push({key:"hook_daemon_requests_24h",value:d,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(g*1e4)/1e4,target:0,ok:f===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:m??"no successful requests",target:"<= 1000",ok:m===null||m<=1e3,severity:"warning"});let y=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:y,target:[],ok:y.length===0,severity:"warning"});let v=join$1(getDevFlowStateRoot(oe(e)),"logs","hook-debug");try{let R=gd(v);t.push({key:"hook_debug_log_bytes",value:R.bytes,target:`<= ${_s}`,ok:R.bytes<=_s,severity:"warning"}),t.push({key:"hook_debug_log_files",value:R.files,target:"rotated per project",ok:!0,severity:"info"});}catch(R){t.push({key:"hook_debug_log_read",value:R.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:I(t),metrics:t}}function Ce(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function qe(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function Gs(e,t){return hd.has(e)&&!(t.tolerateControlSyntax&&yd.has(e))}function _t(e,t={}){if(Buffer.byteLength(e)>zs)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 p=e[u];if(i){r+=p,i=false;continue}if(s==="'"){p==="'"?s=null:r+=p;continue}if(p==="\\"){if(e[u+1]===`
191
191
  `){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
192
192
  `){u+=2;continue}i=true;continue}if(s==='"'){p==='"'?s=null:((p==="`"||p==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=p);continue}if(p==="'"||p==='"'){s=p;continue}if((p==="`"||p==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=p;continue}let m=e.slice(u,u+2);if(p==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
193
- `;)u+=1;l();continue}m==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=p==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||p==="}"&&fd.test(`${r}}`);if(["(",")","{","}"].includes(p)&&!f&&!t.tolerateControlSyntax&&(a=true),m==="&&"||m==="||"){l(),u+=1;continue}if([";","|","&",`
194
- `].includes(p)){l();continue}if(/\s/.test(p)){c();continue}r+=p;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let p=u.find(m=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(m));return p!==void 0&&Gs(p,t)})&&(a=true),{segments:n,malformed:a}}function hd(e){return _t(e).segments.flat().join(" ")}function yd(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 Ys(e,t){return yd(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 wd(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]===`
193
+ `;)u+=1;l();continue}m==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=p==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||p==="}"&&wd.test(`${r}}`);if(["(",")","{","}"].includes(p)&&!f&&!t.tolerateControlSyntax&&(a=true),m==="&&"||m==="||"){l(),u+=1;continue}if([";","|","&",`
194
+ `].includes(p)){l();continue}if(/\s/.test(p)){c();continue}r+=p;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let p=u.find(m=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(m));return p!==void 0&&Gs(p,t)})&&(a=true),{segments:n,malformed:a}}function vd(e){return _t(e).segments.flat().join(" ")}function kd(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 Ys(e,t){return kd(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 bd(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]===`
195
195
  `){o-=1;break}e[o]!==`
196
- `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function vd(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]!==`
196
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Sd(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]!==`
197
197
  `;)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]===`
198
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function he(e,t,n="infer"){let o=t?hd(e):n==="node"?wd(e):n==="python"?vd(e):e;return [...new Set(o.match(dd)??[])]}function kd(e){return _t(e).segments.flat()}function ye(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$1(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 bd(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>zs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function So(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=bd(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:zt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:ye(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ue(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=_d(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:ye(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:ye(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:ye(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Sd(e){let t=[e];extname(e)===""&&t.push(...Es.map(n=>`${e}${n}`),...Es.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function _d(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$1(t),e);return Sd(o)??o}function Rd(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]!==`
198
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function he(e,t,n="infer"){let o=t?vd(e):n==="node"?bd(e):n==="python"?Sd(e):e;return [...new Set(o.match(pd)??[])]}function _d(e){return _t(e).segments.flat()}function ye(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$1(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 Rd(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>zs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function So(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Rd(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:zt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:ye(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ue(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=Dd(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:ye(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:ye(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:ye(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Ed(e){let t=[e];extname(e)===""&&t.push(...Es.map(n=>`${e}${n}`),...Es.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Dd(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$1(t),e);return Ed(o)??o}function Pd(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]!==`
199
199
  `;)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===`
200
- `||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 Ed(e,t,n,o=true){let r=Rd(t),s=[],i=r.malformed,a=(p,m)=>{if(!p||p.kind!=="string"||!p.valid||p.value.length===0){i=true;return}s.push({value:p.value,cwd:dirname$1(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:m,issuerPath:e});},{tokens:c}=r;for(let p=0;p<c.length;p+=1){let m=c[p],f=c[p-1];if(m.kind!=="identifier")continue;if(m.value==="eval"&&f?.value!=="."&&c[p+1]?.value==="("){i=true;continue}if(m.value==="require"){if(f?.value==="."){c[p-2]?.value==="module"&&c[p+1]?.value==="("&&(i=true);continue}if(c[p+1]?.value==="("){let g=c[p+2];c[p+3]?.value===")"||(i=true),a(g,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(m.value))continue;if(m.value==="import"&&c[p+1]?.value==="("){let g=c[p+2];c[p+3]?.value===")"||(i=true),a(g,"esm");continue}if(m.value==="import"&&c[p+1]?.kind==="string"){a(c[p+1],"esm");continue}if(m.value==="import"&&c[p+1]?.value===".")continue;let d=-1;for(let g=p+1;g<Math.min(c.length,p+32)&&c[g].value!==";";g+=1)if(c[g].value==="from"){d=g;break}d>=0?a(c[d+1],"esm"):m.value==="import"&&(i=true);}let l=[],u=[];for(let p of s){let m=So(p,o);m.reference&&l.push(m.reference),m.inlineContent&&u.push(m.inlineContent),i||=m.malformed;}return {references:l,inlineContents:u,malformed:i}}function Dd(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]!==`
200
+ `||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 Cd(e,t,n,o=true){let r=Pd(t),s=[],i=r.malformed,a=(p,m)=>{if(!p||p.kind!=="string"||!p.valid||p.value.length===0){i=true;return}s.push({value:p.value,cwd:dirname$1(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:m,issuerPath:e});},{tokens:c}=r;for(let p=0;p<c.length;p+=1){let m=c[p],f=c[p-1];if(m.kind!=="identifier")continue;if(m.value==="eval"&&f?.value!=="."&&c[p+1]?.value==="("){i=true;continue}if(m.value==="require"){if(f?.value==="."){c[p-2]?.value==="module"&&c[p+1]?.value==="("&&(i=true);continue}if(c[p+1]?.value==="("){let g=c[p+2];c[p+3]?.value===")"||(i=true),a(g,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(m.value))continue;if(m.value==="import"&&c[p+1]?.value==="("){let g=c[p+2];c[p+3]?.value===")"||(i=true),a(g,"esm");continue}if(m.value==="import"&&c[p+1]?.kind==="string"){a(c[p+1],"esm");continue}if(m.value==="import"&&c[p+1]?.value===".")continue;let d=-1;for(let g=p+1;g<Math.min(c.length,p+32)&&c[g].value!==";";g+=1)if(c[g].value==="from"){d=g;break}d>=0?a(c[d+1],"esm"):m.value==="import"&&(i=true);}let l=[],u=[];for(let p of s){let m=So(p,o);m.reference&&l.push(m.reference),m.inlineContent&&u.push(m.inlineContent),i||=m.malformed;}return {references:l,inlineContents:u,malformed:i}}function Od(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]!==`
201
201
  `;)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,p=o;for(let f=0;f<u;f+=1)t[p+f]=" ";p+=u;let m=false;for(;p<e.length;){if(e[p]==="\\"){t[p]=" ",p+1<e.length&&(t[p+1]=" "),p+=2;continue}if(e.slice(p,p+u)===c.repeat(u)){for(let f=0;f<u;f+=1)t[p+f]=" ";p+=u,m=true;break}if(!l&&(e[p]===`
202
202
  `||e[p]==="\r"))break;e[p]!==`
203
- `&&e[p]!=="\r"&&(t[p]=" "),p+=1;}if(a){let f=e.slice(o+u,p-u);for(let d=0;d<f.length;d+=1)if(f[d]==="{"){if(f[d+1]==="{"){d+=1;continue}n=true;break}}n||=!m,o=p;}return {content:t.join(""),malformed:n}}function Ds(e,t){let n=t.split(".");if(n.length>bo)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 Pd(e,t,n){let o=Dd(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=p=>{let m=dirname$1(e);for(let f=1;f<p;f+=1)m=dirname$1(m);return m},a=p=>{let m=ye(p,{...n,cwd:dirname$1(e)},true,"python");m?r.push(m):s=true;},c=(p,m=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(p))return s=true,null;let f=i(m),d=Ds(f,p);s||=!d.resolved;for(let h of d.paths)a(h);let g=d.paths.at(-1);return g&&basename(g)==="__init__.py"?dirname$1(g):null},l=p=>{let m=[];for(let f of p.split(",")){let d=f.trim().split(/\s+as\s+/)[0];if(d==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(d)){s=true;continue}m.push(d);}return m},u=(p,m)=>{for(let f of l(m))p&&Ds(p,f).resolved&&(s=true);};for(let p of o.content.split(/\r?\n/))for(let m of p.split(/[;:]/)){let f=m.trim();if(f.startsWith("import ")){let w=f.slice(7).split(",");for(let b of w)c(b.trim().split(/\s+as\s+/)[0]);continue}let d=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!d)continue;let g=d[1].length,h=d[2];if(h){let w=c(h,g);u(w,d[3]);continue}if(g===0){s=true;continue}let y=i(g),v=join$1(y,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),u(y,d[3]);continue}for(let w of l(d[3]))c(w,g);}return {references:[...new Map(r.map(p=>[p.path,p])).values()],inlineContents:[],malformed:s}}function Zs(e,t,n,o,r=true){return n==="node"?Ed(e,t,o,r):n==="python"?Pd(e,t,o):{references:[],inlineContents:[],malformed:false}}function Ps(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Yt(e,0,r),i=new Set((s.artifacts??[]).map(m=>m.value)),a=s.tokens.filter(m=>!i.has(m)).map(m=>ye(m,r)).filter(m=>m!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let m of s.artifacts??[]){if(m.nodeResolutionKind){let d=So(m);d.reference&&c.push(d.reference),d.inlineContent&&l.push(d.inlineContent),u||=d.malformed;continue}let f=ye(m.value,{...r,cwd:m.cwd},true,m.parserKind);f?c.push(f):u=true;}let p=[...a,...c];return {references:[...new Map(p.map(m=>[`${m.path}:${m.parserKind}`,m])).values()],inlineContents:l,malformed:u}}function Qs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ue(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 zt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function wt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Nd(e,t,n){let o=[],r=[],s=false,i=(u,p)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:p}),s||=Ue(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(jd.has(u))return a();if(xd.has(u)){l=true,c+=1;continue}let p=Cs.has(u)?"cjs":Os.has(u)?"esm":null;if(p){let h=e[c+1];if(!h)return a(true);i(h,p),c+=2;continue}let m=wt(u,Cs),f=wt(u,Os),d=m??f;if(d!==null){if(!d)return a(true);i(d,m!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(xs.has(u)){let h=e[c+1];return a(h===void 0?true:s||zt(h))}let g=wt(u,xs);if(g!==null)return a(s||zt(g));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||zt(u.slice(2)));if(js.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(wt(u,js)!==null){c+=1;continue}if(Od.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Td(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:Ue(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Yt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Ad.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:Ue(i)}}return {tokens:[],malformed:true}}function Md(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:Ue(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:Ue(r)};if(Id.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Ns.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(wt(r,Ns)!==null){o+=1;continue}if($d.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function co(e,t){let n=ye(e,t,true);if(!n)return null;let o=Ce(n.path),r=Ce(t.project);return !o||!r||!Pe(r,o)?null:o}function Hd(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(Qs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=_t(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?co(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=co(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=co(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 Yt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Vs)return {tokens:[],malformed:true};let r=_t(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Xs(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 Xs(e,t,n,o){let r=0;for(;Qs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Ld.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Vs)return {tokens:i,malformed:true};let g=Hd(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=Xs(g.replacement,a,g.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=g.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Gs(l,o),p=c&&!Fd.has(l);if(u||p)return {tokens:i,malformed:true};let m=Ue(s);i.push(s);let f=l;if(!Cd.has(f))return {tokens:i,malformed:m};let d=["node","tsx"].includes(f)?Nd(e,r+1,n):["bash","sh","zsh"].includes(f)?Td(e,r+1,a,n,o):Md(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:m||d.malformed}}function ei(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Ce(t.slice(0,o))}function Wd(e,t){let n=new Map;for(let o of t)for(let r of kd(o)){let s=ei(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 Ud(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function qd(e){return e.slice(e.lastIndexOf("@")+1)}function As(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Ce(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Bd(e,t,n){let o=qd(e),r=W(t.extraKnownMarketplaces),s=W(r?.[o]);if(s){let i=W(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?As(i.path):null}}try{let i=W(qe(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?As(c.path):null}}}catch{}return {configured:false,root:null}}function $s(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 Kd(e,t){let n=W(e.entry),o=W(t.entry),r=$s(n),s=$s(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Zt(n.version):null,a=typeof o?.version=="string"?Zt(o.version):null;if(i&&a){let c=ti(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Jd(e,t){try{let n=W(qe(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=W(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort(Kd)[0],i=W(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Ce(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Zt(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 ti(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 Vd(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$1(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=W(qe(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=Zt(a.version),u=Zt(c.version);if(l&&u){let p=ti(u,l);if(p!==0)return p}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Ce(i[0].path):null}function zd(e,t){if(t.legacyArtifactRoots!==void 0){let w=t.legacyArtifactRoots.map(b=>Ce(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:w,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:w.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 w of l)if(existsSync$1(w))try{let b=W(qe(w));if(!b)throw new Error("settings must be an object");i.push({path:w,settings:b});}catch{a.push(w);}if(i.reduce((w,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:w,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let p=i.map(w=>{let b=[];return bt(w.settings.hooks,b),{path:w.path,commands:b}}),m=p.flatMap(w=>w.commands),f=p.flatMap(w=>Wd(w.path,w.commands)),g=[...i.reduce((w,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return w;for(let[T,V]of Object.entries(_))Ud(T)&&typeof V=="boolean"&&w.set(T,V);return w},new Map)].filter(([,w])=>w).map(([w])=>w).sort(),h=[...f],y=false;for(let w of g){let b=Jd(w,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let T=i.map(Y=>Bd(w,Y.settings,r)).filter(Y=>Y.configured),V=T[T.length-1];V?_=V.root:_=Vd(w,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let v=[...h.reduce((w,b)=>{let _=w.get(b.root);return _?(w.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),w):(w.set(b.root,b),w)},new Map).values()],R=[m.length>0?"settings-hooks":null,g.length>0?"enabled-plugin":null].filter(w=>w!==null);return {targets:v,configCommands:p.filter(w=>w.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||m.length>0)&&!y&&a.length===0&&c.length===0}}function Gd(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$1(t);if(o===t)return;t=o;}}function bt(e,t){if(Array.isArray(e)){for(let n of e)bt(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):bt(o,t);}function lo(e){return [...e.matchAll(gd)].map(t=>t[1])}function Yd(e){let t=new Map,n=_t(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 Zd(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 Qd(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 uo(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 yo(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Vt)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>Vt)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Vt+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>Vt)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 wo(e,t){return `${e} (${t})`}function Xd(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>bo){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),p=resolve(c.containmentRoot),m;try{m=realpathSync.native(p);}catch{m=p;}if(!existsSync$1(u)){Pe(p,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(m,f)){o.escapedArtifacts.push(u);return}let d=`${f}:${c.parserKind}:${c.cwd}`;s.has(d)||(s.add(d),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Ps(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let p of he(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:p});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Js){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=yo(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(wo(l,u.reason));continue}let{content:p}=u;o.inspected.push(l);let m=c.parserKind==="infer"?Ys(l,p):c.parserKind,f=m==="shell";for(let d of he(p,f,m))o.findings.push({artifact:l,endpoint:d});if(f){let d=Ps(p,e,t,c.cwd);d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of he(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}else if(m==="node"||m==="python"){let d=Zs(l,p,m,{project:e,homePath:t,cwd:dirname$1(l)});d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of he(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}}}function eg(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Gd(r),c=0,l=(f,d=false,g=r,h="infer",y=e,v=0)=>{if(v>bo){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(g),w=resolve(f);if(!existsSync$1(w)){if(!Pe(R,w)){o.escapedArtifacts.push(w);return}d&&o.missing.push(w);return}let b;try{b=realpathSync.native(w);}catch{d&&o.missing.push(w);return}if(!Pe(R,b)){o.escapedArtifacts.push(w);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:v}));},u=(f,d,g,h=0)=>{for(let y of lo(f)){let v=uo(r,y);if(!v)continue;let R=(d.artifacts??[]).find(w=>w.value.includes("PLUGIN_ROOT")&&w.value.endsWith(y));l(v,true,r,R?.parserKind??"infer",R?.cwd??g,h);}},p=(f,d,g=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?So(y,!h):{reference:ye(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let R of he(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??d,g);}},m=f=>{for(let g of he(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:g});let d=Yt(f,0,{project:e,homePath:t,cwd:e});d.malformed&&o.malformedCommands.push(f),u(f,d,e),p(d,e);for(let g of d.tokens){if(!isAbsolute(g))continue;let h=ei(g),y=(d.artifacts??[]).find(v=>v.value===g);h===r&&l(g,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)m(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),d=join$1(r,"hooks.json"),g=existsSync$1(d)?d:f;if(!existsSync$1(g))o.missing.push(g),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(g);let h;try{h=realpathSync.native(g);}catch{o.missing.push(g),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(g),l(join$1(r,"hooks","session-start")),h=""),h){let y=yo(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(wo(g,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(g),l(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(y.content),R=[];bt(v,R);for(let w of R)m(w);}catch{o.malformedConfigs.push(g),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Js){o.traversalLimitRoots.push(r);break}let f=s.shift(),d=f.path;c+=1;let g=yo(d);if(g.kind==="missing"){o.missing.push(d);continue}if(g.kind==="unsafe"){o.unsafeArtifacts.push(wo(d,g.reason));continue}let{content:h}=g;o.inspected.push(d);let y=f.parserKind==="infer"?Ys(d,h):f.parserKind,v=y==="shell";for(let b of he(h,v,y))o.findings.push({artifact:d,endpoint:b});if(v){let b=Yd(h),_=Yt(b,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});Zd(h)&&o.malformedCommands.push(d),u(b,_,dirname$1(d),f.depth+1),p(_,dirname$1(d),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Zs(d,h,y,{project:e,homePath:t,cwd:dirname$1(d)},false);(y==="node"?Qd(d):b.malformed)&&o.malformedCommands.push(d);for(let _ of b.inlineContents)for(let T of he(_.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 lo(h)){let T=uo(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of lo(h)){let _=uo(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let R=d.startsWith(`${r}/`)?d.slice(r.length+1):"",w=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${w}.ts`),false,a),R.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${w}.js`));}}function tg(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=W(qe(t)),r=W(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=W(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Ce(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 Is(e){try{let t=W(qe(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function ng(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=tg(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 p=existsSync$1(l)?l:u;try{let v=W(qe(p)),R=W(v?.hooks),w=[];bt(R?.SessionStart,w),w.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 m=Is(i),f=Is(a),d=o.get(s)??[],g={root:s,packageVersion:m,manifestVersion:f,registryVersions:d};n.versionRecords.push(g),(!m||!f||m!==f||d.some(v=>v!==m))&&n.versionIssues.push(g);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function og(e,t){let n=zd(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let j of n.configCommands){o.configsInspected.push(j.path);for(let B of j.commands){o.commandsInspected.push({configPath:j.path,command:B});for(let x of he(B,true))o.findings.push({artifact:j.path,endpoint:x});}}Xd(e,t.homePath??homedir$1(),n.configCommands.flatMap(j=>j.commands).filter(j=>!n.targets.some(B=>B.commands?.includes(j))),o);for(let j of n.targets)eg(e,t.homePath??homedir$1(),j,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((j,B,x)=>x.findIndex(N=>N.configPath===j.configPath&&N.command===j.command)===B),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],p=[...new Set(o.traversalLimitRoots)],m=[...new Set(o.escapedArtifacts)],f=o.findings.filter((j,B,x)=>x.findIndex(N=>N.artifact===j.artifact&&N.endpoint===j.endpoint)===B),d=a.length>0||m.length>0||u.length>0,g=d&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=ng(n.targets,t),y=t.claudeSettingsPath?dirname$1(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname$1(y):y)??homedir$1(),R=n.targets.map(j=>j.root).find(j=>existsSync$1(join$1(j,"skills")))??null,w=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:R?{root:R,version:null}:$e(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=w.root,_=b?at(v,b):[],T=_.filter(j=>!j.isKnownDevFlowArtifact).map(j=>({skillName:j.skillName,path:j.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),V=[{key:"active_plugin_resolution",value:g,target:"resolved active DevFlow hook configuration",ok:n.ok&&!d,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(j=>j.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:p,target:[],ok:p.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:m.length,target:0,ok:m.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"}],Y=w.version??h.versionRecords.find(j=>j.root===b)?.packageVersion;return Y&&V.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(V),metrics:V}}function rg(e){let t=dirname$1(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 Xt(e){let t=rg(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)/nt: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 sg(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=X(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:q(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:I(n),metrics:n}}function ig(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:I(n),metrics:n};let r;try{if(r=X(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*nt,i=r.prepare(`
203
+ `&&e[p]!=="\r"&&(t[p]=" "),p+=1;}if(a){let f=e.slice(o+u,p-u);for(let d=0;d<f.length;d+=1)if(f[d]==="{"){if(f[d+1]==="{"){d+=1;continue}n=true;break}}n||=!m,o=p;}return {content:t.join(""),malformed:n}}function Ds(e,t){let n=t.split(".");if(n.length>bo)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 jd(e,t,n){let o=Od(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=p=>{let m=dirname$1(e);for(let f=1;f<p;f+=1)m=dirname$1(m);return m},a=p=>{let m=ye(p,{...n,cwd:dirname$1(e)},true,"python");m?r.push(m):s=true;},c=(p,m=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(p))return s=true,null;let f=i(m),d=Ds(f,p);s||=!d.resolved;for(let h of d.paths)a(h);let g=d.paths.at(-1);return g&&basename(g)==="__init__.py"?dirname$1(g):null},l=p=>{let m=[];for(let f of p.split(",")){let d=f.trim().split(/\s+as\s+/)[0];if(d==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(d)){s=true;continue}m.push(d);}return m},u=(p,m)=>{for(let f of l(m))p&&Ds(p,f).resolved&&(s=true);};for(let p of o.content.split(/\r?\n/))for(let m of p.split(/[;:]/)){let f=m.trim();if(f.startsWith("import ")){let w=f.slice(7).split(",");for(let b of w)c(b.trim().split(/\s+as\s+/)[0]);continue}let d=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!d)continue;let g=d[1].length,h=d[2];if(h){let w=c(h,g);u(w,d[3]);continue}if(g===0){s=true;continue}let y=i(g),v=join$1(y,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),u(y,d[3]);continue}for(let w of l(d[3]))c(w,g);}return {references:[...new Map(r.map(p=>[p.path,p])).values()],inlineContents:[],malformed:s}}function Zs(e,t,n,o,r=true){return n==="node"?Cd(e,t,o,r):n==="python"?jd(e,t,o):{references:[],inlineContents:[],malformed:false}}function Ps(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Yt(e,0,r),i=new Set((s.artifacts??[]).map(m=>m.value)),a=s.tokens.filter(m=>!i.has(m)).map(m=>ye(m,r)).filter(m=>m!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let m of s.artifacts??[]){if(m.nodeResolutionKind){let d=So(m);d.reference&&c.push(d.reference),d.inlineContent&&l.push(d.inlineContent),u||=d.malformed;continue}let f=ye(m.value,{...r,cwd:m.cwd},true,m.parserKind);f?c.push(f):u=true;}let p=[...a,...c];return {references:[...new Map(p.map(m=>[`${m.path}:${m.parserKind}`,m])).values()],inlineContents:l,malformed:u}}function Qs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ue(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 zt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function wt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Id(e,t,n){let o=[],r=[],s=false,i=(u,p)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:p}),s||=Ue(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($d.has(u))return a();if(Ad.has(u)){l=true,c+=1;continue}let p=Cs.has(u)?"cjs":Os.has(u)?"esm":null;if(p){let h=e[c+1];if(!h)return a(true);i(h,p),c+=2;continue}let m=wt(u,Cs),f=wt(u,Os),d=m??f;if(d!==null){if(!d)return a(true);i(d,m!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(js.has(u)){let h=e[c+1];return a(h===void 0?true:s||zt(h))}let g=wt(u,js);if(g!==null)return a(s||zt(g));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||zt(u.slice(2)));if(xs.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(wt(u,xs)!==null){c+=1;continue}if(Nd.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Fd(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:Ue(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Yt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Td.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:Ue(i)}}return {tokens:[],malformed:true}}function Hd(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:Ue(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:Ue(r)};if(Ld.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Ns.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(wt(r,Ns)!==null){o+=1;continue}if(Md.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function co(e,t){let n=ye(e,t,true);if(!n)return null;let o=Ce(n.path),r=Ce(t.project);return !o||!r||!Pe(r,o)?null:o}function qd(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(Qs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=_t(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?co(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=co(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=co(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 Yt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Vs)return {tokens:[],malformed:true};let r=_t(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Xs(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 Xs(e,t,n,o){let r=0;for(;Qs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Wd.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Vs)return {tokens:i,malformed:true};let g=qd(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=Xs(g.replacement,a,g.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=g.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Gs(l,o),p=c&&!Ud.has(l);if(u||p)return {tokens:i,malformed:true};let m=Ue(s);i.push(s);let f=l;if(!xd.has(f))return {tokens:i,malformed:m};let d=["node","tsx"].includes(f)?Id(e,r+1,n):["bash","sh","zsh"].includes(f)?Fd(e,r+1,a,n,o):Hd(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:m||d.malformed}}function ei(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Ce(t.slice(0,o))}function Bd(e,t){let n=new Map;for(let o of t)for(let r of _d(o)){let s=ei(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 Kd(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Jd(e){return e.slice(e.lastIndexOf("@")+1)}function As(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Ce(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Vd(e,t,n){let o=Jd(e),r=W(t.extraKnownMarketplaces),s=W(r?.[o]);if(s){let i=W(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?As(i.path):null}}try{let i=W(qe(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?As(c.path):null}}}catch{}return {configured:false,root:null}}function $s(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 zd(e,t){let n=W(e.entry),o=W(t.entry),r=$s(n),s=$s(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Zt(n.version):null,a=typeof o?.version=="string"?Zt(o.version):null;if(i&&a){let c=ti(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Gd(e,t){try{let n=W(qe(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=W(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort(zd)[0],i=W(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Ce(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Zt(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 ti(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 Yd(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$1(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=W(qe(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=Zt(a.version),u=Zt(c.version);if(l&&u){let p=ti(u,l);if(p!==0)return p}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Ce(i[0].path):null}function Zd(e,t){if(t.legacyArtifactRoots!==void 0){let w=t.legacyArtifactRoots.map(b=>Ce(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:w,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:w.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 w of l)if(existsSync$1(w))try{let b=W(qe(w));if(!b)throw new Error("settings must be an object");i.push({path:w,settings:b});}catch{a.push(w);}if(i.reduce((w,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:w,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let p=i.map(w=>{let b=[];return bt(w.settings.hooks,b),{path:w.path,commands:b}}),m=p.flatMap(w=>w.commands),f=p.flatMap(w=>Bd(w.path,w.commands)),g=[...i.reduce((w,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return w;for(let[T,V]of Object.entries(_))Kd(T)&&typeof V=="boolean"&&w.set(T,V);return w},new Map)].filter(([,w])=>w).map(([w])=>w).sort(),h=[...f],y=false;for(let w of g){let b=Gd(w,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let T=i.map(Y=>Vd(w,Y.settings,r)).filter(Y=>Y.configured),V=T[T.length-1];V?_=V.root:_=Yd(w,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let v=[...h.reduce((w,b)=>{let _=w.get(b.root);return _?(w.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),w):(w.set(b.root,b),w)},new Map).values()],R=[m.length>0?"settings-hooks":null,g.length>0?"enabled-plugin":null].filter(w=>w!==null);return {targets:v,configCommands:p.filter(w=>w.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||m.length>0)&&!y&&a.length===0&&c.length===0}}function Qd(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$1(t);if(o===t)return;t=o;}}function bt(e,t){if(Array.isArray(e)){for(let n of e)bt(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):bt(o,t);}function lo(e){return [...e.matchAll(fd)].map(t=>t[1])}function Xd(e){let t=new Map,n=_t(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 eg(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 tg(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 uo(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 yo(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Vt)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>Vt)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Vt+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>Vt)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 wo(e,t){return `${e} (${t})`}function ng(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>bo){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),p=resolve(c.containmentRoot),m;try{m=realpathSync.native(p);}catch{m=p;}if(!existsSync$1(u)){Pe(p,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(m,f)){o.escapedArtifacts.push(u);return}let d=`${f}:${c.parserKind}:${c.cwd}`;s.has(d)||(s.add(d),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Ps(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let p of he(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:p});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Js){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=yo(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(wo(l,u.reason));continue}let{content:p}=u;o.inspected.push(l);let m=c.parserKind==="infer"?Ys(l,p):c.parserKind,f=m==="shell";for(let d of he(p,f,m))o.findings.push({artifact:l,endpoint:d});if(f){let d=Ps(p,e,t,c.cwd);d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of he(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}else if(m==="node"||m==="python"){let d=Zs(l,p,m,{project:e,homePath:t,cwd:dirname$1(l)});d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of he(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}}}function og(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Qd(r),c=0,l=(f,d=false,g=r,h="infer",y=e,v=0)=>{if(v>bo){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(g),w=resolve(f);if(!existsSync$1(w)){if(!Pe(R,w)){o.escapedArtifacts.push(w);return}d&&o.missing.push(w);return}let b;try{b=realpathSync.native(w);}catch{d&&o.missing.push(w);return}if(!Pe(R,b)){o.escapedArtifacts.push(w);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:v}));},u=(f,d,g,h=0)=>{for(let y of lo(f)){let v=uo(r,y);if(!v)continue;let R=(d.artifacts??[]).find(w=>w.value.includes("PLUGIN_ROOT")&&w.value.endsWith(y));l(v,true,r,R?.parserKind??"infer",R?.cwd??g,h);}},p=(f,d,g=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?So(y,!h):{reference:ye(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let R of he(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??d,g);}},m=f=>{for(let g of he(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:g});let d=Yt(f,0,{project:e,homePath:t,cwd:e});d.malformed&&o.malformedCommands.push(f),u(f,d,e),p(d,e);for(let g of d.tokens){if(!isAbsolute(g))continue;let h=ei(g),y=(d.artifacts??[]).find(v=>v.value===g);h===r&&l(g,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)m(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),d=join$1(r,"hooks.json"),g=existsSync$1(d)?d:f;if(!existsSync$1(g))o.missing.push(g),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(g);let h;try{h=realpathSync.native(g);}catch{o.missing.push(g),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(g),l(join$1(r,"hooks","session-start")),h=""),h){let y=yo(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(wo(g,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(g),l(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(y.content),R=[];bt(v,R);for(let w of R)m(w);}catch{o.malformedConfigs.push(g),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Js){o.traversalLimitRoots.push(r);break}let f=s.shift(),d=f.path;c+=1;let g=yo(d);if(g.kind==="missing"){o.missing.push(d);continue}if(g.kind==="unsafe"){o.unsafeArtifacts.push(wo(d,g.reason));continue}let{content:h}=g;o.inspected.push(d);let y=f.parserKind==="infer"?Ys(d,h):f.parserKind,v=y==="shell";for(let b of he(h,v,y))o.findings.push({artifact:d,endpoint:b});if(v){let b=Xd(h),_=Yt(b,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});eg(h)&&o.malformedCommands.push(d),u(b,_,dirname$1(d),f.depth+1),p(_,dirname$1(d),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Zs(d,h,y,{project:e,homePath:t,cwd:dirname$1(d)},false);(y==="node"?tg(d):b.malformed)&&o.malformedCommands.push(d);for(let _ of b.inlineContents)for(let T of he(_.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 lo(h)){let T=uo(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of lo(h)){let _=uo(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let R=d.startsWith(`${r}/`)?d.slice(r.length+1):"",w=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${w}.ts`),false,a),R.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${w}.js`));}}function rg(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=W(qe(t)),r=W(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=W(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Ce(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 Is(e){try{let t=W(qe(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function sg(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=rg(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 p=existsSync$1(l)?l:u;try{let v=W(qe(p)),R=W(v?.hooks),w=[];bt(R?.SessionStart,w),w.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 m=Is(i),f=Is(a),d=o.get(s)??[],g={root:s,packageVersion:m,manifestVersion:f,registryVersions:d};n.versionRecords.push(g),(!m||!f||m!==f||d.some(v=>v!==m))&&n.versionIssues.push(g);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function ig(e,t){let n=Zd(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let x of n.configCommands){o.configsInspected.push(x.path);for(let B of x.commands){o.commandsInspected.push({configPath:x.path,command:B});for(let j of he(B,true))o.findings.push({artifact:x.path,endpoint:j});}}ng(e,t.homePath??homedir$1(),n.configCommands.flatMap(x=>x.commands).filter(x=>!n.targets.some(B=>B.commands?.includes(x))),o);for(let x of n.targets)og(e,t.homePath??homedir$1(),x,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((x,B,j)=>j.findIndex(N=>N.configPath===x.configPath&&N.command===x.command)===B),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],p=[...new Set(o.traversalLimitRoots)],m=[...new Set(o.escapedArtifacts)],f=o.findings.filter((x,B,j)=>j.findIndex(N=>N.artifact===x.artifact&&N.endpoint===x.endpoint)===B),d=a.length>0||m.length>0||u.length>0,g=d&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=sg(n.targets,t),y=t.claudeSettingsPath?dirname$1(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname$1(y):y)??homedir$1(),R=n.targets.map(x=>x.root).find(x=>existsSync$1(join$1(x,"skills")))??null,w=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:R?{root:R,version:null}:$e(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=w.root,_=b?at(v,b):[],T=_.filter(x=>!x.isKnownDevFlowArtifact).map(x=>({skillName:x.skillName,path:x.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),V=[{key:"active_plugin_resolution",value:g,target:"resolved active DevFlow hook configuration",ok:n.ok&&!d,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(x=>x.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:p,target:[],ok:p.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:m.length,target:0,ok:m.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"}],Y=w.version??h.versionRecords.find(x=>x.root===b)?.packageVersion;return Y&&V.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(V),metrics:V}}function ag(e){let t=dirname$1(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 Xt(e){let t=ag(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)/nt: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 cg(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=X(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:q(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:I(n),metrics:n}}function lg(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:I(n),metrics:n};let r;try{if(r=X(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*nt,i=r.prepare(`
204
204
  SELECT source, COUNT(*) count FROM memories
205
205
  WHERE created_at >= ? GROUP BY source ORDER BY source
206
206
  `).all(s),a=r.prepare(`
@@ -218,14 +218,14 @@ Reviewed ${o}/${t.length} pending memories.`);}var Le=C(()=>{Se();});var fs={};O
218
218
  SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
219
219
  FROM observations
220
220
  WHERE source = 'explicit_intent' AND quality_status = 'accepted'
221
- `).get(),u=Number(l?.total??0),p=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?p/u:1,target:1,ok:u===0||p===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:I(n),metrics:n}}function ag(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:I(n),metrics:n};let r;try{if(r=X(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(m=>Number(m.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(),p=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:p?"trigram":"missing/non-trigram",target:"trigram",ok:p,severity:"warning"}),M(r,"knowledge_source_readiness")){let m=r.prepare(`
221
+ `).get(),u=Number(l?.total??0),p=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?p/u:1,target:1,ok:u===0||p===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:I(n),metrics:n}}function ug(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:I(n),metrics:n};let r;try{if(r=X(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(m=>Number(m.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(),p=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:p?"trigram":"missing/non-trigram",target:"trigram",ok:p,severity:"warning"}),M(r,"knowledge_source_readiness")){let m=r.prepare(`
222
222
  SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
223
223
  FROM knowledge_source_readiness ORDER BY source
224
- `).all(),f=m.filter(g=>Number(g.documents??0)>0||Number(g.chunks??0)>0),d=f.length>0?Math.min(...f.map(g=>Number(g.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:m,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(g=>g.status==="ready"&&Number(g.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:d,target:">= 0.95",ok:f.length>0&&d>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:I(n),metrics:n}}function cg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:I(n),metrics:n}}function lg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:I(n),metrics:n}}function ug(e){let{manifest:t,metrics:n}=Xt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["projectDiagnosticCodeResult","getDiagnosticMemoryResult","getDiagnosticKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:I(n),metrics:n}}async function dg(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 gg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeState(oe(e));if((!r||r.status!=="ready")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:I(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/ready`;try{let a=await(e.httpGet??dg)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:I(n),metrics:n}}async function _o(e={},t={}){let n=e.project??process.cwd(),o=mo(n),r=cg(t),s=await Vu(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Gu(n,t),td(o.path,t),og(o.path,t),await rd(o.path,t),sd(o.path,!!e.strict,t),sg(o.path,t),ig(o.path,t),ag(o.path,t),r,lg(t),ad(t),cd(o.path,t),ug(t),id(t),await gg(t),ud(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 mg(e,t={}){return e===void 0?oi():_o(e,t)}function Ts(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ni(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?k.green:n.status==="yellow"?k.yellow:k.red;t.push(`${r(o)} ${k.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Ts(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ts(s.value)}${i}`);}}return t.join(`
225
- `)}async function pg(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await _o(e,n);return t.stdout(e.json?JSON.stringify(o):ni(o)),o.exitCode}async function en(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function oi(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await en(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,p=0;try{let h=await o.getAll();u=!!h?.project,p=Object.keys(h?.user??{}).length;}catch{}let m=0;try{m=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let d=await ot(),g=0;return a.fileCount>0&&(g+=25),a.nodeCount>0&&(g+=15),c.nodes.length>0&&(g+=20),u&&(g+=15),m>0&&(g+=10),l>0&&(g+=5),d.running&&(g+=10),f.total>0&&(g+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:p},knowledge:{sources:m},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:d.running},toolCalls:f,readyScore:g}}async function fg(){let{data:e}=await en(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 hg(){let{data:e}=await en(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 yg(e){let{data:t}=await en(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 wg(){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 Jt,Yu,po,ed,nt,ho,_s,dd,gd,Js,Vt,bo,Vs,zs,md,pd,fd,Es,Cd,Cs,Os,xs,js,Od,xd,jd,Ad,$d,Ns,Id,Ld,Fd,si=C(()=>{Ve();ie();no();Yu={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},po=3600*1e3;ed=new Set(["pending","committed","expired"]);nt=1440*60*1e3,ho=30*nt,_s=60*1024*1024;dd=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,gd=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Js=64,Vt=1024*1024,bo=8,Vs=8,zs=64*1024;md=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),pd=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),fd=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Es=[".cjs",".js",".mjs",".ts",".tsx"];Cd=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Cs=new Set(["-r","--require"]),Os=new Set(["--experimental-loader","--import","--loader"]),xs=new Set(["-e","--eval","-p","--print"]),js=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Od=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),xd=new Set(["--check","-c"]),jd=new Set(["--help","--version","-h","-v"]);Ad=new Set(["-e","-eu","-o","-u","-ue"]),$d=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Ns=new Set(["-W","-X","--check-hash-based-pycs"]),Id=new Set(["--help","--version","-h","-V"]);Ld=new Set(["builtin","command","env","exec","nohup","timeout"]),Fd=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ii={};O(ii,{runMemoryMaintainCommand:()=>Sg});function bg(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 Sg(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:bg(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(`
226
- `)}var ai=C(()=>{});var ci={};O(ci,{generateToken:()=>Eg});async function Eg(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 li=C(()=>{});var Ro={};O(Ro,{reportBenchmarkCommand:()=>xg,runBenchmarkCommand:()=>Og});async function Og(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}
224
+ `).all(),f=m.filter(g=>Number(g.documents??0)>0||Number(g.chunks??0)>0),d=f.length>0?Math.min(...f.map(g=>Number(g.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:m,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(g=>g.status==="ready"&&Number(g.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:d,target:">= 0.95",ok:f.length>0&&d>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:I(n),metrics:n}}function dg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:I(n),metrics:n}}function gg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:I(n),metrics:n}}function mg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["projectDiagnosticCodeResult","getDiagnosticMemoryResult","getDiagnosticKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:I(n),metrics:n}}async function pg(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 fg(e){let{manifest:t,metrics:n}=Xt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeState(oe(e));if((!r||r.status!=="ready")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:I(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/ready`;try{let a=await(e.httpGet??pg)(i);n.push({key:"dashboard_server_health",value:{url:i,status:a.status},target:"HTTP 200",ok:a.status===200,severity:"warning"});}catch(a){n.push({key:"dashboard_server_health",value:a.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:I(n),metrics:n}}async function _o(e={},t={}){let n=e.project??process.cwd(),o=mo(n),r=dg(t),s=await Yu(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Qu(n,t),rd(o.path,t),ig(o.path,t),await ad(o.path,t),cd(o.path,!!e.strict,t),cg(o.path,t),lg(o.path,t),ug(o.path,t),r,gg(t),ud(t),dd(o.path,t),mg(t),ld(t),await fg(t),md(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 hg(e,t={}){return e===void 0?oi():_o(e,t)}function Ts(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ni(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?k.green:n.status==="yellow"?k.yellow:k.red;t.push(`${r(o)} ${k.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Ts(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ts(s.value)}${i}`);}}return t.join(`
225
+ `)}async function yg(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await _o(e,n);return t.stdout(e.json?JSON.stringify(o):ni(o)),o.exitCode}async function en(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function oi(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await en(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,p=0;try{let h=await o.getAll();u=!!h?.project,p=Object.keys(h?.user??{}).length;}catch{}let m=0;try{m=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let d=await ot(),g=0;return a.fileCount>0&&(g+=25),a.nodeCount>0&&(g+=15),c.nodes.length>0&&(g+=20),u&&(g+=15),m>0&&(g+=10),l>0&&(g+=5),d.running&&(g+=10),f.total>0&&(g+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:p},knowledge:{sources:m},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:d.running},toolCalls:f,readyScore:g}}async function wg(){let{data:e}=await en(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 vg(){let{data:e}=await en(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 kg(e){let{data:t}=await en(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 bg(){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 Jt,Xu,po,od,nt,ho,_s,pd,fd,Js,Vt,bo,Vs,zs,hd,yd,wd,Es,xd,Cs,Os,js,xs,Nd,Ad,$d,Td,Md,Ns,Ld,Wd,Ud,si=C(()=>{Ve();ie();no();Xu={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},po=3600*1e3;od=new Set(["pending","committed","expired"]);nt=1440*60*1e3,ho=30*nt,_s=60*1024*1024;pd=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,fd=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Js=64,Vt=1024*1024,bo=8,Vs=8,zs=64*1024;hd=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),yd=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),wd=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Es=[".cjs",".js",".mjs",".ts",".tsx"];xd=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Cs=new Set(["-r","--require"]),Os=new Set(["--experimental-loader","--import","--loader"]),js=new Set(["-e","--eval","-p","--print"]),xs=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Nd=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Ad=new Set(["--check","-c"]),$d=new Set(["--help","--version","-h","-v"]);Td=new Set(["-e","-eu","-o","-u","-ue"]),Md=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Ns=new Set(["-W","-X","--check-hash-based-pycs"]),Ld=new Set(["--help","--version","-h","-V"]);Wd=new Set(["builtin","command","env","exec","nohup","timeout"]),Ud=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ii={};O(ii,{runMemoryMaintainCommand:()=>Eg});function Rg(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 Eg(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Rg(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(`
226
+ `)}var ai=C(()=>{});var ci={};O(ci,{generateToken:()=>Cg});async function Cg(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 li=C(()=>{});var Ro={};O(Ro,{reportBenchmarkCommand:()=>Ag,runBenchmarkCommand:()=>Ng});async function Ng(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}
227
227
 
228
- Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function xg(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=jg(o,n);return r==="markdown"?`${s}
228
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Ag(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=$g(o,n);return r==="markdown"?`${s}
229
229
  ## Change From Prior Baseline
230
230
 
231
231
  ${i.map(a=>`- ${a}`).join(`
@@ -234,19 +234,19 @@ ${i.map(a=>`- ${a}`).join(`
234
234
 
235
235
  Change from ${o.runId}:
236
236
  ${i.map(a=>`- ${a}`).join(`
237
- `)}`}function jg(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [tn("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),tn("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),tn("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),tn("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function tn(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 Eo=C(()=>{});var Po={};O(Po,{reportEvaluationCommand:()=>Fg,runEvaluationCommand:()=>Lg});async function Lg(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=Hg(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:${nn(JSON.stringify(c)).slice(0,24)}`},p={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:nn(c.prompt),toolProfileHash:nn("benchmark-context-deep:r3.v1"),acceptanceHash:nn(JSON.stringify(t.tasks.find(m=>m.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({...p,evidenceReceipt:createTrialReceipt(p)});}}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 Fg(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 Hg(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function nn(e){return createHash("sha256").update(e).digest("hex")}var Co=C(()=>{});var fi={};O(fi,{runReview:()=>Wg});async function Wg(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"),[k.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?k.red(`Critical (${i.length})`):"",...i.map(u=>` ${k.red("\u25CF")} ${u}`),"",a.length>0?k.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${k.yellow("\u25CB")} ${u}`),"",c.length>0?k.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${k.green("\u25CB")} ${u}`),"",i.length>0?k.red("Overall: Need changes"):a.length>0?k.yellow("Overall: Approve with comments"):k.green("Overall: LGTM")].join(`
238
- `)}var hi=C(()=>{});var Rt={};O(Rt,{resolveRuntimeLocale:()=>wi,runtimeMessage:()=>ee,runtimeMessages:()=>yi});function wi(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function ee(e,t={},n){return yi[wi(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var yi,Oe=C(()=>{yi={en:{starting:"Starting the DevFlow Runtime...",ready:"Dashboard ready at {url}",reused:"Reused the existing DevFlow Runtime.",stopped:"DevFlow Runtime stopped.",notRunning:"No DevFlow Runtime is running.",portInUse:"Port {port} is already in use.",bundleMissing:"The Dashboard bundle is missing from this installation.",projectRequired:"Choose a project with --project <path>.",ownerMismatch:"Runtime ownership could not be verified; no process was stopped.",runtimeFailed:"DevFlow Runtime could not be started: {message}",openingFailed:"The Dashboard is ready, but the browser could not be opened: {message}",running:"DevFlow Runtime is running at {url} (PID {pid}, generation {generation}).",statusHeader:"DevFlow Status",dashboardUnavailable:"Dashboard is unavailable ({status})."},zh:{starting:"\u6B63\u5728\u542F\u52A8 DevFlow \u8FD0\u884C\u65F6...",ready:"Dashboard \u5DF2\u5C31\u7EEA\uFF1A{url}",reused:"\u5DF2\u590D\u7528\u73B0\u6709 DevFlow \u8FD0\u884C\u65F6\u3002",stopped:"DevFlow \u8FD0\u884C\u65F6\u5DF2\u505C\u6B62\u3002",notRunning:"\u5F53\u524D\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684 DevFlow \u8FD0\u884C\u65F6\u3002",portInUse:"\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\u3002",bundleMissing:"\u5F53\u524D\u5B89\u88C5\u5305\u4E2D\u7F3A\u5C11 Dashboard \u9759\u6001\u8D44\u6E90\u3002",projectRequired:"\u8BF7\u4F7F\u7528 --project <path> \u9009\u62E9\u9879\u76EE\u3002",ownerMismatch:"\u65E0\u6CD5\u9A8C\u8BC1\u8FD0\u884C\u65F6\u5F52\u5C5E\uFF0C\u672A\u505C\u6B62\u4EFB\u4F55\u8FDB\u7A0B\u3002",runtimeFailed:"DevFlow \u8FD0\u884C\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A{message}",openingFailed:"Dashboard \u5DF2\u5C31\u7EEA\uFF0C\u4F46\u65E0\u6CD5\u6253\u5F00\u6D4F\u89C8\u5668\uFF1A{message}",running:"DevFlow \u8FD0\u884C\u65F6\u6B63\u5728 {url} \u8FD0\u884C\uFF08PID {pid}\uFF0C\u4EE3\u6B21 {generation}\uFF09\u3002",statusHeader:"DevFlow \u72B6\u6001",dashboardUnavailable:"Dashboard \u4E0D\u53EF\u7528\uFF08{status}\uFF09\u3002"}};});var vi={};O(vi,{startAll:()=>Ug});async function Ug(e){let t=e.projectRoot??process.cwd();console.log(k.blue(ee("starting")));let n=await ln({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(k.green(ee("ready",{url:n.state.url}))),n.reused&&console.log(k.dim(ee("reused"))),!e.background&&await new Promise(o=>{let r=false,s=async()=>{if(r)return;r=true,process.off("SIGINT",s),process.off("SIGTERM",s);let i=xe().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await xe().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var ki=C(()=>{ie();Oe();});var Si={};O(Si,{stopAll:()=>qg});async function qg(){let e=await un();console.log(e?k.green(ee("stopped")):k.dim(ee("notRunning")));}var _i=C(()=>{ie();Oe();});var Ri={};O(Ri,{showStatus:()=>Gg});function zg(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 Gg(e={}){let t=await ot(),n=e.projectRoot??process.cwd();if(e.json){console.log(JSON.stringify({runtime:t.state??null,running:t.running,project:{root:n,initialized:existsSync(join(n,".devflow"))}}));return}if(console.log(k.blue(ee("statusHeader"))),console.log(k.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(k.green(ee("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(k.yellow(ee(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=$e(o),s=r.root?at(o,r.root):[];r.root?console.log(`Plugin: ${k.green("\u2713")} v${r.version??"unknown"} (${r.root})`):console.log(`Plugin: ${k.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${s.length===0?k.green("\u2713"):k.red("!")} ${s.length} shadowed`);let i=getGlobalDevFlowDbPath();if(existsSync(i)){let p=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${p} MB)`);}else console.log(`Data: ${k.dim(`no global database (${i})`)}`);let a=join(process.cwd(),".devflow","devflow.db"),c=join(process.cwd(),".codegraph","codegraph.db"),l=[...existsSync(a)?[a]:[],...zg(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${k.yellow(l.join(", "))}`):console.log(`Legacy: ${k.green("none")}`);}var Ei=C(()=>{ie();Ve();Oe();});function Di(e){let t=getDaemonPidPath(e.projectRoot,e.paths);if(!existsSync$1(t))return {signaled:false};let n=Number.parseInt(readFileSync$1(t,"utf-8").trim(),10);if(!Number.isSafeInteger(n)||n<=0)return {signaled:false};try{process.kill(n,0);}catch{return {signaled:false}}try{return process.kill(n,"SIGTERM"),{signaled:!0,pid:n}}catch{return {signaled:false}}}var Pi=C(()=>{});var Ci={};O(Ci,{setupCommand:()=>lm});function sm(){try{return It()}catch{return}}function im(e){try{return rm.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 am(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 cm(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(k.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(k.yellow(` ! ${e.artifact}: ${t}`)):console.log(k.green(` + ${e.artifact}: ${t}`));}async function lm(e){console.log(k.blue("DevFlow Setup")),console.log(k.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(k.red(` x Host selection failed: ${o.reason}`)),console.log(k.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(k.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp&&r.id!=="claude-code"){let l=im(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=sm();if(r.id==="claude-code"&&l)try{let u=am(l),p=join$1(n.homeDir,".claude","plugins","cache");await Tt(l,p,u);let m=Di({projectRoot:n.projectRoot});m.signaled&&s.push({artifact:"plugin",status:"written",changed:!0,message:`Deployed ${u}; signaled hook daemon ${m.pid} to restart on next session.`}),l=join$1(p,"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)cm(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(k.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(k.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(k.green(`Setup complete for ${r.id}.`)),console.log(k.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var rm,Oi=C(()=>{Ve();Pi();rm=createRequire$1(import.meta.url);});var xi={};O(xi,{pluginListCommand:()=>dm});var dm,ji=C(()=>{Lt();dm=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Ie();if(e.installed){let n=pr();if(n.length===0){console.log("No plugins installed."),console.log(`
237
+ `)}`}function $g(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [tn("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),tn("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),tn("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),tn("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function tn(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 Eo=C(()=>{});var Po={};O(Po,{reportEvaluationCommand:()=>Ug,runEvaluationCommand:()=>Wg});async function Wg(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=qg(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:${nn(JSON.stringify(c)).slice(0,24)}`},p={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:nn(c.prompt),toolProfileHash:nn("benchmark-context-deep:r3.v1"),acceptanceHash:nn(JSON.stringify(t.tasks.find(m=>m.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({...p,evidenceReceipt:createTrialReceipt(p)});}}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 Ug(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 qg(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function nn(e){return createHash("sha256").update(e).digest("hex")}var Co=C(()=>{});var fi={};O(fi,{runReview:()=>Bg});async function Bg(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"),[k.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?k.red(`Critical (${i.length})`):"",...i.map(u=>` ${k.red("\u25CF")} ${u}`),"",a.length>0?k.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${k.yellow("\u25CB")} ${u}`),"",c.length>0?k.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${k.green("\u25CB")} ${u}`),"",i.length>0?k.red("Overall: Need changes"):a.length>0?k.yellow("Overall: Approve with comments"):k.green("Overall: LGTM")].join(`
238
+ `)}var hi=C(()=>{});var Rt={};O(Rt,{resolveRuntimeLocale:()=>wi,runtimeMessage:()=>ee,runtimeMessages:()=>yi});function wi(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function ee(e,t={},n){return yi[wi(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var yi,Oe=C(()=>{yi={en:{starting:"Starting the DevFlow Runtime...",ready:"Dashboard ready at {url}",reused:"Reused the existing DevFlow Runtime.",stopped:"DevFlow Runtime stopped.",notRunning:"No DevFlow Runtime is running.",portInUse:"Port {port} is already in use.",bundleMissing:"The Dashboard bundle is missing from this installation.",projectRequired:"Choose a project with --project <path>.",ownerMismatch:"Runtime ownership could not be verified; no process was stopped.",runtimeFailed:"DevFlow Runtime could not be started: {message}",openingFailed:"The Dashboard is ready, but the browser could not be opened: {message}",running:"DevFlow Runtime is running at {url} (PID {pid}, generation {generation}).",statusHeader:"DevFlow Status",dashboardUnavailable:"Dashboard is unavailable ({status})."},zh:{starting:"\u6B63\u5728\u542F\u52A8 DevFlow \u8FD0\u884C\u65F6...",ready:"Dashboard \u5DF2\u5C31\u7EEA\uFF1A{url}",reused:"\u5DF2\u590D\u7528\u73B0\u6709 DevFlow \u8FD0\u884C\u65F6\u3002",stopped:"DevFlow \u8FD0\u884C\u65F6\u5DF2\u505C\u6B62\u3002",notRunning:"\u5F53\u524D\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684 DevFlow \u8FD0\u884C\u65F6\u3002",portInUse:"\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\u3002",bundleMissing:"\u5F53\u524D\u5B89\u88C5\u5305\u4E2D\u7F3A\u5C11 Dashboard \u9759\u6001\u8D44\u6E90\u3002",projectRequired:"\u8BF7\u4F7F\u7528 --project <path> \u9009\u62E9\u9879\u76EE\u3002",ownerMismatch:"\u65E0\u6CD5\u9A8C\u8BC1\u8FD0\u884C\u65F6\u5F52\u5C5E\uFF0C\u672A\u505C\u6B62\u4EFB\u4F55\u8FDB\u7A0B\u3002",runtimeFailed:"DevFlow \u8FD0\u884C\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A{message}",openingFailed:"Dashboard \u5DF2\u5C31\u7EEA\uFF0C\u4F46\u65E0\u6CD5\u6253\u5F00\u6D4F\u89C8\u5668\uFF1A{message}",running:"DevFlow \u8FD0\u884C\u65F6\u6B63\u5728 {url} \u8FD0\u884C\uFF08PID {pid}\uFF0C\u4EE3\u6B21 {generation}\uFF09\u3002",statusHeader:"DevFlow \u72B6\u6001",dashboardUnavailable:"Dashboard \u4E0D\u53EF\u7528\uFF08{status}\uFF09\u3002"}};});var vi={};O(vi,{startAll:()=>Kg});async function Kg(e){let t=e.projectRoot??process.cwd();console.log(k.blue(ee("starting")));let n=await ln({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(k.green(ee("ready",{url:n.state.url}))),n.reused&&console.log(k.dim(ee("reused"))),!e.background&&await new Promise(o=>{let r=false,s=async()=>{if(r)return;r=true,process.off("SIGINT",s),process.off("SIGTERM",s);let i=je().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await je().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var ki=C(()=>{ie();Oe();});var Si={};O(Si,{stopAll:()=>Jg});async function Jg(){let e=await un();console.log(e?k.green(ee("stopped")):k.dim(ee("notRunning")));}var _i=C(()=>{ie();Oe();});var Ri={};O(Ri,{showStatus:()=>Qg});function Zg(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 Qg(e={}){let t=await ot(),n=e.projectRoot??process.cwd();if(e.json){console.log(JSON.stringify({runtime:t.state??null,running:t.running,project:{root:n,initialized:existsSync(join(n,".devflow"))}}));return}if(console.log(k.blue(ee("statusHeader"))),console.log(k.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(k.green(ee("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(k.yellow(ee(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=$e(o),s=r.root?at(o,r.root):[];r.root?console.log(`Plugin: ${k.green("\u2713")} v${r.version??"unknown"} (${r.root})`):console.log(`Plugin: ${k.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${s.length===0?k.green("\u2713"):k.red("!")} ${s.length} shadowed`);let i=getGlobalDevFlowDbPath();if(existsSync(i)){let p=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${p} MB)`);}else console.log(`Data: ${k.dim(`no global database (${i})`)}`);let a=join(process.cwd(),".devflow","devflow.db"),c=join(process.cwd(),".codegraph","codegraph.db"),l=[...existsSync(a)?[a]:[],...Zg(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${k.yellow(l.join(", "))}`):console.log(`Legacy: ${k.green("none")}`);}var Ei=C(()=>{ie();Ve();Oe();});function tm(e){let t=getDaemonPidPath(e.projectRoot,e.paths);if(!existsSync$1(t))return {signaled:false};let n=Number.parseInt(readFileSync$1(t,"utf-8").trim(),10);return Oi(n)?{signaled:true,pid:n}:{signaled:false}}function Ci(e){let t=[],n=tm({projectRoot:e.currentProjectRoot,paths:e.paths});n.signaled&&t.push(n);let o=getDaemonRegistryPath(e.paths);if(existsSync$1(o)){let r;try{r=JSON.parse(readFileSync$1(o,"utf-8"));}catch{return t}if(!Array.isArray(r))return t;for(let s of r){let i=s?.rootPath,a=s?.pid;typeof i!="string"||i===e.currentProjectRoot||typeof a!="number"||!Number.isSafeInteger(a)||a<=0||Oi(a)&&t.push({signaled:true,pid:a,projectRoot:i});}}return t}function Oi(e){try{process.kill(e,0);}catch{return false}try{return process.kill(e,"SIGTERM"),!0}catch{return false}}var ji=C(()=>{});var xi={};O(xi,{setupCommand:()=>gm});function cm(){try{return It()}catch{return}}function lm(e){try{return am.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 um(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 dm(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(k.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(k.yellow(` ! ${e.artifact}: ${t}`)):console.log(k.green(` + ${e.artifact}: ${t}`));}async function gm(e){console.log(k.blue("DevFlow Setup")),console.log(k.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(k.red(` x Host selection failed: ${o.reason}`)),console.log(k.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(k.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp&&r.id!=="claude-code"){let l=lm(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=cm();if(r.id==="claude-code"&&l)try{let u=um(l),p=join$1(n.homeDir,".claude","plugins","cache");await Tt(l,p,u);let m=Ci({currentProjectRoot:n.projectRoot});if(m.length>0){let f=m.map(d=>d.projectRoot??n.projectRoot);s.push({artifact:"plugin",status:"written",changed:!0,message:`Deployed ${u}; signaled ${m.length} hook daemon(s) to restart on next session (${f.join(", ")}).`});}l=join$1(p,"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)dm(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(k.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(k.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(k.green(`Setup complete for ${r.id}.`)),console.log(k.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var am,Ni=C(()=>{Ve();ji();am=createRequire$1(import.meta.url);});var Ai={};O(Ai,{pluginListCommand:()=>pm});var pm,$i=C(()=>{Lt();pm=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Ie();if(e.installed){let n=pr();if(n.length===0){console.log("No plugins installed."),console.log(`
239
239
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
240
240
  `),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${k.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${k.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
241
241
  `);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(` ${k.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(`
242
- Install a plugin: devflow plugin install <name>`);}});});var Ni={};O(Ni,{pluginSearchCommand:()=>pm});var pm,Ai=C(()=>{Lt();pm=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Ie(),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(`
242
+ Install a plugin: devflow plugin install <name>`);}});});var Ii={};O(Ii,{pluginSearchCommand:()=>ym});var ym,Ti=C(()=>{Lt();ym=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Ie(),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(`
243
243
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
244
- `),o.forEach(r=>{console.log(` ${k.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 Ii={};O(Ii,{pluginInstallCommand:()=>hm});var hm,Ti=C(()=>{_e();hm=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 Te(n,process.cwd(),!0);console.log(`
244
+ `),o.forEach(r=>{console.log(` ${k.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 Li={};O(Li,{pluginInstallCommand:()=>vm});var vm,Fi=C(()=>{_e();vm=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 Te(n,process.cwd(),!0);console.log(`
245
245
  ${k.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
246
246
  Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
247
- ${k.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Li={};O(Li,{pluginUninstallCommand:()=>wm});var wm,Fi=C(()=>{_e();wm=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 Cn(n,process.cwd(),!0),console.log(`
247
+ ${k.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Wi={};O(Wi,{pluginUninstallCommand:()=>bm});var bm,Ui=C(()=>{_e();bm=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 Cn(n,process.cwd(),!0),console.log(`
248
248
  ${k.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
249
- ${k.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function cn(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 Hi=createRequire(import.meta.url),No="0.0.0";try{No=Hi("../package.json").version;}catch{try{No=Hi("../../package.json").version;}catch{}}var E=new Command;E.command("hook-client [requestType] [requestArg]").allowUnknownOption().action(async(e,t)=>{process.argv[2]=e??"",t!==void 0&&(process.argv[3]=t),await import(new URL("./hooks/hook-client.js",import.meta.url).href);});E.command("hook-daemon [projectRoot] [sessionInput]").allowUnknownOption().action(async(e,t)=>{process.argv[2]=e??"",t!==void 0&&(process.argv[3]=t),await import(new URL("./hooks/hook-daemon.js",import.meta.url).href);});var Sm=await Promise.resolve().then(()=>(Uo(),Wo));E.addCommand(Sm.createDefaultDeliveryCommand());E.command("disable").description("Activate the global kill switch: every DevFlow hook exits with no opinion (immediate, no restart needed)").action(async()=>{let{disableDevFlow:e}=await Promise.resolve().then(()=>(fn(),pn)),t=e({});console.log(k.yellow(t.alreadyDisabled?`Kill switch already active (${t.marker})`:`Kill switch active: ${t.marker}`)),console.log(k.dim("DevFlow hooks now exit with no opinion. Run `devflow enable` to restore."));});E.command("enable").description("Deactivate the global kill switch and restore DevFlow hooks").action(async()=>{let{enableDevFlow:e}=await Promise.resolve().then(()=>(fn(),pn)),t=e({});console.log(k.green(t.wasDisabled?`Kill switch removed (${t.marker}); DevFlow hooks restored`:"Kill switch was not active"));});var _m=await Promise.resolve().then(()=>(Vo(),Jo));E.addCommand(_m.createHooksCommand());function Rm(e){let t=new URL(e);if(t.protocol!=="http:"||t.hostname!=="127.0.0.1")return Promise.reject(new Error("Only loopback Dashboard URLs can be opened."));let[n,o]=process.platform==="darwin"?["/usr/bin/open",[e]]:process.platform==="win32"?["cmd.exe",["/c","start","",e]]:["xdg-open",[e]];return new Promise((r,s)=>{execFile(n,o,i=>i?s(i):r());})}E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(No).option("--local","Force local engine, skip server");var Em=E.command("logs").description("Inspect and clean diagnostic logs");Em.command("cleanup").description("Clean registered diagnostic logs (dry-run by default)").option("--execute","Apply deletions; default is dry-run").option("--older-than <days>","Override retention days").option("--max-bytes <bytes>","Override project and global log budgets").option("--json","Print JSON result").action(async e=>{let{renderLogCleanupResult:t,runLogsCleanupCommand:n}=await Promise.resolve().then(()=>(Zo(),Yo)),o=n({projectRoot:process.cwd(),execute:!!e.execute,olderThanDays:e.olderThan===void 0?void 0:Number(e.olderThan),maxBytes:e.maxBytes===void 0?void 0:Number(e.maxBytes)});console.log(e.json?JSON.stringify(o):t(o));});E.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--no-scan","Skip CodeGraph and context indexing").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(k.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Ao.join(t,a);sn.existsSync(c)&&(console.log(k.dim(` Removing ${a}/...`)),sn.rmSync(c,{recursive:true,force:true}));}console.log(k.green(`\u2705 Existing directories removed
250
- `));}let n=cn(t);console.error(k.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(dr(),ur)),s=await o(t,{force:e.force,plugins:e.plugins!==false,scan:e.scan!==false,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(k.green("Created:"));for(let i of s.created)console.log(` ${k.dim("+")} ${i}`);}else console.log(k.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(k.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(k.green("\u2705 Onboarding pack generated")),console.log(k.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(k.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(k.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(k.green("\u2705 MCP server provided by the Claude plugin")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(k.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(mr(),gr)),a=await i(t,e.withPlugin);console.log(k.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(xn(),On));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(xn(),On));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(()=>(Hr(),Fr));t(e,{},{log:o=>console.log(o),error:o=>console.error(k.red(o))})||(process.exitCode=1);});E.command("cleanup").description("Back up and remove all DevFlow sessions and state for one project").option("--project <path>","Project directory",process.cwd()).option("--json","Output the cleanup report as JSON").action(async e=>{try{let{cleanupProject:t}=await Promise.resolve().then(()=>(zr(),Vr)),n=await t({projectRoot:e.project});console.log(e.json?JSON.stringify(n,null,2):n);}catch(t){console.error(k.red(`Backlog cleanup failed: ${t.message}`)),process.exitCode=1;}});var Dm=E.command("db").description("Manage DevFlow databases");Dm.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(()=>(rs(),os)),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=cn(n);console.log(k.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(is(),ss));if(e){let i=s();i.includes(e)||(console.log(k.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(k.green(`\u2713 ${a}`));}catch(i){console.error(k.red(`Error: ${i.message}`)),process.exit(1);}});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(()=>(ls(),cs)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(k.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(k.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(()=>(ds(),us)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(k.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(()=>(Kn(),Bn)),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(()=>(Kn(),Bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(k.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var an=E.command("workflow").description("Workflow management");an.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ft(),pt)),t=await e(E.opts().local);if(t.length===0){console.log(k.dim("No workflows registered."));return}for(let n of t)console.log(`${k.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var Dt=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");Dt.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(et(),Xe));console.log(o({projectRoot:n.project,json:n.json}));});Dt.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(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Dt.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Dt.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(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Dt.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(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});an.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ft(),pt)),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`);});an.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ft(),pt)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});an.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ft(),pt)),t=await e(E.opts().local);if(t.length===0){console.log(k.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${k.yellow(n.status)} ${o}`);}});var Wi=E.command("embeddings").description("Manage the shared verified embedding model");Wi.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(()=>(zn(),Vn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Wi.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(()=>(zn(),Vn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(k.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Be=E.command("memory").description("Memory management");Be.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Le(),Me)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Be.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Le(),Me));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Be.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(()=>(Le(),Me)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});Be.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Le(),Me));await n(e,t,E.opts().local),console.log(k.green(`Memory set: ${e} = ${t}`));});Be.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Le(),Me)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Be.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(()=>(Le(),Me)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(k.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(()=>(hs(),fs)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(k.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var $o=E.command("docs").description("Documentation index management");$o.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(k.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${k.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${k.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(k.green(`
249
+ ${k.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function cn(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 qi=createRequire(import.meta.url),No="0.0.0";try{No=qi("../package.json").version;}catch{try{No=qi("../../package.json").version;}catch{}}var E=new Command;E.command("hook-client [requestType] [requestArg]").allowUnknownOption().action(async(e,t)=>{process.argv[2]=e??"",t!==void 0&&(process.argv[3]=t),await import(new URL("./hooks/hook-client.js",import.meta.url).href);});E.command("hook-daemon [projectRoot] [sessionInput]").allowUnknownOption().action(async(e,t)=>{process.argv[2]=e??"",t!==void 0&&(process.argv[3]=t),await import(new URL("./hooks/hook-daemon.js",import.meta.url).href);});var Em=await Promise.resolve().then(()=>(Uo(),Wo));E.addCommand(Em.createDefaultDeliveryCommand());E.command("disable").description("Activate the global kill switch: every DevFlow hook exits with no opinion (immediate, no restart needed)").action(async()=>{let{disableDevFlow:e}=await Promise.resolve().then(()=>(fn(),pn)),t=e({});console.log(k.yellow(t.alreadyDisabled?`Kill switch already active (${t.marker})`:`Kill switch active: ${t.marker}`)),console.log(k.dim("DevFlow hooks now exit with no opinion. Run `devflow enable` to restore."));});E.command("enable").description("Deactivate the global kill switch and restore DevFlow hooks").action(async()=>{let{enableDevFlow:e}=await Promise.resolve().then(()=>(fn(),pn)),t=e({});console.log(k.green(t.wasDisabled?`Kill switch removed (${t.marker}); DevFlow hooks restored`:"Kill switch was not active"));});var Dm=await Promise.resolve().then(()=>(Vo(),Jo));E.addCommand(Dm.createHooksCommand());function Pm(e){let t=new URL(e);if(t.protocol!=="http:"||t.hostname!=="127.0.0.1")return Promise.reject(new Error("Only loopback Dashboard URLs can be opened."));let[n,o]=process.platform==="darwin"?["/usr/bin/open",[e]]:process.platform==="win32"?["cmd.exe",["/c","start","",e]]:["xdg-open",[e]];return new Promise((r,s)=>{execFile(n,o,i=>i?s(i):r());})}E.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(No).option("--local","Force local engine, skip server");var Cm=E.command("logs").description("Inspect and clean diagnostic logs");Cm.command("cleanup").description("Clean registered diagnostic logs (dry-run by default)").option("--execute","Apply deletions; default is dry-run").option("--older-than <days>","Override retention days").option("--max-bytes <bytes>","Override project and global log budgets").option("--json","Print JSON result").action(async e=>{let{renderLogCleanupResult:t,runLogsCleanupCommand:n}=await Promise.resolve().then(()=>(Zo(),Yo)),o=n({projectRoot:process.cwd(),execute:!!e.execute,olderThanDays:e.olderThan===void 0?void 0:Number(e.olderThan),maxBytes:e.maxBytes===void 0?void 0:Number(e.maxBytes)});console.log(e.json?JSON.stringify(o):t(o));});E.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--no-scan","Skip CodeGraph and context indexing").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(k.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Ao.join(t,a);sn.existsSync(c)&&(console.log(k.dim(` Removing ${a}/...`)),sn.rmSync(c,{recursive:true,force:true}));}console.log(k.green(`\u2705 Existing directories removed
250
+ `));}let n=cn(t);console.error(k.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(dr(),ur)),s=await o(t,{force:e.force,plugins:e.plugins!==false,scan:e.scan!==false,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(k.green("Created:"));for(let i of s.created)console.log(` ${k.dim("+")} ${i}`);}else console.log(k.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(k.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(k.green("\u2705 Onboarding pack generated")),console.log(k.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(k.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(k.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(k.green("\u2705 MCP server provided by the Claude plugin")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(k.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(mr(),gr)),a=await i(t,e.withPlugin);console.log(k.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(jn(),On));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(jn(),On));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(()=>(Hr(),Fr));t(e,{},{log:o=>console.log(o),error:o=>console.error(k.red(o))})||(process.exitCode=1);});E.command("cleanup").description("Back up and remove all DevFlow sessions and state for one project").option("--project <path>","Project directory",process.cwd()).option("--json","Output the cleanup report as JSON").action(async e=>{try{let{cleanupProject:t}=await Promise.resolve().then(()=>(zr(),Vr)),n=await t({projectRoot:e.project});console.log(e.json?JSON.stringify(n,null,2):n);}catch(t){console.error(k.red(`Backlog cleanup failed: ${t.message}`)),process.exitCode=1;}});var Om=E.command("db").description("Manage DevFlow databases");Om.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(()=>(rs(),os)),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=cn(n);console.log(k.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(is(),ss));if(e){let i=s();i.includes(e)||(console.log(k.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(k.green(`\u2713 ${a}`));}catch(i){console.error(k.red(`Error: ${i.message}`)),process.exit(1);}});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(()=>(ls(),cs)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(k.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(k.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(()=>(ds(),us)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(k.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(()=>(Kn(),Bn)),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(()=>(Kn(),Bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(k.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var an=E.command("workflow").description("Workflow management");an.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ft(),pt)),t=await e(E.opts().local);if(t.length===0){console.log(k.dim("No workflows registered."));return}for(let n of t)console.log(`${k.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var Dt=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");Dt.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(et(),Xe));console.log(o({projectRoot:n.project,json:n.json}));});Dt.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(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Dt.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Dt.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(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Dt.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(()=>(et(),Xe));console.log(r(e,{projectRoot:o.project,json:o.json}));});an.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ft(),pt)),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`);});an.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ft(),pt)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});an.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ft(),pt)),t=await e(E.opts().local);if(t.length===0){console.log(k.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${k.yellow(n.status)} ${o}`);}});var Bi=E.command("embeddings").description("Manage the shared verified embedding model");Bi.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(()=>(zn(),Vn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Bi.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(()=>(zn(),Vn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(k.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Be=E.command("memory").description("Memory management");Be.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Le(),Me)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Be.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Le(),Me));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Be.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(()=>(Le(),Me)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});Be.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Le(),Me));await n(e,t,E.opts().local),console.log(k.green(`Memory set: ${e} = ${t}`));});Be.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Le(),Me)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Be.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(()=>(Le(),Me)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(k.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(()=>(hs(),fs)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(k.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var $o=E.command("docs").description("Documentation index management");$o.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(k.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${k.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${k.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(k.green(`
251
251
  ${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(` ${k.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${k.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(k.green(`
252
- All docs synced.`));}});$o.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(()=>(eo(),Xn)),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(k.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});$o.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(()=>(eo(),Xn));console.log(k.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(` ${k.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${k.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(k.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var Pt=E.command("skill").description("Plugin/Skill management");Pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(_e(),lt)),t=await e(E.opts().local);if(t.length===0){console.log(k.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${k.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(_e(),lt)),n=await t(e,E.opts().local);if(console.log(k.blue(`Search: "${e}"`)),n.length===0){console.log(k.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${k.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(_e(),lt)),n=await t(e,process.cwd(),E.opts().local);console.log(k.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});Pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(_e(),lt));await t(e,process.cwd(),E.opts().local),console.log(k.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});Pt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(no(),ws));process.exitCode=t(e);});var Ui=E.command("mcp").description("Inspect MCP configuration and health");Ui.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(()=>(ro(),oo));await t(e);});Ui.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(()=>(ro(),oo));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(()=>(si(),ri));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;});Be.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(()=>(ai(),ii));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(k.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(()=>(li(),ci)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var qi=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");qi.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(()=>(Eo(),Ro));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var Bi=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");Bi.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(()=>(Co(),Po));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});Bi.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(Co(),Po));console.log(t({runId:e.run,output:e.json?"json":"text"}));});qi.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(()=>(Eo(),Ro));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(()=>(hi(),fi)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Io=E.command("server").description("Manage DevFlow server");Io.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async(e,t)=>{let{startServer:n}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Oe(),Rt));console.log(k.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(k.green(o("ready",{url:r.state.url}))),r.reused&&console.log(k.dim(o("reused")));});Io.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Oe(),Rt)),n=await e();console.log(n?k.green(t("stopped")):k.dim(t("notRunning")));});Io.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Oe(),Rt)),n=await e();n.running&&n.state?console.log(k.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(k.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Oe(),Rt)),r=Ao.resolve(e.project);if(!sn.existsSync(r)||!sn.statSync(r).isDirectory())throw new Error(o("projectRequired"));let s=await n({reason:"cli-dashboard",projectRoot:r,port:e.port===void 0?void 0:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli",noStart:e.start===false}),i={url:s.state.url,projectId:s.projectId,runtime:s.state,reused:s.reused};if(e.json?console.log(JSON.stringify(i)):(console.log(k.green(o("ready",{url:s.state.url}))),s.reused&&console.log(k.dim(o("reused")))),e.open)try{await Rm(s.state.url);}catch(a){console.error(k.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(ki(),vi));await n({port:Number(e.port),background:!!e.background,explicitPort:t.getOptionValueSource("port")==="cli"});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(_i(),Si));await e();});E.command("status").description("Show DevFlow services status").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).action(async e=>{let{showStatus:t}=await Promise.resolve().then(()=>(Ei(),Ri));await t({json:!!e.json,projectRoot:Ao.resolve(e.project)});});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Oi(),Ci));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var rn=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(()=>(ji(),xi)),Promise.resolve().then(()=>(Ai(),Ni)),Promise.resolve().then(()=>(Ti(),Ii)),Promise.resolve().then(()=>(Fi(),Li))]);rn.addCommand(e),rn.addCommand(t),rn.addCommand(n),rn.addCommand(o);}await E.parseAsync();
252
+ All docs synced.`));}});$o.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(()=>(eo(),Xn)),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(k.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});$o.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(()=>(eo(),Xn));console.log(k.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(` ${k.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${k.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(k.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var Pt=E.command("skill").description("Plugin/Skill management");Pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(_e(),lt)),t=await e(E.opts().local);if(t.length===0){console.log(k.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${k.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(_e(),lt)),n=await t(e,E.opts().local);if(console.log(k.blue(`Search: "${e}"`)),n.length===0){console.log(k.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${k.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(_e(),lt)),n=await t(e,process.cwd(),E.opts().local);console.log(k.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});Pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(_e(),lt));await t(e,process.cwd(),E.opts().local),console.log(k.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});Pt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(no(),ws));process.exitCode=t(e);});var Ki=E.command("mcp").description("Inspect MCP configuration and health");Ki.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(()=>(ro(),oo));await t(e);});Ki.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(()=>(ro(),oo));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(()=>(si(),ri));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;});Be.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(()=>(ai(),ii));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(k.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(()=>(li(),ci)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Ji=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Ji.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(()=>(Eo(),Ro));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var Vi=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");Vi.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(()=>(Co(),Po));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});Vi.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(Co(),Po));console.log(t({runId:e.run,output:e.json?"json":"text"}));});Ji.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(()=>(Eo(),Ro));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(()=>(hi(),fi)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Io=E.command("server").description("Manage DevFlow server");Io.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async(e,t)=>{let{startServer:n}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Oe(),Rt));console.log(k.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(k.green(o("ready",{url:r.state.url}))),r.reused&&console.log(k.dim(o("reused")));});Io.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Oe(),Rt)),n=await e();console.log(n?k.green(t("stopped")):k.dim(t("notRunning")));});Io.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Oe(),Rt)),n=await e();n.running&&n.state?console.log(k.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(k.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(ie(),Je)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Oe(),Rt)),r=Ao.resolve(e.project);if(!sn.existsSync(r)||!sn.statSync(r).isDirectory())throw new Error(o("projectRequired"));let s=await n({reason:"cli-dashboard",projectRoot:r,port:e.port===void 0?void 0:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli",noStart:e.start===false}),i={url:s.state.url,projectId:s.projectId,runtime:s.state,reused:s.reused};if(e.json?console.log(JSON.stringify(i)):(console.log(k.green(o("ready",{url:s.state.url}))),s.reused&&console.log(k.dim(o("reused")))),e.open)try{await Pm(s.state.url);}catch(a){console.error(k.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(ki(),vi));await n({port:Number(e.port),background:!!e.background,explicitPort:t.getOptionValueSource("port")==="cli"});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(_i(),Si));await e();});E.command("status").description("Show DevFlow services status").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).action(async e=>{let{showStatus:t}=await Promise.resolve().then(()=>(Ei(),Ri));await t({json:!!e.json,projectRoot:Ao.resolve(e.project)});});E.command("setup").description("Configure DevFlow for a supported agent host").option("--agent <agent>","Target host (claude-code/codex/generic-mcp)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Ni(),xi));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var rn=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(()=>($i(),Ai)),Promise.resolve().then(()=>(Ti(),Ii)),Promise.resolve().then(()=>(Fi(),Li)),Promise.resolve().then(()=>(Ui(),Wi))]);rn.addCommand(e),rn.addCommand(t),rn.addCommand(n),rn.addCommand(o);}await E.parseAsync();