@devflow-tools/devflow 0.18.0 → 0.18.1
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 +69 -68
- 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/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/hooks/hook-daemon.js +23 -23
- package/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/hooks/post-tool-use.js +6 -6
- package/dist/hooks/pre-compact.js +3 -3
- package/dist/hooks/pre-tool-use.js +4 -4
- package/dist/hooks/session-end.js +5 -5
- package/dist/hooks/stop.js +9 -9
- package/dist/hooks/user-prompt-submit.js +7 -7
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/dist/command-registry.json +5 -5
- package/dist/plugin/dist/hooks/hook-daemon.js +23 -23
- package/dist/plugin/dist/hooks/post-tool-use-failure.js +2 -2
- package/dist/plugin/dist/hooks/post-tool-use.js +6 -6
- package/dist/plugin/dist/hooks/pre-compact.js +3 -3
- package/dist/plugin/dist/hooks/pre-tool-use.js +4 -4
- package/dist/plugin/dist/hooks/session-end.js +5 -5
- package/dist/plugin/dist/hooks/stop.js +9 -9
- package/dist/plugin/dist/hooks/user-prompt-submit.js +7 -7
- package/dist/plugin/package.json +13 -13
- package/package.json +15 -15
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{vYfa_ZByuhX4CBoOEYkDT → 6CYD-iPy8AJdBNyzj3USk}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{vYfa_ZByuhX4CBoOEYkDT → 6CYD-iPy8AJdBNyzj3USk}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,49 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,resolveStableProjectIdentity,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,getDaemonRegistryPath,getDevFlowStateRoot,getProjectStateDir,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import {LogCleanupService}from'@devflow-tools/telemetry';import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,readdirSync,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {randomUUID,createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {fileURLToPath}from'node:url';import {loadPlugins,getPluginInstallRoot,resolveProjectCapabilityProfile,stableRuntimeHash,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,resolveStableProjectIdentity,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,getProjectHash,getDaemonSocketPath,getDaemonRegistryPath,getDevFlowStateRoot,getProjectStateDir,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,getLocalApiKey,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import ti,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Qd,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import Do 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 {spawn,execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import {projectDiagnosticCodeResult,getDiagnosticMemoryResult,getDiagnosticKnowledgeResult}from'@devflow-tools/mcp-server/retrieval';import _c from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {execFileSync,spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport,createTrialReceipt,aggregateRepeatedTrials,renderRepeatedTrialReport}from'@devflow-tools/benchmark';import {Command}from'commander';var ci=Object.defineProperty;var O=(e,t)=>()=>(e&&(t=e(e=0)),t);var $=(e,t)=>{for(var n in t)ci(e,n,{get:t[n],enumerable:true});};var vo={};$(vo,{renderLogCleanupResult:()=>mi,runLogsCleanupCommand:()=>fi});function ho(e,t){if(e!==void 0){if(!Number.isSafeInteger(e)||e<=0)throw new Error(`${t} must be a positive integer`);return e}}function fi(e){let t=e.execute?"execute":"dry-run";return {...new LogCleanupService().cleanup({projectRoot:e.projectRoot,trigger:"manual",mode:t,olderThanDays:ho(e.olderThanDays,"older-than"),maxBytes:ho(e.maxBytes,"max-bytes"),globalStateRoot:e.globalStateRoot}),mode:t}}function yo(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KiB`:`${(e/(1024*1024)).toFixed(1)} MiB`}function mi(e){return [`Diagnostic log cleanup (${e.mode})`,` Scanned: ${e.scannedFiles}`,` ${e.mode==="dry-run"?"Candidates":"Deleted"}: ${e.deletedFiles}`,` Rotated: ${e.rotatedFiles}`,` Released: ${yo(e.deletedBytes)}`,` Remaining: ${yo(e.remainingBytes)}`,` Skipped: ${e.skippedFiles}`,` Failures: ${e.failureCount}`].join(`
|
|
3
|
+
`)}var ko=O(()=>{});function Dt(){let e=dirname(fileURLToPath(import.meta.url)),t=[join$1(e,"..","plugin-files"),join$1(e,"plugin"),join$1(e,"..","..","dist","plugin-files"),join$1(e,"..","..","..","..","plugins","claude-code")];for(let n of t)if(existsSync$1(join$1(n,".claude-plugin","plugin.json")))return n;throw new Error("Plugin files not found. Run `npm run build` first.")}function Ce(e=homedir$1(),t={}){let n=t.installedPluginsPath??join$1(e,".claude","plugins","installed_plugins.json"),o=t.pluginCachePath??join$1(e,".claude","plugins","cache");for(let i of Ei)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!de(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:wo(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,tn);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:wo(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 et(e,t){let n=Ri(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=_o(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=en(c.content),g=readFileSync$1(l,"utf-8"),d=en(g);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:d,isKnownDevFlowArtifact:u===d});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function So(e,t,n,o=Date.now,r={}){let s=et(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()||en(readFileSync$1(c.globalPath,"utf-8"))!==c.globalHash)continue;let l=join$1(i,c.skillName.replaceAll("/","_"),"SKILL.md");mkdirSync$1(dirname(l),{recursive:true});try{renameSync(c.globalPath,l);}catch{continue}try{rmSync(dirname(c.globalPath),{recursive:!1,force:!1});}catch{}a.push({skillName:c.skillName,originalPath:c.globalPath,backupPath:l,hash:c.globalHash,pluginHash:c.pluginHash,contentChanged:!c.isKnownDevFlowArtifact,version:n});}return a.length>0&&writeFileSync$1(join$1(i,"manifest.json"),`${JSON.stringify({version:1,migratedAt:new Date(o()).toISOString(),skills:a},null,2)}
|
|
4
|
+
`,"utf-8"),a}function Ri(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=_o(r);s&&t.set(s.name,r);}return t}function _o(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 en(e){return createHash("sha256").update(e).digest("hex")}function wo(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 Eo(e){let t={};if(existsSync$1(e))try{t=JSON.parse(readFileSync$1(e,"utf-8"));}catch{console.warn("Warning: Could not parse settings.json, skipping plugin enablement");return}else mkdirSync$1(dirname(e),{recursive:true});let n=de(t.enabledPlugins)?t.enabledPlugins:{};n[Et]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",He),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[He]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
|
|
5
|
+
`);}function Ro(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,He,tn,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&Rt(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)&&Rt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&Rt(a,join$1(o,"skills")),Di(o,e),Oi(o),Pi(t,o),Ci(t,o,n);}function Pi(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",He),r=join$1(o,".claude-plugin");mkdirSync$1(r,{recursive:true});let s=relative(o,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(r,"marketplace.json"),`${JSON.stringify({name:He,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:tn,source:s}]},null,2)}
|
|
5
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(!de(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[He]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
6
|
-
`);}function
|
|
7
|
-
`);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function
|
|
8
|
-
`)}var
|
|
9
|
-
`,"utf-8"),renameSync$1(o,n);}async function
|
|
7
|
+
`);}function Ci(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let m;try{m=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!de(m))throw new Error(`Invalid Claude plugin registry: ${o}`);r=m;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Et];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Et}`);let c=a??[],l=c.find(m=>de(m)&&m.scope==="user"),u=new Date().toISOString(),g=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,d=c.filter(m=>!de(m)||m.scope!=="user");i[Et]=[...d,{scope:"user",installPath:t,version:n,installedAt:g,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
|
|
8
|
+
`);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Di(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 Rt(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()?Rt(o,r):cpSync(o,r,{force:true});}}function Oi(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 Et,He,tn,Ei,Be=O(()=>{Et="devflow@devflow-local",He="devflow-local",tn="devflow",Ei=["devflow@devflow-local","devflow@devflow"];});var $o={};$($o,{initProject:()=>Ii,renderInitReport:()=>xo});async function Ii(e,t={}){let n=join(e,".devflow"),o=[];existsSync(n)||(mkdirSync(n,{recursive:true}),o.push(".devflow/"));let r=join(n,"config.json");(!existsSync(r)||t.force)&&(writeFileSync(r,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),o.push(".devflow/config.json"));let s={created:o,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false,migratedLegacySkills:[]};if(Oo.isInitialized(e)||await Oo.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:l,imports:u}=await i.indexAll(e),g=await a.build(l,u);s.indexed={files:c.length,symbols:l.length,graphNodes:g.nodes.length};}catch{s.indexed={files:0,symbols:0,graphNodes:0};}if(t.scan!==false)try{let i=await new OnboardingPackBuilder().build(e);o.push(".devflow/onboarding-pack.json");let a=join(n,"init-report.md");writeFileSync(a,xo(i),"utf-8"),o.push(".devflow/init-report.md"),s.onboardingPack=i;}catch(i){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${i.message}`);}try{let i=Dt(),a=homedir(),c=join(a,".claude","plugins","cache"),l=join(i,"package.json"),u=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";Ot(i,c,u),s.pluginDeployed=!0;let g=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=So(a,g,u,Date.now,{includeModified:t.migrateLegacySkills}).map(d=>d.skillName);}catch(d){console.warn(`Warning: Legacy skill migration skipped \u2014 ${d.message}`);}}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");Eo(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Ti.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}Ro(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function xo(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 Oo,Ti,Ao=O(()=>{Be();Oo=Do.default??Do,Ti=createRequire(import.meta.url);});var No={};$(No,{reviewPluginMemoryHints:()=>Hi});async function Hi(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Wi).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 g=s.get(u);for(let d of g?.memory?.project?.conventions??[])i.push({id:`${u}:${d.key}`,pluginName:u,convention:d});}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??Ui)(e,l),{available:i.length,selected:l.length}}function Wi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ui(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 jo=O(()=>{});function Oe(){let e=[join(process.cwd(),"plugin-registry.json"),join(Vi,"../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 To(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var zi,Vi,xt=O(()=>{zi=fileURLToPath$1(import.meta.url),Vi=dirname$1(zi);});async function j(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url,s=na(r);if(o.skipServer)return n();let i=false,a=Mo.get(r);if(a&&Date.now()-a.ts<ta?i=a.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(i=await new DevFlowApiClient({baseUrl:r,projectRoot:e,apiKey:s}).ping(),i?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),Mo.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 na(e){let t=process.env.DEVFLOW_API_KEY?.trim();if(t)return t;try{let n=new URL(e).hostname.toLocaleLowerCase("en-US");if(n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]")return getLocalApiKey()}catch{}}var Mo,ta,we=O(()=>{Mo=new Map,ta=3e4;});var Fo=O(()=>{});var nt={};$(nt,{installSkill:()=>xe,listSkills:()=>Ko,listSkillsSync:()=>ca,searchSkills:()=>la,uninstallSkill:()=>cn});async function Ko(e){return j(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 ca(){return []}async function la(e,t){let n=await Ko(),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 Jo(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 zo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function Vo(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 xe(e,t=process.cwd(),n){return j(t,async o=>await o.installPlugin(e),async()=>{let o=Jo(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(tt,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",tt,o],{stdio:"pipe",timeout:6e4});let a=zo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),Vo(t,a));let c=[],l="0.0.0",u=join(tt,"node_modules",...o.split("/"));try{let g=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=g?.devflow?.templates??[],l=typeof g.version=="string"?g.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 g=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(g){let d={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&g.onUpdate?await g.onUpdate(d,i.version):!i&&g.onInstall&&await g.onInstall(d);}}catch(g){let m=readPluginInstallState().plugins[o];throw m&&(m.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:g.message},upsertPluginInstallRecord(m)),new Error(`Plugin lifecycle failed: ${g.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function cn(e,t=process.cwd(),n){return j(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Jo(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=zo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),Vo(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",tt,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(tt,"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 tt,be=O(()=>{we();Fo();tt=getPluginInstallRoot();});var ln={};$(ln,{detectTechStack:()=>da,guidePluginInstallation:()=>fa,installPluginsFromList:()=>ga,resolvePluginName:()=>Yo});function da(e){let t=Oe();return resolveProjectCapabilityProfile(e,{registry:t}).detectedStacks}function Yo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function ga(e){let t=e.split(",").map(Yo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await xe(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function fa(e){let t=Oe();if(t.plugins.length===0)return console.log(`
|
|
10
11
|
No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
11
12
|
`),[];console.log(`
|
|
12
13
|
\u{1F50C} Plugin Installation Guide
|
|
13
14
|
`);let n=resolveProjectCapabilityProfile(e,{registry:t}),o=n.detectedStacks;o.length>0&&console.log(`Detected tech stack: ${o.join(", ")}
|
|
14
15
|
`);let r=new Set(n.selectedPlugins);if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
|
|
15
|
-
`);let a=[...r];for(let c of a)try{await
|
|
16
|
+
`);let a=[...r];for(let c of a)try{await xe(c,e,!0),console.log(`\u2713 ${c}`);}catch{console.error(`\u2717 Failed to install ${c}`);}return a}let s=t.plugins.map(a=>({name:`${a.name.replace("@devflow-tools/","")} - ${a.description.substring(0,50)}`,value:a.name,checked:r.has(a.name)})),i;try{i=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:s});}catch{return console.log(`
|
|
16
17
|
Plugin installation cancelled.
|
|
17
18
|
`),[]}if(i.length>0){console.log(`
|
|
18
19
|
Installing selected plugins...
|
|
19
|
-
`);for(let a of i)try{await
|
|
20
|
+
`);for(let a of i)try{await xe(a,e,!0),console.log(`\u2713 ${a}
|
|
20
21
|
`);}catch{console.error(`\u2717 Failed to install ${a}
|
|
21
22
|
`);}}else console.log(`
|
|
22
23
|
Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
23
|
-
`);return i}var un
|
|
24
|
+
`);return i}var un=O(()=>{xt();be();});var ar={};$(ar,{ResetExecutionError:()=>ot,executeResetCommand:()=>Ta,formatResetResult:()=>pn,runReset:()=>ir});function Pa(){if($t)return $t;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return $t=e.DatabaseSync,$t}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function pn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Ca(e){return e==="all"||nr.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function gn(e){let t=resolve(e),n=[];for(;!se(t);){let o=dirname(t);if(o===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=o;}return resolve(realpathSync(t),...n)}function hn(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Da(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 or(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=se(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(se(t)){let o=realpathSync(t);if(!hn(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Oa(e,t){return (e==="all"?nr:[e]).map(o=>({scope:o,path:join$1(t,...tr[o])}))}function rr(e,t){let n=se(t);if(n)return or(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function sr(e,t){let n=rr(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 xa(e){let t=se(e);if(!t?.isFile()||t.size<dn.length)return false;let n=Buffer.alloc(dn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(dn)}finally{closeSync(o);}}function $a(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}xa(o)&&t.push(o);}}return n(e),t}function Aa(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Pa())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Na(e,t,n){let o=$a(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));Aa(s,i);}}function ja(e,t,n,o,r){let s=!!se(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)r.beforeBackup(c.path),Na(c.path,join$1(i,c.scope),()=>sr(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(se(u))throw new Error(`Backup destination already exists: ${u}`);r.renamePath(l,u),a.push(u),o.backedUp.push({source:c.path,destination:u});}}catch(c){for(let l of a.reverse())rmSync(l,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&se(t))try{rmdirSync(t);}catch{}}}function ir(e,t={}){if(!Ca(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Da(e.project??process.cwd()),o=Oa(e.scope,n);for(let c of o)or(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=rr(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?gn(e.backupTo):void 0;if(s){let c=se(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=gn(l.path),g=join$1(s,l.scope),d=gn(g);if(hn(u,d)||hn(d,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${d}`);if(se(g))throw new Error(`Backup destination already exists: ${g}`)}}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&&ja(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),sr(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new ot(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Ta(e,t={},n=console){try{let o=ir(e,t),r=pn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof ot)for(let r of pn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var $t,ot,tr,nr,dn,cr=O(()=>{ot=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};tr={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},nr=Object.keys(tr),dn=Buffer.from("SQLite format 3\0","binary");});var yr={};$(yr,{consolidateDatabases:()=>Fa,formatConsolidateResult:()=>Ha});function Fa(e){let t=resolve(e.project),n=e.globalDbPath??getGlobalDevFlowDbPath(),o=join$1(t,".devflow","devflow.db"),r=join$1(t,".codegraph","codegraph.db");if(resolve(n)===resolve(o))throw new Error("The global target database cannot be the project-local legacy database");let s=existsSync$1(n),i=[ur("project",o,s?n:void 0),ur("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(m=>m.exists&&Object.keys(m.tables).length>0),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),g=join$1(e.backupRoot??u,l);mkdirSync$1(g,{recursive:true}),a.backupDir=g;let d=c.some(m=>m.kind==="project")?Wa(o):null;try{let m=new Map;for(let y of c){let v=join$1(g,`${y.kind}-${basename(y.path)}.snapshot`);dr(y.path,v),m.set(y.kind,v);}s&&dr(n,join$1(g,"global-devflow.db.before"));let f=m.has("project")?Ba(o,g):[];a.retired.push(...f.map(y=>y.destination));let p=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),m.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(m.get("project")),m.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),h=!0,m.has("project")&&gr(p,"project_source",void 0,a.inserted),m.has("codegraph")){gr(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of it(p,"codegraph_source").filter(E=>E.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${H(v)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw hr(f),y}finally{p?.close();}return a}finally{Ua(d);}}function Ha(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 ur(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 it(r).filter(c=>!i||i.has(c)))o.tables[a]=wn(r,a),o.conflicts[a]=s&&it(s).includes(a)?qa(r,s,a):0;}finally{r.close(),s?.close();}return o}function dr(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new DatabaseSync(e,{readOnly:true,timeout:1e4});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Wa(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 Ua(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Ba(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 hr(n),o}return n}function hr(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function gr(e,t,n,o){let r=new Set(it(e)),s=it(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Nt(e,"main",i),c=new Set(Nt(e,t,i).map(f=>f.name)),l=a.filter(f=>c.has(f.name));if(kn.has(i)&&(l=l.filter(f=>f.pk===0)),l.length===0)continue;let u=wn(e,i),g=l.map(f=>H(f.name)).join(", "),d=l.map(f=>`s.${H(f.name)}`).join(", ");if(l.filter(f=>f.pk>0).length>0&&!kn.has(i))e.exec(`INSERT OR IGNORE INTO main.${H(i)} (${g}) SELECT ${d} FROM ${H(t)}.${H(i)} s`);else {let f=l.map(p=>`t.${H(p.name)} IS s.${H(p.name)}`).join(" AND ");e.exec(`
|
|
24
25
|
INSERT INTO main.${H(i)} (${g})
|
|
25
26
|
SELECT ${d} FROM ${H(t)}.${H(i)} s
|
|
26
27
|
WHERE NOT EXISTS (SELECT 1 FROM main.${H(i)} t WHERE ${f})
|
|
27
|
-
`);}o[i]=(o[i]??0)+(wn(e,i)-u);}}function
|
|
28
|
-
`)}return JSON.stringify(t,null,2)}function
|
|
29
|
-
`)}var Rn
|
|
30
|
-
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await
|
|
31
|
-
Reviewed ${o}/${t.length} pending memories.`);}var
|
|
28
|
+
`);}o[i]=(o[i]??0)+(wn(e,i)-u);}}function qa(e,t,n){let o=new Set(Nt(t,"main",n).map(l=>l.name)),r=Nt(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||kn.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(g=>u[g.name]))?1:0),0)}function it(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 Nt(e,t,n){return e.prepare(`PRAGMA ${H(t)}.table_info(${H(n)})`).all()}function wn(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 kn,vr=O(()=>{kn=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var kr={};$(kr,{connectAgent:()=>za,getAvailableAgents:()=>Va});async function za(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 Va(){return listAdapters()}var wr=O(()=>{});var Sr={};$(Sr,{getIndexStatus:()=>Ga,refreshIndex:()=>Ya});async function Ga(e){return j(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 Ya(e){return j(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var _r=O(()=>{we();});var Er={};$(Er,{getGraph:()=>Qa});async function Qa(e={}){let t=e.target??"all",n=e.depth??2;return j(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 Rr=O(()=>{we();});var bn={};$(bn,{getContext:()=>tc,getTaskContext:()=>nc});async function tc(e){return j(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 nc(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return j(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 Sn=O(()=>{we();});var at={};$(at,{getWorkflowRuns:()=>Cr,getWorkflowStatus:()=>sc,listWorkflows:()=>oc,runWorkflow:()=>rc});async function oc(e){return j(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 j(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function sc(e){return Cr(e)}async function Cr(e){return j(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ct=O(()=>{we();});var Ve={};$(Ve,{cancelWorker:()=>gc,listWorkers:()=>uc,retryWorkerCleanup:()=>fc,showWorker:()=>dc,workerMergeStatus:()=>mc});function uc(e){return lt(e,t=>ze(e.json,{projectRoot:Je(e.projectRoot),workers:t.listWorkflowWorkers(Je(e.projectRoot))}))}function dc(e,t){return lt(t,n=>{let o=Je(t.projectRoot),r=jt(n,o,e);return ze(t.json,{worker:r,events:n.listWorkflowWorkerEvents(o,e),merge:n.getWorkflowMergeByWorker(o,e)})})}function gc(e,t){return lt(t,n=>{let o=Je(t.projectRoot),r=jt(n,o,e);if(["merged","failed","cancelled"].includes(r.state))throw new Error(`Worker ${e} is terminal (${r.state})`);let s=n.transitionWorkflowWorker({projectRoot:o,workerId:e,target:"cancelled",leaseOwner:r.leaseOwner,reason:"operator_cancelled"});return n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:cancelled`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,reason:"cancelled"}}),ze(t.json,s)})}function fc(e,t){return lt(t,n=>{let o=Je(t.projectRoot),r=jt(n,o,e);if(!["merged","hold","cancelled","failed"].includes(r.state))throw new Error(`Worker ${e} is not eligible for cleanup retry (${r.state})`);let s=n.enqueueWork({idempotencyKey:`workflow-worker-cleanup:${e}:operator:${Date.now()}`,kind:"workflow.worker_cleanup",projectRoot:o,payload:{workerId:e,registeredPath:r.worktreePath,branch:r.branch,operatorApproved:!0},maxAttempts:10});return ze(t.json,s)})}function mc(e,t){return lt(t,n=>{let o=Je(t.projectRoot);jt(n,o,e);let r=n.getWorkflowMergeByWorker(o,e);return ze(t.json,r??{workerId:e,state:"not_queued"})})}function jt(e,t,n){let o=e.getWorkflowWorker(t,n);if(!o)throw new Error(`Worker ${n} was not found in project ${t}`);return o}function Je(e){let t=resolve(e);return existsSync$1(t)?realpathSync(t):t}function lt(e,t){let n=e.database??openGlobalDevFlowDatabase();try{return t(n)}finally{e.database||n.close();}}function ze(e,t){if(e)return JSON.stringify(t,null,2);if(pc(t))return `${t.workerId} ${t.state} ${t.stepId} ${t.host} ${t.worktreePath}`;if(hc(t))return `${t.workerId} ${t.state} ${t.candidateRevision}`;if(t&&typeof t=="object"&&Array.isArray(t.workers)){let n=t.workers;return n.length===0?"No workers.":n.map(o=>ze(false,o)).join(`
|
|
29
|
+
`)}return JSON.stringify(t,null,2)}function pc(e){return !!(e&&typeof e=="object"&&"workerId"in e&&"stepId"in e&&"worktreePath"in e)}function hc(e){return !!(e&&typeof e=="object"&&"mergeId"in e&&"candidateRevision"in e)}var Ge=O(()=>{});var En={};$(En,{getEmbeddingStatus:()=>kc,prepareEmbeddings:()=>wc,renderEmbeddingStatus:()=>bc});async function kc(){return inspectEmbeddingModel()}async function wc(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function bc(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 Rn=O(()=>{});var $e={};$($e,{backfillObservationVectors:()=>Dc,queryMemory:()=>Rc,reviewCandidates:()=>Cc,reviewMemories:()=>xc,setMemory:()=>Pc,showMemory:()=>Ec});async function Ec(e,t){let n=await j(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 Rc(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return j(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getDiagnosticMemoryResult(r,o,{projectRoot:t,adapter:"cli"})},{skipServer:n})}async function Pc(e,t,n){return j(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 Cc(e){return j(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function Dc(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Oc(e){let t=_c.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function xc(){let t=await j(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 Oc(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await j(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await j(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 Ae=O(()=>{we();});var Or={};$(Or,{getDocsStatus:()=>Nc,queryKnowledge:()=>Dr,searchKnowledge:()=>Ac,syncDocs:()=>jc});async function Dr(e,t,n,o){return j(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 Ac(e,t,n){return (await Dr(e,t,void 0,n)).results}async function Nc(e){return j(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 jc(e,t){return j(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 xr=O(()=>{we();});var xn={};$(xn,{backfillKnowledgeVectors:()=>Hc,resyncKnowledgeDocs:()=>Fc});function $r(e){return new KnowledgeEngine({projectRoot:e,projectId:resolveStableProjectIdentity(e).projectId,embedder:new EmbeddingProvider})}async function Fc(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=$r(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Hc(e={}){let t=e.projectRoot??process.cwd(),n=Date.now(),o=$r(t);On(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 On(t,{phase:"completed",source:e.source??"all",processed:r.processed,remaining:r.remaining},Date.now()-n),r}catch(r){throw On(t,{phase:"failed",source:e.source??"all",errorCategory:Wc(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 On(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 Wc(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 $n=O(()=>{});var Ar={};$(Ar,{inspectSkillHealth:()=>Tt,showSkillHealth:()=>Gc});function zc(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?Ce(homedir$1()).root:e;if(!t)return {pluginRoot:null,registryVersion:null,skills:0,commands:0,healthy:false,issues:[{category:"missing",reason:"No active DevFlow Claude plugin found"}]};let n=[];Vc(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=zc(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 g=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&g!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let d=a.get(u.name)??[];d.push(l),a.set(u.name,d);}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),g=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(g)&&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 Vc(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 Gc(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 Nn=O(()=>{Be();});var jn={};$(jn,{showMcpHealth:()=>tl,showMcpInventory:()=>el});async function el(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 tl(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 Tn=O(()=>{});var Mt={};$(Mt,{DEFAULT_SERVER_PORT:()=>Fn,readPidFromFile:()=>dt,readPortFromFile:()=>Mr,serverStatus:()=>mt,startServer:()=>Hn,stopServer:()=>ft});function Ln(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function ul(){try{return Tr.resolve("./server.js")}catch{try{return Tr.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Mr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
32
33
|
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function dt(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
33
|
-
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Hn(e){let t=
|
|
34
|
-
${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await
|
|
34
|
+
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function Hn(e){let t=ul(),n=Ln(process.cwd()),o=randomUUID(),r=spawn(process.execPath,[t,"--devflow-instance-token",o],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});writeFileSync(n,`${e.port}
|
|
35
|
+
${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e.port,pid:r.pid??0,ownerToken:o,status:"launching"}),r.unref();let s=await dl(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function ft(){let e=Ln(process.cwd()),t=dt(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),!0}catch{return unlinkSync(e),readRuntimeEndpointState()?.pid===t&&updateRuntimeEndpointStatus("stopped"),false}}async function mt(){let e=Ln(process.cwd()),t=resolveRuntimeEndpoint(),n=Mr(e)??t.port,{DevFlowApiClient:o}=await import('@devflow-tools/sdk');if(await new o({baseUrl:`http://127.0.0.1:${n}`,projectRoot:process.cwd()}).ping()){let a=dt(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!dt(e)||i.pid===dt(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function dl(e,t){let n=Date.now()+t;for(;Date.now()<n;){try{if((await fetch(new URL("/api/health",e),{signal:AbortSignal.timeout(500)})).ok)return !0}catch{}await new Promise(o=>setTimeout(o,100));}return false}var Tr,Fn,_e=O(()=>{Tr=createRequire(import.meta.url);Fn=DEFAULT_DEVFLOW_SERVER_PORT;});var Ss={};$(Ss,{renderDoctorText:()=>ws,runDoctor:()=>zu,runDoctorAudit:()=>Gu,runDoctorAuditFix:()=>Yu,runDoctorCommand:()=>Vu,runDoctorReceipts:()=>Qu,runDoctorViolations:()=>Zu,runLegacyDoctorReport:()=>bs,runStructuredDoctor:()=>ro});function is(){if(Ft)return Ft;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Ft=e.DatabaseSync,Ft}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function ie(e){return {homeDir:e.homePath,env:e.env??process.env}}function Kt(e){return join$1(getDevFlowStateRoot(ie(e)),"global","devflow.db")}function T(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Cl(e,t){let n=t.homePath??homedir$1(),o=ie(t),r=[],s=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(r.push({key:"host_adapter",value:s.status==="selected"?{id:s.adapter.id,candidates:s.candidates,explicit:s.explicit}:{status:"failed",code:s.code,candidates:s.candidates,reason:s.reason,action:s.action},target:"one explicitly selected or uniquely detected host",ok:s.status==="selected",severity:"warning"}),s.status==="selected"){let p=await s.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});r.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(h=>h.status==="supported"||!!(h.reason&&h.fallback)),severity:"error"});}let i=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),a=i.diagnostics.filter(p=>p.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(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:c.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let l=await checkMcpHealth(c,n),u=l.records.filter(p=>p.status==="unhealthy");r.push({key:"mcp_health",value:l.records,target:"no unhealthy enabled servers",ok:u.length===0,severity:"warning"});let g=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(g){let p=Tt(g);r.push({key:"skill_health",value:{root:p.pluginRoot,skills:p.skills,commands:p.commands,issues:p.issues},target:"valid and fully bound installed skills",ok:p.healthy,severity:"warning"});}let d=readRuntimeEndpointState(o);r.push({key:"runtime_endpoint_registry",value:d??"not registered",target:"healthy while active, stopped or absent while idle",ok:!d||d.status==="healthy"||d.status==="stopped",severity:d?.status==="degraded"?"error":"warning"});let m=(t.now??Date.now)(),f=listRuntimeHttpCircuits(o).filter(p=>p.status==="open"&&(p.openUntil??0)>m);return r.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:T(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 Dl(e){if(typeof e!="object"||e===null)return ["entry must be an object"];let t=e,n=[];return (typeof t.rootPath!="string"||t.rootPath.length===0)&&n.push("rootPath must be a nonempty string"),(typeof t.projectHash!="string"||t.projectHash.length===0)&&n.push("projectHash must be a nonempty string"),(typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0)&&n.push("pid must be a positive integer"),(typeof t.startedAt!="number"||!Number.isFinite(t.startedAt)||t.startedAt<0)&&n.push("startedAt must be a finite nonnegative number"),typeof t.rootPath=="string"&&t.rootPath.length>0&&typeof t.projectHash=="string"&&t.projectHash.length>0&&t.projectHash!==getProjectHash(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Ol(e,t){let n=Vn(e),o=ie(t),r=getProjectHash(n.path),s=getDaemonSocketPath(n.path,o),i=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:s,target:`path containing ${r}`,ok:s.includes(r),severity:"error"}],a=t.registryPath??getDaemonRegistryPath(o);if(!existsSync$1(a))i.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),i.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let c=JSON.parse(readFileSync$1(a,"utf8"));if(!Array.isArray(c))throw new Error("registry must be an array");let l=c.filter(m=>Dl(m).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(m=>{if(typeof m!="object"||m===null)return !1;let f=m;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Vn(f.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 g=u.map(m=>getDaemonSocketPath(m.rootPath,o));i.push({key:"registered_daemon_socket_paths",value:g,target:[s],ok:!0,severity:"info"});let d=u.filter((m,f)=>m.projectHash!==r||g[f]!==s).length;i.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===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:T(i),metrics:i}}function $l(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(xl)){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 as(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 Al(e){let t=as(e);return t&&t.length>0?t:null}function Un(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 Nl(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Fr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function Tl(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:T(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(is())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=$l(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:T(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
|
|
35
36
|
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
36
37
|
FROM distill_leases
|
|
37
|
-
`);l.setReadBigInts?.(!0);let u=l.all(),g=new Set,d=0,m=0;for(let
|
|
38
|
+
`);l.setReadBigInts?.(!0);let u=l.all(),g=new Set,d=0,m=0;for(let _ of u){let I=Al(_.event_ids),z=as(_.session_ids),Z=Un(_.event_count),x=Un(_.created_at),K=Un(_.expires_at),D=typeof _.status=="string"&&jl.has(_.status)?_.status:null,A=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,F=I!==null&&Z!==null&&Nl(Z,I.length);if(!A||!I||!z||!F||x===null||K===null||D===null){d+=1,_.status==="pending"&&(K===null||Fr(K,c))&&(m+=1);continue}if(!(D!=="pending"||!Fr(K,c)))for(let N of I)g.add(N);}n.push({key:"malformed_distill_leases",value:d,target:0,ok:d===0,severity:m>0?"error":"warning"});let p=i.prepare(`
|
|
38
39
|
SELECT id
|
|
39
40
|
FROM session_events
|
|
40
41
|
WHERE processed = 0 AND created_at < ?
|
|
41
|
-
`).all(c-300*1e3).filter(
|
|
42
|
+
`).all(c-300*1e3).filter(_=>!g.has(_.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let h=q(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),v=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:v===null?0:Math.max(0,c-v),target:"<= 300000 when no active lease is present",ok:v===null||p===0,severity:"warning"});let E=q(i,`
|
|
42
43
|
SELECT COUNT(*) count
|
|
43
44
|
FROM session_events event
|
|
44
45
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
45
46
|
WHERE TRIM(event.session_id) = '' OR session.id IS NULL
|
|
46
|
-
`);n.push({key:"orphan_memory_events",value:E,target:0,ok:E===0,severity:"error"});let k=
|
|
47
|
+
`);n.push({key:"orphan_memory_events",value:E,target:0,ok:E===0,severity:"error"});let k=q(i,`
|
|
47
48
|
SELECT COUNT(*) count
|
|
48
49
|
FROM sessions
|
|
49
50
|
WHERE status = 'active' AND created_at < ?
|
|
@@ -55,18 +56,18 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
55
56
|
GROUP BY project, session_id, title
|
|
56
57
|
HAVING COUNT(*) > 1
|
|
57
58
|
)
|
|
58
|
-
`).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:T(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(
|
|
59
|
+
`).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:T(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(is())(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 cs(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Yn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Il(e){let t=Yn(cs(e.output)),n=Yn(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 Ml(e){let t=cs(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=Yn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Hr(e,t){return t===0?0:e/t}function Bn(e,t){return e===0?1:t/e}async function Ll(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 d;try{d=ee(s,t),M(d,"nodes")?(o=q(d,"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 m=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:m,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(m){n.push({key:"codegraph_db_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.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 d;try{d=ee(i,t);let m=M(d,"symbols_vec_rowids")?"symbols_vec_rowids":M(d,"symbol_sources")?"symbol_sources":null;m?(r=q(d,`SELECT COUNT(*) count FROM ${m}`),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(m){n.push({key:"symbols_vectors_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}if(o!==null&&r!==null){let d=Bn(o,r);n.push({key:"symbols_vector_coverage",value:d,target:">= 0.90",ok:d>=.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 d;try{d=ee(a,t);let f=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!M(d,p));if(f.length>0)n.push({key:"knowledge_vector_schema",value:f,target:[],ok:!1,severity:"warning"});else {let h=fe(d,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=q(d,`
|
|
59
60
|
SELECT COUNT(*) count
|
|
60
61
|
FROM knowledge_chunks c
|
|
61
62
|
JOIN knowledge_docs d ON d.id = c.doc_id
|
|
62
63
|
WHERE 1 = 1 ${h}
|
|
63
|
-
`),v=
|
|
64
|
+
`),v=q(d,`
|
|
64
65
|
SELECT COUNT(*) count
|
|
65
66
|
FROM knowledge_vec_rowids v
|
|
66
67
|
JOIN knowledge_chunks c ON c.id = v.id
|
|
67
68
|
JOIN knowledge_docs d ON d.id = c.doc_id
|
|
68
69
|
WHERE 1 = 1 ${h}
|
|
69
|
-
`),E=
|
|
70
|
+
`),E=Bn(y,v),w=d.prepare(`
|
|
70
71
|
SELECT d.source source, COUNT(c.id) chunks,
|
|
71
72
|
SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
|
|
72
73
|
FROM knowledge_docs d
|
|
@@ -74,19 +75,19 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
74
75
|
LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
|
|
75
76
|
WHERE 1 = 1 ${h}
|
|
76
77
|
GROUP BY d.source ORDER BY d.source
|
|
77
|
-
`).all().map(
|
|
78
|
+
`).all().map(_=>{let I=Number(_.chunks),z=Number(_.vectors);return {source:_.source,chunks:I,vectors:z,coverage:Bn(I,z)}});n.push({key:"knowledge_chunks",value:y,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:v,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:E,target:">= 0.95",ok:E>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:w,target:"every source >= 0.95",ok:w.every(_=>_.coverage>=.95),severity:"warning"});}}catch(m){n.push({key:"knowledge_vectors_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let d;try{if(d=ee(c,t),!M(d,"observations")||!M(d,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let m=fe(d,"observations"),f=m.has("quality_status")&&m.has("resolution_state"),h=q(d,`SELECT COUNT(*) count FROM observations ${f?"WHERE quality_status = 'accepted' AND resolution_state <> 'superseded'":""}`),y=q(d,`
|
|
78
79
|
SELECT COUNT(DISTINCT e.source_id) count
|
|
79
80
|
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
80
81
|
WHERE e.source_type = 'observation'
|
|
81
82
|
${f?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
|
|
82
83
|
`),v=Math.max(0,h-y);n.push({key:"observations",value:h,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:y,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:v,target:0,ok:v===0,severity:"warning"});}}catch(m){n.push({key:"observation_vectors_read",value:m.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{d?.close();}}let l=(t.now??Date.now)(),u=join$1(getDevFlowStateRoot(ie(t)),"errors","embedder.log"),g=0;if(existsSync$1(u))try{let d=l-864e5;g=readFileSync$1(u,"utf8").split(`
|
|
83
|
-
`).filter(m=>{let f=/^\[([^\]]+)\]/.exec(m);return f?Date.parse(f[1])>=d:!1}).length;}catch(d){n.push({key:"embedder_error_log_read",value:d.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:g,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let d=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:d.state,modelId:d.modelId,revision:d.revision},target:{state:"ready"},ok:d.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:d.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:d.missingFiles,corruptFiles:d.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:d.missingFiles.length===0&&d.corruptFiles.length===0,severity:"warning"});}catch(d){n.push({key:"embedding_model_inspection",value:d.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:T(n),metrics:n}}function
|
|
84
|
+
`).filter(m=>{let f=/^\[([^\]]+)\]/.exec(m);return f?Date.parse(f[1])>=d:!1}).length;}catch(d){n.push({key:"embedder_error_log_read",value:d.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:g,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let d=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:d.state,modelId:d.modelId,revision:d.revision},target:{state:"ready"},ok:d.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:d.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:d.missingFiles,corruptFiles:d.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:d.missingFiles.length===0&&d.corruptFiles.length===0,severity:"warning"});}catch(d){n.push({key:"embedding_model_inspection",value:d.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:T(n),metrics:n}}function Fl(e,t,n){let o=[],r=Kt(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 f;try{f=ee(r,n),o.push({key:"global_telemetry_db",value:r,ok:!0,severity:"info"});for(let[D,A]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let F=M(f,A)?q(f,`SELECT COUNT(*) count FROM ${A} WHERE created_at >= ?`,s):0;o.push({key:D,value:F,ok:!0,severity:"info"});}let p=M(f,"telemetry_failures")?q(f,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",s):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=fe(f,"sessions"),y=fe(f,"tool_call_events"),v=fe(f,"skill_executions"),E=["id","project_root","started_at","status"].every(D=>h.has(D));if(o.push({key:"telemetry_session_schema",value:E?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:E,severity:"error"}),E){let D=q(f,`
|
|
84
85
|
SELECT COUNT(*) count FROM sessions
|
|
85
86
|
WHERE project_root = ? AND started_at >= ?
|
|
86
|
-
`,e,s);o.push({key:"session_start_evidence_24h",value:D,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let
|
|
87
|
+
`,e,s);o.push({key:"session_start_evidence_24h",value:D,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let A=q(f,`
|
|
87
88
|
SELECT COUNT(*) count FROM sessions
|
|
88
89
|
WHERE project_root = ? AND status = 'running' AND started_at < ?
|
|
89
|
-
`,e,(n.now??Date.now)()-Gn);o.push({key:"stale_telemetry_sessions",value:
|
|
90
|
+
`,e,(n.now??Date.now)()-Gn);o.push({key:"stale_telemetry_sessions",value:A,target:0,ok:A===0,severity:"error"});let F=f.prepare(`
|
|
90
91
|
SELECT status, COUNT(*) count
|
|
91
92
|
FROM sessions
|
|
92
93
|
WHERE project_root = ?
|
|
@@ -96,21 +97,21 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
96
97
|
FROM devflow_session_closures
|
|
97
98
|
WHERE project_root = ?
|
|
98
99
|
GROUP BY state
|
|
99
|
-
`).all(e),
|
|
100
|
+
`).all(e),B={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Fe of L)Fe.state in B&&(B[Fe.state]=Number(Fe.count));let le=q(f,`
|
|
100
101
|
SELECT COUNT(*) count
|
|
101
102
|
FROM devflow_session_closures
|
|
102
103
|
WHERE project_root = ? AND state = 'closing' AND updated_at < ?
|
|
103
|
-
`,e,i-Gn);o.push({key:"durable_session_closure_state",value:{...
|
|
104
|
+
`,e,i-Gn);o.push({key:"durable_session_closure_state",value:{...B,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:B.active===0&&B.closing===0&&le===0,severity:a});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:a});let ye=0;y.has("session_id")&&(ye=q(f,`
|
|
104
105
|
SELECT COUNT(*) count
|
|
105
106
|
FROM tool_call_events event
|
|
106
107
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
107
108
|
WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
|
|
108
|
-
`));let ce=0;if(v.has("session_id")&&(ce=
|
|
109
|
+
`));let ce=0;if(v.has("session_id")&&(ce=q(f,`
|
|
109
110
|
SELECT COUNT(*) count
|
|
110
111
|
FROM skill_executions execution
|
|
111
112
|
LEFT JOIN sessions session ON session.id = execution.session_id
|
|
112
113
|
WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
|
|
113
|
-
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(L=>v.has(L))){let L=i-18e5,
|
|
114
|
+
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:ye,skillExecutions:ce},target:{toolCalls:0,skillExecutions:0},ok:ye===0&&ce===0,severity:"error"}),["session_id","status","started_at"].every(L=>v.has(L))){let L=i-18e5,B=f.prepare(`
|
|
114
115
|
SELECT
|
|
115
116
|
COUNT(*) total,
|
|
116
117
|
COALESCE(SUM(CASE WHEN execution.started_at < ? THEN 1 ELSE 0 END), 0) older_than_30m,
|
|
@@ -120,7 +121,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
120
121
|
WHERE session.project_root = ?
|
|
121
122
|
AND execution.status = 'running'
|
|
122
123
|
AND (execution.started_at < ? OR session.status <> 'running')
|
|
123
|
-
`).get(L,e,L),le=Number(
|
|
124
|
+
`).get(L,e,L),le=Number(B?.total??0);o.push({key:"stale_skill_executions",value:{total:le,olderThan30m:Number(B?.older_than_30m??0),attachedToNonRunningSession:Number(B?.non_running_session??0)},target:{total:0},ok:le===0,severity:"error"});}else o.push({key:"skill_execution_schema",value:"status, started_at, or session_id column missing",target:"canonical Skill execution lifecycle schema",ok:!1,severity:"warning"});}if(!M(f,"devflow_work_items"))o.push({key:"work_queue_schema",value:"devflow_work_items table missing; queue diagnostics degraded",target:"canonical global work queue schema",ok:!1,severity:"error"});else {let D=fe(f,"devflow_work_items"),F=["project_root","state","lease_expires_at","created_at","completed_at"].filter(N=>!D.has(N));if(F.length>0)o.push({key:"work_queue_schema",value:{missingColumns:F,diagnostic:"queue diagnostics degraded"},target:"canonical global work queue schema",ok:!1,severity:"error"});else {let N=f.prepare(`
|
|
124
125
|
SELECT
|
|
125
126
|
COALESCE(SUM(CASE WHEN state IN ('pending', 'leased', 'failed') THEN 1 ELSE 0 END), 0) queue_depth,
|
|
126
127
|
COALESCE(SUM(CASE WHEN state = 'pending' THEN 1 ELSE 0 END), 0) pending,
|
|
@@ -132,7 +133,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
132
133
|
MAX(CASE WHEN state = 'completed' THEN completed_at END) last_successful_drain_at
|
|
133
134
|
FROM devflow_work_items
|
|
134
135
|
WHERE project_root = ?
|
|
135
|
-
`).get(i,e),V=Number(N?.queue_depth??0),X=Number(N?.pending??0),ye=Number(N?.leased??0),ce=Number(N?.failed??0),ve=Number(N?.dead_letters??0),L=Number(N?.expired_leases??0),
|
|
136
|
+
`).get(i,e),V=Number(N?.queue_depth??0),X=Number(N?.pending??0),ye=Number(N?.leased??0),ce=Number(N?.failed??0),ve=Number(N?.dead_letters??0),L=Number(N?.expired_leases??0),B=N?.oldest_pending_at==null?void 0:Number(N.oldest_pending_at),le=N?.last_successful_drain_at==null?void 0:Number(N.last_successful_drain_at);o.push({key:"work_queue_schema",value:"canonical",target:"canonical global work queue schema",ok:!0,severity:"info"}),o.push({key:"work_queue_depth",value:V,ok:!0,severity:"info"}),o.push({key:"work_queue_pending",value:X,ok:!0,severity:"info"}),o.push({key:"work_queue_leased",value:ye,ok:!0,severity:"info"}),o.push({key:"work_queue_failed",value:ce,target:0,ok:ce===0,severity:"warning"}),o.push({key:"work_queue_oldest_pending_age_ms",value:B===void 0?0:Math.max(0,i-B),ok:!0,severity:"info"}),o.push({key:"work_queue_dead_letters",value:ve,target:0,ok:ve===0,severity:"error"}),o.push({key:"work_queue_expired_leases",value:L,target:0,ok:L===0,severity:"error"}),o.push({key:"work_queue_last_successful_drain_at",value:le??null,ok:!0,severity:"info"});}}if(!M(f,"devflow_workflow_workers")||!M(f,"devflow_merge_queue"))o.push({key:"workflow_worker_schema",value:"worker or merge queue table missing",target:"canonical isolated worker lifecycle schema",ok:!1,severity:"warning"});else {let D=f.prepare(`
|
|
136
137
|
SELECT
|
|
137
138
|
COUNT(*) total,
|
|
138
139
|
COALESCE(SUM(CASE WHEN state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) active,
|
|
@@ -140,62 +141,62 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
140
141
|
COALESCE(SUM(CASE WHEN lease_expires_at IS NOT NULL AND lease_expires_at <= ?
|
|
141
142
|
AND state IN ('leased','starting','running','reported','verifying','merge_ready') THEN 1 ELSE 0 END), 0) lost_heartbeats
|
|
142
143
|
FROM devflow_workflow_workers WHERE project_root = ?
|
|
143
|
-
`).get(i,e),
|
|
144
|
+
`).get(i,e),A=q(f,`
|
|
144
145
|
SELECT COUNT(*) count FROM devflow_merge_queue
|
|
145
146
|
WHERE project_root = ? AND state = 'conflict'
|
|
146
147
|
`,e),F=f.prepare(`
|
|
147
148
|
SELECT MIN(created_at) oldest FROM devflow_merge_queue
|
|
148
149
|
WHERE project_root = ? AND state IN ('waiting','ready')
|
|
149
|
-
`).get(e),N=Number(D?.active??0),V=Number(D?.held??0),X=Number(D?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:N,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:V,target:0,ok:V===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:X,target:0,ok:X===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:
|
|
150
|
+
`).get(e),N=Number(D?.active??0),V=Number(D?.held??0),X=Number(D?.lost_heartbeats??0);o.push({key:"workflow_workers_active",value:N,ok:!0,severity:"info"}),o.push({key:"workflow_workers_held",value:V,target:0,ok:V===0,severity:"warning"}),o.push({key:"workflow_workers_lost_heartbeats",value:X,target:0,ok:X===0,severity:"error"}),o.push({key:"workflow_merge_conflicts",value:A,target:0,ok:A===0,severity:"warning"}),o.push({key:"workflow_merge_queue_oldest_age_ms",value:F?.oldest==null?0:Math.max(0,i-Number(F.oldest)),target:"bounded while workers are active",ok:!0,severity:"info"});}let k=getProjectStateDir(e,ie(n)),_=Object.fromEntries(["session-start-pending","memory-turn-pending","session-finalize-pending"].map(D=>{let A=join$1(k,D),F=existsSync$1(A)?readdirSync(A).filter(N=>N.includes(".json")).length:0;return [D,F]})),I=Object.values(_).reduce((D,A)=>D+A,0);if(o.push({key:"hook_spool_backlog",value:{total:I,..._},target:{total:0},ok:I===0,severity:a}),M(f,"tool_call_events")){let D=E&&y.has("session_id"),A=fe(f,"tool_metrics"),F=y.has("event_id")&&A.has("tool_call_event_id")&&A.has("status"),N=[y.has("error")?"event.error":"NULL error",y.has("failure_category")?"event.failure_category":"NULL failure_category",y.has("output")?"event.output":"NULL output",y.has("blocked")?"event.blocked":"0 blocked",y.has("block_reason")?"event.block_reason":"NULL block_reason",D?"event_session.status session_status":"NULL session_status",F?"metric.status metric_status":"NULL metric_status"].join(", "),V=f.prepare(`
|
|
150
151
|
SELECT ${N}
|
|
151
152
|
FROM tool_call_events event
|
|
152
153
|
${F?"LEFT JOIN tool_metrics metric ON metric.tool_call_event_id = event.event_id":""}
|
|
153
154
|
${D?"JOIN sessions event_session ON event_session.id = event.session_id":""}
|
|
154
155
|
WHERE event.timestamp >= ?
|
|
155
156
|
${D?"AND event_session.project_root = ?":""}
|
|
156
|
-
`).all(...D?[s,e]:[s]),X=V.map(
|
|
157
|
+
`).all(...D?[s,e]:[s]),X=V.map(Il),ye=X.filter(L=>L.failed).length,ce=X.filter((L,B)=>L.failed&&V[B]?.session_status!=="completed").length,ve=X.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:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:a}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:a}),o.push({key:"semantic_tool_failure_rate_24h",value:Hr(ye,V.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Hr(ve,V.length),target:0,ok:ve===0,severity:a}),o.push({key:"semantic_tool_project_scope",value:D?"project":"global fallback; session identity unavailable",target:"project",ok:D,severity:"warning"}),y.has("failure_category")){let L={};for(let ue of V)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(L[ue.failure_category]=(L[ue.failure_category]??0)+1);let B=V.filter((ue,ai)=>X[ai]?.failed&&ue.session_status!=="completed"),le=B.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Fe=B.length===0?1:le/B.length;o.push({key:"failure_categories_24h",value:L,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Fe,target:">= 0.80",ok:Fe>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}let z=E&&["session_id","started_at","fallback_count","fallback_reasons"].every(D=>v.has(D)),Z=0,x={};if(z){let D=f.prepare(`
|
|
157
158
|
SELECT execution.fallback_count, execution.fallback_reasons
|
|
158
159
|
FROM skill_executions execution
|
|
159
160
|
JOIN sessions session ON session.id = execution.session_id
|
|
160
161
|
WHERE session.project_root = ? AND execution.started_at >= ?
|
|
161
|
-
`).all(e,s);for(let
|
|
162
|
+
`).all(e,s);for(let A of D){Z+=Number(A.fallback_count??0);for(let F of Ml(A.fallback_reasons))x[F]=(x[F]??0)+1;}}let K=0;if(M(f,"devflow_hook_fallbacks")){let D=f.prepare(`
|
|
162
163
|
SELECT reason, COUNT(*) count
|
|
163
164
|
FROM devflow_hook_fallbacks
|
|
164
165
|
WHERE project_root = ? AND created_at >= ?
|
|
165
166
|
GROUP BY reason ORDER BY reason
|
|
166
|
-
`).all(e,s);for(let
|
|
167
|
-
`))if(u.trim())try{let g=JSON.parse(u),d=
|
|
167
|
+
`).all(e,s);for(let A of D){let F=Number(A.count);K+=F,x[`hook:${A.reason}`]=F;}}o.push({key:"skill_fallbacks_24h",value:Z,target:0,ok:Z===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:K,target:0,ok:K===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:x,target:{},ok:Object.keys(x).length===0,severity:"warning"});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let c=[join$1(dirname(r),"telemetry-cache")],l=0;try{l=c.reduce((f,p)=>f+(existsSync$1(p)?readdirSync(p).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(f){o.push({key:"telemetry_cache_read",value:f.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),g=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:g?u:"absent",target:"absent",ok:!g,severity:a});let d=join$1(e,".codegraph","codegraph.db"),m=[];if(existsSync$1(d)){let f;try{f=ee(d,n),m=f.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){o.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}return o.push({key:"codegraph_devflow_tables",value:m,target:[],ok:m.length===0,severity:a}),{name:"Telemetry",status:T(o),metrics:o}}function Ur(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function ls(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 Hl(e){let t=[],n=e.env??process.env,o=join$1(getDevFlowStateRoot(ie(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=Ur(o),g=l.isDirectory()&&!l.isSymbolicLink(),d=process.platform==="win32"||u==="700";t.push({key:"key_directory",value:{path:o,mode:u},target:{type:"directory",mode:"700"},ok:g&&d,severity:g?"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,g]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 d=join$1(o,g);if(!existsSync$1(d)){t.push({key:`${l}_source`,value:"missing",target:d,ok:false,severity:"warning"});continue}try{let m=lstatSync(d),f=Ur(d),p=readFileSync$1(d,"utf8").trim(),h=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:d,mode:f,bytes:Buffer.byteLength(p)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&p.length>0&&(process.platform==="win32"||f==="400"),severity:!h||p.length===0?"error":"warning"});}catch(m){t.push({key:`${l}_source`,value:m.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let i=join$1(getDevFlowStateRoot(ie(e)),"errors","compressor.log"),a=0,c=0;if(existsSync$1(i))try{let l=(e.now??Date.now)()-Qe;for(let u of readFileSync$1(i,"utf8").split(`
|
|
168
|
+
`))if(u.trim())try{let g=JSON.parse(u),d=ls(g.ts);d===null?c+=1:d>=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:T(t),metrics:t}}function Wl(e){let t=[],n=Kt(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:T(t),metrics:t};let o;try{if(o=ee(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:T(t),metrics:t};let r=o.prepare(`
|
|
168
169
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
169
170
|
FROM benchmark_reports
|
|
170
171
|
ORDER BY created_at DESC
|
|
171
172
|
LIMIT 1
|
|
172
|
-
`).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:T(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/Qe).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=Zn,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:T(t),metrics:t}}function
|
|
173
|
+
`).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:T(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/Qe).toFixed(2)):null,target:"0-30",ok:Number.isFinite(c)&&c>=0&&c<=Zn,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:T(t),metrics:t}}function Ul(e,t){let n=[],o=Kt(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:T(n),metrics:n};let r;try{if(r=ee(o,t),!M(r,"benchmark_reports"))throw new Error("benchmark_reports table missing");let s=r.prepare(`
|
|
173
174
|
SELECT report_json, created_at
|
|
174
175
|
FROM benchmark_reports
|
|
175
176
|
WHERE suite_id = 'retrieval-quality' AND project_root = ?
|
|
176
177
|
ORDER BY created_at DESC
|
|
177
178
|
LIMIT 1
|
|
178
|
-
`).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:T(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:Zn},ok:i.qualityStatus==="passed"&&a<=Zn,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:T(n),metrics:n}}function
|
|
179
|
-
`))if(E.trim())try{let k=JSON.parse(E),w=
|
|
179
|
+
`).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:T(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:Zn},ok:i.qualityStatus==="passed"&&a<=Zn,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:T(n),metrics:n}}function Bl(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 ql(e){let t=[];e.homePath??homedir$1();let o=getDevFlowStateRoot(ie(e)),r=[join$1(o,"errors","hook-fallback.log")],s=join$1(o,"logs","hook-fallback");if(existsSync$1(s))try{for(let v of readdirSync(s))v.endsWith(".log")&&r.push(join$1(s,v));}catch(v){t.push({key:"hook_fallback_directory_read",value:v.message,target:"readable fallback directory",ok:false,severity:"error"});}let i=(e.now??Date.now)()-Qe,a=0,c=0;for(let v of [...new Set(r)])if(existsSync$1(v))try{for(let E of readFileSync$1(v,"utf8").split(`
|
|
180
|
+
`))if(E.trim())try{let k=JSON.parse(E),w=ls(k.ts);w===null||typeof k.reason!="string"?c+=1:w>=i&&(a+=1);}catch{c+=1;}}catch(E){t.push({key:"hook_fallback_log_read",value:{path:v,error:E.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=Kt(e),u=0,g=0,d=null;if(existsSync$1(l)){let v;try{if(v=ee(l,e),M(v,"telemetry_events")){let E=v.prepare(`
|
|
180
181
|
SELECT COUNT(*) total,
|
|
181
182
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
182
183
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
183
184
|
FROM telemetry_events
|
|
184
185
|
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
185
|
-
`).get(i);u=Number(E?.total??0),g=Number(E?.failures??0),d=E?.average_duration==null?null:Math.round(Number(E.average_duration)*100)/100;}}catch(E){t.push({key:"hook_daemon_metrics_read",value:E.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{v?.close();}}let m=Math.max(a,g),f=Math.max(u,m),p=f===0?0:m/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:m===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let h=m>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 y=join$1(getDevFlowStateRoot(ie(e)),"logs","hook-debug");try{let v=
|
|
186
|
+
`).get(i);u=Number(E?.total??0),g=Number(E?.failures??0),d=E?.average_duration==null?null:Math.round(Number(E.average_duration)*100)/100;}}catch(E){t.push({key:"hook_daemon_metrics_read",value:E.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{v?.close();}}let m=Math.max(a,g),f=Math.max(u,m),p=f===0?0:m/f;t.push({key:"hook_daemon_requests_24h",value:f,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(p*1e4)/1e4,target:0,ok:m===0,severity:"warning"}),t.push({key:"hook_daemon_response_ms_avg",value:d??"no successful requests",target:"<= 1000",ok:d===null||d<=1e3,severity:"warning"});let h=m>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 y=join$1(getDevFlowStateRoot(ie(e)),"logs","hook-debug");try{let v=Bl(y);t.push({key:"hook_debug_log_bytes",value:v.bytes,target:`<= ${Wr}`,ok:v.bytes<=Wr,severity:"warning"}),t.push({key:"hook_debug_log_files",value:v.files,target:"rotated per project",ok:!0,severity:"info"});}catch(v){t.push({key:"hook_debug_log_read",value:v.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:T(t),metrics:t}}function Pe(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Me(e){return JSON.parse(readFileSync$1(e,"utf8"))}function U(e){return typeof e=="object"&&e!==null?e:null}function fs(e,t){return zl.has(e)&&!(t.tolerateControlSyntax&&Vl.has(e))}function wt(e,t={}){if(Buffer.byteLength(e)>gs)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 g=e[u];if(i){r+=g,i=false;continue}if(s==="'"){g==="'"?s=null:r+=g;continue}if(g==="\\"){if(e[u+1]===`
|
|
186
187
|
`){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
|
|
187
188
|
`){u+=2;continue}i=true;continue}if(s==='"'){g==='"'?s=null:((g==="`"||g==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=g);continue}if(g==="'"||g==='"'){s=g;continue}if((g==="`"||g==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=g;continue}let d=e.slice(u,u+2);if(g==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
|
|
188
|
-
`;)u+=1;l();continue}d==="<<"&&!t.tolerateControlSyntax&&(a=true);let m=g==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||g==="}"&&
|
|
189
|
-
`].includes(g)){l();continue}if(/\s/.test(g)){c();continue}r+=g;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let g=u.find(d=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(d));return g!==void 0&&
|
|
189
|
+
`;)u+=1;l();continue}d==="<<"&&!t.tolerateControlSyntax&&(a=true);let m=g==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||g==="}"&&Gl.test(`${r}}`);if(["(",")","{","}"].includes(g)&&!m&&!t.tolerateControlSyntax&&(a=true),d==="&&"||d==="||"){l(),u+=1;continue}if([";","|","&",`
|
|
190
|
+
`].includes(g)){l();continue}if(/\s/.test(g)){c();continue}r+=g;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let g=u.find(d=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(d));return g!==void 0&&fs(g,t)})&&(a=true),{segments:n,malformed:a}}function Yl(e){return wt(e).segments.flat().join(" ")}function Zl(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 ms(e,t){return Zl(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 Ql(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]===`
|
|
190
191
|
`){o-=1;break}e[o]!==`
|
|
191
|
-
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function
|
|
192
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function Xl(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]!==`
|
|
192
193
|
`;)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]===`
|
|
193
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?
|
|
194
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?Yl(e):n==="node"?Ql(e):n==="python"?Xl(e):e;return [...new Set(o.match(Kl)??[])]}function eu(e){return wt(e).segments.flat()}function pe(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=Re(a,i)?a:Re(c,i)?c:dirname(i);return {path:i,containmentRoot:l,cwd:t.cwd,parserKind:o}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:e.startsWith("-")||e.startsWith("#")?null:/^[A-Za-z0-9._/-]+$/.test(e)&&(e.startsWith("./")||e.startsWith("../")||e.includes("/")||/\.(?:bash|cjs|js|mjs|py|sh|ts|zsh)$/.test(e))?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:o}:null}function tu(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>gs||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function oo(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=tu(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Wt(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:pe(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||Ie(n))return {malformed:true};let o=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!o)return {malformed:false};let r={project:e.project,homePath:e.homePath,cwd:e.cwd};if(o){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=ou(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:pe(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:pe(n,r,true,e.parserKind)??void 0,malformed:false}}if(e.nodeResolutionKind==="esm")return {malformed:true};try{let s=e.issuerPath??join$1(e.cwd,"package.json"),i=createRequire$1(s).resolve(n);return isBuiltin(i)?{malformed:!1}:{reference:pe(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function nu(e){let t=[e];extname(e)===""&&t.push(...Br.map(n=>`${e}${n}`),...Br.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function ou(e,t,n){if(n==="cjs")try{let r=createRequire$1(t).resolve(e);return isBuiltin(r)?null:r}catch{}let o=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return nu(o)??o}function ru(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]!==`
|
|
194
195
|
`;)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===`
|
|
195
|
-
`||l==="\r"){a=false;break}i+=l,o+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(r==="`"){let s=false,i=false;for(o+=1;o<e.length;){let a=e[o];if(!s&&a==="`"){i=true,o+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),o+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(r)){let s=o+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(o,s),valid:true}),o=s;continue}t.push({kind:"punctuation",value:r,valid:true}),o+=1;}return {tokens:t,malformed:n}}function
|
|
196
|
+
`||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 su(e,t,n,o=true){let r=ru(t),s=[],i=r.malformed,a=(g,d)=>{if(!g||g.kind!=="string"||!g.valid||g.value.length===0){i=true;return}s.push({value:g.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d,issuerPath:e});},{tokens:c}=r;for(let g=0;g<c.length;g+=1){let d=c[g],m=c[g-1];if(d.kind!=="identifier")continue;if(d.value==="eval"&&m?.value!=="."&&c[g+1]?.value==="("){i=true;continue}if(d.value==="require"){if(m?.value==="."){c[g-2]?.value==="module"&&c[g+1]?.value==="("&&(i=true);continue}if(c[g+1]?.value==="("){let p=c[g+2];c[g+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(m?.value==="."||!["export","import"].includes(d.value))continue;if(d.value==="import"&&c[g+1]?.value==="("){let p=c[g+2];c[g+3]?.value===")"||(i=true),a(p,"esm");continue}if(d.value==="import"&&c[g+1]?.kind==="string"){a(c[g+1],"esm");continue}if(d.value==="import"&&c[g+1]?.value===".")continue;let f=-1;for(let p=g+1;p<Math.min(c.length,g+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){f=p;break}f>=0?a(c[f+1],"esm"):d.value==="import"&&(i=true);}let l=[],u=[];for(let g of s){let d=oo(g,o);d.reference&&l.push(d.reference),d.inlineContent&&u.push(d.inlineContent),i||=d.malformed;}return {references:l,inlineContents:u,malformed:i}}function iu(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]!==`
|
|
196
197
|
`;)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,g=o;for(let m=0;m<u;m+=1)t[g+m]=" ";g+=u;let d=false;for(;g<e.length;){if(e[g]==="\\"){t[g]=" ",g+1<e.length&&(t[g+1]=" "),g+=2;continue}if(e.slice(g,g+u)===c.repeat(u)){for(let m=0;m<u;m+=1)t[g+m]=" ";g+=u,d=true;break}if(!l&&(e[g]===`
|
|
197
198
|
`||e[g]==="\r"))break;e[g]!==`
|
|
198
|
-
`&&e[g]!=="\r"&&(t[g]=" "),g+=1;}if(a){let m=e.slice(o+u,g-u);for(let f=0;f<m.length;f+=1)if(m[f]==="{"){if(m[f+1]==="{"){f+=1;continue}n=true;break}}n||=!d,o=g;}return {content:t.join(""),malformed:n}}function Hr(e,t){let n=t.split(".");if(n.length>no)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 eu(e,t,n){let o=Xl(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=g=>{let d=dirname(e);for(let m=1;m<g;m+=1)d=dirname(d);return d},a=g=>{let d=pe(g,{...n,cwd:dirname(e)},true,"python");d?r.push(d):s=true;},c=(g,d=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(g))return s=true,null;let m=i(d),f=Hr(m,g);s||=!f.resolved;for(let h of f.paths)a(h);let p=f.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=g=>{let d=[];for(let m of g.split(",")){let f=m.trim().split(/\s+as\s+/)[0];if(f==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(f)){s=true;continue}d.push(f);}return d},u=(g,d)=>{for(let m of l(d))g&&Hr(g,m).resolved&&(s=true);};for(let g of o.content.split(/\r?\n/))for(let d of g.split(/[;:]/)){let m=d.trim();if(m.startsWith("import ")){let k=m.slice(7).split(",");for(let w of k)c(w.trim().split(/\s+as\s+/)[0]);continue}let f=m.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!f)continue;let p=f[1].length,h=f[2];if(h){let k=c(h,p);u(k,f[3]);continue}if(p===0){s=true;continue}let y=i(p),v=join$1(y,"__init__.py"),E=false;try{E=statSync$1(v).isFile();}catch{}if(E){a(v),u(y,f[3]);continue}for(let k of l(f[3]))c(k,p);}return {references:[...new Map(r.map(g=>[g.path,g])).values()],inlineContents:[],malformed:s}}function ds(e,t,n,o,r=true){return n==="node"?Ql(e,t,o,r):n==="python"?eu(e,t,o):{references:[],inlineContents:[],malformed:false}}function Wr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=qt(e,0,r),i=new Set((s.artifacts??[]).map(d=>d.value)),a=s.tokens.filter(d=>!i.has(d)).map(d=>pe(d,r)).filter(d=>d!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let d of s.artifacts??[]){if(d.nodeResolutionKind){let f=oo(d);f.reference&&c.push(f.reference),f.inlineContent&&l.push(f.inlineContent),u||=f.malformed;continue}let m=pe(d.value,{...r,cwd:d.cwd},true,d.parserKind);m?c.push(m):u=true;}let g=[...a,...c];return {references:[...new Map(g.map(d=>[`${d.path}:${d.parserKind}`,d])).values()],inlineContents:l,malformed:u}}function gs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ie(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Wt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function su(e,t,n){let o=[],r=[],s=false,i=(u,g)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g}),s||=Ie(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(ru.has(u))return a();if(ou.has(u)){l=true,c+=1;continue}let g=Ur.has(u)?"cjs":qr.has(u)?"esm":null;if(g){let h=e[c+1];if(!h)return a(true);i(h,g),c+=2;continue}let d=pt(u,Ur),m=pt(u,qr),f=d??m;if(f!==null){if(!f)return a(true);i(f,d!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Br.has(u)){let h=e[c+1];return a(h===void 0?true:s||Wt(h))}let p=pt(u,Br);if(p!==null)return a(s||Wt(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Wt(u.slice(2)));if(Kr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,Kr)!==null){c+=1;continue}if(nu.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function lu(e,t,n,o,r){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Ie(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?qt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(iu.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Ie(i)}}return {tokens:[],malformed:true}}function uu(e,t,n){let o=t;for(;o<e.length;){let r=e[o];if(r==="--"){let s=e[o+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Ie(s)}:{tokens:[],malformed:true}}if(!r.startsWith("-"))return {tokens:[r],artifacts:[{value:r,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Ie(r)};if(cu.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Jr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,Jr)!==null){o+=1;continue}if(au.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Bn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Re(r,o)?null:o}function fu(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(gs(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?Bn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Bn(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=Bn(a.slice(2),i);if(!c)return {index:s,malformed:true};i={...i,cwd:c},s+=1;}else if(["-u","--unset"].includes(a)){if(!t[s+1])return {index:s,malformed:true};s+=2;}else if(a.startsWith("--unset=")||a.startsWith("-u")&&a.length>2)s+=1;else if(["--","-i","--ignore-environment","--null"].includes(a))s+=1;else {if(a.startsWith("-"))return {index:s,malformed:true};break}}return {index:s,malformed:s>=t.length,context:i}}for(;t[s]?.startsWith("-");){let i=t[s];["-k","--kill-after","-s","--signal"].includes(i)?s+=2:s+=1;}return s>=t.length?{index:s,malformed:true}:(s+=1,{index:s,malformed:s>=t.length})}function qt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>as)return {tokens:[],malformed:true};let r=wt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=fs(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 fs(e,t,n,o){let r=0;for(;gs(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>as)return {tokens:i,malformed:true};let p=fu(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=fs(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&ls(l,o),g=c&&!gu.has(l);if(u||g)return {tokens:i,malformed:true};let d=Ie(s);i.push(s);let m=l;if(!tu.has(m))return {tokens:i,malformed:d};let f=["node","tsx"].includes(m)?su(e,r+1,n):["bash","sh","zsh"].includes(m)?lu(e,r+1,a,n,o):uu(e,r+1,n);return i.push(...f.tokens),{tokens:i,artifacts:f.artifacts,inlineContents:f.inlineContents,malformed:d||f.malformed}}function ms(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Pe(t.slice(0,o))}function mu(e,t){let n=new Map;for(let o of t)for(let r of zl(o)){let s=ms(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 pu(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function hu(e){return e.slice(e.lastIndexOf("@")+1)}function zr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Pe(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function yu(e,t,n){let o=hu(e),r=U(t.extraKnownMarketplaces),s=U(r?.[o]);if(s){let i=U(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?zr(i.path):null}}try{let i=U(Me(n)),a=U(i?.[o]);if(a){let c=U(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?zr(c.path):null}}}catch{}return {configured:false,root:null}}function Vr(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 vu(e,t){let n=U(e.entry),o=U(t.entry),r=Vr(n),s=Vr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Bt(n.version):null,a=typeof o?.version=="string"?Bt(o.version):null;if(i&&a){let c=ps(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function ku(e,t){try{let n=U(Me(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=U(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(vu)[0],i=U(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Pe(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Bt(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function ps(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 wu(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=U(Me(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=Bt(a.version),u=Bt(c.version);if(l&&u){let g=ps(u,l);if(g!==0)return g}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Pe(i[0].path):null}function bu(e,t){if(t.legacyArtifactRoots!==void 0){let k=t.legacyArtifactRoots.map(w=>Pe(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=U(Me(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 g=i.map(k=>{let w=[];return vt(k.settings.hooks,w),{path:k.path,commands:w}}),d=g.flatMap(k=>k.commands),m=g.flatMap(k=>mu(k.path,k.commands)),p=[...i.reduce((k,w)=>{let S=w.settings.enabledPlugins;if(typeof S!="object"||S===null)return k;for(let[I,z]of Object.entries(S))pu(I)&&typeof z=="boolean"&&k.set(I,z);return k},new Map)].filter(([,k])=>k).map(([k])=>k).sort(),h=[...m],y=false;for(let k of p){let w=ku(k,o);w.malformed&&c.push(o);let S=w.root;if(!w.configured){let I=i.map(Z=>yu(k,Z.settings,r)).filter(Z=>Z.configured),z=I[I.length-1];z?S=z.root:S=wu(k,s);}S?h.push({root:S,inspectPluginConfig:true}):y=true;}let v=[...h.reduce((k,w)=>{let S=k.get(w.root);return S?(k.set(w.root,{root:w.root,configPath:S.configPath??w.configPath,commands:[...new Set([...S.commands??[],...w.commands??[]])],inspectPluginConfig:!!(S.inspectPluginConfig||w.inspectPluginConfig)}),k):(k.set(w.root,w),k)},new Map).values()],E=[d.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(k=>k!==null);return {targets:v,configCommands:g.filter(k=>k.commands.length>0),hooksDisabled:false,method:E.length>0?`${E.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||d.length>0)&&!y&&a.length===0&&c.length===0}}function _u(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 Kn(e){return [...e.matchAll(Fl)].map(t=>t[1])}function Su(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 Eu(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 Ru(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 Jn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Qn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ht)return {kind:"unsafe",reason:"oversized"};let n;try{n=openSync(e,constants.O_RDONLY|constants.O_NONBLOCK|constants.O_NOFOLLOW);}catch{return {kind:"missing"}}try{let o=fstatSync(n);if(!o.isFile())return {kind:"unsafe",reason:"nonregular"};if(o.size>Ht)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ht+1)),s=0;for(;s<r.length;){let c=readSync(n,r,s,r.length-s,null);if(c===0)break;s+=c;}if(s>Ht)return {kind:"unsafe",reason:"oversized"};let i=r.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Xn(e,t){return `${e} (${t})`}function Pu(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>no){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),g=resolve(c.containmentRoot),d;try{d=realpathSync.native(g);}catch{d=g;}if(!existsSync$1(u)){Re(g,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let m;try{m=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Re(d,m)){o.escapedArtifacts.push(u);return}let f=`${m}:${c.parserKind}:${c.cwd}`;s.has(f)||(s.add(f),r.push({...c,path:m,depth:l}));};for(let c of n){let l=Wr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let g of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:g});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=is){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Qn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Xn(l,u.reason));continue}let{content:g}=u;o.inspected.push(l);let d=c.parserKind==="infer"?us(l,g):c.parserKind,m=d==="shell";for(let f of me(g,m,d))o.findings.push({artifact:l,endpoint:f});if(m){let f=Wr(g,e,t,c.cwd);f.malformed&&o.malformedCommands.push(l);for(let p of f.inlineContents)for(let h of me(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of f.references)a(p,c.depth+1);}else if(d==="node"||d==="python"){let f=ds(l,g,d,{project:e,homePath:t,cwd:dirname(l)});f.malformed&&o.malformedCommands.push(l);for(let p of f.inlineContents)for(let h of me(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of f.references)a(p,c.depth+1);}}}function Cu(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=_u(r),c=0,l=(m,f=false,p=r,h="infer",y=e,v=0)=>{if(v>no){o.traversalLimitRoots.push(r);return}let E=realpathSync.native(p),k=resolve(m);if(!existsSync$1(k)){if(!Re(E,k)){o.escapedArtifacts.push(k);return}f&&o.missing.push(k);return}let w;try{w=realpathSync.native(k);}catch{f&&o.missing.push(k);return}if(!Re(E,w)){o.escapedArtifacts.push(k);return}let S=`${w}:${h}:${y}`;i.has(S)||(i.add(S),s.push({path:w,parserKind:h,cwd:y,depth:v}));},u=(m,f,p,h=0)=>{for(let y of Kn(m)){let v=Jn(r,y);if(!v)continue;let E=(f.artifacts??[]).find(k=>k.value.includes("PLUGIN_ROOT")&&k.value.endsWith(y));l(v,true,r,E?.parserKind??"infer",E?.cwd??p,h);}},g=(m,f,p=0,h=false)=>{for(let y of m.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?oo(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let E of me(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:E});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??f,p);}},d=m=>{for(let p of me(m,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let f=qt(m,0,{project:e,homePath:t,cwd:e});f.malformed&&o.malformedCommands.push(m),u(m,f,e),g(f,e);for(let p of f.tokens){if(!isAbsolute(p))continue;let h=ms(p),y=(f.artifacts??[]).find(v=>v.value===p);h===r&&l(p,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let m of n.commands)d(m);}if(n.inspectPluginConfig||!n.commands){let m=join$1(r,"hooks","hooks.json"),f=join$1(r,"hooks.json"),p=existsSync$1(f)?f:m;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Re(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=Qn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Xn(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(y.content),E=[];vt(v,E);for(let k of E)d(k);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=is){o.traversalLimitRoots.push(r);break}let m=s.shift(),f=m.path;c+=1;let p=Qn(f);if(p.kind==="missing"){o.missing.push(f);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Xn(f,p.reason));continue}let{content:h}=p;o.inspected.push(f);let y=m.parserKind==="infer"?us(f,h):m.parserKind,v=y==="shell";for(let w of me(h,v,y))o.findings.push({artifact:f,endpoint:w});if(v){let w=Su(h),S=qt(w,0,{project:e,homePath:t,cwd:dirname(f)},{tolerateControlSyntax:true});Eu(h)&&o.malformedCommands.push(f),u(w,S,dirname(f),m.depth+1),g(S,dirname(f),m.depth+1,true);}else if(y==="node"||y==="python"){let w=ds(f,h,y,{project:e,homePath:t,cwd:dirname(f)},false);(y==="node"?Ru(f):w.malformed)&&o.malformedCommands.push(f);for(let S of w.inlineContents)for(let I of me(S.content,false,"node"))o.findings.push({artifact:S.source,endpoint:I});for(let S of w.references){let I=relative(r,resolve(S.path));!I.startsWith(`..${sep}`)&&I.split(sep).includes("node_modules")||l(S.path,true,r,S.parserKind,S.cwd,m.depth+1);}for(let S of Kn(h)){let I=Jn(r,S);I&&l(I,true,r,y,m.cwd,m.depth+1);}}else for(let w of Kn(h)){let S=Jn(r,w);S&&l(S,true,r,y,m.cwd,m.depth+1);}let E=f.startsWith(`${r}/`)?f.slice(r.length+1):"",k=basename(E).replace(/\.js$/,"");a&&(E.startsWith("hooks/")||E.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${k}.ts`),false,a),E.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${k}.js`));}}function Du(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=U(Me(t)),r=U(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=U(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Pe(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Gr(e){try{let t=U(Me(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ou(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Du(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 g=existsSync$1(l)?l:u;try{let v=U(Me(g)),E=U(v?.hooks),k=[];vt(E?.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 d=Gr(i),m=Gr(a),f=o.get(s)??[],p={root:s,packageVersion:d,manifestVersion:m,registryVersions:f};n.versionRecords.push(p),(!d||!m||d!==m||f.some(v=>v!==d))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function $u(e,t){let n=bu(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 K of O.commands){o.commandsInspected.push({configPath:O.path,command:K});for(let D of me(K,true))o.findings.push({artifact:O.path,endpoint:D});}}Pu(e,t.homePath??homedir$1(),n.configCommands.flatMap(O=>O.commands).filter(O=>!n.targets.some(K=>K.commands?.includes(O))),o);for(let O of n.targets)Cu(e,t.homePath??homedir$1(),O,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((O,K,D)=>D.findIndex(x=>x.configPath===O.configPath&&x.command===O.command)===K),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],g=[...new Set(o.traversalLimitRoots)],d=[...new Set(o.escapedArtifacts)],m=o.findings.filter((O,K,D)=>D.findIndex(x=>x.artifact===O.artifact&&x.endpoint===O.endpoint)===K),f=a.length>0||d.length>0||u.length>0,p=f&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Ou(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),E=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}:E?{root:E,version:null}:Ce(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,S=w?et(v,w):[],I=S.filter(O=>!O.isKnownDevFlowArtifact).map(O=>({skillName:O.skillName,path:O.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),z=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!f,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:g,target:[],ok:g.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:d.length,target:0,ok:d.length===0,severity:"warning"},{key:"retired_producer_paths",value:m.length,target:0,ok:m.length===0,severity:"error"},{key:"retired_producer_path_findings",value:m,ok:true,severity:"info"},{key:"skill_shadowing_count",value:S.length,target:0,ok:S.length===0,severity:"error"},{key:"shadowed_skills",value:S,target:[],ok:S.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:I,target:[],ok:true,severity:"info"}],Z=k.version??h.versionRecords.find(O=>O.root===w)?.packageVersion;return Z&&z.push({key:"active_plugin_version",value:Z,ok:true,severity:"info"}),{name:"Legacy paths",status:T(z),metrics:z}}function Au(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 Jt(e){let t=Au(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/Qe:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function xu(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=ee(i,t);let l=(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:B(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:T(n),metrics:n}}function Nu(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:T(n),metrics:n};let r;try{if(r=ee(o,t),!M(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*Qe,i=r.prepare(`
|
|
199
|
+
`&&e[g]!=="\r"&&(t[g]=" "),g+=1;}if(a){let m=e.slice(o+u,g-u);for(let f=0;f<m.length;f+=1)if(m[f]==="{"){if(m[f+1]==="{"){f+=1;continue}n=true;break}}n||=!d,o=g;}return {content:t.join(""),malformed:n}}function qr(e,t){let n=t.split(".");if(n.length>no)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 au(e,t,n){let o=iu(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=g=>{let d=dirname(e);for(let m=1;m<g;m+=1)d=dirname(d);return d},a=g=>{let d=pe(g,{...n,cwd:dirname(e)},true,"python");d?r.push(d):s=true;},c=(g,d=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(g))return s=true,null;let m=i(d),f=qr(m,g);s||=!f.resolved;for(let h of f.paths)a(h);let p=f.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=g=>{let d=[];for(let m of g.split(",")){let f=m.trim().split(/\s+as\s+/)[0];if(f==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(f)){s=true;continue}d.push(f);}return d},u=(g,d)=>{for(let m of l(d))g&&qr(g,m).resolved&&(s=true);};for(let g of o.content.split(/\r?\n/))for(let d of g.split(/[;:]/)){let m=d.trim();if(m.startsWith("import ")){let k=m.slice(7).split(",");for(let w of k)c(w.trim().split(/\s+as\s+/)[0]);continue}let f=m.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!f)continue;let p=f[1].length,h=f[2];if(h){let k=c(h,p);u(k,f[3]);continue}if(p===0){s=true;continue}let y=i(p),v=join$1(y,"__init__.py"),E=false;try{E=statSync$1(v).isFile();}catch{}if(E){a(v),u(y,f[3]);continue}for(let k of l(f[3]))c(k,p);}return {references:[...new Map(r.map(g=>[g.path,g])).values()],inlineContents:[],malformed:s}}function ps(e,t,n,o,r=true){return n==="node"?su(e,t,o,r):n==="python"?au(e,t,o):{references:[],inlineContents:[],malformed:false}}function Kr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Bt(e,0,r),i=new Set((s.artifacts??[]).map(d=>d.value)),a=s.tokens.filter(d=>!i.has(d)).map(d=>pe(d,r)).filter(d=>d!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let d of s.artifacts??[]){if(d.nodeResolutionKind){let f=oo(d);f.reference&&c.push(f.reference),f.inlineContent&&l.push(f.inlineContent),u||=f.malformed;continue}let m=pe(d.value,{...r,cwd:d.cwd},true,d.parserKind);m?c.push(m):u=true;}let g=[...a,...c];return {references:[...new Map(g.map(d=>[`${d.path}:${d.parserKind}`,d])).values()],inlineContents:l,malformed:u}}function hs(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Ie(e){return /[*?\[]/.test(e)?true:e.includes("$")?!/^(?:\$(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)|\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\})(?:\/[A-Za-z0-9._/-]*)?$/.test(e):false}function Wt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function pt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function gu(e,t,n){let o=[],r=[],s=false,i=(u,g)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g}),s||=Ie(u);},a=(u=s)=>({tokens:o,artifacts:r,malformed:u}),c=t,l=false;for(;c<e.length;){let u=e[c];if(u==="--"){let h=e[c+1];return h&&!l&&i(h),h?a():a(true)}if(!u.startsWith("-"))return l||i(u),a();if(du.has(u))return a();if(uu.has(u)){l=true,c+=1;continue}let g=Jr.has(u)?"cjs":zr.has(u)?"esm":null;if(g){let h=e[c+1];if(!h)return a(true);i(h,g),c+=2;continue}let d=pt(u,Jr),m=pt(u,zr),f=d??m;if(f!==null){if(!f)return a(true);i(f,d!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Vr.has(u)){let h=e[c+1];return a(h===void 0?true:s||Wt(h))}let p=pt(u,Vr);if(p!==null)return a(s||Wt(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Wt(u.slice(2)));if(Gr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(pt(u,Gr)!==null){c+=1;continue}if(lu.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function hu(e,t,n,o,r){let s=t;for(;s<e.length;){let i=e[s];if(i==="--"){let a=e[s+1];return a?{tokens:[a],artifacts:[{value:a,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Ie(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Bt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(fu.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:o.cwd,project:o.project,homePath:o.homePath,parserKind:"shell"}],malformed:Ie(i)}}return {tokens:[],malformed:true}}function yu(e,t,n){let o=t;for(;o<e.length;){let r=e[o];if(r==="--"){let s=e[o+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Ie(s)}:{tokens:[],malformed:true}}if(!r.startsWith("-"))return {tokens:[r],artifacts:[{value:r,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:Ie(r)};if(pu.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Yr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(pt(r,Yr)!==null){o+=1;continue}if(mu.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function qn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Pe(n.path),r=Pe(t.project);return !o||!r||!Re(r,o)?null:o}function wu(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(hs(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 Bt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>ds)return {tokens:[],malformed:true};let r=wt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=ys(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 ys(e,t,n,o){let r=0;for(;hs(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;vu.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>ds)return {tokens:i,malformed:true};let p=wu(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=ys(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&fs(l,o),g=c&&!ku.has(l);if(u||g)return {tokens:i,malformed:true};let d=Ie(s);i.push(s);let m=l;if(!cu.has(m))return {tokens:i,malformed:d};let f=["node","tsx"].includes(m)?gu(e,r+1,n):["bash","sh","zsh"].includes(m)?hu(e,r+1,a,n,o):yu(e,r+1,n);return i.push(...f.tokens),{tokens:i,artifacts:f.artifacts,inlineContents:f.inlineContents,malformed:d||f.malformed}}function vs(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Pe(t.slice(0,o))}function bu(e,t){let n=new Map;for(let o of t)for(let r of eu(o)){let s=vs(r);if(!s)continue;let i=n.get(s)??[];i.push(o),n.set(s,i);}return [...n].map(([o,r])=>({root:o,configPath:e,commands:[...new Set(r)]}))}function Su(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function _u(e){return e.slice(e.lastIndexOf("@")+1)}function Zr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Pe(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Eu(e,t,n){let o=_u(e),r=U(t.extraKnownMarketplaces),s=U(r?.[o]);if(s){let i=U(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Zr(i.path):null}}try{let i=U(Me(n)),a=U(i?.[o]);if(a){let c=U(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Zr(c.path):null}}}catch{}return {configured:false,root:null}}function Qr(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 Ru(e,t){let n=U(e.entry),o=U(t.entry),r=Qr(n),s=Qr(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=ks(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Pu(e,t){try{let n=U(Me(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=U(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(Ru)[0],i=U(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Pe(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function qt(e){let t=e.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:t[4]?.split(".")??[]}:null}function ks(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 Cu(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=U(Me(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=qt(a.version),u=qt(c.version);if(l&&u){let g=ks(u,l);if(g!==0)return g}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Pe(i[0].path):null}function Du(e,t){if(t.legacyArtifactRoots!==void 0){let k=t.legacyArtifactRoots.map(w=>Pe(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=U(Me(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 g=i.map(k=>{let w=[];return vt(k.settings.hooks,w),{path:k.path,commands:w}}),d=g.flatMap(k=>k.commands),m=g.flatMap(k=>bu(k.path,k.commands)),p=[...i.reduce((k,w)=>{let _=w.settings.enabledPlugins;if(typeof _!="object"||_===null)return k;for(let[I,z]of Object.entries(_))Su(I)&&typeof z=="boolean"&&k.set(I,z);return k},new Map)].filter(([,k])=>k).map(([k])=>k).sort(),h=[...m],y=false;for(let k of p){let w=Pu(k,o);w.malformed&&c.push(o);let _=w.root;if(!w.configured){let I=i.map(Z=>Eu(k,Z.settings,r)).filter(Z=>Z.configured),z=I[I.length-1];z?_=z.root:_=Cu(k,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let v=[...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()],E=[d.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(k=>k!==null);return {targets:v,configCommands:g.filter(k=>k.commands.length>0),hooksDisabled:false,method:E.length>0?`${E.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||d.length>0)&&!y&&a.length===0&&c.length===0}}function Ou(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 Kn(e){return [...e.matchAll(Jl)].map(t=>t[1])}function xu(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 $u(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 Au(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 Jn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Qn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ht)return {kind:"unsafe",reason:"oversized"};let n;try{n=openSync(e,constants.O_RDONLY|constants.O_NONBLOCK|constants.O_NOFOLLOW);}catch{return {kind:"missing"}}try{let o=fstatSync(n);if(!o.isFile())return {kind:"unsafe",reason:"nonregular"};if(o.size>Ht)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,Ht+1)),s=0;for(;s<r.length;){let c=readSync(n,r,s,r.length-s,null);if(c===0)break;s+=c;}if(s>Ht)return {kind:"unsafe",reason:"oversized"};let i=r.subarray(0,s);if(i.includes(0))return {kind:"unsafe",reason:"binary"};let a=i.toString("utf8");return a.includes("\uFFFD")?{kind:"unsafe",reason:"binary"}:{kind:"text",content:a}}catch{return {kind:"missing"}}finally{closeSync(n);}}function Xn(e,t){return `${e} (${t})`}function Nu(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>no){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),g=resolve(c.containmentRoot),d;try{d=realpathSync.native(g);}catch{d=g;}if(!existsSync$1(u)){Re(g,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let m;try{m=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Re(d,m)){o.escapedArtifacts.push(u);return}let f=`${m}:${c.parserKind}:${c.cwd}`;s.has(f)||(s.add(f),r.push({...c,path:m,depth:l}));};for(let c of n){let l=Kr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let g of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:g});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=us){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Qn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Xn(l,u.reason));continue}let{content:g}=u;o.inspected.push(l);let d=c.parserKind==="infer"?ms(l,g):c.parserKind,m=d==="shell";for(let f of me(g,m,d))o.findings.push({artifact:l,endpoint:f});if(m){let f=Kr(g,e,t,c.cwd);f.malformed&&o.malformedCommands.push(l);for(let p of f.inlineContents)for(let h of me(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of f.references)a(p,c.depth+1);}else if(d==="node"||d==="python"){let f=ps(l,g,d,{project:e,homePath:t,cwd:dirname(l)});f.malformed&&o.malformedCommands.push(l);for(let p of f.inlineContents)for(let h of me(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of f.references)a(p,c.depth+1);}}}function ju(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ou(r),c=0,l=(m,f=false,p=r,h="infer",y=e,v=0)=>{if(v>no){o.traversalLimitRoots.push(r);return}let E=realpathSync.native(p),k=resolve(m);if(!existsSync$1(k)){if(!Re(E,k)){o.escapedArtifacts.push(k);return}f&&o.missing.push(k);return}let w;try{w=realpathSync.native(k);}catch{f&&o.missing.push(k);return}if(!Re(E,w)){o.escapedArtifacts.push(k);return}let _=`${w}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:w,parserKind:h,cwd:y,depth:v}));},u=(m,f,p,h=0)=>{for(let y of Kn(m)){let v=Jn(r,y);if(!v)continue;let E=(f.artifacts??[]).find(k=>k.value.includes("PLUGIN_ROOT")&&k.value.endsWith(y));l(v,true,r,E?.parserKind??"infer",E?.cwd??p,h);}},g=(m,f,p=0,h=false)=>{for(let y of m.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let v=y.nodeResolutionKind?oo(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(y.value);continue}if(v.inlineContent)for(let E of me(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:E});v.reference&&l(v.reference.path,true,h?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??f,p);}},d=m=>{for(let p of me(m,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let f=Bt(m,0,{project:e,homePath:t,cwd:e});f.malformed&&o.malformedCommands.push(m),u(m,f,e),g(f,e);for(let p of f.tokens){if(!isAbsolute(p))continue;let h=vs(p),y=(f.artifacts??[]).find(v=>v.value===p);h===r&&l(p,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let m of n.commands)d(m);}if(n.inspectPluginConfig||!n.commands){let m=join$1(r,"hooks","hooks.json"),f=join$1(r,"hooks.json"),p=existsSync$1(f)?f:m;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Re(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=Qn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Xn(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let v=JSON.parse(y.content),E=[];vt(v,E);for(let k of E)d(k);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=us){o.traversalLimitRoots.push(r);break}let m=s.shift(),f=m.path;c+=1;let p=Qn(f);if(p.kind==="missing"){o.missing.push(f);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Xn(f,p.reason));continue}let{content:h}=p;o.inspected.push(f);let y=m.parserKind==="infer"?ms(f,h):m.parserKind,v=y==="shell";for(let w of me(h,v,y))o.findings.push({artifact:f,endpoint:w});if(v){let w=xu(h),_=Bt(w,0,{project:e,homePath:t,cwd:dirname(f)},{tolerateControlSyntax:true});$u(h)&&o.malformedCommands.push(f),u(w,_,dirname(f),m.depth+1),g(_,dirname(f),m.depth+1,true);}else if(y==="node"||y==="python"){let w=ps(f,h,y,{project:e,homePath:t,cwd:dirname(f)},false);(y==="node"?Au(f):w.malformed)&&o.malformedCommands.push(f);for(let _ of w.inlineContents)for(let I of me(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:I});for(let _ of w.references){let I=relative(r,resolve(_.path));!I.startsWith(`..${sep}`)&&I.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,m.depth+1);}for(let _ of Kn(h)){let I=Jn(r,_);I&&l(I,true,r,y,m.cwd,m.depth+1);}}else for(let w of Kn(h)){let _=Jn(r,w);_&&l(_,true,r,y,m.cwd,m.depth+1);}let E=f.startsWith(`${r}/`)?f.slice(r.length+1):"",k=basename(E).replace(/\.js$/,"");a&&(E.startsWith("hooks/")||E.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${k}.ts`),false,a),E.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${k}.js`));}}function Tu(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=U(Me(t)),r=U(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=U(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Pe(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Xr(e){try{let t=U(Me(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Iu(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Tu(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 g=existsSync$1(l)?l:u;try{let v=U(Me(g)),E=U(v?.hooks),k=[];vt(E?.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 d=Xr(i),m=Xr(a),f=o.get(s)??[],p={root:s,packageVersion:d,manifestVersion:m,registryVersions:f};n.versionRecords.push(p),(!d||!m||d!==m||f.some(v=>v!==d))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let v=readFileSync$1(h,"utf8");(!existsSync$1(y)||!v.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Mu(e,t){let n=Du(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let x of n.configCommands){o.configsInspected.push(x.path);for(let K of x.commands){o.commandsInspected.push({configPath:x.path,command:K});for(let D of me(K,true))o.findings.push({artifact:x.path,endpoint:D});}}Nu(e,t.homePath??homedir$1(),n.configCommands.flatMap(x=>x.commands).filter(x=>!n.targets.some(K=>K.commands?.includes(x))),o);for(let x of n.targets)ju(e,t.homePath??homedir$1(),x,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((x,K,D)=>D.findIndex(A=>A.configPath===x.configPath&&A.command===x.command)===K),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],g=[...new Set(o.traversalLimitRoots)],d=[...new Set(o.escapedArtifacts)],m=o.findings.filter((x,K,D)=>D.findIndex(A=>A.artifact===x.artifact&&A.endpoint===x.endpoint)===K),f=a.length>0||d.length>0||u.length>0,p=f&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Iu(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,v=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),E=n.targets.map(x=>x.root).find(x=>existsSync$1(join$1(x,"skills")))??null,k=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:E?{root:E,version:null}:Ce(v,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=k.root,_=w?et(v,w):[],I=_.filter(x=>!x.isKnownDevFlowArtifact).map(x=>({skillName:x.skillName,path:x.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),z=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!f,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(x=>x.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{key:"plugin_hook_layout",value:h.layoutIssues,target:"hooks/hooks.json present and root hooks.json absent",ok:h.layoutIssues.length===0,severity:"error"},{key:"plugin_version_parity",value:h.versionRecords,target:"manifest, package, and installed registry versions match",ok:h.versionIssues.length===0,severity:"error"},{key:"session_start_hook_registration",value:h.sessionStartIssues,target:[],ok:h.sessionStartIssues.length===0,severity:"error"},{key:"hook_daemon_artifact_registration",value:h.daemonIssues,target:[],ok:h.daemonIssues.length===0,severity:"error"},{key:"malformed_active_settings",value:n.malformedSettings,target:[],ok:n.malformedSettings.length===0,severity:"warning"},{key:"malformed_plugin_metadata",value:n.malformedPluginMetadata,target:[],ok:n.malformedPluginMetadata.length===0,severity:"warning"},{key:"hook_configs_inspected",value:r.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||r.length>0,severity:"warning"},{key:"legacy_artifacts_inspected",value:s.length+i.length,target:n.hooksDisabled?"hooks disabled":">= 1 active hook artifact",ok:n.hooksDisabled||s.length+i.length>0,severity:"warning"},{key:"missing_legacy_artifacts",value:a,target:[],ok:a.length===0,severity:"warning"},{key:"malformed_hook_configs",value:c,target:[],ok:c.length===0,severity:"warning"},{key:"malformed_hook_commands",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:u,target:[],ok:u.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:g,target:[],ok:g.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:d.length,target:0,ok:d.length===0,severity:"warning"},{key:"retired_producer_paths",value:m.length,target:0,ok:m.length===0,severity:"error"},{key:"retired_producer_path_findings",value:m,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:I,target:[],ok:true,severity:"info"}],Z=k.version??h.versionRecords.find(x=>x.root===w)?.packageVersion;return Z&&z.push({key:"active_plugin_version",value:Z,ok:true,severity:"info"}),{name:"Legacy paths",status:T(z),metrics:z}}function Lu(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 Jt(e){let t=Lu(e);if(!t.manifest)return {metrics:[{key:"batch4_acceptance_manifest",value:t.error??"missing",target:"readable acceptance-manifest.json",ok:false,severity:"warning"}]};let n=Date.parse(t.manifest.verifiedAt),o=Number.isFinite(n)?((e.now??Date.now)()-n)/Qe:Number.POSITIVE_INFINITY;return {manifest:t.manifest,metrics:[{key:"batch4_acceptance_manifest",value:t.path,target:"schemaVersion 1",ok:t.manifest.schemaVersion===1,severity:"error"},{key:"acceptance_evidence_age_days",value:Number.isFinite(o)?Number(o.toFixed(2)):"invalid timestamp",target:"0-30",ok:o>=0&&o<=30,severity:"warning"}]}}function Fu(e,t){let n=[],o=join$1(e,".devflow","config.json"),r="default-enabled";if(existsSync$1(o))try{r=JSON.parse(readFileSync$1(o,"utf8")).sessionStart?.injectMemories??"default-enabled";}catch(a){n.push({key:"session_start_config",value:a.message,target:"valid .devflow/config.json",ok:false,severity:"error"});}let s=r!==false;n.push({key:"session_start_memory_injection",value:r,target:"enabled or configured budget",ok:s,severity:"warning"});let i=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(i))n.push({key:"explicit_memory_channel",value:"memory database missing",target:"observations.source supports explicit_intent",ok:false,severity:"warning"});else {let a;try{a=ee(i,t);let l=(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:T(n),metrics:n}}function Hu(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:T(n),metrics:n};let r;try{if(r=ee(o,t),!M(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*Qe,i=r.prepare(`
|
|
199
200
|
SELECT source, COUNT(*) count FROM memories
|
|
200
201
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
201
202
|
`).all(s),a=r.prepare(`
|
|
@@ -213,14 +214,14 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
213
214
|
SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
|
|
214
215
|
FROM observations
|
|
215
216
|
WHERE source = 'explicit_intent' AND quality_status = 'accepted'
|
|
216
|
-
`).get(),u=Number(l?.total??0),g=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?g/u:1,target:1,ok:u===0||g===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:T(n),metrics:n}}function
|
|
217
|
+
`).get(),u=Number(l?.total??0),g=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?g/u:1,target:1,ok:u===0||g===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:T(n),metrics:n}}function Wu(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:T(n),metrics:n};let r;try{if(r=ee(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(d=>Number(d.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(),g=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:g?"trigram":"missing/non-trigram",target:"trigram",ok:g,severity:"warning"}),M(r,"knowledge_source_readiness")){let d=r.prepare(`
|
|
217
218
|
SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
|
|
218
219
|
FROM knowledge_source_readiness ORDER BY source
|
|
219
|
-
`).all(),m=d.filter(p=>Number(p.documents??0)>0||Number(p.chunks??0)>0),f=m.length>0?Math.min(...m.map(p=>Number(p.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:d,target:"all active sources current with >=95% vector coverage",ok:m.length>0&&m.every(p=>p.status==="ready"&&Number(p.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:f,target:">= 0.95",ok:m.length>0&&f>=.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:T(n),metrics:n}}function
|
|
220
|
-
`)}async function
|
|
221
|
-
`)}var
|
|
220
|
+
`).all(),m=d.filter(p=>Number(p.documents??0)>0||Number(p.chunks??0)>0),f=m.length>0?Math.min(...m.map(p=>Number(p.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:d,target:"all active sources current with >=95% vector coverage",ok:m.length>0&&m.every(p=>p.status==="ready"&&Number(p.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:f,target:">= 0.95",ok:m.length>0&&f>=.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:T(n),metrics:n}}function Uu(e){let{manifest:t,metrics:n}=Jt(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:T(n),metrics:n}}function Bu(e){let{manifest:t,metrics:n}=Jt(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:T(n),metrics:n}}function qu(e){let{manifest:t,metrics:n}=Jt(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:T(n),metrics:n}}async function Ku(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 Ju(e){let{manifest:t,metrics:n}=Jt(e),o=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:o.length,target:">= 13",ok:t?.ui?.status==="green"&&o.length>=13,severity:"warning"});let r=readRuntimeEndpointState(ie(e));if((!r||r.status==="stopped")&&!e.httpGet)return n.push({key:"dashboard_server_health",value:"inactive",target:"HTTP 200 when the runtime endpoint is active",ok:true,severity:"info"}),{name:"UI reachability",status:T(n),metrics:n};let s=e.env?.PORT??process.env.PORT??"13337",i=`${r?.url??`http://127.0.0.1:${s}`}/api/health`;try{let a=await(e.httpGet??Ku)(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:T(n),metrics:n}}async function ro(e={},t={}){let n=e.project??process.cwd(),o=Vn(n),r=Uu(t),s=await Cl(o.path,t);r.metrics.push(...s.metrics),r.status=T(r.metrics);let i=[Ol(n,t),Tl(o.path,t),Mu(o.path,t),await Ll(o.path,t),Fl(o.path,!!e.strict,t),Fu(o.path,t),Hu(o.path,t),Wu(o.path,t),r,Bu(t),Wl(t),Ul(o.path,t),qu(t),Hl(t),await Ju(t),ql(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 zu(e,t={}){return e===void 0?bs():ro(e,t)}function es(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ws(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: ${es(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${es(s.value)}${i}`);}}return t.join(`
|
|
221
|
+
`)}async function Vu(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await ro(e,n);return t.stdout(e.json?JSON.stringify(o):ws(o)),o.exitCode}async function zt(e){let{createEngines:t}=await import('@devflow-tools/mcp-server/composition');return t(e)}async function bs(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await zt(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,g=0;try{let h=await o.getAll();u=!!h?.project,g=Object.keys(h?.user??{}).length;}catch{}let d=0;try{d=(await r.getSources()).length;}catch{}let m={total:0,byTool:{}};try{m=await i.getToolCallStats();}catch{}let f=await mt(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),u&&(p+=15),d>0&&(p+=10),l>0&&(p+=5),f.running&&(p+=10),m.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:g},knowledge:{sources:d},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:f.running},toolCalls:m,readyScore:p}}async function Gu(){let{data:e}=await zt(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 Yu(){let{data:e}=await zt(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 Zu(e){let{data:t}=await zt(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 Qu(){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 Ft,xl,Gn,jl,Qe,Zn,Wr,Kl,Jl,us,Ht,no,ds,gs,zl,Vl,Gl,Br,cu,Jr,zr,Vr,Gr,lu,uu,du,fu,mu,Yr,pu,vu,ku,_s=O(()=>{Be();_e();Nn();xl={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Gn=3600*1e3;jl=new Set(["pending","committed","expired"]);Qe=1440*60*1e3,Zn=30*Qe,Wr=60*1024*1024;Kl=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,Jl=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,us=64,Ht=1024*1024,no=8,ds=8,gs=64*1024;zl=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),Vl=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),Gl=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Br=[".cjs",".js",".mjs",".ts",".tsx"];cu=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Jr=new Set(["-r","--require"]),zr=new Set(["--experimental-loader","--import","--loader"]),Vr=new Set(["-e","--eval","-p","--print"]),Gr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),lu=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),uu=new Set(["--check","-c"]),du=new Set(["--help","--version","-h","-v"]);fu=new Set(["-e","-eu","-o","-u","-ue"]),mu=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Yr=new Set(["-W","-X","--check-hash-based-pycs"]),pu=new Set(["--help","--version","-h","-V"]);vu=new Set(["builtin","command","env","exec","nohup","timeout"]),ku=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Es={};$(Es,{runMemoryMaintainCommand:()=>nd});function td(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 nd(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:td(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(`
|
|
222
|
+
`)}var Rs=O(()=>{});var Ps={};$(Ps,{generateToken:()=>sd});async function sd(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 Cs=O(()=>{});var so={};$(so,{reportBenchmarkCommand:()=>ud,runBenchmarkCommand:()=>ld});async function ld(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}
|
|
222
223
|
|
|
223
|
-
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function
|
|
224
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function ud(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=dd(o,n);return r==="markdown"?`${s}
|
|
224
225
|
## Change From Prior Baseline
|
|
225
226
|
|
|
226
227
|
${i.map(a=>`- ${a}`).join(`
|
|
@@ -229,20 +230,20 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
229
230
|
|
|
230
231
|
Change from ${o.runId}:
|
|
231
232
|
${i.map(a=>`- ${a}`).join(`
|
|
232
|
-
`)}`}function
|
|
233
|
-
`)}var
|
|
234
|
-
Shutting down...`)),await ft(),console.log(
|
|
233
|
+
`)}`}function dd(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 io=O(()=>{});var co={};$(co,{reportEvaluationCommand:()=>kd,runEvaluationCommand:()=>vd});async function vd(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=wd(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:${Gt(JSON.stringify(c)).slice(0,24)}`},g={trialId:`trial:${randomUUID()}`,executionId:`eval-exec:${randomUUID()}`,taskId:c.taskId,projectRevision:o,fixtureVersion:t.version,taskInputHash:Gt(c.prompt),toolProfileHash:Gt("benchmark-context-deep:r3.v1"),acceptanceHash:Gt(JSON.stringify(t.tasks.find(d=>d.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({...g,evidenceReceipt:createTrialReceipt(g)});}}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 kd(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 wd(e){try{return execFileSync("git",["rev-parse","HEAD"],{cwd:e,encoding:"utf8"}).trim()}catch{return "unknown"}}function Gt(e){return createHash("sha256").update(e).digest("hex")}var lo=O(()=>{});var Ns={};$(Ns,{runReview:()=>bd});async function bd(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(`
|
|
234
|
+
`)}var js=O(()=>{});var Ts={};$(Ts,{startAll:()=>_d});async function Sd(e,t=15e3){let n=Date.now();for(;Date.now()-n<t;){try{if((await fetch(`http://127.0.0.1:${e}/api/health`)).ok)return !0}catch{}await new Promise(o=>setTimeout(o,500));}return false}async function _d(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await Hn({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await Sd(e.port);console.log(n?S.green(" Server ready"):S.yellow(" Server started but health check timed out")),console.log(""),console.log(S.green("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(S.green("\u2551")+" DevFlow Started! "+S.green("\u2551")),console.log(S.green("\u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563")),console.log(S.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+S.green("\u2551")),console.log(S.green("\u2551")+" "+S.green("\u2551")),console.log(S.green("\u2551")+" Press Ctrl+C to stop "+S.green("\u2551")),console.log(S.green("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),e.background||await new Promise(o=>{let r=false,s=async()=>{r||(r=true,console.log(S.blue(`
|
|
235
|
+
Shutting down...`)),await ft(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var Is=O(()=>{_e();});var Ls={};$(Ls,{stopAll:()=>Ed});async function Ed(){let e=await ft();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var Fs=O(()=>{_e();});var Ws={};$(Ws,{showStatus:()=>xd});function Od(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 xd(){console.log(S.blue("DevFlow Status")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await mt(),t=e.port??Fn;e.running?(console.log(`Server: ${S.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${S.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${S.yellow("\u25CB")} not running`),console.log(`Dashboard: ${S.yellow("\u25CB")} not running`));let n=homedir$1(),o=Ce(n),r=o.root?et(n,o.root):[];o.root?console.log(`Plugin: ${S.green("\u2713")} v${o.version??"unknown"} (${o.root})`):console.log(`Plugin: ${S.yellow("\u25CB")} active cache not resolved`),console.log(`Skills: ${r.length===0?S.green("\u2713"):S.red("!")} ${r.length} shadowed`);let s=getGlobalDevFlowDbPath();if(existsSync(s)){let u=(statSync(s).size/1024/1024).toFixed(1);console.log(`Data: ${s} (${u} MB)`);}else console.log(`Data: ${S.dim(`no global database (${s})`)}`);let i=join(process.cwd(),".devflow","devflow.db"),a=join(process.cwd(),".codegraph","codegraph.db"),c=[...existsSync(i)?[i]:[],...Od(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var Us=O(()=>{_e();Be();});var Bs={};$(Bs,{setupCommand:()=>Wd});function Md(){try{return Dt()}catch{return}}function Ld(e){try{return Id.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 Fd(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 Hd(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 Wd(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=Ld(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=Md();if(r.id==="claude-code"&&l)try{let u=Fd(l),g=join$1(n.homeDir,".claude","plugins","cache");Ot(l,g,u),l=join$1(g,"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)Hd(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 Id,qs=O(()=>{Be();Id=createRequire$1(import.meta.url);});var Ks={};$(Ks,{pluginListCommand:()=>Bd});var Bd,Js=O(()=>{xt();Bd=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Oe();if(e.installed){let n=To();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
235
236
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
236
|
-
`),n.forEach(o=>{let r=t.plugins.find(s=>s.name===o);r?(console.log(` ${
|
|
237
|
-
`);let n=Math.max(...t.plugins.map(o=>o.name.length));t.plugins.forEach(o=>{let r=" ".repeat(n-o.name.length+2);console.log(` ${
|
|
238
|
-
Install a plugin: devflow plugin install <name>`);}});});var
|
|
237
|
+
`),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}):
|
|
238
|
+
`);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(`
|
|
239
|
+
Install a plugin: devflow plugin install <name>`);}});});var zs={};$(zs,{pluginSearchCommand:()=>Jd});var Jd,Vs=O(()=>{xt();Jd=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Oe(),n=e.toLowerCase(),o=t.plugins.filter(r=>r.name.toLowerCase().includes(n)||r.description.toLowerCase().includes(n)||r.tags.some(s=>s.toLowerCase().includes(n)));if(o.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
|
|
239
240
|
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
240
|
-
`),o.forEach(r=>{console.log(` ${
|
|
241
|
-
${
|
|
241
|
+
`),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 Ys={};$(Ys,{pluginInstallCommand:()=>Vd});var Vd,Zs=O(()=>{be();Vd=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 xe(n,process.cwd(),!0);console.log(`
|
|
242
|
+
${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
|
|
242
243
|
Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
|
|
243
|
-
${
|
|
244
|
-
${
|
|
245
|
-
${
|
|
246
|
-
`));}let n=Qt(t);console.error(_.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Do(),Co)),s=await o(t,{force:e.force,migrateLegacySkills:e.migrateLegacySkills});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(r(s.onboardingPack));else {if(s.created.length>0){console.log(_.green("Created:"));for(let i of s.created)console.log(` ${_.dim("+")} ${i}`);}else console.log(_.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(_.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(_.green("\u2705 Onboarding pack generated")),console.log(_.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(_.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(_.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(_.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(_.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>($o(),Oo)),a=await i(t,e.withPlugin);console.log(_.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(un(),ln));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(un(),ln));await i(t);}}});R.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(()=>(rr(),or));t(e,{},{log:o=>console.log(o),error:o=>console.error(_.red(o))})||(process.exitCode=1);});var zd=R.command("db").description("Manage DevFlow databases");zd.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(()=>(mr(),fr)),o=t(e);for(let r of n(o))console.log(r);});R.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=Qt(n);console.log(_.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(hr(),pr));if(e){let i=s();i.includes(e)||(console.log(_.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await r({agent:e,command:t.command});for(let a of i)console.log(_.green(`\u2713 ${a}`));}catch(i){console.error(_.red(`Error: ${i.message}`)),process.exit(1);}});R.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(kr(),vr)),o=e.backfillVectors?await n(R.opts().local):await t(R.opts().local);console.log(_.blue("Index Status")),console.log(` Files: ${o.totalFiles}`),console.log(` Symbols: ${o.totalSymbols}`),console.log(` Indexing: ${o.indexing?"active":"idle"}`),e.watch&&console.log(_.dim(" (watch mode not yet implemented)"));});R.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(br(),wr)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:R.opts().local});console.log(_.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});R.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(()=>(_n(),bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.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(()=>(_n(),bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(_.blue(`Context: "${e}"`)),console.log(` Files: ${o.files.length}`),console.log(` Confidence: ${(o.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${o.tokenCount}`);}});var Zt=R.command("workflow").description("Workflow management");Zt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);if(t.length===0){console.log(_.dim("No workflows registered."));return}for(let n of t)console.log(`${_.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});var _t=R.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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});Zt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ct(),at)),o=await n(e,{input:t??""},R.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Zt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Zt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);if(t.length===0){console.log(_.dim("No runs yet."));return}for(let n of t){let o=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${_.yellow(n.status)} ${o}`);}});var Xs=R.command("embeddings").description("Manage the shared verified embedding model");Xs.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(()=>(Rn(),En)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Xs.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(()=>(Rn(),En)),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(_.red(`Embedding model preparation failed: ${t.message}`)),process.exitCode=1;}});var Le=R.command("memory").description("Memory management");Le.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Ae)),n=await t(R.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Le.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),Ae));console.log(JSON.stringify(await t(R.opts().local,e.source),null,2));});Le.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(xe(),Ae)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:R.opts().local});console.log(JSON.stringify(o,null,2));});Le.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(xe(),Ae));await n(e,t,R.opts().local),console.log(_.green(`Memory set: ${e} = ${t}`));});Le.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(xe(),Ae)),t=await e(R.opts().local);console.log(JSON.stringify(t,null,2));});Le.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(xe(),Ae)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(_.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});R.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(Pr(),Rr)),o=(await t(e,void 0,void 0,R.opts().local)).results;console.log(_.blue(`Knowledge: "${e}"`)),console.log(` Results: ${o.length}`);for(let r of o.slice(0,5))console.log(` \u2014 ${r.title}`);});var mo=R.command("docs").description("Documentation index management");mo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(_.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),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(` ${_.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${_.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(_.green(`
|
|
247
|
-
${e} docs synced to .devflow/knowledge/${e}/`));}else {let r=await o.getSources();for(let s of r){let i=await o.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${
|
|
248
|
-
All docs synced.`));}});mo.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(()=>(An(),$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(_.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});mo.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(()=>(An(),$n));console.log(_.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${_.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${_.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(_.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var St=R.command("skill").description("Plugin/Skill management");St.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),nt)),t=await e(R.opts().local);if(t.length===0){console.log(_.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${_.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});St.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),nt)),n=await t(e,R.opts().local);if(console.log(_.blue(`Search: "${e}"`)),n.length===0){console.log(_.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${_.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});St.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),nt)),n=await t(e,process.cwd(),R.opts().local);console.log(_.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});St.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),nt));await t(e,process.cwd(),R.opts().local),console.log(_.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(_.red(`Error: ${t.message}`)),process.exit(1);}});St.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(()=>(Nn(),Dr));process.exitCode=t(e);});var ei=R.command("mcp").description("Inspect MCP configuration and health");ei.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(()=>(Tn(),jn));await t(e);});ei.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(()=>(Tn(),jn));await t(e);});R.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(()=>(ks(),vs));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});Le.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(bs(),ws));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(_.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});R.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(()=>(Ss(),_s)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ti=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ti.command("run").description("Run a benchmark suite and persist the report").option("--suite <id>","Benchmark suite","default").option("--project <root>","Initialized project root",process.cwd()).option("--rounds <n>","Rounds per task","1").option("--output <format>","text | json","text").action(async e=>{let{runBenchmarkCommand:t}=await Promise.resolve().then(()=>(io(),so));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var ni=R.command("eval").description("Run and inspect evidence-bound repeated evaluations");ni.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(()=>(lo(),co));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});ni.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(lo(),co));console.log(t({runId:e.run,output:e.json?"json":"text"}));});ti.command("report").description("Render a persisted benchmark report").option("--run-id <id>","Specific report; defaults to latest").option("--baseline <id>","Prior report used for regression comparison").option("--output <format>","text | json | markdown","text").action(async e=>{let{reportBenchmarkCommand:t}=await Promise.resolve().then(()=>(io(),so));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.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(()=>($s(),Os)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var po=R.command("server").description("Manage DevFlow server");po.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(_.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(Se(),Mt)),n=await t({port:parseInt(e.port,10)});console.log(_.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});po.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(Se(),Mt)),t=await e();console.log(t?_.green("Server stopped"):_.dim("No server running"));});po.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(Se(),Mt)),t=await e();t.running?console.log(_.green(`Running (pid: ${t.pid})`)):console.log(_.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');console.log(_.blue("The Dashboard is served by the DevFlow server.")),console.log(_.dim("Run: devflow start")),console.log(_.dim(`Then open: ${e().url}`));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(xs(),As));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Ts(),js));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Ls(),Ms));await e();});R.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(()=>(Hs(),Fs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=R.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(()=>(Us(),Ws)),Promise.resolve().then(()=>(Bs(),qs)),Promise.resolve().then(()=>(zs(),Js)),Promise.resolve().then(()=>(Ys(),Gs))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await R.parseAsync();
|
|
244
|
+
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var Xs={};$(Xs,{pluginUninstallCommand:()=>Yd});var Yd,ei=O(()=>{be();Yd=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Uninstalling ${n}...`);try{await cn(n,process.cwd(),!0),console.log(`
|
|
245
|
+
${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
|
|
246
|
+
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Qt(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 ni=createRequire(import.meta.url),fo="0.0.0";try{fo=ni("../package.json").version;}catch{try{fo=ni("../../package.json").version;}catch{}}var R=new Command;R.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(fo).option("--local","Force local engine, skip server");var eg=R.command("logs").description("Inspect and clean diagnostic logs");eg.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(()=>(ko(),vo)),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));});R.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").option("--migrate-legacy-skills","Back up and remove global devflow:* skill shadows").action(async e=>{let t=process.cwd();if(e.abort){console.log(S.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=Qd.join(t,a);ti.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),ti.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
|
|
247
|
+
`));}let n=Qt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Ao(),$o)),s=await o(t,{force:e.force,migrateLegacySkills:e.migrateLegacySkills});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(r(s.onboardingPack));else {if(s.created.length>0){console.log(S.green("Created:"));for(let i of s.created)console.log(` ${S.dim("+")} ${i}`);}else console.log(S.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(S.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(S.green("\u2705 Onboarding pack generated")),console.log(S.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(S.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(S.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(S.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(S.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>(jo(),No)),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(()=>(un(),ln));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(un(),ln));await i(t);}}});R.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(()=>(cr(),ar));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var tg=R.command("db").description("Manage DevFlow databases");tg.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(()=>(vr(),yr)),o=t(e);for(let r of n(o))console.log(r);});R.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=Qt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(wr(),kr));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);}});R.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(()=>(_r(),Sr)),o=e.backfillVectors?await n(R.opts().local):await t(R.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)"));});R.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(Rr(),Er)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:R.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});R.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(Sn(),bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.opts().local});console.log(JSON.stringify({requiredFiles:o.requiredFiles,optionalFiles:o.optionalFiles,riskHints:o.riskHints,nextActions:o.nextActions,reasoning:t.why?o.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(Sn(),bn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:R.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 Zt=R.command("workflow").description("Workflow management");Zt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.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=R.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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));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(()=>(Ge(),Ve));console.log(r(e,{projectRoot:o.project,json:o.json}));});Zt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ct(),at)),o=await n(e,{input:t??""},R.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Zt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Zt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ct(),at)),t=await e(R.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 oi=R.command("embeddings").description("Manage the shared verified embedding model");oi.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(()=>(Rn(),En)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});oi.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(()=>(Rn(),En)),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 Le=R.command("memory").description("Memory management");Le.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),$e)),n=await t(R.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Le.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Ae(),$e));console.log(JSON.stringify(await t(R.opts().local,e.source),null,2));});Le.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(Ae(),$e)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:R.opts().local});console.log(JSON.stringify(o,null,2));});Le.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Ae(),$e));await n(e,t,R.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Le.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Ae(),$e)),t=await e(R.opts().local);console.log(JSON.stringify(t,null,2));});Le.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(Ae(),$e)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});R.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(xr(),Or)),o=(await t(e,void 0,void 0,R.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 mo=R.command("docs").description("Documentation index management");mo.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(S.blue(`\u25C9 Syncing docs${e?` for ${e} plugin`:""}`));let[{KnowledgeEngine:t},{EmbeddingProvider:n}]=await Promise.all([import('@devflow-tools/knowledge-engine'),import('@devflow-tools/memory-engine')]),o=new t({projectRoot:process.cwd(),projectId:(await import('@devflow-tools/sdk')).resolveStableProjectIdentity(process.cwd()).projectId,embedder:new n});if(e){let r=await o.syncDocs(e);for(let s of r)s.added>0?console.log(` ${S.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${S.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(S.green(`
|
|
248
|
+
${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(`
|
|
249
|
+
All docs synced.`));}});mo.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>($n(),xn)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:o,remaining:r})=>{console.log(` vectors: ${o} processed, ${r} remaining`);}});console.log(S.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});mo.command("resync [plugin-name]").description("Rebuild documentation chunks before vector backfill").requiredOption("--with-headings","Use heading-aware 500-3000 character chunks").action(async(e,t)=>{let{resyncKnowledgeDocs:n}=await Promise.resolve().then(()=>($n(),xn));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=R.command("skill").description("Plugin/Skill management");_t.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),nt)),t=await e(R.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(()=>(be(),nt)),n=await t(e,R.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(()=>(be(),nt)),n=await t(e,process.cwd(),R.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(()=>(be(),nt));await t(e,process.cwd(),R.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(()=>(Nn(),Ar));process.exitCode=t(e);});var ri=R.command("mcp").description("Inspect MCP configuration and health");ri.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(()=>(Tn(),jn));await t(e);});ri.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(()=>(Tn(),jn));await t(e);});R.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(()=>(_s(),Ss));if(e.audit){let a=await n();console.log(e.json?JSON.stringify(a):`Audit chain: ${a.valid?"VALID":`BROKEN at seq ${a.brokenAt}`} (${a.entryCount} entries)`);return}if(e.auditFix){let a=await o();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await r(e.last);console.log(e.json?JSON.stringify(a):JSON.stringify(a,null,2));return}if(e.receipts){let a=s();e.json?console.log(JSON.stringify(a)):a.data?console.log(JSON.stringify(a.data,null,2)):console.log(`No active receipt found for session ${a.sessionId}.`);return}let i=await t({project:e.project,json:e.json,strict:e.strict});process.exitCode=i;});Le.command("maintain").description("Audit or repair Memory data; defaults to a read-only dry-run").option("--project <path>","Project directory",process.cwd()).option("--actions <names>","Comma-separated actions").option("--apply","Apply changes after creating a SQLite backup").option("--json","Output the audit manifest as JSON").option("--batch-size <n>","Embedding backfill batch size","32").action(async e=>{try{let{runMemoryMaintainCommand:t}=await Promise.resolve().then(()=>(Rs(),Es));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;}});R.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(()=>(Cs(),Ps)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var si=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");si.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(()=>(io(),so));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});var ii=R.command("eval").description("Run and inspect evidence-bound repeated evaluations");ii.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(()=>(lo(),co));console.log(await n({projectRoot:e.project,suite:e.suite,trials:t,output:e.output}));});ii.command("report").requiredOption("--run <id>","Evaluation run ID").option("--json","Render JSON").action(async e=>{let{reportEvaluationCommand:t}=await Promise.resolve().then(()=>(lo(),co));console.log(t({runId:e.run,output:e.json?"json":"text"}));});si.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(()=>(io(),so));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.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(()=>(js(),Ns)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var po=R.command("server").description("Manage DevFlow server");po.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(S.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(_e(),Mt)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});po.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(_e(),Mt)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});po.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(_e(),Mt)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(async()=>{let{resolveRuntimeEndpoint:e}=await import('@devflow-tools/sdk');console.log(S.blue("The Dashboard is served by the DevFlow server.")),console.log(S.dim("Run: devflow start")),console.log(S.dim(`Then open: ${e().url}`));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(Is(),Ts));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Fs(),Ls));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Us(),Ws));await e();});R.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(()=>(qs(),Bs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Yt=R.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(()=>(Js(),Ks)),Promise.resolve().then(()=>(Vs(),zs)),Promise.resolve().then(()=>(Zs(),Ys)),Promise.resolve().then(()=>(ei(),Xs))]);Yt.addCommand(e),Yt.addCommand(t),Yt.addCommand(n),Yt.addCommand(o);}await R.parseAsync();
|