@devflow-tools/devflow 0.16.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +56 -52
- 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/plugin/CLAUDE.md +34 -0
- package/dist/plugin/dist/command-registry.json +297 -0
- package/dist/plugin/dist/skills/devflow:animation/SKILL.md +63 -0
- package/dist/plugin/dist/skills/devflow:context/SKILL.md +90 -0
- package/dist/plugin/dist/skills/devflow:css/SKILL.md +63 -0
- package/dist/plugin/dist/skills/devflow:docker/SKILL.md +67 -0
- package/dist/plugin/dist/skills/devflow:electron/SKILL.md +67 -0
- package/dist/plugin/dist/skills/devflow:git/SKILL.md +67 -0
- package/dist/plugin/dist/skills/devflow:graph/SKILL.md +80 -0
- package/dist/plugin/dist/skills/devflow:graphql/SKILL.md +66 -0
- package/dist/plugin/dist/skills/devflow:knowledge/SKILL.md +80 -0
- package/dist/plugin/dist/skills/devflow:memory/SKILL.md +79 -0
- package/dist/plugin/dist/skills/devflow:nest/SKILL.md +68 -0
- package/dist/plugin/dist/skills/devflow:nextjs/SKILL.md +65 -0
- package/dist/plugin/dist/skills/devflow:performance/SKILL.md +67 -0
- package/dist/plugin/dist/skills/devflow:react/SKILL.md +83 -0
- package/dist/plugin/dist/skills/devflow:tailwind/SKILL.md +65 -0
- package/dist/plugin/dist/skills/devflow:taro/SKILL.md +66 -0
- package/dist/plugin/dist/skills/devflow:ui-layout/SKILL.md +63 -0
- package/dist/plugin/dist/skills/devflow:vue/SKILL.md +72 -0
- package/dist/plugin/dist/skills/devflow:workflow/SKILL.md +80 -0
- package/dist/plugin/hooks/constitution.md +20 -0
- package/dist/plugin/hooks/post-tool-use +20 -0
- package/dist/plugin/hooks/post-tool-use-failure +19 -0
- package/dist/plugin/hooks/pre-compact +19 -0
- package/dist/plugin/hooks/pre-tool-use +23 -0
- package/dist/plugin/hooks/session-end +19 -0
- package/dist/plugin/hooks/session-start +259 -0
- package/dist/plugin/hooks/stop +26 -0
- package/dist/plugin/hooks/user-prompt-submit +19 -0
- package/dist/plugin/package.json +44 -0
- package/package.json +12 -12
- package/plugin-registry.json +29 -29
- /package/dist/dashboard/_next/static/{n_2t1_63toasXsidAssD9 → PV20UFAxDva62WLq6zWVa}/_buildManifest.js +0 -0
- /package/dist/dashboard/_next/static/{n_2t1_63toasXsidAssD9 → PV20UFAxDva62WLq6zWVa}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,cpSync,writeFileSync as writeFileSync$1,rmSync,statSync as statSync$1,realpathSync,lstatSync,mkdtempSync,rmdirSync,readdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';import {join as join$1,resolve,basename,dirname,relative,sep,isAbsolute,extname}from'node:path';import {execFileSync,spawnSync}from'node:child_process';import
|
|
3
|
-
`)
|
|
2
|
+
import {existsSync as existsSync$1,mkdirSync as mkdirSync$1,renameSync,readFileSync as readFileSync$1,cpSync,writeFileSync as writeFileSync$1,rmSync,statSync as statSync$1,realpathSync,lstatSync,mkdtempSync,rmdirSync,readdirSync,openSync,constants,fstatSync,readSync,closeSync}from'node:fs';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 Mo,{existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,statSync,rmSync as rmSync$1}from'fs';import ol,{join,dirname as dirname$1,resolve as resolve$1}from'path';import {homedir}from'os';import {createRequire}from'module';import _n from'@colbymchenry/codegraph';import {createEngines,OnboardingPackBuilder,getProjectContextResult,getMemoryResult,getKnowledgeResult}from'@devflow-tools/context-engine';import {checkbox}from'@inquirer/prompts';import {MemoryGate,EmbeddingProvider}from'@devflow-tools/memory-engine';import {loadPlugins,DEVFLOW_SCHEMA_SQL,DEVFLOW_TABLE_NAMES,getLocalHmacSecret,DevFlowApiClient}from'@devflow-tools/sdk';import {execSync,spawn}from'child_process';import {fileURLToPath as fileURLToPath$1}from'url';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 k from'chalk';import hi from'node:readline';import {KnowledgeEngine}from'@devflow-tools/knowledge-engine';import {createHash,createHmac}from'node:crypto';import {homedir as homedir$1}from'node:os';import {getBenchmarkSuite,BenchmarkEngine,renderBenchmarkReport}from'@devflow-tools/benchmark';import {Command}from'commander';var Wo=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var x=(e,t)=>{for(var n in t)Wo(e,n,{get:t[n],enumerable:true});};function hn(){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 yn(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=Z(t.enabledPlugins)?t.enabledPlugins:{};n[Le]=true,t.enabledPlugins=n;let r=join$1(dirname(e),"plugins","marketplaces",fe),o=Z(t.extraKnownMarketplaces)?t.extraKnownMarketplaces:{};o[fe]={source:{source:"directory",path:r}},t.extraKnownMarketplaces=o,writeFileSync$1(e,`${JSON.stringify(t,null,2)}
|
|
3
|
+
`);}function wn(e,t){let n=join$1(e,".claude"),r=join$1(n,"mcp.json"),o={};if(existsSync$1(r))try{o=JSON.parse(readFileSync$1(r,"utf-8"));}catch{console.warn("Warning: Could not parse existing mcp.json, skipping MCP config");return}else mkdirSync$1(n,{recursive:true});let s=o.mcpServers??{};s.devflow||(s.devflow={command:t,args:[],env:{}},o.mcpServers=s,writeFileSync$1(r,JSON.stringify(o,null,2)));}function vn(e,t,n,r){let o=join$1(t,fe,pn,n);mkdirSync$1(o,{recursive:true});let s=join$1(e,"hooks");existsSync$1(s)&&ke(s,join$1(o,"hooks"));for(let u of ["hooks.json","CLAUDE.md","package.json"]){let l=join$1(e,u);existsSync$1(l)&&cpSync(l,join$1(o,u),{force:true});}let i=join$1(e,".claude-plugin","plugin.json");existsSync$1(i)&&(mkdirSync$1(join$1(o,".claude-plugin"),{recursive:true}),cpSync(i,join$1(o,".claude-plugin","plugin.json"),{force:true}));let a=join$1(e,"dist");existsSync$1(a)&&ke(a,join$1(o,"dist"));let c=join$1(e,"skills");if(existsSync$1(c)&&ke(c,join$1(o,"skills")),Yo(o,e),r){let u=join$1(e,"dist","skills");existsSync$1(u)&&ke(u,r);}Zo(o),Jo(t,o),Vo(t,o,n);}function Jo(e,t){let n=join$1(e,".."),r=join$1(n,"marketplaces",fe),o=join$1(r,".claude-plugin");mkdirSync$1(o,{recursive:true});let s=relative(r,t).replaceAll("\\","/");s.startsWith(".")||(s=`./${s}`),writeFileSync$1(join$1(o,"marketplace.json"),`${JSON.stringify({name:fe,description:"DevFlow local Claude Code plugin",owner:{name:"DevFlow"},plugins:[{name:pn,source:s}]},null,2)}
|
|
4
|
+
`);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(!Z(c))throw new Error(`Invalid Claude marketplace registry: ${i}`);a=c;}a[fe]={source:{source:"directory",path:r},installLocation:r,lastUpdated:new Date().toISOString()},writeFileSync$1(i,`${JSON.stringify(a,null,2)}
|
|
5
|
+
`);}function Vo(e,t,n){let r=join$1(e,"..","installed_plugins.json"),o={version:2,plugins:{}};if(existsSync$1(r)){let g;try{g=JSON.parse(readFileSync$1(r,"utf-8"));}catch{throw new Error(`Could not parse Claude plugin registry: ${r}`)}if(!Z(g))throw new Error(`Invalid Claude plugin registry: ${r}`);o=g;}else mkdirSync$1(dirname(r),{recursive:true});let s=o.plugins;if(s!==void 0&&!Z(s))throw new Error(`Invalid Claude plugin registry plugins: ${r}`);let i=s??{},a=i[Le];if(a!==void 0&&!Array.isArray(a))throw new Error(`Invalid Claude plugin registration for ${Le}`);let c=a??[],u=c.find(g=>Z(g)&&g.scope==="user"),l=new Date().toISOString(),d=Z(u)&&typeof u.installedAt=="string"?u.installedAt:l,f=c.filter(g=>!Z(g)||g.scope!=="user");i[Le]=[...f,{scope:"user",installPath:t,version:n,installedAt:d,lastUpdated:l}],o.version=2,o.plugins=i,writeFileSync$1(r,`${JSON.stringify(o,null,2)}
|
|
6
|
+
`);}function Z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Yo(e,t){let n=join$1(e,"package.json");if(!existsSync$1(n))return;let r=JSON.parse(readFileSync$1(n,"utf-8")),o=Object.keys(r.dependencies??{});if(o.length===0)return;let s={...process.env};delete s.npm_config_allow_scripts,delete s.NPM_CONFIG_ALLOW_SCRIPTS;let i=o.filter(u=>u.startsWith("@devflow-tools/")),a=i.map(u=>join$1(t,"../../packages",u.slice(15))).filter(u=>existsSync$1(join$1(u,"package.json"))),c=["install","--omit=dev","--no-audit","--no-fund","--package-lock=false"];if(i.length>0&&a.length===i.length){c.push("--no-save","--install-links",...a);for(let u of i)rmSync(join$1(e,"node_modules",...u.split("/")),{recursive:true,force:true});}execFileSync("npm",c,{cwd:e,env:s,stdio:"inherit",timeout:1800*1e3});}function ke(e,t){mkdirSync$1(t,{recursive:true});for(let n of readdirSync(e)){let r=join$1(e,n),o=join$1(t,n);statSync$1(r).isDirectory()?ke(r,o):cpSync(r,o,{force:true});}}function Zo(e){let t=join$1(e,"..");if(!existsSync$1(t))return;let n=e.split("/").pop()??"";for(let r of readdirSync(t))if(r!==n){let o=join$1(t,r);statSync$1(o).isDirectory()&&rmSync(o,{recursive:true,force:true});}}var Le,fe,pn,kn=E(()=>{Le="devflow@devflow-local",fe="devflow-local",pn="devflow";});var Dn={};x(Dn,{initProject:()=>os,renderInitReport:()=>Rn});async function os(e,t={}){let n=join(e,".devflow"),r=[];existsSync(n)||(mkdirSync(n,{recursive:true}),r.push(".devflow/"));let o=join(n,"config.json");(!existsSync(o)||t.force)&&(writeFileSync(o,JSON.stringify({version:"0.1.0",initialized:new Date().toISOString()},null,2),"utf-8"),r.push(".devflow/config.json"));let s={created:r,pluginDeployed:false,pluginEnabled:false,mcpConfigured:false};if(Pn.isInitialized(e)||await Pn.init(e,{index:t.scan!==false}),t.scan!==false)try{let{indexer:i,graph:a}=await createEngines(e),{files:c,symbols:u,imports:l}=await i.indexAll(e),d=await a.build(u,l);s.indexed={files:c.length,symbols:u.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);r.push(".devflow/onboarding-pack.json");let a=join(n,"init-report.md");writeFileSync(a,Rn(i),"utf-8"),r.push(".devflow/init-report.md"),s.onboardingPack=i;}catch(i){console.warn(`Warning: Onboarding pack generation skipped \u2014 ${i.message}`);}try{let i=hn(),a=homedir(),c=join(a,".claude","plugins","cache"),u=join(a,".claude","skills"),l=join(i,"package.json"),d=existsSync(l)?JSON.parse(readFileSync(l,"utf-8")).version:"0.0.0";vn(i,c,d,u),s.pluginDeployed=!0;}catch(i){console.warn(`Warning: Plugin deployment skipped \u2014 ${i.message}`);}try{let i=homedir(),a=join(i,".claude","settings.json");yn(a),s.pluginEnabled=!0;}catch(i){console.warn(`Warning: Plugin enablement skipped \u2014 ${i.message}`);}try{let i;try{i=rs.resolve("@devflow-tools/mcp-server/bin/devflow-mcp.cjs");}catch{i="devflow-mcp";}wn(e,i),s.mcpConfigured=!0;}catch(i){console.warn(`Warning: MCP config skipped \u2014 ${i.message}`);}return s}function Rn(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(`
|
|
7
|
+
`)}var Pn,rs,Cn=E(()=>{kn();Pn=_n.default??_n,rs=createRequire(import.meta.url);});var En={};x(En,{reviewPluginMemoryHints:()=>cs});async function cs(e,t,n={}){let r=n.isTTY??!!process.stdout.isTTY,o=new Set(t.split(",").map(ls).filter(Boolean));if(!r||o.size===0)return {available:0,selected:0};let s=await(n.load??loadPlugins)(),i=[];for(let l of o){let d=s.get(l);for(let f of d?.memory?.project?.conventions??[])i.push({id:`${l}:${f.key}`,pluginName:l,convention:f});}if(i.length===0)return {available:0,selected:0};let a=i.map(l=>({name:`${l.pluginName}: ${l.convention.value}`,value:l.id,checked:false})),c=await(n.select??(l=>checkbox({message:"Select optional plugin memory hints to save",choices:l})))(a),u=i.filter(l=>c.includes(l.id));return u.length>0&&await(n.write??us)(e,u),{available:i.length,selected:u.length}}function ls(e){return e.trim().replace(/^@devflow-tools\/plugin-/,"").replace(/^plugin-/,"").replace(/^devflow:/,"")}async function us(e,t){let n=new MemoryGate(e);try{for(let r of t)await n.addMemory({category:"project_knowledge",content:`${r.convention.key}: ${r.convention.value}`,originalText:r.convention.value,source:"manual",confidence:r.convention.confidence,scope:`plugin:${r.pluginName}`});}finally{n.close();}}var $n=E(()=>{});function ge(){let e=[join(process.cwd(),"plugin-registry.json"),join(hs,"../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 xn(){try{let e=execSync("npm list -g --depth=0 --json",{encoding:"utf-8"}),t=JSON.parse(e);return Object.keys(t.dependencies||{}).filter(n=>n.startsWith("@devflow-tools/plugin-"))}catch{return []}}var ps,hs,Ue=E(()=>{ps=fileURLToPath$1(import.meta.url),hs=dirname$1(ps);});var pt={};x(pt,{detectTechStack:()=>An,guidePluginInstallation:()=>bs,installPluginsFromList:()=>ks,resolvePluginName:()=>On});function An(e){let t=[];try{let n=JSON.parse(readFileSync(join(e,"package.json"),"utf-8")),r={...n.dependencies??{},...n.devDependencies??{}};r.react&&t.push("react"),r.next&&t.push("nextjs"),r.vue&&t.push("vue"),r.tailwindcss&&t.push("tailwind"),(r.nest||r["@nestjs/core"])&&t.push("nest"),r.express&&t.push("express"),r.typescript&&t.push("typescript");}catch{}return t}function On(e){let t=e.trim();return t.startsWith("@devflow-tools/")?t:`@devflow-tools/${t}`}async function ks(e){let t=e.split(",").map(On).filter(Boolean);if(t.length!==0)for(let n of t){console.log(`Installing ${n}...`);try{execSync(`npm install -g ${n}`,{stdio:"inherit"}),console.log(`\u2713 ${n}`);}catch{console.error(`\u2717 Failed to install ${n}`);}}}async function bs(e){let t=ge();if(t.plugins.length===0)return console.log(`
|
|
4
8
|
No plugins available. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
5
9
|
`),[];console.log(`
|
|
6
10
|
\u{1F50C} Plugin Installation Guide
|
|
7
|
-
`);let n=
|
|
8
|
-
`);let
|
|
9
|
-
`);let i=[...
|
|
11
|
+
`);let n=An(e);n.length>0&&console.log(`Detected tech stack: ${n.join(", ")}
|
|
12
|
+
`);let r=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...
|
|
13
|
+
`);let i=[...r];for(let a of i)try{execSync(`npm install -g ${a}`,{stdio:"inherit"}),console.log(`\u2713 ${a}`);}catch{console.error(`\u2717 Failed to install ${a}`);}return i}let o=t.plugins.map(i=>({name:`${i.name.replace("@devflow-tools/","")} - ${i.description.substring(0,50)}`,value:i.name,checked:r.has(i.name)})),s;try{s=await checkbox({message:"Select plugins to install (space to select, enter to confirm):",choices:o});}catch{return console.log(`
|
|
10
14
|
Plugin installation cancelled.
|
|
11
15
|
`),[]}if(s.length>0){console.log(`
|
|
12
16
|
Installing selected plugins...
|
|
@@ -14,19 +18,19 @@ Installing selected plugins...
|
|
|
14
18
|
`);}catch{console.error(`\u2717 Failed to install ${i}
|
|
15
19
|
`);}}else console.log(`
|
|
16
20
|
Skipping plugin installation. You can install plugins later with:`),console.log(" devflow plugin list"),console.log(` devflow plugin install <name>
|
|
17
|
-
`);return s}var
|
|
21
|
+
`);return s}var ht=E(()=>{Ue();});var Hn={};x(Hn,{ResetExecutionError:()=>_e,executeResetCommand:()=>Hs,formatResetResult:()=>bt,runReset:()=>Bn});function Ns(){if(We)return We;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return We=e.DatabaseSync,We}catch{throw new Error("DevFlow reset requires Node.js >=22.13.0 to back up SQLite databases (node:sqlite is unavailable).")}}function bt(e){return [...e.backedUp.map(t=>`Backed up: ${t.source} -> ${t.destination}`),...e.removed.map(t=>`Removed: ${t}`)]}function Is(e){return e==="all"||Ln.includes(e)}function B(e){try{return lstatSync(e)}catch(t){if(t.code==="ENOENT")return;throw t}}function wt(e){let t=resolve(e),n=[];for(;!B(t);){let r=dirname(t);if(r===t)throw new Error(`Cannot resolve path: ${e}`);n.unshift(basename(t)),t=r;}return resolve(realpathSync(t),...n)}function St(e,t){let n=relative(e,t);return n===""||!isAbsolute(n)&&n!==".."&&!n.startsWith(`..${sep}`)}function js(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 Fn(e,t){let n=e;for(let r of relative(e,t).split(sep)){n=join$1(n,r);let o=B(n);if(!o)break;if(o.isSymbolicLink())throw new Error(`Refusing to reset a target path containing a symbolic link: ${n}`)}if(B(t)){let r=realpathSync(t);if(!St(e,r))throw new Error(`Refusing to reset a target outside the project: ${t}`)}}function Ms(e,t){return (e==="all"?Ln:[e]).map(r=>({scope:r,path:join$1(t,...Mn[r])}))}function Un(e,t){let n=B(t);if(n)return Fn(e,t),{canonicalPath:realpathSync(t),device:n.dev,inode:n.ino}}function Wn(e,t){let n=Un(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 Ls(e){let t=B(e);if(!t?.isFile()||t.size<yt.length)return false;let n=Buffer.alloc(yt.length),r=openSync(e,"r");try{return readSync(r,n,0,n.length,0)===n.length&&n.equals(yt)}finally{closeSync(r);}}function Fs(e){let t=[];function n(r){let o=lstatSync(r);if(!o.isSymbolicLink()){if(o.isDirectory()){for(let s of readdirSync(r).sort())n(join$1(r,s));return}Ls(r)&&t.push(r);}}return n(e),t}function Us(e,t){mkdirSync$1(dirname(t),{recursive:true});let n=new(Ns())(e,{readOnly:true,timeout:1e3});try{n.prepare("VACUUM INTO ?").run(t);}finally{n.close();}}function Ws(e,t,n){let r=Fs(e),o=new Set;for(let s of r)o.add(s),o.add(`${s}-journal`),o.add(`${s}-shm`),o.add(`${s}-wal`);n(),cpSync(e,t,{recursive:true,filter:s=>!o.has(s)});for(let s of r){n();let i=join$1(t,relative(e,s));Us(s,i);}}function Bs(e,t,n,r,o){let s=!!B(t),i,a=[];try{mkdirSync$1(t,{recursive:!0}),i=mkdtempSync(join$1(t,".devflow-reset-"));for(let c of n)o.beforeBackup(c.path),Ws(c.path,join$1(i,c.scope),()=>Wn(e,c));for(let c of n){let u=join$1(i,c.scope),l=join$1(t,c.scope);if(B(l))throw new Error(`Backup destination already exists: ${l}`);o.renamePath(u,l),a.push(l),r.backedUp.push({source:c.path,destination:l});}}catch(c){for(let u of a.reverse())rmSync(u,{recursive:true,force:true});throw new Error(`Failed to prepare reset backup: ${c.message}`)}finally{if(i&&rmSync(i,{recursive:true,force:true}),!s&&B(t))try{rmdirSync(t);}catch{}}}function Bn(e,t={}){if(!Is(e.scope))throw new Error(`Invalid reset scope: ${String(e.scope)}. Expected memory, knowledge, codegraph, or all.`);let n=js(e.project??process.cwd()),r=Ms(e.scope,n);for(let c of r)Fn(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 o=r.flatMap(c=>{let u=Un(n,c.path);return u?[{...c,identity:u}]:[]}),s=e.backupTo?wt(e.backupTo):void 0;if(s){let c=B(s);if(c&&!c.isDirectory())throw new Error(`Backup path must be a directory: ${s}`);for(let u of o){let l=wt(u.path),d=join$1(s,u.scope),f=wt(d);if(St(l,f)||St(f,l))throw new Error(`Backup destination cannot be inside or contain a target being removed: ${f}`);if(B(d))throw new Error(`Backup destination already exists: ${d}`)}}let i={backedUp:[],removed:[]},a={beforeBackup:()=>{},beforeRemoval:()=>{},renamePath:(c,u)=>renameSync(c,u),removePath:c=>rmSync(c,{recursive:true,force:true}),...t};s&&o.length>0&&Bs(n,s,o,i,a);for(let c of o){try{a.beforeRemoval(c.path),Wn(n,c),a.removePath(c.path);}catch(u){let l=u instanceof Error?`: ${u.message}`:"";throw new _e(`Failed to remove reset target: ${c.path}${l}`,i,u)}i.removed.push(c.path);}return i}function Hs(e,t={},n=console){try{let r=Bn(e,t),o=bt(r);for(let s of o)n.log(s);return o.length===0&&n.log("Nothing to reset."),!0}catch(r){if(r instanceof _e)for(let o of bt(r.result))n.log(o);return n.error(`Error: ${r.message}`),false}}var We,_e,Mn,Ln,yt,Kn=E(()=>{_e=class extends Error{constructor(t,n,r){super(t,{cause:r}),this.name="ResetExecutionError",this.result={backedUp:[...n.backedUp],removed:[...n.removed]};}};Mn={memory:[".devflow","memory"],knowledge:[".devflow","knowledge"],codegraph:[".codegraph"]},Ln=Object.keys(Mn),yt=Buffer.from("SQLite format 3\0","binary");});var Xn={};x(Xn,{consolidateDatabases:()=>zs,formatConsolidateResult:()=>Js});function zs(e){let t=resolve(e.project),n=e.globalDbPath??getGlobalDevFlowDbPath(),r=join$1(t,".devflow","devflow.db"),o=join$1(t,".codegraph","codegraph.db");if(resolve(n)===resolve(r))throw new Error("The global target database cannot be the project-local legacy database");let s=existsSync$1(n),i=[Gn("project",r,s?n:void 0),Gn("codegraph",o,s?n:void 0)],a={dryRun:!!e.dryRun,targetPath:n,sources:i,inserted:{},retired:[]};if(e.dryRun)return a;let c=i.filter(g=>g.exists&&Object.keys(g.tables).length>0),u=new Date(e.now??Date.now()).toISOString().replace(/[:.]/g,"-"),l=basename(dirname(n))==="global"?join$1(dirname(dirname(n)),"backup"):join$1(dirname(n),"backup"),d=join$1(e.backupRoot??l,u);mkdirSync$1(d,{recursive:true}),a.backupDir=d;let f=c.some(g=>g.kind==="project")?Vs(r):null;try{let g=new Map;for(let h of c){let v=join$1(d,`${h.kind}-${basename(h.path)}.snapshot`);zn(h.path,v),g.set(h.kind,v);}s&&zn(n,join$1(d,"global-devflow.db.before"));let m=g.has("project")?Zs(r,d):[];a.retired.push(...m.map(h=>h.destination));let p=null,w=!1;try{if(new DevFlowDatabase(t,{dbPath:n}).close(),p=new DatabaseSync(n),p.exec("PRAGMA busy_timeout = 10000"),p.exec(DEVFLOW_SCHEMA_SQL),g.has("project")&&p.prepare("ATTACH DATABASE ? AS project_source").run(g.get("project")),g.has("codegraph")&&p.prepare("ATTACH DATABASE ? AS codegraph_source").run(o),p.exec("BEGIN IMMEDIATE"),w=!0,g.has("project")&&Jn(p,"project_source",void 0,a.inserted),g.has("codegraph")){Jn(p,"codegraph_source",new Set(DEVFLOW_TABLE_NAMES),a.inserted);for(let v of De(p,"codegraph_source").filter(R=>R.startsWith("devflow_")))p.exec(`DROP TABLE codegraph_source.${O(v)}`);}p.exec("COMMIT"),w=!1;}catch(h){if(w)try{p?.exec("ROLLBACK");}catch{}throw Qn(m),h}finally{p?.close();}return a}finally{Ys(f);}}function Js(e){let t=[`${e.dryRun?"Dry run":"Consolidated"} target: ${e.targetPath}`];for(let n of e.sources){let r=Object.values(n.tables).reduce((s,i)=>s+i,0),o=Object.values(n.conflicts).reduce((s,i)=>s+i,0);t.push(`${n.kind}: ${n.exists?`${r} rows, ${o} conflicts`:"not found"} (${n.path})`);}if(!e.dryRun){let n=Object.values(e.inserted).reduce((r,o)=>r+o,0);t.push(`Inserted: ${n} rows`),e.backupDir&&t.push(`Backup: ${e.backupDir}`);}return t}function Gn(e,t,n){let r={kind:e,path:t,exists:existsSync$1(t),tables:{},conflicts:{}};if(!r.exists)return r;let o=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 De(o).filter(c=>!i||i.has(c)))r.tables[a]=Dt(o,a),r.conflicts[a]=s&&De(s).includes(a)?Qs(o,s,a):0;}finally{o.close(),s?.close();}return r}function zn(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 Vs(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 Ys(e){if(e){try{e.exec("ROLLBACK");}catch{}e.close();}}function Zs(e,t){let n=[];try{for(let r of ["","-wal","-shm"]){let o=`${e}${r}`;if(!existsSync$1(o))continue;let s=join$1(t,`project-devflow.db.retired${r}`);renameSync(o,s),n.push({source:o,destination:s});}}catch(r){throw Qn(n),r}return n}function Qn(e){for(let t of e.reverse())existsSync$1(t.destination)&&!existsSync$1(t.source)&&renameSync(t.destination,t.source);}function Jn(e,t,n,r){let o=new Set(De(e)),s=De(e,t).filter(i=>o.has(i)&&(!n||n.has(i)));for(let i of s){let a=He(e,"main",i),c=new Set(He(e,t,i).map(m=>m.name)),u=a.filter(m=>c.has(m.name));if(Rt.has(i)&&(u=u.filter(m=>m.pk===0)),u.length===0)continue;let l=Dt(e,i),d=u.map(m=>O(m.name)).join(", "),f=u.map(m=>`s.${O(m.name)}`).join(", ");if(u.filter(m=>m.pk>0).length>0&&!Rt.has(i))e.exec(`INSERT OR IGNORE INTO main.${O(i)} (${d}) SELECT ${f} FROM ${O(t)}.${O(i)} s`);else {let m=u.map(p=>`t.${O(p.name)} IS s.${O(p.name)}`).join(" AND ");e.exec(`
|
|
18
22
|
INSERT INTO main.${O(i)} (${d})
|
|
19
23
|
SELECT ${f} FROM ${O(t)}.${O(i)} s
|
|
20
24
|
WHERE NOT EXISTS (SELECT 1 FROM main.${O(i)} t WHERE ${m})
|
|
21
|
-
`);}
|
|
22
|
-
[${
|
|
23
|
-
Reviewed ${
|
|
24
|
-
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function
|
|
25
|
-
`),n=t.length>=2?t[1]:t[0],
|
|
26
|
-
${
|
|
25
|
+
`);}r[i]=(r[i]??0)+(Dt(e,i)-l);}}function Qs(e,t,n){let r=new Set(He(t,"main",n).map(u=>u.name)),o=He(e,"main",n).filter(u=>u.pk>0&&r.has(u.name));if(o.length===0||Rt.has(n))return 0;let s=o.map(u=>O(u.name)),i=e.prepare(`SELECT ${s.join(", ")} FROM ${O(n)}`).all(),a=o.map(u=>`${O(u.name)} IS ?`).join(" AND "),c=t.prepare(`SELECT 1 found FROM ${O(n)} WHERE ${a} LIMIT 1`);return i.reduce((u,l)=>u+(c.get(...o.map(d=>l[d.name]))?1:0),0)}function De(e,t="main"){return e.prepare(`SELECT name FROM ${O(t)}.sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`).all().map(r=>r.name)}function He(e,t,n){return e.prepare(`PRAGMA ${O(t)}.table_info(${O(n)})`).all()}function Dt(e,t){let n=e.prepare(`SELECT COUNT(*) count FROM ${O(t)}`).get();return Number(n.count)}function O(e){if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`Unsafe SQLite identifier: ${e}`);return `"${e}"`}var Rt,er=E(()=>{Rt=new Set(["run_steps","telemetry_events","devflow_tool_calls","devflow_audit_chain"]);});var tr={};x(tr,{connectAgent:()=>Ct,getAvailableAgents:()=>ti});async function Ct(e){let t=[],n={command:e.command??"devflow-mcp",args:["--mode","stdio"]},r=e.agent?[e.agent]:await import('@devflow-tools/adapters').then(o=>o.detectAll());for(let o of r){let s=await connect(o,n);t.push(`${o}: ${s.configPath} (${s.written?"written":"skipped"})`);}return t}function ti(){return listAdapters()}var Et=E(()=>{});async function $(e,t,n,r={}){let o=r.serverUrl??ri;if(r.skipServer)return n();let s=false,i=rr.get(o);if(i&&Date.now()-i.ts<oi?s=i.result:(s=await new DevFlowApiClient({baseUrl:o,projectRoot:e}).ping(),rr.set(o,{result:s,ts:Date.now()})),s){let a=new DevFlowApiClient({baseUrl:o,projectRoot:e});return t(a)}return console.error(k.dim(" (server not running, using local engine \u2014 telemetry disabled)")),n()}var ri,rr,oi,X=E(()=>{ri=process.env.DEVFLOW_SERVER_URL??"http://127.0.0.1:13337",rr=new Map,oi=3e4;});var sr={};x(sr,{getIndexStatus:()=>si,refreshIndex:()=>ii});async function si(e){return $(process.cwd(),t=>t.getIndexStatus(),async()=>{let{codegraph:t}=await createEngines(process.cwd()),n=t.getStats();return {totalFiles:n.fileCount,totalSymbols:n.nodeCount,lastIndexTime:n.lastUpdated,indexing:t.isIndexing()}},{skipServer:e})}async function ii(e){return $(process.cwd(),t=>t.triggerIndex(),async()=>{let{indexer:t}=await createEngines(process.cwd());return await t.reconcile(),t.getStatus()},{skipServer:e})}var ir=E(()=>{X();});var ar={};x(ar,{getGraph:()=>ci});async function ci(e={}){let t=e.target??"all",n=e.depth??2;return $(process.cwd(),r=>r.getGraph(t,n),async()=>{let{graph:r}=await createEngines(process.cwd());if(t==="all")return r.export();let o=r.getSubGraph(t,n);return {nodes:o.nodes,edges:o.edges}},{skipServer:e.skipServer})}var cr=E(()=>{X();});var $t={};x($t,{getContext:()=>ui,getTaskContext:()=>di});async function ui(e){return $(process.cwd(),t=>t.buildContext(e.query,e.mode??"fast",e.maxTokens),async()=>{let{context:t}=await createEngines(process.cwd());return t.build({query:e.query,mode:e.mode??"fast",maxTokens:e.maxTokens??8e3})},{skipServer:e.skipServer})}async function di(e){let t=process.cwd(),n={mode:e.mode??"fast",maxTokens:e.maxTokens??8e3};return $(t,r=>r.buildTaskContext(e.query,t,n),async()=>{let{context:r,codegraph:o}=await createEngines(t),s=o.getStats().lastUpdated,i=s>0?Date.now()-s:0;return getProjectContextResult(r,{query:e.query,...n},i)},{skipServer:e.skipServer})}var xt=E(()=>{X();});var Ce={};x(Ce,{getWorkflowRuns:()=>ur,getWorkflowStatus:()=>mi,listWorkflows:()=>fi,runWorkflow:()=>gi});async function fi(e){return $(process.cwd(),t=>t.listWorkflows(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.list()},{skipServer:e})}async function gi(e,t,n){return $(process.cwd(),r=>r.runWorkflow(e,t),async()=>{let{workflow:r}=await createEngines(process.cwd());return r.run(e,t)},{skipServer:n})}async function mi(e){return ur(e)}async function ur(e){return $(process.cwd(),t=>t.getWorkflowRuns(),async()=>{let{workflow:t}=await createEngines(process.cwd());return t.listRuns()},{skipServer:e})}var Ee=E(()=>{X();});var ae={};x(ae,{backfillObservationVectors:()=>bi,queryMemory:()=>wi,reviewCandidates:()=>ki,reviewMemories:()=>_i,setMemory:()=>vi,showMemory:()=>yi});async function yi(e,t){let n=await $(process.cwd(),o=>o.getMemory(t),async()=>{let{memory:o}=await createEngines(process.cwd());return o.getAll()},{skipServer:e});if(!t||!n||typeof n!="object")return n;let r=n;return Array.isArray(r.memories)?{...r,memories:r.memories.filter(o=>o?.source===t)}:n}async function wi(e={}){let t=process.cwd(),{skipServer:n,...r}=e;return $(t,o=>o.queryMemory(r),async()=>{let{memory:o}=await createEngines(t);return getMemoryResult(o,r)},{skipServer:n})}async function vi(e,t,n){return $(process.cwd(),async r=>{await r.setMemory("project",e,t);},async()=>{let{memory:r}=await createEngines(process.cwd());await r.updateUserPreference(e,t);},{skipServer:n})}async function ki(e){return $(process.cwd(),t=>t.reviewCandidates(),async()=>{let{memory:t}=await createEngines(process.cwd());return t.getCandidates()},{skipServer:e})}async function bi(e={}){let{memory:t}=await createEngines(e.projectRoot??process.cwd());return t.backfillObservationVectors({batchSize:e.batchSize,onProgress:e.onProgress})}function Si(e){let t=hi.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,r=>{t.close(),n(r.trim().toLowerCase());});})}async function _i(){let t=await $(process.cwd(),async o=>(await o.getMemory()).memories?.filter(i=>i.status==="pending")??[],async()=>{let{memory:o}=await createEngines(process.cwd());return o.getPendingMemories()},{skipServer:false});if(t.length===0){console.log("No pending memories to review.");return}let n=[...t].sort((o,s)=>o.category==="failure_lesson"&&s.category!=="failure_lesson"?-1:s.category==="failure_lesson"&&o.category!=="failure_lesson"?1:0),r=0;for(let o of n){console.log(`
|
|
26
|
+
[${o.category}] (confidence: ${(o.confidence*100).toFixed(0)}%)`),console.log(` ${o.content}`);let s=await Si(" Approve? [y]es / [n]o / [s]kip: ");s==="y"?(await $(process.cwd(),async i=>{await i.approveMemory(o.id);},async()=>{},{skipServer:false}),console.log(" Approved"),r++):s==="n"?(await $(process.cwd(),async i=>{await i.rejectMemory(o.id);},async()=>{},{skipServer:false}),console.log(" Rejected"),r++):console.log(" -> Skipped");}console.log(`
|
|
27
|
+
Reviewed ${r}/${t.length} pending memories.`);}var ce=E(()=>{X();});var fr={};x(fr,{getDocsStatus:()=>Di,queryKnowledge:()=>dr,searchKnowledge:()=>Ri,syncDocs:()=>Ci});async function dr(e,t,n,r){return $(process.cwd(),o=>o.queryKnowledge(e,{scope:t,budgetTokens:n}),()=>{let o=new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider});return getKnowledgeResult(o,{query:e,scope:t,budgetTokens:n})},{skipServer:r})}async function Ri(e,t,n){return (await dr(e,t,void 0,n)).results}async function Di(e){return $(process.cwd(),t=>t.getKnowledgeSources(),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).getSources(),{skipServer:e})}async function Ci(e,t){return $(process.cwd(),n=>n.syncDocs(e),()=>new KnowledgeEngine({projectRoot:process.cwd(),embedder:new EmbeddingProvider}).syncDocs(e),{skipServer:t})}var gr=E(()=>{X();});var Nt={};x(Nt,{backfillKnowledgeVectors:()=>Ai,resyncKnowledgeDocs:()=>xi});function mr(e){return new KnowledgeEngine({projectRoot:e,embedder:new EmbeddingProvider})}async function xi(e){if(!e.withHeadings)throw new Error("Knowledge resync requires --with-headings");let t=mr(e.projectRoot??process.cwd());try{return await t.syncDocs(e.source,{withHeadings:!0,deferVectorBackfill:!0})}finally{t.close();}}async function Ai(e={}){let t=mr(e.projectRoot??process.cwd());try{return await t.backfillVectors({source:e.source,batchSize:e.batchSize,onProgress:e.onProgress})}finally{t.close();}}var It=E(()=>{});var hr=E(()=>{});var xe={};x(xe,{installSkill:()=>Li,listSkills:()=>vr,listSkillsSync:()=>ji,searchSkills:()=>Mi,uninstallSkill:()=>Fi});async function vr(e){return $(process.cwd(),async t=>(await t.listPlugins()).map(r=>({name:r.name,version:r.version,description:r.description,icon:r.icon,tags:r.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:e})}function ji(){return []}async function Mi(e,t){let n=await vr(t),r=e.toLowerCase();return n.filter(o=>o.name.toLowerCase().includes(r)||o.description.toLowerCase().includes(r)||o.tags.some(s=>s.toLowerCase().includes(r)))}function kr(e){let t=join(e,".devflow","config.json");return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):{plugins:[]}}function br(e,t){let n=join(e,".devflow","config.json");writeFileSync(n,JSON.stringify(t,null,2),"utf-8");}async function Li(e,t=process.cwd(),n){return $(t,async r=>await r.installPlugin(e),async()=>{let r=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`,o=e.replace(/^@devflow-tools\/plugin-/,"");mkdirSync(Ke,{recursive:true});try{execSync(`npm install --prefix "${Ke}" ${r}`,{stdio:"pipe",timeout:6e4});}catch{}let s=kr(t);s.plugins||(s.plugins=[]),s.plugins.includes(o)||(s.plugins.push(o),br(t,s));let i=[];try{i=JSON.parse(readFileSync(join(Ke,"node_modules",r,"package.json"),"utf-8"))?.devflow?.templates??[];}catch{}return {name:o,version:"0.1.0",templates:i}},{skipServer:n})}async function Fi(e,t=process.cwd(),n){return $(t,async r=>{await r.uninstallPlugin(e);},async()=>{let r=e.replace(/^@devflow-tools\/plugin-/,""),o=kr(t);o.plugins&&(o.plugins=o.plugins.filter(i=>i!==r),br(t,o));let s=e.startsWith("@devflow-tools/plugin-")?e:`@devflow-tools/plugin-${e}`;try{let i=join(Ke,"node_modules",s);existsSync(i)&&rmSync$1(i,{recursive:!0,force:!0});}catch{}},{skipServer:n})}var Ke,Ae=E(()=>{X();hr();Ke=join(process.env.HOME??"~",".devflow","skills");});var Ge={};x(Ge,{DEFAULT_SERVER_PORT:()=>qe,readPidFromFile:()=>Ft,readPortFromFile:()=>Rr,serverStatus:()=>Te,startServer:()=>Ut,stopServer:()=>Oe});function Lt(e){let t=join(e,".devflow");return existsSync(t)||mkdirSync(t,{recursive:true}),join(t,"server.pid")}function Ki(){try{return _r.resolve("./server.js")}catch{try{return _r.resolve("@devflow-tools/server/dist/main.js")}catch{return join(process.cwd(),"apps","server","dist","main.js")}}}function Rr(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
28
|
+
`);if(t.length>=2){let n=parseInt(t[0],10);if(!isNaN(n))return n}return null}function Ft(e){if(!existsSync(e))return null;let t=readFileSync(e,"utf-8").trim().split(`
|
|
29
|
+
`),n=t.length>=2?t[1]:t[0],r=parseInt(n,10);return isNaN(r)?null:r}async function Ut(e){let t=Ki(),n=Lt(process.cwd()),r=spawn("node",[t],{env:{...process.env,PORT:String(e.port)},stdio:"ignore",detached:true});return writeFileSync(n,`${e.port}
|
|
30
|
+
${r.pid??0}`),r.unref(),{pid:r.pid??0}}async function Oe(){let e=Lt(process.cwd()),t=Ft(e);if(t===null)return false;try{return process.kill(t),unlinkSync(e),!0}catch{return unlinkSync(e),false}}async function Te(){let e=Lt(process.cwd()),t=Rr(e)??qe,{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:Ft(e)??void 0,port:t}:{running:false,port:t}}var _r,qe,ee=E(()=>{_r=createRequire(import.meta.url);qe=13337;});var so={};x(so,{renderDoctorText:()=>ro,runDoctor:()=>fc,runDoctorAudit:()=>mc,runDoctorAuditFix:()=>pc,runDoctorCommand:()=>gc,runDoctorReceipts:()=>yc,runDoctorViolations:()=>hc,runLegacyDoctorReport:()=>oo,runStructuredDoctor:()=>nn});function Xt(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}function Dr(e){return join$1(homedir$1(),".devflow","daemons",`${Xt(e)}.sock`)}function Yi(){return join$1(homedir$1(),".devflow","daemons.json")}function Kr(){if(Je)return Je;try{let e=createRequire$1(import.meta.url)("node:sqlite");if(typeof e.DatabaseSync!="function")throw new Error("DatabaseSync is unavailable");return Je=e.DatabaseSync,Je}catch{throw new Error("DevFlow doctor requires Node.js >=22.13.0 to inspect SQLite memory data (node:sqlite is unavailable).")}}function A(e){return e.some(t=>!t.ok&&t.severity==="error")?"red":e.some(t=>!t.ok)?"yellow":"green"}function Jt(e){let t=resolve(e);try{return {path:realpathSync.native(t)}}catch(n){return {path:t,error:n.message}}}function Zi(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!==Xt(t.rootPath)&&n.push("projectHash does not match rootPath"),n}function Qi(e,t){let n=Jt(e),r=Xt(n.path),o=Dr(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:r,ok:true,severity:"info"},{key:"daemon_socket_path",value:o,target:`path containing ${r}`,ok:o.includes(r),severity:"error"}],i=t.registryPath??Yi();if(!existsSync$1(i))s.push({key:"daemon_registry",value:"not found",target:"valid JSON when present",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(f=>Zi(f).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 u=a.filter(f=>{if(typeof f!="object"||f===null)return !1;let g=f;return typeof g.rootPath!="string"||g.rootPath.length===0?!1:Jt(g.rootPath).path===n.path});s.push({key:"project_daemon_registrations",value:u.length,ok:!0,severity:"info"});let l=u.map(f=>Dr(f.rootPath));s.push({key:"registered_daemon_socket_paths",value:l,target:[o],ok:!0,severity:"info"});let d=u.filter((f,g)=>f.projectHash!==r||l[g]!==o).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"});}return {name:"Isolation",status:A(s),metrics:s}}function ea(e){let t=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all(),n=new Set(t.map(o=>o.name)),r=[];for(let[o,s]of Object.entries(Xi)){if(!n.has(o)){r.push(o);continue}let i=new Set(e.prepare(`PRAGMA table_info(${o})`).all().map(a=>a.name));for(let a of s)i.has(a)||r.push(`${o}.${a}`);}return r.sort()}function qr(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 ta(e){let t=qr(e);return t&&t.length>0?t:null}function Bt(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 na(e,t){return typeof e=="bigint"?e===BigInt(t):e===t}function Cr(e,t){return typeof e=="bigint"?e>BigInt(Math.trunc(t)):e>t}function oa(e,t){let n=[],r=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(r))return n.push({key:"memories_db",value:"missing",target:`initialize ${r} with devflow init`,ok:false,severity:"error"}),{name:"Distill",status:A(n),metrics:n};n.push({key:"memories_db",value:r,target:"readable memory database",ok:true,severity:"info"});let o=t.openDatabase??(i=>new(Kr())(i,{readOnly:true})),s;try{let i=o(r);s=i;let a=ea(i);if(a.length>0)return n.push({key:"required_schema",value:a,target:[],ok:!1,severity:"error"}),{name:"Distill",status:A(n),metrics:n};let c=(t.now??Date.now)(),u=i.prepare(`
|
|
27
31
|
SELECT batch_id, event_ids, session_ids, event_count, created_at, expires_at, status
|
|
28
32
|
FROM distill_leases
|
|
29
|
-
`);u.setReadBigInts?.(!0);let l=u.all(),d=new Set,f=0,g=0;for(let h of l){let v=
|
|
33
|
+
`);u.setReadBigInts?.(!0);let l=u.all(),d=new Set,f=0,g=0;for(let h of l){let v=ta(h.event_ids),R=qr(h.session_ids),y=Bt(h.event_count),S=Bt(h.created_at),_=Bt(h.expires_at),N=typeof h.status=="string"&&ra.has(h.status)?h.status:null,oe=typeof h.batch_id=="string"&&h.batch_id.trim().length>0,ve=v!==null&&y!==null&&na(y,v.length);if(!oe||!v||!R||!ve||S===null||_===null||N===null){f+=1,h.status==="pending"&&(_===null||Cr(_,c))&&(g+=1);continue}if(!(N!=="pending"||!Cr(_,c)))for(let Uo of v)d.add(Uo);}n.push({key:"malformed_distill_leases",value:f,target:0,ok:f===0,severity:g>0?"error":"warning"});let p=i.prepare(`
|
|
30
34
|
SELECT id
|
|
31
35
|
FROM session_events
|
|
32
36
|
WHERE processed = 0 AND created_at < ?
|
|
@@ -38,84 +42,84 @@ ${o.pid??0}`),o.unref(),{pid:o.pid??0}}async function Ce(){let e=Nt(process.cwd(
|
|
|
38
42
|
GROUP BY project, session_id, title
|
|
39
43
|
HAVING COUNT(*) > 1
|
|
40
44
|
)
|
|
41
|
-
`).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:A(n),metrics:n}}function W(e,t){return (t.openDatabase??(
|
|
45
|
+
`).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:A(n),metrics:n}}function W(e,t){return (t.openDatabase??(r=>new(Kr())(r,{readOnly:true})))(e)}function L(e,t){return !!e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get(t)}function H(e,t,...n){let r=e.prepare(t).get(...n);return Number(r?.count??0)}function Ht(e,t){return e===0?1:t/e}function sa(e,t){let n=[],r=null,o=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 f;try{f=W(s,t),L(f,"nodes")?(r=H(f,"SELECT COUNT(*) count FROM nodes"),n.push({key:"codegraph_nodes",value:r,ok:!0,severity:"info"})):n.push({key:"codegraph_nodes",value:"nodes table missing",target:">= 0",ok:!1,severity:"warning"});}catch(g){n.push({key:"codegraph_db_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.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 f;try{f=W(i,t);let g=L(f,"symbols_vec_rowids")?"symbols_vec_rowids":L(f,"symbol_sources")?"symbol_sources":null;g?(o=H(f,`SELECT COUNT(*) count FROM ${g}`),n.push({key:"symbols_vectors",value:o,ok:!0,severity:"info"})):n.push({key:"symbols_vectors",value:"vector metadata missing",target:">= 0",ok:!1,severity:"warning"});}catch(g){n.push({key:"symbols_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}if(r!==null&&o!==null){let f=Ht(r,o);n.push({key:"symbols_vector_coverage",value:f,target:">= 0.90",ok:f>=.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 f;try{f=W(a,t);let m=["knowledge_docs","knowledge_chunks","knowledge_vec_rowids"].filter(p=>!L(f,p));if(m.length>0)n.push({key:"knowledge_vector_schema",value:m,target:[],ok:!1,severity:"warning"});else {let p=H(f,"SELECT COUNT(*) count FROM knowledge_chunks"),w=H(f,"SELECT COUNT(*) count FROM knowledge_vec_rowids"),h=Ht(p,w),R=f.prepare(`
|
|
42
46
|
SELECT d.source source, COUNT(c.id) chunks,
|
|
43
47
|
SUM(CASE WHEN v.id IS NOT NULL THEN 1 ELSE 0 END) vectors
|
|
44
48
|
FROM knowledge_docs d
|
|
45
49
|
LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
|
|
46
50
|
LEFT JOIN knowledge_vec_rowids v ON v.id = c.id
|
|
47
51
|
GROUP BY d.source ORDER BY d.source
|
|
48
|
-
`).all().map(y=>{let S=Number(y.chunks),_=Number(y.vectors);return {source:y.source,chunks:S,vectors:_,coverage:
|
|
52
|
+
`).all().map(y=>{let S=Number(y.chunks),_=Number(y.vectors);return {source:y.source,chunks:S,vectors:_,coverage:Ht(S,_)}});n.push({key:"knowledge_chunks",value:p,ok:!0,severity:"info"}),n.push({key:"knowledge_vectors",value:w,ok:!0,severity:"info"}),n.push({key:"knowledge_vector_coverage",value:h,target:">= 0.95",ok:h>=.95,severity:"warning"}),n.push({key:"knowledge_vector_coverage_by_source",value:R,target:"every source >= 0.95",ok:R.every(y=>y.coverage>=.95),severity:"warning"});}}catch(g){n.push({key:"knowledge_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.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 f;try{if(f=W(c,t),!L(f,"observations")||!L(f,"embeddings"))n.push({key:"observation_vector_schema",value:"observations/embeddings missing",target:"Batch 2 vector schema",ok:!1,severity:"warning"});else {let g=H(f,"SELECT COUNT(*) count FROM observations"),m=H(f,`
|
|
49
53
|
SELECT COUNT(DISTINCT e.source_id) count
|
|
50
54
|
FROM embeddings e JOIN observations o ON o.id = e.source_id
|
|
51
55
|
WHERE e.source_type = 'observation'
|
|
52
56
|
`),p=Math.max(0,g-m);n.push({key:"observations",value:g,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(g){n.push({key:"observation_vectors_read",value:g.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{f?.close();}}let u=(t.now??Date.now)(),l=join$1(t.homePath??homedir$1(),".devflow","errors","embedder.log"),d=0;if(existsSync$1(l))try{let f=u-864e5;d=readFileSync$1(l,"utf8").split(`
|
|
53
|
-
`).filter(g=>{let m=/^\[([^\]]+)\]/.exec(g);return m?Date.parse(m[1])>=f:!1}).length;}catch(f){n.push({key:"embedder_error_log_read",value:f.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:A(n),metrics:n}}function
|
|
57
|
+
`).filter(g=>{let m=/^\[([^\]]+)\]/.exec(g);return m?Date.parse(m[1])>=f:!1}).length;}catch(f){n.push({key:"embedder_error_log_read",value:f.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:A(n),metrics:n}}function ia(e,t,n){let r=[],o=n.homePath??homedir$1(),s=n.homePath?join$1(o,".devflow","global","devflow.db"):getGlobalDevFlowDbPath(o),i=(n.now??Date.now)()-1440*60*1e3,a=t?"error":"warning";if(!existsSync$1(s))r.push({key:"global_telemetry_db",value:"missing",target:s,ok:false,severity:"warning"});else {let m;try{m=W(s,n),r.push({key:"global_telemetry_db",value:s,ok:!0,severity:"info"});for(let[w,h]of [["tool_metrics_24h","tool_metrics"],["feedback_24h","feedback"],["runs_24h","runs"]]){let v=L(m,h)?H(m,`SELECT COUNT(*) count FROM ${h} WHERE created_at >= ?`,i):0;r.push({key:w,value:v,ok:!0,severity:"info"});}let p=L(m,"telemetry_failures")?H(m,"SELECT COUNT(*) count FROM telemetry_failures WHERE created_at >= ?",i):0;if(r.push({key:"telemetry_failures_24h",value:p,target:0,ok:p===0,severity:a}),L(m,"tool_call_events"))if(m.prepare("PRAGMA table_info(tool_call_events)").all().map(h=>h.name).includes("failure_category")){let h=m.prepare(`
|
|
54
58
|
SELECT failure_category category, COUNT(*) count
|
|
55
59
|
FROM tool_call_events
|
|
56
60
|
WHERE timestamp >= ? AND failure_category IS NOT NULL
|
|
57
61
|
GROUP BY failure_category
|
|
58
62
|
ORDER BY failure_category
|
|
59
|
-
`).all(i),v=Object.fromEntries(h.map(_=>[_.category,Number(_.count)])),R=H(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),y=h.reduce((_,N)=>_+Number(N.count),0),S=R===0?1:y/R;
|
|
60
|
-
`))if(d.trim())try{let f=JSON.parse(d),g=
|
|
63
|
+
`).all(i),v=Object.fromEntries(h.map(_=>[_.category,Number(_.count)])),R=H(m,"SELECT COUNT(*) count FROM tool_call_events WHERE timestamp >= ? AND error IS NOT NULL",i),y=h.reduce((_,N)=>_+Number(N.count),0),S=R===0?1:y/R;r.push({key:"failure_categories_24h",value:v,ok:!0,severity:"info"}),r.push({key:"failure_category_coverage_24h",value:S,target:">= 0.80",ok:S>=.8,severity:a});}else r.push({key:"failure_category_schema",value:"failure_category column missing",target:"Batch 4G telemetry schema",ok:!1,severity:a});}catch(p){r.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(o,".devflow","telemetry-cache")])],u=0;try{u=c.reduce((m,p)=>m+(existsSync$1(p)?readdirSync(p).filter(w=>w.endsWith(".json")).length:0),0),r.push({key:"telemetry_cache_files",value:u,target:0,ok:u===0,severity:a});}catch(m){r.push({key:"telemetry_cache_read",value:m.message,target:"readable cache directory",ok:false,severity:"error"});}let l=join$1(e,".devflow","devflow.db"),d=existsSync$1(l);r.push({key:"project_local_telemetry_db",value:d?l:"absent",target:"absent",ok:!d,severity:a});let f=join$1(e,".codegraph","codegraph.db"),g=[];if(existsSync$1(f)){let m;try{m=W(f,n),g=m.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name LIKE 'devflow_%' ORDER BY name").all().map(p=>p.name);}catch(p){r.push({key:"codegraph_telemetry_read",value:p.message,target:"readable SQLite database",ok:false,severity:"error"});}finally{m?.close();}}return r.push({key:"codegraph_devflow_tables",value:g,target:[],ok:g.length===0,severity:a}),{name:"Telemetry",status:A(r),metrics:r}}function $r(e){return (statSync$1(e).mode&511).toString(8).padStart(3,"0")}function Gr(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 ca(e){let t=[],n=e.homePath??homedir$1(),r=e.env??process.env,o=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(([,l])=>!r[l]?.trim())&&!existsSync$1(o))t.push({key:"key_directory",value:"not required (environment overrides active)",ok:true,severity:"info"});else if(!existsSync$1(o))t.push({key:"key_directory",value:"missing",target:o,ok:false,severity:"warning"});else try{let l=lstatSync(o),d=$r(o),f=l.isDirectory()&&!l.isSymbolicLink(),g=process.platform==="win32"||d==="700";t.push({key:"key_directory",value:{path:o,mode:d},target:{type:"directory",mode:"700"},ok:f&&g,severity:f?"warning":"error"});}catch(l){t.push({key:"key_directory",value:l.message,target:"readable directory with mode 700",ok:false,severity:"error"});}for(let[l,d,f]of s){if(r[d]?.trim()){t.push({key:`${l}_source`,value:d,target:"environment override or generated key file",ok:true,severity:"info"});continue}let g=join$1(o,f);if(!existsSync$1(g)){t.push({key:`${l}_source`,value:"missing",target:g,ok:false,severity:"warning"});continue}try{let m=lstatSync(g),p=$r(g),w=readFileSync$1(g,"utf8").trim(),h=m.isFile()&&!m.isSymbolicLink();t.push({key:`${l}_source`,value:{path:g,mode:p,bytes:Buffer.byteLength(w)},target:{type:"regular file",mode:"400",nonempty:!0},ok:h&&w.length>0&&(process.platform==="win32"||p==="400"),severity:!h||w.length===0?"error":"warning"});}catch(m){t.push({key:`${l}_source`,value:m.message,target:"readable nonempty key file with mode 400",ok:false,severity:"error"});}}let a=join$1(n,".devflow","errors","compressor.log"),c=0,u=0;if(existsSync$1(a))try{let l=(e.now??Date.now)()-ye;for(let d of readFileSync$1(a,"utf8").split(`
|
|
64
|
+
`))if(d.trim())try{let f=JSON.parse(d),g=Gr(f.ts);g===null?u+=1:g>=l&&(c+=1);}catch{u+=1;}}catch(l){t.push({key:"compressor_error_log_read",value:l.message,target:"readable JSONL diagnostics",ok:false,severity:"error"});}return t.push({key:"compressor_errors_24h",value:c,target:0,ok:c===0,severity:"warning"}),t.push({key:"malformed_compressor_records",value:u,target:0,ok:u===0,severity:"error"}),{name:"Runtime security",status:A(t),metrics:t}}function la(e){let t=[],n=e.homePath??homedir$1(),r=getGlobalDevFlowDbPath(n);if(!existsSync$1(r))return t.push({key:"latest_benchmark",value:"missing global database",target:"completed baseline within 30 days",ok:false,severity:"warning"}),{name:"Benchmark",status:A(t),metrics:t};let o;try{if(o=W(r,e),!L(o,"benchmark_reports"))return t.push({key:"latest_benchmark",value:"benchmark_reports table missing",target:"completed baseline within 30 days",ok:!1,severity:"warning"}),{name:"Benchmark",status:A(t),metrics:t};let s=o.prepare(`
|
|
61
65
|
SELECT run_id, suite_id, suite_version, task_count, status, report_json, created_at
|
|
62
66
|
FROM benchmark_reports
|
|
63
67
|
ORDER BY created_at DESC
|
|
64
68
|
LIMIT 1
|
|
65
|
-
`).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:A(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(s.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");i=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),u=(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(u)?Number((u/
|
|
66
|
-
`))if(v.trim())try{let R=JSON.parse(v),y=
|
|
69
|
+
`).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:A(t),metrics:t};let i=null;try{if(typeof s.report_json!="string")throw new Error("report_json is not text");let l=JSON.parse(s.report_json);if(!Array.isArray(l.tasks))throw new Error("report tasks are missing");i=l.tasks.length;}catch(l){t.push({key:"benchmark_report_json",value:l.message,target:"valid report with tasks array",ok:!1,severity:"error"});}let a=Number(s.task_count),c=Number(s.created_at),u=(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(u)?Number((u/ye).toFixed(2)):null,target:"0-30",ok:Number.isFinite(u)&&u>=0&&u<=aa,severity:u<0||!Number.isFinite(u)?"error":"warning"});}catch(s){t.push({key:"benchmark_database_read",value:s.message,target:"readable canonical benchmark database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Benchmark",status:A(t),metrics:t}}function ua(e){if(!existsSync$1(e))return {bytes:0,files:0};let t=[e],n=0,r=0;for(;t.length>0;){let o=t.pop(),s=lstatSync(o);if(!s.isSymbolicLink()){if(s.isDirectory()){for(let i of readdirSync(o))t.push(join$1(o,i));continue}s.isFile()&&(n+=s.size,r+=1);}}return {bytes:n,files:r}}function da(e){let t=[],n=e.homePath??homedir$1(),r=[join$1(n,".devflow","errors","hook-fallback.log")],o=join$1(n,".devflow","logs","hook-fallback");if(existsSync$1(o))try{for(let h of readdirSync(o))h.endsWith(".log")&&r.push(join$1(o,h));}catch(h){t.push({key:"hook_fallback_directory_read",value:h.message,target:"readable fallback directory",ok:false,severity:"error"});}let s=(e.now??Date.now)()-ye,i=0,a=0;for(let h of [...new Set(r)])if(existsSync$1(h))try{for(let v of readFileSync$1(h,"utf8").split(`
|
|
70
|
+
`))if(v.trim())try{let R=JSON.parse(v),y=Gr(R.ts);y===null||typeof R.reason!="string"?a+=1:y>=s&&(i+=1);}catch{a+=1;}}catch(v){t.push({key:"hook_fallback_log_read",value:{path:h,error:v.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),u=0,l=0,d=null;if(existsSync$1(c)){let h;try{if(h=W(c,e),L(h,"telemetry_events")){let v=h.prepare(`
|
|
67
71
|
SELECT COUNT(*) total,
|
|
68
72
|
SUM(CASE WHEN success = 0 THEN 1 ELSE 0 END) failures,
|
|
69
73
|
AVG(CASE WHEN success = 1 THEN duration END) average_duration
|
|
70
74
|
FROM telemetry_events
|
|
71
75
|
WHERE kind = 'hook_daemon_request' AND timestamp >= ?
|
|
72
|
-
`).get(s);u=Number(v?.total??0),l=Number(v?.failures??0),d=v?.average_duration==null?null:Math.round(Number(v.average_duration)*100)/100;}}catch(v){t.push({key:"hook_daemon_metrics_read",value:v.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{h?.close();}}let f=Math.max(i,l),g=Math.max(u,f),m=g===0?0:f/g;t.push({key:"hook_daemon_requests_24h",value:g,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(m*1e4)/1e4,target:0,ok:f===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=f>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 w=join$1(n,".devflow","logs","hook-debug");try{let h=
|
|
76
|
+
`).get(s);u=Number(v?.total??0),l=Number(v?.failures??0),d=v?.average_duration==null?null:Math.round(Number(v.average_duration)*100)/100;}}catch(v){t.push({key:"hook_daemon_metrics_read",value:v.message,target:"readable canonical telemetry",ok:false,severity:"error"});}finally{h?.close();}}let f=Math.max(i,l),g=Math.max(u,f),m=g===0?0:f/g;t.push({key:"hook_daemon_requests_24h",value:g,ok:true,severity:"info"}),t.push({key:"hook_fallback_rate_24h",value:Math.round(m*1e4)/1e4,target:0,ok:f===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=f>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 w=join$1(n,".devflow","logs","hook-debug");try{let h=ua(w);t.push({key:"hook_debug_log_bytes",value:h.bytes,target:`<= ${Er}`,ok:h.bytes<=Er,severity:"warning"}),t.push({key:"hook_debug_log_files",value:h.files,target:"rotated per project",ok:!0,severity:"info"});}catch(h){t.push({key:"hook_debug_log_read",value:h.message,target:"readable regular files without symlink traversal",ok:false,severity:"error"});}return {name:"Hook path health",status:A(t),metrics:t}}function ue(e){try{return statSync$1(e).isDirectory()?realpathSync.native(e):null}catch{return null}}function rt(e){return JSON.parse(readFileSync$1(e,"utf8"))}function U(e){return typeof e=="object"&&e!==null?e:null}function Yr(e,t){return ma.has(e)&&!(t.tolerateControlSyntax&&pa.has(e))}function Me(e,t={}){if(Buffer.byteLength(e)>Vr)return {segments:[],malformed:true};let n=[],r=[],o="",s=null,i=false,a=false,c=()=>{o.length>0&&r.push(o),o="";},u=()=>{c(),r.length>0&&n.push(r),r=[];};for(let l=0;l<e.length;l+=1){let d=e[l];if(i){o+=d,i=false;continue}if(s==="'"){d==="'"?s=null:o+=d;continue}if(d==="\\"){if(e[l+1]===`
|
|
73
77
|
`){l+=1;continue}if(e[l+1]==="\r"&&e[l+2]===`
|
|
74
|
-
`){l+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax&&(a=true),
|
|
75
|
-
`;)l+=1;u();continue}f==="<<"&&!t.tolerateControlSyntax&&(a=true);let g=d==="{"&&
|
|
76
|
-
`].includes(d)){u();continue}if(/\s/.test(d)){c();continue}
|
|
77
|
-
`){
|
|
78
|
-
`&&e[
|
|
79
|
-
`;)t[n]=" ",n+=1;continue}if(
|
|
80
|
-
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function J(e,t,n="infer"){let
|
|
81
|
-
`;)
|
|
82
|
-
`||u==="\r"){a=false;break}i+=u,
|
|
83
|
-
`;)t[
|
|
78
|
+
`){l+=2;continue}i=true;continue}if(s==='"'){d==='"'?s=null:((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax&&(a=true),o+=d);continue}if(d==="'"||d==='"'){s=d;continue}if((d==="`"||d==="$"&&e[l+1]==="(")&&!t.tolerateControlSyntax){a=true,o+=d;continue}let f=e.slice(l,l+2);if(d==="#"&&o.length===0){for(;l<e.length&&e[l]!==`
|
|
79
|
+
`;)l+=1;u();continue}f==="<<"&&!t.tolerateControlSyntax&&(a=true);let g=d==="{"&&o==="$"&&/^\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}/.test(e.slice(l))||d==="}"&&ha.test(`${o}}`);if(["(",")","{","}"].includes(d)&&!g&&!t.tolerateControlSyntax&&(a=true),f==="&&"||f==="||"){u(),l+=1;continue}if([";","|","&",`
|
|
80
|
+
`].includes(d)){u();continue}if(/\s/.test(d)){c();continue}o+=d;}return (s!==null||i)&&(a=true),u(),n.some(l=>{let d=l.find(f=>!/^[A-Za-z_][A-Za-z0-9_]*=/.test(f));return d!==void 0&&Yr(d,t)})&&(a=true),{segments:n,malformed:a}}function ya(e){return Me(e).segments.flat().join(" ")}function wa(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 Zr(e,t){return wa(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 va(e){let t=e.split(""),n=null;for(let r=0;r<e.length;r+=1){let o=e[r];if(n!==null){o==="\\"?r+=1:o===n&&(n=null);continue}if(o==="'"||o==='"'||o==="`"){n=o;continue}if(o!=="/"||!["/","*"].includes(e[r+1]??""))continue;let s=e[r+1]==="*";for(t[r]=" ",t[r+1]=" ",r+=2;r<e.length;){if(s&&e[r]==="*"&&e[r+1]==="/"){t[r]=" ",t[r+1]=" ",r+=1;break}if(!s&&e[r]===`
|
|
81
|
+
`){r-=1;break}e[r]!==`
|
|
82
|
+
`&&e[r]!=="\r"&&(t[r]=" "),r+=1;}}return t.join("")}function ka(e){let t=e.split("");for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="#"){for(;n<e.length&&e[n]!==`
|
|
83
|
+
`;)t[n]=" ",n+=1;continue}if(r!=="'"&&r!=='"')continue;let o=r,s=e.slice(n,n+3)===o.repeat(3)?3:1;for(n+=s;n<e.length;){if(e[n]==="\\"){n+=2;continue}if(e.slice(n,n+s)===o.repeat(s)){n+=s-1;break}if(s===1&&(e[n]===`
|
|
84
|
+
`||e[n]==="\r"))break;n+=1;}}return t.join("")}function J(e,t,n="infer"){let r=t?ya(e):n==="node"?va(e):n==="python"?ka(e):e;return [...new Set(r.match(fa)??[])]}function ba(e){return Me(e).segments.flat()}function V(e,t,n=false,r="infer"){let o=[[/^\$\{CLAUDE_PROJECT_DIR\}(?:\/(.*))?$/,t.project],[/^\$CLAUDE_PROJECT_DIR(?:\/(.*))?$/,t.project],[/^\$\{HOME\}(?:\/(.*))?$/,t.homePath],[/^\$HOME(?:\/(.*))?$/,t.homePath],[/^~(?:\/(.*))?$/,t.homePath]];for(let[i,a]of o){let c=e.match(i);if(c)return {path:resolve(a,c[1]??""),containmentRoot:a,cwd:t.cwd,parserKind:r}}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),u=re(a,i)?a:re(c,i)?c:dirname(i);return {path:i,containmentRoot:u,cwd:t.cwd,parserKind:r}}return n?{path:resolve(t.cwd,e),containmentRoot:t.project,cwd:t.cwd,parserKind:r}: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:r}:null}function Sa(e){let t=e.indexOf(",");if(t<0)return null;try{let n=e.slice(5,t),r=e.slice(t+1),o=n.split(";").includes("base64")?Buffer.from(r,"base64"):Buffer.from(decodeURIComponent(r),"utf8");if(o.length>Vr||o.includes(0))return null;let s=o.toString("utf8");return s.includes("\uFFFD")?null:s}catch{return null}}function tn(e,t=true){let n=e.value;if(n.startsWith("node:")||isBuiltin(n))return {malformed:false};if(n.startsWith("data:")){let s=Sa(n);return s===null?{malformed:true}:{inlineContent:{content:s,source:n},malformed:Ye(s)}}if(n.startsWith("file:"))try{let s=fileURLToPath(n),i={project:e.project,homePath:e.homePath,cwd:e.cwd};return {reference:V(s,i,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}if(/^[A-Za-z][A-Za-z0-9+.-]*:/.test(n)||de(n))return {malformed:true};let r=isAbsolute(n)||n.startsWith("./")||n.startsWith("../")||n.startsWith("~")||n.startsWith("$");if(!t&&!r)return {malformed:false};let o={project:e.project,homePath:e.homePath,cwd:e.cwd};if(r){if(e.issuerPath&&!n.startsWith("~")&&!n.startsWith("$")){let s=Pa(n,e.issuerPath,e.nodeResolutionKind??"esm");if(s)return {reference:V(s,o,true,e.parserKind)??void 0,malformed:false}}return {reference:V(n,o,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:V(i,o,!0,e.parserKind)??void 0,malformed:!1}}catch{return {malformed:true}}}function _a(e){let t=[e];extname(e)===""&&t.push(...xr.map(n=>`${e}${n}`),...xr.map(n=>join$1(e,`index${n}`)));for(let n of t)try{if(statSync$1(n).isFile())return n}catch{}return null}function Pa(e,t,n){if(n==="cjs")try{let o=createRequire$1(t).resolve(e);return isBuiltin(o)?null:o}catch{}let r=isAbsolute(e)?resolve(e):resolve(dirname(t),e);return _a(r)??r}function Ra(e){let t=[],n=false;for(let r=0;r<e.length;){let o=e[r];if(/\s/.test(o)){r+=1;continue}if(o==="/"&&e[r+1]==="/"){for(r+=2;r<e.length&&e[r]!==`
|
|
85
|
+
`;)r+=1;continue}if(o==="/"&&e[r+1]==="*"){let s=e.indexOf("*/",r+2);if(s<0){n=true;break}r=s+2;continue}if(o==="'"||o==='"'){let s=o,i="",a=true;r+=1;let c=false;for(;r<e.length;){let u=e[r];if(u===s){c=true,r+=1;break}if(u==="\\"){if(a=false,r+1>=e.length)break;i+=e[r+1],r+=2;continue}if(u===`
|
|
86
|
+
`||u==="\r"){a=false;break}i+=u,r+=1;}n||=!c,t.push({kind:"string",value:i,valid:a&&c});continue}if(o==="`"){let s=false,i=false;for(r+=1;r<e.length;){let a=e[r];if(!s&&a==="`"){i=true,r+=1;break}s=!s&&a==="\\",a!=="\\"&&(s=false),r+=1;}n||=!i,t.push({kind:"template",value:"",valid:i});continue}if(/[A-Za-z_$]/.test(o)){let s=r+1;for(;s<e.length&&/[A-Za-z0-9_$]/.test(e[s]);)s+=1;t.push({kind:"identifier",value:e.slice(r,s),valid:true}),r=s;continue}t.push({kind:"punctuation",value:o,valid:true}),r+=1;}return {tokens:t,malformed:n}}function Da(e,t,n,r=true){let o=Ra(t),s=[],i=o.malformed,a=(d,f)=>{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:f,issuerPath:e});},{tokens:c}=o;for(let d=0;d<c.length;d+=1){let f=c[d],g=c[d-1];if(f.kind!=="identifier")continue;if(f.value==="eval"&&g?.value!=="."&&c[d+1]?.value==="("){i=true;continue}if(f.value==="require"){if(g?.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(g?.value==="."||!["export","import"].includes(f.value))continue;if(f.value==="import"&&c[d+1]?.value==="("){let p=c[d+2];c[d+3]?.value===")"||(i=true),a(p,"esm");continue}if(f.value==="import"&&c[d+1]?.kind==="string"){a(c[d+1],"esm");continue}if(f.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"):f.value==="import"&&(i=true);}let u=[],l=[];for(let d of s){let f=tn(d,r);f.reference&&u.push(f.reference),f.inlineContent&&l.push(f.inlineContent),i||=f.malformed;}return {references:u,inlineContents:l,malformed:i}}function Ca(e){let t=e.split(""),n=false;for(let r=0;r<e.length;){let o=e[r];if(o==="#"){for(;r<e.length&&e[r]!==`
|
|
87
|
+
`;)t[r]=" ",r+=1;continue}if(o!=="'"&&o!=='"'){r+=1;continue}let s=r;for(;s>0&&/[A-Za-z]/.test(e[s-1]);)s-=1;let i=e.slice(s,r),a=/^(?:f|fr|rf)$/i.test(i),c=o,u=e.slice(r,r+3)===c.repeat(3),l=u?3:1,d=r;for(let g=0;g<l;g+=1)t[d+g]=" ";d+=l;let f=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+l)===c.repeat(l)){for(let g=0;g<l;g+=1)t[d+g]=" ";d+=l,f=true;break}if(!u&&(e[d]===`
|
|
84
88
|
`||e[d]==="\r"))break;e[d]!==`
|
|
85
|
-
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let g=e.slice(o+l,d-l);for(let m=0;m<g.length;m+=1)if(g[m]==="{"){if(g[m+1]==="{"){m+=1;continue}n=true;break}}n||=!f,o=d;}return {content:t.join(""),malformed:n}}function xo(e,t){let n=t.split(".");if(n.length>Yt)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 _a(e,t,n){let o=Sa(t),r=[],s=o.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(o.content),i=d=>{let f=dirname(e);for(let g=1;g<d;g+=1)f=dirname(f);return f},a=d=>{let f=V(d,{...n,cwd:dirname(e)},true,"python");f?r.push(f):s=true;},c=(d,f=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let g=i(f),m=xo(g,d);s||=!m.resolved;for(let w of m.paths)a(w);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},u=d=>{let f=[];for(let g of d.split(",")){let m=g.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}f.push(m);}return f},l=(d,f)=>{for(let g of u(f))d&&xo(d,g).resolved&&(s=true);};for(let d of o.content.split(/\r?\n/))for(let f of d.split(/[;:]/)){let g=f.trim();if(g.startsWith("import ")){let y=g.slice(7).split(",");for(let S of y)c(S.trim().split(/\s+as\s+/)[0]);continue}let m=g.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,w=m[2];if(w){let y=c(w,p);l(y,m[3]);continue}if(p===0){s=true;continue}let h=i(p),v=join$1(h,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),l(h,m[3]);continue}for(let y of u(m[3]))c(y,p);}return {references:[...new Map(r.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Yo(e,t,n,o,r=true){return n==="node"?ka(e,t,o,r):n==="python"?_a(e,t,o):{references:[],inlineContents:[],malformed:false}}function $o(e,t,n,o=t){let r={project:t,homePath:n,cwd:o},s=Ge(e,0,r),i=new Set((s.artifacts??[]).map(f=>f.value)),a=s.tokens.filter(f=>!i.has(f)).map(f=>V(f,r)).filter(f=>f!==null),c=[],u=[...s.inlineContents??[]],l=s.malformed;for(let f of s.artifacts??[]){if(f.nodeResolutionKind){let m=Zt(f);m.reference&&c.push(m.reference),m.inlineContent&&u.push(m.inlineContent),l||=m.malformed;continue}let g=V(f.value,{...r,cwd:f.cwd},true,f.parserKind);g?c.push(g):l=true;}let d=[...a,...c];return {references:[...new Map(d.map(f=>[`${f.path}:${f.parserKind}`,f])).values()],inlineContents:u,malformed:l}}function Zo(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function le(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 qe(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function xe(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Ea(e,t,n){let o=[],r=[],s=false,i=(l,d)=>{o.push(l),r.push({value:l,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=le(l);},a=(l=s)=>({tokens:o,artifacts:r,malformed:l}),c=t,u=false;for(;c<e.length;){let l=e[c];if(l==="--"){let w=e[c+1];return w&&!u&&i(w),w?a():a(true)}if(!l.startsWith("-"))return u||i(l),a();if(Ca.has(l))return a();if(Da.has(l)){u=true,c+=1;continue}let d=Ao.has(l)?"cjs":Oo.has(l)?"esm":null;if(d){let w=e[c+1];if(!w)return a(true);i(w,d),c+=2;continue}let f=xe(l,Ao),g=xe(l,Oo),m=f??g;if(m!==null){if(!m)return a(true);i(m,f!==null?"cjs":"esm"),c+=1;continue}if(l.startsWith("-r")&&l.length>2){i(l.slice(2),"cjs"),c+=1;continue}if(To.has(l)){let w=e[c+1];return a(w===void 0?true:s||qe(w))}let p=xe(l,To);if(p!==null)return a(s||qe(p));if((l.startsWith("-e")||l.startsWith("-p"))&&l.length>2)return a(s||qe(l.slice(2)));if(No.has(l)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(xe(l,No)!==null){c+=1;continue}if(Ra.has(l)){c+=1;continue}return a(true)}return u?a():a(true)}function Oa(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:le(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Ge(a,n+1,o,r):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(xa.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:le(i)}}return {tokens:[],malformed:true}}function Ta(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:le(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:le(r)};if(Aa.has(r))return {tokens:[],malformed:false};if(r==="-c"||r==="-m"||r.startsWith("-c"))return {tokens:[],malformed:true};if(Io.has(r)){if(e[o+1]===void 0)return {tokens:[],malformed:true};o+=2;continue}if(xe(r,Io)!==null){o+=1;continue}if($a.has(r)){o+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Ut(e,t){let n=V(e,t,true);if(!n)return null;let o=ce(n.path),r=ce(t.project);return !o||!r||!ne(r,o)?null:o}function ja(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(Zo(a))s+=1;else if(a==="-S"||a==="--split-string"){let c=t[s+1];if(!c)return {index:s,malformed:true};let u=Oe(c,r);return u.malformed||u.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...u.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],u=c?Ut(c,i):null;if(!u)return {index:s,malformed:true};i={...i,cwd:u},s+=2;}else if(a.startsWith("--chdir=")){let c=Ut(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=Ut(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 Ge(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},o={}){if(t>Go)return {tokens:[],malformed:true};let r=Oe(e,o),s=[],i=[],a=[],c=r.malformed;for(let u of r.segments){let l=Qo(u,t,n,o);s.push(...l.tokens),i.push(...l.artifacts??[]),a.push(...l.inlineContents??[]),c||=l.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function Qo(e,t,n,o){let r=0;for(;Zo(e[r]??"");)r+=1;let s=e[r];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Na.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Go)return {tokens:i,malformed:true};let p=ja(basename(s),e,r+1,n,o);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let w=Qo(p.replacement,a,p.context??n,o);return i.push(...w.tokens),{tokens:i,artifacts:w.artifacts,inlineContents:w.inlineContents,malformed:w.malformed}}if(r=p.index,s=e[r],!s)return {tokens:i,malformed:false}}let u=basename(s),l=!s.includes(sep)&&Jo(u,o),d=c&&!Ia.has(u);if(l||d)return {tokens:i,malformed:true};let f=le(s);i.push(s);let g=u;if(!Pa.has(g))return {tokens:i,malformed:f};let m=["node","tsx"].includes(g)?Ea(e,r+1,n):["bash","sh","zsh"].includes(g)?Oa(e,r+1,a,n,o):Ta(e,r+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:f||m.malformed}}function Xo(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,o=t.lastIndexOf(n);return o<0?null:ce(t.slice(0,o))}function Ma(e,t){let n=new Map;for(let o of t)for(let r of ha(o)){let s=Xo(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 La(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Fa(e){return e.slice(e.lastIndexOf("@")+1)}function jo(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=ce(t);if(n&&existsSync$1(join$1(n,"hooks.json")))return n}return null}function Ua(e,t,n){let o=Fa(e),r=F(t.extraKnownMarketplaces),s=F(r?.[o]);if(s){let i=F(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?jo(i.path):null}}try{let i=F(Ze(n)),a=F(i?.[o]);if(a){let c=F(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?jo(c.path):null}}}catch{}return {configured:false,root:null}}function Mo(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 Wa(e,t){let n=F(e.entry),o=F(t.entry),r=Mo(n),s=Mo(o);if(r!==s)return r===null?1:s===null?-1:s-r;let i=typeof n?.version=="string"?ze(n.version):null,a=typeof o?.version=="string"?ze(o.version):null;if(i&&a){let c=er(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function Ba(e,t){try{let n=F(Ze(t));if(!n)throw new Error("installed plugin manifest must be an object");let o=F(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(Wa)[0],i=F(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:ce(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function ze(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 er(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 Ha(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),u=a.name;try{let l=F(Ze(join$1(c,"package.json")));typeof l?.version=="string"&&(u=l.version);}catch{}return {name:a.name,path:c,version:u,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let u=ze(a.version),l=ze(c.version);if(u&&l){let d=er(l,u);if(d!==0)return d}else if(u||l)return u?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?ce(i[0].path):null}function qa(e,t){if(t.legacyArtifactRoots!==void 0){let y=t.legacyArtifactRoots.map(S=>ce(S)).filter(S=>S!==null).map(S=>({root:S,inspectPluginConfig:true}));return {targets:y,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:y.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=[],u=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let y of u)if(existsSync$1(y))try{let S=F(Ze(y));if(!S)throw new Error("settings must be an object");i.push({path:y,settings:S});}catch{a.push(y);}if(i.reduce((y,S)=>typeof S.settings.disableAllHooks=="boolean"?S.settings.disableAllHooks:y,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(y=>{let S=[];return Je(y.settings.hooks,S),{path:y.path,commands:S}}),f=d.flatMap(y=>y.commands),g=d.flatMap(y=>Ma(y.path,y.commands)),p=[...i.reduce((y,S)=>{let _=S.settings.enabledPlugins;if(typeof _!="object"||_===null)return y;for(let[N,oe]of Object.entries(_))La(N)&&typeof oe=="boolean"&&y.set(N,oe);return y},new Map)].filter(([,y])=>y).map(([y])=>y).sort(),w=[...g],h=false;for(let y of p){let S=Ba(y,o);S.malformed&&c.push(o);let _=S.root;if(!S.configured){let N=i.map(he=>Ua(y,he.settings,r)).filter(he=>he.configured),oe=N[N.length-1];oe?_=oe.root:_=Ha(y,s);}_?w.push({root:_,inspectPluginConfig:true}):h=true;}let v=[...w.reduce((y,S)=>{let _=y.get(S.root);return _?(y.set(S.root,{root:S.root,configPath:_.configPath??S.configPath,commands:[...new Set([..._.commands??[],...S.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||S.inspectPluginConfig)}),y):(y.set(S.root,S),y)},new Map).values()],R=[f.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(y=>y!==null);return {targets:v,configCommands:d.filter(y=>y.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${h?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||f.length>0)&&!h&&a.length===0&&c.length===0}}function Ka(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 Je(e,t){if(Array.isArray(e)){for(let n of e)Je(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):Je(o,t);}function Wt(e){return [...e.matchAll(ca)].map(t=>t[1])}function Ga(e){let t=new Map,n=Oe(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 za(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 Ja(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 Bt(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function ne(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Kt(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>He)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>He)return {kind:"unsafe",reason:"oversized"};let r=Buffer.alloc(Math.min(o.size+1,He+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>He)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 Gt(e,t){return `${e} (${t})`}function Va(e,t,n,o){let r=[],s=new Set,i=0,a=(c,u=0)=>{if(u>Yt){o.traversalLimitRoots.push(e);return}let l=resolve(c.path),d=resolve(c.containmentRoot),f;try{f=realpathSync.native(d);}catch{f=d;}if(!existsSync$1(l)){ne(d,l)?o.missing.push(l):o.escapedArtifacts.push(l);return}let g;try{g=realpathSync.native(l);}catch{o.missing.push(l);return}if(!ne(f,g)){o.escapedArtifacts.push(l);return}let m=`${g}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),r.push({...c,path:g,depth:u}));};for(let c of n){let u=$o(c,e,t);u.malformed&&o.malformedCommands.push(c);for(let l of u.inlineContents)for(let d of J(l.content,false,"node"))o.findings.push({artifact:l.source,endpoint:d});for(let l of u.references)a(l);}for(;r.length>0;){if(i>=Ko){o.traversalLimitRoots.push(e);break}let c=r.shift(),u=c.path;i+=1;let l=Kt(u);if(l.kind==="missing"){o.missing.push(u);continue}if(l.kind==="unsafe"){l.reason!=="binary"&&o.unsafeArtifacts.push(Gt(u,l.reason));continue}let{content:d}=l;o.inspected.push(u);let f=c.parserKind==="infer"?Vo(u,d):c.parserKind,g=f==="shell";for(let m of J(d,g,f))o.findings.push({artifact:u,endpoint:m});if(g){let m=$o(d,e,t,c.cwd);m.malformed&&o.malformedCommands.push(u);for(let p of m.inlineContents)for(let w of J(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:w});for(let p of m.references)a(p,c.depth+1);}else if(f==="node"||f==="python"){let m=Yo(u,d,f,{project:e,homePath:t,cwd:dirname(u)});m.malformed&&o.malformedCommands.push(u);for(let p of m.inlineContents)for(let w of J(p.content,false,"node"))o.findings.push({artifact:p.source,endpoint:w});for(let p of m.references)a(p,c.depth+1);}}}function Ya(e,t,n,o){let r=realpathSync.native(n.root),s=[],i=new Set,a=Ka(r),c=0,u=(g,m=false,p=r,w="infer",h=e,v=0)=>{if(v>Yt){o.traversalLimitRoots.push(r);return}let R=realpathSync.native(p),y=resolve(g);if(!existsSync$1(y)){if(!ne(R,y)){o.escapedArtifacts.push(y);return}m&&o.missing.push(y);return}let S;try{S=realpathSync.native(y);}catch{m&&o.missing.push(y);return}if(!ne(R,S)){o.escapedArtifacts.push(y);return}let _=`${S}:${w}:${h}`;i.has(_)||(i.add(_),s.push({path:S,parserKind:w,cwd:h,depth:v}));},l=(g,m,p,w=0)=>{for(let h of Wt(g)){let v=Bt(r,h);if(!v)continue;let R=(m.artifacts??[]).find(y=>y.value.includes("PLUGIN_ROOT")&&y.value.endsWith(h));u(v,true,r,R?.parserKind??"infer",R?.cwd??p,w);}},d=(g,m,p=0,w=false)=>{for(let h of g.artifacts??[]){if(h.value.includes("PLUGIN_ROOT"))continue;let v=h.nodeResolutionKind?Zt(h,!w):{reference:V(h.value,{project:h.project,homePath:h.homePath,cwd:h.cwd},true,h.parserKind)??void 0,malformed:false};if(v.malformed){o.malformedCommands.push(h.value);continue}if(v.inlineContent)for(let R of J(v.inlineContent.content,false,"node"))o.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&u(v.reference.path,true,w?r:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},f=g=>{for(let p of J(g,true))o.findings.push({artifact:n.configPath??join$1(r,"hooks.json"),endpoint:p});let m=Ge(g,0,{project:e,homePath:t,cwd:e});m.malformed&&o.malformedCommands.push(g),l(g,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let w=Xo(p),h=(m.artifacts??[]).find(v=>v.value===p);w===r&&u(p,true,r,h?.parserKind??"infer",h?.cwd??e);}};if(n.commands){n.configPath&&o.configsInspected.push(n.configPath);for(let g of n.commands)f(g);}if(n.inspectPluginConfig||!n.commands){let g=join$1(r,"hooks.json");if(!existsSync$1(g))o.missing.push(g),u(join$1(r,"hooks","session-start"));else {o.configsInspected.push(g);let m;try{m=realpathSync.native(g);}catch{o.missing.push(g),u(join$1(r,"hooks","session-start")),m="";}if(m&&!ne(r,m)&&(o.escapedArtifacts.push(g),u(join$1(r,"hooks","session-start")),m=""),m){let p=Kt(m);if(p.kind==="unsafe")o.unsafeArtifacts.push(Gt(g,p.reason)),u(join$1(r,"hooks","session-start"));else if(p.kind==="missing")o.missing.push(g),u(join$1(r,"hooks","session-start"));else try{let w=JSON.parse(p.content),h=[];Je(w,h);for(let v of h)f(v);}catch{o.malformedConfigs.push(g),u(join$1(r,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=Ko){o.traversalLimitRoots.push(r);break}let g=s.shift(),m=g.path;c+=1;let p=Kt(m);if(p.kind==="missing"){o.missing.push(m);continue}if(p.kind==="unsafe"){o.unsafeArtifacts.push(Gt(m,p.reason));continue}let{content:w}=p;o.inspected.push(m);let h=g.parserKind==="infer"?Vo(m,w):g.parserKind,v=h==="shell";for(let S of J(w,v,h))o.findings.push({artifact:m,endpoint:S});if(v){let S=Ga(w),_=Ge(S,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});za(w)&&o.malformedCommands.push(m),l(S,_,dirname(m),g.depth+1),d(_,dirname(m),g.depth+1,true);}else if(h==="node"||h==="python"){let S=Yo(m,w,h,{project:e,homePath:t,cwd:dirname(m)},false);(h==="node"?Ja(m):S.malformed)&&o.malformedCommands.push(m);for(let _ of S.inlineContents)for(let N of J(_.content,false,"node"))o.findings.push({artifact:_.source,endpoint:N});for(let _ of S.references){let N=relative(r,resolve(_.path));!N.startsWith(`..${sep}`)&&N.split(sep).includes("node_modules")||u(_.path,true,r,_.parserKind,_.cwd,g.depth+1);}for(let _ of Wt(w)){let N=Bt(r,_);N&&u(N,true,r,h,g.cwd,g.depth+1);}}else for(let S of Wt(w)){let _=Bt(r,S);_&&u(_,true,r,h,g.cwd,g.depth+1);}let R=m.startsWith(`${r}/`)?m.slice(r.length+1):"",y=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&u(join$1(a,"packages","devflow","src","hooks",`${y}.ts`),false,a),R.startsWith("hooks/")&&u(join$1(r,"dist","hooks",`${y}.js`));}}function Za(e,t){let n=qa(e,t),o={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let h of n.configCommands){o.configsInspected.push(h.path);for(let v of h.commands){o.commandsInspected.push({configPath:h.path,command:v});for(let R of J(v,true))o.findings.push({artifact:h.path,endpoint:R});}}Va(e,t.homePath??homedir$1(),n.configCommands.flatMap(h=>h.commands).filter(h=>!n.targets.some(v=>v.commands?.includes(h))),o);for(let h of n.targets)Ya(e,t.homePath??homedir$1(),h,o);let r=[...new Set(o.configsInspected)],s=[...new Set(o.inspected)],i=o.commandsInspected.filter((h,v,R)=>R.findIndex(y=>y.configPath===h.configPath&&y.command===h.command)===v),a=[...new Set(o.missing)],c=[...new Set(o.malformedConfigs)],u=[...new Set(o.malformedCommands)],l=[...new Set(o.unsafeArtifacts)],d=[...new Set(o.traversalLimitRoots)],f=[...new Set(o.escapedArtifacts)],g=o.findings.filter((h,v,R)=>R.findIndex(y=>y.artifact===h.artifact&&y.endpoint===h.endpoint)===v),m=a.length>0||f.length>0||l.length>0,w=[{key:"active_plugin_resolution",value:m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(h=>h.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{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:u,target:[],ok:u.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:f.length,target:0,ok:f.length===0,severity:"warning"},{key:"retired_producer_paths",value:g.length,target:0,ok:g.length===0,severity:"error"},{key:"retired_producer_path_findings",value:g,ok:true,severity:"info"}];return {name:"Legacy paths",status:A(w),metrics:w}}function Qa(e){let t=dirname(fileURLToPath$1(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 Qe(e){let t=Qa(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)/me: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 Xa(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=W(i,t);let u=(M(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(l=>l.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:u?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:u,severity:"warning"}),u&&n.push({key:"explicit_memory_observations",value:H(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:A(n),metrics:n}}function ec(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:A(n),metrics:n};let r;try{if(r=W(o,t),!M(r,"memories"))n.push({key:"memories_schema",value:"memories table missing",target:"Batch 3 memory schema",ok:!1,severity:"warning"});else {let s=(t.now??Date.now)()-7*me,i=r.prepare(`
|
|
89
|
+
`&&e[d]!=="\r"&&(t[d]=" "),d+=1;}if(a){let g=e.slice(r+l,d-l);for(let m=0;m<g.length;m+=1)if(g[m]==="{"){if(g[m+1]==="{"){m+=1;continue}n=true;break}}n||=!f,r=d;}return {content:t.join(""),malformed:n}}function Ar(e,t){let n=t.split(".");if(n.length>en)return {paths:[],resolved:false};let r=[],o=e;for(let s=0;s<n.length;s+=1){o=join$1(o,n[s]);let i=join$1(o,"__init__.py");try{if(statSync$1(i).isFile()){r.push(i);continue}}catch{}if(s===n.length-1){let c=`${o}.py`;try{if(statSync$1(c).isFile())return r.push(c),{paths:r,resolved:!0}}catch{return {paths:r,resolved:false}}return {paths:r,resolved:false}}try{if(!statSync$1(o).isDirectory())return {paths:r,resolved:!1}}catch{return {paths:r,resolved:false}}}return {paths:r,resolved:r.length>0}}function Ea(e,t,n){let r=Ca(t),o=[],s=r.malformed||/\b(?:exec|eval|__import__)\s*\(|\bimportlib\s*\./.test(r.content),i=d=>{let f=dirname(e);for(let g=1;g<d;g+=1)f=dirname(f);return f},a=d=>{let f=V(d,{...n,cwd:dirname(e)},true,"python");f?o.push(f):s=true;},c=(d,f=0)=>{if(!/^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/.test(d))return s=true,null;let g=i(f),m=Ar(g,d);s||=!m.resolved;for(let w of m.paths)a(w);let p=m.paths.at(-1);return p&&basename(p)==="__init__.py"?dirname(p):null},u=d=>{let f=[];for(let g of d.split(",")){let m=g.trim().split(/\s+as\s+/)[0];if(m==="*"||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(m)){s=true;continue}f.push(m);}return f},l=(d,f)=>{for(let g of u(f))d&&Ar(d,g).resolved&&(s=true);};for(let d of r.content.split(/\r?\n/))for(let f of d.split(/[;:]/)){let g=f.trim();if(g.startsWith("import ")){let y=g.slice(7).split(",");for(let S of y)c(S.trim().split(/\s+as\s+/)[0]);continue}let m=g.match(/^from\s+(\.*)([A-Za-z_][A-Za-z0-9_.]*)?\s+import\s+(.+)$/);if(!m)continue;let p=m[1].length,w=m[2];if(w){let y=c(w,p);l(y,m[3]);continue}if(p===0){s=true;continue}let h=i(p),v=join$1(h,"__init__.py"),R=false;try{R=statSync$1(v).isFile();}catch{}if(R){a(v),l(h,m[3]);continue}for(let y of u(m[3]))c(y,p);}return {references:[...new Map(o.map(d=>[d.path,d])).values()],inlineContents:[],malformed:s}}function Qr(e,t,n,r,o=true){return n==="node"?Da(e,t,r,o):n==="python"?Ea(e,t,r):{references:[],inlineContents:[],malformed:false}}function Or(e,t,n,r=t){let o={project:t,homePath:n,cwd:r},s=Qe(e,0,o),i=new Set((s.artifacts??[]).map(f=>f.value)),a=s.tokens.filter(f=>!i.has(f)).map(f=>V(f,o)).filter(f=>f!==null),c=[],u=[...s.inlineContents??[]],l=s.malformed;for(let f of s.artifacts??[]){if(f.nodeResolutionKind){let m=tn(f);m.reference&&c.push(m.reference),m.inlineContent&&u.push(m.inlineContent),l||=m.malformed;continue}let g=V(f.value,{...o,cwd:f.cwd},true,f.parserKind);g?c.push(g):l=true;}let d=[...a,...c];return {references:[...new Map(d.map(f=>[`${f.path}:${f.parserKind}`,f])).values()],inlineContents:u,malformed:l}}function Xr(e){return /^[A-Za-z_][A-Za-z0-9_]*=/.test(e)}function de(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 Ye(e){return /\b(?:import|require)\s*\(/.test(e)||/\bimport\s+(?:[^;\n]*\s+from\s+)?["']/.test(e)||/\b(?:eval|Function)\s*\(/.test(e)}function Ne(e,t){for(let n of t)if(e.startsWith(`${n}=`))return e.slice(n.length+1);return null}function Ta(e,t,n){let r=[],o=[],s=false,i=(l,d)=>{r.push(l),o.push({value:l,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"node",nodeResolutionKind:d}),s||=de(l);},a=(l=s)=>({tokens:r,artifacts:o,malformed:l}),c=t,u=false;for(;c<e.length;){let l=e[c];if(l==="--"){let w=e[c+1];return w&&!u&&i(w),w?a():a(true)}if(!l.startsWith("-"))return u||i(l),a();if(Oa.has(l))return a();if(Aa.has(l)){u=true,c+=1;continue}let d=Tr.has(l)?"cjs":Nr.has(l)?"esm":null;if(d){let w=e[c+1];if(!w)return a(true);i(w,d),c+=2;continue}let f=Ne(l,Tr),g=Ne(l,Nr),m=f??g;if(m!==null){if(!m)return a(true);i(m,f!==null?"cjs":"esm"),c+=1;continue}if(l.startsWith("-r")&&l.length>2){i(l.slice(2),"cjs"),c+=1;continue}if(Ir.has(l)){let w=e[c+1];return a(w===void 0?true:s||Ye(w))}let p=Ne(l,Ir);if(p!==null)return a(s||Ye(p));if((l.startsWith("-e")||l.startsWith("-p"))&&l.length>2)return a(s||Ye(l.slice(2)));if(jr.has(l)){if(e[c+1]===void 0)return a(true);c+=2;continue}if(Ne(l,jr)!==null){c+=1;continue}if(xa.has(l)){c+=1;continue}return a(true)}return u?a():a(true)}function Ma(e,t,n,r,o){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:r.cwd,project:r.project,homePath:r.homePath,parserKind:"shell"}],malformed:de(a)}:{tokens:[],malformed:true}}if(i==="-c"||i==="-lc"){let a=e[s+1];return a?Qe(a,n+1,r,o):{tokens:[],malformed:true}}if(i==="-o"){if(!e[s+1])return {tokens:[],malformed:true};s+=2;continue}if(Na.has(i)){s+=1;continue}return i.startsWith("-")||i.startsWith("+")?{tokens:[],malformed:true}:{tokens:[i],artifacts:[{value:i,cwd:r.cwd,project:r.project,homePath:r.homePath,parserKind:"shell"}],malformed:de(i)}}return {tokens:[],malformed:true}}function La(e,t,n){let r=t;for(;r<e.length;){let o=e[r];if(o==="--"){let s=e[r+1];return s?{tokens:[s],artifacts:[{value:s,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:de(s)}:{tokens:[],malformed:true}}if(!o.startsWith("-"))return {tokens:[o],artifacts:[{value:o,cwd:n.cwd,project:n.project,homePath:n.homePath,parserKind:"python"}],malformed:de(o)};if(ja.has(o))return {tokens:[],malformed:false};if(o==="-c"||o==="-m"||o.startsWith("-c"))return {tokens:[],malformed:true};if(Mr.has(o)){if(e[r+1]===void 0)return {tokens:[],malformed:true};r+=2;continue}if(Ne(o,Mr)!==null){r+=1;continue}if(Ia.has(o)){r+=1;continue}return {tokens:[],malformed:true}}return {tokens:[],malformed:true}}function Kt(e,t){let n=V(e,t,true);if(!n)return null;let r=ue(n.path),o=ue(t.project);return !r||!o||!re(o,r)?null:r}function Wa(e,t,n,r,o){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=r;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 u=Me(c,o);return u.malformed||u.segments.length!==1?{index:s,malformed:true}:{index:s,malformed:false,replacement:[...u.segments[0],...t.slice(s+2)],context:i}}else if(["-C","--chdir"].includes(a)){let c=t[s+1],u=c?Kt(c,i):null;if(!u)return {index:s,malformed:true};i={...i,cwd:u},s+=2;}else if(a.startsWith("--chdir=")){let c=Kt(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=Kt(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 Qe(e,t=0,n={project:process.cwd(),homePath:homedir$1(),cwd:process.cwd()},r={}){if(t>Jr)return {tokens:[],malformed:true};let o=Me(e,r),s=[],i=[],a=[],c=o.malformed;for(let u of o.segments){let l=eo(u,t,n,r);s.push(...l.tokens),i.push(...l.artifacts??[]),a.push(...l.inlineContents??[]),c||=l.malformed;}return {tokens:s,artifacts:i,inlineContents:a,malformed:c}}function eo(e,t,n,r){let o=0;for(;Xr(e[o]??"");)o+=1;let s=e[o];if(!s)return {tokens:[],malformed:false};let i=[],a=t,c=false;for(;Fa.has(basename(s));){if(c||=basename(s)==="builtin",i.push(s),a+=1,a>Jr)return {tokens:i,malformed:true};let p=Wa(basename(s),e,o+1,n,r);if(p.malformed)return {tokens:i,malformed:true};if(n=p.context??n,p.replacement){let w=eo(p.replacement,a,p.context??n,r);return i.push(...w.tokens),{tokens:i,artifacts:w.artifacts,inlineContents:w.inlineContents,malformed:w.malformed}}if(o=p.index,s=e[o],!s)return {tokens:i,malformed:false}}let u=basename(s),l=!s.includes(sep)&&Yr(u,r),d=c&&!Ua.has(u);if(l||d)return {tokens:i,malformed:true};let f=de(s);i.push(s);let g=u;if(!$a.has(g))return {tokens:i,malformed:f};let m=["node","tsx"].includes(g)?Ta(e,o+1,n):["bash","sh","zsh"].includes(g)?Ma(e,o+1,a,n,r):La(e,o+1,n);return i.push(...m.tokens),{tokens:i,artifacts:m.artifacts,inlineContents:m.inlineContents,malformed:f||m.malformed}}function to(e){if(!isAbsolute(e))return null;let t=resolve(e),n=`${sep}hooks${sep}`,r=t.lastIndexOf(n);return r<0?null:ue(t.slice(0,r))}function Ba(e,t){let n=new Map;for(let r of t)for(let o of ba(r)){let s=to(o);if(!s)continue;let i=n.get(s)??[];i.push(r),n.set(s,i);}return [...n].map(([r,o])=>({root:r,configPath:e,commands:[...new Set(o)]}))}function Ha(e){return e==="devflow@devflow"||e==="devflow@devflow-local"||e.startsWith("@devflow-tools/claude-code-plugin@")}function Ka(e){return e.slice(e.lastIndexOf("@")+1)}function Lr(e){for(let t of [e,join$1(e,"claude-code"),join$1(e,"plugins","claude-code")]){let n=ue(t);if(n&&existsSync$1(join$1(n,"hooks.json")))return n}return null}function qa(e,t,n){let r=Ka(e),o=U(t.extraKnownMarketplaces),s=U(o?.[r]);if(s){let i=U(s.source);return {configured:true,root:i?.source==="directory"&&typeof i.path=="string"?Lr(i.path):null}}try{let i=U(rt(n)),a=U(i?.[r]);if(a){let c=U(a.source);return {configured:!0,root:c?.source==="directory"&&typeof c.path=="string"?Lr(c.path):null}}}catch{}return {configured:false,root:null}}function Fr(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 r=Date.parse(n);return Number.isFinite(r)?r:null}).filter(n=>n!==null);return t.length>0?Math.max(...t):null}function Ga(e,t){let n=U(e.entry),r=U(t.entry),o=Fr(n),s=Fr(r);if(o!==s)return o===null?1:s===null?-1:s-o;let i=typeof n?.version=="string"?Xe(n.version):null,a=typeof r?.version=="string"?Xe(r.version):null;if(i&&a){let c=no(a,i);if(c!==0)return c}else if(i||a)return i?-1:1;return t.index-e.index}function za(e,t){try{let n=U(rt(t));if(!n)throw new Error("installed plugin manifest must be an object");let r=U(n.plugins);if(!r)throw new Error("installed plugin manifest plugins must be an object");let o=r?.[e];if(o===void 0)return {configured:!1,root:null};if(!Array.isArray(o)||o.length===0)return {configured:!0,malformed:!0,root:null};let s=o.map((a,c)=>({entry:a,index:c})).sort(Ga)[0],i=U(s?.entry);return !i||typeof i.installPath!="string"||i.installPath.length===0?{configured:!0,malformed:!0,root:null}:{configured:!0,root:ue(i.installPath)}}catch{if(existsSync$1(t))return {configured:true,malformed:true,root:null}}return {configured:false,root:null}}function Xe(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 no(e,t){for(let r of ["major","minor","patch"])if(e[r]!==t[r])return e[r]-t[r];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 r=0;r<n;r+=1){let o=e.prerelease[r],s=t.prerelease[r];if(o===void 0)return -1;if(s===void 0)return 1;if(o===s)continue;let i=/^\d+$/.test(o)?Number(o):null,a=/^\d+$/.test(s)?Number(s):null;return i!==null&&a!==null?i-a:i!==null?-1:a!==null?1:o.localeCompare(s)}return 0}function Ja(e,t){let n=e.lastIndexOf("@");if(n<=0||n===e.length-1)return null;let r=e.slice(0,n),o=e.slice(n+1),s=join$1(t,o,r),i;try{i=readdirSync(s,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>{let c=join$1(s,a.name),u=a.name;try{let l=U(rt(join$1(c,"package.json")));typeof l?.version=="string"&&(u=l.version);}catch{}return {name:a.name,path:c,version:u,mtimeMs:statSync$1(c).mtimeMs}});}catch{return null}return i.sort((a,c)=>{let u=Xe(a.version),l=Xe(c.version);if(u&&l){let d=no(l,u);if(d!==0)return d}else if(u||l)return u?-1:1;return c.mtimeMs-a.mtimeMs||c.name.localeCompare(a.name)}),i[0]?ue(i[0].path):null}function Va(e,t){if(t.legacyArtifactRoots!==void 0){let y=t.legacyArtifactRoots.map(S=>ue(S)).filter(S=>S!==null).map(S=>({root:S,inspectPluginConfig:true}));return {targets:y,configCommands:[],hooksDisabled:false,malformedSettings:[],malformedPluginMetadata:[],method:"injected",ok:y.length>0}}let n=t.claudeSettingsPath??join$1(t.homePath??homedir$1(),".claude","settings.json"),r=t.installedPluginsPath??join$1(t.homePath??homedir$1(),".claude","plugins","installed_plugins.json"),o=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=[],u=[...new Set([n,join$1(e,".claude","settings.json"),join$1(e,".claude","settings.local.json")])];for(let y of u)if(existsSync$1(y))try{let S=U(rt(y));if(!S)throw new Error("settings must be an object");i.push({path:y,settings:S});}catch{a.push(y);}if(i.reduce((y,S)=>typeof S.settings.disableAllHooks=="boolean"?S.settings.disableAllHooks:y,false))return {targets:[],configCommands:[],hooksDisabled:true,malformedSettings:a,malformedPluginMetadata:[],method:"hooks-disabled",ok:a.length===0};let d=i.map(y=>{let S=[];return et(y.settings.hooks,S),{path:y.path,commands:S}}),f=d.flatMap(y=>y.commands),g=d.flatMap(y=>Ba(y.path,y.commands)),p=[...i.reduce((y,S)=>{let _=S.settings.enabledPlugins;if(typeof _!="object"||_===null)return y;for(let[N,oe]of Object.entries(_))Ha(N)&&typeof oe=="boolean"&&y.set(N,oe);return y},new Map)].filter(([,y])=>y).map(([y])=>y).sort(),w=[...g],h=false;for(let y of p){let S=za(y,r);S.malformed&&c.push(r);let _=S.root;if(!S.configured){let N=i.map(ve=>qa(y,ve.settings,o)).filter(ve=>ve.configured),oe=N[N.length-1];oe?_=oe.root:_=Ja(y,s);}_?w.push({root:_,inspectPluginConfig:true}):h=true;}let v=[...w.reduce((y,S)=>{let _=y.get(S.root);return _?(y.set(S.root,{root:S.root,configPath:_.configPath??S.configPath,commands:[...new Set([..._.commands??[],...S.commands??[]])],inspectPluginConfig:!!(_.inspectPluginConfig||S.inspectPluginConfig)}),y):(y.set(S.root,S),y)},new Map).values()],R=[f.length>0?"settings-hooks":null,p.length>0?"enabled-plugin":null].filter(y=>y!==null);return {targets:v,configCommands:d.filter(y=>y.commands.length>0),hooksDisabled:false,method:R.length>0?`${R.join("+")}${h?"-unresolved":""}`:a.length>0?"settings-unresolved":"enabled-plugin-unresolved",malformedSettings:a,malformedPluginMetadata:[...new Set(c)],ok:(v.length>0||f.length>0)&&!h&&a.length===0&&c.length===0}}function Ya(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 r=dirname(t);if(r===t)return;t=r;}}function et(e,t){if(Array.isArray(e)){for(let n of e)et(n,t);return}if(!(typeof e!="object"||e===null))for(let[n,r]of Object.entries(e))n==="command"&&typeof r=="string"?t.push(r):et(r,t);}function qt(e){return [...e.matchAll(ga)].map(t=>t[1])}function Za(e){let t=new Map,n=Me(e,{tolerateControlSyntax:true});for(let r of n.segments.flat()){let o=r.match(/^([A-Za-z_][A-Za-z0-9_]*)=(\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/[A-Za-z0-9._/-]+)$/);o&&t.set(o[1],o[2]);}return t.size===0?e:e.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g,(r,o,s)=>t.get(o??s??"")??r)}function Qa(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 Xa(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 Gt(e,t){let n=resolve(e,t);return n.startsWith(`${resolve(e)}${sep}`)?n:null}function re(e,t){return t===e||t.startsWith(`${e}${sep}`)}function Vt(e){let t;try{t=lstatSync(e);}catch{return {kind:"missing"}}if(!t.isFile())return {kind:"unsafe",reason:"nonregular"};if(t.size>Ve)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 r=fstatSync(n);if(!r.isFile())return {kind:"unsafe",reason:"nonregular"};if(r.size>Ve)return {kind:"unsafe",reason:"oversized"};let o=Buffer.alloc(Math.min(r.size+1,Ve+1)),s=0;for(;s<o.length;){let c=readSync(n,o,s,o.length-s,null);if(c===0)break;s+=c;}if(s>Ve)return {kind:"unsafe",reason:"oversized"};let i=o.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 Yt(e,t){return `${e} (${t})`}function ec(e,t,n,r){let o=[],s=new Set,i=0,a=(c,u=0)=>{if(u>en){r.traversalLimitRoots.push(e);return}let l=resolve(c.path),d=resolve(c.containmentRoot),f;try{f=realpathSync.native(d);}catch{f=d;}if(!existsSync$1(l)){re(d,l)?r.missing.push(l):r.escapedArtifacts.push(l);return}let g;try{g=realpathSync.native(l);}catch{r.missing.push(l);return}if(!re(f,g)){r.escapedArtifacts.push(l);return}let m=`${g}:${c.parserKind}:${c.cwd}`;s.has(m)||(s.add(m),o.push({...c,path:g,depth:u}));};for(let c of n){let u=Or(c,e,t);u.malformed&&r.malformedCommands.push(c);for(let l of u.inlineContents)for(let d of J(l.content,false,"node"))r.findings.push({artifact:l.source,endpoint:d});for(let l of u.references)a(l);}for(;o.length>0;){if(i>=zr){r.traversalLimitRoots.push(e);break}let c=o.shift(),u=c.path;i+=1;let l=Vt(u);if(l.kind==="missing"){r.missing.push(u);continue}if(l.kind==="unsafe"){l.reason!=="binary"&&r.unsafeArtifacts.push(Yt(u,l.reason));continue}let{content:d}=l;r.inspected.push(u);let f=c.parserKind==="infer"?Zr(u,d):c.parserKind,g=f==="shell";for(let m of J(d,g,f))r.findings.push({artifact:u,endpoint:m});if(g){let m=Or(d,e,t,c.cwd);m.malformed&&r.malformedCommands.push(u);for(let p of m.inlineContents)for(let w of J(p.content,false,"node"))r.findings.push({artifact:p.source,endpoint:w});for(let p of m.references)a(p,c.depth+1);}else if(f==="node"||f==="python"){let m=Qr(u,d,f,{project:e,homePath:t,cwd:dirname(u)});m.malformed&&r.malformedCommands.push(u);for(let p of m.inlineContents)for(let w of J(p.content,false,"node"))r.findings.push({artifact:p.source,endpoint:w});for(let p of m.references)a(p,c.depth+1);}}}function tc(e,t,n,r){let o=realpathSync.native(n.root),s=[],i=new Set,a=Ya(o),c=0,u=(g,m=false,p=o,w="infer",h=e,v=0)=>{if(v>en){r.traversalLimitRoots.push(o);return}let R=realpathSync.native(p),y=resolve(g);if(!existsSync$1(y)){if(!re(R,y)){r.escapedArtifacts.push(y);return}m&&r.missing.push(y);return}let S;try{S=realpathSync.native(y);}catch{m&&r.missing.push(y);return}if(!re(R,S)){r.escapedArtifacts.push(y);return}let _=`${S}:${w}:${h}`;i.has(_)||(i.add(_),s.push({path:S,parserKind:w,cwd:h,depth:v}));},l=(g,m,p,w=0)=>{for(let h of qt(g)){let v=Gt(o,h);if(!v)continue;let R=(m.artifacts??[]).find(y=>y.value.includes("PLUGIN_ROOT")&&y.value.endsWith(h));u(v,true,o,R?.parserKind??"infer",R?.cwd??p,w);}},d=(g,m,p=0,w=false)=>{for(let h of g.artifacts??[]){if(h.value.includes("PLUGIN_ROOT"))continue;let v=h.nodeResolutionKind?tn(h,!w):{reference:V(h.value,{project:h.project,homePath:h.homePath,cwd:h.cwd},true,h.parserKind)??void 0,malformed:false};if(v.malformed){r.malformedCommands.push(h.value);continue}if(v.inlineContent)for(let R of J(v.inlineContent.content,false,"node"))r.findings.push({artifact:v.inlineContent.source,endpoint:R});v.reference&&u(v.reference.path,true,w?o:v.reference.containmentRoot,v.reference.parserKind,v.reference.cwd??m,p);}},f=g=>{for(let p of J(g,true))r.findings.push({artifact:n.configPath??join$1(o,"hooks.json"),endpoint:p});let m=Qe(g,0,{project:e,homePath:t,cwd:e});m.malformed&&r.malformedCommands.push(g),l(g,m,e),d(m,e);for(let p of m.tokens){if(!isAbsolute(p))continue;let w=to(p),h=(m.artifacts??[]).find(v=>v.value===p);w===o&&u(p,true,o,h?.parserKind??"infer",h?.cwd??e);}};if(n.commands){n.configPath&&r.configsInspected.push(n.configPath);for(let g of n.commands)f(g);}if(n.inspectPluginConfig||!n.commands){let g=join$1(o,"hooks.json");if(!existsSync$1(g))r.missing.push(g),u(join$1(o,"hooks","session-start"));else {r.configsInspected.push(g);let m;try{m=realpathSync.native(g);}catch{r.missing.push(g),u(join$1(o,"hooks","session-start")),m="";}if(m&&!re(o,m)&&(r.escapedArtifacts.push(g),u(join$1(o,"hooks","session-start")),m=""),m){let p=Vt(m);if(p.kind==="unsafe")r.unsafeArtifacts.push(Yt(g,p.reason)),u(join$1(o,"hooks","session-start"));else if(p.kind==="missing")r.missing.push(g),u(join$1(o,"hooks","session-start"));else try{let w=JSON.parse(p.content),h=[];et(w,h);for(let v of h)f(v);}catch{r.malformedConfigs.push(g),u(join$1(o,"hooks","session-start"));}}}}for(;s.length>0;){if(c>=zr){r.traversalLimitRoots.push(o);break}let g=s.shift(),m=g.path;c+=1;let p=Vt(m);if(p.kind==="missing"){r.missing.push(m);continue}if(p.kind==="unsafe"){r.unsafeArtifacts.push(Yt(m,p.reason));continue}let{content:w}=p;r.inspected.push(m);let h=g.parserKind==="infer"?Zr(m,w):g.parserKind,v=h==="shell";for(let S of J(w,v,h))r.findings.push({artifact:m,endpoint:S});if(v){let S=Za(w),_=Qe(S,0,{project:e,homePath:t,cwd:dirname(m)},{tolerateControlSyntax:true});Qa(w)&&r.malformedCommands.push(m),l(S,_,dirname(m),g.depth+1),d(_,dirname(m),g.depth+1,true);}else if(h==="node"||h==="python"){let S=Qr(m,w,h,{project:e,homePath:t,cwd:dirname(m)},false);(h==="node"?Xa(m):S.malformed)&&r.malformedCommands.push(m);for(let _ of S.inlineContents)for(let N of J(_.content,false,"node"))r.findings.push({artifact:_.source,endpoint:N});for(let _ of S.references){let N=relative(o,resolve(_.path));!N.startsWith(`..${sep}`)&&N.split(sep).includes("node_modules")||u(_.path,true,o,_.parserKind,_.cwd,g.depth+1);}for(let _ of qt(w)){let N=Gt(o,_);N&&u(N,true,o,h,g.cwd,g.depth+1);}}else for(let S of qt(w)){let _=Gt(o,S);_&&u(_,true,o,h,g.cwd,g.depth+1);}let R=m.startsWith(`${o}/`)?m.slice(o.length+1):"",y=basename(R).replace(/\.js$/,"");a&&(R.startsWith("hooks/")||R.startsWith("dist/hooks/"))&&u(join$1(a,"packages","devflow","src","hooks",`${y}.ts`),false,a),R.startsWith("hooks/")&&u(join$1(o,"dist","hooks",`${y}.js`));}}function nc(e,t){let n=Va(e,t),r={configsInspected:[],commandsInspected:[],inspected:[],missing:[],malformedConfigs:[],malformedCommands:[],unsafeArtifacts:[],traversalLimitRoots:[],escapedArtifacts:[],findings:[]};for(let h of n.configCommands){r.configsInspected.push(h.path);for(let v of h.commands){r.commandsInspected.push({configPath:h.path,command:v});for(let R of J(v,true))r.findings.push({artifact:h.path,endpoint:R});}}ec(e,t.homePath??homedir$1(),n.configCommands.flatMap(h=>h.commands).filter(h=>!n.targets.some(v=>v.commands?.includes(h))),r);for(let h of n.targets)tc(e,t.homePath??homedir$1(),h,r);let o=[...new Set(r.configsInspected)],s=[...new Set(r.inspected)],i=r.commandsInspected.filter((h,v,R)=>R.findIndex(y=>y.configPath===h.configPath&&y.command===h.command)===v),a=[...new Set(r.missing)],c=[...new Set(r.malformedConfigs)],u=[...new Set(r.malformedCommands)],l=[...new Set(r.unsafeArtifacts)],d=[...new Set(r.traversalLimitRoots)],f=[...new Set(r.escapedArtifacts)],g=r.findings.filter((h,v,R)=>R.findIndex(y=>y.artifact===h.artifact&&y.endpoint===h.endpoint)===v),m=a.length>0||f.length>0||l.length>0,w=[{key:"active_plugin_resolution",value:m&&!n.method.endsWith("-unresolved")?`${n.method}-unresolved`:n.method,target:"resolved active DevFlow hook configuration",ok:n.ok&&!m,severity:"warning"},{key:"active_plugin_roots",value:n.targets.map(h=>h.root),ok:true,severity:"info"},{key:"hooks_disabled",value:n.hooksDisabled,ok:true,severity:"info"},{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:o.length,target:n.hooksDisabled?"hooks disabled":">= 1 hook config file",ok:n.hooksDisabled||o.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:u,target:[],ok:u.length===0,severity:"warning"},{key:"unsafe_legacy_artifacts",value:l,target:[],ok:l.length===0,severity:"warning"},{key:"legacy_artifact_traversal_limit",value:d,target:[],ok:d.length===0,severity:"warning"},{key:"escaped_legacy_artifacts",value:f.length,target:0,ok:f.length===0,severity:"warning"},{key:"retired_producer_paths",value:g.length,target:0,ok:g.length===0,severity:"error"},{key:"retired_producer_path_findings",value:g,ok:true,severity:"info"}];return {name:"Legacy paths",status:A(w),metrics:w}}function rc(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(r=>!!r))];for(let r of n)if(existsSync$1(r))try{return {path:r,manifest:JSON.parse(readFileSync$1(r,"utf8"))}}catch(o){return {path:r,error:o.message}}return {error:`not found (${n.join(", ")})`}}function ot(e){let t=rc(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),r=Number.isFinite(n)?((e.now??Date.now)()-n)/ye: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(r)?Number(r.toFixed(2)):"invalid timestamp",target:"0-30",ok:r>=0&&r<=30,severity:"warning"}]}}function oc(e,t){let n=[],r=join$1(e,".devflow","config.json"),o="default-enabled";if(existsSync$1(r))try{o=JSON.parse(readFileSync$1(r,"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=o!==false;n.push({key:"session_start_memory_injection",value:o,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=W(i,t);let u=(L(a,"observations")?a.prepare("PRAGMA table_info(observations)").all().map(l=>l.name):[]).includes("source");n.push({key:"explicit_memory_channel",value:u?"explicit_intent source available":"source column missing",target:"explicit_intent source available",ok:u,severity:"warning"}),u&&n.push({key:"explicit_memory_observations",value:H(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:A(n),metrics:n}}function sc(e,t){let n=[],r=join$1(e,".devflow","memory","memories.db");if(!existsSync$1(r))return n.push({key:"memories_db",value:"missing",target:r,ok:false,severity:"warning"}),{name:"Memory quality",status:A(n),metrics:n};let o;try{if(o=W(r,t),!L(o,"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*ye,i=o.prepare(`
|
|
86
90
|
SELECT source, COUNT(*) count FROM memories
|
|
87
91
|
WHERE created_at >= ? GROUP BY source ORDER BY source
|
|
88
|
-
`).all(s),a=
|
|
92
|
+
`).all(s),a=o.prepare(`
|
|
89
93
|
SELECT
|
|
90
94
|
SUM(CASE WHEN access_count = 0 THEN 1 ELSE 0 END) never_accessed,
|
|
91
95
|
SUM(CASE WHEN access_count > 0 THEN 1 ELSE 0 END) accessed
|
|
92
96
|
FROM memories WHERE status = 'active'
|
|
93
|
-
`).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{
|
|
94
|
-
`)}async function
|
|
97
|
+
`).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{o?.close();}return {name:"Memory quality",status:A(n),metrics:n}}function ic(e,t){let n=[],r=join$1(e,".devflow","knowledge","knowledge.db");if(!existsSync$1(r))return n.push({key:"knowledge_db",value:"missing",target:r,ok:false,severity:"warning"}),{name:"Knowledge quality",status:A(n),metrics:n};let o;try{if(o=W(r,t),!L(o,"knowledge_chunks"))n.push({key:"knowledge_schema",value:"knowledge_chunks missing",target:"Batch 3 knowledge schema",ok:!1,severity:"warning"});else {let s=o.prepare("SELECT length(content) length FROM knowledge_chunks ORDER BY length(content)").all().map(l=>Number(l.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=o.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get(),u=/tokenize\s*=\s*['\"]?trigram/i.test(c?.sql??"");n.push({key:"knowledge_fts_tokenizer",value:u?"trigram":"missing/non-trigram",target:"trigram",ok:u,severity:"warning"});}}catch(s){n.push({key:"knowledge_quality_read",value:s.message,target:"readable knowledge database",ok:false,severity:"error"});}finally{o?.close();}return {name:"Knowledge quality",status:A(n),metrics:n}}function ac(e){let{manifest:t,metrics:n}=ot(e),r=t?.contract?.surfaces??[];return n.push({key:"contract_surfaces",value:r,target:["cli","http","mcp","hook"],ok:t?.contract?.status==="green"&&r.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:A(n),metrics:n}}function cc(e){let{manifest:t,metrics:n}=ot(e),r=t?.deadcode?.actionableExports;return n.push({key:"ts_prune_actionable_exports",value:r??"missing",target:0,ok:t?.deadcode?.status==="green"&&r===0,severity:"error"}),n.push({key:"ts_prune_allowlisted_exports",value:t?.deadcode?.allowlistedExports??"missing",ok:true,severity:"info"}),{name:"Deadcode",status:A(n),metrics:n}}function lc(e){let{manifest:t,metrics:n}=ot(e),r=t?.dataFace?.sharedAdapters??[];return n.push({key:"shared_retrieval_adapters",value:r,target:["getProjectContextResult","getMemoryResult","getKnowledgeResult"],ok:t?.dataFace?.status==="green"&&r.length===3,severity:"error"}),{name:"Data face",status:A(n),metrics:n}}async function uc(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 dc(e){let{manifest:t,metrics:n}=ot(e),r=t?.ui?.routes??[];n.push({key:"dashboard_routes",value:r.length,target:">= 13",ok:t?.ui?.status==="green"&&r.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??uc)(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:A(n),metrics:n}}async function nn(e={},t={}){let n=e.project??process.cwd(),r=Jt(n),o=[Qi(n,t),oa(r.path,t),nc(r.path,t),sa(r.path,t),ia(r.path,!!e.strict,t),oc(r.path,t),sc(r.path,t),ic(r.path,t),ac(t),cc(t),la(t),lc(t),ca(t),await dc(t),da(t)],s=e.strict&&o.some(i=>i.status!=="green")?1:0;return {sections:o,exitCode:s}}function fc(e,t={}){return e===void 0?oo():nn(e,t)}function Ur(e){let t=JSON.stringify(e);return t===void 0?String(e):t}function ro(e){let t=[];for(let n of e.sections){let r=`[${n.status.toUpperCase()}]`,o=n.status==="green"?k.green:n.status==="yellow"?k.yellow:k.red;t.push(`${o(r)} ${k.bold(n.name)}`);for(let s of n.metrics){let i=s.target===void 0?"":` (target: ${Ur(s.target)})`;t.push(` ${s.ok?"OK":"FAIL"} ${s.key}: ${Ur(s.value)}${i}`);}}return t.join(`
|
|
98
|
+
`)}async function gc(e={},t={stdout:r=>console.log(r),stderr:r=>console.error(r)},n={}){let r=await nn(e,n);return t.stdout(e.json?JSON.stringify(r):ro(r)),r.exitCode}async function st(e){let{createEngines:t}=await import('@devflow-tools/context-engine');return t(e)}async function oo(e=process.cwd()){let{codegraph:t,graph:n,memory:r,knowledge:o,workflow:s,data:i}=await st(e),a=t.getStats(),c=n.export(),u=0;try{u=(await s.list()).length;}catch{}let l=false,d=0;try{let w=await r.getAll();l=!!w?.project,d=Object.keys(w?.user??{}).length;}catch{}let f=0;try{f=(await o.getSources()).length;}catch{}let g={total:0,byTool:{}};try{g=await i.getToolCallStats();}catch{}let m=await Te(),p=0;return a.fileCount>0&&(p+=25),a.nodeCount>0&&(p+=15),c.nodes.length>0&&(p+=20),l&&(p+=15),f>0&&(p+=10),u>0&&(p+=5),m.running&&(p+=10),g.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:l,userPrefs:d},knowledge:{sources:f},plugins:{installed:0,names:[]},workflows:{registered:u},server:{running:m.running},toolCalls:g,readyScore:p}}async function mc(){let{data:e}=await st(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),r=createHash("sha256").update("genesis").digest("hex");for(let o of n){if(o.prevHash!==r)return {valid:false,brokenAt:o.seq,entryCount:n.length};let s=`${o.seq}|${o.ts}|${o.tool}|${o.argsHash}|${o.decision}|${o.ruleId??""}|${o.sessionId}|${r}`,i=createHmac("sha256",t).update(s).digest("hex");if(o.signature!==i)return {valid:false,brokenAt:o.seq,entryCount:n.length};r=o.signature;}return {valid:true,brokenAt:null,entryCount:n.length}}async function pc(){let{data:e}=await st(process.cwd()),t=await e.auditGetSecret(),n=await e.auditGetAll(),r=createHash("sha256").update("genesis").digest("hex");for(let o of n){let s=`${o.seq}|${o.ts}|${o.tool}|${o.argsHash}|${o.decision}|${o.ruleId??""}|${o.sessionId}|${r}`,i=createHmac("sha256",t).update(s).digest("hex");await e.sqlExecute("UPDATE devflow_audit_chain SET prev_hash = ?, signature = ? WHERE seq = ?",[r,i,o.seq]),r=i;}return {rebuilt:true}}async function hc(e){let{data:t}=await st(process.cwd()),r=(await t.auditGetAll()).filter(o=>o.decision!=="allow");if(e){let o=e.match(/^(\d+)([dh])$/);if(o){let s=Number.parseInt(o[1],10),i=o[2]==="d"?s*864e5:s*36e5,a=Date.now()-i;r=r.filter(c=>c.ts>a);}}return {violations:r.map(o=>({tool:o.tool,decision:o.decision,ruleId:o.ruleId,ts:o.ts,sessionId:o.sessionId}))}}function yc(){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 Je,Xi,ra,ye,aa,Er,fa,ga,zr,Ve,en,Jr,Vr,ma,pa,ha,xr,$a,Tr,Nr,Ir,jr,xa,Aa,Oa,Na,Ia,Mr,ja,Fa,Ua,io=E(()=>{ee();Xi={distill_leases:["event_ids","expires_at","status"],observations:["title"],session_events:["created_at","id","processed"]};ra=new Set(["pending","committed","expired"]);ye=1440*60*1e3,aa=30*ye,Er=60*1024*1024;fa=/\/api\/memory\/(?:process|events|pending-count|extract(?:-rules)?|ollama\/status)(?![\w/-])/g,ga=/\$(?:\{(?:CLAUDE_)?PLUGIN_ROOT\}|(?:CLAUDE_)?PLUGIN_ROOT)\/([A-Za-z0-9._/-]+)/g,zr=64,Ve=1024*1024,en=8,Jr=8,Vr=64*1024;ma=new Set([".","!","[[","]]","case","coproc","do","done","elif","else","esac","eval","fi","for","function","if","in","select","source","then","time","trap","until","while"]),pa=new Set(["!","[[","]]","case","do","done","elif","else","esac","fi","for","function","if","in","select","then","time","until","while"]),ha=/^\$\{(?:CLAUDE_PLUGIN_ROOT|CLAUDE_PROJECT_DIR|HOME|PLUGIN_ROOT)\}$/;xr=[".cjs",".js",".mjs",".ts",".tsx"];$a=new Set(["bash","node","python","python3","sh","tsx","zsh"]);Tr=new Set(["-r","--require"]),Nr=new Set(["--experimental-loader","--import","--loader"]),Ir=new Set(["-e","--eval","-p","--print"]),jr=new Set(["-C","--conditions","--input-type","--inspect-port","--title","--unhandled-rejections"]),xa=new Set(["--enable-source-maps","--experimental-strip-types","--experimental-transform-types","--no-deprecation","--no-warnings","--test","--trace-deprecation","--trace-warnings","--watch"]),Aa=new Set(["--check","-c"]),Oa=new Set(["--help","--version","-h","-v"]);Na=new Set(["-e","-eu","-o","-u","-ue"]),Ia=new Set(["-B","-E","-I","-O","-OO","-P","-q","-s","-S","-u","-v","-x"]),Mr=new Set(["-W","-X","--check-hash-based-pycs"]),ja=new Set(["--help","--version","-h","-V"]);Fa=new Set(["builtin","command","env","exec","nohup","timeout"]),Ua=new Set([":","[","echo","false","printf","pwd","test","true"]);});var ao={};x(ao,{generateToken:()=>kc});async function kc(e,t=3600){let n=Buffer.from(JSON.stringify({alg:"HS256",typ:"JWT"})).toString("base64url"),r=Math.floor(Date.now()/1e3),o={sub:`devflow-session-${Date.now().toString(36)}`,project:e.split("/").pop()??"unknown",iat:r,exp:r+t,scope:["context","knowledge","memory","workflow","graph"]},s=Buffer.from(JSON.stringify(o)).toString("base64url"),i=getLocalHmacSecret(),a=createHmac("sha256",i).update(`${n}.${s}`).digest("base64url");return {token:`${n}.${s}.${a}`,expiresAt:o.exp,scope:o.scope}}var co=E(()=>{});var rn={};x(rn,{reportBenchmarkCommand:()=>Rc,runBenchmarkCommand:()=>Pc});async function Pc(e){let t=e.suite??"default",n=getBenchmarkSuite(t);if(!n)throw new Error(`Unknown benchmark suite "${t}"`);let o=await new BenchmarkEngine().runSuite(e.projectRoot,n,{rounds:e.rounds}),s=e.database??openGlobalDevFlowDatabase();try{s.insertBenchmarkReport(o);}finally{e.database||s.close();}let i=renderBenchmarkReport(o,e.output??"text");return e.output==="json"?i:`${i}
|
|
95
99
|
|
|
96
|
-
Stored: ${getGlobalDevFlowDbPath()} (${
|
|
100
|
+
Stored: ${getGlobalDevFlowDbPath()} (${o.runId})`}async function Rc(e={}){let t=e.database??openGlobalDevFlowDatabase(),n,r=null;try{n=e.runId?t.getBenchmarkReport(e.runId):t.getLatestBenchmarkReport(),e.baselineRunId&&(r=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&&!r)throw new Error(`Benchmark baseline "${e.baselineRunId}" not found`);let o=e.output??"text",s=renderBenchmarkReport(n,o);if(!r||o==="json")return s;let i=Dc(r,n);return o==="markdown"?`${s}
|
|
97
101
|
## Change From Prior Baseline
|
|
98
102
|
|
|
99
103
|
${i.map(a=>`- ${a}`).join(`
|
|
100
104
|
`)}
|
|
101
105
|
`:`${s}
|
|
102
106
|
|
|
103
|
-
Change from ${
|
|
107
|
+
Change from ${r.runId}:
|
|
104
108
|
${i.map(a=>`- ${a}`).join(`
|
|
105
|
-
`)}`}function
|
|
106
|
-
`)}var
|
|
107
|
-
Shutting down...`)),await
|
|
109
|
+
`)}`}function Dc(e,t){let n=e.summary.devflow,r=t.summary.devflow;return [it("tokensUsed",n.avgTokensUsed,r.avgTokensUsed,false),it("filesTouched",n.avgFilesTouched,r.avgFilesTouched,false),it("correctnessScore",n.avgCorrectnessScore,r.avgCorrectnessScore,true),it("durationMs",n.avgDurationMs,r.avgDurationMs,false)]}function it(e,t,n,r){let o=t>0?(n-t)/t:0,s=r?o<-0.1:o>.1,i=o>0?"+":"";return `${e}: ${i}${(o*100).toFixed(1)}%${s?" (regression >10%)":""}`}var on=E(()=>{});var go={};x(go,{runReview:()=>Cc});async function Cc(e){let t,n;if(e.prUrl){let l=e.prUrl.match(/pull\/(\d+)/);n=`PR: ${l?`#${l[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 r=(t.match(/^diff --git/gm)??[]).length,o=(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"),[k.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: ${r}`,`+${o} / -${s}`,"",i.length>0?k.red(`Critical (${i.length})`):"",...i.map(l=>` ${k.red("\u25CF")} ${l}`),"",a.length>0?k.yellow(`Warning (${a.length})`):"",...a.map(l=>` ${k.yellow("\u25CB")} ${l}`),"",c.length>0?k.green(`Suggestion (${c.length})`):"",...c.map(l=>` ${k.green("\u25CB")} ${l}`),"",i.length>0?k.red("Overall: Need changes"):a.length>0?k.yellow("Overall: Approve with comments"):k.green("Overall: LGTM")].join(`
|
|
110
|
+
`)}var mo=E(()=>{});var po={};x(po,{startAll:()=>$c});async function Ec(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(r=>setTimeout(r,500));}return false}async function $c(e){console.log(k.blue("Starting DevFlow server..."));let{pid:t}=await Ut({port:e.port});console.log(k.green(` Server started (PID: ${t})`)),console.log(k.blue(" Waiting for server..."));let n=await Ec(e.port);console.log(n?k.green(" Server ready"):k.yellow(" Server started but health check timed out")),console.log(""),console.log(k.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(k.green("\u2551")+" DevFlow Started! "+k.green("\u2551")),console.log(k.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(k.green("\u2551")+` Server + Dashboard: http://localhost:${e.port}`.padEnd(57)+k.green("\u2551")),console.log(k.green("\u2551")+` API: http://localhost:${e.port}/api`.padEnd(57)+k.green("\u2551")),console.log(k.green("\u2551")+" "+k.green("\u2551")),console.log(k.green("\u2551")+" Press Ctrl+C to stop "+k.green("\u2551")),console.log(k.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(r=>{let o=false,s=async()=>{o||(o=true,console.log(k.blue(`
|
|
111
|
+
Shutting down...`)),await Oe(),console.log(k.green("Server stopped.")),r());};process.on("SIGINT",s),process.on("SIGTERM",s);});}var ho=E(()=>{ee();});var wo={};x(wo,{stopAll:()=>xc});async function xc(){let e=await Oe();console.log(e?k.green("Server stopped"):k.dim("No DevFlow services running"));}var vo=E(()=>{ee();});var bo={};x(bo,{showStatus:()=>Ic});function Nc(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 Ic(){console.log(k.blue("DevFlow Status")),console.log(k.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let e=await Te(),t=e.port??qe;e.running?(console.log(`Server: ${k.green("\u2713")} running (port ${t}${e.pid?`, PID ${e.pid}`:""})`),console.log(`Dashboard: ${k.green("\u2713")} served at http://localhost:${t}`)):(console.log(`Server: ${k.yellow("\u25CB")} not running`),console.log(`Dashboard: ${k.yellow("\u25CB")} not running`));let n=getGlobalDevFlowDbPath();if(existsSync(n)){let a=(statSync(n).size/1024/1024).toFixed(1);console.log(`Data: ${n} (${a} MB)`);}else console.log(`Data: ${k.dim(`no global database (${n})`)}`);let r=join(process.cwd(),".devflow","devflow.db"),o=join(process.cwd(),".codegraph","codegraph.db"),s=[...existsSync(r)?[r]:[],...Nc(o)?[`${o} (devflow_* tables)`]:[]];s.length>0?console.log(`Legacy: ${k.yellow(s.join(", "))}`):console.log(`Legacy: ${k.green("none")}`);}var So=E(()=>{ee();});var Ro={};x(Ro,{setupCommand:()=>qc});function Hc(){let e=[resolve$1(dirname$1(Bc.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 Kc(e,t){let n={};if(existsSync(e))try{n=JSON.parse(readFileSync(e,"utf-8"));}catch{n={};}let r={...n,...t};writeFileSync(e,JSON.stringify(r,null,2));}async function qc(e){if(console.log(k.blue("DevFlow Setup")),console.log(k.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),!e.skipMcp)try{let t=await Ct({agent:e.agent,command:"devflow-mcp"});for(let n of t)console.log(k.green(` \u2713 MCP: ${n}`));}catch(t){console.log(k.yellow(` \u26A0 MCP setup failed: ${t.message}`)),console.log(k.dim(" You can configure MCP manually with: devflow connect"));}if(!e.skipPlugin){let t=Hc();if(t){let n=join(homedir(),".claude","plugins");mkdirSync(n,{recursive:true});let r=join(n,"known_marketplaces.json");Kc(r,{devflow:{source:{directory:t}}}),console.log(k.green(` \u2713 Plugin registered: ${t}`));}else console.log(k.yellow(" \u26A0 Plugin directory not found")),console.log(k.dim(" The Claude Code plugin may not be available."));}console.log(""),console.log(k.green("Setup complete!")),console.log(k.dim("Restart Claude Code to use /devflow:* commands"));}var Bc,Do=E(()=>{Et();Bc=createRequire(import.meta.url);});var Co={};x(Co,{pluginListCommand:()=>zc});var zc,Eo=E(()=>{Ue();zc=new Command("list").description("List available plugins").option("-i, --installed","Show only installed plugins").action(async e=>{let t=ge();if(e.installed){let n=xn();if(n.length===0){console.log("No plugins installed."),console.log(`
|
|
108
112
|
Run "devflow plugin list" to see available plugins.`);return}console.log(`Installed plugins:
|
|
109
|
-
`),n.forEach(
|
|
110
|
-
`);let n=Math.max(...t.plugins.map(
|
|
111
|
-
Install a plugin: devflow plugin install <name>`);}});});var
|
|
112
|
-
Try: devflow plugin list`);return}console.log(`Found ${
|
|
113
|
-
`),
|
|
114
|
-
${
|
|
113
|
+
`),n.forEach(r=>{let o=t.plugins.find(s=>s.name===r);o?(console.log(` ${k.green(o.name)}@${o.version}`),console.log(` ${o.description}`)):console.log(` ${k.green(r)}`);});}else {if(t.plugins.length===0){console.log("No plugins available.");return}console.log(`Available plugins (${t.plugins.length}):
|
|
114
|
+
`);let n=Math.max(...t.plugins.map(r=>r.name.length));t.plugins.forEach(r=>{let o=" ".repeat(n-r.name.length+2);console.log(` ${k.green(r.name)}${o}v${r.version}`),console.log(` ${" ".repeat(n)}${r.description.substring(0,60)}`),r.tags.length>0&&console.log(` ${" ".repeat(n)}Tags: ${r.tags.join(", ")}`),console.log("");}),console.log(`
|
|
115
|
+
Install a plugin: devflow plugin install <name>`);}});});var $o={};x($o,{pluginSearchCommand:()=>Yc});var Yc,xo=E(()=>{Ue();Yc=new Command("search").description("Search for plugins").argument("<keyword>","Search keyword").action(async e=>{let t=ge(),n=e.toLowerCase(),r=t.plugins.filter(o=>o.name.toLowerCase().includes(n)||o.description.toLowerCase().includes(n)||o.tags.some(s=>s.toLowerCase().includes(n)));if(r.length===0){console.log(`No plugins found matching "${e}"`),console.log(`
|
|
116
|
+
Try: devflow plugin list`);return}console.log(`Found ${r.length} plugin(s) matching "${e}":
|
|
117
|
+
`),r.forEach(o=>{console.log(` ${k.green(o.name)}@${o.version}`),console.log(` ${o.description}`),o.tags.length>0&&console.log(` Tags: ${o.tags.join(", ")}`),console.log(` Size: ${o.size}`),console.log("");});});});var Oo={};x(Oo,{pluginInstallCommand:()=>Xc});var Xc,To=E(()=>{Xc=new Command("install").description("Install a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Installing ${t}...`);try{execSync(`npm install -g ${t}`,{stdio:"inherit"}),console.log(`
|
|
118
|
+
${k.green("\u2713")} ${t} installed successfully`),console.log(`
|
|
115
119
|
Run "devflow plugin list --installed" to verify.`);}catch(n){console.error(`
|
|
116
|
-
${
|
|
117
|
-
${
|
|
118
|
-
${
|
|
119
|
-
`));}let n=
|
|
120
|
-
${e} docs synced to .devflow/knowledge/${e}/`));}else {let
|
|
121
|
-
All docs synced.`));}});
|
|
120
|
+
${k.red("\u2717")} Installation failed: ${n.message}`),process.exit(1);}});});var Io={};x(Io,{pluginUninstallCommand:()=>nl});var nl,jo=E(()=>{nl=new Command("uninstall").description("Uninstall a plugin").argument("<name>","Plugin name (with or without @devflow-tools/ prefix)").action(async e=>{let t=e.startsWith("@devflow-tools/")?e:`@devflow-tools/${e}`;console.log(`Uninstalling ${t}...`);try{execSync(`npm uninstall -g ${t}`,{stdio:"inherit"}),console.log(`
|
|
121
|
+
${k.green("\u2713")} ${t} uninstalled successfully`);}catch(n){console.error(`
|
|
122
|
+
${k.red("\u2717")} Uninstallation failed: ${n.message}`),process.exit(1);}});});function ut(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 Lo=createRequire(import.meta.url),ln="0.0.0";try{ln=Lo("../package.json").version;}catch{try{ln=Lo("../../package.json").version;}catch{}}var P=new Command;P.name("devflow").description("Developer Intelligence Platform for AI Coding Agents").version(ln).option("--local","Force local engine, skip server");P.command("init").description("Initialize .devflow/ in the current project").option("--force","Overwrite existing config").option("--abort","Force delete .codegraph and .devflow directories before reinitializing").option("--report","Output onboarding markdown report to stdout").option("--json","Output onboarding pack as JSON to stdout").option("--plugins <names>","Comma-separated list of plugins to install (non-interactive)").option("--with-plugin <names>","Interactively review optional memory hints from installed plugins").option("--no-plugins","Skip plugin installation guide").action(async e=>{let t=process.cwd();if(e.abort){console.log(k.yellow("\u{1F5D1}\uFE0F --abort flag detected, removing existing directories..."));let i=[".codegraph",".devflow"];for(let a of i){let c=ol.join(t,a);Mo.existsSync(c)&&(console.log(k.dim(` Removing ${a}/...`)),Mo.rmSync(c,{recursive:true,force:true}));}console.log(k.green(`\u2705 Existing directories removed
|
|
123
|
+
`));}let n=ut(t);console.error(k.blue(`DevFlow init \u2014 mode: ${n}`));let{initProject:r,renderInitReport:o}=await Promise.resolve().then(()=>(Cn(),Dn)),s=await r(t,{force:e.force});if(e.json&&s.onboardingPack)console.log(JSON.stringify(s.onboardingPack,null,2));else if(e.report&&s.onboardingPack)console.log(o(s.onboardingPack));else {if(s.created.length>0){console.log(k.green("Created:"));for(let i of s.created)console.log(` ${k.dim("+")} ${i}`);}else console.log(k.dim("Already initialized. Use --force to overwrite config."));if(s.indexed&&console.log(k.green(`\u2705 CodeGraph initialized (${s.indexed.files} files, ${s.indexed.symbols} symbols)`)),s.onboardingPack){let i=s.onboardingPack;console.log(k.green("\u2705 Onboarding pack generated")),console.log(k.dim(` ${i.stats.files} files, ${i.stack.frameworks.join(", ")||"no framework"}`));}if(s.pluginDeployed&&console.log(k.green("\u2705 Plugin deployed to ~/.claude/plugins/cache/")),s.pluginEnabled&&console.log(k.green("\u2705 Plugin enabled in ~/.claude/settings.json")),s.mcpConfigured&&console.log(k.green("\u2705 MCP config written to .claude/mcp.json")),s.pluginDeployed&&s.pluginEnabled&&s.mcpConfigured&&console.log(k.green("\nDevFlow is ready! Run `claude` to start.")),typeof e.withPlugin=="string"){let{reviewPluginMemoryHints:i}=await Promise.resolve().then(()=>($n(),En)),a=await i(t,e.withPlugin);console.log(k.dim(`Plugin memory hints: ${a.selected}/${a.available} selected`));}if(typeof e.plugins=="string"){let{installPluginsFromList:i}=await Promise.resolve().then(()=>(ht(),pt));await i(e.plugins);}else if(e.plugins!==false){let{guidePluginInstallation:i}=await Promise.resolve().then(()=>(ht(),pt));await i(t);}}});P.command("reset").description("Reset generated DevFlow project data").requiredOption("--scope <scope>","memory | knowledge | codegraph | all").option("--backup-to <dir>","Back up selected data before resetting").option("--force","Reset without creating a backup").option("--project <path>","Project directory",process.cwd()).action(async e=>{let{executeResetCommand:t}=await Promise.resolve().then(()=>(Kn(),Hn));t(e,{},{log:r=>console.log(r),error:r=>console.error(k.red(r))})||(process.exitCode=1);});var il=P.command("db").description("Manage DevFlow databases");il.command("consolidate").description("Merge legacy project databases into the global database").option("--project <path>","Project directory",process.cwd()).option("--dry-run","Report rows and conflicts without writing").action(async e=>{let{consolidateDatabases:t,formatConsolidateResult:n}=await Promise.resolve().then(()=>(er(),Xn)),r=t(e);for(let o of n(r))console.log(o);});P.command("connect [agent]").description("Configure the Claude Code MCP connection").option("--command <cmd>","MCP server command","devflow-mcp").action(async(e,t)=>{let n=process.cwd(),r=ut(n);console.log(k.blue(`DevFlow connect \u2014 mode: ${r}`));let{connectAgent:o,getAvailableAgents:s}=await Promise.resolve().then(()=>(Et(),tr));if(e){let i=s();i.includes(e)||(console.log(k.red(`Unknown agent: ${e}`)),console.log(`Available: ${i.join(", ")}`),process.exit(1));}try{let i=await o({agent:e,command:t.command});for(let a of i)console.log(k.green(`\u2713 ${a}`));}catch(i){console.error(k.red(`Error: ${i.message}`)),process.exit(1);}});P.command("index").description("Show index status").option("--backfill-vectors","Reconcile the index and wait for symbol vectors").option("--watch","Start file watcher for hot updates (stub)").action(async e=>{let{getIndexStatus:t,refreshIndex:n}=await Promise.resolve().then(()=>(ir(),sr)),r=e.backfillVectors?await n(P.opts().local):await t(P.opts().local);console.log(k.blue("Index Status")),console.log(` Files: ${r.totalFiles}`),console.log(` Symbols: ${r.totalSymbols}`),console.log(` Indexing: ${r.indexing?"active":"idle"}`),e.watch&&console.log(k.dim(" (watch mode not yet implemented)"));});P.command("graph [target]").description("Show dependency graph").option("--depth <n>","Expansion depth","2").action(async(e,t)=>{let{getGraph:n}=await Promise.resolve().then(()=>(cr(),ar)),r=await n({target:e,depth:parseInt(t.depth,10),skipServer:P.opts().local});console.log(k.blue("Dependency Graph")),console.log(` Nodes: ${r.nodes.length}`),console.log(` Edges: ${r.edges.length}`);});P.command("context <query>").description("Retrieve project context for a query").option("--mode <mode>","fast | deep","fast").option("--max-tokens <n>","Max token budget","4000").option("--task","Use task-oriented mode with risk hints and next actions").option("--why","Show reasoning for file selection").action(async(e,t)=>{if(t.task){let{getTaskContext:n}=await Promise.resolve().then(()=>(xt(),$t)),r=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(JSON.stringify({requiredFiles:r.requiredFiles,optionalFiles:r.optionalFiles,riskHints:r.riskHints,nextActions:r.nextActions,reasoning:t.why?r.reasoning:void 0},null,2));}else {let{getContext:n}=await Promise.resolve().then(()=>(xt(),$t)),r=await n({query:e,mode:t.mode,maxTokens:parseInt(t.maxTokens,10),skipServer:P.opts().local});console.log(k.blue(`Context: "${e}"`)),console.log(` Files: ${r.files.length}`),console.log(` Confidence: ${(r.confidence*100).toFixed(0)}%`),console.log(` Tokens: ${r.tokenCount}`);}});var ct=P.command("workflow").description("Workflow management");ct.command("list").description("List available workflows").action(async()=>{let{listWorkflows:e}=await Promise.resolve().then(()=>(Ee(),Ce)),t=await e(P.opts().local);if(t.length===0){console.log(k.dim("No workflows registered."));return}for(let n of t)console.log(`${k.green(n.name)} \u2014 ${n.description} (${n.stepCount} steps)`);});ct.command("run <type> [input]").description("Run a workflow").action(async(e,t)=>{let{runWorkflow:n}=await Promise.resolve().then(()=>(Ee(),Ce)),r=await n(e,{input:t??""},P.opts().local);console.log(`Run: ${r.runId}`),console.log(`Status: ${r.status}`),console.log(`Duration: ${r.duration}ms`);});ct.command("status").description("Show running workflows").action(async()=>{let{getWorkflowStatus:e}=await Promise.resolve().then(()=>(Ee(),Ce)),t=await e(P.opts().local);console.log(`${t.length} run(s)`);for(let n of t)console.log(` ${n.runId} \u2014 ${n.status}`);});ct.command("runs").description("Show workflow history").action(async()=>{let{getWorkflowRuns:e}=await Promise.resolve().then(()=>(Ee(),Ce)),t=await e(P.opts().local);if(t.length===0){console.log(k.dim("No runs yet."));return}for(let n of t){let r=n.finishedAt?`${n.finishedAt-n.startedAt}ms`:"running";console.log(` ${n.runId} ${k.yellow(n.status)} ${r}`);}});var we=P.command("memory").description("Memory management");we.command("show").description("Show current project memory").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ce(),ae)),n=await t(P.opts().local,e.source);console.log(JSON.stringify(n,null,2));});we.command("list").description("List project memories").option("--source <source>","Filter memories by source").action(async e=>{let{showMemory:t}=await Promise.resolve().then(()=>(ce(),ae));console.log(JSON.stringify(await t(P.opts().local,e.source),null,2));});we.command("query [query]").description("Retrieve ranked project memory with a token budget").option("--purpose <purpose>","Retrieval purpose","task_context").option("--budget-tokens <count>","Maximum response tokens","2000").option("--scope <scope>","Memory scope to include (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let{queryMemory:n}=await Promise.resolve().then(()=>(ce(),ae)),r=await n({query:e,purpose:t.purpose,budgetTokens:Number.parseInt(t.budgetTokens,10),scopes:t.scope.length>0?t.scope:void 0,skipServer:P.opts().local});console.log(JSON.stringify(r,null,2));});we.command("set <key> <value>").description("Set a memory key").action(async(e,t)=>{let{setMemory:n}=await Promise.resolve().then(()=>(ce(),ae));await n(e,t,P.opts().local),console.log(k.green(`Memory set: ${e} = ${t}`));});we.command("review").description("Review memory candidates").action(async()=>{let{reviewCandidates:e}=await Promise.resolve().then(()=>(ce(),ae)),t=await e(P.opts().local);console.log(JSON.stringify(t,null,2));});we.command("backfill-obs-vectors").description("Backfill missing observation vectors").option("--batch-size <count>","Embedding batch size","32").action(async e=>{let{backfillObservationVectors:t}=await Promise.resolve().then(()=>(ce(),ae)),n=await t({batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:r,remaining:o})=>{console.log(` vectors: ${r} processed, ${o} remaining`);}});console.log(k.green(`Observation vectors ready: ${n.processed} added, ${n.remaining} remaining`));});P.command("knowledge <query>").description("Search knowledge base").action(async e=>{let{queryKnowledge:t}=await Promise.resolve().then(()=>(gr(),fr)),r=(await t(e,void 0,void 0,P.opts().local)).results;console.log(k.blue(`Knowledge: "${e}"`)),console.log(` Results: ${r.length}`);for(let o of r.slice(0,5))console.log(` \u2014 ${o.title}`);});var un=P.command("docs").description("Documentation index management");un.command("sync [plugin-name]").description("Sync documentation for plugins").action(async e=>{console.log(k.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')]),r=new t({projectRoot:process.cwd(),embedder:new n});if(e){let o=await r.syncDocs(e);for(let s of o)s.added>0?console.log(` ${k.green("\u2713")} ${s.source} \u2192 ${s.added} chunks`):console.log(` ${k.red("\u2717")} ${s.source} \u2014 ${s.errors.join(", ")||"no content"}`);console.log(k.green(`
|
|
124
|
+
${e} docs synced to .devflow/knowledge/${e}/`));}else {let o=await r.getSources();for(let s of o){let i=await r.syncDocs(s.source.name);for(let a of i)a.added>0?console.log(` ${k.green("\u2713")} ${a.source} \u2192 ${a.added} chunks`):console.log(` ${k.red("\u2717")} ${a.source} \u2014 ${a.errors.join(", ")||"no content"}`);}console.log(k.green(`
|
|
125
|
+
All docs synced.`));}});un.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(()=>(It(),Nt)),n=await t({source:e.source,batchSize:Number.parseInt(e.batchSize,10),onProgress:({processed:r,remaining:o})=>{console.log(` vectors: ${r} processed, ${o} remaining`);}});console.log(k.green(`Knowledge vectors ready: ${n.processed} added, ${n.remaining} remaining`));});un.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(()=>(It(),Nt));console.log(k.blue(`Resyncing docs${e?` for ${e}`:""} with headings`));let r=await n({source:e,withHeadings:t.withHeadings});for(let o of r)o.added>0?console.log(` ${k.green("\u2713")} ${o.source} \u2192 ${o.added} chunks`):console.log(` ${k.red("\u2717")} ${o.source} \u2014 ${o.errors.join(", ")||"no content"}`);console.log(k.green("Docs resynced. Run `devflow docs backfill-vectors` to rebuild vectors."));});var lt=P.command("skill").description("Plugin/Skill management");lt.command("list").description("List installed skills").action(async()=>{let{listSkills:e}=await Promise.resolve().then(()=>(Ae(),xe)),t=await e(P.opts().local);if(t.length===0){console.log(k.dim("No skills installed. Use 'devflow skill search' to find plugins."));return}for(let n of t)console.log(` ${k.green(n.name)} @ ${n.version} \u2014 ${n.description}`);});lt.command("search <query>").description("Search available plugins").action(async e=>{let{searchSkills:t}=await Promise.resolve().then(()=>(Ae(),xe)),n=await t(e,P.opts().local);if(console.log(k.blue(`Search: "${e}"`)),n.length===0){console.log(k.dim(" No matching plugins found."));return}for(let r of n)console.log(` ${k.green(r.name)} @ ${r.version} \u2014 ${r.description}`);});lt.command("install <name>").description("Install a plugin/skill").action(async e=>{try{let{installSkill:t}=await Promise.resolve().then(()=>(Ae(),xe)),n=await t(e,process.cwd(),P.opts().local);console.log(k.green(`\u2713 Installed @devflow-tools/plugin-${n.name}@${n.version}`)),n.templates.length>0&&console.log(` Templates: ${n.templates.join(", ")}`);}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});lt.command("uninstall <name>").description("Uninstall a plugin/skill").action(async e=>{try{let{uninstallSkill:t}=await Promise.resolve().then(()=>(Ae(),xe));await t(e,process.cwd(),P.opts().local),console.log(k.green(`\u2713 Uninstalled ${e}`));}catch(t){console.log(k.red(`Error: ${t.message}`)),process.exit(1);}});P.command("doctor").description("Run project health check").option("--json","Output as JSON").option("--strict","Exit with status 1 when any health section has warnings or errors").option("--project <path>","Project directory",process.cwd()).option("--audit","Verify audit chain integrity").option("--audit-fix","Rebuild audit chain signatures").option("--violations","Show violation records").option("--last <period>","Filter violations by time (e.g. 7d, 24h)").option("--receipts","Show current session receipt status").action(async e=>{let{runDoctorCommand:t,runDoctorAudit:n,runDoctorAuditFix:r,runDoctorViolations:o,runDoctorReceipts:s}=await Promise.resolve().then(()=>(io(),so));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 r();console.log(e.json?JSON.stringify(a):"Audit chain rebuilt.");return}if(e.violations){let a=await o(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;});P.command("session token").description("Generate a session token for MCP Gateway authentication").option("--expires <seconds>","Token TTL in seconds","3600").action(async e=>{let{generateToken:t}=await Promise.resolve().then(()=>(co(),ao)),n=await t(process.cwd(),parseInt(e.expires,10));console.log(JSON.stringify(n,null,2));});var Fo=P.command("benchmark").description("Run and inspect reproducible A/B benchmarks");Fo.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(()=>(on(),rn));console.log(await t({projectRoot:e.project,suite:e.suite,rounds:parseInt(e.rounds,10),output:e.output}));});Fo.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(()=>(on(),rn));console.log(await t({runId:e.runId,baselineRunId:e.baseline,output:e.output}));});P.command("review [pr-url]").description("Review a PR or current branch diff").option("--agent <agent>","AI agent to use","claude").action(async(e,t)=>{let{runReview:n}=await Promise.resolve().then(()=>(mo(),go)),r=await n({prUrl:e,agent:t.agent});console.log(r);});var dn=P.command("server").description("Manage DevFlow server");dn.command("start").description("Start the DevFlow REST server").option("--port <n>","Port number","13337").action(async e=>{console.log(k.blue("Starting DevFlow server..."));let{startServer:t}=await Promise.resolve().then(()=>(ee(),Ge)),n=await t({port:parseInt(e.port,10)});console.log(k.green(`Server started (pid: ${n.pid}) on port ${e.port}`));});dn.command("stop").description("Stop the DevFlow REST server").action(async()=>{let{stopServer:e}=await Promise.resolve().then(()=>(ee(),Ge)),t=await e();console.log(t?k.green("Server stopped"):k.dim("No server running"));});dn.command("status").description("Show server status").action(async()=>{let{serverStatus:e}=await Promise.resolve().then(()=>(ee(),Ge)),t=await e();t.running?console.log(k.green(`Running (pid: ${t.pid})`)):console.log(k.yellow("Not running"));});P.command("dashboard").description("Open DevFlow Dashboard").action(()=>{console.log(k.blue("The Dashboard is served by the DevFlow server.")),console.log(k.dim("Run: devflow start")),console.log(k.dim("Then open: http://localhost:13337"));});P.command("start").description("Start DevFlow server (API + Dashboard)").option("--port <n>","Server port","13337").option("-d, --background","Run in background (detached)").action(async e=>{let{startAll:t}=await Promise.resolve().then(()=>(ho(),po));await t({port:parseInt(e.port,10),background:!!e.background});});P.command("stop").description("Stop DevFlow server").action(async()=>{let{stopAll:e}=await Promise.resolve().then(()=>(vo(),wo));await e();});P.command("status").description("Show DevFlow services status").action(async()=>{let{showStatus:e}=await Promise.resolve().then(()=>(So(),bo));await e();});P.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(()=>(Do(),Ro));await t({agent:e.agent,skipMcp:!!e.skipMcp,skipPlugin:!!e.skipPlugin});});var at=P.command("plugin").description("Manage DevFlow plugins");if(process.argv.includes("plugin")){let[{pluginListCommand:e},{pluginSearchCommand:t},{pluginInstallCommand:n},{pluginUninstallCommand:r}]=await Promise.all([Promise.resolve().then(()=>(Eo(),Co)),Promise.resolve().then(()=>(xo(),$o)),Promise.resolve().then(()=>(To(),Oo)),Promise.resolve().then(()=>(jo(),Io))]);at.addCommand(e),at.addCommand(t),at.addCommand(n),at.addCommand(r);}await P.parseAsync();
|