@devflow-tools/devflow 0.16.8 → 0.16.9
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 +59 -58
- 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-client.js +6 -6
- package/dist/hooks/hook-daemon.js +9 -9
- package/dist/hooks/post-tool-use.js +3 -3
- package/dist/hooks/pre-tool-use.js +2 -2
- package/dist/hooks/user-prompt-submit.js +2 -2
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/dist/command-registry.json +116 -20
- package/dist/plugin/dist/hooks/hook-client.js +6 -6
- package/dist/plugin/dist/hooks/hook-daemon.js +9 -9
- package/dist/plugin/dist/hooks/post-tool-use.js +3 -3
- package/dist/plugin/dist/hooks/pre-tool-use.js +2 -2
- package/dist/plugin/dist/hooks/user-prompt-submit.js +2 -2
- package/dist/plugin/package.json +7 -7
- package/package.json +13 -13
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{KgbYRVRx1rrkTqJx51q3j → JAGOZdxW2bLxLynmBzFBM}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{KgbYRVRx1rrkTqJx51q3j → JAGOZdxW2bLxLynmBzFBM}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,50 +1,51 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,rmSync,cpSync,lstatSync,writeFileSync as writeFileSync$1,statSync as statSync$1,realpathSync,mkdtempSync,rmdirSync,
|
|
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(!X(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[
|
|
6
|
-
`);}function
|
|
7
|
-
`);}function X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function
|
|
8
|
-
`)}var
|
|
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 {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 {execFileSync,spawnSync}from'node:child_process';import hs,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1,renameSync as renameSync$1}from'fs';import uu,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import qn from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,runMemoryMaintenance,EmbeddingProvider,MEMORY_MAINTENANCE_ACTIONS}from'@devflow-tools/memory-engine';import {loadPlugins,getPluginInstallRoot,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,redactMcpInventory,readMcpInventory,checkMcpHealth,readCachedMcpHealth,DOCTOR_SCHEMA_VERSION,getLocalHmacSecret,DevFlowApiClient,loadPluginsWithDiagnostics,readPluginInstallState,upsertPluginInstallRecord,extractPlugin,importPluginModule,removePluginInstallRecord}from'@devflow-tools/sdk';import {fileURLToPath as fileURLToPath$1}from'url';import S from'chalk';import {spawn,execSync,execFileSync as execFileSync$1}from'child_process';import {createRequire as createRequire$1,isBuiltin}from'node:module';import {DatabaseSync}from'node:sqlite';import {getGlobalDevFlowDbPath,DevFlowDatabase,openGlobalDevFlowDatabase}from'@devflow-tools/database';import {connect,listAdapters}from'@devflow-tools/adapters';import la from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Ss=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var A=(e,t)=>{for(var n in t)Ss(e,n,{get:t[n],enumerable:true});};function Mn(){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 me(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 Os)try{let c=JSON.parse(readFileSync$1(n,"utf-8")).plugins?.[i];if(!Array.isArray(c))continue;for(let l of c){if(!X(l)||typeof l.installPath!="string"||!existsSync$1(l.installPath)||!statSync$1(l.installPath).isDirectory())continue;let u=typeof l.version=="string"?l.version:Nn(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,Dt);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:Nn(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 Ie(e,t){let n=Ts(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=Fn(a);if(!c)continue;let l=n.get(c.name);if(!l)continue;let u=Rt(c.content),d=readFileSync$1(l,"utf-8"),g=Rt(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 Ln(e,t,n,o=Date.now,r={}){let s=Ie(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()||Rt(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 Ts(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=Fn(r);s&&t.set(s.name,r);}return t}function Fn(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 Rt(e){return createHash("sha256").update(e).digest("hex")}function Nn(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 Un(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=X(t.enabledPlugins)?t.enabledPlugins:{};n[Xe]=true,t.enabledPlugins=n;let o=join$1(dirname(e),"plugins","marketplaces",Pe),r=X(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};r[Pe]={source:{source:"directory",path:o}},t.extraKnownMarketplaces=r,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`);}function Hn(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 Wn(e,t,n){let o=join$1(t,Pe,Dt,n);rmSync(o,{recursive:true,force:true}),mkdirSync$1(o,{recursive:true});let r=join$1(e,"hooks");existsSync$1(r)&&et(r,join$1(o,"hooks"));for(let c of ["CLAUDE.md","package.json"]){let l=join$1(e,c);existsSync$1(l)&&cpSync(l,join$1(o,c),{force:true});}let s=join$1(e,".claude-plugin","plugin.json");existsSync$1(s)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(s,join$1(o,".claude-plugin","plugin.json"),{force:true}));let i=join$1(e,"dist");existsSync$1(i)&&et(i,join$1(o,"dist"));let a=join$1(e,"skills");existsSync$1(a)&&et(a,join$1(o,"skills")),js(o,e),Ms(o),Is(t,o),Ns(t,o,n);}function Is(e,t){let n=join$1(e,".."),o=join$1(n,"marketplaces",Pe),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:Pe,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:Dt,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(!X(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[Pe]={source:{source:"directory",path:o},installLocation:o,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
6
|
+
`);}function Ns(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(!X(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&&!X(s))throw new Error(`Invalid Claude plugin registry plugins: ${o}`);let i=s??{},a=i[Xe];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Xe}`);let c=a??[],l=c.find(f=>X(f)&&f.scope==="user"),u=new Date().toISOString(),d=X(l)&&typeof l.installedAt=="string"?l.installedAt:u,g=c.filter(f=>!X(f)||f.scope!=="user");i[Xe]=[...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 X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function js(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(l=>l.startsWith("@devflow-tools/")),a=i.map(l=>join$1(t,"../../packages",l.slice(15))).filter(l=>existsSync$1(join$1(l,"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 l of i)rmSync(join$1(e,"node_modules",...l.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function et(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let o=join$1(e,n),r=join$1(t,n);statSync$1(o).isDirectory()?et(o,r):cpSync(o,r,{force:true});}}function Ms(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 Xe,Pe,Dt,Os,Ne=E(()=>{Xe="devflow@devflow-local",Pe="devflow-local",Dt="devflow",Os=["devflow@devflow-local","devflow@devflow"];});var Jn={};A(Jn,{initProject:()=>Ks,renderInitReport:()=>Vn});async function Ks(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(zn.isInitialized(e)||await zn.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,Vn(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=Mn(),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";Wn(i,c,u),s.pluginDeployed=!0;let d=join(c,"devflow-local","devflow",u);try{s.migratedLegacySkills=Ln(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");Un(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=Bs.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}Hn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Vn(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 zn,Bs,Gn=E(()=>{Ne();zn=qn.default??qn,Bs=createRequire(import.meta.url);});var Yn={};A(Yn,{reviewPluginMemoryHints:()=>Js});async function Js(e,t,n={}){let o=n.isTTY??!!process.stdout.isTTY,r=new Set(t.split(",").map(Gs).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??Ys)(e,l),{available:i.length,selected:l.length}}function Gs(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function Ys(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 Zn=E(()=>{});function De(){let e=[join(process.cwd(),"plugin-registry.json"),join(ni,"../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 Qn(){return Object.keys(readPluginInstallState().plugins).filter(e=>e.startsWith("@devflow-tools/plugin-"))}var ti,ni,ot=E(()=>{ti=fileURLToPath$1(import.meta.url),ni=dirname$1(ti);});async function x(e,t,n,o={}){let r=o.serverUrl??ri;if(o.skipServer)return n();let s=false,i=eo.get(r);if(i&&Date.now()-i.ts<si?s=i.result:(s=await new DevFlowApiClient({baseUrl:r,projectRoot:e}).ping(),eo.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 ri,eo,si,ie=E(()=>{ri=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",eo=new Map,si=3e4;});var no=E(()=>{});var Me={};A(Me,{installSkill:()=>he,listSkills:()=>co,listSkillsSync:()=>di,searchSkills:()=>gi,uninstallSkill:()=>Tt});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 di(){return []}async function gi(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 lo(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 uo(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function go(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 he(e,t=process.cwd(),n){return x(t,async o=>await o.installPlugin(e),async()=>{let o=lo(e),r=o.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(je,{recursive:true});let i=readPluginInstallState().plugins[o];execFileSync$1("npm",["install","--prefix",je,o],{stdio:"pipe",timeout:6e4});let a=uo(t);a.plugins||(a.plugins=[]),a.plugins.includes(r)||(a.plugins.push(r),go(t,a));let c=[],l="0.0.0",u=join(je,"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 Tt(e,t=process.cwd(),n){return x(t,async o=>{await o.uninstallPlugin(e);},async()=>{let o=lo(e),r=o.replace(/^@devflow-tools\/plugin-/,""),s=uo(t);s.plugins&&(s.plugins=s.plugins.filter(l=>l!==r),go(t,s));let a=readPluginInstallState().plugins[o],c=a?.projects.filter(l=>l!==t)??[];if(a&&c.length===0){let l=existsSync(a.installPath)?extractPlugin(await importPluginModule({packageName:o,modulePath:a.installPath,source:a.source,installPath:a.installPath}),o):null;l?.onUninstall&&await l.onUninstall({projectRoot:t,memory:{getAll:async()=>[],upsertGlobal:async()=>{}},knowledge:{registerSource:async()=>{}},workflow:{registerStepHandler:()=>{}}});}if(!a||c.length===0)try{execFileSync$1("npm",["uninstall","--prefix",je,o],{stdio:"pipe",timeout:6e4});}catch{let l=join(je,"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 je,ae=E(()=>{ie();no();je=getPluginInstallRoot();});var It={};A(It,{detectTechStack:()=>fo,guidePluginInstallation:()=>yi,installPluginsFromList:()=>hi,resolvePluginName:()=>mo});function fo(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 mo(e){let t=e.trim();return t?`@devflow-tools/plugin-${t.replace(/^@devflow-tools\/(?:plugin-)?/,"")}`:""}async function hi(e){let t=e.split(",").map(mo).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{await he(n,process.cwd(),!0),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function yi(e){let t=De();if(t.plugins.length===0)return console.log(`
|
|
9
10
|
No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
10
11
|
`),[];console.log(`
|
|
11
12
|
\u{1F50C} Plugin Installation Guide
|
|
12
|
-
`);let n=
|
|
13
|
+
`);let n=fo(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
|
|
13
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...
|
|
14
|
-
`);let i=[...o];for(let a of i)try{
|
|
15
|
+
`);let i=[...o];for(let a of i)try{await he(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(`
|
|
15
16
|
Plugin installation cancelled.
|
|
16
17
|
`),[]}if(s.length>0){console.log(`
|
|
17
18
|
Installing selected plugins...
|
|
18
|
-
`);for(let i of s)try{
|
|
19
|
+
`);for(let i of s)try{await he(i,e,!0),console.log(`\u2713 ${i}
|
|
19
20
|
`);}catch{console.error(`\u2717 Failed to install ${i}
|
|
20
21
|
`);}}else console.log(`
|
|
21
22
|
Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
22
|
-
`);return s}var
|
|
23
|
-
INSERT INTO main.${
|
|
24
|
-
SELECT ${g} FROM ${
|
|
25
|
-
WHERE NOT EXISTS (SELECT 1 FROM main.${
|
|
26
|
-
`);}o[i]=(o[i]??0)+(
|
|
27
|
-
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await
|
|
28
|
-
Reviewed ${o}/${t.length} pending memories.`);}var
|
|
29
|
-
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function
|
|
30
|
-
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function
|
|
31
|
-
${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function
|
|
23
|
+
`);return s}var Nt=E(()=>{ot();ae();});var Co={};A(Co,{ResetExecutionError:()=>Le,executeResetCommand:()=>Fi,formatResetResult:()=>Ut,runReset:()=>Po});function Ai(){if(rt)return rt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return rt=e.DatabaseSync,rt}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function Ut(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function xi(e){return e==="all"||ko.includes(e)}function Y(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function Mt(e){let t=resolve(e),n=[];for(;!Y(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 Ht(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function Oi(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 bo(e,t){let n=e;for(let o of relative(e,t).split(sep)){n=join$1(n,o);let r=Y(n);if(!r)break;if(r.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(Y(t)){let o=realpathSync(t);if(!Ht(e,o))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Ti(e,t){return (e==="all"?ko:[e]).map(o=>({scope:o,path:join$1(t,...wo[o])}))}function So(e,t){let n=Y(t);if(n)return bo(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function _o(e,t){let n=So(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 Ii(e){let t=Y(e);if(!t?.isFile()||t.size<jt.length)return false;let n=Buffer.alloc(jt.length),o=openSync(e,"r");try{return readSync(o,n,0,n.length,0)===n.length&&n.equals(jt)}finally{closeSync(o);}}function Ni(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}Ii(o)&&t.push(o);}}return n(e),t}function ji(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Ai())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Mi(e,t,n){let o=Ni(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));ji(s,i);}}function Li(e,t,n,o,r){let s=!!Y(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),Mi(c.path,join$1(i,c.scope),()=>_o(e,c));for(let c of n){let l=join$1(i,c.scope),u=join$1(t,c.scope);if(Y(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&&Y(t))try{rmdirSync(t);}catch{}}}function Po(e,t={}){if(!xi(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=Oi(e.project??process.cwd()),o=Ti(e.scope,n);for(let c of o)bo(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=So(n,c.path);return l?[{...c,identity:l}]:[]}),s=e.backupTo?Mt(e.backupTo):void 0;if(s){let c=Y(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let l of r){let u=Mt(l.path),d=join$1(s,l.scope),g=Mt(d);if(Ht(u,g)||Ht(g,u))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${g}`);if(Y(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&&Li(n,s,r,i,a);for(let c of r){try{a.beforeRemoval(c.path),_o(n,c),a.removePath(c.path);}catch(l){let u=l instanceof Error?`: ${l.message}`:"";throw new Le(`Failed to remove reset target: ${c.path}${u}`,i,l)}i.removed.push(c.path);}return i}function Fi(e,t={},n=console){try{let o=Po(e,t),r=Ut(o);for(let s of r)n.log(s);return r.length===0&&n.log("Nothing to reset."),!0}catch(o){if(o instanceof Le)for(let r of Ut(o.result))n.log(r);return n.error(`Error: ${o.message}`),false}}var rt,Le,wo,ko,jt,Ro=E(()=>{Le=class extends Error{constructor(t,n,o){super(t,{cause:o}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};wo={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},ko=Object.keys(wo),jt=Buffer.from("SQLite format 3\0","binary");});var No={};A(No,{consolidateDatabases:()=>Bi,formatConsolidateResult:()=>Ki});function Bi(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=[Eo("project",o,s?n:void 0),Eo("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")?qi(o):null;try{let f=new Map;for(let y of c){let _=join$1(d,`${y.kind}-${basename(y.path)}.snapshot`);$o(y.path,_),f.set(y.kind,_);}s&&$o(n,join$1(d,"global-devflow.db.before"));let m=f.has("project")?Vi(o,d):[];a.retired.push(...m.map(y=>y.destination));let p=null,h=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),f.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(f.get("project")),f.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(r),p.exec("BEGIN IMMEDIATE"),h=!0,f.has("project")&&Ao(p,"project_source",void 0,a.inserted),f.has("codegraph")){Ao(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let _ of He(p,"codegraph_source").filter(D=>D.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${I(_)}`);}p.exec("COMMIT"),h=!1;}catch(y){if(h)try{p?.exec("ROLLBACK");}catch{}throw Io(m),y}finally{p?.close();}return a}finally{zi(g);}}function Ki(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 Eo(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 He(r).filter(c=>!i||i.has(c)))o.tables[a]=qt(r,a),o.conflicts[a]=s&&He(s).includes(a)?Ji(r,s,a):0;}finally{r.close(),s?.close();}return o}function $o(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 qi(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 zi(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Vi(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 Io(n),o}return n}function Io(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Ao(e,t,n,o){let r=new Set(He(e)),s=He(e,t).filter(i=>r.has(i)&&(!n||n.has(i)));for(let i of s){let a=it(e,"main",i),c=new Set(it(e,t,i).map(m=>m.name)),l=a.filter(m=>c.has(m.name));if(Kt.has(i)&&(l=l.filter(m=>m.pk===0)),l.length===0)continue;let u=qt(e,i),d=l.map(m=>I(m.name)).join(", "),g=l.map(m=>`s.${I(m.name)}`).join(", ");if(l.filter(m=>m.pk>0).length>0&&!Kt.has(i))e.exec(`INSERT OR IGNORE INTO main.${I(i)} (${d}) SELECT ${g} FROM ${I(t)}.${I(i)} s`);else {let m=l.map(p=>`t.${I(p.name)} IS s.${I(p.name)}`).join(" AND ");e.exec(`
|
|
24
|
+
INSERT INTO main.${I(i)} (${d})
|
|
25
|
+
SELECT ${g} FROM ${I(t)}.${I(i)} s
|
|
26
|
+
WHERE NOT EXISTS (SELECT 1 FROM main.${I(i)} t WHERE ${m})
|
|
27
|
+
`);}o[i]=(o[i]??0)+(qt(e,i)-u);}}function Ji(e,t,n){let o=new Set(it(t,"main",n).map(l=>l.name)),r=it(e,"main",n).filter(l=>l.pk>0&&o.has(l.name));if(r.length===0||Kt.has(n))return 0;let s=r.map(l=>I(l.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${I(n)}`).all(),a=r.map(l=>`${I(l.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${I(n)} WHERE ${a} LIMIT 1`);return i.reduce((l,u)=>l+(c.get(...r.map(d=>u[d.name]))?1:0),0)}function He(e,t="main"){return e.prepare(`SELECT name FROM ${I(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(o=>o.name)}function it(e,t,n){return e.prepare(`PRAGMA ${I(t)}.table_info(${I(n)})`).all()}function qt(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${I(t)}`).get();return Number(n.count)}function I(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var Kt,jo=E(()=>{Kt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var Mo={};A(Mo,{connectAgent:()=>zt,getAvailableAgents:()=>Zi});async function zt(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 Zi(){return listAdapters()}var Vt=E(()=>{});var Fo={};A(Fo,{getIndexStatus:()=>Qi,refreshIndex:()=>Xi});async function Qi(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 Xi(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 Uo=E(()=>{ie();});var Ho={};A(Ho,{getGraph:()=>ta});async function ta(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 Wo=E(()=>{ie();});var Jt={};A(Jt,{getContext:()=>oa,getTaskContext:()=>ra});async function oa(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 ra(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 Gt=E(()=>{ie();});var We={};A(We,{getWorkflowRuns:()=>Ko,getWorkflowStatus:()=>aa,listWorkflows:()=>sa,runWorkflow:()=>ia});async function sa(e){return x(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function ia(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 aa(e){return Ko(e)}async function Ko(e){return x(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Be=E(()=>{ie();});var ye={};A(ye,{backfillObservationVectors:()=>ma,queryMemory:()=>da,reviewCandidates:()=>fa,reviewMemories:()=>ha,setMemory:()=>ga,showMemory:()=>ua});async function ua(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 da(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 ga(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 fa(e){return x(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function ma(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function pa(e){let t=la.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim().toLowerCase());});})}async function ha(){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(`
|
|
28
|
+
[${r.category}] (confidence: ${(r.confidence*100).toFixed(0)}%)`),console.log(` ${r.content}`);let s=await pa(" 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(`
|
|
29
|
+
Reviewed ${o}/${t.length} pending memories.`);}var ve=E(()=>{ie();});var zo={};A(zo,{getDocsStatus:()=>wa,queryKnowledge:()=>qo,searchKnowledge:()=>va,syncDocs:()=>ka});async function qo(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 qo(e,t,void 0,n)).results}async function wa(e){return x(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function ka(e,t){return x(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var Vo=E(()=>{ie();});var Xt={};A(Xt,{backfillKnowledgeVectors:()=>Pa,resyncKnowledgeDocs:()=>_a});function Jo(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function _a(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=Jo(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Pa(e={}){let t=Jo(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var en=E(()=>{});var Yo={};A(Yo,{inspectSkillHealth:()=>at,showSkillHealth:()=>Ea});function Da(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 at(e){let t=e===void 0?me(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=[],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=Da(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 Ea(e={}){let t=at(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 tn=E(()=>{Ne();});var nn={};A(nn,{showMcpHealth:()=>Ia,showMcpInventory:()=>Ta});async function Ta(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 Ia(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 on=E(()=>{});var lt={};A(lt,{DEFAULT_SERVER_PORT:()=>ct,readPidFromFile:()=>cn,readPortFromFile:()=>tr,serverStatus:()=>ze,startServer:()=>ln,stopServer:()=>qe});function an(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Fa(){try{return Xo.resolve("./server.js")}catch{try{return Xo.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function tr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
30
|
+
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function cn(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
31
|
+
`),n=t.length>=2?t[1]:t[0],o=parseInt(n,10);return isNaN(o)?null:o}async function ln(e){let t=Fa(),n=an(process.cwd()),o=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
|
|
32
|
+
${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function qe(){let e=an(process.cwd()),t=cn(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function ze(){let e=an(process.cwd()),t=tr(e)??ct,{DevFlowApiClient:n}=await import('@devflow-tools/sdk');return await new n({baseUrl:`http://127.0.0.1:${t}`,projectRoot:process.cwd()}).ping()?{running:true,pid:cn(e)??void 0,port:t}:{running:false,port:t}}var Xo,ct,le=E(()=>{Xo=createRequire(import.meta.url);ct=13337;});var Mr={};A(Mr,{renderDoctorText:()=>Nr,runDoctor:()=>pl,runDoctorAudit:()=>yl,runDoctorAuditFix:()=>vl,runDoctorCommand:()=>hl,runDoctorReceipts:()=>kl,runDoctorViolations:()=>wl,runLegacyDoctorReport:()=>jr,runStructuredDoctor:()=>Rn});function _n(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function nr(e){return join$1(homedir$1(),".devflow","daemons",`${_n(e)}.sock`)}function Ya(){return join$1(homedir$1(),".devflow","daemons.json")}function br(){if(dt)return dt;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return dt=e.DatabaseSync,dt}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function T(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}async function Za(e,t){let n=t.homePath??homedir$1(),o=[],r=await loadPluginsWithDiagnostics({projectRoot:e,homeDir:n}),s=r.diagnostics.filter(u=>u.status==="failed");o.push({key:"plugin_runtime",value:r.diagnostics,target:"configured plugins loadable with diagnostics",ok:s.length===0,severity:"warning"});let i=redactMcpInventory(readMcpInventory(e,n));o.push({key:"mcp_inventory",value:{servers:i.servers.length,duplicates:i.duplicates.length,unreadable:i.unreadable.length},target:{duplicates:0,unreadable:0},ok:i.unreadable.length===0,severity:i.unreadable.length>0?"error":"info"}),o.push({key:"mcp_configuration_drift",value:i.duplicates.filter(u=>u.fingerprints.length>1).map(u=>u.name),target:[],ok:i.duplicates.every(u=>u.fingerprints.length===1),severity:"warning"});let a=await checkMcpHealth(i,n),c=a.records.filter(u=>u.status==="unhealthy");o.push({key:"mcp_health",value:a.records,target:"no unhealthy enabled servers",ok:c.length===0,severity:"warning"});let l=t.activePluginRoot??me(n,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}).root;if(l){let u=at(l);o.push({key:"skill_health",value:{root:u.pluginRoot,skills:u.skills,commands:u.commands,issues:u.issues},target:"valid and fully bound installed skills",ok:u.healthy,severity:"warning"});}return {name:"Contract",status:T(o),metrics:o}}function vn(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Qa(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!==_n(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Xa(e,t){let n=vn(e),o=_n(n.path),r=nr(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??Ya();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=>Qa(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:vn(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=>nr(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:T(s),metrics:s}}function tc(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(ec)){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 _r(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 nc(e){let t=_r(e);return t&&t.length>0?t:null}function dn(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 oc(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function or(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function sc(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:`initialize ${o} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:T(n),metrics:n};n.push({key:"memories_db",value:o,target:"readable memory database",ok:true,severity:"info"});let r=t.openDatabase??(i=>new(br())(i,{readOnly:true})),s;try{let i=r(o);s=i;let a=tc(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:T(n),metrics:n};let c=(t.now??Date.now)(),l=i.prepare(`
|
|
32
33
|
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
33
34
|
FROM distill_leases
|
|
34
|
-
`);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let b of u){let O=
|
|
35
|
+
`);l.setReadBigInts?.(!0);let u=l.all(),d=new Set,g=0,f=0;for(let b of u){let O=nc(b.event_ids),B=_r(b.session_ids),K=dn(b.event_count),$=dn(b.created_at),q=dn(b.expires_at),re=typeof b.status=="string"&&rc.has(b.status)?b.status:null,fe=typeof b.batch_id=="string"&&b.batch_id.trim().length>0,ks=O!==null&&K!==null&&oc(K,O.length);if(!fe||!O||!B||!ks||$===null||q===null||re===null){g+=1,b.status==="pending"&&(q===null||or(q,c))&&(f+=1);continue}if(!(re!=="pending"||!or(q,c)))for(let bs of O)d.add(bs);}n.push({key:"malformed_distill_leases",value:g,target:0,ok:g===0,severity:f>0?"error":"warning"});let p=i.prepare(`
|
|
35
36
|
SELECT id
|
|
36
37
|
FROM session_events
|
|
37
38
|
WHERE processed = 0 AND created_at < ?
|
|
38
|
-
`).all(c-300*1e3).filter(b=>!d.has(b.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let h=
|
|
39
|
+
`).all(c-300*1e3).filter(b=>!d.has(b.id)).length;n.push({key:"unprocessed_stale_events",value:p,target:0,ok:p===0,severity:"error"});let h=M(i,"SELECT COUNT(*) count FROM session_events WHERE processed = 0");n.push({key:"pending_memory_events",value:h,target:"actively leased or younger than 5 minutes",ok:p===0,severity:"error"});let y=i.prepare("SELECT MIN(created_at) oldest FROM session_events WHERE processed = 0").get(),_=y?.oldest==null?null:Number(y.oldest);n.push({key:"pending_memory_oldest_age_ms",value:_===null?0:Math.max(0,c-_),target:"<= 300000 when no active lease is present",ok:_===null||p===0,severity:"warning"});let D=M(i,`
|
|
39
40
|
SELECT COUNT(*) count
|
|
40
41
|
FROM session_events event
|
|
41
42
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
42
43
|
WHERE TRIM(event.session_id) = '' OR session.id IS NULL
|
|
43
|
-
`);n.push({key:"orphan_memory_events",value:
|
|
44
|
+
`);n.push({key:"orphan_memory_events",value:D,target:0,ok:D===0,severity:"error"});let v=M(i,`
|
|
44
45
|
SELECT COUNT(*) count
|
|
45
46
|
FROM sessions
|
|
46
47
|
WHERE status = 'active' AND created_at < ?
|
|
47
|
-
`,c-
|
|
48
|
+
`,c-Sr);n.push({key:"stale_memory_sessions",value:v,target:0,ok:v===0,severity:"error"});let w=i.prepare(`
|
|
48
49
|
SELECT COUNT(*) AS group_count, COALESCE(SUM(title_count), 0) AS row_count
|
|
49
50
|
FROM (
|
|
50
51
|
SELECT project, session_id, title, COUNT(*) AS title_count
|
|
@@ -52,67 +53,67 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd(
|
|
|
52
53
|
GROUP BY project, session_id, title
|
|
53
54
|
HAVING COUNT(*) > 1
|
|
54
55
|
)
|
|
55
|
-
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:T(n),metrics:n}}function V(e,t){return (t.openDatabase??(o=>new(
|
|
56
|
+
`).get();n.push({key:"duplicate_observation_title_groups",value:Number(w.group_count),target:0,ok:Number(w.group_count)===0,severity:"error"}),n.push({key:"duplicate_observation_title_rows",value:Number(w.row_count),target:0,ok:Number(w.row_count)===0,severity:"error"});}catch(i){n.push({key:"database_read",value:i.message,target:"readable Task 2 memory schema",ok:false,severity:"error"});}finally{s?.close();}return {name:"Distill",status:T(n),metrics:n}}function V(e,t){return (t.openDatabase??(o=>new(br())(o,{readOnly:true})))(e)}function W(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function gn(e,t){return W(e,t)?new Set(e.prepare(`PRAGMA table_info(${t})`).all().map(n=>n.name).filter(n=>typeof n=="string")):new Set}function M(e,t,...n){let o=e.prepare(t).get(...n);return Number(o?.count??0)}function fn(e,t){return e===0?1:t/e}function ic(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=V(s,t),W(g,"nodes")?(o=M(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=V(i,t);let f=W(g,"symbols_vec_rowids")?"symbols_vec_rowids":W(g,"symbol_sources")?"symbol_sources":null;f?(r=M(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=fn(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=V(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!W(g,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let p=M(g,"SELECT COUNT(*) count FROM knowledge_chunks"),h=M(g,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),y=fn(p,h),D=g.prepare(`
|
|
56
57
|
SELECT d.source source, COUNT(c.id) chunks,
|
|
57
58
|
SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
|
|
58
59
|
FROM knowledge_docs d
|
|
59
60
|
LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
|
|
60
61
|
LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
|
|
61
62
|
GROUP BY d.source ORDER BY d.source
|
|
62
|
-
`).all().map(v=>{let w=Number(v.chunks),b=Number(v.vectors);return {source:v.source,chunks:w,vectors:b,coverage:
|
|
63
|
+
`).all().map(v=>{let w=Number(v.chunks),b=Number(v.vectors);return {source:v.source,chunks:w,vectors:b,coverage:fn(w,b)}});n.push({key:"knowledge_chunks",value:p,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:h,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:y,target:">= 0.95",ok:y>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:D,target:"every source >= 0.95",ok:D.every(v=>v.coverage>=.95),severity:"warning"});}}catch(f){n.push({key:"knowledge_vectors_read",value:f.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{g?.close();}}let c=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(c))n.push({key:"observation_vectors_db",value:"missing",target:c,ok:false,severity:"warning"});else {let g;try{if(g=V(c,t),!W(g,"observations")||!W(g,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let f=M(g,"SELECT COUNT(*) count FROM observations"),m=M(g,`
|
|
63
64
|
SELECT COUNT(DISTINCT e.source_id) count
|
|
64
65
|
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
65
66
|
WHERE e.source_type = 'observation'
|
|
66
67
|
`),p=Math.max(0,f-m);n.push({key:"observations",value:f,ok:!0,severity:"info"}),n.push({key:"observation_vectors",value:m,ok:!0,severity:"info"}),n.push({key:"observation_vectors_missing",value:p,target:0,ok:p===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(`
|
|
67
|
-
`).filter(f=>{let m=/^\[([^\]]+)\]/.exec(f);return m?Date.parse(m[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:T(n),metrics:n}}function
|
|
68
|
+
`).filter(f=>{let m=/^\[([^\]]+)\]/.exec(f);return m?Date.parse(m[1])>=g:!1}).length;}catch(g){n.push({key:"embedder_error_log_read",value:g.message,target:"readable error log",ok:false,severity:"error"});}return n.push({key:"embedder_errors_24h",value:d,target:0,ok:d===0,severity:"warning"}),{name:"Vectors",status:T(n),metrics:n}}function ac(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=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=V(s,n),o.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[v,w]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let b=W(m,w)?M(m,`SELECT COUNT(*) count FROM ${w} WHERE created_at >= ?`,i):0;o.push({key:v,value:b,ok:!0,severity:"info"});}let p=W(m,"telemetry_failures")?M(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;o.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a});let h=gn(m,"sessions"),y=gn(m,"tool_call_events"),_=gn(m,"skill_executions"),D=["id","project_root","started_at","status"].every(v=>h.has(v));if(o.push({key:"telemetry_session_schema",value:D?"canonical":"sessions table or identity columns missing",target:"canonical sessions table",ok:D,severity:"error"}),D){let v=M(m,`
|
|
68
69
|
SELECT COUNT(*) count FROM sessions
|
|
69
70
|
WHERE project_root = ? AND started_at >= ?
|
|
70
|
-
`,e,i);o.push({key:"session_start_evidence_24h",value:v,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let w=
|
|
71
|
+
`,e,i);o.push({key:"session_start_evidence_24h",value:v,target:"present after a Claude SessionStart",ok:!0,severity:"info"});let w=M(m,`
|
|
71
72
|
SELECT COUNT(*) count FROM sessions
|
|
72
73
|
WHERE project_root = ? AND status = 'running' AND started_at < ?
|
|
73
|
-
`,e,(n.now??Date.now)()-
|
|
74
|
+
`,e,(n.now??Date.now)()-Sr);o.push({key:"stale_telemetry_sessions",value:w,target:0,ok:w===0,severity:"error"});let b=0;y.has("session_id")&&(b=M(m,`
|
|
74
75
|
SELECT COUNT(*) count
|
|
75
76
|
FROM tool_call_events event
|
|
76
77
|
LEFT JOIN sessions session ON session.id = event.session_id
|
|
77
78
|
WHERE TRIM(COALESCE(event.session_id, '')) = '' OR session.id IS NULL
|
|
78
|
-
`));let O=0;_.has("session_id")&&(O=
|
|
79
|
+
`));let O=0;_.has("session_id")&&(O=M(m,`
|
|
79
80
|
SELECT COUNT(*) count
|
|
80
81
|
FROM skill_executions execution
|
|
81
82
|
LEFT JOIN sessions session ON session.id = execution.session_id
|
|
82
83
|
WHERE TRIM(COALESCE(execution.session_id, '')) = '' OR session.id IS NULL
|
|
83
|
-
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:b,skillExecutions:O},target:{toolCalls:0,skillExecutions:0},ok:b===0&&O===0,severity:"error"});}if(
|
|
84
|
+
`)),o.push({key:"orphan_telemetry_events",value:{toolCalls:b,skillExecutions:O},target:{toolCalls:0,skillExecutions:0},ok:b===0&&O===0,severity:"error"});}if(W(m,"tool_call_events"))if(y.has("failure_category")){let v=m.prepare(`
|
|
84
85
|
SELECT failure_category category, COUNT(*) count
|
|
85
86
|
FROM tool_call_events
|
|
86
87
|
WHERE timestamp >= ? AND failure_category IS NOT NULL
|
|
87
88
|
GROUP BY failure_category
|
|
88
89
|
ORDER BY failure_category
|
|
89
|
-
`).all(i),w=Object.fromEntries(v.map(K=>[K.category,Number(K.count)])),b=
|
|
90
|
-
`))if(d.trim())try{let g=JSON.parse(d),f=
|
|
90
|
+
`).all(i),w=Object.fromEntries(v.map(K=>[K.category,Number(K.count)])),b=M(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),O=v.reduce((K,$)=>K+Number($.count),0),B=b===0?1:O/b;o.push({key:"failure_categories_24h",value:w,ok:!0,severity:"info"}),o.push({key:"failure_category_coverage_24h",value:B,target:">= 0.80",ok:B>=.8,severity:a});}else o.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}catch(p){o.push({key:"global_telemetry_db_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}let c=[...new Set([join$1(dirname(s),"telemetry-cache"),join$1(r,".devflow","telemetry-cache")])],l=0;try{l=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(h=>h.endsWith(".json")).length:0),0),o.push({key:"telemetry_cache_files",value:l,target:0,ok:l===0,severity:a});}catch(m){o.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let u=join$1(e,".devflow","devflow.db"),d=existsSync$1(u);o.push({key:"project_local_telemetry_db",value:d?u:"absent",target:"absent",ok:!d,severity:a});let g=join$1(e,".codegraph","codegraph.db"),f=[];if(existsSync$1(g)){let m;try{m=V(g,n),f=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){o.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return o.push({key:"codegraph_devflow_tables",value:f,target:[],ok:f.length===0,severity:a}),{name:"Telemetry",status:T(o),metrics:o}}function sr(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Pr(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 lc(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=sr(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 m=lstatSync(f),p=sr(f),h=readFileSync$1(f,"utf8").trim(),y=m.isFile()&&!m.isSymbolicLink();t.push({key:`${u}_source`,value:{path:f,mode:p,bytes:Buffer.byteLength(h)},target:{type:"regular file",mode:"400",nonempty:!0},ok:y&&h.length>0&&(process.platform==="win32"||p==="400"),severity:!y||h.length===0?"error":"warning"});}catch(m){t.push({key:`${u}_source`,value:m.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)()-Oe;for(let d of readFileSync$1(a,"utf8").split(`
|
|
91
|
+
`))if(d.trim())try{let g=JSON.parse(d),f=Pr(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:T(t),metrics:t}}function uc(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:T(t),metrics:t};let r;try{if(r=V(o,e),!W(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:T(t),metrics:t};let s=r.prepare(`
|
|
91
92
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
92
93
|
FROM benchmark_reports
|
|
93
94
|
ORDER BY created_at DESC
|
|
94
95
|
LIMIT 1
|
|
95
|
-
`).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:T(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/
|
|
96
|
-
`))if(_.trim())try{let
|
|
96
|
+
`).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:T(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/Oe).toFixed(2)):null,target:"0-30",ok:Number.isFinite(l)&&l>=0&&l<=cc,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:T(t),metrics:t}}function dc(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 gc(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)()-Oe,i=0,a=0;for(let y of [...new Set(o)])if(existsSync$1(y))try{for(let _ of readFileSync$1(y,"utf8").split(`
|
|
97
|
+
`))if(_.trim())try{let D=JSON.parse(_),v=Pr(D.ts);v===null||typeof D.reason!="string"?a+=1:v>=s&&(i+=1);}catch{a+=1;}}catch(_){t.push({key:"hook_fallback_log_read",value:{path:y,error:_.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=V(c,e),W(y,"telemetry_events")){let _=y.prepare(`
|
|
97
98
|
SELECT COUNT(*) total,
|
|
98
99
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
99
100
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
100
101
|
FROM telemetry_events
|
|
101
102
|
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
102
|
-
`).get(s);l=Number(_?.total??0),u=Number(_?.failures??0),d=_?.average_duration==null?null:Math.round(Number(_.average_duration)*100)/100;}}catch(_){t.push({key:"hook_daemon_metrics_read",value:_.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),m=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(m*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 p=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:p,target:[],ok:p.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=
|
|
103
|
+
`).get(s);l=Number(_?.total??0),u=Number(_?.failures??0),d=_?.average_duration==null?null:Math.round(Number(_.average_duration)*100)/100;}}catch(_){t.push({key:"hook_daemon_metrics_read",value:_.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{y?.close();}}let g=Math.max(i,u),f=Math.max(l,g),m=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(m*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 p=g>0?["4-Gate enforcement","memory prefetch cache","daemon-shared hook state"]:[];t.push({key:"degraded_hook_features",value:p,target:[],ok:p.length===0,severity:"warning"});let h=join$1(n,".devflow","logs","hook-debug");try{let y=dc(h);t.push({key:"hook_debug_log_bytes",value:y.bytes,target:`<= ${rr}`,ok:y.bytes<=rr,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:T(t),metrics:t}}function ge(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function Se(e){return JSON.parse(readFileSync$1(e,"utf8"))}function j(e){return typeof e=="object"&&e!==null?e:null}function Er(e,t){return pc.has(e)&&!(t.tolerateControlSyntax&&hc.has(e))}function Ze(e,t={}){if(Buffer.byteLength(e)>Dr)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]===`
|
|
103
104
|
`){u+=1;continue}if(e[u+1]==="\r"&&e[u+2]===`
|
|
104
105
|
`){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]!==`
|
|
105
|
-
`;)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==="}"&&
|
|
106
|
-
`].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&&
|
|
106
|
+
`;)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==="}"&&yc.test(`${r}}`);if(["(",")","{","}"].includes(d)&&!f&&!t.tolerateControlSyntax&&(a=true),g==="&&"||g==="||"){l(),u+=1;continue}if([";","|","&",`
|
|
107
|
+
`].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&&Er(d,t)})&&(a=true),{segments:n,malformed:a}}function vc(e){return Ze(e).segments.flat().join(" ")}function wc(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 $r(e,t){return wc(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 kc(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]===`
|
|
107
108
|
`){o-=1;break}e[o]!==`
|
|
108
|
-
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function
|
|
109
|
+
`&&e[o]!=="\r"&&(t[o]=" "),o+=1;}}return t.join("")}function bc(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]!==`
|
|
109
110
|
`;)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]===`
|
|
110
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function te(e,t,n="infer"){let o=t?
|
|
111
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function te(e,t,n="infer"){let o=t?vc(e):n==="node"?kc(e):n==="python"?bc(e):e;return [...new Set(o.match(fc)??[])]}function Sc(e){return Ze(e).segments.flat()}function ne(e,t,n=false,o="infer"){let r=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of r){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:o}}if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(e)||e.startsWith("node:"))return null;if(isAbsolute(e)){let i=resolve(e),a=resolve(t.project),c=resolve(t.homePath),l=de(a,i)?a:de(c,i)?c:dirname(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 _c(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>Dr||r.includes(0))return null;let s=r.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function Cn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=_c(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:ft(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:ne(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||be(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=Cc(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:ne(s,r,true,e.parserKind)??void 0,malformed:false}}return {reference:ne(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:ne(i,r,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function Pc(e){let t=[e];extname(e)===""&&t.push(...ir.map(n=>`${e}${n}`),...ir.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Cc(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 Pc(o)??o}function Rc(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]!==`
|
|
111
112
|
`;)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===`
|
|
112
|
-
`||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
|
|
113
|
+
`||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 Dc(e,t,n,o=true){let r=Rc(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 p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"cjs");continue}i=true;continue}if(f?.value==="."||!["export","import"].includes(g.value))continue;if(g.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"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 m=-1;for(let p=d+1;p<Math.min(c.length,d+32)&&c[p].value!==";";p+=1)if(c[p].value==="from"){m=p;break}m>=0?a(c[m+1],"esm"):g.value==="import"&&(i=true);}let l=[],u=[];for(let d of s){let g=Cn(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 Ec(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]!==`
|
|
113
114
|
`;)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]===`
|
|
114
115
|
`||e[d]==="\r"))break;e[d]!==`
|
|
115
|
-
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let m=0;m<f.length;m+=1)if(f[m]==="{"){if(f[m+1]==="{"){m+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function Ko(e,t){let n=t.split(".");if(n.length>mn)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 Za(e,t,n){let o=Ya(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=ne(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),m=Ko(f,d);s||=!m.resolved;for(let h of m.paths)a(h);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=d=>{let g=[];for(let f of d.split(",")){let m=f.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}g.push(m);}return g},u=(d,g)=>{for(let f of l(g))d&&Ko(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 w of v)c(w.trim().split(/\s+as\s+/)[0]);continue}let m=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,h=m[2];if(h){let v=c(h,p);u(v,m[3]);continue}if(p===0){s=true;continue}let y=i(p),_=join$1(y,"__init__.py"),E=false;try{E=statSync$1(_).isFile();}catch{}if(E){a(_),u(y,m[3]);continue}for(let v of l(m[3]))c(v,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function fr(e,t,n,o,r=true){return n==="node"?Ja(e,t,o,r):n==="python"?Za(e,t,o):{references:[],inlineContents:[],malformed:false}}function qo(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=ut(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>ne(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=pn(g);m.reference&&c.push(m.reference),m.inlineContent&&l.push(m.inlineContent),u||=m.malformed;continue}let f=ne(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 mr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function ve(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 ct(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function We(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function nc(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||=ve(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(tc.has(u))return a();if(ec.has(u)){l=true,c+=1;continue}let d=zo.has(u)?"cjs":Vo.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=We(u,zo),f=We(u,Vo),m=g??f;if(m!==null){if(!m)return a(true);i(m,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(Go.has(u)){let h=e[c+1];return a(h===void 0?true:s||ct(h))}let p=We(u,Go);if(p!==null)return a(s||ct(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||ct(u.slice(2)));if(Jo.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(We(u,Jo)!==null){c+=1;continue}if(Xa.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function ic(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:ve(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?ut(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(oc.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:ve(i)}}return {tokens:[],malformed:true}}function ac(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:ve(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:ve(r)};if(sc.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Yo.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(We(r,Yo)!==null){o+=1;continue}if(rc.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function on(e,t){let n=ne(e,t,true);if(!n)return null;let o=de(n.path),r=de(t.project);return !o||!r||!ue(r,o)?null:o}function uc(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(mr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=qe(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 ut(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>lr)return {tokens:[],malformed:true};let r=qe(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=pr(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 pr(e,t,n,o){let r=0;for(;mr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;cc.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>lr)return {tokens:i,malformed:true};let p=uc(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=pr(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&dr(l,o),d=c&&!lc.has(l);if(u||d)return {tokens:i,malformed:true};let g=ve(s);i.push(s);let f=l;if(!Qa.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?nc(e,r+1,n):["bash","sh","zsh"].includes(f)?ic(e,r+1,a,n,o):ac(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function hr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:de(t.slice(0,o))}function dc(e,t){let n=new Map;for(let o of t)for(let r of Ka(o)){let s=hr(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 gc(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function fc(e){return e.slice(e.lastIndexOf("@")+1)}function Zo(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=de(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function mc(e,t,n){let o=fc(e),r=M(t.extraKnownMarketplaces),s=M(r?.[o]);if(s){let i=M(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Zo(i.path):null}}try{let i=M(we(n)),a=M(i?.[o]);if(a){let c=M(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Zo(c.path):null}}}catch{}return {configured:false,root:null}}function Qo(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 pc(e,t){let n=M(e.entry),o=M(t.entry),r=Qo(n),s=Qo(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?dt(n.version):null,a=typeof o?.version=="string"?dt(o.version):null;if(i&&a){let c=yr(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function hc(e,t){try{let n=M(we(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=M(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(pc)[0],i=M(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:de(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function dt(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 yr(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 yc(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=M(we(join$1(c,"package.json")));typeof u?.version=="string"&&(l=u.version);}catch{}return {name:a.name,path:c,version:l,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let l=dt(a.version),u=dt(c.version);if(l&&u){let d=yr(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]?de(i[0].path):null}function vc(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(w=>de(w)).filter(w=>w!==null).map(w=>({root:w,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 w=M(we(v));if(!w)throw new Error("settings must be an object");i.push({path:v,settings:w});}catch{a.push(v);}if(i.reduce((v,w)=>typeof w.settings.disableAllHooks=="boolean"?w.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 w=[];return Be(v.settings.hooks,w),{path:v.path,commands:w}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>dc(v.path,v.commands)),p=[...i.reduce((v,w)=>{let b=w.settings.enabledPlugins;if(typeof b!="object"||b===null)return v;for(let[O,B]of Object.entries(b))gc(O)&&typeof B=="boolean"&&v.set(O,B);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of p){let w=hc(v,o);w.malformed&&c.push(o);let b=w.root;if(!w.configured){let O=i.map(K=>mc(v,K.settings,r)).filter(K=>K.configured),B=O[O.length-1];B?b=B.root:b=yc(v,s);}b?h.push({root:b,inspectPluginConfig:true}):y=true;}let _=[...h.reduce((v,w)=>{let b=v.get(w.root);return b?(v.set(w.root,{root:w.root,configPath:b.configPath??w.configPath,commands:[...new Set([...b.commands??[],...w.commands??[]])],inspectPluginConfig:!!(b.inspectPluginConfig||w.inspectPluginConfig)}),v):(v.set(w.root,w),v)},new Map).values()],E=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:_,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:E.length>0?`${E.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(_.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function wc(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 Be(e,t){if(Array.isArray(e)){for(let n of e)Be(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):Be(o,t);}function rn(e){return [...e.matchAll(Ma)].map(t=>t[1])}function kc(e){let t=new Map,n=qe(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 bc(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 Sc(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 sn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function ue(e,t){return t===e||t.startsWith(`${e}${sep}`)}function ln(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>at)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>at)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,at+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>at)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 _c(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>mn){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)){ue(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(!ue(g,f)){o.escapedArtifacts.push(u);return}let m=`${f}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),r.push({...c,path:f,depth:l}));};for(let c of n){let l=qo(c,e,t);l.malformed&&o.malformedCommands.push(c);for(let u of l.inlineContents)for(let d of te(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>=cr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=ln(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 m of te(d,f,g))o.findings.push({artifact:l,endpoint:m});if(f){let m=qo(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}else if(g==="node"||g==="python"){let m=fr(l,d,g,{project:e,homePath:t,cwd:dirname(l)});m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}}}function Pc(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=wc(r),c=0,l=(f,m=false,p=r,h="infer",y=e,_=0)=>{if(_>mn){o.traversalLimitRoots.push(r);return}let E=realpathSync.native(p),v=resolve(f);if(!existsSync$1(v)){if(!ue(E,v)){o.escapedArtifacts.push(v);return}m&&o.missing.push(v);return}let w;try{w=realpathSync.native(v);}catch{m&&o.missing.push(v);return}if(!ue(E,w)){o.escapedArtifacts.push(v);return}let b=`${w}:${h}:${y}`;i.has(b)||(i.add(b),s.push({path:w,parserKind:h,cwd:y,depth:_}));},u=(f,m,p,h=0)=>{for(let y of rn(f)){let _=sn(r,y);if(!_)continue;let E=(m.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(_,true,r,E?.parserKind??"infer",E?.cwd??p,h);}},d=(f,m,p=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let _=y.nodeResolutionKind?pn(y,!h):{reference:ne(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(_.malformed){o.malformedCommands.push(y.value);continue}if(_.inlineContent)for(let E of te(_.inlineContent.content,false,"node"))o.findings.push({artifact:_.inlineContent.source,endpoint:E});_.reference&&l(_.reference.path,true,h?r:_.reference.containmentRoot,_.reference.parserKind,_.reference.cwd??m,p);}},g=f=>{for(let p of te(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=ut(f,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(f),u(f,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let h=hr(p),y=(m.artifacts??[]).find(_=>_.value===p);h===r&&l(p,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),m=join$1(r,"hooks.json"),p=existsSync$1(m)?m:f;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!ue(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=ln(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(un(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let _=JSON.parse(y.content),E=[];Be(_,E);for(let v of E)g(v);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=cr){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=ln(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(un(m,p.reason));continue}let{content:h}=p;o.inspected.push(m);let y=f.parserKind==="infer"?gr(m,h):f.parserKind,_=y==="shell";for(let w of te(h,_,y))o.findings.push({artifact:m,endpoint:w});if(_){let w=kc(h),b=ut(w,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});bc(h)&&o.malformedCommands.push(m),u(w,b,dirname(m),f.depth+1),d(b,dirname(m),f.depth+1,true);}else if(y==="node"||y==="python"){let w=fr(m,h,y,{project:e,homePath:t,cwd:dirname(m)},false);(y==="node"?Sc(m):w.malformed)&&o.malformedCommands.push(m);for(let b of w.inlineContents)for(let O of te(b.content,false,"node"))o.findings.push({artifact:b.source,endpoint:O});for(let b of w.references){let O=relative(r,resolve(b.path));!O.startsWith(`..${sep}`)&&O.split(sep).includes("node_modules")||l(b.path,true,r,b.parserKind,b.cwd,f.depth+1);}for(let b of rn(h)){let O=sn(r,b);O&&l(O,true,r,y,f.cwd,f.depth+1);}}else for(let w of rn(h)){let b=sn(r,w);b&&l(b,true,r,y,f.cwd,f.depth+1);}let E=m.startsWith(`${r}/`)?m.slice(r.length+1):"",v=basename(E).replace(/\.js$/,"");a&&(E.startsWith("hooks/")||E.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),E.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function Rc(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=M(we(t)),r=M(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=M(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=de(a.installPath);if(!c)continue;let l=n.get(c)??new Set;l.add(a.version),n.set(c,l);}}catch{return new Map}return new Map([...n].map(([o,r])=>[o,[...r].sort()]))}function Xo(e){try{let t=M(we(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function Cc(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=Rc(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 _=M(we(d)),E=M(_?.hooks),v=[];Be(E?.SessionStart,v),v.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=Xo(i),f=Xo(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(_=>_!==g))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let _=readFileSync$1(h,"utf8");(!existsSync$1(y)||!_.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function Ec(e,t){let n=vc(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 q of D.commands){o.commandsInspected.push({configPath:D.path,command:q});for(let re of te(q,true))o.findings.push({artifact:D.path,endpoint:re});}}_c(e,t.homePath??homedir$1(),n.configCommands.flatMap(D=>D.commands).filter(D=>!n.targets.some(q=>q.commands?.includes(D))),o);for(let D of n.targets)Pc(e,t.homePath??homedir$1(),D,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((D,q,re)=>re.findIndex(ge=>ge.configPath===D.configPath&&ge.command===D.command)===q),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,q,re)=>re.findIndex(ge=>ge.artifact===D.artifact&&ge.endpoint===D.endpoint)===q),m=a.length>0||g.length>0||u.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=Cc(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,_=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),E=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}:E?{root:E,version:null}:Ye(_,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=v.root,b=w?$e(_,w):[],O=b.filter(D=>!D.isKnownDevFlowArtifact).map(D=>({skillName:D.skillName,path:D.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),B=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,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:b.length,target:0,ok:b.length===0,severity:"error"},{key:"shadowed_skills",value:b,target:[],ok:b.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:O,target:[],ok:true,severity:"info"}],K=v.version??h.versionRecords.find(D=>D.root===w)?.packageVersion;return K&&B.push({key:"active_plugin_version",value:K,ok:true,severity:"info"}),{name:"Legacy paths",status:T(B),metrics:B}}function Dc(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 mt(e){let t=Dc(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)/Ee: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 $c(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=V(i,t);let l=(H(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:j(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:T(n),metrics:n}}function Ac(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:T(n),metrics:n};let r;try{if(r=V(o,t),!H(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*Ee,i=r.prepare(`
|
|
116
|
+
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let f=e.slice(o+u,d-u);for(let m=0;m<f.length;m+=1)if(f[m]==="{"){if(f[m+1]==="{"){m+=1;continue}n=true;break}}n||=!g,o=d;}return {content:t.join(""),malformed:n}}function ar(e,t){let n=t.split(".");if(n.length>Pn)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 $c(e,t,n){let o=Ec(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=ne(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),m=ar(f,d);s||=!m.resolved;for(let h of m.paths)a(h);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},l=d=>{let g=[];for(let f of d.split(",")){let m=f.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}g.push(m);}return g},u=(d,g)=>{for(let f of l(g))d&&ar(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 w of v)c(w.trim().split(/\s+as\s+/)[0]);continue}let m=f.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,h=m[2];if(h){let v=c(h,p);u(v,m[3]);continue}if(p===0){s=true;continue}let y=i(p),_=join$1(y,"__init__.py"),D=false;try{D=statSync$1(_).isFile();}catch{}if(D){a(_),u(y,m[3]);continue}for(let v of l(m[3]))c(v,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Ar(e,t,n,o,r=true){return n==="node"?Dc(e,t,o,r):n==="python"?$c(e,t,o):{references:[],inlineContents:[],malformed:false}}function cr(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=pt(e,0,r),i=new Set((s.artifacts??[]).map(g=>g.value)),a=s.tokens.filter(g=>!i.has(g)).map(g=>ne(g,r)).filter(g=>g!==null),c=[],l=[...s.inlineContents??[]],u=s.malformed;for(let g of s.artifacts??[]){if(g.nodeResolutionKind){let m=Cn(g);m.reference&&c.push(m.reference),m.inlineContent&&l.push(m.inlineContent),u||=m.malformed;continue}let f=ne(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 xr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function be(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 ft(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function Ve(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Ic(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||=be(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(Tc.has(u))return a();if(Oc.has(u)){l=true,c+=1;continue}let d=lr.has(u)?"cjs":ur.has(u)?"esm":null;if(d){let h=e[c+1];if(!h)return a(true);i(h,d),c+=2;continue}let g=Ve(u,lr),f=Ve(u,ur),m=g??f;if(m!==null){if(!m)return a(true);i(m,g!==null?"cjs":"esm"),c+=1;continue}if(u.startsWith("-r")&&u.length>2){i(u.slice(2),"cjs"),c+=1;continue}if(dr.has(u)){let h=e[c+1];return a(h===void 0?true:s||ft(h))}let p=Ve(u,dr);if(p!==null)return a(s||ft(p));if((u.startsWith("-e")||u.startsWith("-p"))&&u.length>2)return a(s||ft(u.slice(2)));if(gr.has(u)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(Ve(u,gr)!==null){c+=1;continue}if(xc.has(u)){c+=1;continue}return a(true)}return l?a():a(true)}function Lc(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:be(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?pt(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Nc.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:be(i)}}return {tokens:[],malformed:true}}function Fc(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:be(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:be(r)};if(Mc.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(fr.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(Ve(r,fr)!==null){o+=1;continue}if(jc.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function mn(e,t){let n=ne(e,t,true);if(!n)return null;let o=ge(n.path),r=ge(t.project);return !o||!r||!de(r,o)?null:o}function Wc(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(xr(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let l=Ze(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?mn(c,i):null;if(!l)return {index:s,malformed:true};i={...i,cwd:l},s+=2;}else if(a.startsWith("--chdir=")){let c=mn(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=mn(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 pt(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Rr)return {tokens:[],malformed:true};let r=Ze(e,o),s=[],i=[],a=[],c=r.malformed;for(let l of r.segments){let u=Or(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 Or(e,t,n,o){let r=0;for(;xr(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Uc.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Rr)return {tokens:i,malformed:true};let p=Wc(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let h=Or(p.replacement,a,p.context??n,o);return i.push(...h.tokens),{tokens:i,artifacts:h.artifacts,inlineContents:h.inlineContents,malformed:h.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let l=basename(s),u=!s.includes(sep)&&Er(l,o),d=c&&!Hc.has(l);if(u||d)return {tokens:i,malformed:true};let g=be(s);i.push(s);let f=l;if(!Ac.has(f))return {tokens:i,malformed:g};let m=["node","tsx"].includes(f)?Ic(e,r+1,n):["bash","sh","zsh"].includes(f)?Lc(e,r+1,a,n,o):Fc(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:g||m.malformed}}function Tr(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:ge(t.slice(0,o))}function Bc(e,t){let n=new Map;for(let o of t)for(let r of Sc(o)){let s=Tr(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 Kc(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function qc(e){return e.slice(e.lastIndexOf("@")+1)}function mr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=ge(t);if(n&&(existsSync$1(join$1(n,"hooks","hooks.json"))||existsSync$1(join$1(n,"hooks.json"))))return n}return null}function zc(e,t,n){let o=qc(e),r=j(t.extraKnownMarketplaces),s=j(r?.[o]);if(s){let i=j(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?mr(i.path):null}}try{let i=j(Se(n)),a=j(i?.[o]);if(a){let c=j(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?mr(c.path):null}}}catch{}return {configured:false,root:null}}function pr(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 Vc(e,t){let n=j(e.entry),o=j(t.entry),r=pr(n),s=pr(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?ht(n.version):null,a=typeof o?.version=="string"?ht(o.version):null;if(i&&a){let c=Ir(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Jc(e,t){try{let n=j(Se(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=j(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(Vc)[0],i=j(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:ge(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function ht(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 Ir(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 Gc(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=j(Se(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=ht(a.version),u=ht(c.version);if(l&&u){let d=Ir(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]?ge(i[0].path):null}function Yc(e,t){if(t.legacyArtifactRoots!==void 0){let v=t.legacyArtifactRoots.map(w=>ge(w)).filter(w=>w!==null).map(w=>({root:w,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 w=j(Se(v));if(!w)throw new Error("settings must be an object");i.push({path:v,settings:w});}catch{a.push(v);}if(i.reduce((v,w)=>typeof w.settings.disableAllHooks=="boolean"?w.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 w=[];return Ge(v.settings.hooks,w),{path:v.path,commands:w}}),g=d.flatMap(v=>v.commands),f=d.flatMap(v=>Bc(v.path,v.commands)),p=[...i.reduce((v,w)=>{let b=w.settings.enabledPlugins;if(typeof b!="object"||b===null)return v;for(let[O,B]of Object.entries(b))Kc(O)&&typeof B=="boolean"&&v.set(O,B);return v},new Map)].filter(([,v])=>v).map(([v])=>v).sort(),h=[...f],y=false;for(let v of p){let w=Jc(v,o);w.malformed&&c.push(o);let b=w.root;if(!w.configured){let O=i.map(K=>zc(v,K.settings,r)).filter(K=>K.configured),B=O[O.length-1];B?b=B.root:b=Gc(v,s);}b?h.push({root:b,inspectPluginConfig:true}):y=true;}let _=[...h.reduce((v,w)=>{let b=v.get(w.root);return b?(v.set(w.root,{root:w.root,configPath:b.configPath??w.configPath,commands:[...new Set([...b.commands??[],...w.commands??[]])],inspectPluginConfig:!!(b.inspectPluginConfig||w.inspectPluginConfig)}),v):(v.set(w.root,w),v)},new Map).values()],D=[g.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(v=>v!==null);return {targets:_,configCommands:d.filter(v=>v.commands.length>0),hooksDisabled:false,method:D.length>0?`${D.join("+")}${y?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(_.length>0||g.length>0)&&!y&&a.length===0&&c.length===0}}function Zc(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 Ge(e,t){if(Array.isArray(e)){for(let n of e)Ge(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):Ge(o,t);}function pn(e){return [...e.matchAll(mc)].map(t=>t[1])}function Qc(e){let t=new Map,n=Ze(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 Xc(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 el(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 hn(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function de(e,t){return t===e||t.startsWith(`${e}${sep}`)}function wn(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>gt)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>gt)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,gt+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>gt)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 kn(e,t){return `${e} (${t})`}function tl(e,t,n,o){let r=[],s=new Set,i=0,a=(c,l=0)=>{if(l>Pn){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)){de(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(!de(g,f)){o.escapedArtifacts.push(u);return}let m=`${f}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),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 te(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>=Cr){o.traversalLimitRoots.push(e);break}let c=r.shift(),l=c.path;i+=1;let u=wn(l);if(u.kind==="missing"){o.missing.push(l);continue}if(u.kind==="unsafe"){u.reason!=="binary"&&o.unsafeArtifacts.push(kn(l,u.reason));continue}let{content:d}=u;o.inspected.push(l);let g=c.parserKind==="infer"?$r(l,d):c.parserKind,f=g==="shell";for(let m of te(d,f,g))o.findings.push({artifact:l,endpoint:m});if(f){let m=cr(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}else if(g==="node"||g==="python"){let m=Ar(l,d,g,{project:e,homePath:t,cwd:dirname(l)});m.malformed&&o.malformedCommands.push(l);for(let p of m.inlineContents)for(let h of te(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:h});for(let p of m.references)a(p,c.depth+1);}}}function nl(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Zc(r),c=0,l=(f,m=false,p=r,h="infer",y=e,_=0)=>{if(_>Pn){o.traversalLimitRoots.push(r);return}let D=realpathSync.native(p),v=resolve(f);if(!existsSync$1(v)){if(!de(D,v)){o.escapedArtifacts.push(v);return}m&&o.missing.push(v);return}let w;try{w=realpathSync.native(v);}catch{m&&o.missing.push(v);return}if(!de(D,w)){o.escapedArtifacts.push(v);return}let b=`${w}:${h}:${y}`;i.has(b)||(i.add(b),s.push({path:w,parserKind:h,cwd:y,depth:_}));},u=(f,m,p,h=0)=>{for(let y of pn(f)){let _=hn(r,y);if(!_)continue;let D=(m.artifacts??[]).find(v=>v.value.includes("PLUGIN_ROOT")&&v.value.endsWith(y));l(_,true,r,D?.parserKind??"infer",D?.cwd??p,h);}},d=(f,m,p=0,h=false)=>{for(let y of f.artifacts??[]){if(y.value.includes("PLUGIN_ROOT"))continue;let _=y.nodeResolutionKind?Cn(y,!h):{reference:ne(y.value,{project:y.project,homePath:y.homePath,cwd:y.cwd},true,y.parserKind)??void 0,malformed:false};if(_.malformed){o.malformedCommands.push(y.value);continue}if(_.inlineContent)for(let D of te(_.inlineContent.content,false,"node"))o.findings.push({artifact:_.inlineContent.source,endpoint:D});_.reference&&l(_.reference.path,true,h?r:_.reference.containmentRoot,_.reference.parserKind,_.reference.cwd??m,p);}},g=f=>{for(let p of te(f,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=pt(f,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(f),u(f,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let h=Tr(p),y=(m.artifacts??[]).find(_=>_.value===p);h===r&&l(p,true,r,y?.parserKind??"infer",y?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let f of n.commands)g(f);}if(n.inspectPluginConfig||!n.commands){let f=join$1(r,"hooks","hooks.json"),m=join$1(r,"hooks.json"),p=existsSync$1(m)?m:f;if(!existsSync$1(p))o.missing.push(p),l(join$1(r,"hooks","session-start"));else {o.configsInspected.push(p);let h;try{h=realpathSync.native(p);}catch{o.missing.push(p),l(join$1(r,"hooks","session-start")),h="";}if(h&&!de(r,h)&&(o.escapedArtifacts.push(p),l(join$1(r,"hooks","session-start")),h=""),h){let y=wn(h);if(y.kind==="unsafe")o.unsafeArtifacts.push(kn(p,y.reason)),l(join$1(r,"hooks","session-start"));else if(y.kind==="missing")o.missing.push(p),l(join$1(r,"hooks","session-start"));else try{let _=JSON.parse(y.content),D=[];Ge(_,D);for(let v of D)g(v);}catch{o.malformedConfigs.push(p),l(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Cr){o.traversalLimitRoots.push(r);break}let f=s.shift(),m=f.path;c+=1;let p=wn(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(kn(m,p.reason));continue}let{content:h}=p;o.inspected.push(m);let y=f.parserKind==="infer"?$r(m,h):f.parserKind,_=y==="shell";for(let w of te(h,_,y))o.findings.push({artifact:m,endpoint:w});if(_){let w=Qc(h),b=pt(w,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});Xc(h)&&o.malformedCommands.push(m),u(w,b,dirname(m),f.depth+1),d(b,dirname(m),f.depth+1,true);}else if(y==="node"||y==="python"){let w=Ar(m,h,y,{project:e,homePath:t,cwd:dirname(m)},false);(y==="node"?el(m):w.malformed)&&o.malformedCommands.push(m);for(let b of w.inlineContents)for(let O of te(b.content,false,"node"))o.findings.push({artifact:b.source,endpoint:O});for(let b of w.references){let O=relative(r,resolve(b.path));!O.startsWith(`..${sep}`)&&O.split(sep).includes("node_modules")||l(b.path,true,r,b.parserKind,b.cwd,f.depth+1);}for(let b of pn(h)){let O=hn(r,b);O&&l(O,true,r,y,f.cwd,f.depth+1);}}else for(let w of pn(h)){let b=hn(r,w);b&&l(b,true,r,y,f.cwd,f.depth+1);}let D=m.startsWith(`${r}/`)?m.slice(r.length+1):"",v=basename(D).replace(/\.js$/,"");a&&(D.startsWith("hooks/")||D.startsWith("dist/hooks/"))&&l(join$1(a,"packages","devflow","src","hooks",`${v}.ts`),false,a),D.startsWith("hooks/")&&l(join$1(r,"dist","hooks",`${v}.js`));}}function ol(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=j(Se(t)),r=j(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=j(i);if(typeof a?.installPath!="string"||typeof a.version!="string")continue;let c=ge(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 hr(e){try{let t=j(Se(e));return typeof t?.version=="string"?t.version:void 0}catch{return}}function rl(e,t){let n={layoutIssues:[],versionIssues:[],versionRecords:[],sessionStartIssues:[],daemonIssues:[]},o=ol(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 _=j(Se(d)),D=j(_?.hooks),v=[];Ge(D?.SessionStart,v),v.some(w=>/(?:^|[/\\])session-start(?:\s|$|["'])/.test(w))||n.sessionStartIssues.push({root:s,issue:"SessionStart wrapper is not registered"});}catch{n.sessionStartIssues.push({root:s,issue:"hook configuration is unreadable"});}let g=hr(i),f=hr(a),m=o.get(s)??[],p={root:s,packageVersion:g,manifestVersion:f,registryVersions:m};n.versionRecords.push(p),(!g||!f||g!==f||m.some(_=>_!==g))&&n.versionIssues.push(p);let h=join$1(s,"hooks","session-start"),y=join$1(s,"dist","hooks","hook-daemon.js");try{let _=readFileSync$1(h,"utf8");(!existsSync$1(y)||!_.includes("hook-daemon.js"))&&n.daemonIssues.push({root:s,issue:"SessionStart does not register the packaged hook daemon"});}catch{n.daemonIssues.push({root:s,issue:"SessionStart wrapper or hook daemon is missing"});}}return n}function sl(e,t){let n=Yc(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let $ of n.configCommands){o.configsInspected.push($.path);for(let q of $.commands){o.commandsInspected.push({configPath:$.path,command:q});for(let re of te(q,true))o.findings.push({artifact:$.path,endpoint:re});}}tl(e,t.homePath??homedir$1(),n.configCommands.flatMap($=>$.commands).filter($=>!n.targets.some(q=>q.commands?.includes($))),o);for(let $ of n.targets)nl(e,t.homePath??homedir$1(),$,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter(($,q,re)=>re.findIndex(fe=>fe.configPath===$.configPath&&fe.command===$.command)===q),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(($,q,re)=>re.findIndex(fe=>fe.artifact===$.artifact&&fe.endpoint===$.endpoint)===q),m=a.length>0||g.length>0||u.length>0,p=m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,h=rl(n.targets,t),y=t.claudeSettingsPath?dirname(t.claudeSettingsPath):null,_=t.homePath??(y&&basename(y)===".claude"?dirname(y):y)??homedir$1(),D=n.targets.map($=>$.root).find($=>existsSync$1(join$1($,"skills")))??null,v=t.activePluginRoot?{root:existsSync$1(t.activePluginRoot)?t.activePluginRoot:null,version:null}:D?{root:D,version:null}:me(_,{installedPluginsPath:t.installedPluginsPath,pluginCachePath:t.pluginCachePath}),w=v.root,b=w?Ie(_,w):[],O=b.filter($=>!$.isKnownDevFlowArtifact).map($=>({skillName:$.skillName,path:$.globalPath,action:"inspect manually; file is modified or not a known DevFlow artifact"})),B=[{key:"active_plugin_resolution",value:p,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map($=>$.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:b.length,target:0,ok:b.length===0,severity:"error"},{key:"shadowed_skills",value:b,target:[],ok:b.length===0,severity:"error"},{key:"active_skill_source",value:w,target:"existing plugin cache path",ok:true,severity:"info"},{key:"skill_shadowing_remediation",value:O,target:[],ok:true,severity:"info"}],K=v.version??h.versionRecords.find($=>$.root===w)?.packageVersion;return K&&B.push({key:"active_plugin_version",value:K,ok:true,severity:"info"}),{name:"Legacy paths",status:T(B),metrics:B}}function il(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 wt(e){let t=il(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)/Oe: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 al(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=V(i,t);let l=(W(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:M(a,"SELECT COUNT(*) count FROM observations WHERE source = 'explicit_intent'"),ok:!0,severity:"info"});}catch(c){n.push({key:"explicit_memory_channel_read",value:c.message,target:"readable memory database",ok:false,severity:"error"});}finally{a?.close();}}return {name:"Injection",status:T(n),metrics:n}}function cl(e,t){let n=[],o=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(o))return n.push({key:"memories_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Memory quality",status:T(n),metrics:n};let r;try{if(r=V(o,t),!W(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*Oe,i=r.prepare(`
|
|
116
117
|
SELECT source, COUNT(*) count FROM memories
|
|
117
118
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
118
119
|
`).all(s),a=r.prepare(`
|
|
@@ -120,11 +121,11 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Fe(){let e=Yt(process.cwd(
|
|
|
120
121
|
SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
|
|
121
122
|
SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
|
|
122
123
|
FROM memories WHERE status = 'active'
|
|
123
|
-
`).get();n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:T(n),metrics:n}}function
|
|
124
|
-
`)}async function
|
|
125
|
-
`)}var
|
|
124
|
+
`).get();n.push({key:"memory_sources_7d",value:Object.fromEntries(i.map(c=>[c.source,Number(c.count)])),ok:!0,severity:"info"}),n.push({key:"memory_access_distribution",value:{neverAccessed:Number(a?.never_accessed??0),accessed:Number(a?.accessed??0)},ok:!0,severity:"info"});}}catch(s){n.push({key:"memory_quality_read",value:s.message,target:"readable memory database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Memory quality",status:T(n),metrics:n}}function ll(e,t){let n=[],o=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(o))return n.push({key:"knowledge_db",value:"missing",target:o,ok:false,severity:"warning"}),{name:"Knowledge quality",status:T(n),metrics:n};let r;try{if(r=V(o,t),!W(r,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let s=r.prepare("SELECT length(content) length FROM knowledge_chunks ORDER BY length(content)").all().map(u=>Number(u.length)),i=Math.max(0,Math.ceil(s.length*.95)-1),a=s.length===0?0:s[i];n.push({key:"knowledge_chunk_length_p95",value:a,target:"<= 3000",ok:a<=3e3,severity:"warning"});let c=r.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),l=/tokenize\s*=\s*['\"]?trigram/i.test(c?.sql??"");n.push({key:"knowledge_fts_tokenizer",value:l?"trigram":"missing/non-trigram",target:"trigram",ok:l,severity:"warning"});}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{r?.close();}return {name:"Knowledge quality",status:T(n),metrics:n}}function ul(e){let{manifest:t,metrics:n}=wt(e),o=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:o,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&o.length===4,severity:"error"}),n.push({key:"contract_test_files",value:t?.contract?.tests?.length??0,target:4,ok:t?.contract?.tests?.length===4,severity:"warning"}),{name:"Contract",status:T(n),metrics:n}}function dl(e){let{manifest:t,metrics:n}=wt(e),o=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:o??"missing",target:0,ok:t?.deadcode?.status==="green"&&o===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:T(n),metrics:n}}function gl(e){let{manifest:t,metrics:n}=wt(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:T(n),metrics:n}}async function fl(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 ml(e){let{manifest:t,metrics:n}=wt(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 s=`http://127.0.0.1:${e.env?.PORT??process.env.PORT??"13337"}/api/health`;try{let i=await(e.httpGet??fl)(s);n.push({key:"dashboard_server_health",value:{url:s,status:i.status},target:"HTTP 200",ok:i.status===200,severity:"warning"});}catch(i){n.push({key:"dashboard_server_health",value:i.message,target:"HTTP 200",ok:false,severity:"warning"});}return {name:"UI reachability",status:T(n),metrics:n}}async function Rn(e={},t={}){let n=e.project??process.cwd(),o=vn(n),r=ul(t),s=await Za(o.path,t);r.metrics.push(...s.metrics),r.status=T(r.metrics);let i=[Xa(n,t),sc(o.path,t),sl(o.path,t),ic(o.path,t),ac(o.path,!!e.strict,t),al(o.path,t),cl(o.path,t),ll(o.path,t),r,dl(t),uc(t),gl(t),lc(t),await ml(t),gc(t)],a=e.strict&&i.some(c=>c.status!=="green")?1:0;return {schemaVersion:DOCTOR_SCHEMA_VERSION,sections:i,exitCode:a}}function pl(e,t={}){return e===void 0?jr():Rn(e,t)}function yr(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function Nr(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: ${yr(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${yr(s.value)}${i}`);}}return t.join(`
|
|
125
|
+
`)}async function hl(e={},t={stdout:o=>console.log(o),stderr:o=>console.error(o)},n={}){let o=await Rn(e,n);return t.stdout(e.json?JSON.stringify(o):Nr(o)),o.exitCode}async function kt(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function jr(e=process.cwd()){let{codegraph:t,graph:n,memory:o,knowledge:r,workflow:s,data:i}=await kt(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 m=await ze(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),u&&(p+=15),g>0&&(p+=10),l>0&&(p+=5),m.running&&(p+=10),f.total>0&&(p+=5),{index:{totalFiles:a.fileCount,totalSymbols:a.nodeCount,indexing:t.isIndexing()},graph:{nodes:c.nodes.length,edges:c.edges.length},memory:{projectReady:u,userPrefs:d},knowledge:{sources:g},plugins:{installed:0,names:[]},workflows:{registered:l},server:{running:m.running},toolCalls:f,readyScore:p}}async function yl(){let{data:e}=await kt(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 vl(){let{data:e}=await kt(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 wl(e){let{data:t}=await kt(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 kl(){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 dt,ec,Sr,rc,Oe,cc,rr,fc,mc,Cr,gt,Pn,Rr,Dr,pc,hc,yc,ir,Ac,lr,ur,dr,gr,xc,Oc,Tc,Nc,jc,fr,Mc,Uc,Hc,Lr=E(()=>{Ne();le();tn();ec={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"],sessions:["created_at","id","project_root","status"]},Sr=3600*1e3;rc=new Set(["pending","committed","expired"]);Oe=1440*60*1e3,cc=30*Oe,rr=60*1024*1024;fc=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,mc=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,Cr=64,gt=1024*1024,Pn=8,Rr=8,Dr=64*1024;pc=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),hc=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),yc=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;ir=[".cjs",".js",".mjs",".ts",".tsx"];Ac=new Set(["bash","node","python","python3","sh","tsx","zsh"]);lr=new Set(["-r","--require"]),ur=new Set(["--experimental-loader","--import","--loader"]),dr=new Set(["-e","--eval","-p","--print"]),gr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),xc=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Oc=new Set(["--check","-c"]),Tc=new Set(["--help","--version","-h","-v"]);Nc=new Set(["-e","-eu","-o","-u","-ue"]),jc=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),fr=new Set(["-W","-X","--check-hash-based-pycs"]),Mc=new Set(["--help","--version","-h","-V"]);Uc=new Set(["builtin","command","env","exec","nohup","timeout"]),Hc=new Set([":","[","echo","false","printf","pwd","test","true"]);});var Fr={};A(Fr,{runMemoryMaintainCommand:()=>Pl});function _l(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 Pl(e){let t=await runMemoryMaintenance({projectRoot:e.projectRoot,actions:_l(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(`
|
|
126
|
+
`)}var Ur=E(()=>{});var Hr={};A(Hr,{generateToken:()=>Dl});async function Dl(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 Wr=E(()=>{});var Dn={};A(Dn,{reportBenchmarkCommand:()=>Ol,runBenchmarkCommand:()=>xl});async function xl(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}
|
|
126
127
|
|
|
127
|
-
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function
|
|
128
|
+
Stored: ${getGlobalDevFlowDbPath()} (${r.runId})`}async function Ol(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=Tl(o,n);return r==="markdown"?`${s}
|
|
128
129
|
## Change From Prior Baseline
|
|
129
130
|
|
|
130
131
|
${i.map(a=>`- ${a}`).join(`
|
|
@@ -133,20 +134,20 @@ ${i.map(a=>`- ${a}`).join(`
|
|
|
133
134
|
|
|
134
135
|
Change from ${o.runId}:
|
|
135
136
|
${i.map(a=>`- ${a}`).join(`
|
|
136
|
-
`)}`}function
|
|
137
|
-
`)}var
|
|
138
|
-
Shutting down...`)),await
|
|
137
|
+
`)}`}function Tl(e,t){let n=e.summary.devflow,o=t.summary.devflow;return [bt("tokensUsed",n.avgTokensUsed,o.avgTokensUsed,false),bt("filesTouched",n.avgFilesTouched,o.avgFilesTouched,false),bt("correctnessScore",n.avgCorrectnessScore,o.avgCorrectnessScore,true),bt("durationMs",n.avgDurationMs,o.avgDurationMs,false)]}function bt(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 En=E(()=>{});var zr={};A(zr,{runReview:()=>Il});async function Il(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(`
|
|
138
|
+
`)}var Vr=E(()=>{});var Jr={};A(Jr,{startAll:()=>jl});async function Nl(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 jl(e){console.log(S.blue("Starting DevFlow server..."));let{pid:t}=await ln({port:e.port});console.log(S.green(` Server started (PID: ${t})`)),console.log(S.blue(" Waiting for server..."));let n=await Nl(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(`
|
|
139
|
+
Shutting down...`)),await qe(),console.log(S.green("Server stopped.")),o());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var Gr=E(()=>{le();});var Zr={};A(Zr,{stopAll:()=>Ml});async function Ml(){let e=await qe();console.log(e?S.green("Server stopped"):S.dim("No DevFlow services running"));}var Qr=E(()=>{le();});var es={};A(es,{showStatus:()=>Bl});function Wl(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 Bl(){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 ze(),t=e.port??ct;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=me(n),r=o.root?Ie(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]:[],...Wl(a)?[`${a} (devflow_* tables)`]:[]];c.length>0?console.log(`Legacy: ${S.yellow(c.join(", "))}`):console.log(`Legacy: ${S.green("none")}`);}var ts=E(()=>{le();Ne();});var rs={};A(rs,{setupCommand:()=>Xl});function Zl(){let e=[resolve$1(dirname$1(Yl.resolve("../../package.json")),"dist","plugin"),resolve$1(process.cwd(),"plugins","claude-code")];for(let t of e)if(existsSync(join(t,".claude-plugin","plugin.json")))return t;return null}function Ql(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let o={...n,...t};writeFileSync(e,JSON.stringify(o,null,2));}async function Xl(e){if(console.log(S.blue("DevFlow Setup")),console.log(S.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await zt({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(S.green(` \u2713 MCP: ${n}`));}catch(t){console.log(S.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(S.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=Zl();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let o=join(n,"known_marketplaces.json");Ql(o,{devflow:{source:{directory:t}}}),console.log(S.green(` \u2713 Plugin registered: ${t}`));}else console.log(S.yellow(" \u26A0 Plugin directory not found")),console.log(S.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(S.green("Setup complete!")),console.log(S.dim("Restart Claude Code to use /devflow:* commands"));}var Yl,ss=E(()=>{Vt();Yl=createRequire(import.meta.url);});var is={};A(is,{pluginListCommand:()=>tu});var tu,as=E(()=>{ot();tu=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=De();if(e.installed){let n=Qn();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
139
140
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
140
141
|
`),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}):
|
|
141
142
|
`);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(`
|
|
142
|
-
Install a plugin: devflow plugin install <name>`);}});});var
|
|
143
|
+
Install a plugin: devflow plugin install <name>`);}});});var cs={};A(cs,{pluginSearchCommand:()=>ru});var ru,ls=E(()=>{ot();ru=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=De(),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(`
|
|
143
144
|
Try: devflow plugin list`);return}console.log(`Found ${o.length} plugin(s) matching "${e}":
|
|
144
|
-
`),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
|
|
145
|
-
${S.green("\u2713")} ${
|
|
146
|
-
Run "devflow plugin list --installed" to verify.`);}catch(
|
|
147
|
-
${S.red("\u2717")} Installation failed: ${
|
|
148
|
-
${S.green("\u2713")} ${
|
|
149
|
-
${S.red("\u2717")} Uninstallation failed: ${
|
|
150
|
-
`));}let n=
|
|
145
|
+
`),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 ds={};A(ds,{pluginInstallCommand:()=>iu});var iu,gs=E(()=>{ae();iu=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 he(n,process.cwd(),!0);console.log(`
|
|
146
|
+
${S.green("\u2713")} ${n}@${o.version} installed and activated`),console.log(`
|
|
147
|
+
Run "devflow plugin list --installed" to verify.`);}catch(o){console.error(`
|
|
148
|
+
${S.red("\u2717")} Installation failed: ${o.message}`),process.exitCode=1;}});});var ms={};A(ms,{pluginUninstallCommand:()=>cu});var cu,ps=E(()=>{ae();cu=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 Tt(n,process.cwd(),!0),console.log(`
|
|
149
|
+
${S.green("\u2713")} ${n} deactivated and uninstalled`);}catch(o){console.error(`
|
|
150
|
+
${S.red("\u2717")} Uninstallation failed: ${o.message}`),process.exitCode=1;}});});function Pt(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 ys=createRequire(import.meta.url),On="0.0.0";try{On=ys("../package.json").version;}catch{try{On=ys("../../package.json").version;}catch{}}var C=new Command;C.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(On).option("--local","Force local engine, skip server");C.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=uu.join(t,a);hs.existsSync(c)&&(console.log(S.dim(` Removing ${a}/...`)),hs.rmSync(c,{recursive:true,force:true}));}console.log(S.green(`\u2705 Existing directories removed
|
|
151
|
+
`));}let n=Pt(t);console.error(S.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:o,renderInitReport:r}=await Promise.resolve().then(()=>(Gn(),Jn)),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(()=>(Zn(),Yn)),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(()=>(Nt(),It));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(Nt(),It));await i(t);}}});C.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(()=>(Ro(),Co));t(e,{},{log:o=>console.log(o),error:o=>console.error(S.red(o))})||(process.exitCode=1);});var gu=C.command("db").description("Manage DevFlow databases");gu.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(()=>(jo(),No)),o=t(e);for(let r of n(o))console.log(r);});C.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=Pt(n);console.log(S.blue(`DevFlow connect \u2014 mode: ${o}`));let{connectAgent:r,getAvailableAgents:s}=await Promise.resolve().then(()=>(Vt(),Mo));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);}});C.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(()=>(Uo(),Fo)),o=e.backfillVectors?await n(C.opts().local):await t(C.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)"));});C.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(Wo(),Ho)),o=await n({target:e,depth:parseInt(t.depth,10),skipServer:C.opts().local});console.log(S.blue("Dependency Graph")),console.log(` Nodes: ${o.nodes.length}`),console.log(` Edges: ${o.edges.length}`);});C.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(()=>(Gt(),Jt)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:C.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(()=>(Gt(),Jt)),o=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:C.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 _t=C.command("workflow").description("Workflow management");_t.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(Be(),We)),t=await e(C.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)`);});_t.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(Be(),We)),o=await n(e,{input:t??""},C.opts().local);console.log(`Run: ${o.runId}`),console.log(`Status: ${o.status}`),console.log(`Duration: ${o.duration}ms`);});_t.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(Be(),We)),t=await e(C.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});_t.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(Be(),We)),t=await e(C.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 _e=C.command("memory").description("Memory management");_e.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ve(),ye)),n=await t(C.opts().local,e.source);console.log(JSON.stringify(n,null,2));});_e.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ve(),ye));console.log(JSON.stringify(await t(C.opts().local,e.source),null,2));});_e.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(()=>(ve(),ye)),o=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:C.opts().local});console.log(JSON.stringify(o,null,2));});_e.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(ve(),ye));await n(e,t,C.opts().local),console.log(S.green(`Memory set: ${e} = ${t}`));});_e.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(ve(),ye)),t=await e(C.opts().local);console.log(JSON.stringify(t,null,2));});_e.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(()=>(ve(),ye)),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`));});C.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(Vo(),zo)),o=(await t(e,void 0,void 0,C.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 Tn=C.command("docs").description("Documentation index management");Tn.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(`
|
|
151
152
|
${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(`
|
|
152
|
-
All docs synced.`));}});_n.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(()=>(Vt(),zt)),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`));});_n.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(()=>(Vt(),zt));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 wt=R.command("skill").description("Plugin/Skill management");wt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Le(),je)),t=await e(R.opts().local);if(t.length===0){console.log(S.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${S.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});wt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Le(),je)),n=await t(e,R.opts().local);if(console.log(S.blue(`Search: "${e}"`)),n.length===0){console.log(S.dim(" No matching plugins found."));return}for(let o of n)console.log(` ${S.green(o.name)} @ ${o.version} \u2014 ${o.description}`);});wt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Le(),je)),n=await t(e,process.cwd(),R.opts().local);console.log(S.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});wt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Le(),je));await t(e,process.cwd(),R.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});R.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:o,runDoctorViolations:r,runDoctorReceipts:s}=await Promise.resolve().then(()=>(br(),kr));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;});ke.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(()=>(_r(),Sr));console.log(await t({projectRoot:e.project,actions:e.actions,apply:e.apply,json:e.json,batchSize:Number(e.batchSize)}));}catch(t){console.error(S.red(`Memory maintenance failed: ${t.message}`)),process.exitCode=1;}});R.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(Rr(),Pr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ts=R.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ts.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(),yn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});ts.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(),yn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});R.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(Ar(),$r)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var Pn=R.command("server").description("Manage DevFlow server");Pn.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(()=>(ce(),rt)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});Pn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ce(),rt)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});Pn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ce(),rt)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});R.command("dashboard").description("Open DevFlow Dashboard").action(()=>{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: http://localhost:13337"));});R.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(Or(),xr));await t({port:parseInt(e.port,10),background:!!e.background});});R.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Ir(),Nr));await e();});R.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(Lr(),jr));await e();});R.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(Hr(),Wr));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var yt=R.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:o}]=await Promise.all([Promise.resolve().then(()=>(Kr(),Br)),Promise.resolve().then(()=>(zr(),qr)),Promise.resolve().then(()=>(Jr(),Gr)),Promise.resolve().then(()=>(Qr(),Zr))]);yt.addCommand(e),yt.addCommand(t),yt.addCommand(n),yt.addCommand(o);}await R.parseAsync();
|
|
153
|
+
All docs synced.`));}});Tn.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(()=>(en(),Xt)),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`));});Tn.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(()=>(en(),Xt));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 Qe=C.command("skill").description("Plugin/Skill management");Qe.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(ae(),Me)),t=await e(C.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}`);});Qe.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(ae(),Me)),n=await t(e,C.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}`);});Qe.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(ae(),Me)),n=await t(e,process.cwd(),C.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);}});Qe.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(ae(),Me));await t(e,process.cwd(),C.opts().local),console.log(S.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(S.red(`Error: ${t.message}`)),process.exit(1);}});Qe.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(()=>(tn(),Yo));process.exitCode=t(e);});var vs=C.command("mcp").description("Inspect MCP configuration and health");vs.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(()=>(on(),nn));await t(e);});vs.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(()=>(on(),nn));await t(e);});C.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(()=>(Lr(),Mr));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;});_e.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(()=>(Ur(),Fr));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;}});C.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(()=>(Wr(),Hr)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var ws=C.command("benchmark").description("Run and inspect reproducible A/B benchmarks");ws.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(()=>(En(),Dn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});ws.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(()=>(En(),Dn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});C.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(()=>(Vr(),zr)),o=await n({prUrl:e,agent:t.agent});console.log(o);});var In=C.command("server").description("Manage DevFlow server");In.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(()=>(le(),lt)),n=await t({port:parseInt(e.port,10)});console.log(S.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});In.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(le(),lt)),t=await e();console.log(t?S.green("Server stopped"):S.dim("No server running"));});In.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(le(),lt)),t=await e();t.running?console.log(S.green(`Running (pid: ${t.pid})`)):console.log(S.yellow("Not running"));});C.command("dashboard").description("Open DevFlow Dashboard").action(()=>{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: http://localhost:13337"));});C.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(()=>(Gr(),Jr));await t({port:parseInt(e.port,10),background:!!e.background});});C.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(Qr(),Zr));await e();});C.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(ts(),es));await e();});C.command("setup").description("Configure Claude Code integration (MCP + plugin)").option("--agent <agent>","Target agent (claude/cursor/cline)").option("--skip-mcp","Skip MCP configuration").option("--skip-plugin","Skip plugin registration").action(async e=>{let{setupCommand:t}=await Promise.resolve().then(()=>(ss(),rs));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var St=C.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(()=>(as(),is)),Promise.resolve().then(()=>(ls(),cs)),Promise.resolve().then(()=>(gs(),ds)),Promise.resolve().then(()=>(ps(),ms))]);St.addCommand(e),St.addCommand(t),St.addCommand(n),St.addCommand(o);}await C.parseAsync();
|