@devflow-tools/devflow 0.18.67 → 0.18.69
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.
- package/dist/cli.js +65 -64
- package/dist/dashboard/404.html +1 -1
- package/dist/dashboard/__next.__PAGE__.txt +1 -1
- package/dist/dashboard/__next._full.txt +1 -1
- package/dist/dashboard/__next._tree.txt +1 -1
- package/dist/dashboard/_not-found/__next._full.txt +1 -1
- package/dist/dashboard/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/dashboard/_not-found/__next._tree.txt +1 -1
- package/dist/dashboard/_not-found.html +1 -1
- package/dist/dashboard/_not-found.txt +1 -1
- package/dist/dashboard/accuracy/__next._full.txt +1 -1
- package/dist/dashboard/accuracy/__next._tree.txt +1 -1
- package/dist/dashboard/accuracy/__next.accuracy.__PAGE__.txt +1 -1
- package/dist/dashboard/accuracy.html +1 -1
- package/dist/dashboard/accuracy.txt +1 -1
- package/dist/dashboard/benchmark/__next._full.txt +1 -1
- package/dist/dashboard/benchmark/__next._tree.txt +1 -1
- package/dist/dashboard/benchmark/__next.benchmark.__PAGE__.txt +1 -1
- package/dist/dashboard/benchmark.html +1 -1
- package/dist/dashboard/benchmark.txt +1 -1
- package/dist/dashboard/context/__next._full.txt +1 -1
- package/dist/dashboard/context/__next._tree.txt +1 -1
- package/dist/dashboard/context/__next.context.__PAGE__.txt +1 -1
- package/dist/dashboard/context.html +1 -1
- package/dist/dashboard/context.txt +1 -1
- package/dist/dashboard/doctor/__next._full.txt +1 -1
- package/dist/dashboard/doctor/__next._tree.txt +1 -1
- package/dist/dashboard/doctor/__next.doctor.__PAGE__.txt +1 -1
- package/dist/dashboard/doctor.html +1 -1
- package/dist/dashboard/doctor.txt +1 -1
- package/dist/dashboard/executions/__next._full.txt +1 -1
- package/dist/dashboard/executions/__next._tree.txt +1 -1
- package/dist/dashboard/executions/__next.executions.__PAGE__.txt +1 -1
- package/dist/dashboard/executions.html +1 -1
- package/dist/dashboard/executions.txt +1 -1
- package/dist/dashboard/graph/__next._full.txt +1 -1
- package/dist/dashboard/graph/__next._tree.txt +1 -1
- package/dist/dashboard/graph/__next.graph.__PAGE__.txt +1 -1
- package/dist/dashboard/graph.html +1 -1
- package/dist/dashboard/graph.txt +1 -1
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.txt +1 -1
- package/dist/dashboard/intelligence/__next._full.txt +1 -1
- package/dist/dashboard/intelligence/__next._tree.txt +1 -1
- package/dist/dashboard/intelligence/__next.intelligence.__PAGE__.txt +1 -1
- package/dist/dashboard/intelligence/knowledge/__next._full.txt +1 -1
- package/dist/dashboard/intelligence/knowledge/__next._tree.txt +1 -1
- package/dist/dashboard/intelligence/knowledge/__next.intelligence.knowledge.__PAGE__.txt +1 -1
- package/dist/dashboard/intelligence/knowledge.html +1 -1
- package/dist/dashboard/intelligence/knowledge.txt +1 -1
- package/dist/dashboard/intelligence/memory/__next._full.txt +1 -1
- package/dist/dashboard/intelligence/memory/__next._tree.txt +1 -1
- package/dist/dashboard/intelligence/memory/__next.intelligence.memory.__PAGE__.txt +1 -1
- package/dist/dashboard/intelligence/memory.html +1 -1
- package/dist/dashboard/intelligence/memory.txt +1 -1
- package/dist/dashboard/intelligence.html +1 -1
- package/dist/dashboard/intelligence.txt +1 -1
- package/dist/dashboard/knowledge/__next._full.txt +1 -1
- package/dist/dashboard/knowledge/__next._tree.txt +1 -1
- package/dist/dashboard/knowledge/__next.knowledge.__PAGE__.txt +1 -1
- package/dist/dashboard/knowledge.html +1 -1
- package/dist/dashboard/knowledge.txt +1 -1
- package/dist/dashboard/memory/__next._full.txt +1 -1
- package/dist/dashboard/memory/__next._tree.txt +1 -1
- package/dist/dashboard/memory/__next.memory.__PAGE__.txt +1 -1
- package/dist/dashboard/memory.html +1 -1
- package/dist/dashboard/memory.txt +1 -1
- package/dist/dashboard/replay/__next._full.txt +1 -1
- package/dist/dashboard/replay/__next._tree.txt +1 -1
- package/dist/dashboard/replay/__next.replay.__PAGE__.txt +1 -1
- package/dist/dashboard/replay.html +1 -1
- package/dist/dashboard/replay.txt +1 -1
- package/dist/dashboard/runs/_/__next._full.txt +1 -1
- package/dist/dashboard/runs/_/__next._tree.txt +1 -1
- package/dist/dashboard/runs/_/__next.runs.$d$id.__PAGE__.txt +1 -1
- package/dist/dashboard/runs/_.html +1 -1
- package/dist/dashboard/runs/_.txt +1 -1
- package/dist/dashboard/runs/__next._full.txt +1 -1
- package/dist/dashboard/runs/__next._tree.txt +1 -1
- package/dist/dashboard/runs/__next.runs.__PAGE__.txt +1 -1
- package/dist/dashboard/runs.html +1 -1
- package/dist/dashboard/runs.txt +1 -1
- package/dist/dashboard/settings/__next._full.txt +1 -1
- package/dist/dashboard/settings/__next._tree.txt +1 -1
- package/dist/dashboard/settings/__next.settings.__PAGE__.txt +1 -1
- package/dist/dashboard/settings.html +1 -1
- package/dist/dashboard/settings.txt +1 -1
- package/dist/dashboard/timeline/__next._full.txt +1 -1
- package/dist/dashboard/timeline/__next._tree.txt +1 -1
- package/dist/dashboard/timeline/__next.timeline.__PAGE__.txt +1 -1
- package/dist/dashboard/timeline.html +1 -1
- package/dist/dashboard/timeline.txt +1 -1
- package/dist/dashboard/tool-metrics/__next._full.txt +1 -1
- package/dist/dashboard/tool-metrics/__next._tree.txt +1 -1
- package/dist/dashboard/tool-metrics/__next.tool-metrics.__PAGE__.txt +1 -1
- package/dist/dashboard/tool-metrics.html +1 -1
- package/dist/dashboard/tool-metrics.txt +1 -1
- package/dist/dashboard/workflows/__next._full.txt +1 -1
- package/dist/dashboard/workflows/__next._tree.txt +1 -1
- package/dist/dashboard/workflows/__next.workflows.__PAGE__.txt +1 -1
- package/dist/dashboard/workflows.html +1 -1
- package/dist/dashboard/workflows.txt +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/dist/command-registry.json +7 -7
- package/dist/plugin/dist/runtime-manifest.json +7 -7
- package/dist/plugin/package.json +12 -12
- package/package.json +16 -16
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{0u7J7jMaA_TwG-OoWs6-O → PxEc6VAOZtRteCNiUsOR3}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{0u7J7jMaA_TwG-OoWs6-O → PxEc6VAOZtRteCNiUsOR3}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,38 +1,39 @@
|
|
|
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,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,readRuntimeState,getDevFlowStateRoot,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,getDaemonRegistryPath,getProjectStateDir,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,DevFlowApiClient,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {readFileSync as readFileSync$1,existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import {DeliveryLineError}from'@devflow-tools/delivery-line';import {createDeliveryProjectRuntime,projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';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 Qt,{existsSync,readFileSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import po,{join,dirname}from'path';import {homedir}from'os';import Io from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {execSync,execFileSync as execFileSync$1}from'child_process';import {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 Hc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {createRequire}from'module';var gi=Object.defineProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)gi(e,n,{get:t[n],enumerable:true});};var et={};j(et,{DEFAULT_SERVER_PORT:()=>ki,ensureCliRuntime:()=>ko,getRuntimeManager:()=>de,resolveServerLaunch:()=>vo,serverStatus:()=>Xe,startServer:()=>tn,stopServer:()=>nn});function vo(e=process.cwd()){let t=[()=>vi.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 de(){return createRuntimeManager()}async function ko(e){return de().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:vo(e.projectRoot)})}async function tn(e={}){let t=e.projectRoot??process.cwd(),n=await ko({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 nn(){return (await de().stop()).stopped}async function Xe(){let e=await de().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var vi,ki,re=D(()=>{vi=createRequire$1(import.meta.url),ki=13337;});var So={};j(So,{createDefaultDeliveryCommand:()=>_i,createDeliveryCommand:()=>bo,deliveryCliError:()=>wo});function wo(e){let t=e instanceof DeliveryLineError?e.code:"DELIVERY_INTERNAL_ERROR",n=e instanceof Error?e.message:"Delivery operation failed",o=/token|secret|password|transcript/i.test(n)?"Delivery operation failed":n.slice(0,500);return {ok:false,error:{code:t,message:o}}}function bo(e,t=async()=>{if(!e)throw new Error("DELIVERY_RUNTIME_REQUIRED");return e},n=process.cwd(),o=t){let r=new Command("delivery").description("Run the complete, auditable development delivery line"),s=(d,g)=>({actor:{id:String(d.actor??"cli-user"),kind:"human",...d.actorRole?{role:String(d.actorRole)}:{}},sessionId:String(d.session??"cli-session"),executionId:String(d.execution??"cli-execution"),idempotencyKey:g}),i=(d,g)=>({...s(d,g),contextReceipt:String(d.contextReceipt)}),a=(d,g)=>({...s(d,g),...d.contextReceipt?{contextReceipt:String(d.contextReceipt)}:{}}),c=d=>d.option("--project <path>","Project root",n),l=d=>c(d).requiredOption("--idempotency-key <key>").requiredOption("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),u=d=>c(d).requiredOption("--idempotency-key <key>").option("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),p=(d,g)=>console.log(g?JSON.stringify(d,null,2):JSON.stringify(d)),m=async(d,g)=>{try{p(await d(),g);}catch(h){p(wo(h),g),process.exitCode=1;}},f=(d,g)=>async()=>g(await t(d));u(r.command("create").requiredOption("--input <file>").option("--base-ref <ref>","Base ref","HEAD").option("--target-ref <ref>","Protected target ref","main").option("--worktree-mode <mode>","clean, isolated, external, or auto","auto").option("--title <title>")).action(async d=>{await m(async()=>{let g=await o(d.project),h=readFileSync$1(d.input,"utf8");return g.createCase({...a(d,d.idempotencyKey),projectRoot:d.project,baseRef:d.baseRef,targetRef:d.targetRef,worktreeMode:d.worktreeMode,title:d.title??h.trim()})},d.json);}),c(r.command("status").argument("<caseId>")).option("--json").action(async(d,g)=>{await m(f(g.project,h=>h.status(d)),g.json);}),c(r.command("cleanup").option("--stale-only","Only stop the currently owned stale runtime lease")).option("--json").action(async d=>{await m(async()=>{let g=de(),h=await g.status();if(!h)return {ok:true,project:d.project,stopped:false,reason:"runtime_not_found"};if(d.staleOnly&&h.status==="ready")return {ok:true,project:d.project,stopped:false,reason:"runtime_is_ready"};let v=await g.stop();return {ok:true,project:d.project,stopped:v.stopped,runtimeStatus:v.state?.status??"stopped"}},d.json);}),l(r.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(d,g)=>{await m(f(g.project,h=>h.answer(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),value:g.value})),g.json);}),l(r.command("revise").argument("<caseId>").requiredOption("--phase <phase>").requiredOption("--input <file>")).action(async(d,g)=>{await m(f(g.project,h=>h.revise(d,{...i(g,g.idempotencyKey),phase:g.phase,content:readFileSync$1(g.input,"utf8")})),g.json);}),l(r.command("compare").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--decision <option>")).action(async(d,g)=>{await m(f(g.project,h=>h.compareOptions(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),option:g.decision})),g.json);});for(let[d,g]of [["approve","approve"],["reject","reject"]]){let h=r.command(d).argument("<caseId>").requiredOption("--turn <n>").requiredOption("--stage <stage>").requiredOption("--reason <reason>").option("--artifact-hash <hash>");d==="approve"&&h.option("--plan-file <path>","Executable plan JSON required for plan approval"),l(h).action(async(v,y)=>{await m(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 m(f(g.project,h=>h.resume(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("recover-task").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.recoverTask(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("admit-worktree").argument("<caseId>").requiredOption("--mode <mode>").requiredOption("--admission-token <token>")).action(async(d,g)=>{await m(f(g.project,h=>h.admitWorktree(d,{...i(g,g.idempotencyKey),mode:g.mode,admissionToken:g.admissionToken})),g.json);}),l(r.command("refresh-activation").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.refreshActivation(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("cancel").argument("<caseId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.cancel(d,{...i(g,g.idempotencyKey),reason:g.reason})),g.json);}),l(r.command("rebind-session").argument("<caseId>").requiredOption("--previous-session <sessionId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.rebindSession(d,{...i(g,g.idempotencyKey),previousSessionId:g.previousSession,reason:g.reason})),g.json);}),l(r.command("retry-task").argument("<caseId>").requiredOption("--task-id <taskId>")).action(async(d,g)=>{await m(f(g.project,h=>h.retryTask(d,{...i(g,g.idempotencyKey),taskId:g.taskId})),g.json);}),l(r.command("import-external").argument("<caseId>").requiredOption("--task-id <taskId>").requiredOption("--candidate <revision>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.importExternalChange(d,{...i(g,g.idempotencyKey),taskId:g.taskId,candidateRevision:g.candidate,reason:g.reason})),g.json);}),l(r.command("export").argument("<caseId>").requiredOption("--path <path>")).action(async(d,g)=>{await m(f(g.project,h=>h.export(d,{...i(g,g.idempotencyKey),path:g.path})),g.json);}),r}function _i(e=process.cwd(),t=createDeliveryProjectRuntime){let n=async(o,r)=>{let s=await t({projectRoot:o,retrieval:r});return s.close?new Proxy(s.facade,{get(i,a,c){let l=Reflect.get(i,a,c);return typeof l!="function"?l:async(...u)=>{try{return await l.apply(i,u)}finally{await s.close?.();}}}}):s.facade};return bo(void 0,o=>n(o,false),e,o=>n(o,true))}var _o=D(()=>{re();});var Po={};j(Po,{renderLogCleanupResult:()=>Pi,runLogsCleanupCommand:()=>Ei});function Ro(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function Ei(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:Ro(e.olderThanDays,"older-than"),maxBytes:Ro(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function Eo(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function Pi(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${Eo(e.deletedBytes)}`,` Remaining: ${Eo(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
|
|
3
|
-
`)}var
|
|
4
|
-
`,"utf-8"),a}function
|
|
5
|
-
`);}function
|
|
6
|
-
`);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!
|
|
7
|
-
`);}function
|
|
8
|
-
`);}function
|
|
9
|
-
`)}var
|
|
10
|
-
`,"utf-8"),renameSync$1(o,n);}async function
|
|
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,writeFileSync as writeFileSync$1,statSync as statSync$1,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {Command}from'commander';import {DeliveryLineError}from'@devflow-tools/delivery-line';import {createDeliveryProjectRuntime,projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';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 tn,{existsSync,readFileSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import ko,{join,dirname}from'path';import {homedir}from'os';import Wo from'@colbymchenry/codegraph';import {OnboardingPackBuilder}from'@devflow-tools/context-engine';import {createEngines}from'@devflow-tools/mcp-server/composition';import {checkbox}from'@inquirer/prompts';import {MemoryGate,inspectEmbeddingModel,prepareEmbeddingModel,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {execSync,execFileSync as execFileSync$1}from'child_process';import {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 hl 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 Pi=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)Pi(e,n,{get:t[n],enumerable:true});};var nt={};j(nt,{DEFAULT_SERVER_PORT:()=>Ni,ensureCliRuntime:()=>Eo,getRuntimeManager:()=>ge,resolveServerLaunch:()=>Ro,serverStatus:()=>tt,startServer:()=>rn,stopServer:()=>sn});function Ro(e=process.cwd()){let t=[()=>Ai.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 ge(){return createRuntimeManager()}async function Eo(e){return ge().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:Ro(e.projectRoot)})}async function rn(e={}){let t=e.projectRoot??process.cwd(),n=await Eo({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 sn(){return (await ge().stop()).stopped}async function tt(){let e=await ge().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var Ai,Ni,se=C(()=>{Ai=createRequire$1(import.meta.url),Ni=13337;});var Co={};j(Co,{createDefaultDeliveryCommand:()=>Mi,createDeliveryCommand:()=>Do,deliveryCliError:()=>Po});function Po(e){let t=e instanceof DeliveryLineError?e.code:"DELIVERY_INTERNAL_ERROR",n=e instanceof Error?e.message:"Delivery operation failed",o=/token|secret|password|transcript/i.test(n)?"Delivery operation failed":n.slice(0,500);return {ok:false,error:{code:t,message:o}}}function Do(e,t=async()=>{if(!e)throw new Error("DELIVERY_RUNTIME_REQUIRED");return e},n=process.cwd(),o=t){let r=new Command("delivery").description("Run the complete, auditable development delivery line"),s=(d,g)=>({actor:{id:String(d.actor??"cli-user"),kind:"human",...d.actorRole?{role:String(d.actorRole)}:{}},sessionId:String(d.session??"cli-session"),executionId:String(d.execution??"cli-execution"),idempotencyKey:g}),i=(d,g)=>({...s(d,g),contextReceipt:String(d.contextReceipt)}),a=(d,g)=>({...s(d,g),...d.contextReceipt?{contextReceipt:String(d.contextReceipt)}:{}}),c=d=>d.option("--project <path>","Project root",n),l=d=>c(d).requiredOption("--idempotency-key <key>").requiredOption("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),u=d=>c(d).requiredOption("--idempotency-key <key>").option("--context-receipt <receipt>").option("--actor <id>","Actor identity","cli-user").option("--actor-role <role>","Actor approval role").option("--session <id>","Session identity","cli-session").option("--execution <id>","Execution identity","cli-execution").option("--json"),p=(d,g)=>console.log(g?JSON.stringify(d,null,2):JSON.stringify(d)),m=async(d,g)=>{try{p(await d(),g);}catch(h){p(Po(h),g),process.exitCode=1;}},f=(d,g)=>async()=>g(await t(d));u(r.command("create").requiredOption("--input <file>").option("--base-ref <ref>","Base ref","HEAD").option("--target-ref <ref>","Protected target ref","main").option("--worktree-mode <mode>","clean, isolated, external, or auto","auto").option("--title <title>")).action(async d=>{await m(async()=>{let g=await o(d.project),h=readFileSync$1(d.input,"utf8");return g.createCase({...a(d,d.idempotencyKey),projectRoot:d.project,baseRef:d.baseRef,targetRef:d.targetRef,worktreeMode:d.worktreeMode,title:d.title??h.trim()})},d.json);}),c(r.command("status").argument("<caseId>")).option("--json").action(async(d,g)=>{await m(f(g.project,h=>h.status(d)),g.json);}),c(r.command("cleanup").option("--stale-only","Only stop the currently owned stale runtime lease")).option("--json").action(async d=>{await m(async()=>{let g=ge(),h=await g.status();if(!h)return {ok:true,project:d.project,stopped:false,reason:"runtime_not_found"};if(d.staleOnly&&h.status==="ready")return {ok:true,project:d.project,stopped:false,reason:"runtime_is_ready"};let v=await g.stop();return {ok:true,project:d.project,stopped:v.stopped,runtimeStatus:v.state?.status??"stopped"}},d.json);}),l(r.command("answer").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--value <value>")).action(async(d,g)=>{await m(f(g.project,h=>h.answer(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),value:g.value})),g.json);}),l(r.command("revise").argument("<caseId>").requiredOption("--phase <phase>").requiredOption("--input <file>")).action(async(d,g)=>{await m(f(g.project,h=>h.revise(d,{...i(g,g.idempotencyKey),phase:g.phase,content:readFileSync$1(g.input,"utf8")})),g.json);}),l(r.command("compare").argument("<caseId>").requiredOption("--turn <n>").requiredOption("--decision <option>")).action(async(d,g)=>{await m(f(g.project,h=>h.compareOptions(d,{...i(g,g.idempotencyKey),turn:Number(g.turn),option:g.decision})),g.json);});for(let[d,g]of [["approve","approve"],["reject","reject"]]){let h=r.command(d).argument("<caseId>").requiredOption("--turn <n>").requiredOption("--stage <stage>").requiredOption("--reason <reason>").option("--artifact-hash <hash>");d==="approve"&&h.option("--plan-file <path>","Executable plan JSON required for plan approval"),l(h).action(async(v,y)=>{await m(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 m(f(g.project,h=>h.resume(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("recover-task").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.recoverTask(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("admit-worktree").argument("<caseId>").requiredOption("--mode <mode>").requiredOption("--admission-token <token>")).action(async(d,g)=>{await m(f(g.project,h=>h.admitWorktree(d,{...i(g,g.idempotencyKey),mode:g.mode,admissionToken:g.admissionToken})),g.json);}),l(r.command("refresh-activation").argument("<caseId>")).action(async(d,g)=>{await m(f(g.project,h=>h.refreshActivation(d,i(g,g.idempotencyKey))),g.json);}),l(r.command("cancel").argument("<caseId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.cancel(d,{...i(g,g.idempotencyKey),reason:g.reason})),g.json);}),l(r.command("rebind-session").argument("<caseId>").requiredOption("--previous-session <sessionId>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.rebindSession(d,{...i(g,g.idempotencyKey),previousSessionId:g.previousSession,reason:g.reason})),g.json);}),l(r.command("retry-task").argument("<caseId>").requiredOption("--task-id <taskId>")).action(async(d,g)=>{await m(f(g.project,h=>h.retryTask(d,{...i(g,g.idempotencyKey),taskId:g.taskId})),g.json);}),l(r.command("import-external").argument("<caseId>").requiredOption("--task-id <taskId>").requiredOption("--candidate <revision>").requiredOption("--reason <reason>")).action(async(d,g)=>{await m(f(g.project,h=>h.importExternalChange(d,{...i(g,g.idempotencyKey),taskId:g.taskId,candidateRevision:g.candidate,reason:g.reason})),g.json);}),l(r.command("export").argument("<caseId>").requiredOption("--path <path>")).action(async(d,g)=>{await m(f(g.project,h=>h.export(d,{...i(g,g.idempotencyKey),path:g.path})),g.json);}),r}function Mi(e=process.cwd(),t=createDeliveryProjectRuntime){let n=async(o,r)=>{let s=await t({projectRoot:o,retrieval:r});return s.close?new Proxy(s.facade,{get(i,a,c){let l=Reflect.get(i,a,c);return typeof l!="function"?l:async(...u)=>{try{return await l.apply(i,u)}finally{await s.close?.();}}}}):s.facade};return Do(void 0,o=>n(o,false),e,o=>n(o,true))}var Oo=C(()=>{se();});var Ao={};j(Ao,{renderLogCleanupResult:()=>Hi,runLogsCleanupCommand:()=>Fi});function xo(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function Fi(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:xo(e.olderThanDays,"older-than"),maxBytes:xo(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function jo(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function Hi(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${jo(e.deletedBytes)}`,` Remaining: ${jo(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
|
|
3
|
+
`)}var No=C(()=>{});function jt(){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 je(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 Yi)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:$o(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,un);try{for(let c of readdirSync(a,{withFileTypes:!0})){if(!c.isDirectory())continue;let l=join$1(a,c.name);existsSync$1(join$1(l,"skills"))&&r.push({root:l,version:$o(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 st(e,t){let n=Zi(join$1(t,"skills"));if(n.size===0)return [];let o=join$1(e,".claude","skills"),r=[],s;try{s=readdirSync(o,{withFileTypes:!0});}catch{return []}for(let i of s){if(!i.isDirectory())continue;let a=join$1(o,i.name,"SKILL.md"),c=Mo(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=ln(c.content),p=readFileSync$1(l,"utf-8"),m=ln(p);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:m,isKnownDevFlowArtifact:u===m});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function To(e,t,n,o=Date.now,r={}){let s=st(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()||ln(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)}
|
|
4
|
+
`,"utf-8"),a}function Zi(e){let t=new Map,n;try{n=readdirSync(e,{withFileTypes:!0});}catch{return t}for(let o of n){if(!o.isDirectory())continue;let r=join$1(e,o.name,"SKILL.md"),s=Mo(r);s&&t.set(s.name,r);}return t}function Mo(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 ln(e){return createHash("sha256").update(e).digest("hex")}function $o(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 Lo(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[Pt]=true,n.enabledPlugins=o,t){let r=me(n.extraKnownMarketplaces)?n.extraKnownMarketplaces:{};r[Ot]={source:{source:"directory",path:t}},n.extraKnownMarketplaces=r;}writeFileSync$1(e,`${JSON.stringify(n,null,2)}
|
|
5
|
+
`);}function At(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,Ot,un,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Dt(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)&&Dt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Dt(a,join$1(o,"skills")),ea(o,e),ta(o),Qi(t,o),Xi(t,o,n);}function Qi(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:Ot,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:un,source:s}]},null,2)}
|
|
6
|
+
`);let i=join$1(n,"known_marketplaces.json"),a={};if(existsSync$1(i)){let c;try{c=JSON.parse(readFileSync$1(i,"utf-8"));}catch{throw new Error(`Could not parse Claude marketplace registry: ${i}`)}if(!me(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[Ot]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
7
|
+
`);}function Xi(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[Pt];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Pt}`);let c=a??[],l=c.find(f=>me(f)&&f.scope==="user"),u=new Date().toISOString(),p=me(l)&&typeof l.installedAt=="string"?l.installedAt:u,m=c.filter(f=>!me(f)||f.scope!=="user");i[Pt]=[...m,{scope:"user",installPath:t,version:n,installedAt:p,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
|
|
8
|
+
`);}function me(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ea(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 Dt(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?Dt(o,r):cpSync(o,r,{force:true});}}function ta(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let o of readdirSync(t))if(o!==n){let r=join$1(t,o);statSync$1(r).isDirectory()&&rmSync(r,{recursive:true,force:true});}}var Pt,Ot,un,Yi,Ke=C(()=>{Pt="devflow@devflow-local",Ot="devflow-local",un="devflow",Yi=["devflow@devflow-local","devflow@devflow"];});var Jo={};j(Jo,{initProject:()=>ca,renderInitReport:()=>Ko});async function ca(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?la(r):{},a=ua(e,i);(!s||t.force||!Bo(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(Uo.isInitialized(e)||await Uo.init(e,{index:t.scan!==false}),t.scan!==false){let u;try{u=await createEngines(e);let{indexer:p,graph:m}=u,{files:f,symbols:d,imports:g}=await p.indexAll(e),h=await m.build(d,g);c.indexed={files:f.length,symbols:d.length,graphNodes:h.nodes.length};}catch{c.indexed={files:0,symbols:0,graphNodes:0};}finally{typeof u?.close=="function"&&u.close();}}if(t.scan!==false)try{let u=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let p=join(n,"init-report.md");writeFileSync(p,Ko(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=jt(),p=homedir(),m=join(p,".claude","plugins","cache"),f=join(u,"package.json"),d=existsSync(f)?JSON.parse(readFileSync(f,"utf-8")).version:"0.0.0";At(u,m,d),c.pluginDeployed=!0;let g=join(m,"devflow-local","devflow",d);l=g;try{c.migratedLegacySkills=To(p,g,d,Date.now,{includeModified:t.migrateLegacySkills}).map(h=>h.skillName);}catch(h){console.warn(`Warning: Legacy skill migration skipped \u2014 ${h.message}`);}}catch(u){console.warn(`Warning: Plugin deployment skipped \u2014 ${u.message}`);}if(t.plugins!==false)try{let u=homedir(),p=join(u,".claude","settings.json");Lo(p,l?dirname(l):void 0),c.pluginEnabled=!0;}catch(u){console.warn(`Warning: Plugin enablement skipped \u2014 ${u.message}`);}return c.mcpConfigured=!!(l&&existsSync(join(l,".mcp.json"))),c}function la(e){try{let t=JSON.parse(readFileSync(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return {}}}function Bo(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function ua(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(Bo(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function Ko(e){return [`# ${e.projectName} \u2014 DevFlow Onboarding Report`,`Generated: ${e.createdAt}`,"","## Project Stats",`- Files: ${e.stats.files}`,`- Symbols: ${e.stats.symbols}`,`- Graph Nodes: ${e.stats.graphNodes}`,"","## Tech Stack",`- Languages: ${e.stack.languages.join(", ")||"unknown"}`,`- Frameworks: ${e.stack.frameworks.join(", ")||"none detected"}`,`- Build Tools: ${e.stack.buildTools.join(", ")||"none detected"}`,`- Test Tools: ${e.stack.testTools.join(", ")||"none detected"}`,"","## Architecture Layers",...e.architectureLayers.map(n=>`- **${n.name}**: ${n.files} files`),"","## Key Modules",...e.keyModules.slice(0,10).map(n=>`- \`${n.name}\` \u2014 ${n.reason}`),"","## Key Symbols",...e.keySymbols.slice(0,20).map(n=>`- \`${n.name}\` (${n.kind}) in \`${n.file}\``),"","## Recommended Next Steps",...e.recommendedPlugins.map(n=>`- Install plugin: \`${n}\``),...e.recommendedWorkflows.map(n=>`- Run workflow: \`devflow workflow ${n}\``),`- Try: \`devflow context "${e.recommendedQueries[0]??"\u9879\u76EE\u67B6\u6784"}"\``].join(`
|
|
9
|
+
`)}var Uo,Vo=C(()=>{Ke();Uo=Wo.default??Wo;});var zo={};j(zo,{reviewPluginMemoryHints:()=>pa});async function pa(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(fa).filter(Boolean));if(!o||r.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let u of r){let p=s.get(u);for(let m of p?.memory?.project?.conventions??[])i.push({id:`${u}:${m.key}`,pluginName:u,convention:m});}if(i.length===0)return {available:0,selected:0};let a=i.map(u=>({name:`${u.pluginName}: ${u.convention.value}`,value:u.id,checked:false})),c=await(n.select??(u=>checkbox({message:"Select optional plugin memory hints to save",choices:u})))(a),l=i.filter(u=>c.includes(u.id));return l.length>0&&await(n.write??ha)(e,l),{available:i.length,selected:l.length}}function fa(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function ha(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 Go=C(()=>{});function Ae(){let e=[join(process.cwd(),"plugin-registry.json"),join(Sa,"../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 Yo(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var ba,Sa,$t=C(()=>{ba=fileURLToPath$1(import.meta.url),Sa=dirname(ba);});async function $(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??ja();if(!r)return n();let s=Na(r),i=false,a=Zo.get(r);if(a&&Date.now()-a.ts<xa?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await Aa(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),Zo.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 ja(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function Aa(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function Na(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 Zo,xa,_e=C(()=>{Zo=new Map,xa=3e4;});var Xo=C(()=>{});var at={};j(at,{installSkill:()=>Ne,listSkills:()=>sr,listSkillsSync:()=>Fa,searchSkills:()=>Ha,uninstallSkill:()=>fn});async function sr(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 Fa(){return []}async function Ha(e,t){let n=await sr(),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 ir(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 ar(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function cr(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
|
|
10
|
+
`,"utf-8"),renameSync$1(o,n);}async function Ne(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=ir(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(it,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",it,o],{stdio:"pipe",timeout:6e4});let a=ar(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),cr(t,a));let c=[],l="0.0.0",u=join(it,"node_modules",...o.split("/"));try{let p=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=p?.devflow?.templates??[],l=typeof p.version=="string"?p.version:l;}catch{throw new Error(`Installed plugin metadata is unreadable: ${u}`)}if(upsertPluginInstallRecord({packageName:o,pluginName:r,version:l,installPath:u,source:"npm",installedAt:i?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString(),projects:[...new Set([...i?.projects??[],t])]}),!i||i.version!==l)try{let p=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(p){let m={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&p.onUpdate?await p.onUpdate(m,i.version):!i&&p.onInstall&&await p.onInstall(m);}}catch(p){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:p.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${p.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function fn(e,t=process.cwd(),n){return $(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=ir(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=ar(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),cr(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",it,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(it,"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 it,Re=C(()=>{_e();Xo();it=getPluginInstallRoot();});var hn={};j(hn,{detectTechStack:()=>Ua,guidePluginInstallation:()=>Ba,installPluginsFromList:()=>qa,resolvePluginName:()=>ur});function Ua(e){let t=Ae();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function ur(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function qa(e){let t=e.split(",").map(ur).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Ne(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Ba(e){let t=Ae();if(t.plugins.length===0)return console.log(`
|
|
11
11
|
No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
12
12
|
`),[];console.log(`
|
|
13
13
|
\u{1F50C} Plugin Installation Guide
|
|
14
14
|
`);let n=resolveProjectCapabilityProfile(e,{registry:t}),o=n.detectedStacks;o.length>0&&console.log(`Detected tech stack: ${o.join(", ")}
|
|
15
15
|
`);let r=new Set(n.selectedPlugins);if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
|
|
16
|
-
`);let a=[...r];for(let c of a)try{await
|
|
16
|
+
`);let a=[...r];for(let c of a)try{await Ne(c,e,!0),console.log(`\u2713 ${c}`);}catch{console.error(`\u2717 Failed to install ${c}`);}return a}let s=t.plugins.map(a=>({name:`${a.name.replace("@devflow-tools/","")} - ${a.description.substring(0,50)}`,value:a.name,checked:r.has(a.name)})),i;try{i=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:s});}catch{return console.log(`
|
|
17
17
|
Plugin installation cancelled.
|
|
18
18
|
`),[]}if(i.length>0){console.log(`
|
|
19
19
|
Installing selected plugins...
|
|
20
|
-
`);for(let a of i)try{await
|
|
20
|
+
`);for(let a of i)try{await Ne(a,e,!0),console.log(`\u2713 ${a}
|
|
21
21
|
`);}catch{console.error(`\u2717 Failed to install ${a}
|
|
22
22
|
`);}}else console.log(`
|
|
23
23
|
Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
24
|
-
`);return i}var
|
|
24
|
+
`);return i}var yn=C(()=>{$t();Re();});var br={};j(br,{ResetExecutionError:()=>ct,executeResetCommand:()=>gc,formatResetResult:()=>Sn,runReset:()=>kr});function oc(){if(It)return It;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return It=e.DatabaseSync,It}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function Sn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function rc(e){return e==="all"||hr.includes(e)}function ie(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function wn(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 _n(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function sc(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 yr(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(!_n(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function ic(e,t){return (e==="all"?hr:[e]).map(o=>({scope:o,path:join$1(t,...fr[o])}))}function vr(e,t){let n=ie(t);if(n)return yr(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function wr(e,t){let n=vr(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 ac(e){let t=ie(e);if(!t?.isFile()||t.size<vn.length)return false;let n=Buffer.alloc(vn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(vn)}finally{closeSync(o);}}function cc(e){let t=[];function n(o){let r=lstatSync(o);if(!r.isSymbolicLink()){if(r.isDirectory()){for(let s of readdirSync(o).sort())n(join$1(o,s));return}ac(o)&&t.push(o);}}return n(e),t}function lc(e,t){mkdirSync$1(dirname$1(t),{recursive:true});let n=new(oc())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function uc(e,t,n){let o=cc(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));lc(s,i);}}function dc(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),uc(c.path,join$1(i,c.scope),()=>wr(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 kr(e,t={}){if(!rc(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=sc(e.project??process.cwd()),o=ic(e.scope,n);for(let c of o)yr(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=vr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?wn(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=wn(l.path),p=join$1(s,l.scope),m=wn(p);if(_n(u,m)||_n(m,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${m}`);if(ie(p))throw new Error(`Backup destination already exists: ${p}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,l)=>renameSync(c,l),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&r.length>0&&dc(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),wr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new ct(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function gc(e,t={},n=console){try{let o=kr(e,t),r=Sn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof ct)for(let r of Sn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var It,ct,fr,hr,vn,Sr=C(()=>{ct=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};fr={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},hr=Object.keys(fr),vn=Buffer.from("SQLite format 3\0","binary");});var Or={};j(Or,{cleanupProject:()=>Cc});function Er(e){try{return process.kill(e,0),!0}catch(t){return t.code!=="ESRCH"}}function Rc(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&&Er(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)&&Er(i.pid));if(s)throw new Error(`Close the active DevFlow hook daemon before cleanup (pid ${s.pid}).`)}function Ec(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)}
|
|
25
|
+
`,{mode:384});}function Cr(e,t){return new Set(e.prepare(`PRAGMA table_info("${t}")`).all().map(n=>n.name))}function Pc(e){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'").all().flatMap(({name:n})=>{let o=Cr(e,n);return o.has("project_root")?[{name:n,hasSessionId:o.has("session_id")}]:[]})}function Pr(e){return new Set(e.prepare("PRAGMA foreign_key_check").all().map(t=>`${t.table}:${t.rowid}:${t.parent}:${t.fkid}`))}function Dc(e,t){let n={},o=Pc(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)Cr(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 Cc(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};Rc(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 _c(c,join$1(a,"global.db")),existsSync$1(r)&&cpSync(r,join$1(a,"project.devflow"),{recursive:!0,errorOnExist:!0}),existsSync$1(s)&&cpSync(s,join$1(a,"project-state"),{recursive:!0,errorOnExist:!0}),c.exec("PRAGMA foreign_keys = OFF");let p=Pr(c);c.exec("BEGIN IMMEDIATE");let m;try{if(m=Dc(c,n),[...Pr(c)].filter(d=>!p.has(d)).length>0)throw new Error("Cleanup would leave new broken database references.");existsSync$1(r)&&(l=`${r}.cleanup-${randomUUID()}`,renameSync(r,l)),existsSync$1(s)&&(u=`${s}.cleanup-${randomUUID()}`,renameSync(s,u)),c.exec("COMMIT");}catch(f){throw c.exec("ROLLBACK"),l&&renameSync(l,r),u&&renameSync(u,s),f}return l&&rmSync(l,{recursive:!0,force:!0}),u&&rmSync(u,{recursive:!0,force:!0}),Ec(n,o),{projectRoot:n,backupDirectory:a,...m,projectDataRemoved:!!l}}finally{c.close();}}var _c,xr=C(()=>{_c=createRequire$1(import.meta.url)("node:sqlite").backup;});var Fr={};j(Fr,{consolidateDatabases:()=>Ac,formatConsolidateResult:()=>Nc});function Ac(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=[Ar("project",o,s?n:void 0),Ar("codegraph",r,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(f=>f.exists&&Object.keys(f.tables).length>0),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname$1(n))==="global"?join$1(dirname$1(dirname$1(n)),"backup"):join$1(dirname$1(n),"backup"),p=join$1(e.backupRoot??u,l);mkdirSync$1(p,{recursive:true}),a.backupDir=p;let m=c.some(f=>f.kind==="project")?$c(o):null;try{let f=new Map;for(let v of c){let y=join$1(p,`${v.kind}-${basename(v.path)}.snapshot`);Nr(v.path,y),f.set(v.kind,y);}s&&Nr(n,join$1(p,"global-devflow.db.before"));let d=f.has("project")?Tc(o,p):[];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")&&$r(g,"project_source",void 0,a.inserted),f.has("codegraph")){$r(g,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let y of dt(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 Lr(d),v}finally{g?.close();}return a}finally{Ic(m);}}function Nc(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 Ar(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 dt(r).filter(c=>!i||i.has(c)))o.tables[a]=xn(r,a),o.conflicts[a]=s&&dt(s).includes(a)?Mc(r,s,a):0;}finally{r.close(),s?.close();}return o}function Nr(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 $c(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 Ic(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Tc(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 Lr(n),o}return n}function Lr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function $r(e,t,n,o){let r=new Set(dt(e)),s=dt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Lt(e,"main",i),c=new Set(Lt(e,t,i).map(d=>d.name)),l=a.filter(d=>c.has(d.name));if(On.has(i)&&(l=l.filter(d=>d.pk===0)),l.length===0)continue;let u=xn(e,i),p=l.map(d=>H(d.name)).join(", "),m=l.map(d=>`s.${H(d.name)}`).join(", ");if(l.filter(d=>d.pk>0).length>0&&!On.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${p}) SELECT ${m} FROM ${H(t)}.${H(i)} s`);else {let d=l.map(g=>`t.${H(g.name)} IS s.${H(g.name)}`).join(" AND ");e.exec(`
|
|
25
26
|
INSERT INTO main.${H(i)} (${p})
|
|
26
27
|
SELECT ${m} FROM ${H(t)}.${H(i)} s
|
|
27
28
|
WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${d})
|
|
28
|
-
`);}o[i]=(o[i]??0)+(
|
|
29
|
-
`)}return JSON.stringify(t,null,2)}function
|
|
30
|
-
`)}var
|
|
31
|
-
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await
|
|
32
|
-
Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j(Mr,{getDocsStatus:()=>Yc,queryKnowledge:()=>Tr,searchKnowledge:()=>Gc,syncDocs:()=>Zc});async function Tr(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 Gc(e,t,n){return (await Tr(e,t,void 0,n)).results}async function Yc(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 Zc(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 Lr=D(()=>{Se();});var $n={};j($n,{backfillKnowledgeVectors:()=>ol,resyncKnowledgeDocs:()=>nl});function Fr(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function nl(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Fr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function ol(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Fr(t);Nn(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 Nn(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw Nn(t,{phase:"failed",source:e.source??"all",errorCategory:rl(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 Nn(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 rl(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 In=D(()=>{});var Hr={};j(Hr,{inspectSkillHealth:()=>Mt,showSkillHealth:()=>gl});function ul(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 Mt(e){let t=e===void 0?Oe(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=[];dl(t,n);let o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=ul(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let p=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&p!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let m=a.get(u.name)??[];m.push(l),a.set(u.name,m);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),p=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(p)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function dl(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 gl(e={}){let t=Mt(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 Mn=D(()=>{Be();});var Ln={};j(Ln,{showMcpHealth:()=>vl,showMcpInventory:()=>yl});async function yl(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 vl(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 Fn=D(()=>{});var Ps={};j(Ps,{renderDoctorText:()=>Rs,runDoctor:()=>ed,runDoctorAudit:()=>nd,runDoctorAuditFix:()=>od,runDoctorCommand:()=>td,runDoctorReceipts:()=>sd,runDoctorViolations:()=>rd,runLegacyDoctorReport:()=>Es,runStructuredDoctor:()=>oo});function us(){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 doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ie(e){return {homeDir:e.homePath,env:e.env??process.env}}function Kt(e){return join$1(getDevFlowStateRoot(ie(e)),"global","devflow.db")}function I(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function $l(e,t){let n=t.homePath??homedir$1(),o=ie(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let h=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:h,target:"unsupported capabilities have explicit degradation",ok:h.every(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 p=t.activePluginRoot??Oe(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(p){let h=Mt(p);r.push({key:"skill_health",value:{root:h.pluginRoot,skills:h.skills,commands:h.commands,issues:h.issues},target:"valid and fully bound installed skills",ok:h.healthy,severity:"warning"});}let m=readRuntimeState(o);r.push({key:"runtime_state_v2",value:m??"not registered",target:"ready while active, stopped or absent while idle",ok:!m||m.status==="ready"||m.status==="stopped",severity:m?.status==="failed"?"error":"warning"});let f=join$1(getDevFlowStateRoot(o),["runtime","endpoint.json"].join("-"));r.push({key:"legacy_runtime_endpoint_ignored",value:existsSync$1(f),target:false,ok:!existsSync$1(f),severity:"warning"});let d=(t.now??Date.now)(),g=listRuntimeHttpCircuits(o).filter(h=>h.status==="open"&&(h.openUntil??0)>d);return r.push({key:"runtime_http_circuits",value:g,target:[],ok:g.length===0,severity:g.some(h=>h.failures>=2)?"error":"warning"}),{name:"Contract",status:I(r),metrics:r}}function Vn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Il(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 Tl(e,t){let n=Vn(e),o=ie(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(f=>Il(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:Vn(d.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let p=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:p,target:[s],ok:!0,severity:"info"});let m=u.filter((f,d)=>f.projectHash!==r||p[d]!==s).length;i.push({key:"daemon_identity_mismatches",value:m,target:0,ok:m===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:I(i),metrics:i}}function Ll(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(Ml)){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 ds(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 Fl(e){let t=ds(e);return t&&t.length>0?t:null}function Wn(e){return typeof e=="bigint"?e>=0n&&e<=BigInt(Number.MAX_SAFE_INTEGER)?e:null:typeof e!="number"?null:Number.isSafeInteger(e)&&e>=0?e:null}function Hl(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function qr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Ul(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(us())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Ll(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(`
|
|
29
|
+
`);}o[i]=(o[i]??0)+(xn(e,i)-u);}}function Mc(e,t,n){let o=new Set(Lt(t,"main",n).map(l=>l.name)),r=Lt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||On.has(n))return 0;let s=r.map(l=>H(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${H(n)}`).all(),a=r.map(l=>`${H(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${H(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(p=>u[p.name]))?1:0),0)}function dt(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 Lt(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function xn(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 On,Hr=C(()=>{On=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var Wr={};j(Wr,{connectAgent:()=>Hc,getAvailableAgents:()=>Wc});async function Hc(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 Wc(){return listAdapters()}var Ur=C(()=>{});var Br={};j(Br,{getIndexStatus:()=>Uc,refreshIndex:()=>qc});async function Uc(e){return $(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function qc(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var Kr=C(()=>{_e();});var Jr={};j(Jr,{getGraph:()=>Kc});async function Kc(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 Vr=C(()=>{_e();});var jn={};j(jn,{getContext:()=>zc,getTaskContext:()=>Gc});async function zc(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 Gc(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 An=C(()=>{_e();});var gt={};j(gt,{getWorkflowRuns:()=>Gr,getWorkflowStatus:()=>Qc,listWorkflows:()=>Yc,runWorkflow:()=>Zc});async function Yc(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Zc(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 Qc(e){return Gr(e)}async function Gr(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var mt=C(()=>{_e();});var Ze={};j(Ze,{cancelWorker:()=>sl,listWorkers:()=>ol,retryWorkerCleanup:()=>il,showWorker:()=>rl,workerMergeStatus:()=>al});function ol(e){return pt(e,t=>Ye(e.json,{projectRoot:Ge(e.projectRoot),workers:t.listWorkflowWorkers(Ge(e.projectRoot))}))}function rl(e,t){return pt(t,n=>{let o=Ge(t.projectRoot),r=Ft(n,o,e);return Ye(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function sl(e,t){return pt(t,n=>{let o=Ge(t.projectRoot),r=Ft(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),Ye(t.json,s)})}function il(e,t){return pt(t,n=>{let o=Ge(t.projectRoot),r=Ft(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return Ye(t.json,s)})}function al(e,t){return pt(t,n=>{let o=Ge(t.projectRoot);Ft(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Ye(t.json,r??{workerId:e,state:"not_queued"})})}function Ft(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function Ge(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function pt(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Ye(e,t){if(e)return JSON.stringify(t,null,2);if(cl(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(ll(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>Ye(false,o)).join(`
|
|
30
|
+
`)}return JSON.stringify(t,null,2)}function cl(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function ll(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Qe=C(()=>{});var $n={};j($n,{getEmbeddingStatus:()=>gl,prepareEmbeddings:()=>ml,renderEmbeddingStatus:()=>pl});async function gl(){return inspectEmbeddingModel()}async function ml(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function pl(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(`
|
|
31
|
+
`)}var In=C(()=>{});var $e={};j($e,{backfillObservationVectors:()=>bl,queryMemory:()=>vl,reviewCandidates:()=>kl,reviewMemories:()=>_l,setMemory:()=>wl,showMemory:()=>yl});async function yl(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 vl(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 wl(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 kl(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function bl(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Sl(e){let t=hl.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function _l(){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(`
|
|
32
|
+
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Sl(" 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(`
|
|
33
|
+
Reviewed ${o}/${t.length} pending memories.`);}var Ie=C(()=>{_e();});var Zr={};j(Zr,{getDocsStatus:()=>Pl,queryKnowledge:()=>Yr,searchKnowledge:()=>El,syncDocs:()=>Dl});async function Yr(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 El(e,t,n){return (await Yr(e,t,void 0,n)).results}async function Pl(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 Dl(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 Qr=C(()=>{_e();});var Hn={};j(Hn,{backfillKnowledgeVectors:()=>Nl,resyncKnowledgeDocs:()=>Al});function Xr(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function Al(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Xr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Nl(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Xr(t);Fn(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 Fn(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw Fn(t,{phase:"failed",source:e.source??"all",errorCategory:$l(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 Fn(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 $l(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 Wn=C(()=>{});var es={};j(es,{inspectSkillHealth:()=>Ht,showSkillHealth:()=>Ul});function Hl(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 Ht(e){let t=e===void 0?je(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=[];Wl(t,n);let o=[join$1(t,"dist","command-registry.json"),join$1(t,"command-registry.json")].find(existsSync$1),r=null,s={};if(!o)n.push({category:"missing",reason:"command-registry.json is missing"});else try{let c=JSON.parse(readFileSync$1(o,"utf8"));r=typeof c.version=="number"?c.version:null,r!==1&&r!==2&&n.push({category:"unsupported",path:o,reason:`unsupported registry version ${String(c.version)}`}),c.commands&&typeof c.commands=="object"?s=c.commands:n.push({category:"malformed",path:o,reason:"commands object is missing"});}catch(c){n.push({category:"malformed",path:o,reason:c.message});}let i=join$1(t,"skills"),a=new Map;if(!existsSync$1(i))n.push({category:"missing",path:i,reason:"skills directory is missing"});else for(let c of readdirSync(i,{withFileTypes:true})){if(!c.isDirectory())continue;let l=join$1(i,c.name,"SKILL.md");if(!existsSync$1(l))continue;let u=Hl(l);if(!u.name||!u.description){n.push({category:"malformed",skill:c.name,path:l,reason:"frontmatter name and description are required"});continue}/^devflow(?::[a-z0-9-]+)?$/.test(u.name)||n.push({category:"unsupported",skill:u.name,path:l,reason:"skill name is outside the canonical DevFlow namespace"});let p=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&p!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let m=a.get(u.name)??[];m.push(l),a.set(u.name,m);}for(let[c,l]of a)l.length>1&&n.push({category:"duplicate",skill:c,reason:l.join(", ")}),c!=="devflow"&&!s[c]&&!["devflow:doctor","devflow:start"].includes(c)&&n.push({category:"unbound",skill:c,path:l[0],reason:"skill has no command registry entry"});for(let[c,l]of Object.entries(s))if(a.has(c)||n.push({category:"missing",skill:c,reason:"registry command has no installed SKILL.md"}),(!Array.isArray(l.mcpTools)||l.mcpTools.some(u=>typeof u!="string"))&&n.push({category:"malformed",skill:c,reason:"mcpTools must be a string array"}),r===2&&typeof l.skillPath=="string"){let u=join$1(t,l.skillPath),p=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(p)&&n.push({category:"stale",skill:c,path:l.skillPath,reason:"registry skillPath does not exist"});}return {pluginRoot:t,registryVersion:r,skills:a.size,commands:Object.keys(s).length,issues:n,healthy:n.length===0}}function Wl(e,t){try{if(!JSON.parse(readFileSync$1(join$1(e,"package.json"),"utf8")).dependencies?.["@devflow-tools/memory-engine"])return;let o=readPersistedClaudeHookNode(e);if(!o){t.push({category:"runtime",path:e,reason:"Claude Hook Node identity is missing; redeploy the plugin to bind and verify native dependencies."});return}let r=resolveClaudeHookRuntime({env:{...process.env,DEVFLOW_HOOK_NODE:o}});verifyClaudeHookNativeRuntime(e,r);}catch(n){t.push({category:"runtime",path:e,reason:n instanceof Error?n.message:String(n)});}}function Ul(e={}){let t=Ht(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(()=>{Ke();});var Bn={};j(Bn,{showMcpHealth:()=>zl,showMcpInventory:()=>Vl});async function Vl(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 zl(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 Kn=C(()=>{});var Hs={};j(Hs,{renderDoctorText:()=>Ls,runDoctor:()=>xd,runDoctorAudit:()=>Ad,runDoctorAuditFix:()=>Nd,runDoctorCommand:()=>jd,runDoctorReceipts:()=>Id,runDoctorViolations:()=>$d,runLegacyDoctorReport:()=>Fs,runStructuredDoctor:()=>lo});function Rs(){if(Ut)return Ut;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ut=e.DatabaseSync,Ut}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 zt(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 uu(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 p=t.activePluginRoot??je(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(p){let h=Ht(p);r.push({key:"skill_health",value:{root:h.pluginRoot,skills:h.skills,commands:h.commands,issues:h.issues},target:"valid and fully bound installed skills",ok:h.healthy,severity:"warning"});}let m=readRuntimeState(o);r.push({key:"runtime_state_v2",value:m??"not registered",target:"ready while active, stopped or absent while idle",ok:!m||m.status==="ready"||m.status==="stopped",severity:m?.status==="failed"?"error":"warning"});let f=join$1(getDevFlowStateRoot(o),["runtime","endpoint.json"].join("-"));r.push({key:"legacy_runtime_endpoint_ignored",value:existsSync$1(f),target:false,ok:!existsSync$1(f),severity:"warning"});let d=(t.now??Date.now)(),g=listRuntimeHttpCircuits(o).filter(h=>h.status==="open"&&(h.openUntil??0)>d);return r.push({key:"runtime_http_circuits",value:g,target:[],ok:g.length===0,severity:g.some(h=>h.failures>=2)?"error":"warning"}),{name:"Contract",status:I(r),metrics:r}}function Xn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function du(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function gu(e,t){let n=Xn(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=>du(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:Xn(d.rootPath).path===n.path});i.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:u.length},target:"0 when idle or 1 while active",ok:u.length<=1,severity:"warning"});let p=u.map(f=>getDaemonSocketPath(f.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:p,target:[s],ok:!0,severity:"info"});let m=u.filter((f,d)=>f.projectHash!==r||p[d]!==s).length;i.push({key:"daemon_identity_mismatches",value:m,target:0,ok:m===0,severity:"warning"});}catch{i.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),i.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),i.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:I(i),metrics:i}}function pu(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(mu)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function Es(e){if(typeof e!="string")return null;try{let t=JSON.parse(e);return !Array.isArray(t)||!t.every(n=>typeof n=="string"&&n.trim().length>0)||new Set(t).size!==t.length?null:t}catch{return null}}function fu(e){let t=Es(e);return t&&t.length>0?t:null}function Vn(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 hu(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function os(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function vu(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Rs())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=pu(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
|
|
33
34
|
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
34
35
|
FROM distill_leases
|
|
35
|
-
`);l.setReadBigInts?.(!0);let u=l.all(),p=new Set,m=0,f=0;for(let _ of u){let T=
|
|
36
|
+
`);l.setReadBigInts?.(!0);let u=l.all(),p=new Set,m=0,f=0;for(let _ of u){let T=fu(_.event_ids),J=Es(_.session_ids),Y=Vn(_.event_count),x=Vn(_.created_at),B=Vn(_.expires_at),O=typeof _.status=="string"&&yu.has(_.status)?_.status:null,A=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&hu(Y,T.length);if(!A||!T||!J||!F||x===null||B===null||O===null){m+=1,_.status==="pending"&&(B===null||os(B,c))&&(f+=1);continue}if(!(O!=="pending"||!os(B,c)))for(let N of T)p.add(N);}n.push({key:"malformed_distill_leases",value:m,target:0,ok:m===0,severity:f>0?"error":"warning"});let g=i.prepare(`
|
|
36
37
|
SELECT id
|
|
37
38
|
FROM session_events
|
|
38
39
|
WHERE processed = 0 AND created_at < ?
|
|
@@ -41,11 +42,11 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
41
42
|
FROM session_events event
|
|
42
43
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
43
44
|
WHERE TRIM(event.session_id) = '' OR session.id IS NULL
|
|
44
|
-
`);n.push({key:"orphan_memory_events",value:R,target:0,ok:R===0,severity:"error"});let
|
|
45
|
+
`);n.push({key:"orphan_memory_events",value:R,target:0,ok:R===0,severity:"error"});let w=q(i,`
|
|
45
46
|
SELECT COUNT(*) count
|
|
46
47
|
FROM sessions
|
|
47
48
|
WHERE status = 'active' AND created_at < ?
|
|
48
|
-
`,c-
|
|
49
|
+
`,c-eo);n.push({key:"stale_memory_sessions",value:w,target:0,ok:w===0,severity:"error"});let k=i.prepare(`
|
|
49
50
|
SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
|
|
50
51
|
FROM (
|
|
51
52
|
SELECT project, session_id, title, COUNT(*) AS title_count
|
|
@@ -53,7 +54,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
53
54
|
GROUP BY project, session_id, title
|
|
54
55
|
HAVING COUNT(*) > 1
|
|
55
56
|
)
|
|
56
|
-
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(
|
|
57
|
+
`).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(Rs())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function he(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 Ps(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function to(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function wu(e){let t=to(Ps(e.output)),n=to(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 ku(e){let t=Ps(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=to(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function rs(e,t){return t===0?0:e/t}function zn(e,t){return e===0?1:t/e}async function bu(e,t){let n=[],o=null,r=null,s=join$1(e,".codegraph","codegraph.db");if(!existsSync$1(s))n.push({key:"codegraph_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=X(s,t),M(m,"nodes")?(o=q(m,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let i=join$1(e,".devflow","symbols-vec.db");if(!existsSync$1(i))n.push({key:"symbols_vectors_db",value:"missing",target:i,ok:false,severity:"warning"});else {let m;try{m=X(i,t);let f=M(m,"symbols_vec_rowids")?"symbols_vec_rowids":M(m,"symbol_sources")?"symbol_sources":null;f?(r=q(m,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}if(o!==null&&r!==null){let m=zn(o,r);n.push({key:"symbols_vector_coverage",value:m,target:">= 0.90",ok:m>=.9,severity:"warning"});}let a=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(a))n.push({key:"knowledge_vectors_db",value:"missing",target:a,ok:false,severity:"warning"});else {let m;try{m=X(a,t);let d=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(g=>!M(m,g));if(d.length>0)n.push({key:"knowledge_vector_schema",value:d,target:[],ok:!1,severity:"warning"});else {let h=he(m,"knowledge_docs").has("status")?"AND d.status = 'active'":"",v=q(m,`
|
|
57
58
|
SELECT COUNT(*) count
|
|
58
59
|
FROM knowledge_chunks c
|
|
59
60
|
JOIN knowledge_docs d ON d.id = c.doc_id
|
|
@@ -64,7 +65,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
64
65
|
JOIN knowledge_chunks c ON c.id = v.id
|
|
65
66
|
JOIN knowledge_docs d ON d.id = c.doc_id
|
|
66
67
|
WHERE 1 = 1 ${h}
|
|
67
|
-
`),R=
|
|
68
|
+
`),R=zn(v,y),k=m.prepare(`
|
|
68
69
|
SELECT d.source source, COUNT(c.id) chunks,
|
|
69
70
|
SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
|
|
70
71
|
FROM knowledge_docs d
|
|
@@ -72,19 +73,19 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
72
73
|
LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
|
|
73
74
|
WHERE 1 = 1 ${h}
|
|
74
75
|
GROUP BY d.source ORDER BY d.source
|
|
75
|
-
`).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:
|
|
76
|
+
`).all().map(_=>{let T=Number(_.chunks),J=Number(_.vectors);return {source:_.source,chunks:T,vectors:J,coverage:zn(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{m?.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 m;try{if(m=X(c,t),!M(m,"observations")||!M(m,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=he(m,"observations"),d=f.has("quality_status")&&f.has("resolution_state"),h=q(m,`SELECT COUNT(*) count FROM observations ${d?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),v=q(m,`
|
|
76
77
|
SELECT COUNT(DISTINCT e.source_id) count
|
|
77
78
|
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
78
79
|
WHERE e.source_type = 'observation'
|
|
79
80
|
${d?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
|
|
80
|
-
`),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{m?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(
|
|
81
|
-
`).filter(f=>{let d=/^\[([^\]]+)\]/.exec(f);return d?Date.parse(d[1])>=m:!1}).length;}catch(m){n.push({key:"embedder_error_log_read",value:m.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:p,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let m=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:m.state,modelId:m.modelId,revision:m.revision},target:{state:"ready"},ok:m.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:m.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:m.missingFiles,corruptFiles:m.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:m.missingFiles.length===0&&m.corruptFiles.length===0,severity:"warning"});}catch(m){n.push({key:"embedding_model_inspection",value:m.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function
|
|
81
|
+
`),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{m?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(ae(t)),"errors","embedder.log"),p=0;if(existsSync$1(u))try{let m=l-864e5;p=readFileSync$1(u,"utf8").split(`
|
|
82
|
+
`).filter(f=>{let d=/^\[([^\]]+)\]/.exec(f);return d?Date.parse(d[1])>=m:!1}).length;}catch(m){n.push({key:"embedder_error_log_read",value:m.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:p,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let m=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:m.state,modelId:m.modelId,revision:m.revision},target:{state:"ready"},ok:m.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:m.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:m.missingFiles,corruptFiles:m.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:m.missingFiles.length===0&&m.corruptFiles.length===0,severity:"warning"});}catch(m){n.push({key:"embedding_model_inspection",value:m.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:I(n),metrics:n}}function Su(e,t,n){let o=[],r=zt(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=he(d,"sessions"),v=he(d,"tool_call_events"),y=he(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,`
|
|
82
83
|
SELECT COUNT(*) count FROM sessions
|
|
83
84
|
WHERE project_root = ? AND started_at >= ?
|
|
84
|
-
`,e,s);o.push({key:"session_start_evidence_24h",value:
|
|
85
|
+
`,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,`
|
|
85
86
|
SELECT COUNT(*) count FROM sessions
|
|
86
87
|
WHERE project_root = ? AND status = 'running' AND started_at < ?
|
|
87
|
-
`,e,(n.now??Date.now)()-
|
|
88
|
+
`,e,(n.now??Date.now)()-eo);o.push({key:"stale_telemetry_sessions",value:A,target:0,ok:A===0,severity:"error"});let F=d.prepare(`
|
|
88
89
|
SELECT status, COUNT(*) count
|
|
89
90
|
FROM sessions
|
|
90
91
|
WHERE project_root = ?
|
|
@@ -94,21 +95,21 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
94
95
|
FROM devflow_session_closures
|
|
95
96
|
WHERE project_root = ?
|
|
96
97
|
GROUP BY state
|
|
97
|
-
`).all(e),U={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let
|
|
98
|
+
`).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,`
|
|
98
99
|
SELECT COUNT(*) count
|
|
99
100
|
FROM devflow_session_closures
|
|
100
101
|
WHERE project_root = ? AND state = 'closing' AND updated_at < ?
|
|
101
|
-
`,e,i-
|
|
102
|
+
`,e,i-eo);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 ke=0;v.has("session_id")&&(ke=q(d,`
|
|
102
103
|
SELECT COUNT(*) count
|
|
103
104
|
FROM tool_call_events event
|
|
104
105
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
105
106
|
WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
|
|
106
|
-
`));let
|
|
107
|
+
`));let le=0;if(y.has("session_id")&&(le=q(d,`
|
|
107
108
|
SELECT COUNT(*) count
|
|
108
109
|
FROM skill_executions execution
|
|
109
110
|
LEFT JOIN sessions session ON session.id = execution.session_id
|
|
110
111
|
WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
|
|
111
|
-
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ke,skillExecutions:
|
|
112
|
+
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ke,skillExecutions:le},target:{toolCalls:0,skillExecutions:0},ok:ke===0&&le===0,severity:"error"}),["session_id","status","started_at"].every(L=>y.has(L))){let L=i-18e5,U=d.prepare(`
|
|
112
113
|
SELECT
|
|
113
114
|
COUNT(*) total,
|
|
114
115
|
COALESCE(SUM(CASE WHEN execution.started_at < ? THEN 1 ELSE 0 END), 0) older_than_30m,
|
|
@@ -118,7 +119,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
118
119
|
WHERE session.project_root = ?
|
|
119
120
|
AND execution.status = 'running'
|
|
120
121
|
AND (execution.started_at < ? OR session.status <> 'running')
|
|
121
|
-
`).get(L,e,L),
|
|
122
|
+
`).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=he(d,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(N=>!O.has(N));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 N=d.prepare(`
|
|
122
123
|
SELECT
|
|
123
124
|
COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
|
|
124
125
|
COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
|
|
@@ -130,7 +131,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
130
131
|
MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
|
|
131
132
|
FROM devflow_work_items
|
|
132
133
|
WHERE project_root = ?
|
|
133
|
-
`).get(i,e),V=Number(N?.queue_depth??0),Z=Number(N?.pending??0),ke=Number(N?.leased??0),
|
|
134
|
+
`).get(i,e),V=Number(N?.queue_depth??0),Z=Number(N?.pending??0),ke=Number(N?.leased??0),le=Number(N?.failed??0),be=Number(N?.dead_letters??0),L=Number(N?.expired_leases??0),U=N?.oldest_pending_at==null?void 0:Number(N.oldest_pending_at),ue=N?.last_successful_drain_at==null?void 0:Number(N.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:ke,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:be,target:0,ok:be===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(`
|
|
134
135
|
SELECT
|
|
135
136
|
COUNT(*) total,
|
|
136
137
|
COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
|
|
@@ -144,56 +145,56 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
144
145
|
`,e),F=d.prepare(`
|
|
145
146
|
SELECT MIN(created_at) oldest FROM devflow_merge_queue
|
|
146
147
|
WHERE project_root = ? AND state IN ('waiting','ready')
|
|
147
|
-
`).get(e),N=Number(
|
|
148
|
+
`).get(e),N=Number(O?.active??0),V=Number(O?.held??0),Z=Number(O?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:N,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(A).filter(N=>N.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=he(d,"tool_metrics"),F=v.has("event_id")&&A.has("tool_call_event_id")&&A.has("status"),N=[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(`
|
|
148
149
|
SELECT ${N}
|
|
149
150
|
FROM tool_call_events event
|
|
150
151
|
${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
|
|
151
|
-
${
|
|
152
|
+
${O?"JOIN sessions event_session ON event_session.id = event.session_id":""}
|
|
152
153
|
WHERE event.timestamp >= ?
|
|
153
|
-
${
|
|
154
|
-
`).all(...
|
|
154
|
+
${O?"AND event_session.project_root = ?":""}
|
|
155
|
+
`).all(...O?[s,e]:[s]),Z=V.map(wu),ke=Z.filter(L=>L.failed).length,le=Z.filter((L,U)=>L.failed&&V[U]?.session_status!=="completed").length,be=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:ke,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:be,target:0,ok:be===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:rs(ke,V.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:rs(be,V.length),target:0,ok:be===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,Ei)=>Z[Ei]?.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(`
|
|
155
156
|
SELECT execution.fallback_count, execution.fallback_reasons
|
|
156
157
|
FROM skill_executions execution
|
|
157
158
|
JOIN sessions session ON session.id = execution.session_id
|
|
158
159
|
WHERE session.project_root = ? AND execution.started_at >= ?
|
|
159
|
-
`).all(e,s);for(let A of
|
|
160
|
+
`).all(e,s);for(let A of O){Y+=Number(A.fallback_count??0);for(let F of ku(A.fallback_reasons))x[F]=(x[F]??0)+1;}}let B=0;if(M(d,"devflow_hook_fallbacks")){let O=d.prepare(`
|
|
160
161
|
SELECT reason, COUNT(*) count
|
|
161
162
|
FROM devflow_hook_fallbacks
|
|
162
163
|
WHERE project_root = ? AND created_at >= ?
|
|
163
164
|
GROUP BY reason ORDER BY reason
|
|
164
|
-
`).all(e,s);for(let A of
|
|
165
|
-
`))if(u.trim())try{let p=JSON.parse(u),m=
|
|
165
|
+
`).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(g).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(d){o.push({key:"telemetry_cache_read",value:d.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),p=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:p?u:"absent",target:"absent",ok:!p,severity:a});let m=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(m)){let d;try{d=X(m,n),f=d.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(g=>g.name);}catch(g){o.push({key:"codegraph_telemetry_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:I(o),metrics:o}}function is(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Ds(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 _u(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=is(o),p=l.isDirectory()&&!l.isSymbolicLink(),m=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:p&&m,severity:p?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,u,p]of r){if(n[u]?.trim()){t.push({key:`${l}_source`,value:u,target:"environment override or generated key file",ok:true,severity:"info"});continue}let m=join$1(o,p);if(!existsSync$1(m)){t.push({key:`${l}_source`,value:"missing",target:m,ok:false,severity:"warning"});continue}try{let f=lstatSync(m),d=is(m),g=readFileSync$1(m,"utf8").trim(),h=f.isFile()&&!f.isSymbolicLink();t.push({key:`${l}_source`,value:{path:m,mode:d,bytes:Buffer.byteLength(g)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&g.length>0&&(process.platform==="win32"||d==="400"),severity:!h||g.length===0?"error":"warning"});}catch(f){t.push({key:`${l}_source`,value:f.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let i=join$1(getDevFlowStateRoot(ae(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-et;for(let u of readFileSync$1(i,"utf8").split(`
|
|
166
|
+
`))if(u.trim())try{let p=JSON.parse(u),m=Ds(p.ts);m===null?c+=1:m>=l&&(a+=1);}catch{c+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:a,target:0,ok:a===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:c,target:0,ok:c===0,severity:"error"}),{name:"Runtime security",status:I(t),metrics:t}}function Ru(e){let t=[],n=zt(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(`
|
|
166
167
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
167
168
|
FROM benchmark_reports
|
|
168
169
|
ORDER BY created_at DESC
|
|
169
170
|
LIMIT 1
|
|
170
|
-
`).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/
|
|
171
|
+
`).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/et).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=no,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 Eu(e,t){let n=[],o=zt(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(`
|
|
171
172
|
SELECT report_json, created_at
|
|
172
173
|
FROM benchmark_reports
|
|
173
174
|
WHERE suite_id = 'retrieval-quality' AND project_root = ?
|
|
174
175
|
ORDER BY created_at DESC
|
|
175
176
|
LIMIT 1
|
|
176
|
-
`).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:
|
|
177
|
-
`))if(R.trim())try{let
|
|
177
|
+
`).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:no},ok:i.qualityStatus==="passed"&&a<=no,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 Pu(e){if(!existsSync$1(e))return {bytes:0,files:0};let t=[e],n=0,o=0;for(;t.length>0;){let r=t.pop(),s=lstatSync(r);if(!s.isSymbolicLink()){if(s.isDirectory()){for(let i of readdirSync(r))t.push(join$1(r,i));continue}s.isFile()&&(n+=s.size,o+=1);}}return {bytes:n,files:o}}function Du(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(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)()-et,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(`
|
|
178
|
+
`))if(R.trim())try{let w=JSON.parse(R),k=Ds(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=zt(e),u=0,p=0,m=null;if(existsSync$1(l)){let y;try{if(y=X(l,e),M(y,"telemetry_events")){let R=y.prepare(`
|
|
178
179
|
SELECT COUNT(*) total,
|
|
179
180
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
180
181
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
181
182
|
FROM telemetry_events
|
|
182
183
|
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
183
|
-
`).get(i);u=Number(R?.total??0),p=Number(R?.failures??0),m=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,p),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:m??"no successful requests",target:"<= 1000",ok:m===null||m<=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(
|
|
184
|
+
`).get(i);u=Number(R?.total??0),p=Number(R?.failures??0),m=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,p),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:m??"no successful requests",target:"<= 1000",ok:m===null||m<=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=Pu(v);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${ss}`,ok:y.bytes<=ss,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 js(e,t){return xu.has(e)&&!(t.tolerateControlSyntax&&ju.has(e))}function bt(e,t={}){if(Buffer.byteLength(e)>xs)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let p=e[u];if(i){r+=p,i=false;continue}if(s==="'"){p==="'"?s=null:r+=p;continue}if(p==="\\"){if(e[u+1]===`
|
|
184
185
|
`){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
|
|
185
186
|
`){u+=2;continue}i=true;continue}if(s==='"'){p==='"'?s=null:((p==="`"||p==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=p);continue}if(p==="'"||p==='"'){s=p;continue}if((p==="`"||p==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=p;continue}let m=e.slice(u,u+2);if(p==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
|
|
186
|
-
`;)u+=1;l();continue}m==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=p==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||p==="}"&&
|
|
187
|
-
`].includes(p)){l();continue}if(/\s/.test(p)){c();continue}r+=p;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let p=u.find(m=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(m));return p!==void 0&&
|
|
187
|
+
`;)u+=1;l();continue}m==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=p==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||p==="}"&&Au.test(`${r}}`);if(["(",")","{","}"].includes(p)&&!f&&!t.tolerateControlSyntax&&(a=true),m==="&&"||m==="||"){l(),u+=1;continue}if([";","|","&",`
|
|
188
|
+
`].includes(p)){l();continue}if(/\s/.test(p)){c();continue}r+=p;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let p=u.find(m=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(m));return p!==void 0&&js(p,t)})&&(a=true),{segments:n,malformed:a}}function Nu(e){return bt(e).segments.flat().join(" ")}function $u(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function As(e,t){return $u(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 Iu(e){let t=e.split(""),n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n!==null){r==="\\"?o+=1:r===n&&(n=null);continue}if(r==="'"||r==='"'||r==="`"){n=r;continue}if(r!=="/"||!["/","*"].includes(e[o+1]??""))continue;let s=e[o+1]==="*";for(t[o]=" ",t[o+1]=" ",o+=2;o<e.length;){if(s&&e[o]==="*"&&e[o+1]==="/"){t[o]=" ",t[o+1]=" ",o+=1;break}if(!s&&e[o]===`
|
|
188
189
|
`){o-=1;break}e[o]!==`
|
|
189
|
-
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function
|
|
190
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Tu(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="#"){for(;n<e.length&&e[n]!==`
|
|
190
191
|
`;)t[n]=" ",n+=1;continue}if(o!=="'"&&o!=='"')continue;let r=o,s=e.slice(n,n+3)===r.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===r.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
|
|
191
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function
|
|
192
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function ye(e,t,n="infer"){let o=t?Nu(e):n==="node"?Iu(e):n==="python"?Tu(e):e;return [...new Set(o.match(Cu)??[])]}function Mu(e){return bt(e).segments.flat()}function ve(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=De(a,i)?a:De(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 Lu(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>xs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function co(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Lu(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Bt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:ve(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=Hu(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:ve(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:ve(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:ve(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Fu(e){let t=[e];extname(e)===""&&t.push(...as.map(n=>`${e}${n}`),...as.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Hu(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 Fu(o)??o}function Wu(e){let t=[],n=false;for(let o=0;o<e.length;){let r=e[o];if(/\s/.test(r)){o+=1;continue}if(r==="/"&&e[o+1]==="/"){for(o+=2;o<e.length&&e[o]!==`
|
|
192
193
|
`;)o+=1;continue}if(r==="/"&&e[o+1]==="*"){let s=e.indexOf("*/",o+2);if(s<0){n=true;break}o=s+2;continue}if(r==="'"||r==='"'){let s=r,i="",a=true;o+=1;let c=false;for(;o<e.length;){let l=e[o];if(l===s){c=true,o+=1;break}if(l==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(l===`
|
|
193
|
-
`||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function
|
|
194
|
+
`||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 Uu(e,t,n,o=true){let r=Wu(t),s=[],i=r.malformed,a=(p,m)=>{if(!p||p.kind!=="string"||!p.valid||p.value.length===0){i=true;return}s.push({value:p.value,cwd:dirname$1(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:m,issuerPath:e});},{tokens:c}=r;for(let p=0;p<c.length;p+=1){let m=c[p],f=c[p-1];if(m.kind!=="identifier")continue;if(m.value==="eval"&&f?.value!=="."&&c[p+1]?.value==="("){i=true;continue}if(m.value==="require"){if(f?.value==="."){c[p-2]?.value==="module"&&c[p+1]?.value==="("&&(i=true);continue}if(c[p+1]?.value==="("){let g=c[p+2];c[p+3]?.value===")"||(i=true),a(g,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(m.value))continue;if(m.value==="import"&&c[p+1]?.value==="("){let g=c[p+2];c[p+3]?.value===")"||(i=true),a(g,"esm");continue}if(m.value==="import"&&c[p+1]?.kind==="string"){a(c[p+1],"esm");continue}if(m.value==="import"&&c[p+1]?.value===".")continue;let d=-1;for(let g=p+1;g<Math.min(c.length,p+32)&&c[g].value!==";";g+=1)if(c[g].value==="from"){d=g;break}d>=0?a(c[d+1],"esm"):m.value==="import"&&(i=true);}let l=[],u=[];for(let p of s){let m=co(p,o);m.reference&&l.push(m.reference),m.inlineContent&&u.push(m.inlineContent),i||=m.malformed;}return {references:l,inlineContents:u,malformed:i}}function qu(e){let t=e.split(""),n=false;for(let o=0;o<e.length;){let r=e[o];if(r==="#"){for(;o<e.length&&e[o]!==`
|
|
194
195
|
`;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,l=e.slice(o,o+3)===c.repeat(3),u=l?3:1,p=o;for(let f=0;f<u;f+=1)t[p+f]=" ";p+=u;let m=false;for(;p<e.length;){if(e[p]==="\\"){t[p]=" ",p+1<e.length&&(t[p+1]=" "),p+=2;continue}if(e.slice(p,p+u)===c.repeat(u)){for(let f=0;f<u;f+=1)t[p+f]=" ";p+=u,m=true;break}if(!l&&(e[p]===`
|
|
195
196
|
`||e[p]==="\r"))break;e[p]!==`
|
|
196
|
-
`&&e[p]!=="\r"&&(t[p]=" "),p+=1;}if(a){let f=e.slice(o+u,p-u);for(let d=0;d<f.length;d+=1)if(f[d]==="{"){if(f[d+1]==="{"){d+=1;continue}n=true;break}}n||=!m,o=p;}return {content:t.join(""),malformed:n}}function zr(e,t){let n=t.split(".");if(n.length>to)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 pu(e,t,n){let o=mu(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=p=>{let m=dirname$1(e);for(let f=1;f<p;f+=1)m=dirname$1(m);return m},a=p=>{let m=ye(p,{...n,cwd:dirname$1(e)},true,"python");m?r.push(m):s=true;},c=(p,m=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(p))return s=true,null;let f=i(m),d=zr(f,p);s||=!d.resolved;for(let h of d.paths)a(h);let g=d.paths.at(-1);return g&&basename(g)==="__init__.py"?dirname$1(g):null},l=p=>{let m=[];for(let f of p.split(",")){let d=f.trim().split(/\s+as\s+/)[0];if(d==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(d)){s=true;continue}m.push(d);}return m},u=(p,m)=>{for(let f of l(m))p&&zr(p,f).resolved&&(s=true);};for(let p of o.content.split(/\r?\n/))for(let m of p.split(/[;:]/)){let f=m.trim();if(f.startsWith("import ")){let k=f.slice(7).split(",");for(let w of k)c(w.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 k=c(h,g);u(k,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 k of l(d[3]))c(k,g);}return {references:[...new Map(r.map(p=>[p.path,p])).values()],inlineContents:[],malformed:s}}function ks(e,t,n,o,r=true){return n==="node"?gu(e,t,o,r):n==="python"?pu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Gr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=qt(e,0,r),i=new Set((s.artifacts??[]).map(m=>m.value)),a=s.tokens.filter(m=>!i.has(m)).map(m=>ye(m,r)).filter(m=>m!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let m of s.artifacts??[]){if(m.nodeResolutionKind){let d=no(m);d.reference&&c.push(d.reference),d.inlineContent&&l.push(d.inlineContent),u||=d.malformed;continue}let f=ye(m.value,{...r,cwd:m.cwd},true,m.parserKind);f?c.push(f):u=true;}let p=[...a,...c];return {references:[...new Map(p.map(m=>[`${m.path}:${m.parserKind}`,m])).values()],inlineContents:l,malformed:u}}function ws(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Fe(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Wt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function ku(e,t,n){let o=[],r=[],s=false,i=(u,p)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:p}),s||=Fe(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(vu.has(u))return a();if(yu.has(u)){l=true,c+=1;continue}let p=Yr.has(u)?"cjs":Zr.has(u)?"esm":null;if(p){let h=e[c+1];if(!h)return a(true);i(h,p),c+=2;continue}let m=pt(u,Yr),f=pt(u,Zr),d=m??f;if(d!==null){if(!d)return a(true);i(d,m!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Qr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Wt(h))}let g=pt(u,Qr);if(g!==null)return a(s||Wt(g));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Wt(u.slice(2)));if(Xr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,Xr)!==null){c+=1;continue}if(hu.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function _u(e,t,n,o,r){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Fe(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?qt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(wu.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Fe(i)}}return {tokens:[],malformed:true}}function Ru(e,t,n){let o=t;for(;o<e.length;){let r=e[o];if(r==="--"){let s=e[o+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Fe(s)}:{tokens:[],malformed:true}}if(!r.startsWith("-"))return {tokens:[r],artifacts:[{value:r,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Fe(r)};if(Su.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(es.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,es)!==null){o+=1;continue}if(bu.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function qn(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 Cu(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(ws(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=kt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?qn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=qn(a.slice(8),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(a.startsWith("-C")&&a.length>2){let c=qn(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function qt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>fs)return {tokens:[],malformed:true};let r=kt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=bs(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 bs(e,t,n,o){let r=0;for(;ws(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Eu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>fs)return {tokens:i,malformed:true};let g=Cu(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=bs(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)&&ys(l,o),p=c&&!Pu.has(l);if(u||p)return {tokens:i,malformed:true};let m=Fe(s);i.push(s);let f=l;if(!fu.has(f))return {tokens:i,malformed:m};let d=["node","tsx"].includes(f)?ku(e,r+1,n):["bash","sh","zsh"].includes(f)?_u(e,r+1,a,n,o):Ru(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:m||d.malformed}}function Ss(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 Du(e,t){let n=new Map;for(let o of t)for(let r of au(o)){let s=Ss(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 xu(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Ou(e){return e.slice(e.lastIndexOf("@")+1)}function ts(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 ju(e,t,n){let o=Ou(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"?ts(i.path):null}}try{let i=W(He(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?ts(c.path):null}}}catch{}return {configured:false,root:null}}function ns(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 Au(e,t){let n=W(e.entry),o=W(t.entry),r=ns(n),s=ns(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Bt(n.version):null,a=typeof o?.version=="string"?Bt(o.version):null;if(i&&a){let c=_s(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Nu(e,t){try{let n=W(He(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=W(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort(Au)[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 Bt(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function _s(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 $u(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=W(He(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Bt(a.version),u=Bt(c.version);if(l&&u){let p=_s(u,l);if(p!==0)return p}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Ce(i[0].path):null}function Iu(e,t){if(t.legacyArtifactRoots!==void 0){let k=t.legacyArtifactRoots.map(w=>Ce(w)).filter(w=>w!==null).map(w=>({root:w,inspectPluginConfig:true}));return {targets:k,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:k.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),o=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),r=t.knownMarketplacesPath??join$1(t.homePath??homedir$1(),".claude","plugins","known_marketplaces.json"),s=t.pluginCachePath??join$1(t.homePath??homedir$1(),".claude","plugins","cache"),i=[],a=[],c=[],l=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let k of l)if(existsSync$1(k))try{let w=W(He(k));if(!w)throw new Error("settings must be an object");i.push({path:k,settings:w});}catch{a.push(k);}if(i.reduce((k,w)=>typeof w.settings.disableAllHooks=="boolean"?w.settings.disableAllHooks:k,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let p=i.map(k=>{let w=[];return yt(k.settings.hooks,w),{path:k.path,commands:w}}),m=p.flatMap(k=>k.commands),f=p.flatMap(k=>Du(k.path,k.commands)),g=[...i.reduce((k,w)=>{let _=w.settings.enabledPlugins;if(typeof _!="object"||_===null)return k;for(let[T,J]of Object.entries(_))xu(T)&&typeof J=="boolean"&&k.set(T,J);return k},new Map)].filter(([,k])=>k).map(([k])=>k).sort(),h=[...f],v=false;for(let k of g){let w=Nu(k,o);w.malformed&&c.push(o);let _=w.root;if(!w.configured){let T=i.map(Y=>ju(k,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=$u(k,s);}_?h.push({root:_,inspectPluginConfig:true}):v=true;}let y=[...h.reduce((k,w)=>{let _=k.get(w.root);return _?(k.set(w.root,{root:w.root,configPath:_.configPath??w.configPath,commands:[...new Set([..._.commands??[],...w.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||w.inspectPluginConfig)}),k):(k.set(w.root,w),k)},new Map).values()],R=[m.length>0?"settings-hooks":null,g.length>0?"enabled-plugin":null].filter(k=>k!==null);return {targets:y,configCommands:p.filter(k=>k.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||m.length>0)&&!v&&a.length===0&&c.length===0}}function Tu(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 yt(e,t){if(Array.isArray(e)){for(let n of e)yt(n,t);return}if(!(typeof e!="object"||e===null))for(let[n,o]of Object.entries(e))n==="command"&&typeof o=="string"?t.push(o):yt(o,t);}function Bn(e){return [...e.matchAll(Xl)].map(t=>t[1])}function Mu(e){let t=new Map,n=kt(e,{tolerateControlSyntax:true});for(let o of n.segments.flat()){let r=o.match(/^([A-Za-z_][A-Za-z0-9_]*)=(\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/[A-Za-z0-9._/-]+)$/);r&&t.set(r[1],r[2]);}return t.size===0?e:e.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,(o,r,s)=>t.get(r??s??"")??o)}function Lu(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 Fu(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function Kn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Pe(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Zn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ht)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>Ht)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ht+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>Ht)return {kind:"unsafe",reason:"oversized"};let i=r.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Qn(e,t){return `${e} (${t})`}function Hu(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>to){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),p=resolve(c.containmentRoot),m;try{m=realpathSync.native(p);}catch{m=p;}if(!existsSync$1(u)){Pe(p,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Pe(m,f)){o.escapedArtifacts.push(u);return}let d=`${f}:${c.parserKind}:${c.cwd}`;s.has(d)||(s.add(d),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Gr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let p of he(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:p});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=ps){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Zn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Qn(l,u.reason));continue}let{content:p}=u;o.inspected.push(l);let m=c.parserKind==="infer"?vs(l,p):c.parserKind,f=m==="shell";for(let d of he(p,f,m))o.findings.push({artifact:l,endpoint:d});if(f){let d=Gr(p,e,t,c.cwd);d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of he(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}else if(m==="node"||m==="python"){let d=ks(l,p,m,{project:e,homePath:t,cwd:dirname$1(l)});d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of he(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}}}function Wu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Tu(r),c=0,l=(f,d=false,g=r,h="infer",v=e,y=0)=>{if(y>to){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(g),k=resolve(f);if(!existsSync$1(k)){if(!Pe(R,k)){o.escapedArtifacts.push(k);return}d&&o.missing.push(k);return}let w;try{w=realpathSync.native(k);}catch{d&&o.missing.push(k);return}if(!Pe(R,w)){o.escapedArtifacts.push(k);return}let _=`${w}:${h}:${v}`;i.has(_)||(i.add(_),s.push({path:w,parserKind:h,cwd:v,depth:y}));},u=(f,d,g,h=0)=>{for(let v of Bn(f)){let y=Kn(r,v);if(!y)continue;let R=(d.artifacts??[]).find(k=>k.value.includes("PLUGIN_ROOT")&&k.value.endsWith(v));l(y,true,r,R?.parserKind??"infer",R?.cwd??g,h);}},p=(f,d,g=0,h=false)=>{for(let v of f.artifacts??[]){if(v.value.includes("PLUGIN_ROOT"))continue;let y=v.nodeResolutionKind?no(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);}},m=f=>{for(let g of he(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:g});let d=qt(f,0,{project:e,homePath:t,cwd:e});d.malformed&&o.malformedCommands.push(f),u(f,d,e),p(d,e);for(let g of d.tokens){if(!isAbsolute(g))continue;let h=Ss(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)m(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),d=join$1(r,"hooks.json"),g=existsSync$1(d)?d:f;if(!existsSync$1(g))o.missing.push(g),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(g);let h;try{h=realpathSync.native(g);}catch{o.missing.push(g),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(g),l(join$1(r,"hooks","session-start")),h=""),h){let v=Zn(h);if(v.kind==="unsafe")o.unsafeArtifacts.push(Qn(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=[];yt(y,R);for(let k of R)m(k);}catch{o.malformedConfigs.push(g),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=ps){o.traversalLimitRoots.push(r);break}let f=s.shift(),d=f.path;c+=1;let g=Zn(d);if(g.kind==="missing"){o.missing.push(d);continue}if(g.kind==="unsafe"){o.unsafeArtifacts.push(Qn(d,g.reason));continue}let{content:h}=g;o.inspected.push(d);let v=f.parserKind==="infer"?vs(d,h):f.parserKind,y=v==="shell";for(let w of he(h,y,v))o.findings.push({artifact:d,endpoint:w});if(y){let w=Mu(h),_=qt(w,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});Lu(h)&&o.malformedCommands.push(d),u(w,_,dirname$1(d),f.depth+1),p(_,dirname$1(d),f.depth+1,true);}else if(v==="node"||v==="python"){let w=ks(d,h,v,{project:e,homePath:t,cwd:dirname$1(d)},false);(v==="node"?Fu(d):w.malformed)&&o.malformedCommands.push(d);for(let _ of w.inlineContents)for(let T of he(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of w.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of Bn(h)){let T=Kn(r,_);T&&l(T,true,r,v,f.cwd,f.depth+1);}}else for(let w of Bn(h)){let _=Kn(r,w);_&&l(_,true,r,v,f.cwd,f.depth+1);}let R=d.startsWith(`${r}/`)?d.slice(r.length+1):"",k=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${k}.ts`),false,a),R.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${k}.js`));}}function Uu(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=W(He(t)),r=W(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=W(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=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 os(e){try{let t=W(He(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function qu(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Uu(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let p=existsSync$1(l)?l:u;try{let y=W(He(p)),R=W(y?.hooks),k=[];yt(R?.SessionStart,k),k.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let m=os(i),f=os(a),d=o.get(s)??[],g={root:s,packageVersion:m,manifestVersion:f,registryVersions:d};n.versionRecords.push(g),(!m||!f||m!==f||d.some(y=>y!==m))&&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 Bu(e,t){let n=Iu(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let O of n.configCommands){o.configsInspected.push(O.path);for(let B of O.commands){o.commandsInspected.push({configPath:O.path,command:B});for(let x of he(B,true))o.findings.push({artifact:O.path,endpoint:x});}}Hu(e,t.homePath??homedir$1(),n.configCommands.flatMap(O=>O.commands).filter(O=>!n.targets.some(B=>B.commands?.includes(O))),o);for(let O of n.targets)Wu(e,t.homePath??homedir$1(),O,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((O,B,x)=>x.findIndex(A=>A.configPath===O.configPath&&A.command===O.command)===B),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],p=[...new Set(o.traversalLimitRoots)],m=[...new Set(o.escapedArtifacts)],f=o.findings.filter((O,B,x)=>x.findIndex(A=>A.artifact===O.artifact&&A.endpoint===O.endpoint)===B),d=a.length>0||m.length>0||u.length>0,g=d&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=qu(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(O=>O.root).find(O=>existsSync$1(join$1(O,"skills")))??null,k=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:R?{root:R,version:null}:Oe(y,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,_=w?ot(y,w):[],T=_.filter(O=>!O.isKnownDevFlowArtifact).map(O=>({skillName:O.skillName,path:O.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{key:"active_plugin_resolution",value:g,target:"resolved active DevFlow hook configuration",ok:n.ok&&!d,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(O=>O.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:p,target:[],ok:p.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:m.length,target:0,ok:m.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],Y=k.version??h.versionRecords.find(O=>O.root===w)?.packageVersion;return Y&&J.push({key:"active_plugin_version",value:Y,ok:true,severity:"info"}),{name:"Legacy paths",status:I(J),metrics:J}}function Ku(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 Jt(e){let t=Ku(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)/Qe: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 Ju(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=Q(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:q(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:I(n),metrics:n}}function Vu(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*Qe,i=r.prepare(`
|
|
197
|
+
`&&e[p]!=="\r"&&(t[p]=" "),p+=1;}if(a){let f=e.slice(o+u,p-u);for(let d=0;d<f.length;d+=1)if(f[d]==="{"){if(f[d+1]==="{"){d+=1;continue}n=true;break}}n||=!m,o=p;}return {content:t.join(""),malformed:n}}function cs(e,t){let n=t.split(".");if(n.length>ao)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 Bu(e,t,n){let o=qu(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=p=>{let m=dirname$1(e);for(let f=1;f<p;f+=1)m=dirname$1(m);return m},a=p=>{let m=ve(p,{...n,cwd:dirname$1(e)},true,"python");m?r.push(m):s=true;},c=(p,m=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(p))return s=true,null;let f=i(m),d=cs(f,p);s||=!d.resolved;for(let h of d.paths)a(h);let g=d.paths.at(-1);return g&&basename(g)==="__init__.py"?dirname$1(g):null},l=p=>{let m=[];for(let f of p.split(",")){let d=f.trim().split(/\s+as\s+/)[0];if(d==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(d)){s=true;continue}m.push(d);}return m},u=(p,m)=>{for(let f of l(m))p&&cs(p,f).resolved&&(s=true);};for(let p of o.content.split(/\r?\n/))for(let m of p.split(/[;:]/)){let f=m.trim();if(f.startsWith("import ")){let w=f.slice(7).split(",");for(let 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(p=>[p.path,p])).values()],inlineContents:[],malformed:s}}function Ns(e,t,n,o,r=true){return n==="node"?Uu(e,t,o,r):n==="python"?Bu(e,t,o):{references:[],inlineContents:[],malformed:false}}function ls(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Jt(e,0,r),i=new Set((s.artifacts??[]).map(m=>m.value)),a=s.tokens.filter(m=>!i.has(m)).map(m=>ve(m,r)).filter(m=>m!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let m of s.artifacts??[]){if(m.nodeResolutionKind){let d=co(m);d.reference&&c.push(d.reference),d.inlineContent&&l.push(d.inlineContent),u||=d.malformed;continue}let f=ve(m.value,{...r,cwd:m.cwd},true,m.parserKind);f?c.push(f):u=true;}let p=[...a,...c];return {references:[...new Map(p.map(m=>[`${m.path}:${m.parserKind}`,m])).values()],inlineContents:l,malformed:u}}function $s(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 Bt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function ht(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Gu(e,t,n){let o=[],r=[],s=false,i=(u,p)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:p}),s||=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(zu.has(u))return a();if(Vu.has(u)){l=true,c+=1;continue}let p=us.has(u)?"cjs":ds.has(u)?"esm":null;if(p){let h=e[c+1];if(!h)return a(true);i(h,p),c+=2;continue}let m=ht(u,us),f=ht(u,ds),d=m??f;if(d!==null){if(!d)return a(true);i(d,m!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(gs.has(u)){let h=e[c+1];return a(h===void 0?true:s||Bt(h))}let g=ht(u,gs);if(g!==null)return a(s||Bt(g));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Bt(u.slice(2)));if(ms.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(ht(u,ms)!==null){c+=1;continue}if(Ju.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Xu(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?Jt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Yu.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 ed(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(Qu.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(ps.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(ht(r,ps)!==null){o+=1;continue}if(Zu.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Gn(e,t){let n=ve(e,t,true);if(!n)return null;let o=Ce(n.path),r=Ce(t.project);return !o||!r||!De(r,o)?null:o}function od(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($s(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=bt(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?Gn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Gn(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=Gn(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function Jt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Os)return {tokens:[],malformed:true};let r=bt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Is(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 Is(e,t,n,o){let r=0;for(;$s(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;td.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Os)return {tokens:i,malformed:true};let g=od(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=Is(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)&&js(l,o),p=c&&!nd.has(l);if(u||p)return {tokens:i,malformed:true};let m=He(s);i.push(s);let f=l;if(!Ku.has(f))return {tokens:i,malformed:m};let d=["node","tsx"].includes(f)?Gu(e,r+1,n):["bash","sh","zsh"].includes(f)?Xu(e,r+1,a,n,o):ed(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:m||d.malformed}}function Ts(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 Mu(o)){let s=Ts(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 sd(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function id(e){return e.slice(e.lastIndexOf("@")+1)}function fs(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 ad(e,t,n){let o=id(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"?fs(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"?fs(c.path):null}}}catch{}return {configured:false,root:null}}function hs(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 cd(e,t){let n=W(e.entry),o=W(t.entry),r=hs(n),s=hs(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Vt(n.version):null,a=typeof o?.version=="string"?Vt(o.version):null;if(i&&a){let c=Ms(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function ld(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(cd)[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 Vt(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 Ms(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 ud(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=W(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=Vt(a.version),u=Vt(c.version);if(l&&u){let p=Ms(u,l);if(p!==0)return p}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Ce(i[0].path):null}function dd(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 p=i.map(w=>{let k=[];return wt(w.settings.hooks,k),{path:w.path,commands:k}}),m=p.flatMap(w=>w.commands),f=p.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(_))sd(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=ld(w,o);k.malformed&&c.push(o);let _=k.root;if(!k.configured){let T=i.map(Y=>ad(w,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=ud(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=[m.length>0?"settings-hooks":null,g.length>0?"enabled-plugin":null].filter(w=>w!==null);return {targets:y,configCommands:p.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||m.length>0)&&!v&&a.length===0&&c.length===0}}function gd(e){let t=e;for(;;){let n=join$1(t,"package.json");if(existsSync$1(n))try{if(JSON.parse(readFileSync$1(n,"utf8")).workspaces)return t}catch{}let o=dirname$1(t);if(o===t)return;t=o;}}function wt(e,t){if(Array.isArray(e)){for(let n of e)wt(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):wt(o,t);}function Yn(e){return [...e.matchAll(Ou)].map(t=>t[1])}function md(e){let t=new Map,n=bt(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 pd(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 fd(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 Zn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function De(e,t){return t===e||t.startsWith(`${e}${sep}`)}function oo(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>qt)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>qt)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,qt+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>qt)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 ro(e,t){return `${e} (${t})`}function hd(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>ao){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),p=resolve(c.containmentRoot),m;try{m=realpathSync.native(p);}catch{m=p;}if(!existsSync$1(u)){De(p,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!De(m,f)){o.escapedArtifacts.push(u);return}let d=`${f}:${c.parserKind}:${c.cwd}`;s.has(d)||(s.add(d),r.push({...c,path:f,depth:l}));};for(let c of n){let l=ls(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let p of ye(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:p});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Cs){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=oo(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(ro(l,u.reason));continue}let{content:p}=u;o.inspected.push(l);let m=c.parserKind==="infer"?As(l,p):c.parserKind,f=m==="shell";for(let d of ye(p,f,m))o.findings.push({artifact:l,endpoint:d});if(f){let d=ls(p,e,t,c.cwd);d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of ye(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}else if(m==="node"||m==="python"){let d=Ns(l,p,m,{project:e,homePath:t,cwd:dirname$1(l)});d.malformed&&o.malformedCommands.push(l);for(let g of d.inlineContents)for(let h of ye(g.content,false,"node"))o.findings.push({artifact:g.source,endpoint:h});for(let g of d.references)a(g,c.depth+1);}}}function yd(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=gd(r),c=0,l=(f,d=false,g=r,h="infer",v=e,y=0)=>{if(y>ao){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(g),w=resolve(f);if(!existsSync$1(w)){if(!De(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(!De(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 Yn(f)){let y=Zn(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);}},p=(f,d,g=0,h=false)=>{for(let v of f.artifacts??[]){if(v.value.includes("PLUGIN_ROOT"))continue;let y=v.nodeResolutionKind?co(v,!h):{reference:ve(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 ye(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);}},m=f=>{for(let g of ye(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:g});let d=Jt(f,0,{project:e,homePath:t,cwd:e});d.malformed&&o.malformedCommands.push(f),u(f,d,e),p(d,e);for(let g of d.tokens){if(!isAbsolute(g))continue;let h=Ts(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)m(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),d=join$1(r,"hooks.json"),g=existsSync$1(d)?d:f;if(!existsSync$1(g))o.missing.push(g),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(g);let h;try{h=realpathSync.native(g);}catch{o.missing.push(g),l(join$1(r,"hooks","session-start")),h="";}if(h&&!De(r,h)&&(o.escapedArtifacts.push(g),l(join$1(r,"hooks","session-start")),h=""),h){let v=oo(h);if(v.kind==="unsafe")o.unsafeArtifacts.push(ro(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=[];wt(y,R);for(let w of R)m(w);}catch{o.malformedConfigs.push(g),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Cs){o.traversalLimitRoots.push(r);break}let f=s.shift(),d=f.path;c+=1;let g=oo(d);if(g.kind==="missing"){o.missing.push(d);continue}if(g.kind==="unsafe"){o.unsafeArtifacts.push(ro(d,g.reason));continue}let{content:h}=g;o.inspected.push(d);let v=f.parserKind==="infer"?As(d,h):f.parserKind,y=v==="shell";for(let k of ye(h,y,v))o.findings.push({artifact:d,endpoint:k});if(y){let k=md(h),_=Jt(k,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});pd(h)&&o.malformedCommands.push(d),u(k,_,dirname$1(d),f.depth+1),p(_,dirname$1(d),f.depth+1,true);}else if(v==="node"||v==="python"){let k=Ns(d,h,v,{project:e,homePath:t,cwd:dirname$1(d)},false);(v==="node"?fd(d):k.malformed)&&o.malformedCommands.push(d);for(let _ of k.inlineContents)for(let T of ye(_.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 Yn(h)){let T=Zn(r,_);T&&l(T,true,r,v,f.cwd,f.depth+1);}}else for(let k of Yn(h)){let _=Zn(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 vd(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 ys(e){try{let t=W(We(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function wd(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=vd(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let p=existsSync$1(l)?l:u;try{let y=W(We(p)),R=W(y?.hooks),w=[];wt(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 m=ys(i),f=ys(a),d=o.get(s)??[],g={root:s,packageVersion:m,manifestVersion:f,registryVersions:d};n.versionRecords.push(g),(!m||!f||m!==f||d.some(y=>y!==m))&&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 kd(e,t){let n=dd(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 ye(B,true))o.findings.push({artifact:x.path,endpoint:O});}}hd(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)yd(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)],p=[...new Set(o.traversalLimitRoots)],m=[...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||m.length>0||u.length>0,g=d&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=wd(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}:je(y,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),k=w.root,_=k?st(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:p,target:[],ok:p.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:m.length,target:0,ok:m.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value: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 bd(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 Gt(e){let t=bd(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/et:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function Sd(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 _d(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*et,i=r.prepare(`
|
|
197
198
|
SELECT source, COUNT(*) count FROM memories
|
|
198
199
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
199
200
|
`).all(s),a=r.prepare(`
|
|
@@ -205,20 +206,20 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Mr={};j
|
|
|
205
206
|
SELECT access_type, COUNT(*) count
|
|
206
207
|
FROM retrieval_access_log
|
|
207
208
|
GROUP BY access_type
|
|
208
|
-
`).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected, consumed, verified, and outcome stages remain distinct",ok:!0,severity:"info"});}if(M(r,"observations"))if(!
|
|
209
|
+
`).all();n.push({key:"memory_retrieval_attribution",value:Object.fromEntries(c.map(l=>[l.access_type,Number(l.count)])),target:"selected, consumed, verified, and outcome stages remain distinct",ok:!0,severity:"info"});}if(M(r,"observations"))if(!he(r,"observations").has("evidence_status"))n.push({key:"explicit_memory_evidence_schema",value:"evidence_status missing",target:"memory schema v8+",ok:!1,severity:"error"});else {let l=r.prepare(`
|
|
209
210
|
SELECT
|
|
210
211
|
COUNT(*) total,
|
|
211
212
|
SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
|
|
212
213
|
FROM observations
|
|
213
214
|
WHERE source = 'explicit_intent' AND quality_status = 'accepted'
|
|
214
|
-
`).get(),u=Number(l?.total??0),p=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?p/u:1,target:1,ok:u===0||p===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:I(n),metrics:n}}function
|
|
215
|
+
`).get(),u=Number(l?.total??0),p=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?p/u:1,target:1,ok:u===0||p===u,severity:"warning"});}n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:I(n),metrics:n}}function Rd(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=he(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(m=>Number(m.length)),c=Math.max(0,Math.ceil(a.length*.95)-1),l=a.length===0?0:a[c];n.push({key:"knowledge_chunk_length_p95",value:l,target:"<= 3000 tokens",ok:l<=3e3,severity:"error"});let u=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),p=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:p?"trigram":"missing/non-trigram",target:"trigram",ok:p,severity:"warning"}),M(r,"knowledge_source_readiness")){let m=r.prepare(`
|
|
215
216
|
SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
|
|
216
217
|
FROM knowledge_source_readiness ORDER BY source
|
|
217
|
-
`).all(),f=m.filter(g=>Number(g.documents??0)>0||Number(g.chunks??0)>0),d=f.length>0?Math.min(...f.map(g=>Number(g.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:m,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(g=>g.status==="ready"&&Number(g.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:d,target:">= 0.95",ok:f.length>0&&d>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:I(n),metrics:n}}function
|
|
218
|
-
`)}async function
|
|
219
|
-
`)}var
|
|
218
|
+
`).all(),f=m.filter(g=>Number(g.documents??0)>0||Number(g.chunks??0)>0),d=f.length>0?Math.min(...f.map(g=>Number(g.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:m,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(g=>g.status==="ready"&&Number(g.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:d,target:">= 0.95",ok:f.length>0&&d>=.95,severity:"error"});}}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:I(n),metrics:n}}function Ed(e){let{manifest:t,metrics:n}=Gt(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 Pd(e){let{manifest:t,metrics:n}=Gt(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 Dd(e){let{manifest:t,metrics:n}=Gt(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 Cd(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 Od(e){let{manifest:t,metrics:n}=Gt(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??Cd)(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 lo(e={},t={}){let n=e.project??process.cwd(),o=Xn(n),r=Ed(t),s=await uu(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[gu(n,t),vu(o.path,t),kd(o.path,t),await bu(o.path,t),Su(o.path,!!e.strict,t),Sd(o.path,t),_d(o.path,t),Rd(o.path,t),r,Pd(t),Ru(t),Eu(o.path,t),Dd(t),_u(t),await Od(t),Du(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 xd(e,t={}){return e===void 0?Fs():lo(e,t)}function vs(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Ls(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: ${vs(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${vs(s.value)}${i}`);}}return t.join(`
|
|
219
|
+
`)}async function jd(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await lo(e,n);return t.stdout(e.json?JSON.stringify(o):Ls(o)),o.exitCode}async function Yt(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function Fs(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Yt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,p=0;try{let h=await o.getAll();u=!!h?.project,p=Object.keys(h?.user??{}).length;}catch{}let m=0;try{m=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let d=await tt(),g=0;return a.fileCount>0&&(g+=25),a.nodeCount>0&&(g+=15),c.nodes.length>0&&(g+=20),u&&(g+=15),m>0&&(g+=10),l>0&&(g+=5),d.running&&(g+=10),f.total>0&&(g+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:p},knowledge:{sources:m},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:d.running},toolCalls:f,readyScore:g}}async function Ad(){let{data:e}=await Yt(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 Nd(){let{data:e}=await Yt(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 $d(e){let{data:t}=await Yt(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 Id(){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 Ut,mu,eo,yu,et,no,ss,Cu,Ou,Cs,qt,ao,Os,xs,xu,ju,Au,as,Ku,us,ds,gs,ms,Ju,Vu,zu,Yu,Zu,ps,Qu,td,nd,Ws=C(()=>{Ke();se();qn();mu={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},eo=3600*1e3;yu=new Set(["pending","committed","expired"]);et=1440*60*1e3,no=30*et,ss=60*1024*1024;Cu=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Ou=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Cs=64,qt=1024*1024,ao=8,Os=8,xs=64*1024;xu=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),ju=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Au=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;as=[".cjs",".js",".mjs",".ts",".tsx"];Ku=new Set(["bash","node","python","python3","sh","tsx","zsh"]);us=new Set(["-r","--require"]),ds=new Set(["--experimental-loader","--import","--loader"]),gs=new Set(["-e","--eval","-p","--print"]),ms=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),Ju=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Vu=new Set(["--check","-c"]),zu=new Set(["--help","--version","-h","-v"]);Yu=new Set(["-e","-eu","-o","-u","-ue"]),Zu=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),ps=new Set(["-W","-X","--check-hash-based-pycs"]),Qu=new Set(["--help","--version","-h","-V"]);td=new Set(["builtin","command","env","exec","nohup","timeout"]),nd=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Us={};j(Us,{runMemoryMaintainCommand:()=>Fd});function Ld(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 Fd(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:Ld(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(`
|
|
220
|
+
`)}var qs=C(()=>{});var Bs={};j(Bs,{generateToken:()=>Ud});async function Ud(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 Ks=C(()=>{});var uo={};j(uo,{reportBenchmarkCommand:()=>Vd,runBenchmarkCommand:()=>Jd});async function Jd(e){let t=e.suite??"default",n=getBenchmarkSuite(t);if(!n)throw new Error(`Unknown benchmark suite "${t}"`);let r=await new BenchmarkEngine().runSuite(e.projectRoot,n,{rounds:e.rounds}),s=e.database??openGlobalDevFlowDatabase();try{s.insertBenchmarkReport(r);}finally{e.database||s.close();}let i=renderBenchmarkReport(r,e.output??"text");return e.output==="json"?i:`${i}
|
|
220
221
|
|
|
221
|
-
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function
|
|
222
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Vd(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=zd(o,n);return r==="markdown"?`${s}
|
|
222
223
|
## Change From Prior Baseline
|
|
223
224
|
|
|
224
225
|
${i.map(a=>`- ${a}`).join(`
|
|
@@ -227,19 +228,19 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
227
228
|
|
|
228
229
|
Change from ${o.runId}:
|
|
229
230
|
${i.map(a=>`- ${a}`).join(`
|
|
230
|
-
`)}`}function
|
|
231
|
-
`)}var
|
|
231
|
+
`)}`}function zd(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Zt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Zt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Zt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Zt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Zt(e,t,n,o){let r=t>0?(n-t)/t:0,s=o?r<-0.1:r>.1,i=r>0?"+":"";return `${e}: ${i}${(r*100).toFixed(1)}%${s?" (regression >10%)":""}`}var go=C(()=>{});var po={};j(po,{reportEvaluationCommand:()=>ng,runEvaluationCommand:()=>tg});async function tg(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=og(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:${Qt(JSON.stringify(c)).slice(0,24)}`},p={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:Qt(c.prompt),toolProfileHash:Qt("benchmark-context-deep:r3.v1"),acceptanceHash:Qt(JSON.stringify(t.tasks.find(m=>m.id===c.taskId))),status:u.status,graderResults:[u],durationMs:c.devflow.durationMs,tokensUsed:c.devflow.tokensUsed,fallbackCount:0,failureCategory:l?void 0:"retrieval_correctness",simulated:!1};r.push({...p,evidenceReceipt:createTrialReceipt(p)});}}let s=aggregateRepeatedTrials({suiteId:t.id,suiteVersion:t.version,projectRoot:e.projectRoot,commit:o,k:e.trials,trials:r});return n.insertBenchmarkReport(s),renderRepeatedTrialReport(s,e.output??"text")}finally{e.database||n.close();}}function ng(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 og(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function Qt(e){return createHash("sha256").update(e).digest("hex")}var fo=C(()=>{});var Zs={};j(Zs,{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(`
|
|
232
|
+
`)}var Qs=C(()=>{});var St={};j(St,{resolveRuntimeLocale:()=>ei,runtimeMessage:()=>ee,runtimeMessages:()=>Xs});function ei(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function ee(e,t={},n){return Xs[ei(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var Xs,Oe=C(()=>{Xs={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 ti={};j(ti,{startAll:()=>sg});async function sg(e){let t=e.projectRoot??process.cwd();console.log(S.blue(ee("starting")));let n=await rn({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=ge().readState();!n.reused&&i?.generation===n.state.generation&&i.ownerToken===n.state.ownerToken&&await ge().stop().catch(()=>{}),o();};process.once("SIGINT",s),process.once("SIGTERM",s);});}var ni=C(()=>{se();Oe();});var ri={};j(ri,{stopAll:()=>ig});async function ig(){let e=await sn();console.log(e?S.green(ee("stopped")):S.dim(ee("notRunning")));}var si=C(()=>{se();Oe();});var ii={};j(ii,{showStatus:()=>gg});function dg(e){if(!existsSync(e))return false;try{let t=new DatabaseSync(e,{readOnly:!0});try{return !!t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' LIMIT 1").get()}finally{t.close();}}catch{return true}}async function gg(e={}){let t=await tt(),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=je(o),s=r.root?st(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 p=(statSync(i).size/1024/1024).toFixed(1);console.log(`Data: ${i} (${p} 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]:[],...dg(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${S.yellow(l.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var ai=C(()=>{se();Ke();Oe();});var ci={};j(ci,{setupCommand:()=>_g});function wg(){try{return jt()}catch{return}}function kg(e){try{return vg.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 bg(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 Sg(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 _g(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=kg(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=wg();if(r.id==="claude-code"&&l)try{let u=bg(l),p=join$1(n.homeDir,".claude","plugins","cache");At(l,p,u),l=join$1(p,"devflow-local","devflow",u);}catch(u){s.push({artifact:"plugin",status:"failed",changed:false,path:l,message:u instanceof Error?u.message:String(u)}),l=void 0;}l?s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:join$1(l,"skills")})):s.some(u=>u.artifact==="plugin"&&u.status==="failed")||s.push({artifact:"plugin",status:"failed",changed:false,message:"Claude plugin files could not be resolved."});}for(let l of s)Sg(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 vg,li=C(()=>{Ke();vg=createRequire$1(import.meta.url);});var ui={};j(ui,{pluginListCommand:()=>Eg});var Eg,di=C(()=>{$t();Eg=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=Yo();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
232
233
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
233
234
|
`),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${S.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
|
|
234
235
|
`);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${S.green(o.name)}${r}v${o.version}`),console.log(` ${" ".repeat(n)}${o.description.substring(0,60)}`),o.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${o.tags.join(", ")}`),console.log("");}),console.log(`
|
|
235
|
-
Install a plugin: devflow plugin install <name>`);}});});var
|
|
236
|
+
Install a plugin: devflow plugin install <name>`);}});});var gi={};j(gi,{pluginSearchCommand:()=>Cg});var Cg,mi=C(()=>{$t();Cg=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Ae(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
|
|
236
237
|
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
237
|
-
`),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var
|
|
238
|
+
`),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 fi={};j(fi,{pluginInstallCommand:()=>xg});var xg,hi=C(()=>{Re();xg=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 Ne(n,process.cwd(),!0);console.log(`
|
|
238
239
|
${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
|
|
239
240
|
Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
|
|
240
|
-
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var
|
|
241
|
+
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var vi={};j(vi,{pluginUninstallCommand:()=>Ag});var Ag,wi=C(()=>{Re();Ag=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 fn(n,process.cwd(),!0),console.log(`
|
|
241
242
|
${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
|
|
242
|
-
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function
|
|
243
|
-
`));}let n=en(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Wo(),Ho)),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(()=>(qo(),Uo)),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(),mn));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(pn(),mn));await i(t);}}});E.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(hr(),fr));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var lg=E.command("db").description("Manage DevFlow databases");lg.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(()=>(Pr(),Er)),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=en(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Dr(),Cr));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(()=>(jr(),Or)),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(()=>(Nr(),Ar)),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(()=>(Pn(),En)),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(()=>(Pn(),En)),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 Xt=E.command("workflow").description("Workflow management");Xt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(dt(),ut)),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 St=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");St.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Ye(),Ge));console.log(o({projectRoot:n.project,json:n.json}));});St.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(()=>(Ye(),Ge));console.log(r(e,{projectRoot:o.project,json:o.json}));});St.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Ye(),Ge));console.log(r(e,{projectRoot:o.project,json:o.json}));});St.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(()=>(Ye(),Ge));console.log(r(e,{projectRoot:o.project,json:o.json}));});St.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(()=>(Ye(),Ge));console.log(r(e,{projectRoot:o.project,json:o.json}));});Xt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(dt(),ut)),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`);});Xt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(dt(),ut)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Xt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(dt(),ut)),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 ai=E.command("embeddings").description("Manage the shared verified embedding model");ai.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(()=>(xn(),Dn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});ai.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(()=>(xn(),Dn)),o=Number(e.timeoutMs);if(!Number.isSafeInteger(o)||o<=0)throw new Error("--timeout-ms must be a positive integer");let r=await t({endpoints:e.endpoint,timeoutMs:o});e.json?console.log(JSON.stringify(r,null,2)):(console.log(n(r)),console.log(` source: ${r.source}`),r.attemptedEndpoints.length>0&&console.log(` endpoints: ${r.attemptedEndpoints.join(", ")}`));}catch(t){console.error(S.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var We=E.command("memory").description("Memory management");We.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>($e(),Ne)),n=await t(E.opts().local,e.source);console.log(JSON.stringify(n,null,2));});We.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>($e(),Ne));console.log(JSON.stringify(await t(E.opts().local,e.source),null,2));});We.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>($e(),Ne)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:E.opts().local});console.log(JSON.stringify(o,null,2));});We.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>($e(),Ne));await n(e,t,E.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});We.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>($e(),Ne)),t=await e(E.opts().local);console.log(JSON.stringify(t,null,2));});We.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>($e(),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(()=>(Lr(),Mr)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fo=E.command("docs").description("Documentation index management");fo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
|
|
243
|
+
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function on(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 ki=createRequire(import.meta.url),wo="0.0.0";try{wo=ki("../package.json").version;}catch{try{wo=ki("../../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 Tg=await Promise.resolve().then(()=>(Oo(),Co));E.addCommand(Tg.createDefaultDeliveryCommand());function Mg(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(wo).option("--local","Force local engine, skip server");var Lg=E.command("logs").description("Inspect and clean diagnostic logs");Lg.command("cleanup").description("Clean registered diagnostic logs (dry-run by default)").option("--execute","Apply deletions; default is dry-run").option("--older-than <days>","Override retention days").option("--max-bytes <bytes>","Override project and global log budgets").option("--json","Print JSON result").action(async e=>{let{renderLogCleanupResult:t,runLogsCleanupCommand:n}=await Promise.resolve().then(()=>(No(),Ao)),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=ko.join(t,a);tn.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),tn.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
|
|
244
|
+
`));}let n=on(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Vo(),Jo)),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(()=>(Go(),zo)),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(()=>(yn(),hn));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(yn(),hn));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(()=>(Sr(),br));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(()=>(xr(),Or)),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 Fg=E.command("db").description("Manage DevFlow databases");Fg.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(()=>(Hr(),Fr)),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=on(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Ur(),Wr));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(()=>(Kr(),Br)),o=e.backfillVectors?await n(E.opts().local):await t(E.opts().local);console.log(S.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(S.dim(" (watch mode not yet implemented)"));});E.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(Vr(),Jr)),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(()=>(An(),jn)),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(()=>(An(),jn)),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 nn=E.command("workflow").description("Workflow management");nn.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(mt(),gt)),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 Rt=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");Rt.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(o({projectRoot:n.project,json:n.json}));});Rt.command("show <id>").description("Show worker lifecycle and merge evidence").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{showWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});Rt.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});Rt.command("retry-cleanup <id>").description("Retry conservative cleanup for a terminal or held worker").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{retryWorkerCleanup:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});Rt.command("merge-status <id>").description("Show the worker merge gate state").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{workerMergeStatus:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});nn.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(mt(),gt)),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`);});nn.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(mt(),gt)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});nn.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(mt(),gt)),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 bi=E.command("embeddings").description("Manage the shared verified embedding model");bi.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(In(),$n)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});bi.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(In(),$n)),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(()=>(Qr(),Zr)),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 bo=E.command("docs").description("Documentation index management");bo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
|
|
244
245
|
${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${S.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${S.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(S.green(`
|
|
245
|
-
All docs synced.`));}});fo.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>(In(),$n)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});fo.command("resync [plugin-name]").description("Rebuild documentation chunks before vector backfill").requiredOption("--with-headings","Use heading-aware 500-3000 character chunks").action(async(e,t)=>{let{resyncKnowledgeDocs:n}=await Promise.resolve().then(()=>(In(),$n));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 _t=E.command("skill").description("Plugin/Skill management");_t.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(_e(),st)),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}`);});_t.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(_e(),st)),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}`);});_t.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(_e(),st)),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);}});_t.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(_e(),st));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);}});_t.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(Mn(),Hr));process.exitCode=t(e);});var ci=E.command("mcp").description("Inspect MCP configuration and health");ci.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(()=>(Fn(),Ln));await t(e);});ci.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(()=>(Fn(),Ln));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(()=>(Cs(),Ps));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});We.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(xs(),Ds));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(()=>(js(),Os)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var li=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");li.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(()=>(so(),ro));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var ui=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");ui.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(co(),ao));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});ui.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(co(),ao));console.log(t({runId:e.run,output:e.json?"json":"text"}));});li.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(()=>(so(),ro));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});E.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(Ls(),Ms)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var ho=E.command("server").description("Manage DevFlow server");ho.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(()=>(re(),et)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),wt));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")));});ho.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(re(),et)),{runtimeMessage:t}=await Promise.resolve().then(()=>(De(),wt)),n=await e();console.log(n?S.green(t("stopped")):S.dim(t("notRunning")));});ho.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(re(),et)),{runtimeMessage:t}=await Promise.resolve().then(()=>(De(),wt)),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(()=>(re(),et)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),wt)),r=po.resolve(e.project);if(!Qt.existsSync(r)||!Qt.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 ag(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(()=>(Us(),Ws));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(()=>(Ks(),Bs));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(()=>(Vs(),Js));await t({json:!!e.json,projectRoot:po.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(()=>(Gs(),zs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Zt=E.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Zs(),Ys)),Promise.resolve().then(()=>(Xs(),Qs)),Promise.resolve().then(()=>(ni(),ti)),Promise.resolve().then(()=>(si(),ri))]);Zt.addCommand(e),Zt.addCommand(t),Zt.addCommand(n),Zt.addCommand(o);}await E.parseAsync();
|
|
246
|
+
All docs synced.`));}});bo.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(()=>(Wn(),Hn)),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`));});bo.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(()=>(Wn(),Hn));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 Et=E.command("skill").description("Plugin/Skill management");Et.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Re(),at)),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}`);});Et.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Re(),at)),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}`);});Et.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Re(),at)),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);}});Et.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Re(),at));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);}});Et.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(),es));process.exitCode=t(e);});var Si=E.command("mcp").description("Inspect MCP configuration and health");Si.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(()=>(Kn(),Bn));await t(e);});Si.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(()=>(Kn(),Bn));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(()=>(Ws(),Hs));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(()=>(qs(),Us));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(()=>(Ks(),Bs)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var _i=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");_i.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(()=>(go(),uo));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var Ri=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");Ri.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(fo(),po));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});Ri.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(fo(),po));console.log(t({runId:e.run,output:e.json?"json":"text"}));});_i.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(()=>(go(),uo));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(()=>(Qs(),Zs)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var So=E.command("server").description("Manage DevFlow server");So.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(),nt)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Oe(),St));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")));});So.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(se(),nt)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Oe(),St)),n=await e();console.log(n?S.green(t("stopped")):S.dim(t("notRunning")));});So.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(se(),nt)),{runtimeMessage:t}=await Promise.resolve().then(()=>(Oe(),St)),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(),nt)),{runtimeMessage:o}=await Promise.resolve().then(()=>(Oe(),St)),r=ko.resolve(e.project);if(!tn.existsSync(r)||!tn.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 Mg(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(()=>(ni(),ti));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(()=>(si(),ri));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(()=>(ai(),ii));await t({json:!!e.json,projectRoot:ko.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(()=>(li(),ci));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var en=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(()=>(di(),ui)),Promise.resolve().then(()=>(mi(),gi)),Promise.resolve().then(()=>(hi(),fi)),Promise.resolve().then(()=>(wi(),vi))]);en.addCommand(e),en.addCommand(t),en.addCommand(n),en.addCommand(o);}await E.parseAsync();
|