@devflow-tools/devflow 0.18.23 → 0.18.25
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 +44 -44
- 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 +6 -6
- package/dist/plugin/dist/runtime-manifest.json +5 -5
- package/dist/plugin/package.json +13 -13
- package/package.json +16 -16
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{3jSVtnGk8vynBhNA8TKy9 → fWRmzzu-QAERRpBpfdMkK}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{3jSVtnGk8vynBhNA8TKy9 → fWRmzzu-QAERRpBpfdMkK}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {createRequire as createRequire$1,isBuiltin}from'node:module';import {join as join$1,resolve,basename,dirname,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 Zt,{existsSync,readFileSync,mkdirSync,writeFileSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import po,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import To 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 Uc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';var mi=Object.defineProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)mi(e,n,{get:t[n],enumerable:true});};var nt={};j(nt,{DEFAULT_SERVER_PORT:()=>wi,ensureCliRuntime:()=>ko,getRuntimeManager:()=>ge,resolveServerLaunch:()=>vo,serverStatus:()=>tt,startServer:()=>en,stopServer:()=>tn});function vo(e=process.cwd()){let t=[()=>ki.resolve("@devflow-tools/server/dist/main.js"),()=>join$1(e,"node_modules","@devflow-tools","server","dist","main.js"),()=>join$1(e,"apps","server","dist","main.js")];for(let n of t)try{return {command:process.env.DEVFLOW_SERVER_NODE??process.execPath,args:[n()],cwd:e}}catch{}throw new Error("DevFlow server entry point is not installed or built")}function ge(){return createRuntimeManager()}async function ko(e){return ge().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:vo(e.projectRoot)})}async function en(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 tn(){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 ki,wi,re=D(()=>{ki=createRequire$1(import.meta.url),wi=13337;});var So={};j(So,{createDefaultDeliveryCommand:()=>Ri,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=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("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 Ri(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:()=>Ci,runLogsCleanupCommand:()=>Pi});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 Pi(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 Ci(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 Co=D(()=>{});function xt(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function xe(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of Mi)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:Do(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,sn);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:Do(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
|
|
4
|
-
`,"utf-8"),a}function Li(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=jo(r);s&&t.set(s.name,r);}return t}function jo(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 rn(e){return createHash("sha256").update(e).digest("hex")}function Do(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 Ao(e){let
|
|
5
|
-
`);}function No(e,t){let n=join$1(e,".claude"),o=join$1(n,"mcp.json"),r={};if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf-8"));}catch{console.warn("Warning: Could not parse existing mcp.json, skipping MCP config");return}else mkdirSync$1(n,{recursive:true});let s=r.mcpServers??{};s.devflow||(s.devflow={command:t,args:[],env:{}},r.mcpServers=s,writeFileSync$1(o,JSON.stringify(r,null,2)));}function Ot(e,t,n){let o=join$1(t,
|
|
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[
|
|
7
|
-
`);}function Hi(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(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[
|
|
8
|
-
`);}function me(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Wi(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
|
|
9
|
-
`)}var Mo,
|
|
10
|
-
`,"utf-8"),renameSync$1(o,n);}async function Ae(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=tr(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(
|
|
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 Zt,{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 {createRequire}from'module';import To 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 qc from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFile,execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';var mi=Object.defineProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>{for(var n in t)mi(e,n,{get:t[n],enumerable:true});};var tt={};j(tt,{DEFAULT_SERVER_PORT:()=>wi,ensureCliRuntime:()=>ko,getRuntimeManager:()=>ge,resolveServerLaunch:()=>vo,serverStatus:()=>et,startServer:()=>en,stopServer:()=>tn});function vo(e=process.cwd()){let t=[()=>ki.resolve("@devflow-tools/server/dist/main.js"),()=>join$1(e,"node_modules","@devflow-tools","server","dist","main.js"),()=>join$1(e,"apps","server","dist","main.js")];for(let n of t)try{return {command:process.env.DEVFLOW_SERVER_NODE??process.execPath,args:[n()],cwd:e}}catch{}throw new Error("DevFlow server entry point is not installed or built")}function ge(){return createRuntimeManager()}async function ko(e){return ge().ensureRunning({reason:e.reason,projectRoot:e.projectRoot,port:e.port,explicitPort:e.explicitPort,noStart:e.noStart,server:vo(e.projectRoot)})}async function en(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 tn(){return (await ge().stop()).stopped}async function et(){let e=await ge().status();return {running:!!(e?.status==="ready"&&e.dashboardAvailable),pid:e?.pid,port:e?.port,state:e}}var ki,wi,re=D(()=>{ki=createRequire$1(import.meta.url),wi=13337;});var So={};j(So,{createDefaultDeliveryCommand:()=>Ri,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=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("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 Ri(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:()=>Ci,runLogsCleanupCommand:()=>Pi});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 Pi(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 Ci(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 Co=D(()=>{});function xt(){let e=dirname$1(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function xe(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of Mi)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:Do(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,sn);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:Do(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 ot(e,t){let n=Li(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=jo(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=rn(c.content),p=readFileSync$1(l,"utf-8"),m=rn(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 Oo(e,t,n,o=Date.now,r={}){let s=ot(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()||rn(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 Li(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=jo(r);s&&t.set(s.name,r);}return t}function jo(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 rn(e){return createHash("sha256").update(e).digest("hex")}function Do(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 Ao(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[Rt]=true,n.enabledPlugins=o,t){let r=me(n.extraKnownMarketplaces)?n.extraKnownMarketplaces:{};r[Ct]={source:{source:"directory",path:t}},n.extraKnownMarketplaces=r;}writeFileSync$1(e,`${JSON.stringify(n,null,2)}
|
|
5
|
+
`);}function No(e,t){let n=join$1(e,".claude"),o=join$1(n,"mcp.json"),r={};if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf-8"));}catch{console.warn("Warning: Could not parse existing mcp.json, skipping MCP config");return}else mkdirSync$1(n,{recursive:true});let s=r.mcpServers??{};s.devflow||(s.devflow={command:t,args:[],env:{}},r.mcpServers=s,writeFileSync$1(o,JSON.stringify(r,null,2)));}function Ot(e,t,n){let o=join$1(t,Ct,sn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Et(r,join$1(o,"hooks"));for(let c of ["CLAUDE.md","package.json"]){let l=join$1(e,c);existsSync$1(l)&&cpSync(l,join$1(o,c),{force:true});}let s=join$1(e,".claude-plugin","plugin.json");existsSync$1(s)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&Et(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Et(a,join$1(o,"skills")),Wi(o,e),Ui(o),Fi(t,o),Hi(t,o,n);}function Fi(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:Ct,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:sn,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[Ct]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
7
|
+
`);}function Hi(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[Rt];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Rt}`);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[Rt]=[...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 Wi(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let o=JSON.parse(readFileSync$1(n,"utf-8")),r=Object.keys(o.dependencies??{});if(r.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=r.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}let l=resolveClaudeHookRuntime();runNpmWithClaudeHookRuntime(l,c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3}),verifyClaudeHookNativeRuntime(e,l),persistClaudeHookRuntime(e,l);}function Et(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?Et(o,r):cpSync(o,r,{force:true});}}function Ui(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 Rt,Ct,sn,Mi,Ke=D(()=>{Rt="devflow@devflow-local",Ct="devflow-local",sn="devflow",Mi=["devflow@devflow-local","devflow@devflow"];});var Wo={};j(Wo,{initProject:()=>Zi,renderInitReport:()=>Ho});async function Zi(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?Qi(r):{},a=Xi(e,i);(!s||t.force||!Fo(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(Mo.isInitialized(e)||await Mo.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,Ho(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=xt(),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";Ot(u,m,d),c.pluginDeployed=!0;let g=join(m,"devflow-local","devflow",d);l=g;try{c.migratedLegacySkills=Oo(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");Ao(p,l?dirname(l):void 0),c.pluginEnabled=!0;}catch(u){console.warn(`Warning: Plugin enablement skipped \u2014 ${u.message}`);}try{let u;try{u=Yi.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{u="devflow-mcp";}No(e,u),c.mcpConfigured=!0;}catch(u){console.warn(`Warning: MCP config skipped \u2014 ${u.message}`);}return c}function Qi(e){try{let t=JSON.parse(readFileSync(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return {}}}function Fo(e){return e.projectId!==void 0||e.memoryNamespace!==void 0}function Xi(e,t){try{return resolveStableProjectIdentity(e)}catch(n){if(Fo(t))throw n;let o=`project:local/${randomUUID()}`;return {projectId:o,memoryNamespace:`memory:${o}`}}}function Ho(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 Mo,Yi,Uo=D(()=>{Ke();Mo=To.default??To,Yi=createRequire(import.meta.url);});var qo={};j(qo,{reviewPluginMemoryHints:()=>oa});async function oa(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(ra).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??sa)(e,l),{available:i.length,selected:l.length}}function ra(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function sa(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 Bo=D(()=>{});function je(){let e=[join(process.cwd(),"plugin-registry.json"),join(da,"../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 Ko(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var ua,da,jt=D(()=>{ua=fileURLToPath$1(import.meta.url),da=dirname(ua);});async function $(e,t,n,o={}){if(o.skipServer)return n();let r=o.serverUrl??process.env.DEVFLOW_SERVER_URL?.trim()??wa();if(!r)return n();let s=Sa(r),i=false,a=Jo.get(r);if(a&&Date.now()-a.ts<ka?i=a.result:acquireRuntimeHttpCircuit(r,"/api/ready").allowed&&(i=await ba(r),i?registerRuntimeHttpSuccess(r,"/api/ready"):registerRuntimeHttpFailure(r,"/api/ready","cli_local_engine_fallback"),Jo.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 wa(){let e=readRuntimeState();return e?.status==="ready"&&e.dashboardAvailable?e.url:void 0}async function ba(e){try{return (await fetch(new URL("/api/ready",e),{signal:AbortSignal.timeout(1500)})).ok}catch{return false}}function Sa(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 Jo,ka,Se=D(()=>{Jo=new Map,ka=3e4;});var zo=D(()=>{});var st={};j(st,{installSkill:()=>Ae,listSkills:()=>er,listSkillsSync:()=>Da,searchSkills:()=>xa,uninstallSkill:()=>gn});async function er(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 Da(){return []}async function xa(e,t){let n=await er(),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 tr(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 nr(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function or(e,t){let n=join(e,".devflow","config.json");mkdirSync(join(e,".devflow"),{recursive:true});let o=`${n}.${process.pid}.${Date.now()}.tmp`;writeFileSync(o,`${JSON.stringify(t,null,2)}
|
|
10
|
+
`,"utf-8"),renameSync$1(o,n);}async function Ae(e,t=process.cwd(),n){return $(t,async o=>await o.installPlugin(e),async()=>{let o=tr(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(rt,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",rt,o],{stdio:"pipe",timeout:6e4});let a=nr(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),or(t,a));let c=[],l="0.0.0",u=join(rt,"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 gn(e,t=process.cwd(),n){return $(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=tr(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=nr(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),or(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",rt,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(rt,"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 rt,_e=D(()=>{Se();zo();rt=getPluginInstallRoot();});var mn={};j(mn,{detectTechStack:()=>ja,guidePluginInstallation:()=>Na,installPluginsFromList:()=>Aa,resolvePluginName:()=>sr});function ja(e){let t=je();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function sr(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Aa(e){let t=e.split(",").map(sr).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Ae(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Na(e){let t=je();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
|
|
@@ -21,18 +21,18 @@ Installing selected plugins...
|
|
|
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 pn=D(()=>{jt();_e();});var hr={};j(hr,{ResetExecutionError:()=>
|
|
24
|
+
`);return i}var pn=D(()=>{jt();_e();});var hr={};j(hr,{ResetExecutionError:()=>it,executeResetCommand:()=>tc,formatResetResult:()=>kn,runReset:()=>fr});function Ja(){if(At)return At;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return At=e.DatabaseSync,At}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function kn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Va(e){return e==="all"||dr.includes(e)}function ie(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function hn(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 wn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function za(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 gr(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(!wn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Ga(e,t){return (e==="all"?dr:[e]).map(o=>({scope:o,path:join$1(t,...ur[o])}))}function mr(e,t){let n=ie(t);if(n)return gr(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function pr(e,t){let n=mr(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 Ya(e){let t=ie(e);if(!t?.isFile()||t.size<fn.length)return false;let n=Buffer.alloc(fn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(fn)}finally{closeSync(o);}}function Za(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}Ya(o)&&t.push(o);}}return n(e),t}function Qa(e,t){mkdirSync$1(dirname$1(t),{recursive:true});let n=new(Ja())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Xa(e,t,n){let o=Za(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));Qa(s,i);}}function ec(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),Xa(c.path,join$1(i,c.scope),()=>pr(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 fr(e,t={}){if(!Va(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=za(e.project??process.cwd()),o=Ga(e.scope,n);for(let c of o)gr(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=mr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?hn(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=hn(l.path),p=join$1(s,l.scope),m=hn(p);if(wn(u,m)||wn(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&&ec(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),pr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new it(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function tc(e,t={},n=console){try{let o=fr(e,t),r=kn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof it)for(let r of kn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var At,it,ur,dr,fn,yr=D(()=>{it=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};ur={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},dr=Object.keys(ur),fn=Buffer.from("SQLite format 3\0","binary");});var Pr={};j(Pr,{consolidateDatabases:()=>sc,formatConsolidateResult:()=>ic});function sc(e){let t=resolve(e.project),n=e.globalDbPath??getGlobalDevFlowDbPath(),o=join$1(t,".devflow","devflow.db"),r=join$1(t,".codegraph","codegraph.db");if(resolve(n)===resolve(o))throw new Error("The global target database cannot be the project-local legacy database");let s=existsSync$1(n),i=[kr("project",o,s?n:void 0),kr("codegraph",r,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(f=>f.exists&&Object.keys(f.tables).length>0),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname$1(n))==="global"?join$1(dirname$1(dirname$1(n)),"backup"):join$1(dirname$1(n),"backup"),p=join$1(e.backupRoot??u,l);mkdirSync$1(p,{recursive:true}),a.backupDir=p;let m=c.some(f=>f.kind==="project")?ac(o):null;try{let f=new Map;for(let v of c){let y=join$1(p,`${v.kind}-${basename(v.path)}.snapshot`);wr(v.path,y),f.set(v.kind,y);}s&&wr(n,join$1(p,"global-devflow.db.before"));let d=f.has("project")?lc(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")&&br(g,"project_source",void 0,a.inserted),f.has("codegraph")){br(g,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let y of lt(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 Er(d),v}finally{g?.close();}return a}finally{cc(m);}}function ic(e){let t=[`${e.dryRun?"Dry run":"Consolidated"} target: ${e.targetPath}`];for(let n of e.sources){let o=Object.values(n.tables).reduce((s,i)=>s+i,0),r=Object.values(n.conflicts).reduce((s,i)=>s+i,0);t.push(`${n.kind}: ${n.exists?`${o} rows, ${r} conflicts`:"not found"} (${n.path})`);}if(!e.dryRun){let n=Object.values(e.inserted).reduce((o,r)=>o+r,0);t.push(`Inserted: ${n} rows`),e.backupDir&&t.push(`Backup: ${e.backupDir}`);}return t}function kr(e,t,n){let o={kind:e,path:t,exists:existsSync$1(t),tables:{},conflicts:{}};if(!o.exists)return o;let r=new DatabaseSync(t,{readOnly:true}),s=n&&existsSync$1(n)?new DatabaseSync(n,{readOnly:true}):null;try{let i=e==="codegraph"?new Set(DEVFLOW_TABLE_NAMES):null;for(let a of lt(r).filter(c=>!i||i.has(c)))o.tables[a]=Rn(r,a),o.conflicts[a]=s&<(s).includes(a)?uc(r,s,a):0;}finally{r.close(),s?.close();}return o}function wr(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 ac(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 cc(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function lc(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 Er(n),o}return n}function Er(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function br(e,t,n,o){let r=new Set(lt(e)),s=lt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=$t(e,"main",i),c=new Set($t(e,t,i).map(d=>d.name)),l=a.filter(d=>c.has(d.name));if(_n.has(i)&&(l=l.filter(d=>d.pk===0)),l.length===0)continue;let u=Rn(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&&!_n.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
25
|
INSERT INTO main.${H(i)} (${p})
|
|
26
26
|
SELECT ${m} FROM ${H(t)}.${H(i)} s
|
|
27
27
|
WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${d})
|
|
28
|
-
`);}o[i]=(o[i]??0)+(Rn(e,i)-u);}}function
|
|
29
|
-
`)}return JSON.stringify(t,null,2)}function
|
|
30
|
-
`)}var xn=D(()=>{});var Ne={};j(Ne,{backfillObservationVectors:()=>
|
|
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 Lr={};j(Lr,{getDocsStatus:()=>Qc,queryKnowledge:()=>Mr,searchKnowledge:()=>Zc,syncDocs:()=>Xc});async function Mr(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 Zc(e,t,n){return (await Mr(e,t,void 0,n)).results}async function Qc(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 Xc(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 Fr=D(()=>{Se();});var $n={};j($n,{backfillKnowledgeVectors:()=>sl,resyncKnowledgeDocs:()=>rl});function Hr(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function rl(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Hr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function sl(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Hr(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:il(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 il(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 Wr={};j(Wr,{inspectSkillHealth:()=>Tt,showSkillHealth:()=>pl});function gl(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function Tt(e){let t=e===void 0?xe(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];ml(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=gl(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 ml(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 pl(e={}){let t=Tt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var Mn=D(()=>{Je();});var Ln={};j(Ln,{showMcpHealth:()=>wl,showMcpInventory:()=>kl});async function kl(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 wl(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 Cs={};j(Cs,{renderDoctorText:()=>Es,runDoctor:()=>nd,runDoctorAudit:()=>rd,runDoctorAuditFix:()=>sd,runDoctorCommand:()=>od,runDoctorReceipts:()=>ad,runDoctorViolations:()=>id,runLegacyDoctorReport:()=>Ps,runStructuredDoctor:()=>oo});function ds(){if(Lt)return Lt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Lt=e.DatabaseSync,Lt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ae(e){return {homeDir:e.homePath,env:e.env??process.env}}function Bt(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 Tl(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??xe(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(p){let h=Tt(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 Ml(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Ll(e,t){let n=Vn(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=>Ml(f).length>0);i.push({key:"daemon_registry",value:l.length===0?"valid":"malformed",target:"valid daemon entry array",ok:l.length===0,severity:l.length===0?"info":"warning"}),i.push({key:"invalid_daemon_registry_entries",value:l.length,target:0,ok:l.length===0,severity:"warning"});let u=c.filter(f=>{if(typeof f!="object"||f===null)return !1;let 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 Hl(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(r=>r.name)),o=[];for(let[r,s]of Object.entries(Fl)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function gs(e){if(typeof e!="string")return null;try{let t=JSON.parse(e);return !Array.isArray(t)||!t.every(n=>typeof n=="string"&&n.trim().length>0)||new Set(t).size!==t.length?null:t}catch{return null}}function Wl(e){let t=gs(e);return t&&t.length>0?t:null}function 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 Ul(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Br(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Bl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(ds())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Hl(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
|
|
28
|
+
`);}o[i]=(o[i]??0)+(Rn(e,i)-u);}}function uc(e,t,n){let o=new Set($t(t,"main",n).map(l=>l.name)),r=$t(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||_n.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 lt(e,t="main"){return e.prepare(`SELECT name FROM ${H(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function $t(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function Rn(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 _n,Cr=D(()=>{_n=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var Dr={};j(Dr,{connectAgent:()=>mc,getAvailableAgents:()=>pc});async function mc(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 pc(){return listAdapters()}var xr=D(()=>{});var jr={};j(jr,{getIndexStatus:()=>fc,refreshIndex:()=>hc});async function fc(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 hc(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var Ar=D(()=>{Se();});var Nr={};j(Nr,{getGraph:()=>vc});async function vc(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 $r=D(()=>{Se();});var En={};j(En,{getContext:()=>bc,getTaskContext:()=>Sc});async function bc(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 Sc(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 Pn=D(()=>{Se();});var ut={};j(ut,{getWorkflowRuns:()=>Tr,getWorkflowStatus:()=>Ec,listWorkflows:()=>_c,runWorkflow:()=>Rc});async function _c(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Rc(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 Ec(e){return Tr(e)}async function Tr(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var dt=D(()=>{Se();});var Ye={};j(Ye,{cancelWorker:()=>Ac,listWorkers:()=>Oc,retryWorkerCleanup:()=>Nc,showWorker:()=>jc,workerMergeStatus:()=>$c});function Oc(e){return gt(e,t=>Ge(e.json,{projectRoot:ze(e.projectRoot),workers:t.listWorkflowWorkers(ze(e.projectRoot))}))}function jc(e,t){return gt(t,n=>{let o=ze(t.projectRoot),r=It(n,o,e);return Ge(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function Ac(e,t){return gt(t,n=>{let o=ze(t.projectRoot),r=It(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),Ge(t.json,s)})}function Nc(e,t){return gt(t,n=>{let o=ze(t.projectRoot),r=It(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return Ge(t.json,s)})}function $c(e,t){return gt(t,n=>{let o=ze(t.projectRoot);It(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return Ge(t.json,r??{workerId:e,state:"not_queued"})})}function It(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function ze(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function gt(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function Ge(e,t){if(e)return JSON.stringify(t,null,2);if(Ic(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(Tc(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=>Ge(false,o)).join(`
|
|
29
|
+
`)}return JSON.stringify(t,null,2)}function Ic(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function Tc(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Ze=D(()=>{});var Dn={};j(Dn,{getEmbeddingStatus:()=>Fc,prepareEmbeddings:()=>Hc,renderEmbeddingStatus:()=>Wc});async function Fc(){return inspectEmbeddingModel()}async function Hc(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Wc(e){let t=[`Embedding model: ${e.state}`,` model: ${e.modelId}`,` revision: ${e.revision}`,` cache: ${e.cacheRoot}`];return e.missingFiles.length>0&&t.push(` missing: ${e.missingFiles.join(", ")}`),e.corruptFiles.length>0&&t.push(` corrupt: ${e.corruptFiles.join(", ")}`),t.join(`
|
|
30
|
+
`)}var xn=D(()=>{});var Ne={};j(Ne,{backfillObservationVectors:()=>zc,queryMemory:()=>Kc,reviewCandidates:()=>Vc,reviewMemories:()=>Yc,setMemory:()=>Jc,showMemory:()=>Bc});async function Bc(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 Kc(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 Jc(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 Vc(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function zc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Gc(e){let t=qc.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Yc(){let t=await $(process.cwd(),async r=>(await r.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:r}=await createEngines(process.cwd());return r.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((r,s)=>r.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&r.category!=="failure_lesson"?1:0),o=0;for(let r of n){console.log(`
|
|
31
|
+
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Gc(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await $(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await $(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
|
|
32
|
+
Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Lr={};j(Lr,{getDocsStatus:()=>Xc,queryKnowledge:()=>Mr,searchKnowledge:()=>Qc,syncDocs:()=>el});async function Mr(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 Qc(e,t,n){return (await Mr(e,t,void 0,n)).results}async function Xc(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 el(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 Fr=D(()=>{Se();});var $n={};j($n,{backfillKnowledgeVectors:()=>il,resyncKnowledgeDocs:()=>sl});function Hr(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function sl(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Hr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function il(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=Hr(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:al(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 al(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 Wr={};j(Wr,{inspectSkillHealth:()=>Tt,showSkillHealth:()=>fl});function ml(e){let t=readFileSync$1(e,"utf8"),n=/^---\r?\n([\s\S]*?)\r?\n---/.exec(t);if(!n)return {};let o={};for(let r of n[1].split(/\r?\n/)){let s=r.indexOf(":");if(s<1)continue;let i=r.slice(0,s).trim(),a=r.slice(s+1).trim();(i==="name"||i==="description")&&(o[i]=a);}return o}function Tt(e){let t=e===void 0?xe(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];pl(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=ml(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 pl(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 fl(e={}){let t=Tt(e.root);if(e.json)console.log(JSON.stringify(t,null,2));else {console.log(`Skills: ${t.skills}, registry commands: ${t.commands}, version: ${t.registryVersion??"missing"}`);for(let n of t.issues)console.log(`${n.category.toUpperCase()} ${n.skill??"runtime"}: ${n.reason}`);}return t.healthy?0:1}var Mn=D(()=>{Ke();});var Ln={};j(Ln,{showMcpHealth:()=>bl,showMcpInventory:()=>wl});async function wl(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 bl(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 Cs={};j(Cs,{renderDoctorText:()=>Es,runDoctor:()=>od,runDoctorAudit:()=>sd,runDoctorAuditFix:()=>id,runDoctorCommand:()=>rd,runDoctorReceipts:()=>cd,runDoctorViolations:()=>ad,runLegacyDoctorReport:()=>Ps,runStructuredDoctor:()=>oo});function ds(){if(Lt)return Lt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Lt=e.DatabaseSync,Lt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ae(e){return {homeDir:e.homePath,env:e.env??process.env}}function Bt(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 Ml(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??xe(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(p){let h=Tt(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 Ll(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 Fl(e,t){let n=Vn(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=>Ll(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 Wl(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(Hl)){if(!n.has(r)){o.push(r);continue}let i=new Set(e.prepare(`PRAGMA table_info(${r})`).all().map(a=>a.name));for(let a of s)i.has(a)||o.push(`${r}.${a}`);}return o.sort()}function gs(e){if(typeof e!="string")return null;try{let t=JSON.parse(e);return !Array.isArray(t)||!t.every(n=>typeof n=="string"&&n.trim().length>0)||new Set(t).size!==t.length?null:t}catch{return null}}function Ul(e){let t=gs(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 ql(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Br(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Kl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:I(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(ds())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Wl(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:I(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
|
|
33
33
|
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
34
34
|
FROM distill_leases
|
|
35
|
-
`);l.setReadBigInts?.(!0);let u=l.all(),p=new Set,m=0,f=0;for(let _ of u){let T=
|
|
35
|
+
`);l.setReadBigInts?.(!0);let u=l.all(),p=new Set,m=0,f=0;for(let _ of u){let T=Ul(_.event_ids),J=gs(_.session_ids),Y=Wn(_.event_count),O=Wn(_.created_at),B=Wn(_.expires_at),x=typeof _.status=="string"&&Bl.has(_.status)?_.status:null,A=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=T!==null&&Y!==null&&ql(Y,T.length);if(!A||!T||!J||!F||O===null||B===null||x===null){m+=1,_.status==="pending"&&(B===null||Br(B,c))&&(f+=1);continue}if(!(x!=="pending"||!Br(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
36
|
SELECT id
|
|
37
37
|
FROM session_events
|
|
38
38
|
WHERE processed = 0 AND created_at < ?
|
|
@@ -53,7 +53,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Lr={};j
|
|
|
53
53
|
GROUP BY project, session_id, title
|
|
54
54
|
HAVING COUNT(*) > 1
|
|
55
55
|
)
|
|
56
|
-
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:I(n),metrics:n}}function Q(e,t){return (t.openDatabase??(o=>new(ds())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function q(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function ms(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Gn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function
|
|
56
|
+
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:I(n),metrics:n}}function Q(e,t){return (t.openDatabase??(o=>new(ds())(o,{readOnly:true})))(e)}function M(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return M(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function q(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function ms(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Gn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Jl(e){let t=Gn(ms(e.output)),n=Gn(t?.data),o=typeof t?.status=="string"?t.status:void 0,r=typeof e.metric_status=="string"?e.metric_status:void 0,i=!(!!e.blocked&&typeof e.block_reason=="string"&&e.block_reason.startsWith("DEVFLOW_"))&&(!!e.error||!!e.failure_category||t?.ok===false||t?.success===false||t?.isError===true||!!t?.error||o==="failed"||o==="rejected"||r==="error"),a=!i&&(t?.degraded===true||!!t?.degradation||n?.degraded===true||o==="degraded"||r==="degraded");return {failed:i,degraded:a}}function Vl(e){let t=ms(e);if(typeof t=="string"&&t.trim())return [t.trim()];if(Array.isArray(t))return t.filter(o=>typeof o=="string"&&o.trim().length>0).map(o=>o.trim());let n=Gn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Kr(e,t){return t===0?0:e/t}function Un(e,t){return e===0?1:t/e}async function zl(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=Q(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=Q(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=Un(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=Q(a,t);let d=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(g=>!M(m,g));if(d.length>0)n.push({key:"knowledge_vector_schema",value:d,target:[],ok:!1,severity:"warning"});else {let h=fe(m,"knowledge_docs").has("status")?"AND d.status = 'active'":"",v=q(m,`
|
|
57
57
|
SELECT COUNT(*) count
|
|
58
58
|
FROM knowledge_chunks c
|
|
59
59
|
JOIN knowledge_docs d ON d.id = c.doc_id
|
|
@@ -78,7 +78,7 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Lr={};j
|
|
|
78
78
|
WHERE e.source_type = 'observation'
|
|
79
79
|
${d?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
|
|
80
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(ae(t)),"errors","embedder.log"),p=0;if(existsSync$1(u))try{let m=l-864e5;p=readFileSync$1(u,"utf8").split(`
|
|
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
|
+
`).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 Gl(e,t,n){let o=[],r=Bt(n),s=(n.now??Date.now)()-1440*60*1e3,i=(n.now??Date.now)(),a=t?"error":"warning";if(!existsSync$1(r))o.push({key:"global_telemetry_db",value:"missing",target:r,ok:false,severity:"warning"});else {let d;try{d=Q(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[x,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:x,value:F,ok:!0,severity:"info"});}let g=M(d,"telemetry_failures")?q(d,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:g,target:0,ok:g===0,severity:a});let h=fe(d,"sessions"),v=fe(d,"tool_call_events"),y=fe(d,"skill_executions"),R=["id","project_root","started_at","status"].every(x=>h.has(x));if(o.push({key:"telemetry_session_schema",value:R?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:R,severity:"error"}),R){let x=q(d,`
|
|
82
82
|
SELECT COUNT(*) count FROM sessions
|
|
83
83
|
WHERE project_root = ? AND started_at >= ?
|
|
84
84
|
`,e,s);o.push({key:"session_start_evidence_24h",value:x,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let A=q(d,`
|
|
@@ -151,49 +151,49 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Lr={};j
|
|
|
151
151
|
${x?"JOIN sessions event_session ON event_session.id = event.session_id":""}
|
|
152
152
|
WHERE event.timestamp >= ?
|
|
153
153
|
${x?"AND event_session.project_root = ?":""}
|
|
154
|
-
`).all(...x?[s,e]:[s]),Z=V.map(
|
|
154
|
+
`).all(...x?[s,e]:[s]),Z=V.map(Jl),ke=Z.filter(L=>L.failed).length,le=Z.filter((L,U)=>L.failed&&V[U]?.session_status!=="completed").length,we=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:we,target:0,ok:we===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Kr(ke,V.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Kr(we,V.length),target:0,ok:we===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:x?"project":"global fallback; session identity unavailable",target:"project",ok:x,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,gi)=>Z[gi]?.failed&&de.session_status!=="completed"),ue=U.filter(de=>typeof de.failure_category=="string"&&de.failure_category.trim().length>0).length,Ue=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:Ue,target:">= 0.80",ok:Ue>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let J=R&&["session_id","started_at","fallback_count","fallback_reasons"].every(x=>y.has(x)),Y=0,O={};if(J){let x=d.prepare(`
|
|
155
155
|
SELECT execution.fallback_count, execution.fallback_reasons
|
|
156
156
|
FROM skill_executions execution
|
|
157
157
|
JOIN sessions session ON session.id = execution.session_id
|
|
158
158
|
WHERE session.project_root = ? AND execution.started_at >= ?
|
|
159
|
-
`).all(e,s);for(let A of x){Y+=Number(A.fallback_count??0);for(let F of
|
|
159
|
+
`).all(e,s);for(let A of x){Y+=Number(A.fallback_count??0);for(let F of Vl(A.fallback_reasons))O[F]=(O[F]??0)+1;}}let B=0;if(M(d,"devflow_hook_fallbacks")){let x=d.prepare(`
|
|
160
160
|
SELECT reason, COUNT(*) count
|
|
161
161
|
FROM devflow_hook_fallbacks
|
|
162
162
|
WHERE project_root = ? AND created_at >= ?
|
|
163
163
|
GROUP BY reason ORDER BY reason
|
|
164
|
-
`).all(e,s);for(let A of x){let F=Number(A.count);B+=F,O[`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:O,target:{},ok:Object.keys(O).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(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=Q(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 Vr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function ps(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
|
|
165
|
-
`))if(u.trim())try{let p=JSON.parse(u),m=ps(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
|
|
164
|
+
`).all(e,s);for(let A of x){let F=Number(A.count);B+=F,O[`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:O,target:{},ok:Object.keys(O).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=Q(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 Vr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function ps(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 Yl(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=Vr(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=Vr(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)()-Xe;for(let u of readFileSync$1(i,"utf8").split(`
|
|
165
|
+
`))if(u.trim())try{let p=JSON.parse(u),m=ps(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 Zl(e){let t=[],n=Bt(e);if(!existsSync$1(n))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let o;try{if(o=Q(n,e),!M(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let r=o.prepare(`
|
|
166
166
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
167
167
|
FROM benchmark_reports
|
|
168
168
|
ORDER BY created_at DESC
|
|
169
169
|
LIMIT 1
|
|
170
|
-
`).get();if(!r)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:I(t),metrics:t};let s=null;try{if(typeof r.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(r.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");s=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let i=Number(r.task_count),a=Number(r.created_at),c=(e.now??Date.now)()-a;t.push({key:"latest_benchmark",value:{runId:r.run_id,suiteId:r.suite_id,suiteVersion:r.suite_version,status:r.status,createdAt:a},ok:r.status==="completed"&&Number.isFinite(a),severity:"error"}),t.push({key:"benchmark_task_count",value:i,target:">= 5",ok:Number.isInteger(i)&&i>=5&&s===i,severity:s===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(c)?Number((c/
|
|
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/Xe).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=Yn,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 Ql(e,t){let n=[],o=Bt(t);if(!existsSync$1(o))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
|
|
171
171
|
SELECT report_json, created_at
|
|
172
172
|
FROM benchmark_reports
|
|
173
173
|
WHERE suite_id = 'retrieval-quality' AND project_root = ?
|
|
174
174
|
ORDER BY created_at DESC
|
|
175
175
|
LIMIT 1
|
|
176
|
-
`).get(e);if(!s?.report_json)return n.push({key:"retrieval_quality_report",value:"no project report",target:"run retrieval-quality benchmark for this project",ok:!1,severity:"warning"}),{name:"Retrieval quality",status:I(n),metrics:n};let i=JSON.parse(s.report_json),a=(t.now??Date.now)()-Number(s.created_at??0);n.push({key:"retrieval_quality_report",value:{status:i.qualityStatus,ageMs:a,diagnostics:i.diagnostics??[]},target:{status:"passed",maxAgeMs:Yn},ok:i.qualityStatus==="passed"&&a<=Yn,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
|
|
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:Yn},ok:i.qualityStatus==="passed"&&a<=Yn,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 Xl(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 eu(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)()-Xe,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(`
|
|
177
177
|
`))if(R.trim())try{let k=JSON.parse(R),w=ps(k.ts);w===null||typeof k.reason!="string"?c+=1:w>=i&&(a+=1);}catch{c+=1;}}catch(R){t.push({key:"hook_fallback_log_read",value:{path: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=Bt(e),u=0,p=0,m=null;if(existsSync$1(l)){let y;try{if(y=Q(l,e),M(y,"telemetry_events")){let R=y.prepare(`
|
|
178
178
|
SELECT COUNT(*) total,
|
|
179
179
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
180
180
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
181
181
|
FROM telemetry_events
|
|
182
182
|
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
183
|
-
`).get(i);u=Number(R?.total??0),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=
|
|
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(ae(e)),"logs","hook-debug");try{let y=Xl(v);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${Jr}`,ok:y.bytes<=Jr,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 He(e){return JSON.parse(readFileSync$1(e,"utf8"))}function W(e){return typeof e=="object"&&e!==null?e:null}function vs(e,t){return ou.has(e)&&!(t.tolerateControlSyntax&&ru.has(e))}function kt(e,t={}){if(Buffer.byteLength(e)>ys)return {segments:[],malformed:true};let n=[],o=[],r="",s=null,i=false,a=false,c=()=>{r.length>0&&o.push(r),r="";},l=()=>{c(),o.length>0&&n.push(o),o=[];};for(let u=0;u<e.length;u+=1){let 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
184
|
`){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
|
|
185
185
|
`){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&&vs(p,t)})&&(a=true),{segments:n,malformed:a}}function
|
|
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==="}"&&su.test(`${r}}`);if(["(",")","{","}"].includes(p)&&!f&&!t.tolerateControlSyntax&&(a=true),m==="&&"||m==="||"){l(),u+=1;continue}if([";","|","&",`
|
|
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&&vs(p,t)})&&(a=true),{segments:n,malformed:a}}function iu(e){return kt(e).segments.flat().join(" ")}function au(e,t){let n=extname(e);return [".bash",".sh",".zsh"].includes(n)||/^#![^\n]*\b(?:ba|z)?sh\b/.test(t)?true:n===""&&!/^#!/.test(t)}function ks(e,t){return au(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 cu(e){let t=e.split(""),n=null;for(let o=0;o<e.length;o+=1){let r=e[o];if(n!==null){r==="\\"?o+=1:r===n&&(n=null);continue}if(r==="'"||r==='"'||r==="`"){n=r;continue}if(r!=="/"||!["/","*"].includes(e[o+1]??""))continue;let s=e[o+1]==="*";for(t[o]=" ",t[o+1]=" ",o+=2;o<e.length;){if(s&&e[o]==="*"&&e[o+1]==="/"){t[o]=" ",t[o+1]=" ",o+=1;break}if(!s&&e[o]===`
|
|
188
188
|
`){o-=1;break}e[o]!==`
|
|
189
|
-
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function
|
|
189
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function lu(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="#"){for(;n<e.length&&e[n]!==`
|
|
190
190
|
`;)t[n]=" ",n+=1;continue}if(o!=="'"&&o!=='"')continue;let r=o,s=e.slice(n,n+3)===r.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===r.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
|
|
191
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function he(e,t,n="infer"){let o=t?
|
|
191
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function he(e,t,n="infer"){let o=t?iu(e):n==="node"?cu(e):n==="python"?lu(e):e;return [...new Set(o.match(tu)??[])]}function uu(e){return kt(e).segments.flat()}function ye(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Pe(a,i)?a:Pe(c,i)?c:dirname$1(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function du(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),o=e.slice(t+1),r=n.split(";").includes("base64")?Buffer.from(o,"base64"):Buffer.from(decodeURIComponent(o),"utf8");if(r.length>ys||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function no(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=du(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ht(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:ye(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Fe(n))return {malformed:true};let o=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!o)return {malformed:false};let r={project:e.project,homePath:e.homePath,cwd:e.cwd};if(o){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=mu(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:ye(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:ye(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:ye(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function gu(e){let t=[e];extname(e)===""&&t.push(...zr.map(n=>`${e}${n}`),...zr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function mu(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 gu(o)??o}function pu(e){let t=[],n=false;for(let o=0;o<e.length;){let r=e[o];if(/\s/.test(r)){o+=1;continue}if(r==="/"&&e[o+1]==="/"){for(o+=2;o<e.length&&e[o]!==`
|
|
192
192
|
`;)o+=1;continue}if(r==="/"&&e[o+1]==="*"){let s=e.indexOf("*/",o+2);if(s<0){n=true;break}o=s+2;continue}if(r==="'"||r==='"'){let s=r,i="",a=true;o+=1;let c=false;for(;o<e.length;){let l=e[o];if(l===s){c=true,o+=1;break}if(l==="\\"){if(a=false,o+1>=e.length)break;i+=e[o+1],o+=2;continue}if(l===`
|
|
193
|
-
`||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function
|
|
193
|
+
`||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function fu(e,t,n,o=true){let r=pu(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=no(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 hu(e){let t=e.split(""),n=false;for(let o=0;o<e.length;){let r=e[o];if(r==="#"){for(;o<e.length&&e[o]!==`
|
|
194
194
|
`;)t[o]=" ",o+=1;continue}if(r!=="'"&&r!=='"'){o+=1;continue}let s=o;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,o),a=/^(?:f|fr|rf)$/i.test(i),c=r,l=e.slice(o,o+3)===c.repeat(3),u=l?3:1,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
195
|
`||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 Gr(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 hu(e,t,n){let o=fu(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=p=>{let m=dirname(e);for(let f=1;f<p;f+=1)m=dirname(m);return m},a=p=>{let m=ye(p,{...n,cwd:dirname(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=Gr(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(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&&Gr(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 ws(e,t,n,o,r=true){return n==="node"?pu(e,t,o,r):n==="python"?hu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Yr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Ut(e,0,r),i=new Set((s.artifacts??[]).map(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 bs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Fe(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Ht(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function ft(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function bu(e,t,n){let o=[],r=[],s=false,i=(u,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(wu.has(u))return a();if(ku.has(u)){l=true,c+=1;continue}let p=Zr.has(u)?"cjs":Qr.has(u)?"esm":null;if(p){let h=e[c+1];if(!h)return a(true);i(h,p),c+=2;continue}let m=ft(u,Zr),f=ft(u,Qr),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(Xr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ht(h))}let g=ft(u,Xr);if(g!==null)return a(s||Ht(g));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ht(u.slice(2)));if(es.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(ft(u,es)!==null){c+=1;continue}if(vu.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Eu(e,t,n,o,r){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Fe(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Ut(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Su.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Fe(i)}}return {tokens:[],malformed:true}}function Pu(e,t,n){let o=t;for(;o<e.length;){let r=e[o];if(r==="--"){let s=e[o+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Fe(s)}:{tokens:[],malformed:true}}if(!r.startsWith("-"))return {tokens:[r],artifacts:[{value:r,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Fe(r)};if(Ru.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(ts.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(ft(r,ts)!==null){o+=1;continue}if(_u.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 xu(e,t,n,o,r){let s=n;if(e==="builtin"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="command"){for(;t[s]?.startsWith("-");){let i=t[s];if(/^-[pvV]+$/.test(i)&&/[vV]/.test(i))return {index:t.length,malformed:false};s+=1;}return {index:s,malformed:s>=t.length}}if(e==="exec"){for(;t[s]?.startsWith("-");)t[s]==="-a"||t[s]==="--argv0"?s+=2:s+=1;return {index:s,malformed:s>=t.length}}if(e==="nohup"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="env"){let i=o;for(;s<t.length;){let a=t[s];if(bs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=wt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?qn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=qn(a.slice(8),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(a.startsWith("-C")&&a.length>2){let c=qn(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function Ut(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>hs)return {tokens:[],malformed:true};let r=wt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Ss(l,t,n,o);s.push(...u.tokens),i.push(...u.artifacts??[]),a.push(...u.inlineContents??[]),c||=u.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function Ss(e,t,n,o){let r=0;for(;bs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Cu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>hs)return {tokens:i,malformed:true};let g=xu(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=Ss(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)&&vs(l,o),p=c&&!Du.has(l);if(u||p)return {tokens:i,malformed:true};let m=Fe(s);i.push(s);let f=l;if(!yu.has(f))return {tokens:i,malformed:m};let d=["node","tsx"].includes(f)?bu(e,r+1,n):["bash","sh","zsh"].includes(f)?Eu(e,r+1,a,n,o):Pu(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:m||d.malformed}}function _s(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Ce(t.slice(0,o))}function Ou(e,t){let n=new Map;for(let o of t)for(let r of lu(o)){let s=_s(r);if(!s)continue;let i=n.get(s)??[];i.push(o),n.set(s,i);}return [...n].map(([o,r])=>({root:o,configPath:e,commands:[...new Set(r)]}))}function ju(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Au(e){return e.slice(e.lastIndexOf("@")+1)}function ns(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Ce(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Nu(e,t,n){let o=Au(e),r=W(t.extraKnownMarketplaces),s=W(r?.[o]);if(s){let i=W(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?ns(i.path):null}}try{let i=W(He(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?ns(c.path):null}}}catch{}return {configured:false,root:null}}function os(e){let t=[e?.lastUpdated,e?.installedAt].map(n=>{if(typeof n=="number"&&Number.isFinite(n)&&n>=0)return n;if(typeof n!="string")return null;let o=Date.parse(n);return Number.isFinite(o)?o:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function $u(e,t){let n=W(e.entry),o=W(t.entry),r=os(n),s=os(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?qt(n.version):null,a=typeof o?.version=="string"?qt(o.version):null;if(i&&a){let c=Rs(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Iu(e,t){try{let n=W(He(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=W(n.plugins);if(!o)throw new Error("installed plugin manifest plugins must be an object");let r=o?.[e];if(r===void 0)return {configured:!1,root:null};if(!Array.isArray(r)||r.length===0)return {configured:!0,malformed:!0,root:null};let s=r.map((a,c)=>({entry:a,index:c})).sort($u)[0],i=W(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Ce(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function qt(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function Rs(e,t){for(let o of ["major","minor","patch"])if(e[o]!==t[o])return e[o]-t[o];if(e.prerelease.length===0||t.prerelease.length===0)return t.prerelease.length-e.prerelease.length;let n=Math.max(e.prerelease.length,t.prerelease.length);for(let o=0;o<n;o+=1){let r=e.prerelease[o],s=t.prerelease[o];if(r===void 0)return -1;if(s===void 0)return 1;if(r===s)continue;let i=/^\d+$/.test(r)?Number(r):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:r.localeCompare(s)}return 0}function Tu(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=W(He(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=qt(a.version),u=qt(c.version);if(l&&u){let p=Rs(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 Mu(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 vt(k.settings.hooks,w),{path:k.path,commands:w}}),m=p.flatMap(k=>k.commands),f=p.flatMap(k=>Ou(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(_))ju(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=Iu(k,o);w.malformed&&c.push(o);let _=w.root;if(!w.configured){let T=i.map(Y=>Nu(k,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=Tu(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 Lu(e){let t=e;for(;;){let n=join$1(t,"package.json");if(existsSync$1(n))try{if(JSON.parse(readFileSync$1(n,"utf8")).workspaces)return t}catch{}let o=dirname(t);if(o===t)return;t=o;}}function vt(e,t){if(Array.isArray(e)){for(let n of e)vt(n,t);return}if(!(typeof e!="object"||e===null))for(let[n,o]of Object.entries(e))n==="command"&&typeof o=="string"?t.push(o):vt(o,t);}function Bn(e){return [...e.matchAll(tu)].map(t=>t[1])}function Fu(e){let t=new Map,n=wt(e,{tolerateControlSyntax:true});for(let o of n.segments.flat()){let r=o.match(/^([A-Za-z_][A-Za-z0-9_]*)=(\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/[A-Za-z0-9._/-]+)$/);r&&t.set(r[1],r[2]);}return t.size===0?e:e.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,(o,r,s)=>t.get(r??s??"")??o)}function Hu(e){let t=spawnSync("bash",["--noprofile","--norc","-n"],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??"",BASH_ENV:"",ENV:""},input:e,timeout:2e3});return t.error!==void 0||t.status!==0}function Wu(e){if(![".cjs",".js",".mjs"].includes(extname(e)))return false;let t=spawnSync(process.execPath,["--check",e],{encoding:"utf8",env:{PATH:process.env.PATH??"",HOME:process.env.HOME??""},timeout:2e3});return t.error!==void 0||t.status!==0}function 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>Ft)return {kind:"unsafe",reason:"oversized"};let n;try{n=openSync(e,constants.O_RDONLY|constants.O_NONBLOCK|constants.O_NOFOLLOW);}catch{return {kind:"missing"}}try{let o=fstatSync(n);if(!o.isFile())return {kind:"unsafe",reason:"nonregular"};if(o.size>Ft)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ft+1)),s=0;for(;s<r.length;){let c=readSync(n,r,s,r.length-s,null);if(c===0)break;s+=c;}if(s>Ft)return {kind:"unsafe",reason:"oversized"};let i=r.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Qn(e,t){return `${e} (${t})`}function Uu(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=Yr(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>=fs){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"?ks(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=Yr(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=ws(l,p,m,{project:e,homePath:t,cwd:dirname(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 qu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Lu(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=Ut(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=_s(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=[];vt(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>=fs){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"?ks(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=Fu(h),_=Ut(w,0,{project:e,homePath:t,cwd:dirname(d)},{tolerateControlSyntax:true});Hu(h)&&o.malformedCommands.push(d),u(w,_,dirname(d),f.depth+1),p(_,dirname(d),f.depth+1,true);}else if(v==="node"||v==="python"){let w=ws(d,h,v,{project:e,homePath:t,cwd:dirname(d)},false);(v==="node"?Wu(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 Bu(e){let t=e.installedPluginsPath??join$1(e.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),n=new Map;if(!existsSync$1(t))return new Map;try{let o=W(He(t)),r=W(o?.plugins);if(!r)return new Map;for(let s of Object.values(r))if(Array.isArray(s))for(let i of s){let a=W(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=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 rs(e){try{let t=W(He(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ku(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Bu(t);for(let r of e){let s=r.root,i=join$1(s,"package.json"),a=join$1(s,".claude-plugin","plugin.json");if(!(existsSync$1(i)||existsSync$1(a)))continue;let l=join$1(s,"hooks","hooks.json"),u=join$1(s,"hooks.json");existsSync$1(l)||n.layoutIssues.push({root:s,issue:"missing hooks/hooks.json"}),existsSync$1(u)&&n.layoutIssues.push({root:s,issue:"retired root hooks.json is present"});let p=existsSync$1(l)?l:u;try{let y=W(He(p)),R=W(y?.hooks),k=[];vt(R?.SessionStart,k),k.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let m=rs(i),f=rs(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 Ju(e,t){let n=Mu(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let O of n.configCommands){o.configsInspected.push(O.path);for(let B of O.commands){o.commandsInspected.push({configPath:O.path,command:B});for(let x of he(B,true))o.findings.push({artifact:O.path,endpoint:x});}}Uu(e,t.homePath??homedir$1(),n.configCommands.flatMap(O=>O.commands).filter(O=>!n.targets.some(B=>B.commands?.includes(O))),o);for(let O of n.targets)qu(e,t.homePath??homedir$1(),O,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((O,B,x)=>x.findIndex(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=Ku(n.targets,t),v=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,y=t.homePath??(v&&basename(v)===".claude"?dirname(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}:xe(y,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,_=w?rt(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 Vu(e){let t=dirname(fileURLToPath(import.meta.url)),n=[...new Set([e.acceptanceManifestPath,e.env?.DEVFLOW_ACCEPTANCE_MANIFEST,process.env.DEVFLOW_ACCEPTANCE_MANIFEST,join$1(t,"..","acceptance-manifest.json"),join$1(t,"..","..","..","..","packages","devflow","acceptance-manifest.json"),join$1(process.cwd(),"packages","devflow","acceptance-manifest.json")].filter(o=>!!o))];for(let o of n)if(existsSync$1(o))try{return {path:o,manifest:JSON.parse(readFileSync$1(o,"utf8"))}}catch(r){return {path:o,error:r.message}}return {error:`not found (${n.join(", ")})`}}function Kt(e){let t=Vu(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/et:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function zu(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=Q(i,t);let l=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(u=>u.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:l?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:l,severity:"warning"}),l&&n.push({key:"explicit_memory_observations",value:q(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:I(n),metrics:n}}function Gu(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*et,i=r.prepare(`
|
|
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 Gr(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 yu(e,t,n){let o=hu(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=Gr(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&&Gr(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 ws(e,t,n,o,r=true){return n==="node"?fu(e,t,o,r):n==="python"?yu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Yr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Ut(e,0,r),i=new Set((s.artifacts??[]).map(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 bs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Fe(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Ht(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Su(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(bu.has(u))return a();if(wu.has(u)){l=true,c+=1;continue}let p=Zr.has(u)?"cjs":Qr.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,Zr),f=pt(u,Qr),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(Xr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ht(h))}let g=pt(u,Xr);if(g!==null)return a(s||Ht(g));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ht(u.slice(2)));if(es.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,es)!==null){c+=1;continue}if(ku.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Pu(e,t,n,o,r){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Fe(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Ut(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(_u.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 Cu(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(Eu.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(ts.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,ts)!==null){o+=1;continue}if(Ru.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 Ou(e,t,n,o,r){let s=n;if(e==="builtin"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="command"){for(;t[s]?.startsWith("-");){let i=t[s];if(/^-[pvV]+$/.test(i)&&/[vV]/.test(i))return {index:t.length,malformed:false};s+=1;}return {index:s,malformed:s>=t.length}}if(e==="exec"){for(;t[s]?.startsWith("-");)t[s]==="-a"||t[s]==="--argv0"?s+=2:s+=1;return {index:s,malformed:s>=t.length}}if(e==="nohup"){for(;t[s]?.startsWith("-");)s+=1;return {index:s,malformed:s>=t.length}}if(e==="env"){let i=o;for(;s<t.length;){let a=t[s];if(bs(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=kt(c,r);return l.malformed||l.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...l.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],l=c?qn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=qn(a.slice(8),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(a.startsWith("-C")&&a.length>2){let c=qn(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function Ut(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>hs)return {tokens:[],malformed:true};let r=kt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Ss(l,t,n,o);s.push(...u.tokens),i.push(...u.artifacts??[]),a.push(...u.inlineContents??[]),c||=u.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function Ss(e,t,n,o){let r=0;for(;bs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Du.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>hs)return {tokens:i,malformed:true};let g=Ou(basename(s),e,r+1,n,o);if(g.malformed)return {tokens:i,malformed:true};if(n=g.context??n,g.replacement){let h=Ss(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)&&vs(l,o),p=c&&!xu.has(l);if(u||p)return {tokens:i,malformed:true};let m=Fe(s);i.push(s);let f=l;if(!vu.has(f))return {tokens:i,malformed:m};let d=["node","tsx"].includes(f)?Su(e,r+1,n):["bash","sh","zsh"].includes(f)?Pu(e,r+1,a,n,o):Cu(e,r+1,n);return i.push(...d.tokens),{tokens:i,artifacts:d.artifacts,inlineContents:d.inlineContents,malformed:m||d.malformed}}function _s(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Ce(t.slice(0,o))}function ju(e,t){let n=new Map;for(let o of t)for(let r of uu(o)){let s=_s(r);if(!s)continue;let i=n.get(s)??[];i.push(o),n.set(s,i);}return [...n].map(([o,r])=>({root:o,configPath:e,commands:[...new Set(r)]}))}function Au(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Nu(e){return e.slice(e.lastIndexOf("@")+1)}function ns(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Ce(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function $u(e,t,n){let o=Nu(e),r=W(t.extraKnownMarketplaces),s=W(r?.[o]);if(s){let i=W(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?ns(i.path):null}}try{let i=W(He(n)),a=W(i?.[o]);if(a){let c=W(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?ns(c.path):null}}}catch{}return {configured:false,root:null}}function os(e){let t=[e?.lastUpdated,e?.installedAt].map(n=>{if(typeof n=="number"&&Number.isFinite(n)&&n>=0)return n;if(typeof n!="string")return null;let o=Date.parse(n);return Number.isFinite(o)?o:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function Iu(e,t){let n=W(e.entry),o=W(t.entry),r=os(n),s=os(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?qt(n.version):null,a=typeof o?.version=="string"?qt(o.version):null;if(i&&a){let c=Rs(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Tu(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(Iu)[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 qt(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function Rs(e,t){for(let o of ["major","minor","patch"])if(e[o]!==t[o])return e[o]-t[o];if(e.prerelease.length===0||t.prerelease.length===0)return t.prerelease.length-e.prerelease.length;let n=Math.max(e.prerelease.length,t.prerelease.length);for(let o=0;o<n;o+=1){let r=e.prerelease[o],s=t.prerelease[o];if(r===void 0)return -1;if(s===void 0)return 1;if(r===s)continue;let i=/^\d+$/.test(r)?Number(r):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:r.localeCompare(s)}return 0}function Mu(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let o=e.slice(0,n),r=e.slice(n+1),s=join$1(t,r,o),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),l=a.name;try{let u=W(He(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=qt(a.version),u=qt(c.version);if(l&&u){let p=Rs(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 Lu(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=>ju(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(_))Au(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=Tu(k,o);w.malformed&&c.push(o);let _=w.root;if(!w.configured){let T=i.map(Y=>$u(k,Y.settings,r)).filter(Y=>Y.configured),J=T[T.length-1];J?_=J.root:_=Mu(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 Fu(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(nu)].map(t=>t[1])}function Hu(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 Wu(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 Uu(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>Ft)return {kind:"unsafe",reason:"oversized"};let n;try{n=openSync(e,constants.O_RDONLY|constants.O_NONBLOCK|constants.O_NOFOLLOW);}catch{return {kind:"missing"}}try{let o=fstatSync(n);if(!o.isFile())return {kind:"unsafe",reason:"nonregular"};if(o.size>Ft)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ft+1)),s=0;for(;s<r.length;){let c=readSync(n,r,s,r.length-s,null);if(c===0)break;s+=c;}if(s>Ft)return {kind:"unsafe",reason:"oversized"};let i=r.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Qn(e,t){return `${e} (${t})`}function qu(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=Yr(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>=fs){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"?ks(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=Yr(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=ws(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 Bu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Fu(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=Ut(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=_s(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>=fs){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"?ks(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=Hu(h),_=Ut(w,0,{project:e,homePath:t,cwd:dirname$1(d)},{tolerateControlSyntax:true});Wu(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=ws(d,h,v,{project:e,homePath:t,cwd:dirname$1(d)},false);(v==="node"?Uu(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 Ku(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 rs(e){try{let t=W(He(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ju(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Ku(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=rs(i),f=rs(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 Vu(e,t){let n=Lu(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});}}qu(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)Bu(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=Ju(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}:xe(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 zu(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 Kt(e){let t=zu(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)/Xe: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 Gu(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 Yu(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*Xe,i=r.prepare(`
|
|
197
197
|
SELECT source, COUNT(*) count FROM memories
|
|
198
198
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
199
199
|
`).all(s),a=r.prepare(`
|
|
@@ -211,14 +211,14 @@ Reviewed ${o}/${t.length} pending memories.`);}var $e=D(()=>{Se();});var Lr={};j
|
|
|
211
211
|
SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
|
|
212
212
|
FROM observations
|
|
213
213
|
WHERE source = 'explicit_intent' AND quality_status = 'accepted'
|
|
214
|
-
`).get(),u=Number(l?.total??0),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
|
|
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 Zu(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:I(n),metrics:n};let r;try{if(r=Q(o,t),!M(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let i=fe(r,"knowledge_chunks").has("token_count")?"COALESCE(token_count, CAST((length(content) + 3) / 4 AS INTEGER))":"CAST((length(content) + 3) / 4 AS INTEGER)",a=r.prepare(`SELECT ${i} length FROM knowledge_chunks ORDER BY ${i}`).all().map(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
215
|
SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
|
|
216
216
|
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 Os=D(()=>{});var js={};j(js,{generateToken:()=>
|
|
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 Qu(e){let{manifest:t,metrics:n}=Kt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:I(n),metrics:n}}function Xu(e){let{manifest:t,metrics:n}=Kt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:I(n),metrics:n}}function ed(e){let{manifest:t,metrics:n}=Kt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["projectDiagnosticCodeResult","getDiagnosticMemoryResult","getDiagnosticKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:I(n),metrics:n}}async function td(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 nd(e){let{manifest:t,metrics:n}=Kt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeState(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??td)(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 oo(e={},t={}){let n=e.project??process.cwd(),o=Vn(n),r=Qu(t),s=await Ml(o.path,t);r.metrics.push(...s.metrics),r.status=I(r.metrics);let i=[Fl(n,t),Kl(o.path,t),Vu(o.path,t),await zl(o.path,t),Gl(o.path,!!e.strict,t),Gu(o.path,t),Yu(o.path,t),Zu(o.path,t),r,Xu(t),Zl(t),Ql(o.path,t),ed(t),Yl(t),await nd(t),eu(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 od(e,t={}){return e===void 0?Ps():oo(e,t)}function ss(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Es(e){let t=[];for(let n of e.sections){let o=`[${n.status.toUpperCase()}]`,r=n.status==="green"?S.green:n.status==="yellow"?S.yellow:S.red;t.push(`${r(o)} ${S.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${ss(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${ss(s.value)}${i}`);}}return t.join(`
|
|
218
|
+
`)}async function rd(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await oo(e,n);return t.stdout(e.json?JSON.stringify(o):Es(o)),o.exitCode}async function Jt(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function Ps(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Jt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,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 et(),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 sd(){let{data:e}=await Jt(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){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 id(){let{data:e}=await Jt(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),o=createHash("sha256").update("genesis").digest("hex");for(let r of n){let s=`${r.seq}|${r.ts}|${r.tool}|${r.argsHash}|${r.decision}|${r.ruleId??""}|${r.sessionId}|${o}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[o,i,r.seq]),o=i;}return {rebuilt:true}}async function ad(e){let{data:t}=await Jt(process.cwd()),o=(await t.auditGetAll()).filter(r=>r.decision!=="allow");if(e){let r=e.match(/^(\d+)([dh])$/);if(r){let s=Number.parseInt(r[1],10),i=r[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;o=o.filter(c=>c.ts>a);}}return {violations:o.map(r=>({tool:r.tool,decision:r.decision,ruleId:r.ruleId,ts:r.ts,sessionId:r.sessionId}))}}function cd(){let e=`${process.env.TMPDIR??"/tmp"}/.devflow-receipts`,t=createHash("sha256").update(process.cwd()).digest("hex").slice(0,16),n=`${e}/${t}.json`;try{return {sessionId:t,data:JSON.parse(readFileSync$1(n,"utf8"))}}catch{return {sessionId:t,data:null}}}var Lt,Hl,zn,Bl,Xe,Yn,Jr,tu,nu,fs,Ft,to,hs,ys,ou,ru,su,zr,vu,Zr,Qr,Xr,es,ku,wu,bu,_u,Ru,ts,Eu,Du,xu,Ds=D(()=>{Ke();re();Mn();Hl={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},zn=3600*1e3;Bl=new Set(["pending","committed","expired"]);Xe=1440*60*1e3,Yn=30*Xe,Jr=60*1024*1024;tu=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,nu=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,fs=64,Ft=1024*1024,to=8,hs=8,ys=64*1024;ou=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),ru=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),su=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;zr=[".cjs",".js",".mjs",".ts",".tsx"];vu=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Zr=new Set(["-r","--require"]),Qr=new Set(["--experimental-loader","--import","--loader"]),Xr=new Set(["-e","--eval","-p","--print"]),es=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),ku=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),wu=new Set(["--check","-c"]),bu=new Set(["--help","--version","-h","-v"]);_u=new Set(["-e","-eu","-o","-u","-ue"]),Ru=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),ts=new Set(["-W","-X","--check-hash-based-pycs"]),Eu=new Set(["--help","--version","-h","-V"]);Du=new Set(["builtin","command","env","exec","nohup","timeout"]),xu=new Set([":","[","echo","false","printf","pwd","test","true"]);});var xs={};j(xs,{runMemoryMaintainCommand:()=>gd});function dd(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 gd(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:dd(e.actions),apply:e.apply===true,dryRun:e.apply!==true,batchSize:e.batchSize});if(e.json)return JSON.stringify(t,null,2);let{before:n,after:o,changes:r}=t;return [`Memory maintenance: ${t.mode}`,`Pending events: ${n.pendingEvents.count} -> ${o.pendingEvents.count}`,`Eligible observation vectors: ${n.observationVectors.coverage.toFixed(3)} -> ${o.observationVectors.coverage.toFixed(3)}`,`Duplicate groups: ${n.duplicates.groups} -> ${o.duplicates.groups}`,`Changes: events=${r.duplicateEventsDeleted}, low-value=${r.lowValueEventsDiscarded}, observations=${r.observationsQuarantined}, vectors=${r.vectorsBackfilled}, leases=${r.staleLeasesReleased}`,t.backupPath?`Backup: ${t.backupPath}`:"Backup: none (dry-run)"].join(`
|
|
219
|
+
`)}var Os=D(()=>{});var js={};j(js,{generateToken:()=>fd});async function fd(e,t=3600){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),o=Math.floor(Date.now()/1e3),r={sub:`devflow-session-${Date.now().toString(36)}`,project:e.split("/").pop()??"unknown",iat:o,exp:o+t,scope:["context","knowledge","memory","workflow","graph"]},s=Buffer.from(JSON.stringify(r)).toString("base64url"),i=getLocalHmacSecret(),a=createHmac("sha256",i).update(`${n}.${s}`).digest("base64url");return {token:`${n}.${s}.${a}`,expiresAt:r.exp,scope:r.scope}}var As=D(()=>{});var ro={};j(ro,{reportBenchmarkCommand:()=>wd,runBenchmarkCommand:()=>kd});async function kd(e){let t=e.suite??"default",n=getBenchmarkSuite(t);if(!n)throw new Error(`Unknown benchmark suite "${t}"`);let r=await new BenchmarkEngine().runSuite(e.projectRoot,n,{rounds:e.rounds}),s=e.database??openGlobalDevFlowDatabase();try{s.insertBenchmarkReport(r);}finally{e.database||s.close();}let i=renderBenchmarkReport(r,e.output??"text");return e.output==="json"?i:`${i}
|
|
220
220
|
|
|
221
|
-
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function
|
|
221
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function wd(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=bd(o,n);return r==="markdown"?`${s}
|
|
222
222
|
## Change From Prior Baseline
|
|
223
223
|
|
|
224
224
|
${i.map(a=>`- ${a}`).join(`
|
|
@@ -227,19 +227,19 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
227
227
|
|
|
228
228
|
Change from ${o.runId}:
|
|
229
229
|
${i.map(a=>`- ${a}`).join(`
|
|
230
|
-
`)}`}function
|
|
231
|
-
`)}var Fs=D(()=>{});var
|
|
230
|
+
`)}`}function bd(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Vt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Vt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Vt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Vt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Vt(e,t,n,o){let r=t>0?(n-t)/t:0,s=o?r<-0.1:r>.1,i=r>0?"+":"";return `${e}: ${i}${(r*100).toFixed(1)}%${s?" (regression >10%)":""}`}var so=D(()=>{});var ao={};j(ao,{reportEvaluationCommand:()=>xd,runEvaluationCommand:()=>Dd});async function Dd(e){let t=getBenchmarkSuite(e.suite);if(!t)throw new Error(`Unknown evaluation suite "${e.suite}"`);let n=e.database??openGlobalDevFlowDatabase();try{if(e.suite.startsWith("agent:")){let i=`eval-waiting:${Date.now()}:${randomUUID().slice(0,8)}`,a=t.tasks.flatMap(c=>Array.from({length:e.trials},(l,u)=>n.requestHostAction({runId:i,engineRunId:i,stepId:`${c.id}:trial-${u+1}`,projectRoot:e.projectRoot})));return JSON.stringify({status:"waiting",runId:i,actionIds:a.map(c=>c.actionId)},null,2)}let o=Od(e.projectRoot),r=[];for(let i=0;i<e.trials;i+=1){let a=await new BenchmarkEngine().runSuite(e.projectRoot,t,{rounds:1});for(let c of a.tasks){let l=c.devflow.correctnessScore>=1,u={graderId:"retrieval_correctness",kind:"deterministic",status:l?"passed":"failed",score:c.devflow.correctnessScore,threshold:1,evidence:[{type:"matched_files",value:JSON.stringify(c.devflow.matchedFiles)},{type:"matched_symbols",value:JSON.stringify(c.devflow.matchedSymbols)}],reason:l?"All expected retrieval targets were selected.":"Expected retrieval targets were missing.",durationMs:c.devflow.durationMs,receipt:`grader:${zt(JSON.stringify(c)).slice(0,24)}`},p={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:zt(c.prompt),toolProfileHash:zt("benchmark-context-deep:r3.v1"),acceptanceHash:zt(JSON.stringify(t.tasks.find(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 xd(e){let t=e.database??openGlobalDevFlowDatabase();try{let n=t.getBenchmarkReport(e.runId);if(!n||!("k"in n)||!Array.isArray(n.trials))throw new Error(`Evaluation report "${e.runId}" not found`);return renderRepeatedTrialReport(n,e.output??"text")}finally{e.database||t.close();}}function Od(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function zt(e){return createHash("sha256").update(e).digest("hex")}var co=D(()=>{});var Ls={};j(Ls,{runReview:()=>jd});async function jd(e){let t,n;if(e.prUrl){let u=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${u?`#${u[1]}`:e.prUrl}`;try{t=execSync(`gh pr diff ${e.prUrl}`,{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t=`Could not fetch PR diff from ${e.prUrl}. Ensure 'gh' CLI is installed and authenticated.`;}}else {n="Current branch vs main";try{t=execSync("git diff main...HEAD",{encoding:"utf-8",maxBuffer:10*1024*1024});}catch{t="Could not compute diff. Ensure you're on a feature branch.";}}let o=(t.match(/^diff --git/gm)??[]).length,r=(t.match(/^\+[^+]/gm)??[]).length,s=(t.match(/^-[^-]/gm)??[]).length,i=[],a=[],c=[];return t.includes("console.log")&&a.push("Contains console.log statements \u2014 remove before merge"),(t.includes(".only(")||t.includes("it.only"))&&i.push("Contains .only() test filters \u2014 remove before merge"),(t.includes("TODO")||t.includes("FIXME"))&&a.push("Contains TODO/FIXME comments \u2014 track or resolve"),(t.match(/^\+.*TODO/gm)||t.match(/^\+.*FIXME/gm))&&a.push("New code introduces TODO/FIXME comments"),t.includes("process.exit")&&a.push("Contains process.exit() \u2014 consider throwing instead"),t.includes(": any")&&t.match(/^\+.*: any/gm)&&c.push("New code uses `any` type \u2014 use explicit types instead"),[S.blue("\u25C9 Code Review"),"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",n,`Files changed: ${o}`,`+${r} / -${s}`,"",i.length>0?S.red(`Critical (${i.length})`):"",...i.map(u=>` ${S.red("\u25CF")} ${u}`),"",a.length>0?S.yellow(`Warning (${a.length})`):"",...a.map(u=>` ${S.yellow("\u25CB")} ${u}`),"",c.length>0?S.green(`Suggestion (${c.length})`):"",...c.map(u=>` ${S.green("\u25CB")} ${u}`),"",i.length>0?S.red("Overall: Need changes"):a.length>0?S.yellow("Overall: Approve with comments"):S.green("Overall: LGTM")].join(`
|
|
231
|
+
`)}var Fs=D(()=>{});var wt={};j(wt,{resolveRuntimeLocale:()=>Ws,runtimeMessage:()=>X,runtimeMessages:()=>Hs});function Ws(e=process.env){return (e.DEVFLOW_LANG?.trim()||Intl.DateTimeFormat().resolvedOptions().locale).toLowerCase().startsWith("zh")?"zh":"en"}function X(e,t={},n){return Hs[Ws(n)][e].replace(/\{(\w+)\}/gu,(o,r)=>String(t[r]??`{${r}}`))}var Hs,De=D(()=>{Hs={en:{starting:"Starting the DevFlow Runtime...",ready:"Dashboard ready at {url}",reused:"Reused the existing DevFlow Runtime.",stopped:"DevFlow Runtime stopped.",notRunning:"No DevFlow Runtime is running.",portInUse:"Port {port} is already in use.",bundleMissing:"The Dashboard bundle is missing from this installation.",projectRequired:"Choose a project with --project <path>.",ownerMismatch:"Runtime ownership could not be verified; no process was stopped.",runtimeFailed:"DevFlow Runtime could not be started: {message}",openingFailed:"The Dashboard is ready, but the browser could not be opened: {message}",running:"DevFlow Runtime is running at {url} (PID {pid}, generation {generation}).",statusHeader:"DevFlow Status",dashboardUnavailable:"Dashboard is unavailable ({status})."},zh:{starting:"\u6B63\u5728\u542F\u52A8 DevFlow \u8FD0\u884C\u65F6...",ready:"Dashboard \u5DF2\u5C31\u7EEA\uFF1A{url}",reused:"\u5DF2\u590D\u7528\u73B0\u6709 DevFlow \u8FD0\u884C\u65F6\u3002",stopped:"DevFlow \u8FD0\u884C\u65F6\u5DF2\u505C\u6B62\u3002",notRunning:"\u5F53\u524D\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684 DevFlow \u8FD0\u884C\u65F6\u3002",portInUse:"\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\u3002",bundleMissing:"\u5F53\u524D\u5B89\u88C5\u5305\u4E2D\u7F3A\u5C11 Dashboard \u9759\u6001\u8D44\u6E90\u3002",projectRequired:"\u8BF7\u4F7F\u7528 --project <path> \u9009\u62E9\u9879\u76EE\u3002",ownerMismatch:"\u65E0\u6CD5\u9A8C\u8BC1\u8FD0\u884C\u65F6\u5F52\u5C5E\uFF0C\u672A\u505C\u6B62\u4EFB\u4F55\u8FDB\u7A0B\u3002",runtimeFailed:"DevFlow \u8FD0\u884C\u65F6\u65E0\u6CD5\u542F\u52A8\uFF1A{message}",openingFailed:"Dashboard \u5DF2\u5C31\u7EEA\uFF0C\u4F46\u65E0\u6CD5\u6253\u5F00\u6D4F\u89C8\u5668\uFF1A{message}",running:"DevFlow \u8FD0\u884C\u65F6\u6B63\u5728 {url} \u8FD0\u884C\uFF08PID {pid}\uFF0C\u4EE3\u6B21 {generation}\uFF09\u3002",statusHeader:"DevFlow \u72B6\u6001",dashboardUnavailable:"Dashboard \u4E0D\u53EF\u7528\uFF08{status}\uFF09\u3002"}};});var Us={};j(Us,{startAll:()=>Ad});async function Ad(e){let t=e.projectRoot??process.cwd();console.log(S.blue(X("starting")));let n=await en({port:e.port,projectRoot:t,explicitPort:e.explicitPort});console.log(S.green(X("ready",{url:n.state.url}))),n.reused&&console.log(S.dim(X("reused"))),!e.background&&await new Promise(o=>{let r=false,s=async()=>{if(r)return;r=true,process.off("SIGINT",s),process.off("SIGTERM",s);let i=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 qs=D(()=>{re();De();});var Ks={};j(Ks,{stopAll:()=>Nd});async function Nd(){let e=await tn();console.log(e?S.green(X("stopped")):S.dim(X("notRunning")));}var Js=D(()=>{re();De();});var Vs={};j(Vs,{showStatus:()=>Fd});function Ld(e){if(!existsSync(e))return false;try{let t=new DatabaseSync(e,{readOnly:!0});try{return !!t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' LIMIT 1").get()}finally{t.close();}}catch{return true}}async function Fd(e={}){let t=await et(),n=e.projectRoot??process.cwd();if(e.json){console.log(JSON.stringify({runtime:t.state??null,running:t.running,project:{root:n,initialized:existsSync(join(n,".devflow"))}}));return}if(console.log(S.blue(X("statusHeader"))),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.running){let u=t.state;console.log(S.green(X("running",{url:u.url,pid:u.pid,generation:u.generation})));}else console.log(S.yellow(X(t.state?"dashboardUnavailable":"notRunning",{status:t.state?.status??"stopped"})));let o=homedir$1(),r=xe(o),s=r.root?ot(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]:[],...Ld(c)?[`${c} (devflow_* tables)`]:[]];l.length>0?console.log(`Legacy: ${S.yellow(l.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var zs=D(()=>{re();Ke();De();});var Gs={};j(Gs,{setupCommand:()=>Yd});function Jd(){try{return xt()}catch{return}}function Vd(e){try{return Kd.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs")}catch{let t=join$1(e,"node_modules","@devflow-tools","mcp-server","bin","devflow-mcp.cjs");return existsSync$1(t)?t:void 0}}function zd(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 Gd(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 Yd(e){console.log(S.blue("DevFlow Setup")),console.log(S.dim("--------------"));let t=createDefaultHostAdapterRegistry(),n={projectRoot:process.cwd(),homeDir:homedir$1(),env:process.env,explicitHost:e.agent},o=await t.select(n);if(o.status==="failed")return console.log(S.red(` x Host selection failed: ${o.reason}`)),console.log(S.dim(` ${o.action}`)),process.exitCode=1,{status:"failed",failure:o,projections:[]};let r=o.adapter,s=[];if(console.log(S.dim(` Host: ${r.id}${o.explicit?" (explicit)":" (detected)"}`)),!e.skipMcp){let l=Vd(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=Jd();if(r.id==="claude-code"&&l)try{let u=zd(l),p=join$1(n.homeDir,".claude","plugins","cache");Ot(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)Gd(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 Kd,Ys=D(()=>{Ke();Kd=createRequire$1(import.meta.url);});var Zs={};j(Zs,{pluginListCommand:()=>Qd});var Qd,Qs=D(()=>{jt();Qd=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=je();if(e.installed){let n=Ko();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
232
232
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
233
233
|
`),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`)):console.log(` ${S.green(o)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
|
|
234
234
|
`);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${S.green(o.name)}${r}v${o.version}`),console.log(` ${" ".repeat(n)}${o.description.substring(0,60)}`),o.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${o.tags.join(", ")}`),console.log("");}),console.log(`
|
|
235
|
-
Install a plugin: devflow plugin install <name>`);}});});var Xs={};j(Xs,{pluginSearchCommand:()=>
|
|
235
|
+
Install a plugin: devflow plugin install <name>`);}});});var Xs={};j(Xs,{pluginSearchCommand:()=>tg});var tg,ei=D(()=>{jt();tg=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=je(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
|
|
236
236
|
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
237
|
-
`),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var ni={};j(ni,{pluginInstallCommand:()=>
|
|
237
|
+
`),o.forEach(r=>{console.log(` ${S.green(r.name)}@${r.version}`),console.log(` ${r.description}`),r.tags.length>0&&console.log(` Tags: ${r.tags.join(", ")}`),console.log(` Size: ${r.size}`),console.log("");});});});var ni={};j(ni,{pluginInstallCommand:()=>og});var og,oi=D(()=>{_e();og=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await Ae(n,process.cwd(),!0);console.log(`
|
|
238
238
|
${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
|
|
239
239
|
Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
|
|
240
|
-
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var si={};j(si,{pluginUninstallCommand:()=>
|
|
240
|
+
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var si={};j(si,{pluginUninstallCommand:()=>sg});var sg,ii=D(()=>{_e();sg=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 gn(n,process.cwd(),!0),console.log(`
|
|
241
241
|
${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
|
|
242
|
-
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Xt(e){let t=join(e,".devflow","config.json");if(existsSync(t))try{let n=readFileSync(t,"utf-8");if(JSON.parse(n).serverUrl)return "server"}catch{}return "local"}var ai=createRequire(import.meta.url),mo="0.0.0";try{mo=ai("../package.json").version;}catch{try{mo=ai("../../package.json").version;}catch{}}var E=new Command,
|
|
243
|
-
`));}let n=Xt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Uo(),Wo)),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 config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(Bo(),qo)),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(()=>(yr(),hr));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var dg=E.command("db").description("Manage DevFlow databases");dg.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(()=>(Cr(),Pr)),o=t(e);for(let r of n(o))console.log(r);});E.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=Xt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(xr(),Dr));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(()=>(Ar(),jr)),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(()=>($r(),Nr)),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 Qt=E.command("workflow").description("Workflow management");Qt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(gt(),dt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No workflows registered."));return}for(let n of t)console.log(`${S.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var _t=E.command("workers").description("Inspect and safely control isolated workflow workers").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON");_t.command("list").description("List project workers").action(async(e,t)=>{let n=t.parent?.opts()??{},{listWorkers:o}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(o({projectRoot:n.project,json:n.json}));});_t.command("show <id>").description("Show worker lifecycle and merge evidence").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{showWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("cancel <id>").description("Request bounded worker cancellation").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{cancelWorker:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("retry-cleanup <id>").description("Retry conservative cleanup for a terminal or held worker").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{retryWorkerCleanup:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});_t.command("merge-status <id>").description("Show the worker merge gate state").action(async(e,t,n)=>{let o=n.parent?.opts()??{},{workerMergeStatus:r}=await Promise.resolve().then(()=>(Qe(),Ze));console.log(r(e,{projectRoot:o.project,json:o.json}));});Qt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(gt(),dt)),o=await n(e,{input:t??""},E.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Qt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(gt(),dt)),t=await e(E.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Qt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(gt(),dt)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${S.yellow(n.status)} ${o}`);}});var ci=E.command("embeddings").description("Manage the shared verified embedding model");ci.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(xn(),Dn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});ci.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(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(()=>(Fr(),Lr)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fo=E.command("docs").description("Documentation index management");fo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
|
|
242
|
+
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Xt(e){let t=join(e,".devflow","config.json");if(existsSync(t))try{let n=readFileSync(t,"utf-8");if(JSON.parse(n).serverUrl)return "server"}catch{}return "local"}var ai=createRequire(import.meta.url),mo="0.0.0";try{mo=ai("../package.json").version;}catch{try{mo=ai("../../package.json").version;}catch{}}var E=new Command,lg=await Promise.resolve().then(()=>(_o(),So));E.addCommand(lg.createDefaultDeliveryCommand());function ug(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(mo).option("--local","Force local engine, skip server");var dg=E.command("logs").description("Inspect and clean diagnostic logs");dg.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(()=>(Co(),Po)),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=po.join(t,a);Zt.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Zt.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
|
|
243
|
+
`));}let n=Xt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Uo(),Wo)),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 config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(Bo(),qo)),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(()=>(yr(),hr));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var gg=E.command("db").description("Manage DevFlow databases");gg.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(()=>(Cr(),Pr)),o=t(e);for(let r of n(o))console.log(r);});E.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),o=Xt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(xr(),Dr));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(()=>(Ar(),jr)),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(()=>($r(),Nr)),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 Qt=E.command("workflow").description("Workflow management");Qt.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(()=>(Ze(),Ye));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(()=>(Ze(),Ye));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(()=>(Ze(),Ye));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(()=>(Ze(),Ye));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(()=>(Ze(),Ye));console.log(r(e,{projectRoot:o.project,json:o.json}));});Qt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(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`);});Qt.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}`);});Qt.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 ci=E.command("embeddings").description("Manage the shared verified embedding model");ci.command("status").description("Inspect the shared embedding model without network access").option("--json","Output JSON").action(async e=>{let{getEmbeddingStatus:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(xn(),Dn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});ci.command("prepare").description("Prepare and verify the shared embedding model").option("--endpoint <url>","Preferred model endpoint (repeatable)",(e,t)=>[...t,e],[]).option("--timeout-ms <milliseconds>","Per-file download timeout","60000").option("--json","Output JSON").action(async e=>{try{let{prepareEmbeddings:t,renderEmbeddingStatus:n}=await Promise.resolve().then(()=>(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(()=>(Fr(),Lr)),o=(await t(e,void 0,void 0,E.opts().local)).results;console.log(S.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var fo=E.command("docs").description("Documentation index management");fo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
|
|
244
244
|
${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${S.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${S.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(S.green(`
|
|
245
|
-
All docs synced.`));}});fo.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>(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 Rt=E.command("skill").description("Plugin/Skill management");Rt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(_e(),it)),t=await e(E.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});Rt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(_e(),it)),n=await t(e,E.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});Rt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(_e(),it)),n=await t(e,process.cwd(),E.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Rt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(_e(),it));await t(e,process.cwd(),E.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Rt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(Mn(),Wr));process.exitCode=t(e);});var li=E.command("mcp").description("Inspect MCP configuration and health");li.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(Fn(),Ln));await t(e);});li.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(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(()=>(Ds(),Cs));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});We.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(Os(),xs));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(As(),js)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ui=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ui.command("run").description("Run a benchmark suite and persist the report").option("--suite <id>","Benchmark suite","default").option("--project <root>","Initialized project root",process.cwd()).option("--rounds <n>","Rounds per task","1").option("--output <format>","text | json","text").action(async e=>{let{runBenchmarkCommand:t}=await Promise.resolve().then(()=>(so(),ro));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var di=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");di.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(co(),ao));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});di.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(co(),ao));console.log(t({runId:e.run,output:e.json?"json":"text"}));});ui.command("report").description("Render a persisted benchmark report").option("--run-id <id>","Specific report; defaults to latest").option("--baseline <id>","Prior report used for regression comparison").option("--output <format>","text | json | markdown","text").action(async e=>{let{reportBenchmarkCommand:t}=await Promise.resolve().then(()=>(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(()=>(Fs(),Ls)),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(),nt)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),bt));console.log(S.blue(o("starting")));let r=await n({port:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli"});console.log(S.green(o("ready",{url:r.state.url}))),r.reused&&console.log(S.dim(o("reused")));});ho.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(re(),nt)),{runtimeMessage:t}=await Promise.resolve().then(()=>(De(),bt)),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(),nt)),{runtimeMessage:t}=await Promise.resolve().then(()=>(De(),bt)),n=await e();n.running&&n.state?console.log(S.green(t("running",{url:n.state.url,pid:n.state.pid,generation:n.state.generation}))):console.log(S.yellow(t(n.state?"dashboardUnavailable":"notRunning",{status:n.state?.status??"stopped"})));});E.command("dashboard").description("Open DevFlow Dashboard").option("--open","Open the ready Dashboard URL in the default browser").option("--no-start","Return an error when no ready runtime exists").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).option("--port <n>","Runtime port").action(async(e,t)=>{let{ensureCliRuntime:n}=await Promise.resolve().then(()=>(re(),nt)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),bt)),r=po.resolve(e.project);if(!Zt.existsSync(r)||!Zt.statSync(r).isDirectory())throw new Error(o("projectRequired"));let s=await n({reason:"cli-dashboard",projectRoot:r,port:e.port===void 0?void 0:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli",noStart:e.start===false}),i={url:s.state.url,projectId:s.projectId,runtime:s.state,reused:s.reused};if(e.json?console.log(JSON.stringify(i)):(console.log(S.green(o("ready",{url:s.state.url}))),s.reused&&console.log(S.dim(o("reused")))),e.open)try{await lg(s.state.url);}catch(a){console.error(S.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(qs(),Us));await n({port:Number(e.port),background:!!e.background,explicitPort:t.getOptionValueSource("port")==="cli"});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Js(),Ks));await e();});E.command("status").description("Show DevFlow services status").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).action(async e=>{let{showStatus:t}=await Promise.resolve().then(()=>(zs(),Vs));await t({json:!!e.json,projectRoot: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(()=>(Ys(),Gs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=E.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Qs(),Zs)),Promise.resolve().then(()=>(ei(),Xs)),Promise.resolve().then(()=>(oi(),ni)),Promise.resolve().then(()=>(ii(),si))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await E.parseAsync();
|
|
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(),Wr));process.exitCode=t(e);});var li=E.command("mcp").description("Inspect MCP configuration and health");li.command("inventory").description("Show normalized MCP server inventory").option("--project <path>","Project directory",process.cwd()).option("--json","Output JSON").action(async e=>{let{showMcpInventory:t}=await Promise.resolve().then(()=>(Fn(),Ln));await t(e);});li.command("health").description("Check or show cached MCP server health").option("--project <path>","Project directory",process.cwd()).option("--refresh","Refresh health checks").option("--json","Output JSON").action(async e=>{let{showMcpHealth:t}=await Promise.resolve().then(()=>(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(()=>(Ds(),Cs));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});We.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(Os(),xs));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});E.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(As(),js)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ui=E.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ui.command("run").description("Run a benchmark suite and persist the report").option("--suite <id>","Benchmark suite","default").option("--project <root>","Initialized project root",process.cwd()).option("--rounds <n>","Rounds per task","1").option("--output <format>","text | json","text").action(async e=>{let{runBenchmarkCommand:t}=await Promise.resolve().then(()=>(so(),ro));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var di=E.command("eval").description("Run and inspect evidence-bound repeated evaluations");di.command("run").requiredOption("--suite <id>","Evaluation suite").option("--project <root>","Initialized project root",process.cwd()).option("--trials <count>","Independent trials: 1 or 3","3").option("--output <format>","text | json","text").action(async e=>{let t=Number.parseInt(e.trials,10);if(t!==1&&t!==3)throw new Error("Evaluation trials must be 1 or 3");let{runEvaluationCommand:n}=await Promise.resolve().then(()=>(co(),ao));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});di.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(co(),ao));console.log(t({runId:e.run,output:e.json?"json":"text"}));});ui.command("report").description("Render a persisted benchmark report").option("--run-id <id>","Specific report; defaults to latest").option("--baseline <id>","Prior report used for regression comparison").option("--output <format>","text | json | markdown","text").action(async e=>{let{reportBenchmarkCommand:t}=await Promise.resolve().then(()=>(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(()=>(Fs(),Ls)),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(),tt)),{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(),tt)),{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(),tt)),{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(),tt)),{runtimeMessage:o}=await Promise.resolve().then(()=>(De(),wt)),r=po.resolve(e.project);if(!Zt.existsSync(r)||!Zt.statSync(r).isDirectory())throw new Error(o("projectRequired"));let s=await n({reason:"cli-dashboard",projectRoot:r,port:e.port===void 0?void 0:Number(e.port),explicitPort:t.getOptionValueSource("port")==="cli",noStart:e.start===false}),i={url:s.state.url,projectId:s.projectId,runtime:s.state,reused:s.reused};if(e.json?console.log(JSON.stringify(i)):(console.log(S.green(o("ready",{url:s.state.url}))),s.reused&&console.log(S.dim(o("reused")))),e.open)try{await ug(s.state.url);}catch(a){console.error(S.yellow(o("openingFailed",{message:a instanceof Error?a.message:String(a)})));}});E.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async(e,t)=>{let{startAll:n}=await Promise.resolve().then(()=>(qs(),Us));await n({port:Number(e.port),background:!!e.background,explicitPort:t.getOptionValueSource("port")==="cli"});});E.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Js(),Ks));await e();});E.command("status").description("Show DevFlow services status").option("--json","Print a stable JSON result").option("--project <path>","Project root",process.cwd()).action(async e=>{let{showStatus:t}=await Promise.resolve().then(()=>(zs(),Vs));await t({json:!!e.json,projectRoot: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(()=>(Ys(),Gs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=E.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Qs(),Zs)),Promise.resolve().then(()=>(ei(),Xs)),Promise.resolve().then(()=>(oi(),ni)),Promise.resolve().then(()=>(ii(),si))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await E.parseAsync();
|