@devflow-tools/devflow 0.19.0 → 0.19.2

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 (117) hide show
  1. package/dist/cli.js +63 -62
  2. package/dist/dashboard/404.html +1 -1
  3. package/dist/dashboard/__next.__PAGE__.txt +1 -1
  4. package/dist/dashboard/__next._full.txt +1 -1
  5. package/dist/dashboard/__next._tree.txt +1 -1
  6. package/dist/dashboard/_next/static/chunks/{968-e7efadf9f1a30259.js → 968-98c23a99cb0f4832.js} +2 -2
  7. package/dist/dashboard/_next/static/chunks/app/intelligence/{memory/page-d74930294a785071.js → knowledge/page-433475a9552451da.js} +1 -1
  8. package/dist/dashboard/_next/static/chunks/app/intelligence/{page-d74930294a785071.js → memory/page-433475a9552451da.js} +1 -1
  9. package/dist/dashboard/_next/static/chunks/app/intelligence/{knowledge/page-d74930294a785071.js → page-433475a9552451da.js} +1 -1
  10. package/dist/dashboard/_next/static/chunks/{main-09b1ccc91836f96c.js → main-2bb696a9b2dd088b.js} +1 -1
  11. package/dist/dashboard/_not-found/__next._full.txt +1 -1
  12. package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +1 -1
  13. package/dist/dashboard/_not-found/__next._tree.txt +1 -1
  14. package/dist/dashboard/_not-found.html +1 -1
  15. package/dist/dashboard/_not-found.txt +1 -1
  16. package/dist/dashboard/accuracy/__next._full.txt +1 -1
  17. package/dist/dashboard/accuracy/__next._tree.txt +1 -1
  18. package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +1 -1
  19. package/dist/dashboard/accuracy.html +1 -1
  20. package/dist/dashboard/accuracy.txt +1 -1
  21. package/dist/dashboard/benchmark/__next._full.txt +1 -1
  22. package/dist/dashboard/benchmark/__next._tree.txt +1 -1
  23. package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +1 -1
  24. package/dist/dashboard/benchmark.html +1 -1
  25. package/dist/dashboard/benchmark.txt +1 -1
  26. package/dist/dashboard/context/__next._full.txt +1 -1
  27. package/dist/dashboard/context/__next._tree.txt +1 -1
  28. package/dist/dashboard/context/__next.context.__PAGE__.txt +1 -1
  29. package/dist/dashboard/context.html +1 -1
  30. package/dist/dashboard/context.txt +1 -1
  31. package/dist/dashboard/doctor/__next._full.txt +1 -1
  32. package/dist/dashboard/doctor/__next._tree.txt +1 -1
  33. package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +1 -1
  34. package/dist/dashboard/doctor.html +1 -1
  35. package/dist/dashboard/doctor.txt +1 -1
  36. package/dist/dashboard/executions/__next._full.txt +1 -1
  37. package/dist/dashboard/executions/__next._tree.txt +1 -1
  38. package/dist/dashboard/executions/__next.executions.__PAGE__.txt +1 -1
  39. package/dist/dashboard/executions.html +1 -1
  40. package/dist/dashboard/executions.txt +1 -1
  41. package/dist/dashboard/graph/__next._full.txt +1 -1
  42. package/dist/dashboard/graph/__next._tree.txt +1 -1
  43. package/dist/dashboard/graph/__next.graph.__PAGE__.txt +1 -1
  44. package/dist/dashboard/graph.html +1 -1
  45. package/dist/dashboard/graph.txt +1 -1
  46. package/dist/dashboard/index.html +1 -1
  47. package/dist/dashboard/index.txt +1 -1
  48. package/dist/dashboard/intelligence/__next._full.txt +2 -2
  49. package/dist/dashboard/intelligence/__next._tree.txt +1 -1
  50. package/dist/dashboard/intelligence/__next.intelligence.__PAGE__.txt +2 -2
  51. package/dist/dashboard/intelligence/knowledge/__next._full.txt +2 -2
  52. package/dist/dashboard/intelligence/knowledge/__next._tree.txt +1 -1
  53. package/dist/dashboard/intelligence/knowledge/__next.intelligence.knowledge.__PAGE__.txt +2 -2
  54. package/dist/dashboard/intelligence/knowledge.html +1 -1
  55. package/dist/dashboard/intelligence/knowledge.txt +2 -2
  56. package/dist/dashboard/intelligence/memory/__next._full.txt +2 -2
  57. package/dist/dashboard/intelligence/memory/__next._tree.txt +1 -1
  58. package/dist/dashboard/intelligence/memory/__next.intelligence.memory.__PAGE__.txt +2 -2
  59. package/dist/dashboard/intelligence/memory.html +1 -1
  60. package/dist/dashboard/intelligence/memory.txt +2 -2
  61. package/dist/dashboard/intelligence.html +1 -1
  62. package/dist/dashboard/intelligence.txt +2 -2
  63. package/dist/dashboard/knowledge/__next._full.txt +1 -1
  64. package/dist/dashboard/knowledge/__next._tree.txt +1 -1
  65. package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +1 -1
  66. package/dist/dashboard/knowledge.html +1 -1
  67. package/dist/dashboard/knowledge.txt +1 -1
  68. package/dist/dashboard/memory/__next._full.txt +1 -1
  69. package/dist/dashboard/memory/__next._tree.txt +1 -1
  70. package/dist/dashboard/memory/__next.memory.__PAGE__.txt +1 -1
  71. package/dist/dashboard/memory.html +1 -1
  72. package/dist/dashboard/memory.txt +1 -1
  73. package/dist/dashboard/replay/__next._full.txt +1 -1
  74. package/dist/dashboard/replay/__next._tree.txt +1 -1
  75. package/dist/dashboard/replay/__next.replay.__PAGE__.txt +1 -1
  76. package/dist/dashboard/replay.html +1 -1
  77. package/dist/dashboard/replay.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.$d$id.__PAGE__.txt +1 -1
  81. package/dist/dashboard/runs/_.html +1 -1
  82. package/dist/dashboard/runs/_.txt +1 -1
  83. package/dist/dashboard/runs/__next._full.txt +1 -1
  84. package/dist/dashboard/runs/__next._tree.txt +1 -1
  85. package/dist/dashboard/runs/__next.runs.__PAGE__.txt +1 -1
  86. package/dist/dashboard/runs.html +1 -1
  87. package/dist/dashboard/runs.txt +1 -1
  88. package/dist/dashboard/settings/__next._full.txt +1 -1
  89. package/dist/dashboard/settings/__next._tree.txt +1 -1
  90. package/dist/dashboard/settings/__next.settings.__PAGE__.txt +1 -1
  91. package/dist/dashboard/settings.html +1 -1
  92. package/dist/dashboard/settings.txt +1 -1
  93. package/dist/dashboard/timeline/__next._full.txt +1 -1
  94. package/dist/dashboard/timeline/__next._tree.txt +1 -1
  95. package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +1 -1
  96. package/dist/dashboard/timeline.html +1 -1
  97. package/dist/dashboard/timeline.txt +1 -1
  98. package/dist/dashboard/tool-metrics/__next._full.txt +1 -1
  99. package/dist/dashboard/tool-metrics/__next._tree.txt +1 -1
  100. package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +1 -1
  101. package/dist/dashboard/tool-metrics.html +1 -1
  102. package/dist/dashboard/tool-metrics.txt +1 -1
  103. package/dist/dashboard/workflows/__next._full.txt +1 -1
  104. package/dist/dashboard/workflows/__next._tree.txt +1 -1
  105. package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +1 -1
  106. package/dist/dashboard/workflows.html +1 -1
  107. package/dist/dashboard/workflows.txt +1 -1
  108. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  109. package/dist/plugin/dist/command-registry.json +7 -7
  110. package/dist/plugin/dist/runtime-manifest.json +6 -6
  111. package/dist/plugin/hooks/README.md +15 -0
  112. package/dist/plugin/hooks/hooks.json +8 -24
  113. package/dist/plugin/package.json +14 -14
  114. package/package.json +17 -17
  115. package/plugin-registry.json +29 -29
  116. /package/dist/dashboard/_next/static/{Jo2zPkpXCR3MZbbWYPoTu → UvcUjAA8J28x-BgLLJDb_}/_buildManifest.js +0 -0
  117. /package/dist/dashboard/_next/static/{Jo2zPkpXCR3MZbbWYPoTu → UvcUjAA8J28x-BgLLJDb_}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -1,43 +1,44 @@
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,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {readFileSync as readFileSync$1,existsSync as existsSync$1,lstatSync,realpathSync,mkdirSync as mkdirSync$1,cpSync,renameSync,rmSync,readdirSync as readdirSync$1,writeFileSync as writeFileSync$1,statSync as statSync$1,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import S from'chalk';import sn,{existsSync,readFileSync,readdirSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Oo,{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 er 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 Tl 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 Fi=Object.defineProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)Fi(e,n,{get:t[n],enumerable:true});};var Be={};j(Be,{DEFAULT_SERVER_PORT:()=>Ji,ensureCliRuntime:()=>No,getRuntimeManager:()=>Oe,resolveServerLaunch:()=>$o,serverStatus:()=>nt,startServer:()=>ln,stopServer:()=>un});function $o(e=process.cwd()){let t=[()=>Ki.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 Oe(){return createRuntimeManager()}async function No(e){return Oe().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:$o(e.projectRoot)})}async function ln(e={}){let t=e.projectRoot??process.cwd(),n=await No({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 Oe().stop()).stopped}async function nt(){let e=await Oe().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var Ki,Ji,se=D(()=>{Ki=createRequire$1(import.meta.url),Ji=13337;});var Mo={};j(Mo,{createDefaultDeliveryCommand:()=>zi,createDeliveryCommand:()=>To,deliveryCliError:()=>Io});async function Io(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 To(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"),m=(d,g)=>console.log(g?JSON.stringify(d,null,2):JSON.stringify(d)),p=async(d,g)=>{try{m(await d(),g);}catch(h){m(await Io(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 p(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 p(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 p(async()=>{let{getRuntimeManager:g}=await Promise.resolve().then(()=>(se(),Be)),h=g(),v=await h.status();if(!v)return {ok:true,project:d.project,stopped:false,reason:"runtime_not_found"};if(d.staleOnly&&v.status==="ready")return {ok:true,project:d.project,stopped:false,reason:"runtime_is_ready"};let y=await h.stop();return {ok:true,project:d.project,stopped:y.stopped,runtimeStatus:y.state?.status??"stopped"}},d.json);}),l(r.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(d,g)=>{await p(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 p(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 p(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(v,y)=>{await p(f(y.project,R=>R[g](v,{...i(y,y.idempotencyKey),turn:Number(y.turn),stage:y.stage,...y.artifactHash?{artifactHash:y.artifactHash}:{},...y.planFile?{plan:JSON.parse(readFileSync$1(y.planFile,"utf8"))}:{},reason:y.reason})),y.json);});}return l(r.command("resume").argument("<caseId>").option("--continue","Resume the same recoverable case")).action(async(d,g)=>{await p(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 p(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 p(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 p(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 p(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 p(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 p(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 p(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 p(f(g.project,h=>h.export(d,{...i(g,g.idempotencyKey),path:g.path})),g.json);}),r}function zi(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 i.close?new Proxy(i.facade,{get(a,c,l){let u=Reflect.get(a,c,l);return typeof u!="function"?u:async(...m)=>{try{return await u.apply(a,m)}finally{await i.close?.();}}}}):i.facade};return To(void 0,o=>n(o,false),e,o=>n(o,true))}var Lo=D(()=>{});var Wo={};j(Wo,{aggregateShadowDenials:()=>fn,createHooksCommand:()=>oa,renderShadowStats:()=>hn});function Dt(){return process.cwd()}function Ot(e){return join(e,".devflow","config.json")}function mn(e){try{return JSON.parse(readFileSync(Ot(e),"utf8"))}catch{return {}}}function Fo(e,t){mkdirSync(join(e,".devflow"),{recursive:true}),writeFileSync(Ot(e),`${JSON.stringify(t,null,2)}
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,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {readFileSync as readFileSync$1,existsSync as existsSync$1,lstatSync,realpathSync,mkdirSync as mkdirSync$1,cpSync,renameSync,rmSync,readdirSync as readdirSync$1,writeFileSync as writeFileSync$1,statSync as statSync$1,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import S from'chalk';import sn,{existsSync,readFileSync,readdirSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Oo,{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 er 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 Ml 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 Fi=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)Fi(e,n,{get:t[n],enumerable:true});};var Be={};j(Be,{DEFAULT_SERVER_PORT:()=>Ji,ensureCliRuntime:()=>$o,getRuntimeManager:()=>Oe,resolveServerLaunch:()=>Ao,serverStatus:()=>ot,startServer:()=>ln,stopServer:()=>un});function Ao(e=process.cwd()){let t=[()=>Ki.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 Oe(){return createRuntimeManager()}async function $o(e){return Oe().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:Ao(e.projectRoot)})}async function ln(e={}){let t=e.projectRoot??process.cwd(),n=await $o({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 Oe().stop()).stopped}async function ot(){let e=await Oe().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var Ki,Ji,se=C(()=>{Ki=createRequire$1(import.meta.url),Ji=13337;});var Mo={};j(Mo,{createDefaultDeliveryCommand:()=>zi,createDeliveryCommand:()=>To,deliveryCliError:()=>Io});async function Io(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 To(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"),m=(d,g)=>console.log(g?JSON.stringify(d,null,2):JSON.stringify(d)),p=async(d,g)=>{try{m(await d(),g);}catch(h){m(await Io(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 p(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 p(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 p(async()=>{let{getRuntimeManager:g}=await Promise.resolve().then(()=>(se(),Be)),h=g(),v=await h.status();if(!v)return {ok:true,project:d.project,stopped:false,reason:"runtime_not_found"};if(d.staleOnly&&v.status==="ready")return {ok:true,project:d.project,stopped:false,reason:"runtime_is_ready"};let y=await h.stop();return {ok:true,project:d.project,stopped:y.stopped,runtimeStatus:y.state?.status??"stopped"}},d.json);}),l(r.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(d,g)=>{await p(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 p(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 p(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(v,y)=>{await p(f(y.project,R=>R[g](v,{...i(y,y.idempotencyKey),turn:Number(y.turn),stage:y.stage,...y.artifactHash?{artifactHash:y.artifactHash}:{},...y.planFile?{plan:JSON.parse(readFileSync$1(y.planFile,"utf8"))}:{},reason:y.reason})),y.json);});}return l(r.command("resume").argument("<caseId>").option("--continue","Resume the same recoverable case")).action(async(d,g)=>{await p(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 p(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 p(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 p(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 p(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 p(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 p(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 p(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 p(f(g.project,h=>h.export(d,{...i(g,g.idempotencyKey),path:g.path})),g.json);}),r}function zi(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(...m)=>{try{return await u.apply(a,m)}finally{await i.close?.();}}}})};return To(void 0,o=>n(o,false),e,o=>n(o,true))}var Lo=C(()=>{});var Wo={};j(Wo,{aggregateShadowDenials:()=>fn,createHooksCommand:()=>oa,renderShadowStats:()=>hn});function Ct(){return process.cwd()}function Ot(e){return join(e,".devflow","config.json")}function mn(e){try{return JSON.parse(readFileSync(Ot(e),"utf8"))}catch{return {}}}function Fo(e,t){mkdirSync(join(e,".devflow"),{recursive:true}),writeFileSync(Ot(e),`${JSON.stringify(t,null,2)}
3
3
  `);}function ta(e){let t=e.trim().replace(/_/g,"-").toLowerCase();return pn.includes(t)?t:void 0}function na(e){if(process.env.DEVFLOW_DISABLED==="1")return true;try{return existsSync(join(getDevFlowStateRoot(),"disable"))}catch{return false}}function fn(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 m=u.data??{},p=typeof m.timestamp=="number"?m.timestamp:0;if(p<o)continue;let f=typeof m.code=="string"&&m.code.trim()?m.code.trim():"DEVFLOW_POLICY",d=typeof m.tool=="string"&&m.tool.trim()?m.tool.trim():"unknown",g=typeof m.reason=="string"?m.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,p>=h.lastSeenAt&&(h.lastSeenAt=p,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 hn(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 oa(){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=Dt(),n=mn(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: ${S.cyan(r)}\uFF08${s}\uFF09`),console.log(`kill switch: ${na()?S.red("\u5DF2\u7981\u7528\uFF08hooks \u5168\u90E8\u7A7A\u9000\u51FA\uFF09"):S.green("\u672A\u89E6\u53D1")}`),console.log(i.length>0?`\u5DF2\u7981\u7528 handlers: ${i.join(", ")}`:"\u5DF2\u7981\u7528 handlers: \u65E0"),console.log(hn(fn(t)));}),e.command("profile <name>").description(`Set the project hook profile (${gn.join(" | ")})`).action(t=>{if(!gn.includes(t)){console.error(`\u672A\u77E5 profile\uFF1A${t}\uFF08\u53EF\u9009\uFF1A${gn.join(" | ")}\uFF09`),process.exitCode=1;return}let n=Dt(),o=mn(n);o.hooks={...o.hooks,profile:t},Fo(n,o),console.log(`\u5DF2\u5199\u5165 ${Ot(n)} \u2192 hooks.profile = ${S.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 (${pn.join(" | ")})`).action(o=>{let r=ta(o);if(!r){console.error(`\u672A\u77E5 handler\uFF1A${o}\uFF08\u53EF\u9009\uFF1A${pn.join(" | ")}\uFF09`),process.exitCode=1;return}let s=Dt(),i=mn(s),a=new Set(i.hooks?.disabledHandlers??[]);n?a.delete(r):a.add(r),i.hooks={...i.hooks,disabledHandlers:[...a].sort()},Fo(s,i),console.log(`${r} \u5DF2${n?"\u542F\u7528":"\u7981\u7528"}\uFF08${Ot(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=fn(Dt(),Math.max(1,Number(t.days)||14));console.log(t.json?JSON.stringify(n):hn(n));}),e}var gn,pn,Uo=D(()=>{gn=["minimal","standard","strict","advise"],pn=["session-start","user-prompt-submit","pre-tool-use","post-tool-use","post-tool-use-failure","stop","session-end","pre-compact","memory-snapshot"];});var Ko={};j(Ko,{renderLogCleanupResult:()=>ia,runLogsCleanupCommand:()=>sa});function qo(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:qo(e.olderThanDays,"older-than"),maxBytes:qo(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function Bo(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ia(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${Bo(e.deletedBytes)}`,` Remaining: ${Bo(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
7
- `)}var Jo=D(()=>{});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 xe(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 ha)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!ge(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Vo(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,wn);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:Vo(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 it(e,t){let n=ya(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=Yo(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=vn(c.content),m=readFileSync$1(l,"utf-8"),p=vn(m);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:p,isKnownDevFlowArtifact:u===p});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function Go(e,t,n,o=Date.now,r={}){let s=it(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()||vn(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(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$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
8
- `,"utf-8"),a}function ya(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=Yo(r);s&&t.set(s.name,r);}return t}function Yo(e){try{if(!lstatSync(e).isFile())return null;let t=readFileSync$1(e,"utf-8"),n=t.match(/^name:\s*([^\s]+)\s*$/m);return n?.[1]?{name:n[1],content:t}:null}catch{return null}}function vn(e){return createHash("sha256").update(e).digest("hex")}function Vo(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 Zo(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$1(dirname$1(e),{recursive:true});let o=ge(n.enabledPlugins)?n.enabledPlugins:{};if(o[jt]=true,n.enabledPlugins=o,t){let r=ge(n.extraKnownMarketplaces)?n.extraKnownMarketplaces:{};r[$t]={source:{source:"directory",path:t}},n.extraKnownMarketplaces=r;}writeFileSync$1(e,`${JSON.stringify(n,null,2)}
9
- `);}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,$t,wn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&xt(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$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&xt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&xt(a,join$1(o,"skills")),ka(o,e),ba(o),va(t,o),wa(t,o,n);}function va(e,t){let n=join$1(e,".."),o=dirname$1(t),r=join$1(o,".claude-plugin");mkdirSync$1(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$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:$t,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:wn,source:s}]},null,2)}
10
- `);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(!ge(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[$t]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
11
- `);}function wa(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(!ge(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname$1(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!ge(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=>ge(f)&&f.scope==="user"),u=new Date().toISOString(),m=ge(l)&&typeof l.installedAt=="string"?l.installedAt:u,p=c.filter(f=>!ge(f)||f.scope!=="user");i[jt]=[...p,{scope:"user",installPath:t,version:n,installedAt:m,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
12
- `);}function ge(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ka(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function xt(e,t){mkdirSync$1(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()?xt(o,r):cpSync(o,r,{force:true});}}function ba(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){let r=join$1(t,o);statSync$1(r).isDirectory()&&rmSync(r,{recursive:true,force:true});}}var jt,$t,wn,ha,Je=D(()=>{jt="devflow@devflow-local",$t="devflow-local",wn="devflow",ha=["devflow@devflow-local","devflow@devflow"];});var sr={};j(sr,{initProject:()=>Da,renderInitReport:()=>rr});async function Da(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json"),s=existsSync(r),i=s?Oa(r):{},a=ja(e,i);(!s||t.force||!or(i))&&(writeFileSync(r,JSON.stringify({...i,version:"0.1.0",initialized:new Date().toISOString(),...a},null,2),"utf-8"),o.push(".devflow/config.json"));let c={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(tr.isInitialized(e)||await tr.init(e,{index:t.scan!==false}),t.scan!==false){let u;try{u=await createEngines(e);let{indexer:m,graph:p}=u,{files:f,symbols:d,imports:g}=await m.indexAll(e),h=await p.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 m=join(n,"init-report.md");writeFileSync(m,rr(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(),m=homedir(),p=join(m,".claude","plugins","cache"),f=join(u,"package.json"),d=existsSync(f)?JSON.parse(readFileSync(f,"utf-8")).version:"0.0.0";Tt(u,p,d),c.pluginDeployed=!0;let g=join(p,"devflow-local","devflow",d);l=g;try{c.migratedLegacySkills=Go(m,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(),m=join(u,".claude","settings.json");Zo(m,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 Oa(e){try{let t=JSON.parse(readFileSync(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return {}}}function or(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function ja(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(or(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function rr(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(`
13
- `)}var tr,ir=D(()=>{Je();tr=er.default??er;});var ar={};j(ar,{reviewPluginMemoryHints:()=>Na});async function Na(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Ia).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 m=s.get(u);for(let p of m?.memory?.project?.conventions??[])i.push({id:`${u}:${p.key}`,pluginName:u,convention:p});}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??Ta)(e,l),{available:i.length,selected:l.length}}function Ia(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ta(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 cr=D(()=>{});function Ae(){let e=[join(process.cwd(),"plugin-registry.json"),join(Ua,"../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 lr(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Wa,Ua,Lt=D(()=>{Wa=fileURLToPath$1(import.meta.url),Ua=dirname(Wa);});async function N(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??Za();if(!r)return n();let s=Xa(r),i=false,a=ur.get(r);if(a&&Date.now()-a.ts<Ya?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await Qa(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),ur.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function Za(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function Qa(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function Xa(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 ur,Ya,Se=D(()=>{ur=new Map,Ya=3e4;});var gr=D(()=>{});var ct={};j(ct,{installSkill:()=>$e,listSkills:()=>vr,listSkillsSync:()=>sc,searchSkills:()=>ic,uninstallSkill:()=>Rn});async function vr(e){return N(process.cwd(),async t=>(await t.listPlugins()).map(o=>({name:o.name,version:o.version,description:o.description,icon:o.icon,tags:o.tags??[],installed:true})),async()=>{let t=await loadPlugins();return Array.from(t.values()).map(n=>({name:n.meta.name,version:n.meta.version,description:n.meta.description,icon:n.meta.icon,tags:n.meta.tags,installed:true}))},{skipServer:true})}function sc(){return []}async function ic(e,t){let n=await vr(),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 wr(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 kr(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function br(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
14
- `,"utf-8"),renameSync$1(o,n);}async function $e(e,t=process.cwd(),n){return N(t,async o=>await o.installPlugin(e),async()=>{let o=wr(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(at,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",at,o],{stdio:"pipe",timeout:6e4});let a=kr(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),br(t,a));let c=[],l="0.0.0",u=join(at,"node_modules",...o.split("/"));try{let m=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=m?.devflow?.templates??[],l=typeof m.version=="string"?m.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 m=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(m){let p={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&m.onUpdate?await m.onUpdate(p,i.version):!i&&m.onInstall&&await m.onInstall(p);}}catch(m){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:m.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${m.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Rn(e,t=process.cwd(),n){return N(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=wr(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=kr(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),br(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",at,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(at,"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 at,_e=D(()=>{Se();gr();at=getPluginInstallRoot();});var En={};j(En,{detectTechStack:()=>cc,guidePluginInstallation:()=>uc,installPluginsFromList:()=>lc,resolvePluginName:()=>_r});function cc(e){let t=Ae();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function _r(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function lc(e){let t=e.split(",").map(_r).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await $e(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function uc(e){let t=Ae();if(t.plugins.length===0)return console.log(`
6
+ `)}function oa(){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=Ct(),n=mn(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: ${S.cyan(r)}\uFF08${s}\uFF09`),console.log(`kill switch: ${na()?S.red("\u5DF2\u7981\u7528\uFF08hooks \u5168\u90E8\u7A7A\u9000\u51FA\uFF09"):S.green("\u672A\u89E6\u53D1")}`),console.log(i.length>0?`\u5DF2\u7981\u7528 handlers: ${i.join(", ")}`:"\u5DF2\u7981\u7528 handlers: \u65E0"),console.log(hn(fn(t)));}),e.command("profile <name>").description(`Set the project hook profile (${gn.join(" | ")})`).action(t=>{if(!gn.includes(t)){console.error(`\u672A\u77E5 profile\uFF1A${t}\uFF08\u53EF\u9009\uFF1A${gn.join(" | ")}\uFF09`),process.exitCode=1;return}let n=Ct(),o=mn(n);o.hooks={...o.hooks,profile:t},Fo(n,o),console.log(`\u5DF2\u5199\u5165 ${Ot(n)} \u2192 hooks.profile = ${S.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 (${pn.join(" | ")})`).action(o=>{let r=ta(o);if(!r){console.error(`\u672A\u77E5 handler\uFF1A${o}\uFF08\u53EF\u9009\uFF1A${pn.join(" | ")}\uFF09`),process.exitCode=1;return}let s=Ct(),i=mn(s),a=new Set(i.hooks?.disabledHandlers??[]);n?a.delete(r):a.add(r),i.hooks={...i.hooks,disabledHandlers:[...a].sort()},Fo(s,i),console.log(`${r} \u5DF2${n?"\u542F\u7528":"\u7981\u7528"}\uFF08${Ot(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=fn(Ct(),Math.max(1,Number(t.days)||14));console.log(t.json?JSON.stringify(n):hn(n));}),e}var gn,pn,Uo=C(()=>{gn=["minimal","standard","strict","advise"],pn=["session-start","user-prompt-submit","pre-tool-use","post-tool-use","post-tool-use-failure","stop","session-end","pre-compact","memory-snapshot"];});var Ko={};j(Ko,{renderLogCleanupResult:()=>ia,runLogsCleanupCommand:()=>sa});function qo(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:qo(e.olderThanDays,"older-than"),maxBytes:qo(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function Bo(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function ia(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${Bo(e.deletedBytes)}`,` Remaining: ${Bo(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
7
+ `)}var Jo=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 xe(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 ha)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:Vo(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,wn);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:Vo(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 it(e,t){let n=ya(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=Yo(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=vn(c.content),m=readFileSync$1(l,"utf-8"),p=vn(m);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:p,isKnownDevFlowArtifact:u===p});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function Go(e,t,n,o=Date.now,r={}){let s=it(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()||vn(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(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$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
8
+ `,"utf-8"),a}function ya(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=Yo(r);s&&t.set(s.name,r);}return t}function Yo(e){try{if(!lstatSync(e).isFile())return null;let t=readFileSync$1(e,"utf-8"),n=t.match(/^name:\s*([^\s]+)\s*$/m);return n?.[1]?{name:n[1],content:t}:null}catch{return null}}function vn(e){return createHash("sha256").update(e).digest("hex")}function Vo(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 Zo(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$1(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[At]={source:{source:"directory",path:t}},n.extraKnownMarketplaces=r;}writeFileSync$1(e,`${JSON.stringify(n,null,2)}
9
+ `);}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,At,wn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&xt(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$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&xt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&xt(a,join$1(o,"skills")),ka(o,e),Sa(o),va(t,o),wa(t,o,n);}function va(e,t){let n=join$1(e,".."),o=dirname$1(t),r=join$1(o,".claude-plugin");mkdirSync$1(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$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:At,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:wn,source:s}]},null,2)}
10
+ `);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[At]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
11
+ `);}function wa(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$1(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(),m=me(l)&&typeof l.installedAt=="string"?l.installedAt:u,p=c.filter(f=>!me(f)||f.scope!=="user");i[jt]=[...p,{scope:"user",installPath:t,version:n,installedAt:m,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
12
+ `);}function me(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ka(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function xt(e,t){mkdirSync$1(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()?xt(o,r):cpSync(o,r,{force:true});}}function Sa(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$1(i,`${Date.now()}
13
+ `);continue}Date.now()-a>ba&&rmSync(r,{recursive:true,force:true});}}var jt,At,wn,ha,ba,Ve=C(()=>{jt="devflow@devflow-local",At="devflow-local",wn="devflow",ha=["devflow@devflow-local","devflow@devflow"];ba=1440*60*1e3;});var sr={};j(sr,{initProject:()=>Oa,renderInitReport:()=>rr});async function Oa(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json"),s=existsSync(r),i=s?ja(r):{},a=xa(e,i);(!s||t.force||!or(i))&&(writeFileSync(r,JSON.stringify({...i,version:"0.1.0",initialized:new Date().toISOString(),...a},null,2),"utf-8"),o.push(".devflow/config.json"));let c={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(tr.isInitialized(e)||await tr.init(e,{index:t.scan!==false}),t.scan!==false){let u;try{u=await createEngines(e);let{indexer:m,graph:p}=u,{files:f,symbols:d,imports:g}=await m.indexAll(e),h=await p.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 m=join(n,"init-report.md");writeFileSync(m,rr(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(),m=homedir(),p=join(m,".claude","plugins","cache"),f=join(u,"package.json"),d=existsSync(f)?JSON.parse(readFileSync(f,"utf-8")).version:"0.0.0";Tt(u,p,d),c.pluginDeployed=!0;let g=join(p,"devflow-local","devflow",d);l=g;try{c.migratedLegacySkills=Go(m,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(),m=join(u,".claude","settings.json");Zo(m,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 or(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function xa(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(or(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function rr(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(`
14
+ `)}var tr,ir=C(()=>{Ve();tr=er.default??er;});var ar={};j(ar,{reviewPluginMemoryHints:()=>Ia});async function Ia(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Ta).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 m=s.get(u);for(let p of m?.memory?.project?.conventions??[])i.push({id:`${u}:${p.key}`,pluginName:u,convention:p});}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??Ma)(e,l),{available:i.length,selected:l.length}}function Ta(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ma(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 cr=C(()=>{});function Ne(){let e=[join(process.cwd(),"plugin-registry.json"),join(qa,"../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 lr(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Ua,qa,Lt=C(()=>{Ua=fileURLToPath$1(import.meta.url),qa=dirname(Ua);});async function $(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??Qa();if(!r)return n();let s=ec(r),i=false,a=ur.get(r);if(a&&Date.now()-a.ts<Za?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await Xa(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),ur.set(r,{result:i,ts:Date.now()})),i){let c=new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s});return t(c)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}function Qa(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function Xa(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function ec(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 ur,Za,Se=C(()=>{ur=new Map,Za=3e4;});var gr=C(()=>{});var ct={};j(ct,{installSkill:()=>Ae,listSkills:()=>vr,listSkillsSync:()=>ic,searchSkills:()=>ac,uninstallSkill:()=>Rn});async function vr(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 ic(){return []}async function ac(e,t){let n=await vr(),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 wr(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 kr(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function br(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
15
+ `,"utf-8"),renameSync$1(o,n);}async function Ae(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=wr(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(at,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",at,o],{stdio:"pipe",timeout:6e4});let a=kr(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),br(t,a));let c=[],l="0.0.0",u=join(at,"node_modules",...o.split("/"));try{let m=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=m?.devflow?.templates??[],l=typeof m.version=="string"?m.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 m=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(m){let p={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&m.onUpdate?await m.onUpdate(p,i.version):!i&&m.onInstall&&await m.onInstall(p);}}catch(m){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:m.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${m.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Rn(e,t=process.cwd(),n){return $(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=wr(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=kr(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),br(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",at,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(at,"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 at,_e=C(()=>{Se();gr();at=getPluginInstallRoot();});var En={};j(En,{detectTechStack:()=>lc,guidePluginInstallation:()=>dc,installPluginsFromList:()=>uc,resolvePluginName:()=>_r});function lc(e){let t=Ne();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function _r(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function uc(e){let t=e.split(",").map(_r).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Ae(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function dc(e){let t=Ne();if(t.plugins.length===0)return console.log(`
15
16
  No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
16
17
  `),[];console.log(`
17
18
  \u{1F50C} Plugin Installation Guide
18
19
  `);let n=resolveProjectCapabilityProfile(e,{registry:t}),o=n.detectedStacks;o.length>0&&console.log(`Detected tech stack: ${o.join(", ")}
19
20
  `);let r=new Set(n.selectedPlugins);if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
20
- `);let a=[...r];for(let c of a)try{await $e(c,e,!0),console.log(`\u2713 ${c}`);}catch{console.error(`\u2717 Failed to install ${c}`);}return a}let s=t.plugins.map(a=>({name:`${a.name.replace("@devflow-tools/","")} - ${a.description.substring(0,50)}`,value:a.name,checked:r.has(a.name)})),i;try{i=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:s});}catch{return console.log(`
21
+ `);let a=[...r];for(let c of a)try{await Ae(c,e,!0),console.log(`\u2713 ${c}`);}catch{console.error(`\u2717 Failed to install ${c}`);}return a}let s=t.plugins.map(a=>({name:`${a.name.replace("@devflow-tools/","")} - ${a.description.substring(0,50)}`,value:a.name,checked:r.has(a.name)})),i;try{i=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:s});}catch{return console.log(`
21
22
  Plugin installation cancelled.
22
23
  `),[]}if(i.length>0){console.log(`
23
24
  Installing selected plugins...
24
- `);for(let a of i)try{await $e(a,e,!0),console.log(`\u2713 ${a}
25
+ `);for(let a of i)try{await Ae(a,e,!0),console.log(`\u2713 ${a}
25
26
  `);}catch{console.error(`\u2717 Failed to install ${a}
26
27
  `);}}else console.log(`
27
28
  Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
28
- `);return i}var Pn=D(()=>{Lt();_e();});var Nr={};j(Nr,{ResetExecutionError:()=>lt,executeResetCommand:()=>Ac,formatResetResult:()=>xn,runReset:()=>$r});function _c(){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 xn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Rc(e){return e==="all"||Or.includes(e)}function ie(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function Dn(e){let t=resolve(e),n=[];for(;!ie(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 An(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Ec(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 jr(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=ie(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(ie(t)){let o=realpathSync(t);if(!An(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Pc(e,t){return (e==="all"?Or:[e]).map(o=>({scope:o,path:join$1(t,...Dr[o])}))}function xr(e,t){let n=ie(t);if(n)return jr(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Ar(e,t){let n=xr(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 Cc(e){let t=ie(e);if(!t?.isFile()||t.size<Cn.length)return false;let n=Buffer.alloc(Cn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(Cn)}finally{closeSync(o);}}function Dc(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}Cc(o)&&t.push(o);}}return n(e),t}function Oc(e,t){mkdirSync$1(dirname$1(t),{recursive:true});let n=new(_c())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function jc(e,t,n){let o=Dc(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));Oc(s,i);}}function xc(e,t,n,o,r){let s=!!ie(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),jc(c.path,join$1(i,c.scope),()=>Ar(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(ie(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&ie(t))try{rmdirSync(t);}catch{}}}function $r(e,t={}){if(!Rc(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Ec(e.project??process.cwd()),o=Pc(e.scope,n);for(let c of o)jr(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=xr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?Dn(e.backupTo):void 0;if(s){let c=ie(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=Dn(l.path),m=join$1(s,l.scope),p=Dn(m);if(An(u,p)||An(p,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${p}`);if(ie(m))throw new Error(`Backup destination already exists: ${m}`)}}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&&xc(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Ar(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new lt(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Ac(e,t={},n=console){try{let o=$r(e,t),r=xn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof lt)for(let r of xn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ft,lt,Dr,Or,Cn,Ir=D(()=>{lt=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Dr={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Or=Object.keys(Dr),Cn=Buffer.from("SQLite format 3\0","binary");});var Ur={};j(Ur,{cleanupProject:()=>zc});function Lr(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}function Bc(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&&Lr(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)&&Lr(i.pid));if(s)throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${s.pid}).`)}function Kc(e,t){let n=getDaemonRegistryPath(t);if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf8"));writeFileSync$1(n,`${JSON.stringify(o.filter(r=>r.rootPath!==e),null,2)}
29
- `,{mode:384});}function Wr(e,t){return new Set(e.prepare(`PRAGMA table_info("${t}")`).all().map(n=>n.name))}function Jc(e){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'").all().flatMap(({name:n})=>{let o=Wr(e,n);return o.has("project_root")?[{name:n,hasSessionId:o.has("session_id")}]:[]})}function Fr(e){return new Set(e.prepare("PRAGMA foreign_key_check").all().map(t=>`${t.table}:${t.rowid}:${t.parent}:${t.fkid}`))}function Vc(e,t){let n={},o=Jc(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)Wr(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 zc(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};Bc(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$1(a,{recursive:true,mode:448});let c=new DatabaseSync(i),l,u;try{c.exec("PRAGMA busy_timeout = 5000"),await qc(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 m=Fr(c);c.exec("BEGIN IMMEDIATE");let p;try{if(p=Vc(c,n),[...Fr(c)].filter(d=>!m.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}),Kc(n,o),{projectRoot:n,backupDirectory:a,...p,projectDataRemoved:!!l}}finally{c.close();}}var qc,qr=D(()=>{qc=createRequire$1(import.meta.url)("node:sqlite").backup;});var Qr={};j(Qr,{consolidateDatabases:()=>Qc,formatConsolidateResult:()=>Xc});function Qc(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=[Kr("project",o,s?n:void 0),Kr("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"),m=join$1(e.backupRoot??u,l);mkdirSync$1(m,{recursive:true}),a.backupDir=m;let p=c.some(f=>f.kind==="project")?el(o):null;try{let f=new Map;for(let v of c){let y=join$1(m,`${v.kind}-${basename(v.path)}.snapshot`);Jr(v.path,y),f.set(v.kind,y);}s&&Jr(n,join$1(m,"global-devflow.db.before"));let d=f.has("project")?nl(o,m):[];a.retired.push(...d.map(v=>v.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")&&Vr(g,"project_source",void 0,a.inserted),f.has("codegraph")){Vr(g,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let y of gt(g,"codegraph_source").filter(R=>R.startsWith("devflow_")))g.exec(`DROP TABLE codegraph_source.${H(y)}`);}g.exec("COMMIT"),h=!1;}catch(v){if(h)try{g?.exec("ROLLBACK");}catch{}throw Zr(d),v}finally{g?.close();}return a}finally{tl(p);}}function Xc(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 Kr(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 gt(r).filter(c=>!i||i.has(c)))o.tables[a]=Fn(r,a),o.conflicts[a]=s&&gt(s).includes(a)?ol(r,s,a):0;}finally{r.close(),s?.close();}return o}function Jr(e,t){mkdirSync$1(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 el(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 tl(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function nl(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 Zr(n),o}return n}function Zr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Vr(e,t,n,o){let r=new Set(gt(e)),s=gt(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(Ln.has(i)&&(l=l.filter(d=>d.pk===0)),l.length===0)continue;let u=Fn(e,i),m=l.map(d=>H(d.name)).join(", "),p=l.map(d=>`s.${H(d.name)}`).join(", ");if(l.filter(d=>d.pk>0).length>0&&!Ln.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${m}) SELECT ${p} 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(`
29
+ `);return i}var Pn=C(()=>{Lt();_e();});var $r={};j($r,{ResetExecutionError:()=>lt,executeResetCommand:()=>Ac,formatResetResult:()=>xn,runReset:()=>Ar});function Rc(){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 xn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Ec(e){return e==="all"||Or.includes(e)}function ae(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function Cn(e){let t=resolve(e),n=[];for(;!ae(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 Nn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Pc(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 jr(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=ae(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(ae(t)){let o=realpathSync(t);if(!Nn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Dc(e,t){return (e==="all"?Or:[e]).map(o=>({scope:o,path:join$1(t,...Cr[o])}))}function xr(e,t){let n=ae(t);if(n)return jr(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Nr(e,t){let n=xr(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 Cc(e){let t=ae(e);if(!t?.isFile()||t.size<Dn.length)return false;let n=Buffer.alloc(Dn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(Dn)}finally{closeSync(o);}}function Oc(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}Cc(o)&&t.push(o);}}return n(e),t}function jc(e,t){mkdirSync$1(dirname$1(t),{recursive:true});let n=new(Rc())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function xc(e,t,n){let o=Oc(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 Nc(e,t,n,o,r){let s=!!ae(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),xc(c.path,join$1(i,c.scope),()=>Nr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(ae(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&&ae(t))try{rmdirSync(t);}catch{}}}function Ar(e,t={}){if(!Ec(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Pc(e.project??process.cwd()),o=Dc(e.scope,n);for(let c of o)jr(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=xr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?Cn(e.backupTo):void 0;if(s){let c=ae(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=Cn(l.path),m=join$1(s,l.scope),p=Cn(m);if(Nn(u,p)||Nn(p,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${p}`);if(ae(m))throw new Error(`Backup destination already exists: ${m}`)}}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&&Nc(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Nr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new lt(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Ac(e,t={},n=console){try{let o=Ar(e,t),r=xn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof lt)for(let r of xn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var Ft,lt,Cr,Or,Dn,Ir=C(()=>{lt=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Cr={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Or=Object.keys(Cr),Dn=Buffer.from("SQLite format 3\0","binary");});var Ur={};j(Ur,{cleanupProject:()=>Gc});function Lr(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}function Kc(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&&Lr(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)&&Lr(i.pid));if(s)throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${s.pid}).`)}function Jc(e,t){let n=getDaemonRegistryPath(t);if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf8"));writeFileSync$1(n,`${JSON.stringify(o.filter(r=>r.rootPath!==e),null,2)}
30
+ `,{mode:384});}function Wr(e,t){return new Set(e.prepare(`PRAGMA table_info("${t}")`).all().map(n=>n.name))}function Vc(e){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'").all().flatMap(({name:n})=>{let o=Wr(e,n);return o.has("project_root")?[{name:n,hasSessionId:o.has("session_id")}]:[]})}function Fr(e){return new Set(e.prepare("PRAGMA foreign_key_check").all().map(t=>`${t.table}:${t.rowid}:${t.parent}:${t.fkid}`))}function zc(e,t){let n={},o=Vc(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)Wr(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 Gc(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};Kc(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$1(a,{recursive:true,mode:448});let c=new DatabaseSync(i),l,u;try{c.exec("PRAGMA busy_timeout = 5000"),await Bc(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 m=Fr(c);c.exec("BEGIN IMMEDIATE");let p;try{if(p=zc(c,n),[...Fr(c)].filter(d=>!m.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}),Jc(n,o),{projectRoot:n,backupDirectory:a,...p,projectDataRemoved:!!l}}finally{c.close();}}var Bc,qr=C(()=>{Bc=createRequire$1(import.meta.url)("node:sqlite").backup;});var Qr={};j(Qr,{consolidateDatabases:()=>Xc,formatConsolidateResult:()=>el});function Xc(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=[Kr("project",o,s?n:void 0),Kr("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"),m=join$1(e.backupRoot??u,l);mkdirSync$1(m,{recursive:true}),a.backupDir=m;let p=c.some(f=>f.kind==="project")?tl(o):null;try{let f=new Map;for(let v of c){let y=join$1(m,`${v.kind}-${basename(v.path)}.snapshot`);Jr(v.path,y),f.set(v.kind,y);}s&&Jr(n,join$1(m,"global-devflow.db.before"));let d=f.has("project")?ol(o,m):[];a.retired.push(...d.map(v=>v.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")&&Vr(g,"project_source",void 0,a.inserted),f.has("codegraph")){Vr(g,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let y of gt(g,"codegraph_source").filter(R=>R.startsWith("devflow_")))g.exec(`DROP TABLE codegraph_source.${H(y)}`);}g.exec("COMMIT"),h=!1;}catch(v){if(h)try{g?.exec("ROLLBACK");}catch{}throw Zr(d),v}finally{g?.close();}return a}finally{nl(p);}}function el(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 Kr(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 gt(r).filter(c=>!i||i.has(c)))o.tables[a]=Fn(r,a),o.conflicts[a]=s&&gt(s).includes(a)?rl(r,s,a):0;}finally{r.close(),s?.close();}return o}function Jr(e,t){mkdirSync$1(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 tl(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 nl(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function ol(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 Zr(n),o}return n}function Zr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Vr(e,t,n,o){let r=new Set(gt(e)),s=gt(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(Ln.has(i)&&(l=l.filter(d=>d.pk===0)),l.length===0)continue;let u=Fn(e,i),m=l.map(d=>H(d.name)).join(", "),p=l.map(d=>`s.${H(d.name)}`).join(", ");if(l.filter(d=>d.pk>0).length>0&&!Ln.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${m}) SELECT ${p} 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
31
  INSERT INTO main.${H(i)} (${m})
31
32
  SELECT ${p} FROM ${H(t)}.${H(i)} s
32
33
  WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${d})
33
- `);}o[i]=(o[i]??0)+(Fn(e,i)-u);}}function ol(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||Ln.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(m=>u[m.name]))?1:0),0)}function gt(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 Fn(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 Ln,Xr=D(()=>{Ln=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var es={};j(es,{connectAgent:()=>il,getAvailableAgents:()=>al});async function il(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 al(){return listAdapters()}var ts=D(()=>{});var os={};j(os,{getIndexStatus:()=>cl,refreshIndex:()=>ll});async function cl(e){return N(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function ll(e){return N(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var rs=D(()=>{Se();});var ss={};j(ss,{getGraph:()=>dl});async function dl(e={}){let t=e.target??"all",n=e.depth??2;return N(process.cwd(),o=>o.getGraph(t,n),async()=>{let{graph:o}=await createEngines(process.cwd());if(t==="all")return o.export();let r=o.getSubGraph(t,n);return {nodes:r.nodes,edges:r.edges}},{skipServer:e.skipServer})}var is=D(()=>{Se();});var Hn={};j(Hn,{getContext:()=>pl,getTaskContext:()=>fl});async function pl(e){return N(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function fl(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return N(t,o=>o.buildTaskContext(e.query,t,n),async()=>{let{context:o,codegraph:r}=await createEngines(t),s=r.getStats().lastUpdated,i=s>0?Date.now()-s:0,a=`diagnostic:${stableRuntimeHash({rootPath:t,query:e.query,taskOptions:n})}`;return projectDiagnosticCodeResult(await o.buildTaskContext(e.query,n),i,{projectRoot:t,query:e.query,host:"cli",sessionId:a,executionId:a,requestId:a,turnId:a})},{skipServer:e.skipServer})}var Wn=D(()=>{Se();});var mt={};j(mt,{getWorkflowRuns:()=>cs,getWorkflowStatus:()=>vl,listWorkflows:()=>hl,runWorkflow:()=>yl});async function hl(e){return N(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function yl(e,t,n){return N(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function vl(e){return cs(e)}async function cs(e){return N(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var pt=D(()=>{Se();});var Qe={};j(Qe,{cancelWorker:()=>El,listWorkers:()=>_l,retryWorkerCleanup:()=>Pl,showWorker:()=>Rl,workerMergeStatus:()=>Cl});function _l(e){return ft(e,t=>Ze(e.json,{projectRoot:Ye(e.projectRoot),workers:t.listWorkflowWorkers(Ye(e.projectRoot))}))}function Rl(e,t){return ft(t,n=>{let o=Ye(t.projectRoot),r=qt(n,o,e);return Ze(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function El(e,t){return ft(t,n=>{let o=Ye(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"}}),Ze(t.json,s)})}function Pl(e,t){return ft(t,n=>{let o=Ye(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 Ze(t.json,s)})}function Cl(e,t){return ft(t,n=>{let o=Ye(t.projectRoot);qt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Ze(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 Ye(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function ft(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Ze(e,t){if(e)return JSON.stringify(t,null,2);if(Dl(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(Ol(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>Ze(false,o)).join(`
34
- `)}return JSON.stringify(t,null,2)}function Dl(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function Ol(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Xe=D(()=>{});var qn={};j(qn,{getEmbeddingStatus:()=>Al,prepareEmbeddings:()=>$l,renderEmbeddingStatus:()=>Nl});async function Al(){return inspectEmbeddingModel()}async function $l(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Nl(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(`
35
- `)}var Bn=D(()=>{});var Ne={};j(Ne,{backfillObservationVectors:()=>Wl,queryMemory:()=>Ll,reviewCandidates:()=>Hl,reviewMemories:()=>ql,setMemory:()=>Fl,showMemory:()=>Ml});async function Ml(e,t){let n=await N(process.cwd(),r=>r.getMemory(t),async()=>{let{memory:r}=await createEngines(process.cwd());return r.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let o=n;return Array.isArray(o.memories)?{...o,memories:o.memories.filter(r=>r?.source===t)}:n}async function Ll(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return N(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function Fl(e,t,n){return N(process.cwd(),async o=>{await o.setMemory("project",e,t);},async()=>{let{memory:o}=await createEngines(process.cwd());await o.updateUserPreference(e,t);},{skipServer:n})}async function Hl(e){return N(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Wl(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ul(e){let t=Tl.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function ql(){let t=await N(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
36
- [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ul(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await N(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await N(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
37
- Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j(us,{getDocsStatus:()=>Jl,queryKnowledge:()=>ls,searchKnowledge:()=>Kl,syncDocs:()=>Vl});async function ls(e,t,n,o){return N(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=process.cwd(),s=new KnowledgeEngine({projectRoot:r,projectId:resolveStableProjectIdentity(r).projectId,embedder:new EmbeddingProvider});return getDiagnosticKnowledgeResult(s,{query:e,scope:t,budgetTokens:n},{projectRoot:process.cwd(),adapter:"cli"})},{skipServer:o})}async function Kl(e,t,n){return (await ls(e,t,void 0,n)).results}async function Jl(e){return N(process.cwd(),t=>t.getKnowledgeSources(),()=>{let t=process.cwd();return new KnowledgeEngine({projectRoot:t,projectId:resolveStableProjectIdentity(t).projectId,embedder:new EmbeddingProvider}).getSources()},{skipServer:e})}async function Vl(e,t){return N(process.cwd(),n=>n.syncDocs(e),()=>{let n=process.cwd();return new KnowledgeEngine({projectRoot:n,projectId:resolveStableProjectIdentity(n).projectId,embedder:new EmbeddingProvider}).syncDocs(e)},{skipServer:t})}var ds=D(()=>{Se();});var Gn={};j(Gn,{backfillKnowledgeVectors:()=>Xl,resyncKnowledgeDocs:()=>Ql});function gs(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function Ql(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=gs(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Xl(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=gs(t);zn(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 zn(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw zn(t,{phase:"failed",source:e.source??"all",errorCategory:eu(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 zn(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 eu(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 Yn=D(()=>{});var ms={};j(ms,{inspectSkillHealth:()=>Bt,showSkillHealth:()=>cu});function iu(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?xe(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=[];au(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=iu(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 m=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&m!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let p=a.get(u.name)??[];p.push(l),a.set(u.name,p);}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),m=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(m)&&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 au(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 Qn=D(()=>{Je();});var Xn={};j(Xn,{showMcpHealth:()=>pu,showMcpInventory:()=>mu});async function mu(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 pu(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 eo=D(()=>{});var Xs={};j(Xs,{renderDoctorText:()=>Zs,runDoctor:()=>Yd,runDoctorAudit:()=>Qd,runDoctorAuditFix:()=>Xd,runDoctorCommand:()=>Zd,runDoctorReceipts:()=>tg,runDoctorViolations:()=>eg,runLegacyDoctorReport:()=>Qs,runStructuredDoctor:()=>wo});function Ms(){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 ae(e){return {homeDir:e.homePath,env:e.env??process.env}}function Qt(e){return join$1(getDevFlowStateRoot(ae(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 ju(e,t){let n=t.homePath??homedir$1(),o=ae(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(v=>v.status==="supported"||!!(v.reason&&v.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 m=t.activePluginRoot??xe(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(m){let h=Bt(m);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 p=readRuntimeState(o);r.push({key:"runtime_state_v2",value:p??"not registered",target:"ready while active, stopped or absent while idle",ok:!p||p.status==="ready"||p.status==="stopped",severity:p?.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 co(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function xu(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 Au(e,t){let n=co(e),o=ae(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=>xu(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:co(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 m=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:m,target:[s],ok:!0,severity:"info"});let p=u.filter((f,d)=>f.projectHash!==r||m[d]!==s).length;i.push({key:"daemon_identity_mismatches",value:p,target:0,ok:p===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 Nu(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($u)){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 Ls(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 Iu(e){let t=Ls(e);return t&&t.length>0?t:null}function no(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 Tu(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function hs(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Lu(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(Ms())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Nu(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(`
34
+ `);}o[i]=(o[i]??0)+(Fn(e,i)-u);}}function rl(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||Ln.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(m=>u[m.name]))?1:0),0)}function gt(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 Fn(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 Ln,Xr=C(()=>{Ln=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var es={};j(es,{connectAgent:()=>al,getAvailableAgents:()=>cl});async function al(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 cl(){return listAdapters()}var ts=C(()=>{});var os={};j(os,{getIndexStatus:()=>ll,refreshIndex:()=>ul});async function ll(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 ul(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var rs=C(()=>{Se();});var ss={};j(ss,{getGraph:()=>gl});async function gl(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 is=C(()=>{Se();});var Hn={};j(Hn,{getContext:()=>fl,getTaskContext:()=>hl});async function fl(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 hl(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 Wn=C(()=>{Se();});var mt={};j(mt,{getWorkflowRuns:()=>cs,getWorkflowStatus:()=>wl,listWorkflows:()=>yl,runWorkflow:()=>vl});async function yl(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function vl(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 wl(e){return cs(e)}async function cs(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var pt=C(()=>{Se();});var Xe={};j(Xe,{cancelWorker:()=>Pl,listWorkers:()=>Rl,retryWorkerCleanup:()=>Dl,showWorker:()=>El,workerMergeStatus:()=>Cl});function Rl(e){return ft(e,t=>Qe(e.json,{projectRoot:Ze(e.projectRoot),workers:t.listWorkflowWorkers(Ze(e.projectRoot))}))}function El(e,t){return ft(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 Pl(e,t){return ft(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 Dl(e,t){return ft(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 Cl(e,t){return ft(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 ft(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(Ol(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(`
35
+ `)}return JSON.stringify(t,null,2)}function Ol(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 qn={};j(qn,{getEmbeddingStatus:()=>Al,prepareEmbeddings:()=>$l,renderEmbeddingStatus:()=>Il});async function Al(){return inspectEmbeddingModel()}async function $l(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Il(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(`
36
+ `)}var Bn=C(()=>{});var $e={};j($e,{backfillObservationVectors:()=>Ul,queryMemory:()=>Fl,reviewCandidates:()=>Wl,reviewMemories:()=>Bl,setMemory:()=>Hl,showMemory:()=>Ll});async function Ll(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 Fl(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 Hl(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 Wl(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Ul(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function ql(e){let t=Ml.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Bl(){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(`
37
+ [${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await ql(" 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(`
38
+ Reviewed ${o}/${t.length} pending memories.`);}var Ie=C(()=>{Se();});var us={};j(us,{getDocsStatus:()=>Vl,queryKnowledge:()=>ls,searchKnowledge:()=>Jl,syncDocs:()=>zl});async function ls(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 Jl(e,t,n){return (await ls(e,t,void 0,n)).results}async function Vl(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 zl(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 ds=C(()=>{Se();});var Gn={};j(Gn,{backfillKnowledgeVectors:()=>eu,resyncKnowledgeDocs:()=>Xl});function gs(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function Xl(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=gs(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function eu(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=gs(t);zn(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 zn(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw zn(t,{phase:"failed",source:e.source??"all",errorCategory:tu(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 zn(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 tu(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 Yn=C(()=>{});var ms={};j(ms,{inspectSkillHealth:()=>Bt,showSkillHealth:()=>lu});function au(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?xe(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=[];cu(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=au(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 m=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&m!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let p=a.get(u.name)??[];p.push(l),a.set(u.name,p);}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),m=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(m)&&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 cu(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 lu(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 Qn=C(()=>{Ve();});var Xn={};j(Xn,{showMcpHealth:()=>fu,showMcpInventory:()=>pu});async function pu(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 fu(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 eo=C(()=>{});var Xs={};j(Xs,{renderDoctorText:()=>Zs,runDoctor:()=>Zd,runDoctorAudit:()=>Xd,runDoctorAuditFix:()=>eg,runDoctorCommand:()=>Qd,runDoctorReceipts:()=>ng,runDoctorViolations:()=>tg,runLegacyDoctorReport:()=>Qs,runStructuredDoctor:()=>wo});function Ms(){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 ce(e){return {homeDir:e.homePath,env:e.env??process.env}}function Qt(e){return join$1(getDevFlowStateRoot(ce(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 xu(e,t){let n=t.homePath??homedir$1(),o=ce(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(v=>v.status==="supported"||!!(v.reason&&v.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 m=t.activePluginRoot??xe(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(m){let h=Bt(m);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 p=readRuntimeState(o);r.push({key:"runtime_state_v2",value:p??"not registered",target:"ready while active, stopped or absent while idle",ok:!p||p.status==="ready"||p.status==="stopped",severity:p?.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 co(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Nu(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 Au(e,t){let n=co(e),o=ce(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=>Nu(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:co(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 m=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:m,target:[s],ok:!0,severity:"info"});let p=u.filter((f,d)=>f.projectHash!==r||m[d]!==s).length;i.push({key:"daemon_identity_mismatches",value:p,target:0,ok:p===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 Iu(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($u)){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 Ls(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 Tu(e){let t=Ls(e);return t&&t.length>0?t:null}function no(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 Mu(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function hs(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Fu(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(Ms())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Iu(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(`
38
39
  SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
39
40
  FROM distill_leases
40
- `);l.setReadBigInts?.(!0);let u=l.all(),m=new Set,p=0,f=0;for(let _ of u){let T=Iu(_.event_ids),J=Ls(_.session_ids),Y=no(_.event_count),x=no(_.created_at),B=no(_.expires_at),O=typeof _.status=="string"&&Mu.has(_.status)?_.status:null,A=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&Tu(Y,T.length);if(!A||!T||!J||!F||x===null||B===null||O===null){p+=1,_.status==="pending"&&(B===null||hs(B,c))&&(f+=1);continue}if(!(O!=="pending"||!hs(B,c)))for(let $ of T)m.add($);}n.push({key:"malformed_distill_leases",value:p,target:0,ok:p===0,severity:f>0?"error":"warning"});let g=i.prepare(`
41
+ `);l.setReadBigInts?.(!0);let u=l.all(),m=new Set,p=0,f=0;for(let _ of u){let T=Tu(_.event_ids),V=Ls(_.session_ids),Y=no(_.event_count),x=no(_.created_at),B=no(_.expires_at),O=typeof _.status=="string"&&Lu.has(_.status)?_.status:null,N=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&Mu(Y,T.length);if(!N||!T||!V||!F||x===null||B===null||O===null){p+=1,_.status==="pending"&&(B===null||hs(B,c))&&(f+=1);continue}if(!(O!=="pending"||!hs(B,c)))for(let A of T)m.add(A);}n.push({key:"malformed_distill_leases",value:p,target:0,ok:p===0,severity:f>0?"error":"warning"});let g=i.prepare(`
41
42
  SELECT id
42
43
  FROM session_events
43
44
  WHERE processed = 0 AND created_at < ?
@@ -58,7 +59,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j
58
59
  GROUP BY project, session_id, title
59
60
  HAVING COUNT(*) > 1
60
61
  )
61
- `).get();n.push({key:"duplicate_observation_title_groups",value:Number(k.group_count),target:0,ok:Number(k.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(k.row_count),target:0,ok:Number(k.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(Ms())(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 Fs(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function uo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Fu(e){let t=uo(Fs(e.output)),n=uo(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 Hu(e){let t=Fs(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=uo(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function ys(e,t){return t===0?0:e/t}function oo(e,t){return e===0?1:t/e}async function Wu(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 p;try{p=X(s,t),M(p,"nodes")?(o=q(p,"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{p?.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 p;try{p=X(i,t);let f=M(p,"symbols_vec_rowids")?"symbols_vec_rowids":M(p,"symbol_sources")?"symbol_sources":null;f?(r=q(p,`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{p?.close();}}if(o!==null&&r!==null){let p=oo(o,r);n.push({key:"symbols_vector_coverage",value:p,target:">= 0.90",ok:p>=.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 p;try{p=X(a,t);let d=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(g=>!M(p,g));if(d.length>0)n.push({key:"knowledge_vector_schema",value:d,target:[],ok:!1,severity:"warning"});else {let h=fe(p,"knowledge_docs").has("status")?"AND d.status = 'active'":"",v=q(p,`
62
+ `).get();n.push({key:"duplicate_observation_title_groups",value:Number(k.group_count),target:0,ok:Number(k.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(k.row_count),target:0,ok:Number(k.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(Ms())(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 Fs(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function uo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Hu(e){let t=uo(Fs(e.output)),n=uo(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 Wu(e){let t=Fs(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=uo(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function ys(e,t){return t===0?0:e/t}function oo(e,t){return e===0?1:t/e}async function Uu(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 p;try{p=X(s,t),M(p,"nodes")?(o=q(p,"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{p?.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 p;try{p=X(i,t);let f=M(p,"symbols_vec_rowids")?"symbols_vec_rowids":M(p,"symbol_sources")?"symbol_sources":null;f?(r=q(p,`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{p?.close();}}if(o!==null&&r!==null){let p=oo(o,r);n.push({key:"symbols_vector_coverage",value:p,target:">= 0.90",ok:p>=.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 p;try{p=X(a,t);let d=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(g=>!M(p,g));if(d.length>0)n.push({key:"knowledge_vector_schema",value:d,target:[],ok:!1,severity:"warning"});else {let h=fe(p,"knowledge_docs").has("status")?"AND d.status = 'active'":"",v=q(p,`
62
63
  SELECT COUNT(*) count
63
64
  FROM knowledge_chunks c
64
65
  JOIN knowledge_docs d ON d.id = c.doc_id
@@ -77,43 +78,43 @@ Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j
77
78
  LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
78
79
  WHERE 1 = 1 ${h}
79
80
  GROUP BY d.source ORDER BY d.source
80
- `).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:oo(T,J)}});n.push({key:"knowledge_chunks",value:v,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:R,target:">= 0.95",ok:R>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:k,target:"every source >= 0.95",ok:k.every(_=>_.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{p?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let p;try{if(p=X(c,t),!M(p,"observations")||!M(p,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=fe(p,"observations"),d=f.has("quality_status")&&f.has("resolution_state"),h=q(p,`SELECT COUNT(*) count FROM observations ${d?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),v=q(p,`
81
+ `).all().map(_=>{let T=Number(_.chunks),V=Number(_.vectors);return {source:_.source,chunks:T,vectors:V,coverage:oo(T,V)}});n.push({key:"knowledge_chunks",value:v,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:R,target:">= 0.95",ok:R>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:k,target:"every source >= 0.95",ok:k.every(_=>_.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{p?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let p;try{if(p=X(c,t),!M(p,"observations")||!M(p,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=fe(p,"observations"),d=f.has("quality_status")&&f.has("resolution_state"),h=q(p,`SELECT COUNT(*) count FROM observations ${d?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),v=q(p,`
81
82
  SELECT COUNT(DISTINCT e.source_id) count
82
83
  FROM embeddings e JOIN observations o ON o.id = e.source_id
83
84
  WHERE e.source_type = 'observation'
84
85
  ${d?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
85
- `),y=Math.max(0,h-v);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:v,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:y,target:0,ok:y===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{p?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(ae(t)),"errors","embedder.log"),m=0;if(existsSync$1(u))try{let p=l-864e5;m=readFileSync$1(u,"utf8").split(`
86
- `).filter(f=>{let d=/^\[([^\]]+)\]/.exec(f);return d?Date.parse(d[1])>=p:!1}).length;}catch(p){n.push({key:"embedder_error_log_read",value:p.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:m,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let p=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:p.state,modelId:p.modelId,revision:p.revision},target:{state:"ready"},ok:p.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:p.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:p.missingFiles,corruptFiles:p.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:p.missingFiles.length===0&&p.corruptFiles.length===0,severity:"warning"});}catch(p){n.push({key:"embedding_model_inspection",value:p.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function Uu(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[O,A]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(d,A)?q(d,`SELECT COUNT(*) count FROM ${A} WHERE created_at >= ?`,s):0;o.push({key:O,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"),v=fe(d,"tool_call_events"),y=fe(d,"skill_executions"),R=["id","project_root","started_at","status"].every(O=>h.has(O));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 O=q(d,`
86
+ `),y=Math.max(0,h-v);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:v,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:y,target:0,ok:y===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{p?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(ce(t)),"errors","embedder.log"),m=0;if(existsSync$1(u))try{let p=l-864e5;m=readFileSync$1(u,"utf8").split(`
87
+ `).filter(f=>{let d=/^\[([^\]]+)\]/.exec(f);return d?Date.parse(d[1])>=p:!1}).length;}catch(p){n.push({key:"embedder_error_log_read",value:p.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:m,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let p=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:p.state,modelId:p.modelId,revision:p.revision},target:{state:"ready"},ok:p.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:p.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:p.missingFiles,corruptFiles:p.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:p.missingFiles.length===0&&p.corruptFiles.length===0,severity:"warning"});}catch(p){n.push({key:"embedding_model_inspection",value:p.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function qu(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[O,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:O,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"),v=fe(d,"tool_call_events"),y=fe(d,"skill_executions"),R=["id","project_root","started_at","status"].every(O=>h.has(O));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 O=q(d,`
87
88
  SELECT COUNT(*) count FROM sessions
88
89
  WHERE project_root = ? AND started_at >= ?
89
- `,e,s);o.push({key:"session_start_evidence_24h",value:O,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let A=q(d,`
90
+ `,e,s);o.push({key:"session_start_evidence_24h",value:O,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let N=q(d,`
90
91
  SELECT COUNT(*) count FROM sessions
91
92
  WHERE project_root = ? AND status = 'running' AND started_at < ?
92
- `,e,(n.now??Date.now)()-lo);o.push({key:"stale_telemetry_sessions",value:A,target:0,ok:A===0,severity:"error"});let F=d.prepare(`
93
+ `,e,(n.now??Date.now)()-lo);o.push({key:"stale_telemetry_sessions",value:N,target:0,ok:N===0,severity:"error"});let F=d.prepare(`
93
94
  SELECT status, COUNT(*) count
94
95
  FROM sessions
95
96
  WHERE project_root = ?
96
97
  GROUP BY status
97
- `).all(e),$={running:0,completed:0,failed:0};for(let L of F)L.status in $&&($[L.status]=Number(L.count));let V=$.running+$.completed+$.failed,Z=$.completed+$.failed;if(o.push({key:"project_session_closure_state",value:{total:V,...$,closed:Z,closureRate:V===0?1:Z/V},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(d,"devflow_session_closures")){let L=d.prepare(`
98
+ `).all(e),A={running:0,completed:0,failed:0};for(let L of F)L.status in A&&(A[L.status]=Number(L.count));let z=A.running+A.completed+A.failed,Z=A.completed+A.failed;if(o.push({key:"project_session_closure_state",value:{total:z,...A,closed:Z,closureRate:z===0?1:Z/z},target:"running sessions close through SessionEnd",ok:!0,severity:"info"}),M(d,"devflow_session_closures")){let L=d.prepare(`
98
99
  SELECT state, COUNT(*) count
99
100
  FROM devflow_session_closures
100
101
  WHERE project_root = ?
101
102
  GROUP BY state
102
- `).all(e),U={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let qe of L)qe.state in U&&(U[qe.state]=Number(qe.count));let ue=q(d,`
103
+ `).all(e),U={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let qe of L)qe.state in U&&(U[qe.state]=Number(qe.count));let de=q(d,`
103
104
  SELECT COUNT(*) count
104
105
  FROM devflow_session_closures
105
106
  WHERE project_root = ? AND state = 'closing' AND updated_at < ?
106
- `,e,i-lo);o.push({key:"durable_session_closure_state",value:{...U,staleClosing:ue},target:{active:0,closing:0,staleClosing:0},ok:U.active===0&&U.closing===0&&ue===0,severity:a});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:a});let we=0;v.has("session_id")&&(we=q(d,`
107
+ `,e,i-lo);o.push({key:"durable_session_closure_state",value:{...U,staleClosing:de},target:{active:0,closing:0,staleClosing:0},ok:U.active===0&&U.closing===0&&de===0,severity:a});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:a});let we=0;v.has("session_id")&&(we=q(d,`
107
108
  SELECT COUNT(*) count
108
109
  FROM tool_call_events event
109
110
  LEFT JOIN sessions session ON session.id = event.session_id
110
111
  WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
111
- `));let le=0;if(y.has("session_id")&&(le=q(d,`
112
+ `));let ue=0;if(y.has("session_id")&&(ue=q(d,`
112
113
  SELECT COUNT(*) count
113
114
  FROM skill_executions execution
114
115
  LEFT JOIN sessions session ON session.id = execution.session_id
115
116
  WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
116
- `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:we,skillExecutions:le},target:{toolCalls:0,skillExecutions:0},ok:we===0&&le===0,severity:"error"}),["session_id","status","started_at"].every(L=>y.has(L))){let L=i-18e5,U=d.prepare(`
117
+ `)),o.push({key:"orphan_telemetry_events",value:{toolCalls:we,skillExecutions:ue},target:{toolCalls:0,skillExecutions:0},ok:we===0&&ue===0,severity:"error"}),["session_id","status","started_at"].every(L=>y.has(L))){let L=i-18e5,U=d.prepare(`
117
118
  SELECT
118
119
  COUNT(*) total,
119
120
  COALESCE(SUM(CASE WHEN execution.started_at < ? THEN 1 ELSE 0 END), 0) older_than_30m,
@@ -123,7 +124,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j
123
124
  WHERE session.project_root = ?
124
125
  AND execution.status = 'running'
125
126
  AND (execution.started_at < ? OR session.status <> 'running')
126
- `).get(L,e,L),ue=Number(U?.total??0);o.push({key:"stale_skill_executions",value:{total:ue,olderThan30m:Number(U?.older_than_30m??0),attachedToNonRunningSession:Number(U?.non_running_session??0)},target:{total:0},ok:ue===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 O=fe(d,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter($=>!O.has($));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let $=d.prepare(`
127
+ `).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 O=fe(d,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(A=>!O.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(`
127
128
  SELECT
128
129
  COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
129
130
  COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
@@ -135,7 +136,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j
135
136
  MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
136
137
  FROM devflow_work_items
137
138
  WHERE project_root = ?
138
- `).get(i,e),V=Number($?.queue_depth??0),Z=Number($?.pending??0),we=Number($?.leased??0),le=Number($?.failed??0),ke=Number($?.dead_letters??0),L=Number($?.expired_leases??0),U=$?.oldest_pending_at==null?void 0:Number($.oldest_pending_at),ue=$?.last_successful_drain_at==null?void 0:Number($.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:V,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:Z,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:we,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:le,target:0,ok:le===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:ue??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 O=d.prepare(`
139
+ `).get(i,e),z=Number(A?.queue_depth??0),Z=Number(A?.pending??0),we=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:we,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 O=d.prepare(`
139
140
  SELECT
140
141
  COUNT(*) total,
141
142
  COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
@@ -143,62 +144,62 @@ Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j
143
144
  COALESCE(SUM(CASE WHEN lease_expires_at IS NOT NULL AND lease_expires_at <= ?
144
145
  AND state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) lost_heartbeats
145
146
  FROM devflow_workflow_workers WHERE project_root = ?
146
- `).get(i,e),A=q(d,`
147
+ `).get(i,e),N=q(d,`
147
148
  SELECT COUNT(*) count FROM devflow_merge_queue
148
149
  WHERE project_root = ? AND state = 'conflict'
149
150
  `,e),F=d.prepare(`
150
151
  SELECT MIN(created_at) oldest FROM devflow_merge_queue
151
152
  WHERE project_root = ? AND state IN ('waiting','ready')
152
- `).get(e),$=Number(O?.active??0),V=Number(O?.held??0),Z=Number(O?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:$,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:V,target:0,ok:V===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:Z,target:0,ok:Z===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:A,target:0,ok:A===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,ae(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(O=>{let A=join$1(w,O),F=existsSync$1(A)?readdirSync$1(A).filter($=>$.includes(".json")).length:0;return [O,F]})),T=Object.values(_).reduce((O,A)=>O+A,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 O=R&&v.has("session_id"),A=fe(d,"tool_metrics"),F=v.has("event_id")&&A.has("tool_call_event_id")&&A.has("status"),$=[v.has("error")?"event.error":"NULL error",v.has("failure_category")?"event.failure_category":"NULL failure_category",v.has("output")?"event.output":"NULL output",v.has("blocked")?"event.blocked":"0 blocked",v.has("block_reason")?"event.block_reason":"NULL block_reason",O?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),V=d.prepare(`
153
- SELECT ${$}
153
+ `).get(e),A=Number(O?.active??0),z=Number(O?.held??0),Z=Number(O?.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,ce(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(O=>{let N=join$1(w,O),F=existsSync$1(N)?readdirSync$1(N).filter(A=>A.includes(".json")).length:0;return [O,F]})),T=Object.values(_).reduce((O,N)=>O+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 O=R&&v.has("session_id"),N=fe(d,"tool_metrics"),F=v.has("event_id")&&N.has("tool_call_event_id")&&N.has("status"),A=[v.has("error")?"event.error":"NULL error",v.has("failure_category")?"event.failure_category":"NULL failure_category",v.has("output")?"event.output":"NULL output",v.has("blocked")?"event.blocked":"0 blocked",v.has("block_reason")?"event.block_reason":"NULL block_reason",O?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),z=d.prepare(`
154
+ SELECT ${A}
154
155
  FROM tool_call_events event
155
156
  ${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
156
157
  ${O?"JOIN sessions event_session ON event_session.id = event.session_id":""}
157
158
  WHERE event.timestamp >= ?
158
159
  ${O?"AND event_session.project_root = ?":""}
159
- `).all(...O?[s,e]:[s]),Z=V.map(Fu),we=Z.filter(L=>L.failed).length,le=Z.filter((L,U)=>L.failed&&V[U]?.session_status!=="completed").length,ke=Z.filter(L=>L.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:V.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:we,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:le,target:0,ok:le===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:ys(we,V.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:ys(ke,V.length),target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:O?"project":"global fallback; session identity unavailable",target:"project",ok:O,severity:"warning"}),v.has("failure_category")){let L={};for(let de of V)typeof de.failure_category!="string"||!de.failure_category.trim()||(L[de.failure_category]=(L[de.failure_category]??0)+1);let U=V.filter((de,Li)=>Z[Li]?.failed&&de.session_status!=="completed"),ue=U.filter(de=>typeof de.failure_category=="string"&&de.failure_category.trim().length>0).length,qe=U.length===0?1:ue/U.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:qe,target:">= 0.80",ok:qe>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let J=R&&["session_id","started_at","fallback_count","fallback_reasons"].every(O=>y.has(O)),Y=0,x={};if(J){let O=d.prepare(`
160
+ `).all(...O?[s,e]:[s]),Z=z.map(Hu),we=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:we,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:ys(we,z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:ys(ke,z.length),target:0,ok:ke===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:O?"project":"global fallback; session identity unavailable",target:"project",ok:O,severity:"warning"}),v.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,Li)=>Z[Li]?.failed&&ge.session_status!=="completed"),de=U.filter(ge=>typeof ge.failure_category=="string"&&ge.failure_category.trim().length>0).length,qe=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:qe,target:">= 0.80",ok:qe>=.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(O=>y.has(O)),Y=0,x={};if(V){let O=d.prepare(`
160
161
  SELECT execution.fallback_count, execution.fallback_reasons
161
162
  FROM skill_executions execution
162
163
  JOIN sessions session ON session.id = execution.session_id
163
164
  WHERE session.project_root = ? AND execution.started_at >= ?
164
- `).all(e,s);for(let A of O){Y+=Number(A.fallback_count??0);for(let F of Hu(A.fallback_reasons))x[F]=(x[F]??0)+1;}}let B=0;if(M(d,"devflow_hook_fallbacks")){let O=d.prepare(`
165
+ `).all(e,s);for(let N of O){Y+=Number(N.fallback_count??0);for(let F of Wu(N.fallback_reasons))x[F]=(x[F]??0)+1;}}let B=0;if(M(d,"devflow_hook_fallbacks")){let O=d.prepare(`
165
166
  SELECT reason, COUNT(*) count
166
167
  FROM devflow_hook_fallbacks
167
168
  WHERE project_root = ? AND created_at >= ?
168
169
  GROUP BY reason ORDER BY reason
169
- `).all(e,s);for(let A of O){let F=Number(A.count);B+=F,x[`hook:${A.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"),m=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:m?u:"absent",target:"absent",ok:!m,severity:a});let p=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(p)){let d;try{d=X(p,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 ws(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Hs(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 qu(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(ae(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=ws(o),m=l.isDirectory()&&!l.isSymbolicLink(),p=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:m&&p,severity:m?"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,m]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 p=join$1(o,m);if(!existsSync$1(p)){t.push({key:`${l}_source`,value:"missing",target:p,ok:false,severity:"warning"});continue}try{let f=lstatSync(p),d=ws(p),g=readFileSync$1(p,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:p,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(ae(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-tt;for(let u of readFileSync$1(i,"utf8").split(`
170
- `))if(u.trim())try{let m=JSON.parse(u),p=Hs(m.ts);p===null?c+=1:p>=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 Bu(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(`
170
+ `).all(e,s);for(let N of O){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"),m=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:m?u:"absent",target:"absent",ok:!m,severity:a});let p=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(p)){let d;try{d=X(p,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 ws(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Hs(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 Bu(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(ce(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=ws(o),m=l.isDirectory()&&!l.isSymbolicLink(),p=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:m&&p,severity:m?"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,m]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 p=join$1(o,m);if(!existsSync$1(p)){t.push({key:`${l}_source`,value:"missing",target:p,ok:false,severity:"warning"});continue}try{let f=lstatSync(p),d=ws(p),g=readFileSync$1(p,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:p,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(ce(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(`
171
+ `))if(u.trim())try{let m=JSON.parse(u),p=Hs(m.ts);p===null?c+=1:p>=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 Ku(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
172
  SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
172
173
  FROM benchmark_reports
173
174
  ORDER BY created_at DESC
174
175
  LIMIT 1
175
- `).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/tt).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=go,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 Ku(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(`
176
+ `).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<=go,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 Ju(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(`
176
177
  SELECT report_json, created_at
177
178
  FROM benchmark_reports
178
179
  WHERE suite_id = 'retrieval-quality' AND project_root = ?
179
180
  ORDER BY created_at DESC
180
181
  LIMIT 1
181
- `).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:go},ok:i.qualityStatus==="passed"&&a<=go,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 Ju(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 Vu(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(ae(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let y of readdirSync$1(s))y.endsWith(".log")&&r.push(join$1(s,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-tt,a=0,c=0;for(let y of [...new Set(r)])if(existsSync$1(y))try{for(let R of readFileSync$1(y,"utf8").split(`
182
+ `).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:go},ok:i.qualityStatus==="passed"&&a<=go,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 Vu(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 zu(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(ce(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let y of readdirSync$1(s))y.endsWith(".log")&&r.push(join$1(s,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-nt,a=0,c=0;for(let y of [...new Set(r)])if(existsSync$1(y))try{for(let R of readFileSync$1(y,"utf8").split(`
182
183
  `))if(R.trim())try{let w=JSON.parse(R),k=Hs(w.ts);k===null||typeof w.reason!="string"?c+=1:k>=i&&(a+=1);}catch{c+=1;}}catch(R){t.push({key:"hook_fallback_log_read",value:{path:y,error:R.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:c,target:0,ok:c===0,severity:"error"});let l=Qt(e),u=0,m=0,p=null;if(existsSync$1(l)){let y;try{if(y=X(l,e),M(y,"telemetry_events")){let R=y.prepare(`
183
184
  SELECT COUNT(*) total,
184
185
  SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
185
186
  AVG(CASE WHEN success = 1 THEN duration END) average_duration
186
187
  FROM telemetry_events
187
188
  WHERE kind = 'hook_daemon_request' AND timestamp >= ?
188
- `).get(i);u=Number(R?.total??0),m=Number(R?.failures??0),p=R?.average_duration==null?null:Math.round(Number(R.average_duration)*100)/100;}}catch(R){t.push({key:"hook_daemon_metrics_read",value:R.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let f=Math.max(a,m),d=Math.max(u,f),g=d===0?0:f/d;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:p??"no successful requests",target:"<= 1000",ok:p===null||p<=1e3,severity:"warning"});let h=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:h,target:[],ok:h.length===0,severity:"warning"});let v=join$1(getDevFlowStateRoot(ae(e)),"logs","hook-debug");try{let y=Ju(v);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${vs}`,ok:y.bytes<=vs,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:I(t),metrics:t}}function Ce(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function We(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function Bs(e,t){return Yu.has(e)&&!(t.tolerateControlSyntax&&Zu.has(e))}function St(e,t={}){if(Buffer.byteLength(e)>qs)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 m=e[u];if(i){r+=m,i=false;continue}if(s==="'"){m==="'"?s=null:r+=m;continue}if(m==="\\"){if(e[u+1]===`
189
+ `).get(i);u=Number(R?.total??0),m=Number(R?.failures??0),p=R?.average_duration==null?null:Math.round(Number(R.average_duration)*100)/100;}}catch(R){t.push({key:"hook_daemon_metrics_read",value:R.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let f=Math.max(a,m),d=Math.max(u,f),g=d===0?0:f/d;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:p??"no successful requests",target:"<= 1000",ok:p===null||p<=1e3,severity:"warning"});let h=f>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:h,target:[],ok:h.length===0,severity:"warning"});let v=join$1(getDevFlowStateRoot(ce(e)),"logs","hook-debug");try{let y=Vu(v);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${vs}`,ok:y.bytes<=vs,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:I(t),metrics:t}}function De(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function We(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function Bs(e,t){return Zu.has(e)&&!(t.tolerateControlSyntax&&Qu.has(e))}function St(e,t={}){if(Buffer.byteLength(e)>qs)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 m=e[u];if(i){r+=m,i=false;continue}if(s==="'"){m==="'"?s=null:r+=m;continue}if(m==="\\"){if(e[u+1]===`
189
190
  `){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
190
191
  `){u+=2;continue}i=true;continue}if(s==='"'){m==='"'?s=null:((m==="`"||m==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=m);continue}if(m==="'"||m==='"'){s=m;continue}if((m==="`"||m==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=m;continue}let p=e.slice(u,u+2);if(m==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
191
- `;)u+=1;l();continue}p==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=m==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||m==="}"&&Qu.test(`${r}}`);if(["(",")","{","}"].includes(m)&&!f&&!t.tolerateControlSyntax&&(a=true),p==="&&"||p==="||"){l(),u+=1;continue}if([";","|","&",`
192
- `].includes(m)){l();continue}if(/\s/.test(m)){c();continue}r+=m;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let m=u.find(p=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(p));return m!==void 0&&Bs(m,t)})&&(a=true),{segments:n,malformed:a}}function Xu(e){return St(e).segments.flat().join(" ")}function ed(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function Ks(e,t){return ed(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 td(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]===`
192
+ `;)u+=1;l();continue}p==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=m==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||m==="}"&&Xu.test(`${r}}`);if(["(",")","{","}"].includes(m)&&!f&&!t.tolerateControlSyntax&&(a=true),p==="&&"||p==="||"){l(),u+=1;continue}if([";","|","&",`
193
+ `].includes(m)){l();continue}if(/\s/.test(m)){c();continue}r+=m;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let m=u.find(p=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(p));return m!==void 0&&Bs(m,t)})&&(a=true),{segments:n,malformed:a}}function ed(e){return St(e).segments.flat().join(" ")}function td(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function Ks(e,t){return td(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 nd(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
194
  `){o-=1;break}e[o]!==`
194
- `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function nd(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]!==`
195
+ `&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function od(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]!==`
195
196
  `;)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]===`
196
- `||e[n]==="\r"))break;n+=1;}}return t.join("")}function he(e,t,n="infer"){let o=t?Xu(e):n==="node"?td(e):n==="python"?nd(e):e;return [...new Set(o.match(zu)??[])]}function od(e){return St(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>qs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function vo(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)||He(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=id(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(...ks.map(n=>`${e}${n}`),...ks.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function id(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 ad(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]!==`
197
+ `||e[n]==="\r"))break;n+=1;}}return t.join("")}function he(e,t,n="infer"){let o=t?ed(e):n==="node"?nd(e):n==="python"?od(e):e;return [...new Set(o.match(Gu)??[])]}function rd(e){return St(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 sd(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>qs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function vo(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=sd(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)||He(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=ad(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 id(e){let t=[e];extname(e)===""&&t.push(...ks.map(n=>`${e}${n}`),...ks.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function ad(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 id(o)??o}function cd(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]!==`
197
198
  `;)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===`
198
- `||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=ad(t),s=[],i=r.malformed,a=(m,p)=>{if(!m||m.kind!=="string"||!m.valid||m.value.length===0){i=true;return}s.push({value:m.value,cwd:dirname$1(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:p,issuerPath:e});},{tokens:c}=r;for(let m=0;m<c.length;m+=1){let p=c[m],f=c[m-1];if(p.kind!=="identifier")continue;if(p.value==="eval"&&f?.value!=="."&&c[m+1]?.value==="("){i=true;continue}if(p.value==="require"){if(f?.value==="."){c[m-2]?.value==="module"&&c[m+1]?.value==="("&&(i=true);continue}if(c[m+1]?.value==="("){let g=c[m+2];c[m+3]?.value===")"||(i=true),a(g,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(p.value))continue;if(p.value==="import"&&c[m+1]?.value==="("){let g=c[m+2];c[m+3]?.value===")"||(i=true),a(g,"esm");continue}if(p.value==="import"&&c[m+1]?.kind==="string"){a(c[m+1],"esm");continue}if(p.value==="import"&&c[m+1]?.value===".")continue;let d=-1;for(let g=m+1;g<Math.min(c.length,m+32)&&c[g].value!==";";g+=1)if(c[g].value==="from"){d=g;break}d>=0?a(c[d+1],"esm"):p.value==="import"&&(i=true);}let l=[],u=[];for(let m of s){let p=vo(m,o);p.reference&&l.push(p.reference),p.inlineContent&&u.push(p.inlineContent),i||=p.malformed;}return {references:l,inlineContents:u,malformed:i}}function ld(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]!==`
199
+ `||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 ld(e,t,n,o=true){let r=cd(t),s=[],i=r.malformed,a=(m,p)=>{if(!m||m.kind!=="string"||!m.valid||m.value.length===0){i=true;return}s.push({value:m.value,cwd:dirname$1(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:p,issuerPath:e});},{tokens:c}=r;for(let m=0;m<c.length;m+=1){let p=c[m],f=c[m-1];if(p.kind!=="identifier")continue;if(p.value==="eval"&&f?.value!=="."&&c[m+1]?.value==="("){i=true;continue}if(p.value==="require"){if(f?.value==="."){c[m-2]?.value==="module"&&c[m+1]?.value==="("&&(i=true);continue}if(c[m+1]?.value==="("){let g=c[m+2];c[m+3]?.value===")"||(i=true),a(g,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(p.value))continue;if(p.value==="import"&&c[m+1]?.value==="("){let g=c[m+2];c[m+3]?.value===")"||(i=true),a(g,"esm");continue}if(p.value==="import"&&c[m+1]?.kind==="string"){a(c[m+1],"esm");continue}if(p.value==="import"&&c[m+1]?.value===".")continue;let d=-1;for(let g=m+1;g<Math.min(c.length,m+32)&&c[g].value!==";";g+=1)if(c[g].value==="from"){d=g;break}d>=0?a(c[d+1],"esm"):p.value==="import"&&(i=true);}let l=[],u=[];for(let m of s){let p=vo(m,o);p.reference&&l.push(p.reference),p.inlineContent&&u.push(p.inlineContent),i||=p.malformed;}return {references:l,inlineContents:u,malformed:i}}function ud(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]!==`
199
200
  `;)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,m=o;for(let f=0;f<u;f+=1)t[m+f]=" ";m+=u;let p=false;for(;m<e.length;){if(e[m]==="\\"){t[m]=" ",m+1<e.length&&(t[m+1]=" "),m+=2;continue}if(e.slice(m,m+u)===c.repeat(u)){for(let f=0;f<u;f+=1)t[m+f]=" ";m+=u,p=true;break}if(!l&&(e[m]===`
200
201
  `||e[m]==="\r"))break;e[m]!==`
201
- `&&e[m]!=="\r"&&(t[m]=" "),m+=1;}if(a){let f=e.slice(o+u,m-u);for(let d=0;d<f.length;d+=1)if(f[d]==="{"){if(f[d+1]==="{"){d+=1;continue}n=true;break}}n||=!p,o=m;}return {content:t.join(""),malformed:n}}function bs(e,t){let n=t.split(".");if(n.length>yo)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 ud(e,t,n){let o=ld(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=m=>{let p=dirname$1(e);for(let f=1;f<m;f+=1)p=dirname$1(p);return p},a=m=>{let p=ye(m,{...n,cwd:dirname$1(e)},true,"python");p?r.push(p):s=true;},c=(m,p=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(m))return s=true,null;let f=i(p),d=bs(f,m);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=m=>{let p=[];for(let f of m.split(",")){let d=f.trim().split(/\s+as\s+/)[0];if(d==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(d)){s=true;continue}p.push(d);}return p},u=(m,p)=>{for(let f of l(p))m&&bs(m,f).resolved&&(s=true);};for(let m of o.content.split(/\r?\n/))for(let p of m.split(/[;:]/)){let f=p.trim();if(f.startsWith("import ")){let w=f.slice(7).split(",");for(let k of w)c(k.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 v=i(g),y=join$1(v,"__init__.py"),R=false;try{R=statSync$1(y).isFile();}catch{}if(R){a(y),u(v,d[3]);continue}for(let w of l(d[3]))c(w,g);}return {references:[...new Map(r.map(m=>[m.path,m])).values()],inlineContents:[],malformed:s}}function Js(e,t,n,o,r=true){return n==="node"?cd(e,t,o,r):n==="python"?ud(e,t,o):{references:[],inlineContents:[],malformed:false}}function Ss(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Yt(e,0,r),i=new Set((s.artifacts??[]).map(p=>p.value)),a=s.tokens.filter(p=>!i.has(p)).map(p=>ye(p,r)).filter(p=>p!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let p of s.artifacts??[]){if(p.nodeResolutionKind){let d=vo(p);d.reference&&c.push(d.reference),d.inlineContent&&l.push(d.inlineContent),u||=d.malformed;continue}let f=ye(p.value,{...r,cwd:p.cwd},true,p.parserKind);f?c.push(f):u=true;}let m=[...a,...c];return {references:[...new Map(m.map(p=>[`${p.path}:${p.parserKind}`,p])).values()],inlineContents:l,malformed:u}}function Vs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function He(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 yt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function fd(e,t,n){let o=[],r=[],s=false,i=(u,m)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:m}),s||=He(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(pd.has(u))return a();if(md.has(u)){l=true,c+=1;continue}let m=_s.has(u)?"cjs":Rs.has(u)?"esm":null;if(m){let h=e[c+1];if(!h)return a(true);i(h,m),c+=2;continue}let p=yt(u,_s),f=yt(u,Rs),d=p??f;if(d!==null){if(!d)return a(true);i(d,p!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Es.has(u)){let h=e[c+1];return a(h===void 0?true:s||zt(h))}let g=yt(u,Es);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(Ps.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(yt(u,Ps)!==null){c+=1;continue}if(gd.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function wd(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:He(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(hd.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:He(i)}}return {tokens:[],malformed:true}}function kd(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:He(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:He(r)};if(vd.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Cs.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(yt(r,Cs)!==null){o+=1;continue}if(yd.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function ro(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 _d(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(Vs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=St(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?ro(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=ro(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=ro(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>Us)return {tokens:[],malformed:true};let r=St(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=zs(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 zs(e,t,n,o){let r=0;for(;Vs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;bd.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Us)return {tokens:i,malformed:true};let g=_d(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=zs(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)&&Bs(l,o),m=c&&!Sd.has(l);if(u||m)return {tokens:i,malformed:true};let p=He(s);i.push(s);let f=l;if(!dd.has(f))return {tokens:i,malformed:p};let d=["node","tsx"].includes(f)?fd(e,r+1,n):["bash","sh","zsh"].includes(f)?wd(e,r+1,a,n,o):kd(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:p||d.malformed}}function Gs(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 Rd(e,t){let n=new Map;for(let o of t)for(let r of od(o)){let s=Gs(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 Ed(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Pd(e){return e.slice(e.lastIndexOf("@")+1)}function Ds(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 Cd(e,t,n){let o=Pd(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"?Ds(i.path):null}}try{let i=W(We(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Ds(c.path):null}}}catch{}return {configured:false,root:null}}function Os(e){let t=[e?.lastUpdated,e?.installedAt].map(n=>{if(typeof n=="number"&&Number.isFinite(n)&&n>=0)return n;if(typeof n!="string")return null;let o=Date.parse(n);return Number.isFinite(o)?o:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function Dd(e,t){let n=W(e.entry),o=W(t.entry),r=Os(n),s=Os(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Zt(n.version):null,a=typeof o?.version=="string"?Zt(o.version):null;if(i&&a){let c=Ys(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Od(e,t){try{let n=W(We(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(Dd)[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 Ys(e,t){for(let o of ["major","minor","patch"])if(e[o]!==t[o])return e[o]-t[o];if(e.prerelease.length===0||t.prerelease.length===0)return t.prerelease.length-e.prerelease.length;let n=Math.max(e.prerelease.length,t.prerelease.length);for(let o=0;o<n;o+=1){let r=e.prerelease[o],s=t.prerelease[o];if(r===void 0)return -1;if(s===void 0)return 1;if(r===s)continue;let i=/^\d+$/.test(r)?Number(r):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:r.localeCompare(s)}return 0}function jd(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(We(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Zt(a.version),u=Zt(c.version);if(l&&u){let m=Ys(u,l);if(m!==0)return m}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 xd(e,t){if(t.legacyArtifactRoots!==void 0){let w=t.legacyArtifactRoots.map(k=>Ce(k)).filter(k=>k!==null).map(k=>({root:k,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 k=W(We(w));if(!k)throw new Error("settings must be an object");i.push({path:w,settings:k});}catch{a.push(w);}if(i.reduce((w,k)=>typeof k.settings.disableAllHooks=="boolean"?k.settings.disableAllHooks:w,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let m=i.map(w=>{let k=[];return kt(w.settings.hooks,k),{path:w.path,commands:k}}),p=m.flatMap(w=>w.commands),f=m.flatMap(w=>Rd(w.path,w.commands)),g=[...i.reduce((w,k)=>{let _=k.settings.enabledPlugins;if(typeof _!="object"||_===null)return w;for(let[T,J]of Object.entries(_))Ed(T)&&typeof J=="boolean"&&w.set(T,J);return w},new Map)].filter(([,w])=>w).map(([w])=>w).sort(),h=[...f],v=false;for(let w of g){let k=Od(w,o);k.malformed&&c.push(o);let _=k.root;if(!k.configured){let T=i.map(Y=>Cd(w,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=jd(w,s);}_?h.push({root:_,inspectPluginConfig:true}):v=true;}let y=[...h.reduce((w,k)=>{let _=w.get(k.root);return _?(w.set(k.root,{root:k.root,configPath:_.configPath??k.configPath,commands:[...new Set([..._.commands??[],...k.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||k.inspectPluginConfig)}),w):(w.set(k.root,k),w)},new Map).values()],R=[p.length>0?"settings-hooks":null,g.length>0?"enabled-plugin":null].filter(w=>w!==null);return {targets:y,configCommands:m.filter(w=>w.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${v?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(y.length>0||p.length>0)&&!v&&a.length===0&&c.length===0}}function Ad(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 kt(e,t){if(Array.isArray(e)){for(let n of e)kt(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):kt(o,t);}function so(e){return [...e.matchAll(Gu)].map(t=>t[1])}function $d(e){let t=new Map,n=St(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 Nd(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 Id(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 io(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 mo(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 po(e,t){return `${e} (${t})`}function Td(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>yo){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),m=resolve(c.containmentRoot),p;try{p=realpathSync.native(m);}catch{p=m;}if(!existsSync$1(u)){Pe(m,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(p,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=Ss(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let m of he(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:m});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Ws){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=mo(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(po(l,u.reason));continue}let{content:m}=u;o.inspected.push(l);let p=c.parserKind==="infer"?Ks(l,m):c.parserKind,f=p==="shell";for(let d of he(m,f,p))o.findings.push({artifact:l,endpoint:d});if(f){let d=Ss(m,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(p==="node"||p==="python"){let d=Js(l,m,p,{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 Md(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ad(r),c=0,l=(f,d=false,g=r,h="infer",v=e,y=0)=>{if(y>yo){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 k;try{k=realpathSync.native(w);}catch{d&&o.missing.push(w);return}if(!Pe(R,k)){o.escapedArtifacts.push(w);return}let _=`${k}:${h}:${v}`;i.has(_)||(i.add(_),s.push({path:k,parserKind:h,cwd:v,depth:y}));},u=(f,d,g,h=0)=>{for(let v of so(f)){let y=io(r,v);if(!y)continue;let R=(d.artifacts??[]).find(w=>w.value.includes("PLUGIN_ROOT")&&w.value.endsWith(v));l(y,true,r,R?.parserKind??"infer",R?.cwd??g,h);}},m=(f,d,g=0,h=false)=>{for(let v of f.artifacts??[]){if(v.value.includes("PLUGIN_ROOT"))continue;let y=v.nodeResolutionKind?vo(v,!h):{reference:ye(v.value,{project:v.project,homePath:v.homePath,cwd:v.cwd},true,v.parserKind)??void 0,malformed:false};if(y.malformed){o.malformedCommands.push(v.value);continue}if(y.inlineContent)for(let R of he(y.inlineContent.content,false,"node"))o.findings.push({artifact:y.inlineContent.source,endpoint:R});y.reference&&l(y.reference.path,true,h?r:y.reference.containmentRoot,y.reference.parserKind,y.reference.cwd??d,g);}},p=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),m(d,e);for(let g of d.tokens){if(!isAbsolute(g))continue;let h=Gs(g),v=(d.artifacts??[]).find(y=>y.value===g);h===r&&l(g,true,r,v?.parserKind??"infer",v?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)p(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 v=mo(h);if(v.kind==="unsafe")o.unsafeArtifacts.push(po(g,v.reason)),l(join$1(r,"hooks","session-start"));else if(v.kind==="missing")o.missing.push(g),l(join$1(r,"hooks","session-start"));else try{let y=JSON.parse(v.content),R=[];kt(y,R);for(let w of R)p(w);}catch{o.malformedConfigs.push(g),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Ws){o.traversalLimitRoots.push(r);break}let f=s.shift(),d=f.path;c+=1;let g=mo(d);if(g.kind==="missing"){o.missing.push(d);continue}if(g.kind==="unsafe"){o.unsafeArtifacts.push(po(d,g.reason));continue}let{content:h}=g;o.inspected.push(d);let v=f.parserKind==="infer"?Ks(d,h):f.parserKind,y=v==="shell";for(let k of he(h,y,v))o.findings.push({artifact:d,endpoint:k});if(y){let k=$d(h),_=Yt(k,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});Nd(h)&&o.malformedCommands.push(d),u(k,_,dirname$1(d),f.depth+1),m(_,dirname$1(d),f.depth+1,true);}else if(v==="node"||v==="python"){let k=Js(d,h,v,{project:e,homePath:t,cwd:dirname$1(d)},false);(v==="node"?Id(d):k.malformed)&&o.malformedCommands.push(d);for(let _ of k.inlineContents)for(let T of he(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of k.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 so(h)){let T=io(r,_);T&&l(T,true,r,v,f.cwd,f.depth+1);}}else for(let k of so(h)){let _=io(r,k);_&&l(_,true,r,v,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 Ld(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(We(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 js(e){try{let t=W(We(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Fd(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Ld(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 m=existsSync$1(l)?l:u;try{let y=W(We(m)),R=W(y?.hooks),w=[];kt(R?.SessionStart,w),w.some(k=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(k))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let p=js(i),f=js(a),d=o.get(s)??[],g={root:s,packageVersion:p,manifestVersion:f,registryVersions:d};n.versionRecords.push(g),(!p||!f||p!==f||d.some(y=>y!==p))&&n.versionIssues.push(g);let h=join$1(s,"hooks","session-start"),v=join$1(s,"dist","hooks","hook-daemon.js");try{let y=readFileSync$1(h,"utf8");(!existsSync$1(v)||!y.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Hd(e,t){let n=xd(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 O of he(B,true))o.findings.push({artifact:x.path,endpoint:O});}}Td(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)Md(e,t.homePath??homedir$1(),x,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((x,B,O)=>O.findIndex(A=>A.configPath===x.configPath&&A.command===x.command)===B),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],m=[...new Set(o.traversalLimitRoots)],p=[...new Set(o.escapedArtifacts)],f=o.findings.filter((x,B,O)=>O.findIndex(A=>A.artifact===x.artifact&&A.endpoint===x.endpoint)===B),d=a.length>0||p.length>0||u.length>0,g=d&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Fd(n.targets,t),v=t.claudeSettingsPath?dirname$1(t.claudeSettingsPath):null,y=t.homePath??(v&&basename(v)===".claude"?dirname$1(v):v)??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}:xe(y,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),k=w.root,_=k?it(y,k):[],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"})),J=[{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:m,target:[],ok:m.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:p.length,target:0,ok:p.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:k,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===k)?.packageVersion;return Y&&J.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(J),metrics:J}}function Wd(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=Wd(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)/tt: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 Ud(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 qd(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*tt,i=r.prepare(`
202
+ `&&e[m]!=="\r"&&(t[m]=" "),m+=1;}if(a){let f=e.slice(o+u,m-u);for(let d=0;d<f.length;d+=1)if(f[d]==="{"){if(f[d+1]==="{"){d+=1;continue}n=true;break}}n||=!p,o=m;}return {content:t.join(""),malformed:n}}function bs(e,t){let n=t.split(".");if(n.length>yo)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 dd(e,t,n){let o=ud(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=m=>{let p=dirname$1(e);for(let f=1;f<m;f+=1)p=dirname$1(p);return p},a=m=>{let p=ye(m,{...n,cwd:dirname$1(e)},true,"python");p?r.push(p):s=true;},c=(m,p=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(m))return s=true,null;let f=i(p),d=bs(f,m);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=m=>{let p=[];for(let f of m.split(",")){let d=f.trim().split(/\s+as\s+/)[0];if(d==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(d)){s=true;continue}p.push(d);}return p},u=(m,p)=>{for(let f of l(p))m&&bs(m,f).resolved&&(s=true);};for(let m of o.content.split(/\r?\n/))for(let p of m.split(/[;:]/)){let f=p.trim();if(f.startsWith("import ")){let w=f.slice(7).split(",");for(let k of w)c(k.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 v=i(g),y=join$1(v,"__init__.py"),R=false;try{R=statSync$1(y).isFile();}catch{}if(R){a(y),u(v,d[3]);continue}for(let w of l(d[3]))c(w,g);}return {references:[...new Map(r.map(m=>[m.path,m])).values()],inlineContents:[],malformed:s}}function Js(e,t,n,o,r=true){return n==="node"?ld(e,t,o,r):n==="python"?dd(e,t,o):{references:[],inlineContents:[],malformed:false}}function Ss(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Yt(e,0,r),i=new Set((s.artifacts??[]).map(p=>p.value)),a=s.tokens.filter(p=>!i.has(p)).map(p=>ye(p,r)).filter(p=>p!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let p of s.artifacts??[]){if(p.nodeResolutionKind){let d=vo(p);d.reference&&c.push(d.reference),d.inlineContent&&l.push(d.inlineContent),u||=d.malformed;continue}let f=ye(p.value,{...r,cwd:p.cwd},true,p.parserKind);f?c.push(f):u=true;}let m=[...a,...c];return {references:[...new Map(m.map(p=>[`${p.path}:${p.parserKind}`,p])).values()],inlineContents:l,malformed:u}}function Vs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function He(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 yt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function hd(e,t,n){let o=[],r=[],s=false,i=(u,m)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:m}),s||=He(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(fd.has(u))return a();if(pd.has(u)){l=true,c+=1;continue}let m=_s.has(u)?"cjs":Rs.has(u)?"esm":null;if(m){let h=e[c+1];if(!h)return a(true);i(h,m),c+=2;continue}let p=yt(u,_s),f=yt(u,Rs),d=p??f;if(d!==null){if(!d)return a(true);i(d,p!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Es.has(u)){let h=e[c+1];return a(h===void 0?true:s||zt(h))}let g=yt(u,Es);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(Ps.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(yt(u,Ps)!==null){c+=1;continue}if(md.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function kd(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:He(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(yd.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:He(i)}}return {tokens:[],malformed:true}}function bd(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:He(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:He(r)};if(wd.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Ds.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(yt(r,Ds)!==null){o+=1;continue}if(vd.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function ro(e,t){let n=ye(e,t,true);if(!n)return null;let o=De(n.path),r=De(t.project);return !o||!r||!Pe(r,o)?null:o}function Rd(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(Vs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=St(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?ro(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=ro(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=ro(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>Us)return {tokens:[],malformed:true};let r=St(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=zs(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 zs(e,t,n,o){let r=0;for(;Vs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Sd.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Us)return {tokens:i,malformed:true};let g=Rd(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=zs(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)&&Bs(l,o),m=c&&!_d.has(l);if(u||m)return {tokens:i,malformed:true};let p=He(s);i.push(s);let f=l;if(!gd.has(f))return {tokens:i,malformed:p};let d=["node","tsx"].includes(f)?hd(e,r+1,n):["bash","sh","zsh"].includes(f)?kd(e,r+1,a,n,o):bd(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:p||d.malformed}}function Gs(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:De(t.slice(0,o))}function Ed(e,t){let n=new Map;for(let o of t)for(let r of rd(o)){let s=Gs(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 Pd(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Dd(e){return e.slice(e.lastIndexOf("@")+1)}function Cs(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=De(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Cd(e,t,n){let o=Dd(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"?Cs(i.path):null}}try{let i=W(We(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Cs(c.path):null}}}catch{}return {configured:false,root:null}}function Os(e){let t=[e?.lastUpdated,e?.installedAt].map(n=>{if(typeof n=="number"&&Number.isFinite(n)&&n>=0)return n;if(typeof n!="string")return null;let o=Date.parse(n);return Number.isFinite(o)?o:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function Od(e,t){let n=W(e.entry),o=W(t.entry),r=Os(n),s=Os(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Zt(n.version):null,a=typeof o?.version=="string"?Zt(o.version):null;if(i&&a){let c=Ys(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function jd(e,t){try{let n=W(We(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(Od)[0],i=W(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:De(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function 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 Ys(e,t){for(let o of ["major","minor","patch"])if(e[o]!==t[o])return e[o]-t[o];if(e.prerelease.length===0||t.prerelease.length===0)return t.prerelease.length-e.prerelease.length;let n=Math.max(e.prerelease.length,t.prerelease.length);for(let o=0;o<n;o+=1){let r=e.prerelease[o],s=t.prerelease[o];if(r===void 0)return -1;if(s===void 0)return 1;if(r===s)continue;let i=/^\d+$/.test(r)?Number(r):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:r.localeCompare(s)}return 0}function xd(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(We(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Zt(a.version),u=Zt(c.version);if(l&&u){let m=Ys(u,l);if(m!==0)return m}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?De(i[0].path):null}function Nd(e,t){if(t.legacyArtifactRoots!==void 0){let w=t.legacyArtifactRoots.map(k=>De(k)).filter(k=>k!==null).map(k=>({root:k,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 k=W(We(w));if(!k)throw new Error("settings must be an object");i.push({path:w,settings:k});}catch{a.push(w);}if(i.reduce((w,k)=>typeof k.settings.disableAllHooks=="boolean"?k.settings.disableAllHooks:w,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let m=i.map(w=>{let k=[];return kt(w.settings.hooks,k),{path:w.path,commands:k}}),p=m.flatMap(w=>w.commands),f=m.flatMap(w=>Ed(w.path,w.commands)),g=[...i.reduce((w,k)=>{let _=k.settings.enabledPlugins;if(typeof _!="object"||_===null)return w;for(let[T,V]of Object.entries(_))Pd(T)&&typeof V=="boolean"&&w.set(T,V);return w},new Map)].filter(([,w])=>w).map(([w])=>w).sort(),h=[...f],v=false;for(let w of g){let k=jd(w,o);k.malformed&&c.push(o);let _=k.root;if(!k.configured){let T=i.map(Y=>Cd(w,Y.settings,r)).filter(Y=>Y.configured),V=T[T.length-1];V?_=V.root:_=xd(w,s);}_?h.push({root:_,inspectPluginConfig:true}):v=true;}let y=[...h.reduce((w,k)=>{let _=w.get(k.root);return _?(w.set(k.root,{root:k.root,configPath:_.configPath??k.configPath,commands:[...new Set([..._.commands??[],...k.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||k.inspectPluginConfig)}),w):(w.set(k.root,k),w)},new Map).values()],R=[p.length>0?"settings-hooks":null,g.length>0?"enabled-plugin":null].filter(w=>w!==null);return {targets:y,configCommands:m.filter(w=>w.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${v?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(y.length>0||p.length>0)&&!v&&a.length===0&&c.length===0}}function Ad(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 kt(e,t){if(Array.isArray(e)){for(let n of e)kt(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):kt(o,t);}function so(e){return [...e.matchAll(Yu)].map(t=>t[1])}function $d(e){let t=new Map,n=St(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 Id(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 Td(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 io(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 mo(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 po(e,t){return `${e} (${t})`}function Md(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>yo){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),m=resolve(c.containmentRoot),p;try{p=realpathSync.native(m);}catch{p=m;}if(!existsSync$1(u)){Pe(m,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(p,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=Ss(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let m of he(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:m});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Ws){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=mo(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(po(l,u.reason));continue}let{content:m}=u;o.inspected.push(l);let p=c.parserKind==="infer"?Ks(l,m):c.parserKind,f=p==="shell";for(let d of he(m,f,p))o.findings.push({artifact:l,endpoint:d});if(f){let d=Ss(m,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(p==="node"||p==="python"){let d=Js(l,m,p,{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 Ld(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ad(r),c=0,l=(f,d=false,g=r,h="infer",v=e,y=0)=>{if(y>yo){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 k;try{k=realpathSync.native(w);}catch{d&&o.missing.push(w);return}if(!Pe(R,k)){o.escapedArtifacts.push(w);return}let _=`${k}:${h}:${v}`;i.has(_)||(i.add(_),s.push({path:k,parserKind:h,cwd:v,depth:y}));},u=(f,d,g,h=0)=>{for(let v of so(f)){let y=io(r,v);if(!y)continue;let R=(d.artifacts??[]).find(w=>w.value.includes("PLUGIN_ROOT")&&w.value.endsWith(v));l(y,true,r,R?.parserKind??"infer",R?.cwd??g,h);}},m=(f,d,g=0,h=false)=>{for(let v of f.artifacts??[]){if(v.value.includes("PLUGIN_ROOT"))continue;let y=v.nodeResolutionKind?vo(v,!h):{reference:ye(v.value,{project:v.project,homePath:v.homePath,cwd:v.cwd},true,v.parserKind)??void 0,malformed:false};if(y.malformed){o.malformedCommands.push(v.value);continue}if(y.inlineContent)for(let R of he(y.inlineContent.content,false,"node"))o.findings.push({artifact:y.inlineContent.source,endpoint:R});y.reference&&l(y.reference.path,true,h?r:y.reference.containmentRoot,y.reference.parserKind,y.reference.cwd??d,g);}},p=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),m(d,e);for(let g of d.tokens){if(!isAbsolute(g))continue;let h=Gs(g),v=(d.artifacts??[]).find(y=>y.value===g);h===r&&l(g,true,r,v?.parserKind??"infer",v?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)p(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 v=mo(h);if(v.kind==="unsafe")o.unsafeArtifacts.push(po(g,v.reason)),l(join$1(r,"hooks","session-start"));else if(v.kind==="missing")o.missing.push(g),l(join$1(r,"hooks","session-start"));else try{let y=JSON.parse(v.content),R=[];kt(y,R);for(let w of R)p(w);}catch{o.malformedConfigs.push(g),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Ws){o.traversalLimitRoots.push(r);break}let f=s.shift(),d=f.path;c+=1;let g=mo(d);if(g.kind==="missing"){o.missing.push(d);continue}if(g.kind==="unsafe"){o.unsafeArtifacts.push(po(d,g.reason));continue}let{content:h}=g;o.inspected.push(d);let v=f.parserKind==="infer"?Ks(d,h):f.parserKind,y=v==="shell";for(let k of he(h,y,v))o.findings.push({artifact:d,endpoint:k});if(y){let k=$d(h),_=Yt(k,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});Id(h)&&o.malformedCommands.push(d),u(k,_,dirname$1(d),f.depth+1),m(_,dirname$1(d),f.depth+1,true);}else if(v==="node"||v==="python"){let k=Js(d,h,v,{project:e,homePath:t,cwd:dirname$1(d)},false);(v==="node"?Td(d):k.malformed)&&o.malformedCommands.push(d);for(let _ of k.inlineContents)for(let T of he(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of k.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 so(h)){let T=io(r,_);T&&l(T,true,r,v,f.cwd,f.depth+1);}}else for(let k of so(h)){let _=io(r,k);_&&l(_,true,r,v,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 Fd(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(We(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=De(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function js(e){try{let t=W(We(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Hd(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Fd(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 m=existsSync$1(l)?l:u;try{let y=W(We(m)),R=W(y?.hooks),w=[];kt(R?.SessionStart,w),w.some(k=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(k))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let p=js(i),f=js(a),d=o.get(s)??[],g={root:s,packageVersion:p,manifestVersion:f,registryVersions:d};n.versionRecords.push(g),(!p||!f||p!==f||d.some(y=>y!==p))&&n.versionIssues.push(g);let h=join$1(s,"hooks","session-start"),v=join$1(s,"dist","hooks","hook-daemon.js");try{let y=readFileSync$1(h,"utf8");(!existsSync$1(v)||!y.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Wd(e,t){let n=Nd(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 O of he(B,true))o.findings.push({artifact:x.path,endpoint:O});}}Md(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)Ld(e,t.homePath??homedir$1(),x,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((x,B,O)=>O.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)],m=[...new Set(o.traversalLimitRoots)],p=[...new Set(o.escapedArtifacts)],f=o.findings.filter((x,B,O)=>O.findIndex(N=>N.artifact===x.artifact&&N.endpoint===x.endpoint)===B),d=a.length>0||p.length>0||u.length>0,g=d&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Hd(n.targets,t),v=t.claudeSettingsPath?dirname$1(t.claudeSettingsPath):null,y=t.homePath??(v&&basename(v)===".claude"?dirname$1(v):v)??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}:xe(y,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),k=w.root,_=k?it(y,k):[],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:m,target:[],ok:m.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:p.length,target:0,ok:p.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:k,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===k)?.packageVersion;return Y&&V.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(V),metrics:V}}function Ud(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=Ud(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 qd(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 Bd(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(`
202
203
  SELECT source, COUNT(*) count FROM memories
203
204
  WHERE created_at >= ? GROUP BY source ORDER BY source
204
205
  `).all(s),a=r.prepare(`
@@ -216,14 +217,14 @@ Reviewed ${o}/${t.length} pending memories.`);}var Ie=D(()=>{Se();});var us={};j
216
217
  SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
217
218
  FROM observations
218
219
  WHERE source = 'explicit_intent' AND quality_status = 'accepted'
219
- `).get(),u=Number(l?.total??0),m=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?m/u:1,target:1,ok:u===0||m===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 Bd(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(p=>Number(p.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(),m=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:m?"trigram":"missing/non-trigram",target:"trigram",ok:m,severity:"warning"}),M(r,"knowledge_source_readiness")){let p=r.prepare(`
220
+ `).get(),u=Number(l?.total??0),m=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?m/u:1,target:1,ok:u===0||m===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 Kd(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(p=>Number(p.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(),m=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:m?"trigram":"missing/non-trigram",target:"trigram",ok:m,severity:"warning"}),M(r,"knowledge_source_readiness")){let p=r.prepare(`
220
221
  SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
221
222
  FROM knowledge_source_readiness ORDER BY source
222
- `).all(),f=p.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:p,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 Kd(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 Jd(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 Vd(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 zd(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 Gd(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(ae(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??zd)(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 wo(e={},t={}){let n=e.project??process.cwd(),o=co(n),r=Kd(t),s=await ju(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Au(n,t),Lu(o.path,t),Hd(o.path,t),await Wu(o.path,t),Uu(o.path,!!e.strict,t),Ud(o.path,t),qd(o.path,t),Bd(o.path,t),r,Jd(t),Bu(t),Ku(o.path,t),Vd(t),qu(t),await Gd(t),Vu(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 Yd(e,t={}){return e===void 0?Qs():wo(e,t)}function xs(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Zs(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?S.green:n.status==="yellow"?S.yellow:S.red;t.push(`${r(o)} ${S.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${xs(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${xs(s.value)}${i}`);}}return t.join(`
223
- `)}async function Zd(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await wo(e,n);return t.stdout(e.json?JSON.stringify(o):Zs(o)),o.exitCode}async function en(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function Qs(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,m=0;try{let h=await o.getAll();u=!!h?.project,m=Object.keys(h?.user??{}).length;}catch{}let p=0;try{p=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let d=await nt(),g=0;return a.fileCount>0&&(g+=25),a.nodeCount>0&&(g+=15),c.nodes.length>0&&(g+=20),u&&(g+=15),p>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:m},knowledge:{sources:p},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:d.running},toolCalls:f,readyScore:g}}async function Qd(){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 Xd(){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 eg(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 tg(){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,$u,lo,Mu,tt,go,vs,zu,Gu,Ws,Vt,yo,Us,qs,Yu,Zu,Qu,ks,dd,_s,Rs,Es,Ps,gd,md,pd,hd,yd,Cs,vd,bd,Sd,ei=D(()=>{Je();se();Qn();$u={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},lo=3600*1e3;Mu=new Set(["pending","committed","expired"]);tt=1440*60*1e3,go=30*tt,vs=60*1024*1024;zu=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Gu=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Ws=64,Vt=1024*1024,yo=8,Us=8,qs=64*1024;Yu=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Zu=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Qu=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;ks=[".cjs",".js",".mjs",".ts",".tsx"];dd=new Set(["bash","node","python","python3","sh","tsx","zsh"]);_s=new Set(["-r","--require"]),Rs=new Set(["--experimental-loader","--import","--loader"]),Es=new Set(["-e","--eval","-p","--print"]),Ps=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),gd=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),md=new Set(["--check","-c"]),pd=new Set(["--help","--version","-h","-v"]);hd=new Set(["-e","-eu","-o","-u","-ue"]),yd=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Cs=new Set(["-W","-X","--check-hash-based-pycs"]),vd=new Set(["--help","--version","-h","-V"]);bd=new Set(["builtin","command","env","exec","nohup","timeout"]),Sd=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ti={};j(ti,{runMemoryMaintainCommand:()=>sg});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 sg(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(`
224
- `)}var ni=D(()=>{});var oi={};j(oi,{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 ri=D(()=>{});var ko={};j(ko,{reportBenchmarkCommand:()=>mg,runBenchmarkCommand:()=>gg});async function gg(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}
223
+ `).all(),f=p.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:p,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 Jd(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 Vd(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 zd(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 Gd(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 Yd(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(ce(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??Gd)(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 wo(e={},t={}){let n=e.project??process.cwd(),o=co(n),r=Jd(t),s=await xu(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Au(n,t),Fu(o.path,t),Wd(o.path,t),await Uu(o.path,t),qu(o.path,!!e.strict,t),qd(o.path,t),Bd(o.path,t),Kd(o.path,t),r,Vd(t),Ku(t),Ju(o.path,t),zd(t),Bu(t),await Yd(t),zu(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 Zd(e,t={}){return e===void 0?Qs():wo(e,t)}function xs(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Zs(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?S.green:n.status==="yellow"?S.yellow:S.red;t.push(`${r(o)} ${S.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${xs(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${xs(s.value)}${i}`);}}return t.join(`
224
+ `)}async function Qd(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await wo(e,n);return t.stdout(e.json?JSON.stringify(o):Zs(o)),o.exitCode}async function en(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function Qs(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,m=0;try{let h=await o.getAll();u=!!h?.project,m=Object.keys(h?.user??{}).length;}catch{}let p=0;try{p=(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),p>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:m},knowledge:{sources:p},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:d.running},toolCalls:f,readyScore:g}}async function Xd(){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 eg(){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 tg(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 ng(){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,$u,lo,Lu,nt,go,vs,Gu,Yu,Ws,Vt,yo,Us,qs,Zu,Qu,Xu,ks,gd,_s,Rs,Es,Ps,md,pd,fd,yd,vd,Ds,wd,Sd,_d,ei=C(()=>{Ve();se();Qn();$u={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},lo=3600*1e3;Lu=new Set(["pending","committed","expired"]);nt=1440*60*1e3,go=30*nt,vs=60*1024*1024;Gu=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Yu=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Ws=64,Vt=1024*1024,yo=8,Us=8,qs=64*1024;Zu=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Qu=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Xu=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;ks=[".cjs",".js",".mjs",".ts",".tsx"];gd=new Set(["bash","node","python","python3","sh","tsx","zsh"]);_s=new Set(["-r","--require"]),Rs=new Set(["--experimental-loader","--import","--loader"]),Es=new Set(["-e","--eval","-p","--print"]),Ps=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),md=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),pd=new Set(["--check","-c"]),fd=new Set(["--help","--version","-h","-v"]);yd=new Set(["-e","-eu","-o","-u","-ue"]),vd=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Ds=new Set(["-W","-X","--check-hash-based-pycs"]),wd=new Set(["--help","--version","-h","-V"]);Sd=new Set(["builtin","command","env","exec","nohup","timeout"]),_d=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ti={};j(ti,{runMemoryMaintainCommand:()=>ig});function sg(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 ig(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:sg(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(`
225
+ `)}var ni=C(()=>{});var oi={};j(oi,{generateToken:()=>lg});async function lg(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 ri=C(()=>{});var ko={};j(ko,{reportBenchmarkCommand:()=>pg,runBenchmarkCommand:()=>mg});async function mg(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}
225
226
 
226
- Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function mg(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=pg(o,n);return r==="markdown"?`${s}
227
+ Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function pg(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=fg(o,n);return r==="markdown"?`${s}
227
228
  ## Change From Prior Baseline
228
229
 
229
230
  ${i.map(a=>`- ${a}`).join(`
@@ -232,19 +233,19 @@ ${i.map(a=>`- ${a}`).join(`
232
233
 
233
234
  Change from ${o.runId}:
234
235
  ${i.map(a=>`- ${a}`).join(`
235
- `)}`}function pg(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 bo=D(()=>{});var _o={};j(_o,{reportEvaluationCommand:()=>Sg,runEvaluationCommand:()=>bg});async function bg(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=_g(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)}`},m={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(p=>p.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({...m,evidenceReceipt:createTrialReceipt(m)});}}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 Sg(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 _g(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 Ro=D(()=>{});var ui={};j(ui,{runReview:()=>Rg});async function Rg(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[S.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?S.red(`Critical (${i.length})`):"",...i.map(u=>` ${S.red("\u25CF")} ${u}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${S.yellow("\u25CB")} ${u}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${S.green("\u25CB")} ${u}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
236
- `)}var di=D(()=>{});var _t={};j(_t,{resolveRuntimeLocale:()=>mi,runtimeMessage:()=>ee,runtimeMessages:()=>gi});function mi(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function ee(e,t={},n){return gi[mi(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var gi,De=D(()=>{gi={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 pi={};j(pi,{startAll:()=>Eg});async function Eg(e){let t=e.projectRoot??process.cwd();console.log(S.blue(ee("starting")));let n=await ln({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(S.green(ee("ready",{url:n.state.url}))),n.reused&&console.log(S.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=Oe().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await Oe().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var fi=D(()=>{se();De();});var yi={};j(yi,{stopAll:()=>Pg});async function Pg(){let e=await un();console.log(e?S.green(ee("stopped")):S.dim(ee("notRunning")));}var vi=D(()=>{se();De();});var wi={};j(wi,{showStatus:()=>Ag});function xg(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 Ag(e={}){let t=await nt(),n=e.projectRoot??process.cwd();if(e.json){console.log(JSON.stringify({runtime:t.state??null,running:t.running,project:{root:n,initialized:existsSync(join(n,".devflow"))}}));return}if(console.log(S.blue(ee("statusHeader"))),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(S.green(ee("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(S.yellow(ee(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=xe(o),s=r.root?it(o,r.root):[];r.root?console.log(`Plugin: ${S.green("\u2713")} v${r.version??"unknown"} (${r.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${s.length===0?S.green("\u2713"):S.red("!")} ${s.length} shadowed`);let i=getGlobalDevFlowDbPath();if(existsSync(i)){let m=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${m} MB)`);}else console.log(`Data: ${S.dim(`no global database (${i})`)}`);let a=join(process.cwd(),".devflow","devflow.db"),c=join(process.cwd(),".codegraph","codegraph.db"),l=[...existsSync(a)?[a]:[],...xg(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${S.yellow(l.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var ki=D(()=>{se();Je();De();});var bi={};j(bi,{setupCommand:()=>qg});function Fg(){try{return It()}catch{return}}function Hg(e){try{return Lg.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 Wg(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 Ug(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(S.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(S.yellow(` ! ${e.artifact}: ${t}`)):console.log(S.green(` + ${e.artifact}: ${t}`));}async function qg(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp&&r.id!=="claude-code"){let l=Hg(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=Fg();if(r.id==="claude-code"&&l)try{let u=Wg(l),m=join$1(n.homeDir,".claude","plugins","cache");Tt(l,m,u),l=join$1(m,"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)Ug(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(S.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(S.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(S.green(`Setup complete for ${r.id}.`)),console.log(S.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var Lg,Si=D(()=>{Je();Lg=createRequire$1(import.meta.url);});var _i={};j(_i,{pluginListCommand:()=>Kg});var Kg,Ri=D(()=>{Lt();Kg=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Ae();if(e.installed){let n=lr();if(n.length===0){console.log("No plugins installed."),console.log(`
236
+ `)}`}function fg(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 bo=C(()=>{});var _o={};j(_o,{reportEvaluationCommand:()=>_g,runEvaluationCommand:()=>Sg});async function Sg(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=Rg(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)}`},m={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(p=>p.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({...m,evidenceReceipt:createTrialReceipt(m)});}}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 _g(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 Rg(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 Ro=C(()=>{});var ui={};j(ui,{runReview:()=>Eg});async function Eg(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[S.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?S.red(`Critical (${i.length})`):"",...i.map(u=>` ${S.red("\u25CF")} ${u}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${S.yellow("\u25CB")} ${u}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${S.green("\u25CB")} ${u}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
237
+ `)}var di=C(()=>{});var _t={};j(_t,{resolveRuntimeLocale:()=>mi,runtimeMessage:()=>ee,runtimeMessages:()=>gi});function mi(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function ee(e,t={},n){return gi[mi(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var gi,Ce=C(()=>{gi={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 pi={};j(pi,{startAll:()=>Pg});async function Pg(e){let t=e.projectRoot??process.cwd();console.log(S.blue(ee("starting")));let n=await ln({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(S.green(ee("ready",{url:n.state.url}))),n.reused&&console.log(S.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=Oe().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await Oe().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var fi=C(()=>{se();Ce();});var yi={};j(yi,{stopAll:()=>Dg});async function Dg(){let e=await un();console.log(e?S.green(ee("stopped")):S.dim(ee("notRunning")));}var vi=C(()=>{se();Ce();});var wi={};j(wi,{showStatus:()=>Ag});function Ng(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 Ag(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(S.blue(ee("statusHeader"))),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(S.green(ee("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(S.yellow(ee(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=xe(o),s=r.root?it(o,r.root):[];r.root?console.log(`Plugin: ${S.green("\u2713")} v${r.version??"unknown"} (${r.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${s.length===0?S.green("\u2713"):S.red("!")} ${s.length} shadowed`);let i=getGlobalDevFlowDbPath();if(existsSync(i)){let m=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${m} MB)`);}else console.log(`Data: ${S.dim(`no global database (${i})`)}`);let a=join(process.cwd(),".devflow","devflow.db"),c=join(process.cwd(),".codegraph","codegraph.db"),l=[...existsSync(a)?[a]:[],...Ng(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${S.yellow(l.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var ki=C(()=>{se();Ve();Ce();});var bi={};j(bi,{setupCommand:()=>Bg});function Hg(){try{return It()}catch{return}}function Wg(e){try{return Fg.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 Ug(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 qg(e){let t=e.path?`${e.message} (${e.path})`:e.message;e.status==="failed"?console.log(S.red(` x ${e.artifact}: ${t}`)):e.status==="degraded"||e.status==="skipped"?console.log(S.yellow(` ! ${e.artifact}: ${t}`)):console.log(S.green(` + ${e.artifact}: ${t}`));}async function Bg(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp&&r.id!=="claude-code"){let l=Wg(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=Hg();if(r.id==="claude-code"&&l)try{let u=Ug(l),m=join$1(n.homeDir,".claude","plugins","cache");Tt(l,m,u),l=join$1(m,"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)qg(l);let i=s.filter(l=>l.status==="failed");if(i.length>0){let l={status:"failed",code:"projection_failed",candidates:o.candidates,availableHosts:t.list().map(u=>u.id).sort(),reason:i.map(u=>`${u.artifact}: ${u.message}`).join("; "),action:"Fix the reported config or artifact path and re-run setup for the selected host."};return console.log(""),console.log(S.red("Setup failed before all selected-host artifacts were projected.")),process.exitCode=1,{status:"failed",failure:l,projections:s}}let c=(await r.capabilities(n)).filter(l=>l.status!=="supported");return c.length>0&&console.log(S.yellow(` ! ${c.length} host capabilities are degraded or unavailable; run devflow doctor for details.`)),console.log(""),console.log(S.green(`Setup complete for ${r.id}.`)),console.log(S.dim("Restart the configured host to load DevFlow MCP and projected artifacts.")),{status:"configured",hostId:r.id,projections:s}}var Fg,Si=C(()=>{Ve();Fg=createRequire$1(import.meta.url);});var _i={};j(_i,{pluginListCommand:()=>Jg});var Jg,Ri=C(()=>{Lt();Jg=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Ne();if(e.installed){let n=lr();if(n.length===0){console.log("No plugins installed."),console.log(`
237
238
  Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
238
239
  `),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${S.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
239
240
  `);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${S.green(o.name)}${r}v${o.version}`),console.log(` ${" ".repeat(n)}${o.description.substring(0,60)}`),o.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${o.tags.join(", ")}`),console.log("");}),console.log(`
240
- Install a plugin: devflow plugin install <name>`);}});});var Ei={};j(Ei,{pluginSearchCommand:()=>zg});var zg,Pi=D(()=>{Lt();zg=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Ae(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
241
+ Install a plugin: devflow plugin install <name>`);}});});var Ei={};j(Ei,{pluginSearchCommand:()=>Gg});var Gg,Pi=C(()=>{Lt();Gg=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Ne(),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(`
241
242
  Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
242
- `),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var Di={};j(Di,{pluginInstallCommand:()=>Yg});var Yg,Oi=D(()=>{_e();Yg=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await $e(n,process.cwd(),!0);console.log(`
243
+ `),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var Ci={};j(Ci,{pluginInstallCommand:()=>Zg});var Zg,Oi=C(()=>{_e();Zg=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await Ae(n,process.cwd(),!0);console.log(`
243
244
  ${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
244
245
  Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
245
- ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var xi={};j(xi,{pluginUninstallCommand:()=>Qg});var Qg,Ai=D(()=>{_e();Qg=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 Rn(n,process.cwd(),!0),console.log(`
246
+ ${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var xi={};j(xi,{pluginUninstallCommand:()=>Xg});var Xg,Ni=C(()=>{_e();Xg=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 Rn(n,process.cwd(),!0),console.log(`
246
247
  ${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
247
- ${S.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 $i=createRequire(import.meta.url),Do="0.0.0";try{Do=$i("../package.json").version;}catch{try{Do=$i("../../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 nm=await Promise.resolve().then(()=>(Lo(),Mo));E.addCommand(nm.createDefaultDeliveryCommand());var om=await Promise.resolve().then(()=>(Uo(),Wo));E.addCommand(om.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(Do).option("--local","Force local engine, skip server");var sm=E.command("logs").description("Inspect and clean diagnostic logs");sm.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(()=>(Jo(),Ko)),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(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Oo.join(t,a);sn.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),sn.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
248
- `));}let n=cn(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(ir(),sr)),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(S.green("Created:"));for(let i of s.created)console.log(` ${S.dim("+")} ${i}`);}else console.log(S.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(S.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(S.green("\u2705 Onboarding pack generated")),console.log(S.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(S.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(S.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(S.green("\u2705 MCP server provided by the Claude plugin")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(cr(),ar)),a=await i(t,e.withPlugin);console.log(S.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(Pn(),En));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(Pn(),En));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(()=>(Ir(),Nr));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.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(()=>(qr(),Ur)),n=await t({projectRoot:e.project});console.log(e.json?JSON.stringify(n,null,2):n);}catch(t){console.error(S.red(`Backlog cleanup failed: ${t.message}`)),process.exitCode=1;}});var im=E.command("db").description("Manage DevFlow databases");im.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(()=>(Xr(),Qr)),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(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(ts(),es));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});E.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(rs(),os)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(is(),ss)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});E.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Wn(),Hn)),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(()=>(Wn(),Hn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var an=E.command("workflow").description("Workflow management");an.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(pt(),mt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var Et=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");Et.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Xe(),Qe));console.log(o({projectRoot:n.project,json:n.json}));});Et.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(()=>(Xe(),Qe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Et.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Xe(),Qe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Et.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(()=>(Xe(),Qe));console.log(r(e,{projectRoot:o.project,json:o.json}));});Et.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(()=>(Xe(),Qe));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(()=>(pt(),mt)),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(()=>(pt(),mt)),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(()=>(pt(),mt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var Ni=E.command("embeddings").description("Manage the shared verified embedding model");Ni.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(()=>(Bn(),qn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Ni.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(()=>(Bn(),qn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Ue=E.command("memory").description("Memory management");Ue.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ie(),Ne)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Ue.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ie(),Ne));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Ue.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(()=>(Ie(),Ne)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});Ue.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Ie(),Ne));await n(e,t,E.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Ue.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Ie(),Ne)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Ue.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(()=>(Ie(),Ne)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});E.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(ds(),us)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var jo=E.command("docs").description("Documentation index management");jo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
248
+ ${S.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 Ai=createRequire(import.meta.url),Co="0.0.0";try{Co=Ai("../package.json").version;}catch{try{Co=Ai("../../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 om=await Promise.resolve().then(()=>(Lo(),Mo));E.addCommand(om.createDefaultDeliveryCommand());var rm=await Promise.resolve().then(()=>(Uo(),Wo));E.addCommand(rm.createHooksCommand());function sm(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(Co).option("--local","Force local engine, skip server");var im=E.command("logs").description("Inspect and clean diagnostic logs");im.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(()=>(Jo(),Ko)),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(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Oo.join(t,a);sn.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),sn.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
249
+ `));}let n=cn(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(ir(),sr)),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(S.green("Created:"));for(let i of s.created)console.log(` ${S.dim("+")} ${i}`);}else console.log(S.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(S.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(S.green("\u2705 Onboarding pack generated")),console.log(S.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(S.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(S.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(S.green("\u2705 MCP server provided by the Claude plugin")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(cr(),ar)),a=await i(t,e.withPlugin);console.log(S.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(Pn(),En));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(Pn(),En));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(()=>(Ir(),$r));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.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(()=>(qr(),Ur)),n=await t({projectRoot:e.project});console.log(e.json?JSON.stringify(n,null,2):n);}catch(t){console.error(S.red(`Backlog cleanup failed: ${t.message}`)),process.exitCode=1;}});var am=E.command("db").description("Manage DevFlow databases");am.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(()=>(Xr(),Qr)),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(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(ts(),es));if(e){let i=s();i.includes(e)||(console.log(S.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(S.green(`\u2713 ${a}`));}catch(i){console.error(S.red(`Error: ${i.message}`)),process.exit(1);}});E.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(rs(),os)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(is(),ss)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:E.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});E.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Wn(),Hn)),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(()=>(Wn(),Hn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:E.opts().local});console.log(S.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var an=E.command("workflow").description("Workflow management");an.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(pt(),mt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var Et=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");Et.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}));});Et.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}));});Et.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}));});Et.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}));});Et.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(()=>(pt(),mt)),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(()=>(pt(),mt)),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(()=>(pt(),mt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var $i=E.command("embeddings").description("Manage the shared verified embedding model");$i.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(()=>(Bn(),qn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});$i.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(()=>(Bn(),qn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Ue=E.command("memory").description("Memory management");Ue.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ie(),$e)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Ue.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ie(),$e));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});Ue.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(()=>(Ie(),$e)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});Ue.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Ie(),$e));await n(e,t,E.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Ue.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Ie(),$e)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});Ue.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(()=>(Ie(),$e)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});E.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(ds(),us)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var jo=E.command("docs").description("Documentation index management");jo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
249
250
  ${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${S.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${S.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(S.green(`
250
- All docs synced.`));}});jo.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(()=>(Yn(),Gn)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});jo.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(()=>(Yn(),Gn));console.log(S.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${S.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${S.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(S.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var Pt=E.command("skill").description("Plugin/Skill management");Pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(_e(),ct)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(_e(),ct)),n=await t(e,E.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(_e(),ct)),n=await t(e,process.cwd(),E.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(_e(),ct));await t(e,process.cwd(),E.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});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(()=>(Qn(),ms));process.exitCode=t(e);});var Ii=E.command("mcp").description("Inspect MCP configuration and health");Ii.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(()=>(eo(),Xn));await t(e);});Ii.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(()=>(eo(),Xn));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(()=>(ei(),Xs));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;});Ue.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(()=>(ni(),ti));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(ri(),oi)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Ti=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Ti.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(()=>(bo(),ko));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var Mi=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");Mi.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(()=>(Ro(),_o));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});Mi.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(Ro(),_o));console.log(t({runId:e.run,output:e.json?"json":"text"}));});Ti.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(()=>(bo(),ko));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(()=>(di(),ui)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var xo=E.command("server").description("Manage DevFlow server");xo.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(()=>(se(),Be)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),_t));console.log(S.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(S.green(o("ready",{url:r.state.url}))),r.reused&&console.log(S.dim(o("reused")));});xo.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(se(),Be)),{runtimeMessage:t}=await Promise.resolve().then(()=>(De(),_t)),n=await e();console.log(n?S.green(t("stopped")):S.dim(t("notRunning")));});xo.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(se(),Be)),{runtimeMessage:t}=await Promise.resolve().then(()=>(De(),_t)),n=await e();n.running&&n.state?console.log(S.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(S.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(se(),Be)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),_t)),r=Oo.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(S.green(o("ready",{url:s.state.url}))),s.reused&&console.log(S.dim(o("reused")))),e.open)try{await rm(s.state.url);}catch(a){console.error(S.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(fi(),pi));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(()=>(vi(),yi));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(()=>(ki(),wi));await t({json:!!e.json,projectRoot:Oo.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(()=>(Si(),bi));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(()=>(Ri(),_i)),Promise.resolve().then(()=>(Pi(),Ei)),Promise.resolve().then(()=>(Oi(),Di)),Promise.resolve().then(()=>(Ai(),xi))]);rn.addCommand(e),rn.addCommand(t),rn.addCommand(n),rn.addCommand(o);}await E.parseAsync();
251
+ All docs synced.`));}});jo.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(()=>(Yn(),Gn)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});jo.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(()=>(Yn(),Gn));console.log(S.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${S.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${S.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(S.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var Pt=E.command("skill").description("Plugin/Skill management");Pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(_e(),ct)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(_e(),ct)),n=await t(e,E.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(_e(),ct)),n=await t(e,process.cwd(),E.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(_e(),ct));await t(e,process.cwd(),E.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});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(()=>(Qn(),ms));process.exitCode=t(e);});var Ii=E.command("mcp").description("Inspect MCP configuration and health");Ii.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(()=>(eo(),Xn));await t(e);});Ii.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(()=>(eo(),Xn));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(()=>(ei(),Xs));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;});Ue.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(()=>(ni(),ti));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(ri(),oi)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Ti=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Ti.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(()=>(bo(),ko));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var Mi=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");Mi.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(()=>(Ro(),_o));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});Mi.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(Ro(),_o));console.log(t({runId:e.run,output:e.json?"json":"text"}));});Ti.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(()=>(bo(),ko));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(()=>(di(),ui)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var xo=E.command("server").description("Manage DevFlow server");xo.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(()=>(se(),Be)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Ce(),_t));console.log(S.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(S.green(o("ready",{url:r.state.url}))),r.reused&&console.log(S.dim(o("reused")));});xo.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(se(),Be)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Ce(),_t)),n=await e();console.log(n?S.green(t("stopped")):S.dim(t("notRunning")));});xo.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(se(),Be)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Ce(),_t)),n=await e();n.running&&n.state?console.log(S.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(S.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(se(),Be)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Ce(),_t)),r=Oo.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(S.green(o("ready",{url:s.state.url}))),s.reused&&console.log(S.dim(o("reused")))),e.open)try{await sm(s.state.url);}catch(a){console.error(S.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(fi(),pi));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(()=>(vi(),yi));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(()=>(ki(),wi));await t({json:!!e.json,projectRoot:Oo.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(()=>(Si(),bi));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(()=>(Ri(),_i)),Promise.resolve().then(()=>(Pi(),Ei)),Promise.resolve().then(()=>(Oi(),Ci)),Promise.resolve().then(()=>(Ni(),xi))]);rn.addCommand(e),rn.addCommand(t),rn.addCommand(n),rn.addCommand(o);}await E.parseAsync();