@devflow-tools/devflow 0.16.13 → 0.16.15
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 +50 -50
- package/dist/dashboard/404.html +1 -1
- package/dist/dashboard/accuracy.html +1 -1
- package/dist/dashboard/accuracy.txt +1 -1
- package/dist/dashboard/benchmark.html +1 -1
- package/dist/dashboard/benchmark.txt +1 -1
- package/dist/dashboard/context.html +1 -1
- package/dist/dashboard/context.txt +1 -1
- package/dist/dashboard/doctor.html +1 -1
- package/dist/dashboard/doctor.txt +1 -1
- package/dist/dashboard/executions.html +1 -1
- package/dist/dashboard/executions.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.html +1 -1
- package/dist/dashboard/knowledge.txt +1 -1
- package/dist/dashboard/memory.html +1 -1
- package/dist/dashboard/memory.txt +1 -1
- package/dist/dashboard/replay.html +1 -1
- package/dist/dashboard/replay.txt +1 -1
- package/dist/dashboard/runs/_.html +1 -1
- package/dist/dashboard/runs/_.txt +1 -1
- package/dist/dashboard/runs.html +1 -1
- package/dist/dashboard/runs.txt +1 -1
- package/dist/dashboard/settings.html +1 -1
- package/dist/dashboard/settings.txt +1 -1
- package/dist/dashboard/timeline.html +1 -1
- package/dist/dashboard/timeline.txt +1 -1
- package/dist/dashboard/tool-metrics.html +1 -1
- package/dist/dashboard/tool-metrics.txt +1 -1
- package/dist/dashboard/workflows.html +1 -1
- package/dist/dashboard/workflows.txt +1 -1
- package/dist/hooks/hook-daemon.js +20 -18
- package/dist/hooks/session-end.js +4 -4
- package/dist/hooks/stop.js +9 -9
- package/dist/hooks/user-prompt-submit.js +1 -1
- 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 +20 -18
- package/dist/plugin/dist/hooks/session-end.js +4 -4
- package/dist/plugin/dist/hooks/stop.js +9 -9
- package/dist/plugin/dist/hooks/user-prompt-submit.js +1 -1
- package/dist/plugin/hooks/post-tool-use +5 -3
- package/dist/plugin/hooks/post-tool-use-failure +5 -3
- package/dist/plugin/hooks/pre-compact +5 -3
- package/dist/plugin/hooks/pre-tool-use +5 -3
- package/dist/plugin/hooks/runtime-node +25 -0
- package/dist/plugin/hooks/session-end +5 -3
- package/dist/plugin/hooks/session-start +17 -15
- package/dist/plugin/hooks/stop +4 -2
- package/dist/plugin/hooks/user-prompt-submit +5 -3
- package/dist/plugin/package.json +12 -9
- package/package.json +13 -13
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{DMSlahSU9ERwQ2grwM6p9 → K3uuaaMHH_cQqszC4CJC9}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{DMSlahSU9ERwQ2grwM6p9 → K3uuaaMHH_cQqszC4CJC9}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
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 {
|
|
3
|
-
`,"utf-8"),a}function
|
|
4
|
-
`);}function
|
|
5
|
-
`);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[
|
|
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 Ae(e,t=process.cwd(),n){return
|
|
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,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,readPersistedClaudeHookNode,resolveClaudeHookRuntime,verifyClaudeHookNativeRuntime,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,writeRuntimeEndpointState,updateRuntimeEndpointStatus,readRuntimeEndpointState,resolveRuntimeEndpoint,DEFAULT_DEVFLOW_SERVER_PORT,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,createDefaultHostAdapterRegistry,acquireRuntimeHttpCircuit,DevFlowApiClient,registerRuntimeHttpSuccess,registerRuntimeHttpFailure,selectHostAdapter,loadPluginsWithDiagnostics,listRuntimeHttpCircuits,readPluginInstallState,runNpmWithClaudeHookRuntime,persistClaudeHookRuntime,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import Ts,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import Yu,{join,dirname as dirname$1}from'path';import {homedir}from'os';import {createRequire}from'module';import lo from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';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}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import Fa from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {spawnSync}from'node:child_process';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Hs=Object.defineProperty;var A=(e,t)=>()=>(e&&(t=e(e=0)),t);var O=(e,t)=>{for(var n in t)Hs(e,n,{get:t[n],enumerable:true});};function wt(){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 Xs)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:eo(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,Jt);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:eo(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 Ge(e,t){let n=ei(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=oo(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=Kt(c.content),d=readFileSync$1(l,"utf-8"),g=Kt(d);r.push({skillName:c.name,globalPath:a,pluginPath:l,globalHash:u,pluginHash:g,isKnownDevFlowArtifact:u===g});}return r.sort((i,a)=>i.skillName.localeCompare(a.skillName))}function no(e,t,n,o=Date.now,r={}){let s=Ge(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()||Kt(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)}
|
|
3
|
+
`,"utf-8"),a}function ei(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=oo(r);s&&t.set(s.name,r);}return t}function oo(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 Kt(e){return createHash("sha256").update(e).digest("hex")}function eo(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 ro(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[ht]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",Fe),r=de(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[Fe]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`);}function so(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 io(e,t,n){let o=join$1(t,Fe,Jt,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&yt(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)&&yt(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&yt(a,join$1(o,"skills")),oi(o,e),ri(o),ti(t,o),ni(t,o,n);}function ti(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",Fe),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:Fe,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:Jt,source:s}]},null,2)}
|
|
5
|
+
`);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[Fe]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
6
|
+
`);}function ni(e,t,n){let o=join$1(e,"..","installed_plugins.json"),r={version:2,plugins:{}};if(existsSync$1(o)){let f;try{f=JSON.parse(readFileSync$1(o,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${o}`)}if(!de(f))throw new Error(`Invalid Claude plugin registry: ${o}`);r=f;}else mkdirSync$1(dirname(o),{recursive:true});let s=r.plugins;if(s!==void 0&&!de(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[ht];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${ht}`);let c=a??[],l=c.find(f=>de(f)&&f.scope==="user"),u=new Date().toISOString(),d=de(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!de(f)||f.scope!=="user");i[ht]=[...g,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:u}],r.version=2,r.plugins=i,writeFileSync$1(o,`${JSON.stringify(r,null,2)}
|
|
7
|
+
`);}function de(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function oi(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 yt(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()?yt(o,r):cpSync(o,r,{force:true});}}function ri(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 ht,Fe,Jt,Xs,We=A(()=>{ht="devflow@devflow-local",Fe="devflow-local",Jt="devflow",Xs=["devflow@devflow-local","devflow@devflow"];});var fo={};O(fo,{initProject:()=>di,renderInitReport:()=>go});async function di(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(uo.isInitialized(e)||await uo.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),d=await a.build(l,u);s.indexed={files:c.length,symbols:l.length,graphNodes:d.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,go(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=wt(),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";io(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=no(a,d,u,Date.now,{includeModified:t.migrateLegacySkills}).map(g=>g.skillName);}catch(g){console.warn(`Warning: Legacy skill migration skipped \u2014 ${g.message}`);}}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");ro(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=ui.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}so(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function go(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(`
|
|
8
|
+
`)}var uo,ui,mo=A(()=>{We();uo=lo.default??lo,ui=createRequire(import.meta.url);});var po={};O(po,{reviewPluginMemoryHints:()=>pi});async function pi(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(hi).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 d=s.get(u);for(let g of d?.memory?.project?.conventions??[])i.push({id:`${u}:${g.key}`,pluginName:u,convention:g});}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??yi)(e,l),{available:i.length,selected:l.length}}function hi(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function yi(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}`});}finally{n.close();}}var ho=A(()=>{});function Be(){let e=[join(process.cwd(),"plugin-registry.json"),join(_i,"../plugin-registry.json"),join(process.cwd(),"packages/devflow/plugin-registry.json")];for(let t of e)try{let n=readFileSync(t,"utf-8");return JSON.parse(n)}catch{continue}return {version:"0.0.0",lastUpdated:new Date().toISOString(),plugins:[]}}function yo(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var Si,_i,bt=A(()=>{Si=fileURLToPath$1(import.meta.url),_i=dirname$1(Si);});async function x(e,t,n,o={}){let r=o.serverUrl??resolveRuntimeEndpoint().url;if(o.skipServer)return n();let s=false,i=ko.get(r);if(i&&Date.now()-i.ts<Ai?s=i.result:acquireRuntimeHttpCircuit(r,"/api/health").allowed&&(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),s?registerRuntimeHttpSuccess(r,"/api/health"):registerRuntimeHttpFailure(r,"/api/health","cli_local_engine_fallback"),ko.set(r,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:r,projectRoot:e});return t(a)}return console.error(S.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var ko,Ai,we=A(()=>{ko=new Map,Ai=3e4;});var bo=A(()=>{});var Ze={};O(Ze,{installSkill:()=>Ae,listSkills:()=>Co,listSkillsSync:()=>ji,searchSkills:()=>Ii,uninstallSkill:()=>Qt});async function Co(e){return x(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 ji(){return []}async function Ii(e,t){let n=await Co(),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 Do(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 Ao(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function $o(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)}
|
|
9
|
+
`,"utf-8"),renameSync$1(o,n);}async function Ae(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=Do(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(Ye,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync("npm",["install","--prefix",Ye,o],{stdio:"pipe",timeout:6e4});let a=Ao(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),$o(t,a));let c=[],l="0.0.0",u=join(Ye,"node_modules",...o.split("/"));try{let d=JSON.parse(readFileSync(join(u,"package.json"),"utf-8"));c=d?.devflow?.templates??[],l=typeof d.version=="string"?d.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 d=extractPlugin(await importPluginModule({packageName:o,modulePath:u,source:"npm",installPath:u}),o);if(d){let g={projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}};i&&d.onUpdate?await d.onUpdate(g,i.version):!i&&d.onInstall&&await d.onInstall(g);}}catch(d){let f=readPluginInstallState().plugins[o];throw f&&(f.lastLoad={status:"failed",checkedAt:new Date().toISOString(),reason:d.message},upsertPluginInstallRecord(f)),new Error(`Plugin lifecycle failed: ${d.message}`)}return {name:r,version:l,templates:c}},{skipServer:true})}async function Qt(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=Do(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=Ao(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),$o(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("npm",["uninstall","--prefix",Ye,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(Ye,"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 Ye,be=A(()=>{we();bo();Ye=getPluginInstallRoot();});var Xt={};O(Xt,{detectTechStack:()=>Oo,guidePluginInstallation:()=>Ui,installPluginsFromList:()=>Hi,resolvePluginName:()=>xo});function Oo(e){let t=[];try{let n=JSON.parse(readFileSync(join(e,"package.json"),"utf-8")),o={...n.dependencies??{},...n.devDependencies??{}};o.react&&t.push("react"),o.next&&t.push("nextjs"),o.vue&&t.push("vue"),o.tailwindcss&&t.push("tailwind"),(o.nest||o["@nestjs/core"])&&t.push("nest"),o.express&&t.push("express"),o.typescript&&t.push("typescript");}catch{}return t}function xo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function Hi(e){let t=e.split(",").map(xo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await Ae(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function Ui(e){let t=Be();if(t.plugins.length===0)return console.log(`
|
|
10
10
|
No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
11
11
|
`),[];console.log(`
|
|
12
12
|
\u{1F50C} Plugin Installation Guide
|
|
13
|
-
`);let n
|
|
13
|
+
`);let n=Oo(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
|
|
14
14
|
`);let o=new Set(t.plugins.filter(i=>i.compatibleStacks.some(a=>n.includes(a))).map(i=>i.name));if(!process.stdout.isTTY){console.log(`Non-interactive terminal detected. Installing recommended plugins...
|
|
15
15
|
`);let i=[...o];for(let a of i)try{await Ae(a,e,!0),console.log(`\u2713 ${a}`);}catch{console.error(`\u2717 Failed to install ${a}`);}return i}let r=t.plugins.map(i=>({name:`${i.name.replace("@devflow-tools/","")} - ${i.description.substring(0,50)}`,value:i.name,checked:o.has(i.name)})),s;try{s=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:r});}catch{return console.log(`
|
|
16
16
|
Plugin installation cancelled.
|
|
@@ -20,20 +20,20 @@ Installing selected plugins...
|
|
|
20
20
|
`);}catch{console.error(`\u2717 Failed to install ${i}
|
|
21
21
|
`);}}else console.log(`
|
|
22
22
|
Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
23
|
-
`);return s}var en=A(()=>{bt();be();});var
|
|
23
|
+
`);return s}var en=A(()=>{bt();be();});var Bo={};O(Bo,{ResetExecutionError:()=>Qe,executeResetCommand:()=>la,formatResetResult:()=>sn,runReset:()=>Wo});function ea(){if(St)return St;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return St=e.DatabaseSync,St}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function sn(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function ta(e){return e==="all"||Lo.includes(e)}function se(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function nn(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 an(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function na(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 Fo(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(!an(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function oa(e,t){return (e==="all"?Lo:[e]).map(o=>({scope:o,path:join$1(t,...Mo[o])}))}function Ho(e,t){let n=se(t);if(n)return Fo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Uo(e,t){let n=Ho(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 ra(e){let t=se(e);if(!t?.isFile()||t.size<tn.length)return false;let n=Buffer.alloc(tn.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(tn)}finally{closeSync(o);}}function sa(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}ra(o)&&t.push(o);}}return n(e),t}function ia(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(ea())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function aa(e,t,n){let o=sa(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));ia(s,i);}}function ca(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),aa(c.path,join$1(i,c.scope),()=>Uo(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 Wo(e,t={}){if(!ta(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=na(e.project??process.cwd()),o=oa(e.scope,n);for(let c of o)Fo(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=Ho(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?nn(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=nn(l.path),d=join$1(s,l.scope),g=nn(d);if(an(u,g)||an(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(se(d))throw new Error(`Backup destination already exists: ${d}`)}}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&&ca(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),Uo(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new Qe(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function la(e,t={},n=console){try{let o=Wo(e,t),r=sn(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof Qe)for(let r of sn(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var St,Qe,Mo,Lo,tn,qo=A(()=>{Qe=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Mo={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Lo=Object.keys(Mo),tn=Buffer.from("SQLite format 3\0","binary");});var Xo={};O(Xo,{consolidateDatabases:()=>fa,formatConsolidateResult:()=>ma});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=[Jo("project",o,s?n:void 0),Jo("codegraph",r,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(f=>f.exists&&Object.keys(f.tables).length>0),l=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),u=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??u,l);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let g=c.some(f=>f.kind==="project")?pa(o):null;try{let f=new Map;for(let y of c){let k=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);zo(y.path,k),f.set(y.kind,k);}s&&zo(n,join$1(d,"global-devflow.db.before"));let p=f.has("project")?ya(o,d):[];a.retired.push(...p.map(y=>y.destination));let m=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),m=new DatabaseSync(n),m.exec("PRAGMA busy_timeout = 10000"),m.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&m.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&m.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),m.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&Vo(m,"project_source",void 0,a.inserted),f.has("codegraph")){Vo(m,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let k of tt(m,"codegraph_source").filter(C=>C.startsWith("devflow_")))m.exec(`DROP TABLE codegraph_source.${F(k)}`);}m.exec("COMMIT"),h=!1;}catch(y){if(h)try{m?.exec("ROLLBACK");}catch{}throw Qo(p),y}finally{m?.close();}return a}finally{ha(g);}}function ma(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 Jo(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 tt(r).filter(c=>!i||i.has(c)))o.tables[a]=dn(r,a),o.conflicts[a]=s&&tt(s).includes(a)?va(r,s,a):0;}finally{r.close(),s?.close();}return o}function zo(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 pa(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 ha(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function ya(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 Qo(n),o}return n}function Qo(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Vo(e,t,n,o){let r=new Set(tt(e)),s=tt(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=Et(e,"main",i),c=new Set(Et(e,t,i).map(p=>p.name)),l=a.filter(p=>c.has(p.name));if(un.has(i)&&(l=l.filter(p=>p.pk===0)),l.length===0)continue;let u=dn(e,i),d=l.map(p=>F(p.name)).join(", "),g=l.map(p=>`s.${F(p.name)}`).join(", ");if(l.filter(p=>p.pk>0).length>0&&!un.has(i))e.exec(`INSERT OR IGNORE INTO main.${F(i)} (${d}) SELECT ${g} FROM ${F(t)}.${F(i)} s`);else {let p=l.map(m=>`t.${F(m.name)} IS s.${F(m.name)}`).join(" AND ");e.exec(`
|
|
24
24
|
INSERT INTO main.${F(i)} (${d})
|
|
25
25
|
SELECT ${g} FROM ${F(t)}.${F(i)} s
|
|
26
26
|
WHERE NOT EXISTS (SELECT 1 FROM main.${F(i)} t WHERE ${p})
|
|
27
|
-
`);}o[i]=(o[i]??0)+(dn(e,i)-u);}}function
|
|
28
|
-
`)}var hn=A(()=>{});var $e={};
|
|
29
|
-
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await
|
|
30
|
-
Reviewed ${o}/${t.length} pending memories.`);}var
|
|
27
|
+
`);}o[i]=(o[i]??0)+(dn(e,i)-u);}}function va(e,t,n){let o=new Set(Et(t,"main",n).map(l=>l.name)),r=Et(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||un.has(n))return 0;let s=r.map(l=>F(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${F(n)}`).all(),a=r.map(l=>`${F(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${F(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function tt(e,t="main"){return e.prepare(`SELECT name FROM ${F(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function Et(e,t,n){return e.prepare(`PRAGMA ${F(t)}.table_info(${F(n)})`).all()}function dn(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${F(t)}`).get();return Number(n.count)}function F(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var un,er=A(()=>{un=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var tr={};O(tr,{connectAgent:()=>ba,getAvailableAgents:()=>Sa});async function ba(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 Sa(){return listAdapters()}var nr=A(()=>{});var rr={};O(rr,{getIndexStatus:()=>_a,refreshIndex:()=>Ea});async function _a(e){return x(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 Ea(e){return x(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var sr=A(()=>{we();});var ir={};O(ir,{getGraph:()=>Ra});async function Ra(e={}){let t=e.target??"all",n=e.depth??2;return x(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 ar=A(()=>{we();});var gn={};O(gn,{getContext:()=>Da,getTaskContext:()=>Aa});async function Da(e){return x(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 Aa(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return x(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;return getProjectContextResult(o,{query:e.query,...n},i)},{skipServer:e.skipServer})}var fn=A(()=>{we();});var nt={};O(nt,{getWorkflowRuns:()=>lr,getWorkflowStatus:()=>xa,listWorkflows:()=>$a,runWorkflow:()=>Oa});async function $a(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function Oa(e,t,n){return x(process.cwd(),o=>o.runWorkflow(e,t),async()=>{let{workflow:o}=await createEngines(process.cwd());return o.run(e,t)},{skipServer:n})}async function xa(e){return lr(e)}async function lr(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var ot=A(()=>{we();});var pn={};O(pn,{getEmbeddingStatus:()=>ja,prepareEmbeddings:()=>Ia,renderEmbeddingStatus:()=>Ma});async function ja(){return inspectEmbeddingModel()}async function Ia(e={}){return prepareEmbeddingModel({endpoints:e.endpoints,timeoutMs:e.timeoutMs})}function Ma(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(`
|
|
28
|
+
`)}var hn=A(()=>{});var $e={};O($e,{backfillObservationVectors:()=>qa,queryMemory:()=>Ua,reviewCandidates:()=>Ba,reviewMemories:()=>Ja,setMemory:()=>Wa,showMemory:()=>Ha});async function Ha(e,t){let n=await x(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 Ua(e={}){let t=process.cwd(),{skipServer:n,...o}=e;return x(t,r=>r.queryMemory(o),async()=>{let{memory:r}=await createEngines(t);return getMemoryResult(r,o)},{skipServer:n})}async function Wa(e,t,n){return x(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 Ba(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function qa(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Ka(e){let t=Fa.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function Ja(){let t=await x(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(`
|
|
29
|
+
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await Ka(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await x(process.cwd(),async i=>{await i.approveMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Approved"),o++):s==="n"?(await x(process.cwd(),async i=>{await i.rejectMemory(r.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),o++):console.log(" -> Skipped");}console.log(`
|
|
30
|
+
Reviewed ${o}/${t.length} pending memories.`);}var Oe=A(()=>{we();});var dr={};O(dr,{getDocsStatus:()=>Ga,queryKnowledge:()=>ur,searchKnowledge:()=>Va,syncDocs:()=>Ya});async function ur(e,t,n,o){return x(process.cwd(),r=>r.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let r=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(r,{query:e,scope:t,budgetTokens:n})},{skipServer:o})}async function Va(e,t,n){return (await ur(e,t,void 0,n)).results}async function Ga(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ya(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var gr=A(()=>{we();});var kn={};O(kn,{backfillKnowledgeVectors:()=>ec,resyncKnowledgeDocs:()=>Xa});function fr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function Xa(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=fr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function ec(e={}){let t=fr(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var wn=A(()=>{});var mr={};O(mr,{inspectSkillHealth:()=>Pt,showSkillHealth:()=>cc});function ic(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 Pt(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=[];ac(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=ic(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 d=u.name.startsWith("devflow:")?u.name.slice(8):u.name;u.name!==c.name&&d!==c.name&&n.push({category:"stale",skill:u.name,path:l,reason:`directory name ${c.name} does not match frontmatter`});let g=a.get(u.name)??[];g.push(l),a.set(u.name,g);}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),d=join$1(t,l.skillPath.replace(/^skills\/devflow:/,"skills/"));!existsSync$1(u)&&!existsSync$1(d)&&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 ac(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 cc(e={}){let t=Pt(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 Sn=A(()=>{We();});var _n={};O(_n,{showMcpHealth:()=>mc,showMcpInventory:()=>fc});async function fc(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 mc(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 En=A(()=>{});var Ct={};O(Ct,{DEFAULT_SERVER_PORT:()=>Dn,readPidFromFile:()=>st,readPortFromFile:()=>kr,serverStatus:()=>ct,startServer:()=>An,stopServer:()=>at});function Cn(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function _c(){try{return yr.resolve("./server.js")}catch{try{return yr.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function kr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
31
31
|
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function st(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
32
|
-
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function
|
|
33
|
-
${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
|
|
32
|
+
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function An(e){let t=_c(),n=Cn(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}
|
|
33
|
+
${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 Ec(`http://127.0.0.1:${e.port}`,5e3);return updateRuntimeEndpointStatus(s?"healthy":"degraded"),{pid:r.pid??0}}async function at(){let e=Cn(process.cwd()),t=st(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 ct(){let e=Cn(process.cwd()),t=resolveRuntimeEndpoint(),n=kr(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=st(e)??void 0,c=readRuntimeEndpointState();return c&&(!a||c.pid===a)&&updateRuntimeEndpointStatus("healthy"),{running:true,pid:a,port:n}}let i=readRuntimeEndpointState();return i&&(!st(e)||i.pid===st(e))&&updateRuntimeEndpointStatus("degraded"),{running:false,port:n}}async function Ec(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 yr,Dn,_e=A(()=>{yr=createRequire(import.meta.url);Dn=DEFAULT_DEVFLOW_SERVER_PORT;});var os={};O(os,{renderDoctorText:()=>ts,runDoctor:()=>su,runDoctorAudit:()=>au,runDoctorAuditFix:()=>cu,runDoctorCommand:()=>iu,runDoctorReceipts:()=>uu,runDoctorViolations:()=>lu,runLegacyDoctorReport:()=>ns,runStructuredDoctor:()=>Jn});function Mt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function wr(e){return join$1(homedir$1(),".devflow","daemons",`${Mt(e)}.sock`)}function Lc(){return join$1(homedir$1(),".devflow","daemons.json")}function Ur(){if(At)return At;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return At=e.DatabaseSync,At}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function N(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Fc(e,t){let n=t.homePath??homedir$1(),o=[],r=await selectHostAdapter({projectRoot:e,homeDir:n,env:t.env??process.env,explicitHost:(t.env??process.env).DEVFLOW_HOST_ADAPTER});if(o.push({key:"host_adapter",value:r.status==="selected"?{id:r.adapter.id,candidates:r.candidates,explicit:r.explicit}:{status:"failed",code:r.code,candidates:r.candidates,reason:r.reason,action:r.action},target:"one explicitly selected or uniquely detected host",ok:r.status==="selected",severity:"warning"}),r.status==="selected"){let p=await r.adapter.capabilities({projectRoot:e,homeDir:n,env:t.env??process.env});o.push({key:"host_capabilities",value:p,target:"unsupported capabilities have explicit degradation",ok:p.every(m=>m.status==="supported"||!!(m.reason&&m.fallback)),severity:"error"});}let s=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),i=s.diagnostics.filter(p=>p.status==="failed");o.push({key:"plugin_runtime",value:s.diagnostics,target:"configured plugins loadable with diagnostics",ok:i.length===0,severity:"warning"});let a=redactMcpInventory(readMcpInventory(e,n,{env:t.env??process.env}));o.push({key:"mcp_inventory",value:{servers:a.servers.length,duplicates:a.duplicates.length,unreadable:a.unreadable.length},target:{duplicates:0,unreadable:0},ok:a.unreadable.length===0,severity:a.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:a.duplicates.filter(p=>p.fingerprints.length>1).map(p=>p.name),target:[],ok:a.duplicates.every(p=>p.fingerprints.length===1),severity:"warning"});let c=await checkMcpHealth(a,n),l=c.records.filter(p=>p.status==="unhealthy");o.push({key:"mcp_health",value:c.records,target:"no unhealthy enabled servers",ok:l.length===0,severity:"warning"});let u=t.activePluginRoot??Ce(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(u){let p=Pt(u);o.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(n);o.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 g=(t.now??Date.now)(),f=listRuntimeHttpCircuits(n).filter(p=>p.status==="open"&&(p.openUntil??0)>g);return o.push({key:"runtime_http_circuits",value:f,target:[],ok:f.length===0,severity:f.some(p=>p.failures>=2)?"error":"warning"}),{name:"Contract",status:N(o),metrics:o}}function Mn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Hc(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!==Mt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Uc(e,t){let n=Mn(e),o=Mt(n.path),r=wr(n.path),s=[{key:"canonical_project",value:n.path,target:"existing canonical path",ok:n.error===void 0,severity:n.error?"error":"info"},{key:"project_hash",value:o,ok:true,severity:"info"},{key:"daemon_socket_path",value:r,target:`path containing ${o}`,ok:r.includes(o),severity:"error"}],i=t.registryPath??Lc();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",ok:true,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:0},target:"0 when idle or 1 while active",ok:true,severity:"info"});else try{let a=JSON.parse(readFileSync$1(i,"utf8"));if(!Array.isArray(a))throw new Error("registry must be an array");let c=a.filter(g=>Hc(g).length>0);s.push({key:"daemon_registry",value:c.length===0?"valid":"malformed",target:"valid daemon entry array",ok:c.length===0,severity:c.length===0?"info":"warning"}),s.push({key:"invalid_daemon_registry_entries",value:c.length,target:0,ok:c.length===0,severity:"warning"});let l=a.filter(g=>{if(typeof g!="object"||g===null)return !1;let f=g;return typeof f.rootPath!="string"||f.rootPath.length===0?!1:Mn(f.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:l.length,ok:!0,severity:"info"}),s.push({key:"hook_daemon_registration",value:{activeProjectRegistrations:l.length},target:"0 when idle or 1 while active",ok:l.length<=1,severity:"warning"});let u=l.map(g=>wr(g.rootPath));s.push({key:"registered_daemon_socket_paths",value:u,target:[r],ok:!0,severity:"info"});let d=l.filter((g,f)=>g.projectHash!==o||u[f]!==r).length;s.push({key:"daemon_identity_mismatches",value:d,target:0,ok:d===0,severity:"warning"});}catch{s.push({key:"daemon_registry",value:"malformed",target:"valid daemon entry array",ok:false,severity:"warning"}),s.push({key:"invalid_daemon_registry_entries",value:1,target:0,ok:false,severity:"warning"}),s.push({key:"hook_daemon_registration",value:"unreadable daemon registry",target:"valid project registration",ok:false,severity:"warning"});}return {name:"Isolation",status:N(s),metrics:s}}function Bc(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(Wc)){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 Wr(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 qc(e){let t=Wr(e);return t&&t.length>0?t:null}function On(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 Kc(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function br(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function zc(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:N(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(Ur())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=Bc(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:N(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
|
|
34
34
|
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
35
35
|
FROM distill_leases
|
|
36
|
-
`);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let T=
|
|
36
|
+
`);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let _ of u){let T=qc(_.event_ids),J=Wr(_.session_ids),ne=On(_.event_count),D=On(_.created_at),U=On(_.expires_at),X=typeof _.status=="string"&&Jc.has(_.status)?_.status:null,$=typeof _.batch_id=="string"&&_.batch_id.trim().length>0,M=T!==null&&ne!==null&&Kc(ne,T.length);if(!$||!T||!J||!M||D===null||U===null||X===null){g+=1,_.status==="pending"&&(U===null||br(U,c))&&(f+=1);continue}if(!(X!=="pending"||!br(U,c)))for(let W of T)d.add(W);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let m=i.prepare(`
|
|
37
37
|
SELECT id
|
|
38
38
|
FROM session_events
|
|
39
39
|
WHERE processed = 0 AND created_at < ?
|
|
@@ -46,7 +46,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
46
46
|
SELECT COUNT(*) count
|
|
47
47
|
FROM sessions
|
|
48
48
|
WHERE status = 'active' AND created_at < ?
|
|
49
|
-
`,c-
|
|
49
|
+
`,c-Ln);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let b=i.prepare(`
|
|
50
50
|
SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
|
|
51
51
|
FROM (
|
|
52
52
|
SELECT project, session_id, title, COUNT(*) AS title_count
|
|
@@ -54,7 +54,7 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
54
54
|
GROUP BY project, session_id, title
|
|
55
55
|
HAVING COUNT(*) > 1
|
|
56
56
|
)
|
|
57
|
-
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:N(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(Ur())(o,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return L(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function z(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Br(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function
|
|
57
|
+
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(b.group_count),target:0,ok:Number(b.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(b.row_count),target:0,ok:Number(b.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:N(n),metrics:n}}function ee(e,t){return (t.openDatabase??(o=>new(Ur())(o,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function fe(e,t){return L(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function z(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function Br(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{return}}function Fn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:void 0}function Vc(e){let t=Fn(Br(e.output)),n=Fn(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 Gc(e){let t=Br(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=Fn(t);return n?Object.entries(n).filter(([,o])=>typeof o=="number"&&o>0).map(([o])=>o):[]}function Sr(e,t){return t===0?0:e/t}function xn(e,t){return e===0?1:t/e}async function Yc(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 g;try{g=ee(s,t),L(g,"nodes")?(o=z(g,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:o,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});let f=Math.max(0,(t.now??Date.now)()-statSync$1(s).mtimeMs);n.push({key:"index_freshness_ms",value:f,target:"recently updated codegraph database",ok:!0,severity:"info"});}catch(f){n.push({key:"codegraph_db_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.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 g;try{g=ee(i,t);let f=L(g,"symbols_vec_rowids")?"symbols_vec_rowids":L(g,"symbol_sources")?"symbol_sources":null;f?(r=z(g,`SELECT COUNT(*) count FROM ${f}`),n.push({key:"symbols_vectors",value:r,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(f){n.push({key:"symbols_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}if(o!==null&&r!==null){let g=xn(o,r);n.push({key:"symbols_vector_coverage",value:g,target:">= 0.90",ok:g>=.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 g;try{g=ee(a,t);let p=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(m=>!L(g,m));if(p.length>0)n.push({key:"knowledge_vector_schema",value:p,target:[],ok:!1,severity:"warning"});else {let h=fe(g,"knowledge_docs").has("status")?"AND d.status = 'active'":"",y=z(g,`
|
|
58
58
|
SELECT COUNT(*) count
|
|
59
59
|
FROM knowledge_chunks c
|
|
60
60
|
JOIN knowledge_docs d ON d.id = c.doc_id
|
|
@@ -79,13 +79,13 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
79
79
|
WHERE e.source_type = 'observation'
|
|
80
80
|
${p?"AND o.quality_status = 'accepted' AND o.resolution_state <> 'superseded'":""}
|
|
81
81
|
`),k=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:k,target:0,ok:k===0,severity:"warning"});}}catch(f){n.push({key:"observation_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let l=(t.now??Date.now)(),u=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(u))try{let g=l-864e5;d=readFileSync$1(u,"utf8").split(`
|
|
82
|
-
`).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:N(n),metrics:n}}function
|
|
82
|
+
`).filter(f=>{let p=/^\[([^\]]+)\]/.exec(f);return p?Date.parse(p[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}n.push({key:"embedder_errors_24h",value:d,target:"trend; current readiness is gated by model state and integrity",ok:true,severity:"info"});try{let g=await(t.inspectEmbeddingModel??inspectEmbeddingModel)({homeDir:t.homePath,env:t.env??process.env});n.push({key:"embedding_model_state",value:{state:g.state,modelId:g.modelId,revision:g.revision},target:{state:"ready"},ok:g.ready,severity:"warning"}),n.push({key:"embedding_model_cache_root",value:g.cacheRoot,target:"stable shared DevFlow cache",ok:!0,severity:"info"}),n.push({key:"embedding_model_integrity",value:{missingFiles:g.missingFiles,corruptFiles:g.corruptFiles},target:{missingFiles:[],corruptFiles:[]},ok:g.missingFiles.length===0&&g.corruptFiles.length===0,severity:"warning"});}catch(g){n.push({key:"embedding_model_inspection",value:g.message,target:"readable verified shared model cache",ok:false,severity:"warning"});}return {name:"Vectors",status:N(n),metrics:n}}function Zc(e,t,n){let o=[],r=n.homePath??homedir$1(),s=n.homePath?join$1(r,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(r),i=(n.now??Date.now)()-1440*60*1e3,a=(n.now??Date.now)(),c=t?"error":"warning";if(!existsSync$1(s))o.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=ee(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[$,M]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let W=L(m,M)?z(m,`SELECT COUNT(*) count FROM ${M} WHERE created_at >= ?`,i):0;o.push({key:$,value:W,ok:!0,severity:"info"});}let h=L(m,"telemetry_failures")?z(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:h,target:0,ok:h===0,severity:c});let y=fe(m,"sessions"),k=fe(m,"tool_call_events"),C=fe(m,"skill_executions"),v=["id","project_root","started_at","status"].every($=>y.has($));if(o.push({key:"telemetry_session_schema",value:v?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:v,severity:"error"}),v){let $=z(m,`
|
|
83
83
|
SELECT COUNT(*) count FROM sessions
|
|
84
84
|
WHERE project_root = ? AND started_at >= ?
|
|
85
85
|
`,e,i);o.push({key:"session_start_evidence_24h",value:$,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let M=z(m,`
|
|
86
86
|
SELECT COUNT(*) count FROM sessions
|
|
87
87
|
WHERE project_root = ? AND status = 'running' AND started_at < ?
|
|
88
|
-
`,e,(n.now??Date.now)()-
|
|
88
|
+
`,e,(n.now??Date.now)()-Ln);o.push({key:"stale_telemetry_sessions",value:M,target:0,ok:M===0,severity:"error"});let W=m.prepare(`
|
|
89
89
|
SELECT status, COUNT(*) count
|
|
90
90
|
FROM sessions
|
|
91
91
|
WHERE project_root = ?
|
|
@@ -95,11 +95,11 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
95
95
|
FROM devflow_session_closures
|
|
96
96
|
WHERE project_root = ?
|
|
97
97
|
GROUP BY state
|
|
98
|
-
`).all(e),K={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let
|
|
98
|
+
`).all(e),K={active:0,closing:0,closed:0,closed_with_pending_work:0};for(let Le of I)Le.state in K&&(K[Le.state]=Number(Le.count));let le=z(m,`
|
|
99
99
|
SELECT COUNT(*) count
|
|
100
100
|
FROM devflow_session_closures
|
|
101
101
|
WHERE project_root = ? AND state = 'closing' AND updated_at < ?
|
|
102
|
-
`,e,a-
|
|
102
|
+
`,e,a-Ln);o.push({key:"durable_session_closure_state",value:{...K,staleClosing:le},target:{active:0,closing:0,staleClosing:0},ok:K.active===0&&K.closing===0&&le===0,severity:c});}else o.push({key:"durable_session_closure_state",value:"closure table missing",target:"active -> closing -> closed | closed_with_pending_work",ok:!1,severity:c});let ye=0;k.has("session_id")&&(ye=z(m,`
|
|
103
103
|
SELECT COUNT(*) count
|
|
104
104
|
FROM tool_call_events event
|
|
105
105
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
@@ -138,49 +138,49 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
138
138
|
${$?"JOIN sessions event_session ON event_session.id = event.session_id":""}
|
|
139
139
|
WHERE event.timestamp >= ?
|
|
140
140
|
${$?"AND event_session.project_root = ?":""}
|
|
141
|
-
`).all(...$?[i,e]:[i]),ae=Z.map(
|
|
141
|
+
`).all(...$?[i,e]:[i]),ae=Z.map(Vc),ye=ae.filter(I=>I.failed).length,ce=ae.filter((I,K)=>I.failed&&Z[K]?.session_status!=="completed").length,ve=ae.filter(I=>I.degraded).length;if(o.push({key:"semantic_tool_calls_24h",value:Z.length,ok:!0,severity:"info"}),o.push({key:"semantic_tool_failures_24h",value:ye,target:"trend",ok:!0,severity:"info"}),o.push({key:"unresolved_semantic_tool_failures_24h",value:ce,target:0,ok:ce===0,severity:c}),o.push({key:"semantic_tool_degradations_24h",value:ve,target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_failure_rate_24h",value:Sr(ye,Z.length),target:"trend",ok:!0,severity:"info"}),o.push({key:"semantic_tool_degradation_rate_24h",value:Sr(ve,Z.length),target:0,ok:ve===0,severity:c}),o.push({key:"semantic_tool_project_scope",value:$?"project":"global fallback; session identity unavailable",target:"project",ok:$,severity:"warning"}),k.has("failure_category")){let I={};for(let ue of Z)typeof ue.failure_category!="string"||!ue.failure_category.trim()||(I[ue.failure_category]=(I[ue.failure_category]??0)+1);let K=Z.filter((ue,Fs)=>ae[Fs]?.failed&&ue.session_status!=="completed"),le=K.filter(ue=>typeof ue.failure_category=="string"&&ue.failure_category.trim().length>0).length,Le=K.length===0?1:le/K.length;o.push({key:"failure_categories_24h",value:I,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:Le,target:">= 0.80",ok:Le>=.8,severity:c});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:c});}let ne=v&&["session_id","started_at","fallback_count","fallback_reasons"].every($=>C.has($)),D=0,U={};if(ne){let $=m.prepare(`
|
|
142
142
|
SELECT execution.fallback_count, execution.fallback_reasons
|
|
143
143
|
FROM skill_executions execution
|
|
144
144
|
JOIN sessions session ON session.id = execution.session_id
|
|
145
145
|
WHERE session.project_root = ? AND execution.started_at >= ?
|
|
146
|
-
`).all(e,i);for(let M of $){D+=Number(M.fallback_count??0);for(let W of
|
|
146
|
+
`).all(e,i);for(let M of $){D+=Number(M.fallback_count??0);for(let W of Gc(M.fallback_reasons))U[W]=(U[W]??0)+1;}}let X=0;if(L(m,"devflow_hook_fallbacks")){let $=m.prepare(`
|
|
147
147
|
SELECT reason, COUNT(*) count
|
|
148
148
|
FROM devflow_hook_fallbacks
|
|
149
149
|
WHERE project_root = ? AND created_at >= ?
|
|
150
150
|
GROUP BY reason ORDER BY reason
|
|
151
|
-
`).all(e,i);for(let M of $){let W=Number(M.count);X+=W,U[`hook:${M.reason}`]=W;}}o.push({key:"skill_fallbacks_24h",value:D,target:0,ok:D===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:U,target:{},ok:Object.keys(U).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=ee(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:N(o),metrics:o}}function Er(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function qr(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
|
|
152
|
-
`))if(d.trim())try{let g=JSON.parse(d),f=qr(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:N(t),metrics:t}}function
|
|
151
|
+
`).all(e,i);for(let M of $){let W=Number(M.count);X+=W,U[`hook:${M.reason}`]=W;}}o.push({key:"skill_fallbacks_24h",value:D,target:0,ok:D===0,severity:"warning"}),o.push({key:"hook_fallbacks_24h",value:X,target:0,ok:X===0,severity:"warning"}),o.push({key:"fallback_reasons_24h",value:U,target:{},ok:Object.keys(U).length===0,severity:"warning"});}catch(h){o.push({key:"global_telemetry_db_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let l=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],u=0;try{u=l.reduce((m,h)=>m+(existsSync$1(h)?readdirSync(h).filter(y=>y.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:c});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let d=join$1(e,".devflow","devflow.db"),g=existsSync$1(d);o.push({key:"project_local_telemetry_db",value:g?d:"absent",target:"absent",ok:!g,severity:c});let f=join$1(e,".codegraph","codegraph.db"),p=[];if(existsSync$1(f)){let m;try{m=ee(f,n),p=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(h=>h.name);}catch(h){o.push({key:"codegraph_telemetry_read",value:h.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:p,target:[],ok:p.length===0,severity:c}),{name:"Telemetry",status:N(o),metrics:o}}function Er(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function qr(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 Qc(e){let t=[],n=e.homePath??homedir$1(),o=e.env??process.env,r=join$1(n,".devflow","keys"),s=[["local_api_key","DEVFLOW_API_KEY","local.key"],["local_hmac_secret","DEVFLOW_HMAC_SECRET","hmac.key"]];if(!s.some(([,u])=>!o[u]?.trim())&&!existsSync$1(r))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(r))t.push({key:"key_directory",value:"missing",target:r,ok:false,severity:"warning"});else try{let u=lstatSync(r),d=Er(r),g=u.isDirectory()&&!u.isSymbolicLink(),f=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:r,mode:d},target:{type:"directory",mode:"700"},ok:g&&f,severity:g?"warning":"error"});}catch(u){t.push({key:"key_directory",value:u.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[u,d,g]of s){if(o[d]?.trim()){t.push({key:`${u}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let f=join$1(r,g);if(!existsSync$1(f)){t.push({key:`${u}_source`,value:"missing",target:f,ok:false,severity:"warning"});continue}try{let p=lstatSync(f),m=Er(f),h=readFileSync$1(f,"utf8").trim(),y=p.isFile()&&!p.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:m,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||m==="400"),severity:!y||h.length===0?"error":"warning"});}catch(p){t.push({key:`${u}_source`,value:p.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,l=0;if(existsSync$1(a))try{let u=(e.now??Date.now)()-ze;for(let d of readFileSync$1(a,"utf8").split(`
|
|
152
|
+
`))if(d.trim())try{let g=JSON.parse(d),f=qr(g.ts);f===null?l+=1:f>=u&&(c+=1);}catch{l+=1;}}catch(u){t.push({key:"compressor_error_log_read",value:u.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:l,target:0,ok:l===0,severity:"error"}),{name:"Runtime security",status:N(t),metrics:t}}function Xc(e){let t=[],n=e.homePath??homedir$1(),o=getGlobalDevFlowDbPath(n);if(!existsSync$1(o))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let r;try{if(r=ee(o,e),!L(r,"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:N(t),metrics:t};let s=r.prepare(`
|
|
153
153
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
154
154
|
FROM benchmark_reports
|
|
155
155
|
ORDER BY created_at DESC
|
|
156
156
|
LIMIT 1
|
|
157
|
-
`).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(l)?Number((l/ze).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=
|
|
157
|
+
`).get();if(!s)return t.push({key:"latest_benchmark",value:"no reports",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:N(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let u=JSON.parse(s.report_json);if(!Array.isArray(u.tasks))throw new Error("report tasks are missing");i=u.tasks.length;}catch(u){t.push({key:"benchmark_report_json",value:u.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),l=(e.now??Date.now)()-c;t.push({key:"latest_benchmark",value:{runId:s.run_id,suiteId:s.suite_id,suiteVersion:s.suite_version,status:s.status,createdAt:c},ok:s.status==="completed"&&Number.isFinite(c),severity:"error"}),t.push({key:"benchmark_task_count",value:a,target:">= 5",ok:Number.isInteger(a)&&a>=5&&i===a,severity:i===null?"error":"warning"}),t.push({key:"benchmark_age_days",value:Number.isFinite(l)?Number((l/ze).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=Hn,severity:l<0||!Number.isFinite(l)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Benchmark",status:N(t),metrics:t}}function el(e,t){let n=[],o=t.homePath??homedir$1(),r=getGlobalDevFlowDbPath(o);if(!existsSync$1(r))return n.push({key:"retrieval_quality_report",value:"missing global database",target:"passing retrieval-quality report",ok:false,severity:"warning"}),{name:"Retrieval quality",status:N(n),metrics:n};let s;try{if(s=ee(r,t),!L(s,"benchmark_reports"))throw new Error("benchmark_reports table missing");let i=s.prepare(`
|
|
158
158
|
SELECT report_json, created_at
|
|
159
159
|
FROM benchmark_reports
|
|
160
160
|
WHERE suite_id = 'retrieval-quality' AND project_root = ?
|
|
161
161
|
ORDER BY created_at DESC
|
|
162
162
|
LIMIT 1
|
|
163
|
-
`).get(e);if(!i?.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:N(n),metrics:n};let a=JSON.parse(i.report_json),c=(t.now??Date.now)()-Number(i.created_at??0);n.push({key:"retrieval_quality_report",value:{status:a.qualityStatus,ageMs:c,diagnostics:a.diagnostics??[]},target:{status:"passed",maxAgeMs:
|
|
163
|
+
`).get(e);if(!i?.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:N(n),metrics:n};let a=JSON.parse(i.report_json),c=(t.now??Date.now)()-Number(i.created_at??0);n.push({key:"retrieval_quality_report",value:{status:a.qualityStatus,ageMs:c,diagnostics:a.diagnostics??[]},target:{status:"passed",maxAgeMs:Hn},ok:a.qualityStatus==="passed"&&c<=Hn,severity:a.qualityStatus==="failed"?"error":"warning"});for(let[l,u]of Object.entries(a.gates??{}))n.push({key:`retrieval_${l}`,value:a.metrics?.[l],target:a.thresholds?.[l],ok:u,severity:"error"});}catch(i){n.push({key:"retrieval_quality_read",value:i.message,target:"readable retrieval quality report",ok:false,severity:"error"});}finally{s?.close();}return {name:"Retrieval quality",status:N(n),metrics:n}}function tl(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 nl(e){let t=[],n=e.homePath??homedir$1(),o=[join$1(n,".devflow","errors","hook-fallback.log")],r=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(r))try{for(let y of readdirSync(r))y.endsWith(".log")&&o.push(join$1(r,y));}catch(y){t.push({key:"hook_fallback_directory_read",value:y.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ze,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let k of readFileSync$1(y,"utf8").split(`
|
|
164
164
|
`))if(k.trim())try{let C=JSON.parse(k),v=qr(C.ts);v===null||typeof C.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(k){t.push({key:"hook_fallback_log_read",value:{path:y,error:k.message},target:"readable JSONL diagnostics",ok:false,severity:"error"});}t.push({key:"hook_fallback_events_24h",value:i,target:0,ok:i===0,severity:"warning"}),t.push({key:"malformed_hook_fallback_records",value:a,target:0,ok:a===0,severity:"error"});let c=e.homePath?join$1(n,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(n),l=0,u=0,d=null;if(existsSync$1(c)){let y;try{if(y=ee(c,e),L(y,"telemetry_events")){let k=y.prepare(`
|
|
165
165
|
SELECT COUNT(*) total,
|
|
166
166
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
167
167
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
168
168
|
FROM telemetry_events
|
|
169
169
|
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
170
|
-
`).get(s);l=Number(k?.total??0),u=Number(k?.failures??0),d=k?.average_duration==null?null:Math.round(Number(k.average_duration)*100)/100;}}catch(k){t.push({key:"hook_daemon_metrics_read",value:k.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=f===0?0:g/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:g===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 m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=
|
|
170
|
+
`).get(s);l=Number(k?.total??0),u=Number(k?.failures??0),d=k?.average_duration==null?null:Math.round(Number(k.average_duration)*100)/100;}}catch(k){t.push({key:"hook_daemon_metrics_read",value:k.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),p=f===0?0:g/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:g===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 m=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:m,target:[],ok:m.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=tl(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${_r}`,ok:y.bytes<=_r,severity:"warning"}),t.push({key:"hook_debug_log_files",value:y.files,target:"rotated per project",ok:!0,severity:"info"});}catch(y){t.push({key:"hook_debug_log_read",value:y.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:N(t),metrics:t}}function Re(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Ie(e){return JSON.parse(readFileSync$1(e,"utf8"))}function B(e){return typeof e=="object"&&e!==null?e:null}function Vr(e,t){return sl.has(e)&&!(t.tolerateControlSyntax&&il.has(e))}function mt(e,t={}){if(Buffer.byteLength(e)>zr)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 d=e[u];if(i){r+=d,i=false;continue}if(s==="'"){d==="'"?s=null:r+=d;continue}if(d==="\\"){if(e[u+1]===`
|
|
171
171
|
`){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
|
|
172
172
|
`){u+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax&&(a=true),r+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[u+1]==="(")&&!t.tolerateControlSyntax){a=true,r+=d;continue}let g=e.slice(u,u+2);if(d==="#"&&r.length===0){for(;u<e.length&&e[u]!==`
|
|
173
|
-
`;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&
|
|
174
|
-
`].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&Vr(d,t)})&&(a=true),{segments:n,malformed:a}}function
|
|
173
|
+
`;)u+=1;l();continue}g==="<<"&&!t.tolerateControlSyntax&&(a=true);let f=d==="{"&&r==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(u))||d==="}"&&al.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
|
|
174
|
+
`].includes(d)){l();continue}if(/\s/.test(d)){c();continue}r+=d;}return (s!==null||i)&&(a=true),l(),n.some(u=>{let d=u.find(g=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(g));return d!==void 0&&Vr(d,t)})&&(a=true),{segments:n,malformed:a}}function cl(e){return mt(e).segments.flat().join(" ")}function ll(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 Gr(e,t){return ll(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 ul(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]===`
|
|
175
175
|
`){o-=1;break}e[o]!==`
|
|
176
|
-
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function
|
|
176
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function dl(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]!==`
|
|
177
177
|
`;)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]===`
|
|
178
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?
|
|
178
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function me(e,t,n="infer"){let o=t?cl(e):n==="node"?ul(e):n==="python"?dl(e):e;return [...new Set(o.match(ol)??[])]}function gl(e){return mt(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=Pe(a,i)?a:Pe(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 fl(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>zr||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function Kn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=fl(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ot(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)||je(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=pl(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 ml(e){let t=[e];extname(e)===""&&t.push(...Pr.map(n=>`${e}${n}`),...Pr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function pl(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 ml(o)??o}function hl(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]!==`
|
|
179
179
|
`;)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===`
|
|
180
|
-
`||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
|
|
180
|
+
`||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 yl(e,t,n,o=true){let r=hl(t),s=[],i=r.malformed,a=(d,g)=>{if(!d||d.kind!=="string"||!d.valid||d.value.length===0){i=true;return}s.push({value:d.value,cwd:dirname(e),project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:g,issuerPath:e});},{tokens:c}=r;for(let d=0;d<c.length;d+=1){let g=c[d],f=c[d-1];if(g.kind!=="identifier")continue;if(g.value==="eval"&&f?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(g.value==="require"){if(f?.value==="."){c[d-2]?.value==="module"&&c[d+1]?.value==="("&&(i=true);continue}if(c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let m=c[d+2];c[d+3]?.value===")"||(i=true),a(m,"esm");continue}if(g.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(g.value==="import"&&c[d+1]?.value===".")continue;let p=-1;for(let m=d+1;m<Math.min(c.length,d+32)&&c[m].value!==";";m+=1)if(c[m].value==="from"){p=m;break}p>=0?a(c[p+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=Kn(d,o);g.reference&&l.push(g.reference),g.inlineContent&&u.push(g.inlineContent),i||=g.malformed;}return {references:l,inlineContents:u,malformed:i}}function vl(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]!==`
|
|
181
181
|
`;)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,d=o;for(let f=0;f<u;f+=1)t[d+f]=" ";d+=u;let g=false;for(;d<e.length;){if(e[d]==="\\"){t[d]=" ",d+1<e.length&&(t[d+1]=" "),d+=2;continue}if(e.slice(d,d+u)===c.repeat(u)){for(let f=0;f<u;f+=1)t[d+f]=" ";d+=u,g=true;break}if(!l&&(e[d]===`
|
|
182
182
|
`||e[d]==="\r"))break;e[d]!==`
|
|
183
|
-
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Rr(e,t){let n=t.split(".");if(n.length>Bn)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 gl(e,t,n){let o=dl(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=pe(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),p=Rr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&Rr(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),k=join$1(y,"__init__.py"),C=false;try{C=statSync$1(k).isFile();}catch{}if(C){a(k),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Yr(e,t,n,o,r=true){return n==="node"?ul(e,t,o,r):n==="python"?gl(e,t,o):{references:[],inlineContents:[],malformed:false}}function Cr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Nt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>pe(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=qn(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=pe(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function Zr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function Te(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 xt(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function lt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function yl(e,t,n){let o=[],r=[],s=false,i=(u,d)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=Te(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(hl.has(u))return a();if(pl.has(u)){l=true,c+=1;continue}let d=Dr.has(u)?"cjs":Ar.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=lt(u,Dr),f=lt(u,Ar),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if($r.has(u)){let h=e[c+1];return a(h===void 0?true:s||xt(h))}let m=lt(u,$r);if(m!==null)return a(s||xt(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||xt(u.slice(2)));if(xr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(lt(u,xr)!==null){c+=1;continue}if(ml.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function bl(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:Te(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Nt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(vl.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:Te(i)}}return {tokens:[],malformed:true}}function Sl(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:Te(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:Te(r)};if(wl.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Or.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(lt(r,Or)!==null){o+=1;continue}if(kl.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function On(e,t){let n=pe(e,t,true);if(!n)return null;let o=Re(n.path),r=Re(t.project);return !o||!r||!Pe(r,o)?null:o}function Pl(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(Zr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=mt(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?On(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=On(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=On(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 Nt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Jr)return {tokens:[],malformed:true};let r=mt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Qr(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 Qr(e,t,n,o){let r=0;for(;Zr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;_l.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Jr)return {tokens:i,malformed:true};let m=Pl(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=Qr(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Vr(l,o),d=c&&!El.has(l);if(u||d)return {tokens:i,malformed:true};let g=Te(s);i.push(s);let f=l;if(!fl.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?yl(e,r+1,n):["bash","sh","zsh"].includes(f)?bl(e,r+1,a,n,o):Sl(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function Xr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Re(t.slice(0,o))}function Rl(e,t){let n=new Map;for(let o of t)for(let r of sl(o)){let s=Xr(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 Cl(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Dl(e){return e.slice(e.lastIndexOf("@")+1)}function Nr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Re(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Al(e,t,n){let o=Dl(e),r=B(t.extraKnownMarketplaces),s=B(r?.[o]);if(s){let i=B(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Nr(i.path):null}}try{let i=B(je(n)),a=B(i?.[o]);if(a){let c=B(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Nr(c.path):null}}}catch{}return {configured:false,root:null}}function Tr(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 $l(e,t){let n=B(e.entry),o=B(t.entry),r=Tr(n),s=Tr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Tt(n.version):null,a=typeof o?.version=="string"?Tt(o.version):null;if(i&&a){let c=es(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function xl(e,t){try{let n=B(je(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=B(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($l)[0],i=B(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Re(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Tt(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 es(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 Ol(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=B(je(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=Tt(a.version),u=Tt(c.version);if(l&&u){let d=es(u,l);if(d!==0)return d}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Re(i[0].path):null}function Nl(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>Re(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.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 v of l)if(existsSync$1(v))try{let b=B(je(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return gt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>Rl(v.path,v.commands)),m=[...i.reduce((v,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return v;for(let[T,J]of Object.entries(_))Cl(T)&&typeof J=="boolean"&&v.set(T,J);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=xl(v,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let T=i.map(ne=>Al(v,ne.settings,r)).filter(ne=>ne.configured),J=T[T.length-1];J?_=J.root:_=Ol(v,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let k=[...h.reduce((v,b)=>{let _=v.get(b.root);return _?(v.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],C=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:k,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:C.length>0?`${C.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(k.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Tl(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 gt(e,t){if(Array.isArray(e)){for(let n of e)gt(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):gt(o,t);}function Nn(e){return [...e.matchAll(Zc)].map(t=>t[1])}function jl(e){let t=new Map,n=mt(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 Il(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 Ml(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 Tn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function Pe(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Hn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>$t)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>$t)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,$t+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>$t)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 Un(e,t){return `${e} (${t})`}function Ll(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>Bn){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(u)){Pe(d,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Pe(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Cr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Kr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Hn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Un(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?Gr(l,d):c.parserKind,f=g==="shell";for(let p of me(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=Cr(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=Yr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function Fl(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Tl(r),c=0,l=(f,p=false,m=r,h="infer",y=e,k=0)=>{if(k>Bn){o.traversalLimitRoots.push(r);return}let C=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Pe(C,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Pe(C,b)){o.escapedArtifacts.push(v);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:k}));},u=(f,p,m,h=0)=>{for(let y of Nn(f)){let k=Tn(r,y);if(!k)continue;let C=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(k,true,r,C?.parserKind??"infer",C?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let k=y.nodeResolutionKind?qn(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(k.malformed){o.malformedCommands.push(y.value);continue}if(k.inlineContent)for(let C of me(k.inlineContent.content,false,"node"))o.findings.push({artifact:k.inlineContent.source,endpoint:C});k.reference&&l(k.reference.path,true,h?r:k.reference.containmentRoot,k.reference.parserKind,k.reference.cwd??p,m);}},g=f=>{for(let m of me(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=Nt(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=Xr(m),y=(p.artifacts??[]).find(k=>k.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Hn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Un(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let k=JSON.parse(y.content),C=[];gt(k,C);for(let v of C)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Kr){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Hn(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(Un(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?Gr(p,h):f.parserKind,k=y==="shell";for(let b of me(h,k,y))o.findings.push({artifact:p,endpoint:b});if(k){let b=jl(h),_=Nt(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});Il(h)&&o.malformedCommands.push(p),u(b,_,dirname(p),f.depth+1),d(_,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Yr(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?Ml(p):b.malformed)&&o.malformedCommands.push(p);for(let _ of b.inlineContents)for(let T of me(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of b.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of Nn(h)){let T=Tn(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of Nn(h)){let _=Tn(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let C=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(C).replace(/\.js$/,"");a&&(C.startsWith("hooks/")||C.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),C.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function Hl(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=B(je(t)),r=B(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=B(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Re(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 jr(e){try{let t=B(je(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Ul(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Hl(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 d=existsSync$1(l)?l:u;try{let k=B(je(d)),C=B(k?.hooks),v=[];gt(C?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=jr(i),f=jr(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(k=>k!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let k=readFileSync$1(h,"utf8");(!existsSync$1(y)||!k.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 Wl(e,t){let n=Nl(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let D of n.configCommands){o.configsInspected.push(D.path);for(let U of D.commands){o.commandsInspected.push({configPath:D.path,command:U});for(let X of me(U,true))o.findings.push({artifact:D.path,endpoint:X});}}Ll(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(U=>U.commands?.includes(D))),o);for(let D of n.targets)Fl(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,U,X)=>X.findIndex($=>$.configPath===D.configPath&&$.command===D.command)===U),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((D,U,X)=>X.findIndex($=>$.artifact===D.artifact&&$.endpoint===D.endpoint)===U),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Ul(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,k=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),C=n.targets.map(D=>D.root).find(D=>existsSync$1(join$1(D,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:C?{root:C,version:null}:Ce(k,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,_=b?Ge(k,b):[],T=_.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(D=>D.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:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],ne=v.version??h.versionRecords.find(D=>D.root===b)?.packageVersion;return ne&&J.push({key:"active_plugin_version",value:ne,ok:true,severity:"info"}),{name:"Legacy paths",status:N(J),metrics:J}}function Bl(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 Lt(e){let t=Bl(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)/ze: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 ql(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=(L(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:z(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:N(n),metrics:n}}function Kl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:N(n),metrics:n};let r;try{if(r=ee(o,t),!L(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*ze,i=r.prepare(`
|
|
183
|
+
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let p=0;p<f.length;p+=1)if(f[p]==="{"){if(f[p+1]==="{"){p+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Rr(e,t){let n=t.split(".");if(n.length>qn)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 kl(e,t,n){let o=vl(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let g=dirname(e);for(let f=1;f<d;f+=1)g=dirname(g);return g},a=d=>{let g=pe(d,{...n,cwd:dirname(e)},true,"python");g?r.push(g):s=true;},c=(d,g=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let f=i(g),p=Rr(f,d);s||=!p.resolved;for(let h of p.paths)a(h);let m=p.paths.at(-1);return m&&basename(m)==="__init__.py"?dirname(m):null},l=d=>{let g=[];for(let f of d.split(",")){let p=f.trim().split(/\s+as\s+/)[0];if(p==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)){s=true;continue}g.push(p);}return g},u=(d,g)=>{for(let f of l(g))d&&Rr(d,f).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let g of d.split(/[;:]/)){let f=g.trim();if(f.startsWith("import ")){let v=f.slice(7).split(",");for(let b of v)c(b.trim().split(/\s+as\s+/)[0]);continue}let p=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!p)continue;let m=p[1].length,h=p[2];if(h){let v=c(h,m);u(v,p[3]);continue}if(m===0){s=true;continue}let y=i(m),k=join$1(y,"__init__.py"),C=false;try{C=statSync$1(k).isFile();}catch{}if(C){a(k),u(y,p[3]);continue}for(let v of l(p[3]))c(v,m);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Yr(e,t,n,o,r=true){return n==="node"?yl(e,t,o,r):n==="python"?kl(e,t,o):{references:[],inlineContents:[],malformed:false}}function Cr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Nt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>pe(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let p=Kn(g);p.reference&&c.push(p.reference),p.inlineContent&&l.push(p.inlineContent),u||=p.malformed;continue}let f=pe(g.value,{...r,cwd:g.cwd},true,g.parserKind);f?c.push(f):u=true;}let d=[...a,...c];return {references:[...new Map(d.map(g=>[`${g.path}:${g.parserKind}`,g])).values()],inlineContents:l,malformed:u}}function Zr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function je(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 Ot(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function lt(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function El(e,t,n){let o=[],r=[],s=false,i=(u,d)=>{o.push(u),r.push({value:u,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=je(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(_l.has(u))return a();if(Sl.has(u)){l=true,c+=1;continue}let d=Dr.has(u)?"cjs":Ar.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=lt(u,Dr),f=lt(u,Ar),p=g??f;if(p!==null){if(!p)return a(true);i(p,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if($r.has(u)){let h=e[c+1];return a(h===void 0?true:s||Ot(h))}let m=lt(u,$r);if(m!==null)return a(s||Ot(m));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||Ot(u.slice(2)));if(Or.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(lt(u,Or)!==null){c+=1;continue}if(bl.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Dl(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:je(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Nt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Pl.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:je(i)}}return {tokens:[],malformed:true}}function Al(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:je(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:je(r)};if(Cl.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(xr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(lt(r,xr)!==null){o+=1;continue}if(Rl.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Nn(e,t){let n=pe(e,t,true);if(!n)return null;let o=Re(n.path),r=Re(t.project);return !o||!r||!Pe(r,o)?null:o}function xl(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(Zr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=mt(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?Nn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=Nn(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=Nn(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 Nt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Jr)return {tokens:[],malformed:true};let r=mt(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Qr(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 Qr(e,t,n,o){let r=0;for(;Zr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;$l.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Jr)return {tokens:i,malformed:true};let m=xl(basename(s),e,r+1,n,o);if(m.malformed)return {tokens:i,malformed:true};if(n=m.context??n,m.replacement){let h=Qr(m.replacement,a,m.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=m.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Vr(l,o),d=c&&!Ol.has(l);if(u||d)return {tokens:i,malformed:true};let g=je(s);i.push(s);let f=l;if(!wl.has(f))return {tokens:i,malformed:g};let p=["node","tsx"].includes(f)?El(e,r+1,n):["bash","sh","zsh"].includes(f)?Dl(e,r+1,a,n,o):Al(e,r+1,n);return i.push(...p.tokens),{tokens:i,artifacts:p.artifacts,inlineContents:p.inlineContents,malformed:g||p.malformed}}function Xr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:Re(t.slice(0,o))}function Nl(e,t){let n=new Map;for(let o of t)for(let r of gl(o)){let s=Xr(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 Tl(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function jl(e){return e.slice(e.lastIndexOf("@")+1)}function Nr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=Re(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function Il(e,t,n){let o=jl(e),r=B(t.extraKnownMarketplaces),s=B(r?.[o]);if(s){let i=B(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Nr(i.path):null}}try{let i=B(Ie(n)),a=B(i?.[o]);if(a){let c=B(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Nr(c.path):null}}}catch{}return {configured:false,root:null}}function Tr(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 Ml(e,t){let n=B(e.entry),o=B(t.entry),r=Tr(n),s=Tr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?Tt(n.version):null,a=typeof o?.version=="string"?Tt(o.version):null;if(i&&a){let c=es(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Ll(e,t){try{let n=B(Ie(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=B(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(Ml)[0],i=B(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:Re(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Tt(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 es(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 Fl(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=B(Ie(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=Tt(a.version),u=Tt(c.version);if(l&&u){let d=es(u,l);if(d!==0)return d}else if(l||u)return l?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?Re(i[0].path):null}function Hl(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(b=>Re(b)).filter(b=>b!==null).map(b=>({root:b,inspectPluginConfig:true}));return {targets:v,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:v.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 v of l)if(existsSync$1(v))try{let b=B(Ie(v));if(!b)throw new Error("settings must be an object");i.push({path:v,settings:b});}catch{a.push(v);}if(i.reduce((v,b)=>typeof b.settings.disableAllHooks=="boolean"?b.settings.disableAllHooks:v,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(v=>{let b=[];return gt(v.settings.hooks,b),{path:v.path,commands:b}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>Nl(v.path,v.commands)),m=[...i.reduce((v,b)=>{let _=b.settings.enabledPlugins;if(typeof _!="object"||_===null)return v;for(let[T,J]of Object.entries(_))Tl(T)&&typeof J=="boolean"&&v.set(T,J);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of m){let b=Ll(v,o);b.malformed&&c.push(o);let _=b.root;if(!b.configured){let T=i.map(ne=>Il(v,ne.settings,r)).filter(ne=>ne.configured),J=T[T.length-1];J?_=J.root:_=Fl(v,s);}_?h.push({root:_,inspectPluginConfig:true}):y=true;}let k=[...h.reduce((v,b)=>{let _=v.get(b.root);return _?(v.set(b.root,{root:b.root,configPath:_.configPath??b.configPath,commands:[...new Set([..._.commands??[],...b.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||b.inspectPluginConfig)}),v):(v.set(b.root,b),v)},new Map).values()],C=[g.length>0?"settings-hooks":null,m.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:k,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:C.length>0?`${C.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(k.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Ul(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 gt(e,t){if(Array.isArray(e)){for(let n of e)gt(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):gt(o,t);}function Tn(e){return [...e.matchAll(rl)].map(t=>t[1])}function Wl(e){let t=new Map,n=mt(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 Bl(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 ql(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 Pe(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Un(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>$t)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>$t)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,$t+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>$t)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 Wn(e,t){return `${e} (${t})`}function Kl(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>qn){o.traversalLimitRoots.push(e);return}let u=resolve(c.path),d=resolve(c.containmentRoot),g;try{g=realpathSync.native(d);}catch{g=d;}if(!existsSync$1(u)){Pe(d,u)?o.missing.push(u):o.escapedArtifacts.push(u);return}let f;try{f=realpathSync.native(u);}catch{o.missing.push(u);return}if(!Pe(g,f)){o.escapedArtifacts.push(u);return}let p=`${f}:${c.parserKind}:${c.cwd}`;s.has(p)||(s.add(p),r.push({...c,path:f,depth:l}));};for(let c of n){let l=Cr(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of me(u.content,false,"node"))o.findings.push({artifact:u.source,endpoint:d});for(let u of l.references)a(u);}for(;r.length>0;){if(i>=Kr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=Un(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(Wn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?Gr(l,d):c.parserKind,f=g==="shell";for(let p of me(d,f,g))o.findings.push({artifact:l,endpoint:p});if(f){let p=Cr(d,e,t,c.cwd);p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}else if(g==="node"||g==="python"){let p=Yr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});p.malformed&&o.malformedCommands.push(l);for(let m of p.inlineContents)for(let h of me(m.content,false,"node"))o.findings.push({artifact:m.source,endpoint:h});for(let m of p.references)a(m,c.depth+1);}}}function Jl(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ul(r),c=0,l=(f,p=false,m=r,h="infer",y=e,k=0)=>{if(k>qn){o.traversalLimitRoots.push(r);return}let C=realpathSync.native(m),v=resolve(f);if(!existsSync$1(v)){if(!Pe(C,v)){o.escapedArtifacts.push(v);return}p&&o.missing.push(v);return}let b;try{b=realpathSync.native(v);}catch{p&&o.missing.push(v);return}if(!Pe(C,b)){o.escapedArtifacts.push(v);return}let _=`${b}:${h}:${y}`;i.has(_)||(i.add(_),s.push({path:b,parserKind:h,cwd:y,depth:k}));},u=(f,p,m,h=0)=>{for(let y of Tn(f)){let k=jn(r,y);if(!k)continue;let C=(p.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(k,true,r,C?.parserKind??"infer",C?.cwd??m,h);}},d=(f,p,m=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let k=y.nodeResolutionKind?Kn(y,!h):{reference:pe(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(k.malformed){o.malformedCommands.push(y.value);continue}if(k.inlineContent)for(let C of me(k.inlineContent.content,false,"node"))o.findings.push({artifact:k.inlineContent.source,endpoint:C});k.reference&&l(k.reference.path,true,h?r:k.reference.containmentRoot,k.reference.parserKind,k.reference.cwd??p,m);}},g=f=>{for(let m of me(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:m});let p=Nt(f,0,{project:e,homePath:t,cwd:e});p.malformed&&o.malformedCommands.push(f),u(f,p,e),d(p,e);for(let m of p.tokens){if(!isAbsolute(m))continue;let h=Xr(m),y=(p.artifacts??[]).find(k=>k.value===m);h===r&&l(m,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),p=join$1(r,"hooks.json"),m=existsSync$1(p)?p:f;if(!existsSync$1(m))o.missing.push(m),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(m);let h;try{h=realpathSync.native(m);}catch{o.missing.push(m),l(join$1(r,"hooks","session-start")),h="";}if(h&&!Pe(r,h)&&(o.escapedArtifacts.push(m),l(join$1(r,"hooks","session-start")),h=""),h){let y=Un(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(Wn(m,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(m),l(join$1(r,"hooks","session-start"));else try{let k=JSON.parse(y.content),C=[];gt(k,C);for(let v of C)g(v);}catch{o.malformedConfigs.push(m),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Kr){o.traversalLimitRoots.push(r);break}let f=s.shift(),p=f.path;c+=1;let m=Un(p);if(m.kind==="missing"){o.missing.push(p);continue}if(m.kind==="unsafe"){o.unsafeArtifacts.push(Wn(p,m.reason));continue}let{content:h}=m;o.inspected.push(p);let y=f.parserKind==="infer"?Gr(p,h):f.parserKind,k=y==="shell";for(let b of me(h,k,y))o.findings.push({artifact:p,endpoint:b});if(k){let b=Wl(h),_=Nt(b,0,{project:e,homePath:t,cwd:dirname(p)},{tolerateControlSyntax:true});Bl(h)&&o.malformedCommands.push(p),u(b,_,dirname(p),f.depth+1),d(_,dirname(p),f.depth+1,true);}else if(y==="node"||y==="python"){let b=Yr(p,h,y,{project:e,homePath:t,cwd:dirname(p)},false);(y==="node"?ql(p):b.malformed)&&o.malformedCommands.push(p);for(let _ of b.inlineContents)for(let T of me(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:T});for(let _ of b.references){let T=relative(r,resolve(_.path));!T.startsWith(`..${sep}`)&&T.split(sep).includes("node_modules")||l(_.path,true,r,_.parserKind,_.cwd,f.depth+1);}for(let _ of Tn(h)){let T=jn(r,_);T&&l(T,true,r,y,f.cwd,f.depth+1);}}else for(let b of Tn(h)){let _=jn(r,b);_&&l(_,true,r,y,f.cwd,f.depth+1);}let C=p.startsWith(`${r}/`)?p.slice(r.length+1):"",v=basename(C).replace(/\.js$/,"");a&&(C.startsWith("hooks/")||C.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),C.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function zl(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=B(Ie(t)),r=B(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=B(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=Re(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 jr(e){try{let t=B(Ie(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Vl(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=zl(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 d=existsSync$1(l)?l:u;try{let k=B(Ie(d)),C=B(k?.hooks),v=[];gt(C?.SessionStart,v),v.some(b=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(b))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=jr(i),f=jr(a),p=o.get(s)??[],m={root:s,packageVersion:g,manifestVersion:f,registryVersions:p};n.versionRecords.push(m),(!g||!f||g!==f||p.some(k=>k!==g))&&n.versionIssues.push(m);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let k=readFileSync$1(h,"utf8");(!existsSync$1(y)||!k.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 Gl(e,t){let n=Hl(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let D of n.configCommands){o.configsInspected.push(D.path);for(let U of D.commands){o.commandsInspected.push({configPath:D.path,command:U});for(let X of me(U,true))o.findings.push({artifact:D.path,endpoint:X});}}Kl(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(U=>U.commands?.includes(D))),o);for(let D of n.targets)Jl(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,U,X)=>X.findIndex($=>$.configPath===D.configPath&&$.command===D.command)===U),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],l=[...new Set(o.malformedCommands)],u=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],g=[...new Set(o.escapedArtifacts)],f=o.findings.filter((D,U,X)=>X.findIndex($=>$.artifact===D.artifact&&$.endpoint===D.endpoint)===U),p=a.length>0||g.length>0||u.length>0,m=p&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Vl(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,k=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),C=n.targets.map(D=>D.root).find(D=>existsSync$1(join$1(D,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:C?{root:C,version:null}:Ce(k,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),b=v.root,_=b?Ge(k,b):[],T=_.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),J=[{key:"active_plugin_resolution",value:m,target:"resolved active DevFlow hook configuration",ok:n.ok&&!p,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(D=>D.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:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:g.length,target:0,ok:g.length===0,severity:"warning"},{key:"retired_producer_paths",value:f.length,target:0,ok:f.length===0,severity:"error"},{key:"retired_producer_path_findings",value:f,ok:true,severity:"info"},{key:"skill_shadowing_count",value:_.length,target:0,ok:_.length===0,severity:"error"},{key:"shadowed_skills",value:_,target:[],ok:_.length===0,severity:"error"},{key:"active_skill_source",value:b,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:T,target:[],ok:true,severity:"info"}],ne=v.version??h.versionRecords.find(D=>D.root===b)?.packageVersion;return ne&&J.push({key:"active_plugin_version",value:ne,ok:true,severity:"info"}),{name:"Legacy paths",status:N(J),metrics:J}}function Yl(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 Lt(e){let t=Yl(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)/ze: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 Zl(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=(L(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:z(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:N(n),metrics:n}}function Ql(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:N(n),metrics:n};let r;try{if(r=ee(o,t),!L(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*ze,i=r.prepare(`
|
|
184
184
|
SELECT source, COUNT(*) count FROM memories
|
|
185
185
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
186
186
|
`).all(s),a=r.prepare(`
|
|
@@ -198,14 +198,14 @@ ${r.pid??0}`),writeRuntimeEndpointState({url:`http://127.0.0.1:${e.port}`,port:e
|
|
|
198
198
|
SUM(CASE WHEN evidence_status = 'verified' THEN 1 ELSE 0 END) verified
|
|
199
199
|
FROM observations
|
|
200
200
|
WHERE source = 'explicit_intent' AND quality_status = 'accepted'
|
|
201
|
-
`).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===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:N(n),metrics:n}}function
|
|
201
|
+
`).get(),u=Number(l?.total??0),d=Number(l?.verified??0);n.push({key:"explicit_memory_evidence_coverage",value:u>0?d/u:1,target:1,ok:u===0||d===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:N(n),metrics:n}}function Xl(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:N(n),metrics:n};let r;try{if(r=ee(o,t),!L(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(g=>Number(g.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(),d=/tokenize\s*=\s*['\"]?trigram/i.test(u?.sql??"");if(n.push({key:"knowledge_fts_tokenizer",value:d?"trigram":"missing/non-trigram",target:"trigram",ok:d,severity:"warning"}),L(r,"knowledge_source_readiness")){let g=r.prepare(`
|
|
202
202
|
SELECT source, expected_version, documents, chunks, vectors, coverage, status, failure_category
|
|
203
203
|
FROM knowledge_source_readiness ORDER BY source
|
|
204
|
-
`).all(),f=g.filter(m=>Number(m.documents??0)>0||Number(m.chunks??0)>0),p=f.length>0?Math.min(...f.map(m=>Number(m.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(m=>m.status==="ready"&&Number(m.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:p,target:">= 0.95",ok:f.length>0&&p>=.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:N(n),metrics:n}}function
|
|
205
|
-
`)}async function
|
|
206
|
-
`)}var is=A(()=>{});var as={};
|
|
204
|
+
`).all(),f=g.filter(m=>Number(m.documents??0)>0||Number(m.chunks??0)>0),p=f.length>0?Math.min(...f.map(m=>Number(m.coverage??0))):0;n.push({key:"knowledge_source_readiness",value:g,target:"all active sources current with >=95% vector coverage",ok:f.length>0&&f.every(m=>m.status==="ready"&&Number(m.coverage??0)>=.95),severity:"error"}),n.push({key:"knowledge_vector_coverage",value:p,target:">= 0.95",ok:f.length>0&&p>=.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:N(n),metrics:n}}function eu(e){let{manifest:t,metrics:n}=Lt(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:N(n),metrics:n}}function tu(e){let{manifest:t,metrics:n}=Lt(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:N(n),metrics:n}}function nu(e){let{manifest:t,metrics:n}=Lt(e),o=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:o,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&o.length===3,severity:"error"}),{name:"Data face",status:N(n),metrics:n}}async function ou(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 ru(e){let{manifest:t,metrics:n}=Lt(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(e.homePath??homedir$1());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:N(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??ou)(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:N(n),metrics:n}}async function Jn(e={},t={}){let n=e.project??process.cwd(),o=Mn(n),r=eu(t),s=await Fc(o.path,t);r.metrics.push(...s.metrics),r.status=N(r.metrics);let i=[Uc(n,t),zc(o.path,t),Gl(o.path,t),await Yc(o.path,t),Zc(o.path,!!e.strict,t),Zl(o.path,t),Ql(o.path,t),Xl(o.path,t),r,tu(t),Xc(t),el(o.path,t),nu(t),Qc(t),await ru(t),nl(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 su(e,t={}){return e===void 0?ns():Jn(e,t)}function Ir(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ts(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: ${Ir(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ir(s.value)}${i}`);}}return t.join(`
|
|
205
|
+
`)}async function iu(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await Jn(e,n);return t.stdout(e.json?JSON.stringify(o):ts(o)),o.exitCode}async function Ft(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function ns(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await Ft(e),a=t.getStats(),c=n.export(),l=0;try{l=(await s.list()).length;}catch{}let u=false,d=0;try{let h=await o.getAll();u=!!h?.project,d=Object.keys(h?.user??{}).length;}catch{}let g=0;try{g=(await r.getSources()).length;}catch{}let f={total:0,byTool:{}};try{f=await i.getToolCallStats();}catch{}let p=await ct(),m=0;return a.fileCount>0&&(m+=25),a.nodeCount>0&&(m+=15),c.nodes.length>0&&(m+=20),u&&(m+=15),g>0&&(m+=10),l>0&&(m+=5),p.running&&(m+=10),f.total>0&&(m+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:p.running},toolCalls:f,readyScore:m}}async function au(){let{data:e}=await Ft(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 cu(){let{data:e}=await Ft(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 lu(e){let{data:t}=await Ft(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 uu(){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 At,Wc,Ln,Jc,ze,Hn,_r,ol,rl,Kr,$t,qn,Jr,zr,sl,il,al,Pr,wl,Dr,Ar,$r,Or,bl,Sl,_l,Pl,Rl,xr,Cl,$l,Ol,rs=A(()=>{We();_e();Sn();Wc={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Ln=3600*1e3;Jc=new Set(["pending","committed","expired"]);ze=1440*60*1e3,Hn=30*ze,_r=60*1024*1024;ol=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,rl=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Kr=64,$t=1024*1024,qn=8,Jr=8,zr=64*1024;sl=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),il=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),al=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;Pr=[".cjs",".js",".mjs",".ts",".tsx"];wl=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Dr=new Set(["-r","--require"]),Ar=new Set(["--experimental-loader","--import","--loader"]),$r=new Set(["-e","--eval","-p","--print"]),Or=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),bl=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Sl=new Set(["--check","-c"]),_l=new Set(["--help","--version","-h","-v"]);Pl=new Set(["-e","-eu","-o","-u","-ue"]),Rl=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),xr=new Set(["-W","-X","--check-hash-based-pycs"]),Cl=new Set(["--help","--version","-h","-V"]);$l=new Set(["builtin","command","env","exec","nohup","timeout"]),Ol=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ss={};O(ss,{runMemoryMaintainCommand:()=>mu});function fu(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 mu(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:fu(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(`
|
|
206
|
+
`)}var is=A(()=>{});var as={};O(as,{generateToken:()=>yu});async function yu(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=A(()=>{});var zn={};O(zn,{reportBenchmarkCommand:()=>Su,runBenchmarkCommand:()=>bu});async function bu(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}
|
|
207
207
|
|
|
208
|
-
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function
|
|
208
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Su(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=_u(o,n);return r==="markdown"?`${s}
|
|
209
209
|
## Change From Prior Baseline
|
|
210
210
|
|
|
211
211
|
${i.map(a=>`- ${a}`).join(`
|
|
@@ -214,20 +214,20 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
214
214
|
|
|
215
215
|
Change from ${o.runId}:
|
|
216
216
|
${i.map(a=>`- ${a}`).join(`
|
|
217
|
-
`)}`}function
|
|
218
|
-
`)}var fs=A(()=>{});var ms={};
|
|
219
|
-
Shutting down...`)),await at(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var ps=A(()=>{_e();});var ys={};
|
|
217
|
+
`)}`}function _u(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [Ht("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),Ht("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),Ht("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),Ht("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function Ht(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 Vn=A(()=>{});var gs={};O(gs,{runReview:()=>Eu});async function Eu(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(`
|
|
218
|
+
`)}var fs=A(()=>{});var ms={};O(ms,{startAll:()=>Ru});async function Pu(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 Ru(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await An({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await Pu(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(`
|
|
219
|
+
Shutting down...`)),await at(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var ps=A(()=>{_e();});var ys={};O(ys,{stopAll:()=>Cu});async function Cu(){let e=await at();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var vs=A(()=>{_e();});var ws={};O(ws,{showStatus:()=>Nu});function xu(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 Nu(){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 ct(),t=e.port??Dn;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?Ge(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]:[],...xu(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var bs=A(()=>{_e();We();});var Ss={};O(Ss,{setupCommand:()=>Fu});function Mu(){try{return wt()}catch{return}}function Lu(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 Fu(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||s.push(r.mcp.project(n,{command:"devflow-mcp",args:["--mode","stdio"]})),!e.skipPlugin){let l=Mu();s.push(...r.skills.project(n,{pluginRoot:l,skillsDirectory:l?join$1(l,"skills"):void 0}));}for(let l of s)Lu(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 _s=A(()=>{We();});var Es={};O(Es,{pluginListCommand:()=>Uu});var Uu,Ps=A(()=>{bt();Uu=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=Be();if(e.installed){let n=yo();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
220
220
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
221
221
|
`),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}):
|
|
222
222
|
`);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(`
|
|
223
|
-
Install a plugin: devflow plugin install <name>`);}});});var Rs={};
|
|
223
|
+
Install a plugin: devflow plugin install <name>`);}});});var Rs={};O(Rs,{pluginSearchCommand:()=>qu});var qu,Cs=A(()=>{bt();qu=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=Be(),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(`
|
|
224
224
|
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
225
|
-
`),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 As={};
|
|
225
|
+
`),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 As={};O(As,{pluginInstallCommand:()=>Ju});var Ju,$s=A(()=>{be();Ju=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let n=`@devflow-tools/plugin-${e.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`;console.log(`Installing ${n}...`);try{let o=await Ae(n,process.cwd(),!0);console.log(`
|
|
226
226
|
${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
|
|
227
227
|
Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
|
|
228
|
-
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var
|
|
228
|
+
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var xs={};O(xs,{pluginUninstallCommand:()=>Vu});var Vu,Ns=A(()=>{be();Vu=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 Qt(n,process.cwd(),!0),console.log(`
|
|
229
229
|
${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
|
|
230
|
-
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Bt(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 js=createRequire(import.meta.url),
|
|
231
|
-
`));}let n=Bt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(fo(),go)),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(()=>(po(),mo)),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(()=>(en(),Xt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(en(),Xt));await i(t);}}});P.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(()=>(Bo(),Wo));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var Ku=P.command("db").description("Manage DevFlow databases");Ku.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(()=>(Xo(),Qo)),o=t(e);for(let r of n(o))console.log(r);});P.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=Bt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(tr(),er));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);}});P.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(()=>(rr(),or)),o=e.backfillVectors?await n(P.opts().local):await t(P.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)"));});P.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(ir(),sr)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});P.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(()=>(fn(),gn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.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(()=>(fn(),gn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.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 Wt=P.command("workflow").description("Workflow management");Wt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.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)`);});Wt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ot(),nt)),o=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Wt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Wt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.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 Is=P.command("embeddings").description("Manage the shared verified embedding model");Is.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(()=>(hn(),pn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Is.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(()=>(hn(),pn)),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.migratedFrom&&console.log(` migrated from: ${r.migratedFrom}`),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 Ie=P.command("memory").description("Memory management");Ie.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(),$e)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Ie.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(xe(),$e));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});Ie.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(),$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:P.opts().local});console.log(JSON.stringify(o,null,2));});Ie.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(xe(),$e));await n(e,t,P.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Ie.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(xe(),$e)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});Ie.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(),$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`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(dr(),ur)),o=(await t(e,void 0,void 0,P.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 Zn=P.command("docs").description("Documentation index management");Zn.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(),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(`
|
|
230
|
+
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Bt(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 js=createRequire(import.meta.url),Zn="0.0.0";try{Zn=js("../package.json").version;}catch{try{Zn=js("../../package.json").version;}catch{}}var P=new Command;P.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(Zn).option("--local","Force local engine, skip server");P.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=Yu.join(t,a);Ts.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),Ts.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
|
|
231
|
+
`));}let n=Bt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(mo(),fo)),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(()=>(ho(),po)),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(()=>(en(),Xt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(en(),Xt));await i(t);}}});P.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(()=>(qo(),Bo));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var Qu=P.command("db").description("Manage DevFlow databases");Qu.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(()=>(er(),Xo)),o=t(e);for(let r of n(o))console.log(r);});P.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=Bt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(nr(),tr));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);}});P.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(()=>(sr(),rr)),o=e.backfillVectors?await n(P.opts().local):await t(P.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)"));});P.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(ar(),ir)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});P.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(()=>(fn(),gn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.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(()=>(fn(),gn)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.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 Wt=P.command("workflow").description("Workflow management");Wt.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.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)`);});Wt.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(ot(),nt)),o=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});Wt.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});Wt.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(ot(),nt)),t=await e(P.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 Is=P.command("embeddings").description("Manage the shared verified embedding model");Is.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(()=>(hn(),pn)),o=await t();console.log(e.json?JSON.stringify(o,null,2):n(o)),o.ready||(process.exitCode=1);});Is.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(()=>(hn(),pn)),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.migratedFrom&&console.log(` migrated from: ${r.migratedFrom}`),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 Me=P.command("memory").description("Memory management");Me.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Oe(),$e)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});Me.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(Oe(),$e));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});Me.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(()=>(Oe(),$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:P.opts().local});console.log(JSON.stringify(o,null,2));});Me.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(Oe(),$e));await n(e,t,P.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});Me.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(Oe(),$e)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});Me.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(()=>(Oe(),$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`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(gr(),dr)),o=(await t(e,void 0,void 0,P.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 Qn=P.command("docs").description("Documentation index management");Qn.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(),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(`
|
|
232
232
|
${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(`
|
|
233
|
-
All docs synced.`));}});Zn.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>(wn(),kn)),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`));});Zn.command("resync [plugin-name]").description("Rebuild documentation chunks before vector backfill").requiredOption("--with-headings","Use heading-aware 500-3000 character chunks").action(async(e,t)=>{let{resyncKnowledgeDocs:n}=await Promise.resolve().then(()=>(wn(),kn));console.log(S.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${S.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${S.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(S.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var pt=P.command("skill").description("Plugin/Skill management");pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),Ze)),t=await e(P.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,P.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,process.cwd(),P.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),Ze));await t(e,process.cwd(),P.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});pt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(bn(),mr));process.exitCode=t(e);});var Ms=P.command("mcp").description("Inspect MCP configuration and health");Ms.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(()=>(_n(),Sn));await t(e);});Ms.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(()=>(_n(),Sn));await t(e);});P.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(()=>(rs(),os));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;});Ie.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(()=>(is(),ss));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;}});P.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(),as)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Ls=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Ls.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(()=>(zn(),Jn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Ls.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(()=>(zn(),Jn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});P.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(fs(),gs)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Qn=P.command("server").description("Manage DevFlow server");Qn.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(),Ct)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});Qn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(_e(),Ct)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});Qn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(_e(),Ct)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});P.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}`));});P.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(()=>(ps(),ms));await t({port:parseInt(e.port,10),background:!!e.background});});P.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(vs(),ys));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(bs(),ws));await e();});P.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(()=>(_s(),Ss));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Ut=P.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(()=>(Ps(),Es)),Promise.resolve().then(()=>(Cs(),Rs)),Promise.resolve().then(()=>($s(),As)),Promise.resolve().then(()=>(Ns(),Os))]);Ut.addCommand(e),Ut.addCommand(t),Ut.addCommand(n),Ut.addCommand(o);}await P.parseAsync();
|
|
233
|
+
All docs synced.`));}});Qn.command("backfill-vectors").description("Backfill missing knowledge chunk vectors").option("--source <name>","Only backfill one knowledge source").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillKnowledgeVectors:t}=await Promise.resolve().then(()=>(wn(),kn)),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`));});Qn.command("resync [plugin-name]").description("Rebuild documentation chunks before vector backfill").requiredOption("--with-headings","Use heading-aware 500-3000 character chunks").action(async(e,t)=>{let{resyncKnowledgeDocs:n}=await Promise.resolve().then(()=>(wn(),kn));console.log(S.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let o=await n({source:e,withHeadings:t.withHeadings});for(let r of o)r.added>0?console.log(` ${S.green("\u2713")} ${r.source} \u2192 ${r.added} chunks`):console.log(` ${S.red("\u2717")} ${r.source} \u2014 ${r.errors.join(", ")||"no content"}`);console.log(S.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var pt=P.command("skill").description("Plugin/Skill management");pt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(be(),Ze)),t=await e(P.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});pt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,P.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});pt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(be(),Ze)),n=await t(e,process.cwd(),P.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});pt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(be(),Ze));await t(e,process.cwd(),P.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});pt.command("health").description("Validate installed DevFlow skill artifacts").option("--root <path>","Claude plugin root").option("--json","Output JSON").action(async e=>{let{showSkillHealth:t}=await Promise.resolve().then(()=>(Sn(),mr));process.exitCode=t(e);});var Ms=P.command("mcp").description("Inspect MCP configuration and health");Ms.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(()=>(En(),_n));await t(e);});Ms.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(()=>(En(),_n));await t(e);});P.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(()=>(rs(),os));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;});Me.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(()=>(is(),ss));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;}});P.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(),as)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Ls=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Ls.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(()=>(Vn(),zn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Ls.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(()=>(Vn(),zn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});P.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(fs(),gs)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Xn=P.command("server").description("Manage DevFlow server");Xn.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(),Ct)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});Xn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(_e(),Ct)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});Xn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(_e(),Ct)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});P.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}`));});P.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(()=>(ps(),ms));await t({port:parseInt(e.port,10),background:!!e.background});});P.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(vs(),ys));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(bs(),ws));await e();});P.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(()=>(_s(),Ss));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var Ut=P.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(()=>(Ps(),Es)),Promise.resolve().then(()=>(Cs(),Rs)),Promise.resolve().then(()=>($s(),As)),Promise.resolve().then(()=>(Ns(),xs))]);Ut.addCommand(e),Ut.addCommand(t),Ut.addCommand(n),Ut.addCommand(o);}await P.parseAsync();
|